What makes a good Software Engineer
What makes a good Software Engineer - solid grounding in CS fundamentals or fluency in coding languages and application frameworks? I get asked this question from college students and new graduates all the time.
When I interview candidates for programming roles, more often than not I find them out of touch with the foundations. Even when they have years of coding experience. New grads on the other hand worry about not learning the latest tech stack in school. It's the classic grass-is-greener-on-the-other-side story.
So what separates a good developer from the rest? Well, the short answer is - you need both and there are no shortcuts. For the more nuanced answer, please read on.
Creative freedom emerges out of the grunt, laborious, repetitive and often boring work - the building blocks.
You won’t expect a great Olympic athlete to be great because they have the best gear, physique or strength. You expect them to have put in the hard work to train and learn the proper technique. You expect them to eat, sleep and rest correctly. Once they have mastered the basics, they can improvise.
The greatest singer, pianist, physicist, pilot, accountant, lawyer - all must go thru the grind before they are able to express that unique trait we find creative or improvisational.
Why would we expect anything different from programmers?
- Understanding and being able to calculate the time complexity of an algorithm is required if you are going to write any non-trivial code.
- Without understanding Database joins, foreign keys, normalization you cannot write performant APIs.
- If you don’t understand the fundamental limitations of a Universal Turing machine, you will not understand AI. You must know what non-computability is and why the halting problem stands like an insurmountable rock in front of hard AI.
- If you don’t understand the difference between concurrency and parallelism, you won’t be able to efficiently use compute resource. Or worse introduce hard to debug race conditions, deadlocks and livelocks.
- If you didn’t learn the 3-way handshake, the flow control, the packet sequencing of TCP you cannot appreciate the beauty of a protocol that virtually all the connected world runs on.
I can go on but you get the idea.
On the flip side, if you mastered all the fundamentals but didn’t learn and practice any programming language or framework your work is only half done. You are like this great foundation with a lot of unrealized potential. However, this in my view is a better state to be in than the opposite - a building without a good foundation is not stable.
If you quickly learnt how to wrangle Python (or Java script, Java, Ruby whatever …) without taking the time to understand the basics, you’re off to a start but you won’t go too far.
Like that swimmer who can sure swim but without having put in the time to train is not going to win any Olympic medals.