It's often hard to figure out where the gaps are in our knowledge. As programmers, it's easy to stay within our comfort zones and keep using familiar technologies and skills, especially if we're being well remunerated for it.
However, this warm and fuzzy comfort becomes our downfall as professionals, leading us to mediocrity and irrelevance. Erik Dietrich has a good description of the process. Essentially, it is possible to commit the sin of pride and remain indefinitely in the "Unconscious Incompetence" stage of the road to expertise, while managing to convince ourselves that we're pretty hot stuff.
In order to combat this process, here are Ten ways to keep ourselves humble and identify gaps in our knowledge as programmers:
10. Answer questions on Stackoverflow
Stack Overflow is not only a great resource when you encounter a problem, but is perhaps one of the most valuable learning resources online.
One of the best ways to find gaps in you knowledge is simply to start answering questions in a chosen domain. Don't try to answer questions that you know the answer to, but instead choose ones you cannot answer right now, and then do the research.
Many new questions are rather trivial, and answered within minutes, if not seconds. Sometimes, however, a question will remain unanswered after several days simply because it is hard to answer quickly, and puts off people hunting for reputation. These are the questions you want to concentrate on. The harder and deeper the question, the more you will have to understand in order to answer it well.
Although this isn't a perfect metric, a good way of finding questions like this is to look at the reputation of the people asking. People with a few thousand reputation points are likely to have good research skills already, and will ask commensurately good questions.
Besides highlighting gaps in your knowledge, answering questions on stackoverflow has several other benefits:
- Vastly improve your ability to read code, especially bad code.
- Force you to untangle the intent of the original poster and dig out the true requirements, just as you have to do with clients and customers.
- Give you superhuman research and lookup powers.
That said, there are some downsides: answering questions and seeing your reputation grow over time can become dangerously addictive!
9. Run an interview group with colleagues
An interview group is a regular meeting with a few colleagues where you ask each other interview questions. These can run as often as weekly or as rarely as quarterly and still provide value. It works best as a pair or with just a few colleagues. I can't remember when I first came across the concept, but few things will grow your knowledge and undertsanding of programming as preparing to face someone you respect in an interview, whether you are preparing for being the interviewee or the interviewer.
It works best when the person asking the questions has prepared the canonical reply in advance, and can go through the concepts if needed. It's also a great way of keeping your hiring process and interview questions up to date, and define the standard you expect from a colleague when recruiting new people.
A problem with this approach is that you may end up simply reflecting your in-group's biases in the questions. For example, if you company has no functional programmers, you are unlikely to be asked about closures. Try to find people who are different from you for the group, and who can ask you challenging questions outside your comfort zone. For example, pair up front-end and back-end engineers. You'll also quickly notice that good questions don't concentrate on the technology so much as the underlying principles, and this is valuable both for the group but also for real interviews you may have to give and take.
If for political reasons it isn't possible to do this within your company, you can always join or create one outside of work. Doing this with colleagues who are significantly smarter and/or more experienced than you may be a somewhat brutal way to stay humble, but few things beat it in effectiveness.
8. Attend developer user groups
Getting together with other developers over beer or pizza on a regular basis will also be a great way to learn about things you're not familiar with. Try and find a group that attracts a wide range of attendees, rather than people restricted to your language and the technology you use. The broader the group, the more ideas you will be exposed to and the more gaps you will uncover. For example, a craftsmanship group, or a general developer group would be better for uncovering gaps in your knowledge than would a dedicated group to Drupal or Ruby on Rails.
Meetup.com is a great place to find interesting groups, but by no means the only place. For example, I found the excellent London Clojurians via an Eventbrite recommendation.
Meeting other passionate developers will also inspire you to get better at your craft and contribute back to the community. For example, this article was inspired by a session at a Cambridge Software Craftsmanship round table, during which we talked about some of the topics.
This is often a very valuable and humbling experience. For example, as someone who works primarily in C on Linux, I was rather dismissive of C# before seeing it being used by professionals. I now have a newfound respect for the platform and the people who use it.
7. Attend conferences
In a similar way to developer user groups, conferences and workshops will expose you to new ideas and new people. They're a really efficient way of learning about many new ideas quickly. If your goal is to be discover gaps in your knowledge, target conferences that have a wide variety of speakers, and don't forget to attend the lighning talks. It can sometimes be a bit overwhelming, especially if you attend five different sessions on five different topics, all presented in languages you're not familiar with. Make sure to take some notes on the topic of the talks you attend and mark down the speaker details. Most people welcome emails about their talks, so if something isn't clear, or if you want a pointer to more resources on the topic don't hesitate to ask the speaker at a later date.
Another great reason to attend conferences and workshops is for the people you'll meet. These connections are invaluable, and most of the people you meet will have skills you're not familiar with. Asking them about the latest development in their area of expertise is a great way of highlighting gaps in your knowledge and guide you to areas worth exploring. They've done the legwork of exploring their domain and finding the gems. A quick conversation will mean that you don't have to waste your time when deciding what to learn next in unfamilliar territory.
6. Pick up an unfamiliar book
Picking up an unfamiliar book is a great way to dive into an area you know nothing about, or to remind you how little you know about an area you feel comfortable in. While like most programmers I have my own personal recommendations and a reading backlog, it's worth looking at what kinds of books will reveal gaps in your knowledge the fastest.
- Books that review a topic in breadth are great for giving you an overview of the landscape and revealing approaches you may not be familiar with. Good examples are Seven Languages in Seven Weeks or Seven Databases in Seven Weeks. Doing pretty much what their titles advertise, these books and others like them do a great job of introducing you to new concepts.
- Books about fundamental topics are also worth picking up, especially if your background does not include a Computer Science education (I studied something else altogether). Books about Compilers, Algorithms, Operating Systems, or Datastructures will have something worth your time no matter what your level of expertise is.
- Books about a different domain Will push you outside your comfort zone. It is often quite enlightening and humbling to see how people outside of your day-to-day work. Picking up a book on modern web development as an embedded engineer, or picking up a book about embedded testing as a web developer will definitely highlight gaps in your knowledge, and the techniques and approaches can often show new ways of tackling old problems in your own field of expertise.
- Books about real people making real software are always both humbling and inspirational. They will show you how other professionals approach problems and the challenges they face. I would highly recommend The Architecture of Open Source Applications Vol. I and Vol. II. But there are others in a similar vein. These books give an overview of various popular tools and frameworks straight from the people working in the guts of the code in question. The breadth and real-world foundations of these books make them no-brainers when you want to expend your horizon.
5. Join an online course
There is now a vast multitude of online platforms that offer courses on programming topics. You can find courses from the novice level to expert tutorials on arcane topics. These are fantastic ways to get a good education. You might have to do some research to find the best course in your topics, but there ares some fantastic ones on offer.
Take a look at the following platforms and see if you can’t find something exciting to learn:
In fact, I created a course to teach you how to Make Games with Unity on Udemy - you can even get a discount by clicking on the link :)
Also don’t forget that many universities put their course lectures and materials online. You’d be surprised at the things you’ll find if you look in the right places. Take a look at the Open Education Consortium’s courses, Stanford’s Online Courses or MIT’s OpenCourseWare portal. These university course from some of the world’s best institutions are all available for free online right now. Any one of them will broaden your expertise and give you valuable skills. I will give a special mention to MIT’s 6.001 course.
4. Maintain your own tech radar
Another great way to highlight gaps in your knowledge is to maintain your own tech radar.
A Tech Radar is a way of showing which technologies are upcoming and which you should adopt in your daily practice. The idea comes from Thoughtwork’s Tech Radar which is released every six month and show’s Thoughtwork’s perspective on upcoming technology. It also shows which technology you should avoid or phase out.
Maintaining your own is a great way of keeping up to date with the latest trend in your own area of technology, and will force you to think critically about new technologies and tools. This reflection on the ecosystem you’re involved in will help you understand the choices of tools, frameworks and languages you are making, and what the implied tradeoffs are. You’d be surprised how much more productive you can be when you’re using the right tool for the job, rather than simply picking up whatever you happen to have in your toolset.
Neal Ford has a great article on building your own tech radar that explains the mechanics in details.
3. Fill in the Programmer Competency Matrix
The Programmer Competency Matrix is a a great tool to find gaps and missing areas in your programming education. I’ve yet to find someone who would score the top marks in every category. Take a few minutes to fill in the matrix, then look at areas that are significantly behind. You’ll then be able to direct your learning to fill those gaps.
Better yet, you should create your own matrix that reflects what you think would be a full education in your domain. For example, the matrix misses out on a lot of very important skills in web development, web protocols, cloud computing or machine learning, all relevant to modern enterprise programmers. Similarly, your domain might have a different set of skills required. For example, game developers night want to include rows for AI, Rendering, Physics, Modelling and Animation. Use the matrix as a first step in identifying what matters to you and what’s missing form your education.
2. Take part in hack days and coding events
If you want to get good at something, do it often. If you want to be good at shipping, ship often. With that in mind, there are few things that will be as valuable in highlighting gaps in your knowledge as shipping a product in a weekend with a bunch of motivated coders.
Attending a hackathon or hack day can be daunting, but is a sure way of exposing yourself to new ideas and techniques that might be missing form your toolset. There’s nothing quite like seeing someone solve a problem that would have taken you a week in only a few minutes to motivate you to learn what they know!
An amazing benefit from these events is that you’ll also pick up a lot of soft skills in how to handle teamwork and communications under stress. The entire product lifecycle gets compressed so tight that it’s sometimes pretty stressful, but the insight you’ll get into yourself and how you work in a team will be invaluable. As a Startup Weekend organiser, I’m obviously biased, but these events are usually worth twenty time the price you’ll pay for the ticket.
I would say however that you should pick your event carefully. Some hack days or startup weekends will have a much stronger product focus than others, which will really help build your hard skills and pick up techniques from other developers. Weekends that are more about customer development and business development will stretch your soft skills instead. If you end up in one when expecting the other, don’t leave! Just enjoy the ride and learn as much as you can.
A good tip to know the hard/soft balance of an event in advance is to ask the organisers about the balance of technical vs non-technical people. Lots of techies in a room will stretch your hard skills, while lots of non-technical people will stretch your soft skills.
“If you can't explain it to a six year old, you don't understand it yourself." ― Albert Einstein
Beyond a shadow of a doubt, the most effective way of finding gaps in your knowledge and of improving your skills is to teach others. The questions that a good student will ask shine a light on your ignorance and you’ll find yourself time and again being unable to answer in anything less than an incoherent mumble.
This is a good thing. Having the pressure of your students will motivate you to find out about the topic. Not only this, but things you learn with the intention of teaching them have a miraculous way of sticking in your brain. If your students are no longer challenging you, teach them something harder.
You’ll find a wealth of opportunity for teaching programming. You could volunteer at a Code Club, mentor a younger programmer in your company, or sign up to platforms such as AirPair or CodeMentor as a mentor.
When we look at this list as a whole, it is easy to see a trend amongst all the items. Most require us to step outside our comfort zone and do something that is unfamiliar. Seeking out the feeling of discomfort and uncertainty that comes with being out of our depth is one of the surest ways we can grow, not just as software engineers and developers, but as individuals. I hope you found this list useful and good luck on your journey!
If you want some book recommendation that go into this topic in much more depth, take a look at:
- Pragmatic Thinking and Learning: Refactor Your Wetware
- The Art of Learning: An Inner Journey to Optimal Performance
- Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman