When I read non-fiction books these days, I get a nagging feeling that the author could have communicated the idea in a much shorter book. Many books these days, especially in the self-help category, are bloated works converted from one or two blog posts. But very rarely you come across a masterpiece book and wish that it was bigger. Sapiens, A Brief History of Humankind by Yuval Noah Harari is one such book!
Yuval Noah Harari is an Israeli professor of history at Hebrew University of Jerusalem. His free YouTube course "A brief History of Humankind" covering 17 lessons and 62 videos is very popular. He wrote "Sapiens" originally in Hebrew and was later translated to other languages including English.
In less than 500 pages, Harari takes us through an exhilarating journey of human history. The topic of human history is so large, that it is a real challenge to decide what to include and what to ignore. Harari takes a high level view of human life over the centuries, but he also takes us through the perspective of common people when needed. Most of the things that traditional history textbooks usually cover are only very briefly touched upon.
Harari argues that it is our ability to gossip and believe in collective myth that has led to the unprecedented growth of human species. Everything that is the foundation of modern human civilization – money, religion, capitalism, consumerism and democracy is the result of our ability to believe in collective myth. Harari claims that it has enabled us to bypass evolution and even become gods on earth!
I am a huge fan of history and once I started reading it, I couldn’t put it down. The book triggers your imagination and curiosity. Harari tells many interesting stories. The lack of "political correctness" and "relaxed historical accuracy" may annoy or anger some readers! Here is an advice for easily offended readers – treat it as fiction!
Is there anything more dangerous than dissatisfied and irresponsible gods who don’t know what they want?
Summary: Sapiens, A Brief History of Humankind
Sapiens book is organized into 4 main parts covering last 70,000 years of human history,
- The Cognitive Revolution – Harari argues that it is our ability to gossip and believe in collective myth that led to the unprecedented growth of human species. He argues that it is this sudden ability that enabled us to be the only dominant human species on the planet. This part also takes a look at the day to day lives of early humans and explores the link between human growth and extinction of other animal species.
- The Agricultural Revolution – Is agricultural revolution history’s biggest fraud? Harari argues that for the farmers, this revolution manly offered suffering and death. This is an interesting conclusion since we think about agricultural evolution as a major achievement of human species. In more recent times, we have even started romanticizing farming and agriculture. This part also covers the evolution of language and bureaucracy.
- The Unification of Mankind – Harari argues that even though human culture has been in constant flux through the centuries, there has always been a definite direction to where we are going. Humans across the planet now form one large family. This part also explores the roles played by money, religion and imperial vision in unification of mankind.
- The Scientific Revolution – This section explores some of the reasons behind rapid industrial and scientific growth of European nations. Harari argues such a rapid advance is made possible by our acceptance of the fact that we know little about the world around us. It is our acceptance of ignorance that fuelled rapid scientific innovations. This section also explores the unification of the state, business and science. Obviously there are dangers in the marriage of business and science.
Each of the above parts have 4 or 5 chapters dealing with topics related to that era. For example, one chapter looks at the origins of money while another chapter explores why agricultural revolution may be a disaster as far as individuals are concerned. Sometimes you get to hear an interesting story, sometimes you get to see a photograph of historical significance.
After going through the entire human history, finally Harari turns into the philosophical questions of human existence such as the meaning of human life and human happiness. He briefly touches upon the consumerism and its effects on human happiness. He points out that we are on the threshold of becoming the gods on earth!
Review: Sapiens, A Brief History of Humankind
Harari’s Sapiens is an excellent summary of human history. It mainly covers the last 70,000 years of human history. But it is not merely about history as Harari is more interested in the motivations of the people behind history. And it is also full of his own conclusions! He argues that the large-scale cooperation of human beings is what made us the masters of the planet. He also briefly touches on philosophy and the chemical and biological interpretations of our behavior.
For any historian, it is important to at least partially suspend his personal beliefs while explaining historical findings. Harari does a very good job at that. He presents multiple viewpoints and theories of a historical event without actually taking sides. He admits that even today we are ignorant of many things including ancient history which left no evidence for us to study. However when it comes to conclusions, he has his own ideas which are very compelling!
Even though Harari doesn’t take any side in the debate of animal rights and vegetarianism, he paints a grim picture of the plight of domestic animals. There is no doubt that we are very brutal when it comes to industrial handling of animals used for meat and milk. The book contains plenty of horror stories. Historically my own local culture has been much more considerate towards the domestic animals, but money and industrialization is changing that. But here again, we need to be aware of the food requirements of 700 billion people!
One controversial part of the book is where Harari calls the agricultural revolution as history’s biggest fraud! He rightly points out that agricultural life has lead to lot of human suffering – tyranny of the elite classes, the quick spread of deadly diseases etc. Some are critical of this conclusion and argues that he underestimated the challenges faced by the so called happy "hunter-gatherers".
But we need to be aware that it is nearly impossible to make a judgment of history from our current privileged life. Many of the ideas and behaviors of my local community may be unacceptable to someone from a western country. In such a scenario, how can we judge people who lived thousands of years ago?
Towards the end of the book, Harari does a broad analysis of human happiness, looking not just at the philosophical question, but also the chemical and biological findings behind it. This section is sure to leave the reader confused if not completely depressed!
The small stories and intriguing photographs interspersed across the chapters makes the book a memorable read. It made me curious enough to investigate the background of the Lion-man, learn more about Gobekli Tepe and study the Buddhist teachings. And it made me think about what we are doing to our domestic animals bred for meat and milk.
Yuval Noah Harari’s Sapiens, A Brief History of Humankind is a brilliant piece of work. It is full of shocking and thought provoking stories. The vivid, crispy and witty language will dazzle you and its conclusions may even change your perspective on life. This is a masterpiece, get your copy today!
What do we want to want?
My Rating: 9/10
Further Reading/Additional Resources
- Sapiens, A Brief History of Humankind (Amazon US)
- Sapiens, A Brief History of Humankind (Amazon India)
- Harari’s YouTube Course on A Brief History of Humankind
- Photos of Oldest Temple (Gobekli Tepe)
- The Lion Man
- A Look at Cognitive Revolution
- The Last Tasmanian
- The Black War
- The "Earmouse"
- How Commercial Hatchery Works?
Anyone who stops learning is old, whether at twenty or eighty. Anyone who keeps learning stays young.
– Henry Ford
I consider myself a learning junkie. I have a wide variety of interests such as chess, model railways, reading, DIY, programming, photography, travel, writing etc. Even the title logo of this blog is a collection of things that I am passionate about. With a family of 2 children and a full time job, I find it is extremely difficult to spend time on my current hobbies let alone pick up new skills.
When I picked up the book, “The First 20 Hours, How to Learn Anything” by Josh Kaufman, I realized I am in the same boat as the author. Kaufman has a wide range of interests and claims that he spends a focused amount of time in learning something new and can become good at it in 20 hours. He calls this technique – “Rapid Skill Acquisition”. In this book, Kaufman covers the basics of this technique and explains how he applied it in learning a number of diverse skills. I was hooked!
Book Review: The First 20 Hours, How to Learn Anything Fast by Josh Kaufman
The First 20 hours, How to Learn Anything Fast is a book on “Rapid Skill Acquisition”. Kaufman claims that by following a disciplined process, it is possible to become fairly good in any skill in 20 hours of deliberate practice. The book starts off with a look at the 10,000 hour rule popularized by Malcolm Gladwell in the book Outliers: The Story of Success. Kaufman explains that 10,000 hour practice is needed for world class mastery, but not for becoming good at something. Most of the time we are not trying to become world champions or world class performers. We just want to be good at certain skills especially when we are pursuing hobbies such as chess or fishing.
Kaufman claims that it takes only 20 hours of disciplined and focused approach to learn any new skill from scratch (I am not sure from where he got this magical number!). He calls this approach “Rapid Skill Acquisition”. According to him there are four key elements of rapid skill acquisition,
- Deconstructing a skill into the smallest possible sub skills
- Learning enough about each sub skill to be able to practice intelligently and self-correct during practice
- Removing physical, mental, and emotional barriers that get in the way of practice
- Practicing the most important sub skills for at least twenty hours
Kaufman then explains the differences between skill acquisition, learning, training and education. This is followed by a detailed explanation of ten principles of rapid skill acquisition and ten principles of effective learning. I found these sections the most valuable part of the book. These principles also provide a good summary of the book,
Ten Principles of Rapid Skill Acquisition
- Choose a lovable project
- Focus your energy on one skill at a time
- Define your target performance level
- Deconstruct the skill into sub skills
- Obtain critical tools
- Eliminate barriers to practice
- Make dedicated time for practice
- Create fast feedback loops
- Practice by the clock in short bursts
- Emphasize quantity and speed
Ten Principles of Effective Learning
- Research the skill and related topics
- Jump in over your head
- Identify mental models and mental hooks
- Imagine the opposite of what you want
- Talk to practitioners to set expectations
- Eliminate distractions in your environment
- Use spaced repetition and reinforcement for memorization
- Create scaffolds and checklists
- Make and test predictions
- Honor your biology
I loved the following extract quoted by Kaufman from another book, Art & Fear: Observations on the Perils (and Rewards) of Artmaking by David Bayles. This is a brilliant illustration of the power of practice (quality comes from quantity),
The ceramics teacher announced on opening day that he was dividing the class into two groups. All those on the left side of the studio, he said, would be graded solely on the quantity of work they produced, all those on the right solely on its quality. His procedure was simple: on the final day of class he would bring in his bathroom scales and weigh the work of the "quantity" group: fifty pound of pots rated an "A", forty pounds a "B", and so on. Those being graded on "quality", however, needed to produce only one pot — albeit a perfect one — to get an "A".
Well, came grading time and a curious fact emerged: the works of highest quality were all produced by the group being graded for quantity. It seems that while the "quantity" group was busily churning out piles of work – and learning from their mistakes — the "quality" group had sat theorizing about perfection, and in the end had little more to show for their efforts than grandiose theories and a pile of dead clay.
I found the first 40 pages of book informative and full of value. I have now adopted his methodology as a checklist whenever I try to learn something new. This book also got me interested in game of Go and Ukulele.
However some may find that beyond first 40 pages of book, there is little to learn. In the remaining pages, Kaufman explains how he applied the rapid skill acquisition in his areas of interest. I liked these sections, but some readers may find it somewhat boring. I have also felt that in some chapters the learning process is presented as too easy and simple. For example, his learning process on programming seems so simple, yet in practice it is nothing but simple (except perhaps for geniuses). I think the author hides the fact that usually there is considerable time required for research activities. Hence you will end up spending much more than 20 hours to learn something.
The First 20 hours, How to Learn Anything Fast by Josh Kaufman is a mini manual for rapidly acquiring new skills. If you are passionate about learning new skills like me, you will find this book informative and engaging. The bulk of the book consists of how Kaufman applies the rapid skill acquisition techniques in acquiring skill in his areas. If that is not something you are interested in, I suggest you watch Kaufman’s TEDX presentation instead of buying the book.
Finally there is a larger question to answer before you pursue “rapid skill acquisition” to acquire a diverse set of skills. Do you want to be a jack of all trades and master of none?
For 37 years I’ve practiced fourteen hours a day, and now they call me a genius!
– Pablo de Sarasate, Famous Spanish Violinist and Composer
My Rating: 7/10
Further Reading/Additional Resources
- Book: The first 20 hours – how to learn anything
- Video: The first 20 hours – how to learn anything (TEDX Presentation by Josh Kaufman)
- How to get good at anything in 20 hours (Interview with Josh Kaufman)
- Outliers: The Story of Success by Malcolm Gladwell
- The Personal MBA: A World-Class Business Education by Josh Kaufman
- Getting Things Done: The Art of Stress-Free Productivity by David Allen
- The Power of Full Engagement by Tony Schwartz
- Be Excellent at Anything by Tony Schwartz
- Art & Fear: Observations on the Perils (and Rewards) of Artmaking by David Bayles
- Mindset: How You Can Fulfill Your Potential by Carol Dweck
Talk is cheap. Show me the code – Linus Torvalds
I have been constantly looking at ways to improve my programming skills and this blog post is an attempt to summarize what I have learned over the years. Trying to solve complex problems on a daily basis will definitely improve programming skills, but some of the following practices will speed up the learning process.
Here are the 12 ways to improve your programming skills,
1. Read the Documentation (RTFM)
Whether you are working with a programming language or a software library, you should at least once read through the entire official documentation. You may not learn everything, but you will be aware of the capabilities and the limitations of the language or the library you use. Here are some examples from my experience,
If you are a Java programmer, you should go through Oracle’s official Java tutorials. If you are a Java web application developer who frequently uses Struts2 framework, you should go through the Struts2 documentation.
If you are an Android developer, read the entire Android API guide.
Reading through the documentation may seem like a daunting task and you may not understand everything you read, but it would be very helpful in the long term. It gives you the 20,000 feet view of the language or the library.
2. Study Open Source Projects
One of the beautiful things about programming is that a large number of expert programmers and software companies share their work publicly as Open Source Software. To accelerate your learning, study popular open source projects in your programming field. Downloading, studying and running these projects enables you to quickly grasp how top programmers use the language and libraries effectively.
Always look for high quality open source projects from well known programmers or software organizations such Apache Foundation. For example, If you are an Android developer, you can look at some cool open source projects from Jake Wharton such as Retrofit or butterknife.
If you are a Java programmer, look for trending Java projects on GitHub or take a look Apache projects. Some of the cool projects to look at are Apache Commons, Apache Struts 2 and Apache Hadoop. If you are a .NET/C# programmer, take a look at this list of .NET open source projects. Some of the cool open source .NET projects are Microsoft EntityFramework, NUnit and CruiseControl.NET. You can also take a look at trending .NET projects on GitHub.
3. Study the Source Code of Platforms, Frameworks and Tools
In addition to studying third party open source projects, you can also take a look at the source code available for your platform, tools or frameworks. Since the source code in this case is written by experienced programmers who are responsible for the platform/framework/tools, this code is usually of very high quality. This code is also the most tested code available for you to study!
By studying the source code, you will learn how your programming platform works under the hood. This gives you considerable confidence on the code you write. For example, if you are an Android developer, you can download and study the Android platform source code. Similarly if you use Struts2 in your Java Web applications, you can download Struts2 source code and take a look under the hood.
Source code for most of the major platforms/frameworks/tools are available these days. Check out the following links to some of the major source code repositories,
4. Study Code Written by Your Peers
If you work in a company, try to find top developers in your team or organization. Study their code and try to understand the logic or patterns used. If you don’t understand something, ask the authors for help.
You can also ask top programmers in your team to take a quick look at the code you write (I am not talking about the formal code reviews). Most of the folks would be more than happy to help you. Find someone who is willing to be your programming mentor. Having a mentor is probably the fastest way to be an expert programmer (or for that matter to be an expert in any endeavor). The feedback loop is short and you will quickly attain the mental model level of your mentor.
5. Study Your Development Environment
Learn the features available in your development environment or IDE thoroughly. Efficient use of development tools and IDE will substantially improve your programming productivity. Learn the shortcuts and features offered by the IDE and deliberately practice them. Initially you may find this a bit hard, but after a while you will wonder how you worked without those tricks and shortcuts!
Each IDE offers a list of tips for increased productivity. Find your favorite IDE in the list below, take a printout of the tips and tricks page and keep it near your desk.
- Eclipse Tips and Tricks
- Xcode Keyboard Shortcuts
- NetBeans Tips and Tricks
- Android Studio Tips
- IntelliJ Tips
- Komodo IDE Tips
- Microsoft Visual studio
- Zend Studio
6. Attend Online Programming Courses
Recently there has been an explosion of online courses available for programmers. Both paid and free courses are available for different programming skill levels. I have found that even free courses are very helpful and valuable in learning new technologies. I recommend that once you enroll in a course, push yourself to complete it and attempt all the exercises and tasks given as part of the course.
One good thing about online courses is that most of them are created by experts and the curriculum will cover all the major ideas and best practices in the field. I have attended many of these programming related courses and found them to be challenging and useful. Here are some of my favorites,
- Developing Android Apps (UD853) by Udacity. This is an excellent online course for learning Android development.
- How to use Git and GitHub(UD775) by Udacity. Git is now the main version control system for most projects and this will give you hands on experience on the tool.
- Stanford Video Lectures on iOS Development. This is not an online course, but rather video recording of Stanford iOS course (CS193P). I found it very useful to learn iOS programming.
Here is a partial list of Websites offering online courses,
- Udemy – Udemy offers free and paid courses on a wide variety of topics, programming being one of them.
- Udacity – Udacity offers free and paid courses for programmers. Recently they seem to be focusing on mobile development. Companies such as Google also publishes their free training courses here.
- Coursera – Coursera offers a large number of training courses from major universities across the world on a wide range of topics. Most of the courses are free.
- edX – edX offers a large number of free online courses from a number of universities.
7. Read Top Programming Books
Programming books gives you a complete overview of the programming subject being covered. It reflects years of professional experience that the author has in the subject. Reading books is a quick way to attain considerable high level understanding of your programming field.
When it comes to programming, there are 2 distinct types of books – books that deal with the language, framework or tool fundamentals and books that deal with conceptual knowledge and best practices. Books of the first category gets obsolete pretty soon and I usually avoid hard copies of them. But books of the second category are the most useful and you should have them in your library.
I specialize in Web application programming and following are some of the books that has been very influential in my career. Some of them deals with software methodologies or about structuring software teams. As you progress in your career, these are as important as the knowledge of the programming language or best practices.
I have the following books in my library. I highly recommend these books (Please note that my primary area is Java based technologies),
- Effective Java by Joshua Bloch
- Expert One-on-One J2EE Design and Development by Rod Johnson
- Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
- Code Complete: A Practical Handbook of Software Construction by Steve McConnell
- Don’t Make Me Think, Revisited: A Common Sense Approach to Web Usability by Steve Krug
- Scrum: The Art of Doing Twice the Work in Half the Time by Jeff Sutherland
- The Pragmatic Programmer: From Journeyman to Master Andrew Hunt, David Thomas
- Refactoring: Improving the Design of Existing Code by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts
8. Learn Basics of Data Structures and Algorithms
Large number of programmers have no formal education in programming. This means that they have little background in algorithms and data structures. One of the key things that differentiate good programmers from brilliant programmers is the knowledge of algorithms and data structures.
If you have a fairly good idea of algorithms and data structures, you will find that you can handle complex programming tasks much faster. When it comes to usual Web development, mobile development etc. you may find that you can get a lot of things done without deep knowledge of algorithms and data structures. However if you start working on anything complex such as machine learning, data processing or reporting, you will be handicapped without a solid foundation in Algorithms and Data Structures.
Following is a set of resources for learning data structures and algorithms,
- Book: Introduction to Algorithms by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
- Princeton University course on Algorithms
- Udemy Course On Introduction to Data Structures & Algorithms in Java
- Naveen Garg’s Video Tutorials on Data Structures (IIT Delhi)
- TopCoder Algorithm Tutorials
9. Learn Attributes of Good Software Code
Once you master a programming language, the next thing to learn is the attributes of good code. Programming is relatively a new human endeavor, but still there is considerable research data available on what makes good programs. High quality software programs are readable, flexible, extensible, testable, maintainable and reusable. Learn specific techniques that will enable us to meet these software requirements. I recommend that you read Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin and Code Complete: A Practical Handbook of Software Construction by Steve McConnell.
10. Participate in Online Programming Challenges
It is now generally known now (thanks to the book Outliers by Malcolm Gladwell) that in order to attain expert level skills (world class) in any area, you need to practice for at least 10,000 hours. The same applies to programming as well. Solve programming problems, work on interesting projects and regularly participate in online challenges to improve your programming skills.
Whenever I get free time, I try to solve interesting programming problems. Following is a list of Websites providing online programming challenges and problems,
- Codwars - Achieve code mastery through challenges.
- TopCoder – Challenge yourself, and get paid!
- GeeksforGeeks – Computer science portal for geeks
- Sphere Online Judge (SPOJ) – Become a true programming master
- Project Euler – Computer programming problems
- HackerRank – Programming problems and competitions
- DailyProgrammer on Reddit – Daily programming problems
11. Write More Complex Code
One of the important aspects of skill acquisition is that whenever you work on the edges of your capability, your capabilities substantially improve. This applies to programming as well. Look for difficult and complex problems and try to solve them in your area of expertise. Some of the interesting examples of such complex problems include character recognition, solving captchas, machine learning algorithms etc.
Another way create complex code is to try to solve programming problems with intent of making them as generic as possible. A generic solution is always much more complex than solutions which are tailored to a specific data set or problem.
12. Use Code Analysis Tools
There are a number of tools available to check the quality of your code. These tools have a pre-defined set of rules against which the code is evaluated. It is also possible to integrate these tools to your IDE. For example, You can integrate CheckStyle to the Eclipse Java IDE and whenever you write Java code, CheckStyle will report errors or warnings based on its configuration. CheckStyle comes with a set of predefined code quality metrics, however you can fine tune it based on your project needs. If you are a Java developer, you should check out these tools,
If you work on .NET technologies, check out NDepend for Visual Studio. Enabling these tools as part of IDE forces you to improve the code you write.
In this post, I have given an overview of the ways in which you can improve your programming skills. There are a large number of programming opportunities available and good programmers are in great demand and command good pay. I would recommend that you spend a predefined amount of time on each of the above learning activities every week. As Peter Norving argues in his essay, Teach Yourself Programming in Ten Years, The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes.