Deliberate Discovery
- I’m the smartest man in Athens because I know that I know nothing.
- —Socrates
The biggest mistake that software professionals can make is not accepting that they don’t know what they don’t know. Not knowing what we don’t know is also called second-level ignorance. Accepting that we have a lot to learn is a sign of maturity and one of the first steps toward mastery.
The vast majority of us have a natural tendency to be positive and optimistic. An example of that is how bad we are at estimating tasks. Once tasks are completed, if we compare the amount of time they took to our original estimations, we will see that the majority of them took longer than we expected. We need to accept that there is a massive chance that things will not go according to plan, which means there will be unforeseen and unpredictable problems. Unfortunately, we have absolutely no idea when, where, or how. The consequence of us ignoring this fact is that we will be caught by surprise and will not be able to handle the problems as well as we could if we knew about them upfront.
There is not a magical way to completely solve this problem but we can try to minimize it. One way of doing this is to constantly expose ourselves to situations where we can learn something new about the context we are in. This is very important mainly in the early days of a project or before building a major set of new features—when we are most ignorant about what we need to do. Spending time trying to identify and minimize our ignorance across all the axes we can think of can be time extremely well spent.
Ignorance is a constant. Imagine we could start our latest project from scratch again. Same people, same requirements, same organizational constraints, same everything, but the difference this time is that we would start with all the knowledge we already have. How long do you think it would take? Now, stop and think about it. When asking this question, usually the answers average between one half and one quarter of the original time and that’s where my own answer would be as well. Ignorance is the single greatest impediment to throughput, meaning that if we reduce the level of our ignorance as fast as we can, we can be far more productive and efficient.
We should always try to create opportunities where we can learn something we don’t know. “But if I don’t know what I don’t know, how can I create opportunities to learn that?” you may ask. Speak to random colleagues and ask them how they keep up with the progress in our industry. Go to technical community and user group events. Show your code to other people. Ask for help even when you think you don’t need it. Try to figure out which aspects of your current project you and your team have not explored yet, then start discussions about it or even write a proof of concept. Aiming to remove the ignorance constraint should always be your priority in order to deliver projects more efficiently and grow as professionals.