Learning is like rowing upstream: not to advance is to drop back.Chinese proverb
Programming is an exciting and dynamic field to work in; there is always something new to learn. Programmers are rarely forced to repeat the same task for years, only discovering new ways to develop RSI and failing eyesight. We continually face the unknown: new problems, new situations, new teams, new technologies, or a new combination of them all.
We are continually challenged to learn, to increase our skills and our capabilities. If you feel like you’re stagnating in your career, one of the most practical steps you can take to get out of the rut is to make a conscious effort to learn something new.
Be in a state of continual learning. Always look to learn something new.
Some people are naturally better at learning; they excel at absorbing new information and can “get up to speed” rapidly. That’s natural. But it is something we can all improve at, if we try. You need to take charge of your learning.
If you want to improve as a programmer, you need to be a skilled and seasoned learner. And you need to learn to enjoy it.
Learn to enjoy learning.
There’s a whole world of things you could attempt to pick up. So what should you look at? American political poet Donald Rumsfeld summed up this conundrum in a particularly apt way when he made an infamous White House press conference:
As we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say, we know there are some things we do not know. But there are also unknown unknowns—the ones we don’t know we don’t know.
That is surprisingly profound.
You’re aiming for a known unknown—something you’d like to learn. Or shoot for the unknown unknowns: spend some time investigating interesting things to learn first.
Ultimately, pick something that interests you. Pick something that will benefit you (the act of learning in itself is a benefit, but choosing something because it will give you fresh usable skills, broadens your insight, or brings you pleasure is a good thing). You will be investing a significant amount of time, so invest wisely!
For programmers this is the obvious choice. We’re fascinated by the different ways we can make electrons dance, and there are so many ways to do it.
There is no shortage of new and interesting programming languages; you don’t have to become an expert, but do get beyond “Hello, World!” Learn a new library, an application framework, or a software tool. Learn how to use a new text editor or IDE. Learn a new documentation tool, or a test framework. Learn a new build system, an issue tracking system, a source control system (indulge yourself in the new distributed version control craze that all the cool kids are going on about), a new operating system, and so on.
Learn how to effectively read alien code, or how to write technical documentation. Learn how to architect software.
Yes, this is tediously “touchy-feely” for most code monkeys. But it is an incredibly interesting, useful field. Study sociology, or management texts. Read about becoming a software team leader. This will help you to become a more capable team worker. It will help you to understand how to communicate well with your team and how to understand your customer better.
Perhaps you’ve always wanted to write mathematical modelling software, or work on audio DSP. Without any experience or knowledge you’d be unlikely to find a job in a new sphere, so give yourself a head start and begin to learn about it. Then work out how to get practical, demonstrable experience.
Seriously! Find new techniques that will help you absorb knowledge more effectively. Do you find there’s a constant barrage of information you need to tap into, and it just seems to flow past you? Investigate ways to seek out, consume, and absorb knowledge. Practice new skills like mind mapping and speed reading.
Or, more interestingly, focus on something completely left field with no relevance to your day job, and no obvious software applicability. Learn a new foreign language, a musical instrument, a new branch of science, art, or philosophy. Even spirituality. This will widen your world view, and will inevitably inform the way you program.
Learning is a basic human skill. We all do it, all the time. When it arrives freshly formatted, the human brain rapidly absorbs information and develops skills across a wide range of experiences.
Then we hop aboard the academic train, where our learning is progressively funnelled through an increasingly restricted system. We move from a general education into a more specialised secondary education, until at university we focus on a single major topic. Post-graduate study focuses on an even more specific area of that specific topic. This increasing focus enables us to become highly proficient in an area, but in the process we train ourselves to become very narrow minded.
Our learning is often too narrowly focused. Consider a wider sphere of reference. Draw inspiration from many fields.
There are a few techniques to employ that will help you learn more successfully.
Understand how you best learn and exploit that to your advantage; your personality type affects your learning style. People who are traditionally categorised as “right-brain” learn best when presented with patterns and a holistic view of a subject; they struggle when bombarded by a serial stream of information. Their “left-brain” counterparts thrive on a linear, rational presentation of the topic. They prefer to assimilate facts than to have a grand story told to them.footnote::[It’s interesting to note that, although the left/right brain characterisation is prevalent in pop-psychology writing, no scientific studies have proved that such a distinction actually exists.] Introverts prefer to learn on their own, whereas extroverts thrive in collaborative workshops. Understanding your particular personality type will reveal specific ways to make your learning routine maximally effective.
You may find it useful to try absorbing information from many different information sources. In the modern connected world we’re presented with many media forms:
The written (e.g., books, magazines, blogs)
The spoken (e.g., audio books, presentations, user groups, podcasts, courses)
The visual (e.g., video podcasts, TV shows, performances)
Some people respond better to particular media. What works best for you? For the best results, mix several of these sources. Use podcasts on a topic to reinforce what you’re reading in a book. Attend a training course and read a book on the topic, too.
Use as many sources as possible to improve the quality of your learning.
Cross-sensory feedback attempts to stimulate parts of the brain that you don’t normally exercise whilst learning, to increase the brain’s effectiveness. Consider trying some of these actions whilst learning—some may work well for you:
Listen to music whilst you work
Doodle whilst you think (yes I am paying attention in your meeting, look at how many doodles I’ve made…)
Fiddle with something (a pen or a paper clip, perhaps)
Talk whilst you work (vocalising what you’re doing or learning, it really does help you retain more knowledge)
Make thought processes concrete rather than purely intellectual—like modelling things with building blocks or CRC cards
Employ meditative practices (may help you attain greater focus and cut out distractions)
A surprisingly simple way to improve your information recall is to grab a notepad and capture information as you uncover it, rather than let it wash past you.
This serves two purposes. Firstly, it keeps you focussed and helps you to maintain concentration on the topic. It’s a basic idea, but remarkably helpful. Secondly, even if you throw those notes away immediately afterwards, the cross-sensory stimulation will aid your recall of facts.
Takes notes as you learn. Even if you throw them away.
Your mental state affects the quality of your learning. Studies have shown that cultivating a positive attitude towards learning significantly enhances your recall. So find things to learn that engage you. Stress and lack of sleep will contribute to an inability to concentrate, degrading your ability to learn.
There are a number of very illuminating models of learning that have been constructed by educational psychologists. The Dreyfus model of skill acquisition is a particularly interesting example, postulated by brothers Stuart and Hubert Dreyfus in 1980 whilst they were working on artificial computer intelligence.footnote::[Stuart E. Dreyfus and Hubert L. Dreyfus, A Five-Stage Model of the Mental Activities Involved in Directed Skill Acquisition (Washington, DC: Storming Media).] After examining highly skilled practitioners such as airline pilots and chess grand-masters, they identified five specific levels of understanding:
A complete newbie. Novices want to get results fast, but have no experience to guide them in doing so. They look for rules they can follow by rote, and have no judgment to tell whether those rules are good or bad. Given good rules (or luck finding suitable resources on Google), novices can get quite far. Novices have no knowledge of a topic (yet).
At this level, some experience has led to learning; you can break free from rules a little and try tasks on your own. But perception is still limited, and you’ll get stuck when things go wrong. At this level there is a better understanding of where to get answers (you know the best API references, for example) but you are still not at a level where you can comprehend the bigger picture. The beginner can’t focus out irrelevant details; as far as they’re concerned everything and anything could be important to the problem at hand. Beginners rapidly gain explicit knowledge—the kind of factual knowledge that can be easily written down and articulated.
This stage sees you with a mental model of the problem domain; you’ve mapped the knowledge base, have begun to associate its parts, and understand the relative importance of different aspects. This big picture view allows you to approach unknown problems and plan methodical routes into those problems, rather than diving in and hoping rules will get you to a solution. At this point, you actively seek out new rules to formulate a plan of attack, and begin to see the limitation of those rules.
This is a good place to be.
Proficient people move beyond competency. They have a much better understanding of the big picture, and are frustrated with the simplifications that the novice needed. They can correct previous errors and reflect on their experiences to work better in the future. At this point you can also learn from other’s experiences and assimilate them into your body of understanding. Proficient people can interpret maxims (as opposed to simplistic rules) and apply them to a problem (e.g., they know how and when to apply design patterns). Now it is easy to identify and focus only on the issues that really matter, confidently ignoring irrelevant details. Here we see the person has gained significant tacit knowledge—knowledge that’s hard to transfer by exposition, that is only gained by experience and deep understanding.
This is the pinnacle of the learning tree. There are very few experts. They are authorities on a subject; they know it completely, and can use this skill interlinked with other skills. They can teach others (although they probably teach competents better than novices as there is less of a disconnect). Experts have intuition, so rather than needing rules, they naturally see an answer, even if they can’t articulate why it’s the best solution.
Why is the Dreyfus model interesting? It’s a revealing framework to understand where you currently stand in the mastery of a topic, and helps determine where you need to get to. Do you need to be an expert? Most people are competent and this is satisfactory (indeed, a team of experts would be far too top-heavy, and probably dysfunctional).
It also illustrates how you should expect to be solving problems at each stage of your learning. Are you looking for simple rules to apply, hungrily gathering maxims to draw experience from, or intuitively sensing answers? How much of a “big picture” view do you have of the topic?
The Dreyfus model is also a very useful aid for teamwork. If you know where a colleague sits on the novice-expert spectrum, you can better tailor your interaction with them. It will help you learn how to work with other people—whether you should give them some simple rules, explain some maxims, or leave them to weave new information into their broader understanding.
Note that the Dreyfus model applies per skill. You may be an expert in a particular topic, and a complete notice in another. This is natural. And should also be a source of humility—even if you know all there is to know about behaviour-driven design, you may know nothing about the Joe Bloggs test framework. It should excite you that there is something more to learn that may enhance your expertise in BDD, whilst keeping you humble that you aren’t an infallible expert in every subject! No one likes a know-it-all.
The Pragmatic Programmers describe a vivid and potent metaphor for learning—they talk about your knowledge portfolio.footnote::[Hunt and Thomas, The Pragmatic Programmer.] Consider your current working set of knowledge like a portfolio of investments. This metaphor beautifully highlights how we should manage the information we have gathered, prudently investing to keep our portfolio current, and bringing in new investments to strengthen it. Consider which items you should retire from your portfolio to make room for other things.
Be aware of the risk/reward balance of the items in your portfolio. Some things are common knowledge, but a safe investment to hold—they are low risk, easy to learn about, and guaranteed to be useful in the future. Other investments are riskier—they may not be mainstream technologies and practices, so studying them may not pay off in the future. But if they do become mainstream, then you will be one of a smaller set of people experienced in that niche, and so able to exploit that knowledge more. These higher risk knowledge investments may pay much greater dividends in the future. You need a good spread of risk and a healthy range of knowledge investments.
Purposefully manage your knowledge portfolio.
To teach is to learn twice.
Joseph Joubert
One of the most effective ways to learn anything is to teach it; explaining a topic to someone else solidifies the knowledge in your head. When you have to explain something, you are encouraged to go deeper so you truly understand the topic. Teaching forces you to review the material, reinforcing it in your memory.
Write a blog post on what you learn, give a talk, teach a friend, or start to mentor a colleague. Each of these will benefit you just as much as they benefit the other person.
Einstein said: If you can’t explain it simply, you don’t understand it well enough. When reading a book, or listening to a teacher, it’s easy to fool yourself that you “know” a topic. You’ve heard about it, but nothing has yet tested where the limits of your knowledge lie. Teaching pushes on this boundary: you’ll have to answer tricky questions that stretch your knowledge. If you’re asked a question that you can’t answer, the right response is: I don’t know, but I’ll find out for you. You’ve both learnt.
Teach a topic to learn that topic well.
I hear and I forget. I see and I remember. I do and I understand.
Confucius
An essential learning technique is to learn by doing. Reading books and articles, watching online tutorials, and attending programming conferences are all very well. But until you actually try to use that skill, it’s just an abstract collection of concepts in your head.
Make the abstract concrete—dive in. Try it.
Ideally, do this whilst you’re studying. Kick off a test project and try to use the knowledge as you amass it. When learning a new language, start writing code in it immediately. Take the code examples you read and try them out. Play around with the code; make mistakes, see what works and what doesn’t.
Using what you just learned cements it in your memory. Try examples, answer questions, create pet projects.
Using information is a sure way to gain understanding about it. It will generate more questions that will guide you in your learning.
Tell me, and I will forget. Show me, and I may remember. Involve me, and I will understand.
Confucius
You have to take responsibility for your own learning. It’s not up to your employer, your state education system, an assigned mentor, or any other person.
You are in charge of your own learning. It’s important to continually improve your skills to improve as a developer. And to do that you have to learn to learn. To make it rewarding you have to learn to love doing it.
Learn to live to love to learn.
Questions
When were you last in a situation that required learning? How did you approach it?
How successful were you?
How quickly did you learn?
How could you have performed better?
Did you learn, then work, or learn as you worked? Which do you think is most effective?
When was the last time you taught someone? How did it affect your understanding of that topic?
How can you find the time to learn new things when you are under pressure to produce work?
See also
A Love for Languages One of the things a programmer frequently learns: a new language.
Many-festos Learn about the latest thoughts, trends, fashions, fads, and movements in the software development world.
Test-Driven Developers Considers how to prove that you know a programming skill well. Is examination and certification valuable?
Navigating a Route Sharp learning skills help you learn new codebases more effectively.
Take responsibility for your learning. Step up. Decide on a topic you need to learn about, and formulate a plan to learn it.