Is programming an engineer discipline?
On what could be considered engineering and if programming fits it.
Where is this coming from?
It all started here
It was an interesting take, although I was one of those who disagreed. If you take a look at the thread, which is interesting, you may see the point they make about being a social activity. The idea is that you rarely write code isolated, and in any case, you use parts that others wrote, work together with teams to develop big systems, etc. And in regards to it not being engineering, the argument goes as follows: if it were an engineering discipline, software development could deliver estimates as solid as engineering does when designing and making a building. Those estimates tend to be solid and not far from reality (leaving aside problems with administrative permissions and all). The act of designing and constructing it is an established process, there are not many unknowns and the steps are common and based on some fundamentals that barely change between projects.
So, the argument goes, if making buildings is engineering, for software to be such discipline it should be equally predictable and stable process, with fundamentals shared between any kind of software projects. But as that is not the case, then software development could not be an engineering discipline.
There is this other argument in the thread, that you can see above, that states that software development is more craftmanship than anything and, for some reason, it means it cannot be engineering. I disagree with it being incompatible, but agree with the part that this is craftmanship. However, I don´t see how it is incompatible with being engineering too.
Trying to define engineering
Let´s try to define engineering and see if what they say are the main characteristics (replicable process, fundamentals shared between projects, predictability about completion…) are actually what defines engineering. I can give you a spoiler: this is where I disagree with the author of the tuit and why I consider software development is engineering.
My first problem is with the example used to define what engineer would look like: construction of buildings. The idea is that as making buildings is known, estimates are solid and all the process is known and predictable, engineering is defined by it and by that, software development could not be engineering. Well, engineering is not just buildings or roads or bridges. Those are well known problems as humanity has been learning how to build houses since the pre-civilization times, so that´s the first issue. The second one is about the reductionism that it entails. Building machines for science experiments is engineering, but it is not as easy or predictable as buildings. Let´s say the LHC of Geneva: there were delays, failures, change of designs… during its construction because engineers were in an endeavor that nobody tried before and had a lot of unknowns. But I am sure everyone would agree that it is engineering. Besides, it was highly social in its development (as in thousands of scientists and engineers working on it coordinated) and the estimates for completion were not really solid as in making a building.
So for the comparison being good, in my view, you would need to compare buildings with creating simple websites. It can be estimated properly, there are some common components that you can use easily, and there are little to no surprises when building it.
So, how do we define engineering then? There is an article shared in that thread trying to solidify the position that software dev is not engineering. Here. It is an interesting read, although I think it also reduces engineering to a small part related to buildings. This is an example:
So why do so many gardens fail, yet so many skyscrapers succeed? With a few exceptions, the technique for building a skyscraper is similar whether you are in Europe or you are in Singapore
I would ask the author, considering this quote:
Why so many rocket new designs fail, or why so many scientific machines (like the ones used to detect particles) fail or end up short of the original design compared to buildings?
Why there are so many delays and sometimes failures in the construction of new jet fighters fail? Or even airliners like Boeing 737 MAX? Are those projects not engineering?
Besides that, humans have been making buildings since early civilization. And nowadays it is a very mature discipline, where techniques and materials are widespread. So maybe he should compare it with building a static website, for example. And you still have architects that design novel ideas with new materials and techniques developed by engineers.
It is not about that, it is about the knowledge space. Making buildings is being developed during millennia and there are a ton of materials to use and that had been tested for years. And still there are projects that failed due to design errors and mistakes! And when you are designing something new, that nobody tried before, is that not engineering?
Another issue I have with that article is that it does NOT actually define engineering. So it ends in the same problem as the tuit: how can we discuss if SW is engineering or not, if we don’t have a common concept of engineering?
I think a good description for what is engineering, is the following:
Engineers are involved in the design, evaluation, development, testing, modification, inspection and maintaining of a wide range of products, structures and systems
In the case anyone argues it doesn’t define engineering, just state what an engineer does, I would suggest to change the words to say “Engineering is the process of design, evaluate…”. But still, it seems to me that is not enough, as it could be applied to a person making wooden furniture, manually, and that would not enter our vision of engineering.
So what is engineering? In my opinion, it is designing and building something, using tools that are based on math, science and reproducible methods. If I write a website following some design concepts and techniques, that means it can be replicated using the same concepts and techniques. And also important the fact that engineering is the discipline to design something that will get an input and produce an output. Deterministically.
But, at this point I have to be honest: there is no single definition of engineering that completely separates that from, let’s say, crafting toys, jewelry or even painting. Not because those are similar to engineering to me, but because you could always find someone who paints and goes through most of the steps of the definition: design, development, modification and inspection. So I can not pinpoint the specific difference between crafting and engineering. And my intuition tells me it may be a shade of gray and there is no sharp distinction between both activities. Think about the first houses in ancient villages. Irregular, without any standards and each house being completely different from other, because they were built by different people in different places. So maybe engineering starts as a craft, without many rules to follow and eventually evolves into a full fledged engineering discipline… like making buildings.
And what about programming
Considering the previous discussion about what is engineering, let’s look at programming as a discipline and check if it could be considered engineering.
In our case, computers, networks, interfaces, programs, OS… are systems and also could be seeing as products. There are some simple products like mobile apps, that once released need maintenance… even if a lot of them don’t have it. But it is a product that was designed, evaluated, developed, tested (hopefully) and maintained. It is true that this could be tricky, as making a wooden box may involve those steps, not many would consider the creator an engineer. In that case, that app may be more like a crafted product than engineered one.
And software developers do design, evaluate, develop, test, modify, inspect and maintain them. However there are so many projects, companies, people doing some form of programming, that there is a lot of craft-ish programming and, we have to say it, crappy programming. Think about all those apps that are short lived developed by one person, never maintain and totally inefficient and bad in their execution. And also think about all those new developers that enter the industry after some bootstrapping course. I am not saying that every bootcamp is bad, but there is a bubble in web development and mobile apps due to salaries and those “influencers” that tell lies about the life of a developer, so it is expected to find a lot of bad courses spitting badly taught developers for a lot of crappy companies doing small webs, apps and such.
So yes, programming is full of good, bad and regular programmers and most of them may be in the second and third categories. That would make the case for the argument saying programming is not engineering.
Programming IS engineering
… or it may end up there.
It is a very young discipline and it has been changing so fast that is difficult to establish rules, standard practices and fundamental techniques, because in a matter of 5 or 10 years everything changes too much. That is why I think it is not fair to compare it with architecture and buildings. It is a totally different situation with too many changes every now and then, something that doesn’t happen in building industry.
On top of that, nowadays there are probably more frontend or web developers than anything else, and in my opinion that is more related with graphic design than programming. So I can understand the point of the author of the tuit that started this post. However, as a discipline, I think it is an engineering discipline in its core. And maybe in the future we may see it established as such, without doubts.
What do you think? Are we engineers, is programming an engineering discipline? Leave it in the chat or in the comments.