Professionals deal with failure.

No, not their own necessarily, but what happens when something goes wrong.

Building software is about handling the edge cases. When someone learns to write software, the easy part is usually the core functionality. The hard part is stability, edge cases, exception handling, error messages, etc.

A mechanically-inclined high school student could probably weld together a frame, strap on an engine of some sort and build a vehicle. Of course, that design likely would have no safety features built in. No containment for a failing engine. Not much in the crash testing realm. It would likely be lacking in any sort of self-diagnostic capability.

Both of these examples are the work of amateurs. The core function is often the easy part, but that’s not the work of professionals. The work of professionals is where the normal things breakdown. Where the difficult decisions lie. Where the tradeoffs are, and how to handle things that don’t go the way they should.