I'm a member of the IEEE, and I like to read the monthly Edge magazine which is put out by the IEEE Computer Society. This month, the feature article was "The History of Software Engineering" by Grady Booch.
Grady walks us through a brief overview of the history of computing. Grady's account spans from the late 19th century's human computers, through the first digital computers in the 1940s, a review of who's-who in software engineering, and ending with a wise note on the fundamentals that govern our field.
If you are a member of the IEEE, definitely read this article. If you're not a member, never fear: the article was adapted from an ACM lecture that is publicly available.
I enjoyed learning about the early beginnings in human computation efforts, and there are excellent quotes to reflect on. But my favorite aspect of this article is the name dropping. I am always interested in reading the foundational texts. I want to understand the foundational thoughts that shaped our present situation. I hope you'll select a few people whose names are unfamiliar and study them. I scrawled out my own (long!) list of foundational names and works to research:
- George Boole's The Laws of Thought
- Handbook of Mathematical Functions
- Punched Card Methods in Scientific Computing
- First Draft of a Report on EDVAC
- Allen Newell - "Fairytales" - describes the enchanted world that computing made possible
- Larry Constantine, who introduced the concept of modular programming, and the ideas of coupling & cohesion applied as a mechanism for algorithmic decomposition
- Winston Royce - brought the idea of a formal software development process; spoke of iterative development, the importance of prototyping, the value of artiacts beyond source code itself
- Peter Chen - entity-relationship modeling
- Michael Fagan - software inspections
- John Backus - functional programming
- Vic Basili - empirical software engineering
- Donald Knuth's idea of literate programming
- Watts Humpry - capability maturity model, software quality
- Hirotaka Takeuchi and Ikujiro Nonaka - original creators of Scrum, as applied to product development
- Software Engineering Body of Knowledge
- Systems Engineering Body of Knowlege)
A question that we will need to answer in the coming years:
How do we best architect systems with parts whose operation we cannot explain or fully trust?
Grady hits the nail on the head. This situation is why blanket advice is never all that helpful.
Some software is like building a doghouse: you just do it, without any blueprints, and if you fail, you can always get another dog. Other software is like building a house or a high-rise: the economics are different, the scale is different, and the cost of failure is higher.
Much of modern software engineering is like a city: there is room for radical innovation, but you are constrained by the past as well as the cultural, social, ethical, and moral context of everyone else in the city.
We must focus on mastering the bolded skills:
One thing I do know. No matter the medium or the technology or the domain, the fundamentals of sound software engineering will always apply: craft sound abstractions; maintain a clear separation of concerns; strive for a balanced distribution of responsibilities; seek simplicity. The pendulum will continue to swing - symbolic to connectionist to quantum models of computation; intentional architecture or emergent architecture; edge or cloud computing - but the fundamentals will stand.
Grady ends with pure magic:
Software is the invisible writing that whispers the stories of possibility into our hardware.