Why Computer Programmers Should Stop Calling Themselves Engineers
theatlantic.com
theatlantic.com
Programming is a vague term that seems to simply refer to the act of using a descriptive and functional language to describe a problem set intended to be solved by a computer. But then how is that different from any other area of applied mathematics?
This ongoing debate seems needlessly pedantic. Someone will write some new academic paper, or book, or tweet which future generations will point back to and say "that was where the term computer humptyfucker came from to describe my job." A bunch of neckbeards will then buck the trend and start writing op-ed pieces about how we aren't humptyfuckers because we don't apply the rigidity that traditional certified and legal humptyfuckery requires.
Related: the article "They Write the Right Stuff", about the software engineers who worked on the Space Shuttle [1].
In the United States, the National Council of Examiners for Engineering and Surveying (NCEES), which is the organization of engineering licensing boards in all states, recognizes Software Engineering as a discipline of Professional Engineering [2]. Our industry does not ordinarily require certification as a professional engineer, and it is not normally required by law; however, if you look at the topics that the certification exam covers [3] -- intended for people with 4 years minimum industry experience -- they are all ones that I'd expect senior software engineers to have down pat.
[1] https://www.fastcompany.com/28121/they-write-right-stuff
[2] https://ncees.org/engineering/pe/software/
[3] https://ncees.org/wp-content/uploads/2015/07/SWE-Apr-2013.pd...
"BY SETTING FOOT ON THE BRIDGE YOU ACKNOWLEDGE AND AGREE THAT THE BRIDGE IS PROVIDED ON AN 'AS IS' BASIS AND THAT YOUR USE AND RELIANCE ON THE BRIDGE THEREBY IS AT YOUR SOLE RISK AND DISCRETION. COMPANY AND ITS AFFILIATES, PARTNERS AND SUPPLIERS HEREBY DISCLAIM ANY AND ALL REPRESENTATIONS, WARRANTIES AND GUARANTIES REGARDING THE BRIDGE WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. FURTHERMORE, COMPANY AND ITS AFFILIATES, PARTNERS AND SUPPLIERS MAKE NO WARRANTY THAT (I) THE BRIDGE WILL MEET YOUR REQUIREMENTS; (II) THE BRIDGE WILL BE STRUCTURALLY SOUND, RELIABLE, SECURE AND ERROR-FREE; (III) THE QUALITY OF THE BRIDGE WILL BE AS REPRESENTED OR MEET YOUR EXPECTATIONS; OR (IV) ANY FAULTS IN THE BRIDGE WILL BE CORRECTED."
This title sometimes accompanies pretension toward traditional engineering, which is fine as far as it goes - usually not very far. I realize that there are some efforts in some jurisdictions to get something like engineering credentials for programmers. Ok, maybe that's not misguided, but I've yet to be convinced. It depends on how you conceptualize software. I don't think of it like engineering, I think of it like math. But more than that, I think of it as computer programming! If you think of it like engineering, I don't have a huge argument with that, but I have a hard time seeing is as more than an ill-fitting metaphor. I think that is one step better than the manufacturing metaphor.
Ironic, considering that college engineering courses are about 95% math.
I'm also fine with 'software developer' especially as we've largely moved away from programming computers, and at best most of us are programming abstract machines that bear decreasing resemblance to computers.
Consider a fuel injection system from the 1960's. It was a mechanical computer. Was that not engineering? It was certainly designed by a team of engineers.
These days, it's software that does the same thing. Why is that not engineering?
In order to discuss categories at all, you have to place some limit on how far to stretch the equivalence of different things. Sure, a physical thing is transformable to a logical thing, but doesn't that affect our categories? We're pretty bad at finding or agreeing on the lines between the categories we create, so I don't worry about that much.
I didn't say that programming is never anything like engineering. I apply engineering-inspired approaches to my work all the time. But here's another perhaps eccentric opinion: when I'm thinking like an engineer, it's usually to compensate for the code being too complicated to read. I consider that a pragmatic response to a worrying failure, not something to aspire to more of.
You betcha. Think of how Woz designed a floppy disk controller that used fewer parts than other designs. That's engineering the logic.
A big part of software engineering is to engineer the logic to get the correct result as fast as possible.
Engineering is all about working within a set of constraints. Things that are easier and/or cheaper to manufacture, have clearly been engineered that way.
It can't be a coincidence that we consider CPU time and memory footprint "costs".
I definitely see where you are coming from re: 'engineering' logic. As I said before, I don't have a huge argument against this. However, for me this is where the metaphor blurs into near-meaninglessness for me. Optimization happens to be a specialization of mine, and I can't find a reason to think of it as engineering, except for the fact that I take measurements. The optimization itself is more like applied information theory. I can agree that the measurement + iteration is perhaps engineering.
I'm married to an Architect, it bugs them too.
In most states - Legally they can't call themselves Architects until they've passed the AREs. You can't take the AREs until you have enough IDP hours (which takes about 3 years). You can't start IDP unless you have a Masters (or more recently a "professional bachelors"). Oh, and you have to take a new test for every state / country you want to practice Architecture in (Reciprocity is getting better but not quickly)
So it's that sense that they have to scratch and claw to get the title where we can just sort of make it up that bugs them.
I think we should switch to a different title scheme. I'm going to be a Doctor of Site Reliability (you know since I'm already doing operations....)
I do however wish that people were better able to make the distinction between titling oneself 'software architect' and claiming to be a sub-type of architect. Perhaps it's too subtle. What I mean is, 'software engineer' and 'software architect' are singular roles, peculiar to this industry, that happen to be made of two words.
See my other comment for details: https://news.ycombinator.com/item?id=16835964
The reason bridges don't (usually) fall down is because most of them are copies of other successful designs, and because they are way overbuilt.
I seem to recall a bridge collapsed just a couple months ago squashing cars and killing people. It was a new design.
Case in point - the plant disaster happened because the tsunami was higher than what the sea walls had been designed for. From what I have learned, Japan has plenty of evidence that magnitude-9 earthquakes and the following tsunamis have happened in the past. The protections in Fukushima (and Daichii) were designed against less.
To fail under expected peak load is bad engineering. To ignore evidence and go with insufficient safety margins is something worse.
Engineers iterate their designs based on past failures just like software engineers do. It's just that the life cycle is so much shorter for software, the iterations come thick and fast.
There are engineering companies of all sorts that are only trying to make a (zillion) bucks and not interested in "an explicit responsibility to public safety and reliability". This isn't unique to software.
Plug for Code for America[1], if you're interested in civic tech and want to contribute reach out. We're hiring, and there's almost guaranteed to be a local brigade working on cool stuff near you.
[0] https://www.getcalfresh.org [1] https://www.codeforamerica.org
There's no doubt that, at a certain level of quality assurance, what software developers do is truly engineering.
"I like SOLID." "No, I don't like SOLID." "I think exceptions should only be thrown in truly exceptional circumstances." "No, I think you should throw at the faintest whiff of the unexpected." "I like short methods." "No, I like long methods. You can see the whole flow."
And so on. And the resulting standard for the team might as well be chosen by coin flips.
But after that the article goes off the rails trying to draw a distinction. Programming above a certain level is engineering, just like being a mechanic above a certain level is engineering.
Unregulated, unlicensed software engineering has also produced stupendous advances in programming in the last few decades, not remotely matched by advances in other heavily regulated and licensed professions.
Sounds pretty dang engineery to me.
NPR has some fantastic reporting on licensing in the beauty industry and how it not only entrenches existing players but turned out to be really harmful to African American communities: https://www.npr.org/sections/money/2012/06/22/155596305/epis...
And therein lies the confusion. There is no level at which a mechanic becomes an engineer. You can be both a mechanic and an engineer, but these are separate tracks with separate skills and training. A skilled mechanical engineer can be an inept mechanic, and vice versa. The fact that you don't understand traditional engineering shows why you consider programmers to be "engineers."
The first rate engineers I've known were competent mechanics as well. A traditional engineering course of study involves lots of time in the shop.
A mechanic becomes an engineer when he goes beyond merely implementing "book" solutions - when he starts understanding the "book" solutions, why they work, and where they come from.
They've demonstrated years of diligence in earning that steel ring.
I think this is really funny, because I worked with actual engineers on multiple projects. The 'real programmers', or however you want to call them, had to clean up their mess and introduce proper standards and processes. I also worked with some good engineers, so I'm not claiming they are all that bad. But stuff that I saw from real engineers:
- Express distance in some unknown number (we called it 'werners' because that guy was called Werner). We introduced mm.
- Instead of copy pasting parts of previous projects (going on for about 20 projects), we made a reusable library.
- Disabled/circumvented safety system on a robot. We were all amazed.
- Release things untested to end users. We tried to convince them to hire a tester, didn't work. So we tested our own stuff a bit better, but never officially got time for that.
So please leave the snarky comments that 'real engineers' are somehow better than us mortal coders. Any decent coder who worked with real engineers can tell you that the difference is not really there.
It's not the people or processes or whatever. Writing software cannot really be compared to anything else.
Engineers often don't own priorities. So as long as the people who set company priorities don't care, nobody will either. Moral yelling won't disrupt a business model, and if neither consumers nor legislators punish companies for spilling externalities around, then what do companies care?
If the activity continues to be profitable...
But Language is fluid and changes with time, so at this time "Software Engineer" is the term so it's no good fighting it.
But language being fluid, fighting it seems perfectly reasonable.
Engineering as a profession has licensure- as does a doctor or nurse. There are potential legal consequences for calling oneself an engineer when one is not.
There should be some effort to fight ambiguity masquerading as fluidity. They are not the same thing. This ambiguity literally got a child decapitated recently.
It's a classification, so I don't think that's so. "Driver" is an equivalent term.
https://www.nspe.org/resources/licensure/resources/faq
https://en.wikipedia.org/wiki/Regulation_and_licensure_in_en...
>Since regulation of the practice of engineering is performed by the individual states in the United States, areas of engineering involved in interstate commerce are essentially unregulated. These areas include much of mechanical, aerospace, and chemical engineering—and may be specifically exempted from regulation under an "industrial exemption." An industrial exemption covers engineers who design products such as automobiles that are sold (or have the potential to be sold) outside the state where they are produced, as well as the equipment used to produce the product.
According to the other:
>Engineering licensure constitutes an integral part of the program of professional development of many companies; so much so, in fact, that many progressive companies have specific policies encouraging licensure and providing concrete assistance to engineers taking their first steps toward licensure
This implies that they are engineers even before licensure.
What stands out, that these papers and articles are pretty old. It seems to me that these are pretty academic examples. I don't understand why we can't see a lot of software in the wild, following the state of the art practices of building secure software. Maybe these practices are still relatively impracticable to the average programmer.
Maybe research on secure software development should check their ideas more for psychological acceptability (Saltzer/Schröder).
https://lobste.rs/newest/nickpsecurity
Far as old, it's important to remember that many things we're doing today started in some form a long time ago. Certain principles are timeless. For instance, the Burroughs B5000 was checking for overflows and argument matching on every operation at the CPU level back in 1961. That thing was immune to common, coding attacks until maybe when ROP was invented. The newer thing was C language designed for efficiency on weaker hardware. People still argue today if we can defeat the vulnerabilities in our legacy systems without realizing some in 60's-80's were immune to them. Occasionally, a current team will learn from or reinvent that older research to find it's still useful like crash-safe.org and Cambridge's CHERI did for secure CPU's w/ CHERI running FreeBSD. So, don't judge by age: look at what was done, why it worked, why it would/wouldn't today, if changes in context matter, and esp how practical it might be.
Far as that, Cleanroom worked even on first try on real projects for commercial teams and students. I just got the book recently where I'll be trying it sometime in near future. It looks pretty good so far with it just being careful structuring and thinking about things in algebraic way. Why did it disappear? Likely bandwagon effect where some New Great Method got popular like it did, displaced it as project managers wanted to look like they were doing something new, and now it's a relic of history. Lots of stuff like that. Happens more if there's big companies with enterprise tooling backing the newcomers like the 4GL's, UML, etc. Even more when tool promises to remove human from equation as much as possible vs Cleanroom that built on human talent (i.e. time).
Now, SPARK is entirely different. I got that book, too. :) It was always marketed at a niche group of people building stuff that should never fail. They have to be willing to spend a lot of time using specialist techniques to make that happen. They also must do it in non-mainstream language with proprietary tooling. Needless to say, adoption was small. However, AdaCore's site shows quite a few companies are using it in safety-critical work. I also have some case studies in my Lobsters submissions involving SPARK with keywords being "SPARK," "glider," and "cubesat" if you want to try to just Google them. Altran Praxis, who originally developed it, has been using it in government and commercial projects for one or two decades. The book supposedly makes it easier. I figure a combo of spec-based tests, automated solving, and runtime checks for what's left is still gonna be easiest approach.
Aside from those two, another nice example is Design-by-Contract which is quite accessible to average developer. It just says what the component expects to receive, maintain, and deliver. That can be turned into tests, runtime checks, or verification conditions for a prover. One can also combine the runtime checks with fuzzing like AFL to make it zero in on the specific error. Eiffel Method brought that to significant adoption in industry even though small in larger scheme of things. We have seen increased adoption of some of those principles with more contract implementations in mainstream languages and property-based testing getting popular. Anyway, here's a nice description of that I saved as much for managers as developers:
https://www.win.tue.nl/~wstomv/edu/2ip30/references/design-b...
"Maybe research on secure software development should check their ideas more for psychological acceptability (Saltzer/Schröder)."
Oh, I've learned so much about this angle. I couldn't begin to tell you. Mostly pessimistic but there's some hope. We've been solving the wrong problems. Most of the security problem comes from political maneuverings through lobbyists, market preferences which rarely value security, and business incentives that are similar. There's strategies for each which have potential. My best hypothesis for now is to keep pushing methods that are productive with the tech designed for verification [later] with lightweight methods used up front. You sell the approach as much as possible on non-security benefits with a certain amount of money funneled into improving security of the project or its dependencies. Rinse repeat. Also, better to invest in projects that improve security on things with same language, API, ISA, etc as things with huge, bandwagon effects. Gotta go with the flow.
No shit it touches a nerve. It's cliché both in sentiment and presentation. No laboratory could design a sentence more tailor-made to light up an American-left cultural-critic writer's brain.
It's almost a work of art that in so few words the speaker postured themselves, namecheked this week's scapegoat and even snuck in a bit of a humble-brag.
For problem domains whose solutions are manifest in well-known artifacts, such as bridges and buildings, these standards have been established over several centuries. Still, failures persist which cause refinement in said standards, though at a low enough frequency where the failures now are seen as aberrant conditions.
Where software practitioners study the techniques and/or practices reified by accomplished predecessors, assimilate lessons learned from the practitioner's own efforts/failures, and refine a documented repeatable approach that incorporates the aforementioned, there is little cause to refute the title of "software engineer."
Anyway, by analogy to fintech and adtech, programmers should probably honestly style themselves as software technicians, unless they get themselves qualified as a real engineer.
You want hear a worse thing? Data Scientists thinking that are Mathematicians.
All these titles are a joke. JavaScript Programmer is an insult, it should be only Browser API User.
But it is noticeable that when a commercial lift/elevator or Espresso machine develops a fault, people quite casually say that "an engineer is on the way" and nobody bats an eyelid. Don't most software bugs require a much deeper diagnosis and more elaborate fix?
Are the people working on autonomous driving, vehicle safety, infrastructure management any less important than the guy who designed the plastic housing with the title mechanical engineer?
As software becomes ever more a matter of life and death I think we’ll see software engineer used maybe more specifically. Maybe some or many programmers and developers should stop calling themselves engineers?