Keep Moving Forward

On December 9, 2020, SpaceX conducted a high altitude flight test of the Starship rocket dubbed SN8.

The rocket launched successfully and rose to a height of 15km. As it rose, it’s three Raptor engines stopped firing one by one to better control the height and speed of ascent.

The rocket then proceeded to turn and fall in a controlled manuever dubbed the "belly flop". It is designed to fall sideways towards a landing area, controlling it’s descent using flaps on the nose and tail.

As the rocket approached the ground, it turned a second time so the rockets were once again facing the ground, and re-ignited them. The thrust from the reignited engines is designed to allow the rocket to land tail first, just like the old Lunar Lander game.

However, due a malfunction in the system providing the fuel for landing, the thrust was insufficient, and SN8 experience a rapid unexpected disassembly. (In other words, it blew up.)

Less than two months later, on February 2, 2021, SpaceX brought up Starship SN9 for a similar launch test. This time, the vehicle flew only to 10km, then turned for the belly flop and eventual landing. Using the lessons learned from the fueling malfunction, it was hoped the SN9 test flight would be successful.

While the belly flop was a success, SN9 experienced a similar rapid unexpected disassembly upon landing.

No Such Thing As Failure

Note that neither of these launches were called "failures". Neither I nor SpaceX use that term here. In fact, both were successes. SN8 discovered a flaw in the fueling system which was corrected for the SN9 test. The investigation into SN9 will certainly uncover some other issue which will be corrected for later test flights. (SN10 — we’re looking at you.)

It’s easy to look at the plethora of satellites orbiting our globe, the ISS flying overhead, and regular rocket launches, and think of those as successful and these recent events as failures. That, however, would be wrong on several counts.

The ISS owes it’s existence to SkyLab (which succumbed to orbital decay in 1979) and Mir (which was intentionally deorbitted in 2001). Both owe their existence and life to the Space Shuttle and Soyuz programs, which had some famous accidents and casualties. They in turn owe their existences to programs like Apollo and Voskhod programs, both of which had setbacks.

Each accident gives us a chance to learn. The losses of human lives in some of these events are tragedies worth remembering, honoring, and commemorating. However, that does not mean that progress should halt. We honor those who have given their lives by making sure their sacrifice was not in vain, but done to preserve and advance the lives of those who come after. And if we didn’t stop moving ahead in the face of death, why would we stop for anything less?

But I’m not a rocket scientist, you say. What does this have to do with me? Or this blog?

Practical Application

As you write code and learn new things, you will make mistakes. A loop counter will be off by one, or you’ll forget to initialize a variable, or misspell a word on a web page.

Are you going to quit over these errors? I hope not. I hope you’ll learn and figure out how to prevent the problem next time.

But what if you overflow a signed integer value on a new rocket guidance system? Are you going to quit then? Again, I hope not.

Because if you do, then you learned nothing. You did not react to the mistake, but to the immediate consequences, which are often dramatic and possibly tragic and always insufficient. The long term consequences of the Ariane 5 accident led to safer rocket launches and better designs decisions for everyone. The long term consequences of the Space Shuttle and Apollo and SkyLab and Mir and Soyuz accidents led to better and safer vehicles for everyone.

Opportunities to Learn

The truth is you can never know what the full consequences eventually will be:

  • What if your misspelled web site caused a screen reader to say the wrong thing, and a sight-impaired person using that screen reader was unable to get to the assistance they needed to live their life on their terms?
  • What if your uninitialized variable set someone’s bank balance to a negative number, causing the bank to think they were overdrafted, and payments to utilities and creditors were returned?
  • What if your loop was in a system controlling traffic lights, and they were out of sync, so there was a small time window where traffic from two directions was allowable, and an accident occured?
  • What if your integer overflow was in the kernel of an operating system or device driver, allowing a hacker to add every affected machine to a botnet used to attack other websites?

Maybe none of these things will happen. The consequences are not something you can foretell or foresee. Yes, you have to deal with them when and if they occur, and we should never be flip when human lives are at stake. But every mistake you make is an opportunity to learn.

Don’t run away from them.