My wife recently asked me what the difference is between software developers and software engineers.
She quickly realized that I was going to talk for far too long and she said “forget it, I don’t really care.”
Most people don’t care because for the most part it doesn’t matter, but it got me thinking.
You have to back up and look at the different schools of computer thought:
- computer science
- computer engineering
- software engineering.
In computer science (CS) you are taught to look at solving problems by thinking of problems in terms of data structures and algorithms. The hardest part is learning the many different structures in which you can contain your data so that you can apply algorithms to the data containers.
(This isn’t explaining anything yet, I know. Its why my wife stopped listening.)
As a programmer, you are given the task of taking data in, doing something with it, and outputting some form of that data for another system to consume. The difficulty arises in scaling your process, or pipeline, so that you can operate this “work” on your data stream faster than the data is arriving. If you’re working on a small amount of data every day, then it could be quite sufficient to use a naive algorithm to accomplish the task. But, if your data continues to grow to the point where your naive algorithm can’t keep up then you have two choices: buy more hardware or re write your software to implement algorithms that accomplish your work in less time.
Certain algorithms are served better when the data is stored in particular containers (lists, arrays, sets, trees, heaps, etc).
The majority of a computer science degree is spent learning algorithms and which are best to apply to different problems.
This is less of a science discipline and more of an electrical engineering school of thought. You must learn the fundamentals of how computers work (boolean algebra, truth tables, nand/nor circuit design, CPUs, busses, memory, etc). You must learn how to take requirements for a given piece of hardware, and turn out circuit designs that will accommodate different types of circuit path routing, clock timing components, ensuring that circuit signal is strong and no part of your device is ‘noisy’ and creates interference that would slow down or corrupt the data signals.
It is similar to Computer Engineering, but has more focus on the systems and processes that allow you to take a requirements spec, generate software, and verify that the software written is valid, meaning it reflects the requirements set out at the beginning.
You cannot verify every line of code in large code bases, but you can ensure that the process of writing software conforms in such a way that it is verifiably valid.
When you need to write software that conforms to certain legal regulations (landing gear software, pace maker software, etc) you need to ensure that the software driving your device will operate the device within the bounds of its governing legislation.
A programmer is a multidisciplinary role, capable of writing software in such a way that:
- they can recognize data patterns and apply effective algorithms to make the most of their computer systems resources
- understand the fundamental operation of a computer, how the CPU caches, how hard drives operate to waste as little wall time as possible
- understand how to write software that you can trust. You can’t always be certain that your code will be without bugs, but you need to be able to write code that can be tested to operate properly and verifiably.
Engineer? Developer? These are titles that may be misleading. We’re all programmers, we just have different strengths and focus of work.