I recently stumbled upon an essay that I've read many times in the past. I didn't have it bookmarked on this newer laptop, so after doing so I also decided to share with you. It was published originally back in 1992 in the magazine C++ Journal. The author, Jack Reeves, puts forth an assumption that is believed to be true and then discusses the impact of that assumption on the way we look at software development and design. His assumption: The source code of the software is the actual design; just like traditional engineers produce design documents, the artifact of designing software is the source code. Traditional engineers then give their design documents to construction/manufacturing who then create a product. The analog to that in software would be handing the source code over to the compilers, linkers, and build system to produce a product.
The consequences he discusses as a result of this assumption really help to illuminate why there are pain points in the software development process in organizations that practice the traditional waterfall process to software engineering.
Here is the link to the article: