The Socratic Programmer
Written
When I work on a simple fix or feature, I take an uncritical approach where I follow my first instincts. This usually works well enough. But, there are times where I get stuck on a difficult technical issue or design question.
In those cases, I must take a step back, and try a different approach. This post is about a different approach that I have been cultivating recently. I would claim that I invented this approach, but I think it is foundational to the human experience, and also, Socrates beat me to formalizing it by a few thousand years.
That’s right, I am comparing my approach with the Socratic method. But, I cannot say exactly how much it actually lines up with that method or not. This approach combines a few techniques for engaging in critical thinking about a problem. These techniques assume you have an initial question in front of you, and that you are struggling to find an answer. Some of the techniques blend together and are difficult to separate.
Cultivating Socratic Dialogue with Yourself
1. Refining the Question
If you are struggling with finding an answer, it is likely that your problem is underspecified. Simply put, you do not understand the problem or even your own question well enough. Once you understand it fully, then the answer should be obvious.
Refining your question means asking further questions to better define aspects of the original question. If your question is “how do I make this report look better?”, you could ask “what does better look like?”. You are refining the question because you are drilling into one aspect of it. You are getting to the heart of your original question by drilling into the most important aspects of it.
2. Changing the Question
Perhaps you are asking the wrong question or focusing on the wrong aspect of the problem. Coming up with a new question will encourage you to see the problem from a different perspective.
If your question is “how do I make this report look better?”, you could ask “why does this report need to look better?”, or “why do we need this report in the first place?” By changing the question, you examine your presuppositions and attempt to rephrase your problem. Even if you eventually come back to your original question, asking different questions about the same problem can give you more perspectives to utilize.
3. Seeking Multiple Answers
Even if you do come up with an answer, there is no guarantee that it is a correct or even a good answer. After you come up with an answer to a problem, it can be helpful to set it aside and ask, “if I couldn’t do that, what else would I do?”
After you use these techniques to solve a difficult problem, usually your work is not done. As a programmer, all my work must be approved by at least two other people. It must pass a code review from another programmer, and it must pass a quality assurance (QA) inspection. It would be easy to look at these steps as just a formality, but they are another chance to think critically about your solution and seek feedback from others.
Here is a short list of techniques I have found helpful for engaging in critical thinking with coworkers.
Cultivating Socratic Dialogue with Coworkers
1. Rush the First Prototype
This is critical, especially if you are working on something visual like a new webpage or a report. Humans are visual creatures and it can be difficult to envision something complex unless you have spent a while working on the problem. Typically, your coworkers will be less familiar with the problem than you are, so providing a prototype does wonders for getting them up to speed with the problem.
People often do not know what they want until they see something that they do not want. So, rush a first prototype even if it has obvious holes in it. Just get something ready to show off as a starting point for getting feedback. If you are able to get feedback on prototypes from your users, that can be even better for double-checking your assumptions.
2. Kill your Ego
If you let yourself, you will be offended about what people have to say about your prototype. It is natural to tie up your ego in your work, but that is actively harmful to this process. You need to view your prototype (and even your “finished” work) as separate entities from yourself. If someone pokes a hole in your work, they are not attacking you, they are doing you a favor. They are giving you an opportunity to improve your work and learn.
Take all feedback with an open mind and evaluate it honestly.
The object of opening the mind, as of opening the mouth, is to shut it again on something solid.
3. Point out the Hard Parts
When you are showing your coworkers a prototype or discussing a difficult problem, it is helpful to point out the hardest parts that you struggled on. I assume that the parts I found the most challenging will typically be the most important parts of the problem or the parts that I am most likely to get wrong. So, I want my coworkers to double-check my work on those difficult parts by getting their feedback on them specifically.
Pointing out specific parts of the problem or the prototype can also be helpful for getting the discussion started with a coworker. Even if they do not have any feedback on that part, it is a way to get your foot in the door and get them to start considering the problem.
Conclusion
Those are just a few of the ways I have been trying to think more critically about my work recently. I am still refining my process, so I will update this post if I think of more methods. At the start, I said that I only use these methods after I hit a wall and get stuck on a difficult issue. That is true, but I wish it were not. I think there would be great value in using these techniques from the start on every problem I work on.
Now that I have a number of years of experience, I take simpler problems for granted and rush to implement the first solution I imagine. What if I am leaving possibly better solutions on the table? I would never know unless I stopped and thought more critically about my work.
Hopefully this post made you stop and think about your own process. Do you ever think critically about problems at your work? Do you only do it when things get hard, or do you practice critical thinking everyday? What methods do you use?