On hacker news I posed the question: What are the top essential skills of programmers?.
This led to a spririted discussion and there were gems I didn’t want to forget about, so here are the top 10 (ranked by popularity on the post) with my titles accompanied by some of my own random notes.
Note: You may notice that some of the top 10 responses on the thread is missing here and that’s because I considered them to be covered by a previous post hence redundant
1. Decouple task from your ego
Never say “Got it” or “OK” when someone is explaining a problem or solution and you don’t follow. It feels awkward to say “Sorry, I’m still not following. Do you mean that when…” five times in the same conversation but it is worth your time and embarrassment to come away with a correctly framed and well understood situation. Otherwise you will figure out what they meant after wasting hours/days/months solving the wrong thing.
- super important because a lot of knowledge are held by others and you need to be comfortable asking questions
- sort of on the team and organization to create the type of culture that encourages this
- not a license for others to be assholes though. just because your feelings are hurt doesn’t mean you haven’t sufficiently reach enlightenment
2. Systemic thinking and understanding
To be a good programmer, if I have to pick only one “skill” I would pick systemic thinking/understanding. This starts with the ability to learn and eventually understand how a system works. The next level is the ability to create a working model of that system in ones mind. Someone who can do that will be very successful at programming anything in any language on any platform given sufficient documentation.
- usually hard to take in an entire system at once but much easier to break it down into pieces and sufficiently learn each one
- sufficient documentation is pretty key here - make sure READMEs are up to date and developer experience / dev onboarding is smooth
- “how a system works” depends on lot on system complexity and breadth and depth of understanding. some systems like OS’s are so large it may be impossible to have both deep and wide understanding
Being able to clearly explain why your solution will solve a given problem better than the alternative and listen to your colleagues when their suggestion is better than yours, will save you an incredible amount of frustration. It is in my opinion the most important skill I have learned.
- so many projects fail not due to lack of technical skill but lack of communication. we’re in the business of speccing out problems to both computers AND humans
- listening is underrated
- easy to fall into trap of confusing “i have the better solution” with “i have the easier to understand solution because I came up with it”
A curious thing that happens every time I write code is that some unexpected error occurs. Sometimes it’s trivial stuff, other times it’s deep structure. Either way, you have to be bothered to make changes and test them. Sometimes this tree gets very very deep. See an error, Google it, find an example that mentions a new keyword, explore that cave for a day, return to previous branch, etc. Something about this is related to addiction, I think I’m somehow fortunate to be addicted to something useful rather than just some molecule.
- debugging requires a lot of this. what do you do when things go wrong … all the time
- easier for problems / projects you’re interested in
- easier when you’re not under time pressure, but when not under time pressure it’s also easy to mismanage your time
5. Believe that computers are understandable / not magical
You need to believe that computers are understandable. There’s no magic involved. Eventually, every abstraction leaks — so if you have fear or learned helplessness blocking you from trying to understand the leaky abstraction layer, the only way you can debug it is by squeezing your eyes shut and trying random things, which is ineffective. You really need to internalize that even things that seem mysterious happen for reasons, and that those reasons are something you could in principle figure out.
- on teams, also worth asking whether or not you should be the person to figure it out
- computers are understandable but also incredibly opaque when you’re dealing with third party vendors
- can it be understood before the heat death of universe? given sufficient time you can understand a lot of things. time is scarce. I wish I didn’t have to learn so many different languages sometimes just to understand a single app.
6. Logical & Spatial Reasoning
By essential, it is what most engineering disciplines have in common: Good logical reasoning, and spatial thinking/skills, ability to build up complex systems from smaller ones, and ability to understand/debug how complex systems work, and no ‘magical thinking’, but ability to analyze things logically.
- not sure how to practice spatial thinking. maybe I should use GPS less
- slow, methodical thinking goes a long way. when I was younger I valued quick thinking in others but noticed that produced solutions that were locally optimal but globally terrible
- glad I took a logic course on coursera. worth it
Learning what questions to ask into Google is a critical aspect. Most of the time, coding is the process of writing some code, and then debugging it. Knowing to ask, my graphql endpoint is failing with a status of 500, vs. my graphql doesn’t work. The first will help you narrow down the issue, the second is far too generic. I have been coding for over 20 years now, and I feel it is rinse and repeat in terms of hitting a roadblock, and finding the answer. Also, a lottttttt of patience. You might take two hours to figure out something that ends up being really trivial, and then you have that moment of feeling good that you solved it, and then you are right back into the next hurdle.
- i should use
manpages more seriously
- google is getting worse and worse to use for documentation. i have lots of reference / doc sites bookmarked
- maintaining your own personal wiki is worth it. half the time I “google” by grepping my own local notes
8. Retain large amounts of detail
“Although high general intelligence is common among hackers, it is not the sine qua non one might expect. Another trait is probably even more important: the ability to mentally absorb, retain, and reference large amounts of ‘meaningless’ detail, trusting to later experience to give it context and meaning. A person of merely average analytical intelligence who has this trait can become an effective hacker, but a creative genius who lacks it will swiftly find himself outdistanced by people who routinely upload the contents of thick reference manuals into their brains.”
- my brain dumps out a LOT of meaningless detail, should I find a different career :)
- memorizing too much detail gets in the way of doing simple things. sometimes I’m weighed down by so much information that should just be garbage collected so I can see the essential things more clearly
- you can use a wiki aka external brain containing meaningless details. a lot of us are probably far better at knowing what to search vs having detail readily available
The single greatest benefit to my career as a developer has been learning to draw. I draw on whiteboards, in moleskins, on printer paper, on the back of resumes… anywhere and everywhere. I do this because I need to convey complex ideas to important teams who are NOT programmers: Product, Marketing, People Ops, and the C-suite. Helping people understand my ideas through illustration creates buy-in from them and trust in me. You can be a great programmer, but if people don’t know and don’t trust in what you’re doing you’ll never be given the space to execute.
- excalidraw has been my favorite tool lately. really useful for communicating diagrams as remote worker
- underrated skill for learning things
- having good handwriting is a close second for me. too bad my handwriting sucks but im working on it
Pessimism. Expect everything that can fail to fail and code defensively to deal with it gracefully. Doesn’t make you much of a joy to work with though
- I think you can be this way and also nice to work with. depends how you present it. People tend not to appreciate public criticism on 10 ways why their idea sucks
- also important to know when it’s appropriate to just let things fail hard and early. don’t want to deal with division by 0 gracefully right?
- optimism is also good for your mental health