Don’t Forget Your Fundamentals
I had the opportunity to tutor college computer science students for a living a few years back. It was honestly one of the best experiences of my life as a engineer because it gave me a chance to realize what really makes a brilliant new engineer.
It’s not the programming languages they know
It’s not the technologies they know
It’s not years of experience
It’s not what random algorithms they have memorized
No, what makes someone who will make a brilliant engineer is if they know their fundamentals.
Now what the fundamentals of software engineering are is a little up for debate, but I will attempt to give a very incomplete list of them. But first I think it is worth talking about why I no longer care about the previous things when evaluating an engineer.
It basically comes down to timelessness. The things I mentioned above (with the exception of the last one in certain regards) will change over time. The fact that a candidate has been programming professionally in Python for a dozen years doesn’t say anything about if that person is a good engineer. Python has certain, idiomatic ways of handling different problems and situations. A good engineer will know how to solve all sorts of problems given a toolset. A brilliant engineer will know what these problems are head to two. They will know what are the very basic tools they have to solve problems. They will also be able to recognize what problems different tools are able to solve.
Now every language and technology has opinions about the fundamental problems of computer science. That’s ok! But an engineer will struggle to stand out if their thinking is locked to opinionated frameworks, languages, and technologies. In many ways, relying on their opinions is putting the cart before the horse.
A brilliant engineer should be able to recognize a problem and use the tools given them to solve the problem.
And this applies to all sorts of endeavors. If you want to learn how to cook, it is worth considering what actually makes a great chef. What makes an amazing chef is not the fact that they have a number of recipes memorized and are able to adapt these recipes to various situations and flavors. No, what makes an amazing chef is the fundamental understanding of food, its chemistry, and the various things that can be made. This allows them to be able to make just about whatever someone wants, and allows them to be far more inventive than they otherwise would be!
So that leads to the question, what are the fundamentals of software engineering? Well a (very) incomplete list would have to include:
What is data in an abstract sense? What is data consistency? What are the problems with data consistency? What are some problems with data storage and representation? What are some methods for re-representing data?
What does it mean to compute a value? What are the two major models of computation? Why are some problems unsolvable and what makes them that way? What is the difference between a P and NP problem, and what about an NP problem makes it such?
Networks (Data at a Distance)
What are problems with coordinating knowledge? How can we ensure that only the intended recipient of knowledge receives the knowledge? How do we coordinate actors within a connected system? How do we effectively move information around a connected system?
What does it mean to test a section of code? How do we improve our confidence that a system is correct? In what ways can our tests be incomplete? What are different ways of testing (in an abstract sense) and what are they appropriate for ensuring?
This is not everything that describes software in an abstract sense. It does offer a short list of the sorts of things that we as engineers should focus on and understand at a very deep level. With these things, understanding or utilizing any new system would be almost impossible. The poor engineers and students that I have seen have had some hang-up understanding one or more of these topics in an abstract sense. They struggled to separate the actual implementation of one of these concepts from the abstract understanding of that same concept.