Software Engineering - Open Book
The content here is under the Attribution 4.0 International (CC BY 4.0) license
Join Our Community
Connect with developers, architects, and tech leads who share your passion for quality software development. Discuss TDD, architecture, software engineering, and more.
→ Join SlackThis page serves as a comprehensive, open-source reference guide for software engineering—bridging theory and practice across design, testing, development approaches, and operational excellence. Intended for developers, tech leads, and architects, this collection organizes research-backed principles, practical tutorials, and case studies across core areas of software engineering. Whether you’re improving code quality through testing strategies, designing systems with architectural patterns, implementing robust development practices, or building operational excellence, you’ll find evidence-based content grounded in academic literature and industry best practices.
How to cite: Marabesi, M. (2025). Software Engineering - Open Book. Retrieved from https://marabesi.com/software-engineering/
What is Software Engineering?
Software engineering as a discipline emerged in the 1960s and deals with the design, development, operation, and maintenance of software systems (Cameron, 2023). It is fundamentally concerned with the systematic approach to building reliable, maintainable, and scalable software. Beyond writing working code, modern software engineering encompasses architectural thinking, quality assurance, team practices, and operational stewardship. This open book explores software engineering from multiple perspectives—suitable for practitioners at any career stage seeking to deepen their expertise.
Navigation Guide for Your Role
Unsure where to start? Navigate by your role:
- Software Developer: Start with Part II: Testing & Quality Assurance, explore Part III: Design & Architecture, then investigate Part IV: Development Practices
- Tech Lead: Begin with Part IV: Development Practices, explore Part VI: Operational Excellence, and use Chapter 15: Team Metrics & Health to understand team dynamics
- Architect: Focus on Part III: Design & Architecture, Part V: Requirements & Specification, and how components in Part IV: Development Practices support scalability
Part I: Foundations
Part II: Testing & Quality Assurance
Build confidence in your code through systematic testing strategies, from fundamentals to advanced techniques for legacy systems.
Chapter 3: Getting Started with Testing
- Getting Started with Testing Guide — Foundational testing strategies and principles
Chapter 4: Advanced Testing Patterns
- Test Doubles: Mocks, Dummies, Spies, Fakes — Testing patterns explained with practical examples
Chapter 5: Testing Legacy Code
- Strategies to Test Legacy Code — Practical approaches for untested codebases
- Rethinking Legacy Code and Testing — Strategic perspectives on testing constraints
Part III: Design & Architecture
Learn how to structure systems for maintainability, scalability, and clarity using proven design principles and patterns.
Chapter 6: Design Principles
- SOLID Principles — The foundation of object-oriented design
- Software Design — Design thinking and principles
- Dependency Injection — Decoupling and testability
- Modeling — Effective system representation
Chapter 7: Design Patterns & Refactoring
- Refactoring — Improving code without changing behavior
Chapter 8: Domain-Driven Design
- Domain-Driven Design — Aligning code structure with business domains
Part IV: Development Practices & Workflows
Establish practices that enable team collaboration, reduce risk, and maintain code quality across your project lifecycle.
Chapter 9: Collaborative Development
- Pair Programming — Collaborative development techniques
- Trunk-Based Development — Modern branching strategy
Chapter 10: Continuous Integration & Deployment
- Continuous Integration vs. Continuous Deployment — Deployment strategies
- Feature Toggles — Safe feature rollout
Part V: Requirements & Specification
Clarify what you’re building and ensure alignment between stakeholders and technical implementation.
Chapter 12: Requirements Engineering
- Is Specification Important? — The case for clarity
- Requirements Engineering & Tool Use Cases — Practical approaches
Chapter 13: API Design
- GraphQL vs REST — API design trade-offs and considerations
Part VI: Operational Excellence
Ensure systems run reliably, improve from failures, and maintain healthy team dynamics and metrics.
Chapter 14: Learning from Failures
- Postmortems: A First Guide — Learning from incidents systematically
Chapter 15: Team Metrics & Health
- Metrics for Software Teams — What to measure and why
- How to Lose Your Developers — Anti-patterns and team health risks
Part VII: Learning & Reference
Deepen your expertise with curated reading paths and foundational concepts in computer science.
Chapter 16: Advanced Topics & Further Learning
- My Technical Reading Path for Software Engineering — A curated learning journey for continuous growth
- Algorithms — Foundational computer science concepts
References
- Cameron, L. (2023). Margaret Hamilton: first software engineer. In IEEE Computer Society. https://www.computer.org/publications/tech-news/events/what-to-know-about-the-scientist-who-invented-the-term-software-engineering