Writing a program that works is one thing. Building software that a team can grow, test and maintain for a decade without it collapsing under its own weight is another — and that is software engineering. It is the discipline of turning vague human wishes into working systems: gathering requirements, designing for change, testing relentlessly, and shipping safely and often.
This branch covers the software lifecycle, requirements and UML, the design principles (SOLID) and patterns that keep code flexible, software architecture, continuous integration and delivery, agile working, and the constant battle against technical debt.