They Write the Right Stuff (1996)
fastcompany.com
fastcompany.com
The article claims that it is their process, and although they are certainly extremely thorough, I don't buy it. At the very least, they cannot be compared to most developers apples to apples.
Why?
> NASA and the Lockheed Martin group agree in the most minute detail about everything the new code is supposed to do — and they commit that understanding to paper, with the kind of specificity and precision usually found in blueprints. Nothing in the specs is changed without agreement and understanding from both sides.
For most anyone working as a developer, could you even imagine what this would be like? Specs not changing or only changing in very small ways that are documented to the nth degree not only is impossible from a practical standpoint for most fields of software development, but such a different process that it's essentially a completely different field of work.
> Most people choose to spend their money at the wrong end of the process
> In the modern software environment, 80% of the cost of the software is spent after the software is written the first time
I would argue that this is largely the result of:
1. Incompetency as far as specifications go (suits don't know what they want, or what they are asking for)
2. Large changes in the specification (moving target)
In it you'll find that this level of requirements gathering, blueprint/spec writing and code inspection are actually cheaper in a relatively short time (months, not years).
Writing specifications that are extremely detailed ends up giving you all the logical failures ahead of time, and makes typing code more of a spell checking exercise. By having the logical failures before the code ever runs, you get to debug & fix them before any code runs. This ends up being faster & cheaper in total than waiting for users to find bugs.
However - I understand that for many companies they actually don't care if users find bugs as time to market is more expensive than the future bug finding. But if you have a product already in the market, and you expect to support it for ~year, you probably can do much more detailed design and avoid so much pain.
To wit, the fact that Keller - or whoever is in that role these days - has to certify that the code and the system it runs on will work as expected speaks volumes about how serious this is.
If it doesn't, things tend to blow up, which is sure to ruin your day.
Also, I would be remiss if I didn't mention Therac-25, a medical device which killed or severely injured several patients.
https://en.wikipedia.org/wiki/Therac-25
In these cases, arguing over every change to code seems like the only way they can guarantee with any certainty that it works correctly.
Namely, we're at a point where agile practices have become so common that nothing is ever 'done' and it is acceptable to ship something with errors, assuming it can and will be patched later.
Both Mom & Dad started out as COBOL programmers on punchcards, and I've heard plenty of 'war stories' about how these kinds of situations were far less common because an error meant your program simply didn't run.
Unlike say a web browser which will mostly spit back out whatever weird HTML and CSS you feed into it, errors and all.
In consumer software, it's not, 'we follow orders or people die' but for people working on this, it probably feels that way if your stuff is used by enough people (iOS) or is critically important (medical billing).
If it doesn't do what it says on the tin, people are incredibly unforgiving of even the smallest mistakes.
If my todo app has a bug or even goes down a full day, the impact is not severe. I guess it is okay to change specs within reason - if a project is managed well and communication between the parties involved is great, some amount of flexibility in specs can be accomodated in most non-life threatening projects.
http://elementsofprogramming.com
... and it was maybe the first time I understood that you very much can explicitly define the constraints, inputs, outputs, etc, of a program. For something like a NASA shuttle, it makes absolute sense that they would have an insanely granular definition of the domain / limits under which their code must operate.
Most of us deal in our day-to-day on top of a mountain of abstraction. But there are absolutely scenarios in which a formal, complete spec, is a life-or-death requirement.
Building complex software is a learning process, and you'll find that what was specified wasn't practical, you'll find better ways to do things, etc.
The key is to understand the risk/reward trade-off in their software stack. For the vast majority of software that is written, no one dies if it goes wrong. In fact, for the vast majority of software, it's a minor inconvenience when a bug bites. Because of this, time to market trumps correctness. It's a totally valid trade-off, but just not very satisfying from an engineering perspective.
The answer is, it’s the process. The group’s most important creation is not the perfect software they write — it’s the process they invented that writes the perfect software.
It’s the process that allows them to live normal lives, to set deadlines they actually meet, to stay on budget, to deliver software that does exactly what it promises. It’s the process that defines what these coders in the flat plains of southeast suburban Houston know that everyone else in the software world is still groping for. It’s the process that offers a template for any creative enterprise that’s looking for a method to produce consistent – and consistently improving — quality."
I think here it is part of the solution. The team culture should be strong as also, to achieve a good software.
I remember there were some comments: > Are you prepared to pay 10x for a text editor, say? My answer: Hell yeah, if I am earning thousands using this editor, why not pay couple hundred bucks for a really well-made program with good support, etc.
But as I understand, there exists no demand for this type of thing among general users. People are ready to pay for tons of useless features being added (just to signal that the project is progressing) but not ready to pay for simpler solutions that are really focused on quality, security and consistent performance.
Maybe we need a patreon style system for providing long term stable funding to important open source projects. I would sleep easier knowing that FOSS developers for packages i use will have stable income and be able to continue their work.
Single-comment threads:
2007 https://news.ycombinator.com/item?id=51098 (note how the title already says "old")
2009 https://news.ycombinator.com/item?id=498219
2012 https://news.ycombinator.com/item?id=3891669
2016 https://news.ycombinator.com/item?id=12014248
2018 https://news.ycombinator.com/item?id=17164407
Slightly larger:
2008 https://news.ycombinator.com/item?id=132640
2014 https://news.ycombinator.com/item?id=7121140
There's an understanding/level-of-detail hurdle that I've run into a lot: people have a desire to over-pseudocode and under-specify in usual design decisions. If you really want to get a good spec that will result in both good estimates and avoid surprises in terms of "whoops, this won't work actually" then you need to get really detailed here.
There's also a business one. Most businesses don't have quite as exact requirements as "fly to this point in space" or such. And often, the requirements iterate with user feedback. Or you try five things and see which users like the most. So the extra time delays really add up, when there's already a bunch of stuff going on behind the scenes than just the final feature that launches to the general public. If you're in this discovery phase, perfect is the enemy of "learning," and learning is what you need.
"The whole approach to developing software is intentionally designed not to rely on any particular person."
Our programming culture is not ready for this. Any programmer who identifies with their craft will never want to be another cog in the machine. A programmer could have chosen to be a doctor, lawyer, engineer, etc. but they choose to code because it is one of the way they can "express" themselves.
Not necessarily. I chose to code because I'm good at it and because I'm not good enough at anything else to do it as a job. Well, at least not in the same salary range.
I agree with your point otherwise but I'm not sure that people solely choose to become software developers because they wish to express themselves through their work. A lot of developers I know personally see coding as just a job. A job they like, but a job.
You can say the same for medicine, any other engineering field, farming, ditch digging, or any other job. Regardless of which you choose some love it and some it is just a job.
It gets back to the old saying: Cheap, Fast, Better. Pick two.
https://history.nasa.gov/sts1/pages/computer.html
I should really link to this article as well:
I am not sure where we are now, was OOP the dark middle age or the industrial revolution? Or will that AI be?
Would be really interested in your opinions!
- Unless you were a larger firm or project, version control was something you never even heard of
- A lot of the internet was still being put together
- Perl was a big deal and a LOT of it was bad e.g. "use strict" was almost never used so you could use variables willy nilly
- The Joel Test was yet to be written (5 years out roughly) and people were scoring low on the test then
- The only exposure to Linux was generally when you were in college unless you were hardcore. Otherwise, everything was windows. E.g. I remember installing Slackware from a CD that came with a giant book and then thinking: "What do I do now?"
- Java was the new hotness and Rutgers (my school) was the first major university to offer it for there 101 (actually RU CS first class was 111 b/c 101 was "business computing").
- There was no Google, Stack Overflow etc. You were lucky if people like Jeremy Zawodny happened to write a blog post about the weird Perl + MySql bug you were running into and/or if your local book store had Databases for Dummies
It really is amazing to me now to see how MASSIVE frameworks for JavaScript come out every year and the whole ecosystem spasms. Perl CGI was the de facto way to write web stuff for almost a decade. In fact LAMP used to mean "Linux Apache Mysql Perl" until php came along and even then giant website were still written in Perl e.g. Amazon, IMDB etc
This article suggests process should be the primary focus.
Books like Peopleware suggest that people matter most.
Having a journalist glorify some 10x gurus in a specific team and diss every other software developer in the world is not going to solve the problem at all.
It's a shame though - because the topic is a really important and interesting one, which deserves discussion. But not this type of dramatisation.
The most important sentence only comes at the end (and is the reason you can't trust the solutions proposed):
> And money is not the critical constraint: the groups $35 million per year budget is a trivial slice of the NASA pie, but on a dollars-per-line basis, it makes the group among the nation’s most expensive software organizations.
You work with the constraints you have. Eliminating the constraint doesn't solve the problem - it redefines it.