This series will provide summaries and insights on the Google Way of Software Engineering.
Time and Change#
Between one-time projects and decade-long endeavors, a shift occurs: a project must start responding to constantly changing external factors.
For any project without an upgrade plan from the beginning, this shift can be very painful, with three reasons making it more complex:
- You are executing tasks that are not yet completed in this project; more hidden assumptions have been established.
- Engineers attempting the upgrade are unlikely to have experience with such tasks.
- The scale of the upgrade is usually larger than usual, completing several years' worth of upgrades at once instead of incremental upgrades.
We need a clearer understanding of the difference between "works by coincidence" and "maintainable."
Hallem's Law - If there are enough users, your contractual commitments don't matter: your system's observable behavior will be relied upon.#
Cleverness vs. Robustness: Depending on the categorization of programming styles, code that relies on fragile or unreleased content falls into the former, while following best practices and planning for the future falls into the latter.
If the cost of a task is deemed too high and should be avoided in the future, we may still be using a compiler version from ten years ago. Missing out on optimization opportunities can result in a 25% increase in computational resources.
Stagnation is a choice, but often not a wise one.
Left Shift#
Shifting security issues to the left can reduce costs when problems are discovered early in the development process.
Investment in Decision Making - Distributed Architecture#
As the codebase grows larger, compilation times also increase. Investing more resources in local machines for compilation may not be a good investment, as high-performance desktop development machines often remain idle.
Developing a distributed build system and deploying it in production speeds up the build process for everyone. However, over time, the distributed build system itself becomes bloated.
The cost savings achieved by implementing a distributed build system may outweigh the negative costs of "building and maintaining." But as these costs increase, we cannot foresee all of them.
Software Engineering vs. Programming#
Programming is the direct act of generating code, while software engineering is a set of strategies, implementation methods, and tools.