As a programmer, I’m privileged to be part of a field where learning is thought of as part of my job. Many enlightened companies specifically dedicate time during the workweek for exploration and side projects. Companies pay for their employees to attend conferences, buy books, and sponsor subscriptions to online learning resources.
There’s a wealth of information I can access, and more is being created constantly than I could ever hope to consume. Prioritization is key. What should take precedence in my learning? What will contribute most to my professional development as a programmer?
There are many approaches, ranging from “Follow your heart and specialize,” all the way to “Learn a bit of everything.” Some emphasize learning a full stack of technologies, others think you should just get really good with the tools you use every day.
My approach falls somewhere in the middle, and I’d like to share it with you. It starts with a bit of wisdom imparted over 1,600 years ago.
The Jewish System of Learning: A Multi-Tiered Approach
The Talmud records a profound suggestion which bears a surprising degree of relevance to programming:
Rabbi Safra stated in the name of Rabbi Yehoshua ben Chananya… A man should divide his learning [literally “years”] into three: one-third Mikra, one-third Mishnah, one-third Talmud. (Kiddushin 30a)
Rabbi Safra describes a method of learning where one studies multiple degrees of abstraction simultaneously.
At the highest level, one studies Mikra, the 24 books of the Bible. These books are light on detail, but establish the ethics and certain core laws which form the foundation of Jewish life.
One layer deeper, one studies Mishnah, the 60 tractates which extensively detail the multitude of laws governing every moment of private and public life for the committed Jew.
At the lowest level of abstraction, one studies Talmud, the probing analyses and debates which provide the rationale for the concrete laws. (This isn’t to be confused with what is today called Talmud, which constitutes a canonized subset of the Talmud referred to by Rabbi Safra. Naming things is hard.) One cannot effectively function at this level of low-level details all the time; it would overload the mind. But understanding the rationale for the laws helps in terms of understanding and handling edge cases, as well as situations that prior legal decisions have yet to address.
A Bit of Interpretation
In contrast to many other religions, Judaism is extremely concerned with practice. Jews (at least Orthodox Jews, whose practice most closely mirrors the Talmud’s vision of Judaism) don’t generally describe the faithful as “believers”; instead, the usual term is “observant,” meaning they observe at least a major subset of mandated religious practices.
With that sort of attitude, it’s clearly Mishnah which describes how Jews engage with their religion on a daily basis. For daily guidance, nothing could be more critical than the Law itself.
So why not suffice with study of Mishnah? Apparently Rabbi Safra saw great value in reaching up and down one layer of abstraction. Reaching up, Mikra provides inspiration, motivation, and guiding principles. Reaching down, Talmud provides a depth of understanding which gives its own form of meaning to practice. Both are necessary in building a holistic religious personality.
In programming, we tend to operate mainly at a single layer of abstraction. As a result, when we think about learning, we often equate our own layer with the sum total of relevant knowledge, then learn more about it. In doing so, we miss the opportunity to make ourselves more effective professionals, and to broaden ourselves as people.
Missing the Forest for the Trees
As programmers, we’re called upon to solve human problems through technology. Often we focus so much on the technology that we forget our goal is to solve problems for real people.
Rabbi Safra reminds us: Study Mikra. Don’t get bogged down in languages and frameworks without understanding why you write code in the first place. Figure out what motivates people, and how to communicate more effectively. Study how to design your products in a way that matches human intuition. Don’t simply hack on an app; build a whole product that actively meets the needs of your users and creates value for them.
Missing the Trees for the Forest
If you program in a high-level language (as I do), it’s easy to forget about all the magic which has to happen on a lower level just to get started. There’s a whole beautiful world of hardware, machine language, operating systems, systems programming, and highly efficient algorithms. Most of it won’t matter in day-to-day programming. But on the rare occasions when it does matter, this knowledge will allow you to provide enormous value to your team, or contribute meaningfully to the programming community through Open Source projects. You might even submit a patch to your favorite high-level language!
As Rabbi Safra instructs us: Study Talmud. Don’t take the tools you see at face value; tear them apart, learn how they work, and figure out what you can do to make them better.
Learning in Parallel
As a personal example, I’m currently working through 3 different books at the same time:
- My current Mikra is The Design of Everyday Things, which I’m studying to understand how to design intuitive products and interfaces.
- My current Mishnah is the Martin Fowler classic Refactoring: Improving the Design of Existing Code, which details the process of refactoring as repeatable, easily communicable steps. Better understanding refactoring will make me more effective in my daily coding.
- My current Talmud is The Elements of Computing Systems: Building a Modern Computer from First Principles, affectionately known as Nand2Tetris. Through the book and its accompanying projects, I’m learning how computers are built from logic gates all the way up to high-level languages.
Certainly, some people will do better learning one thing only at a time. YMMV. Personally, I’ve found that having several tracks of study allows me to jump back and forth based on interest and energy, and I progress faster this way than if I had only one subject to study at a time.
One significant outcome of study at all three levels has been a significant broadening of perspective. I’ve become less afraid of low-level programming or hardware concepts, and my ability to think about business value and UX has improved, all while building skills relevant to my primary daily work activities.
What About Specialization?
Learning isn’t just about broadening our horizons. It’s also a tool in service of career progression. Why not just specialize at one level, and get really good at doing one thing?
I actually wouldn’t discourage that at all. Specialization is healthy, normal, and probably unavoidable. There’s just too much to know to really know everything!
Still, having a window into the layers above and below your specialty will make you better at doing what you’re actually paid to do. No one is paid to think only at one level of abstraction; your job is to make your code work for the next level up through understanding the next level down.
You don’t have to learn everything. You don’t have time to learn everything. Just make sure to always be expanding your horizons both within and beyond your primary level of abstraction.
Written as part of the 2016 8 Crazy Blog Posts Challenge.