Disciplined Software Development
Ivan Erceg
Software builder & steward, team player, founder/co-founder/principal, early investor.
At the end of 2016 one of my ex-managers approached me to see if I wanted to do a series of lectures for one of the courses on software development that he was designing at the time. The purpose, if I recall correctly, was to enable engineers from other professions to transition to working software developers in 6 months. At the end nothing came out of it but I just stumbled on the list of lecture themes that I wrote at the time so here it is - with warts and all (it clearly becomes rather sparse at the end). I would add more themes now: communicating design intent, operations operations operations, usefulness of frameworks, value adding code, testing useful vs surface features, efficiency of software process, tool building, veil of ignorance in decision making, graceful degradation, interfaces and contracts between teams, no -> minimal -> isolation of side-effects, etc.
Discipline of a Software Developer
- Introduction - What is software? Why develop it beside the obvious (money)? Software is eating the world. Last 5, 10, 20 years. Next 5, 10, 20 years.
- Software development workflow (programming, modularization, separation of concerns, package management, debugging, REPL, logging, testing, automation, virtualization). Stack Overflow (usefulness, copy/paste failure mode, English proficiency).
- Art of reading and writing code. Reading vs writing ratios. Clever ain’t wise. Commenting. Negative code. Trade offs in long vs short term (or no) maintenance. Technical debit. Worse is Better. TDD yes/no, Coverage yes/no, graph of growing maintenance cost in duration of the project, graph of growing need for building-in good maintenance in duration of the project.
- Raising abstractions. Scaling problem solving. Case against code generation. Case for code generation. Domain Specific Languages.
- Rise of open source in enterprise. Leveraging open source. Licenses and legal issues.
- Cloud vs on premises. Components of modern cloud architecture. Virtualization in deployment. Deployment.
- Data. SQL vs NoSQL. Versioning, updating, upgrading data. Blockchain. Immutable data. Data oriented designs.
- Team work. Team building. Version control. Culture. Code reviews as culture dispersion vector. Automating builds.
- Communication. Communicating technical debt and the tradeoffs to people that pay us. Distributed teams. Remote work (pros and cons, how to get it).
- Analytics. Releasing. Supporting. Long term maintenance. Versioning in the “wild”.
- Software is not a product. Everything else that goes into software product (UX, UI, graphics elements, help writing, market fit, etc). What is our responsibility? What is not our responsibility? End of software's life. Killing off your darlings.
- Social responsibility or lack of it. Obsoleting our profession. Personal transcendence for those that want it. Conclusion.
- Keyboard. Shortcuts. Use of terminal window. Optimizing work habits to achieve higher velocity.
- Golden rule: new technology + old product or vice versa.
- RAII and leaving everything tidy. Cooking and programming. Leave everything clean.
- Never ever say “that can’t happen” with outside data. Everything that’s not internal to your module is external (including file system, db, etc)
- Rules of thumb
- DRY
- Refactoring
- Discard what is not used. Create tools for searching in past commits or carry a file with discarded flotsam. "scrap that had been superseded but not disposed of." - Children of Time novel
- Setting up for success, being setup for success.
- 1:1 and taking off the chevrons for giving and receiving feedback.
- Cognitive biases in software development. Cheat sheet.
- Develop your own criteria and rule of thumb.