ποΈ Software Engineering
Building software that lasts. 50 topics, from beginner to advanced.
Software engineering is the discipline of building software that stays correct, understandable and changeable over years. The topics here cover requirements, design, architecture, testing, code review and maintenance. They focus on the habits that let teams ship features without breaking what already works.
Who this area is for
Developers moving from solo projects to teams, students who want to understand how real software is planned and maintained, and team leads who want shared practices.
Real-world use cases
- Splitting a large application into modules that teams can change independently.
- Writing automated tests that catch regressions before release.
- Running code reviews to share knowledge and catch defects early.
- Estimating how long a new feature will take before the team commits to a release date.
- Using a code review checklist so that every change is checked for security and tests.
Topics in Software Engineering
Beginner (17)
- Software Development Life Cycle β Phases from planning through deployment and maintenance.
- Requirements Gathering β Eliciting what stakeholders need a system to do.
- Waterfall Model β Sequential phase-by-phase development process.
- Agile Methodology β Iterative development embracing change and feedback.
- Scrum β Agile framework with sprints, roles and ceremonies.
- Kanban β Visual flow-based method limiting work in progress.
- User Stories β Short descriptions of features from a user's perspective.
- UML Diagrams β Standard notation for modeling software structure and behavior.
- Version Control Concepts β Tracking changes to code over time.
- Code Style and Readability β Conventions that keep code understandable.
- Code Reviews β Peer examination of changes before merging.
- Unit Testing β Verifying small isolated pieces of code.
- Integration Testing β Checking that components work together.
- Test-Driven Development β Writing failing tests before the code that satisfies them.
- Software Documentation β Written guides and references for users and developers.
- Bug Tracking β Recording and managing defects through resolution.
- Software Maintenance β Fixing, adapting and improving software after release.
Intermediate (17)
- SOLID Principles β Five guidelines for maintainable object-oriented design.
- DRY, KISS and YAGNI β Heuristics against duplication, complexity and speculation.
- Design Patterns β Reusable solutions to recurring design problems.
- Singleton Pattern β Ensuring a class has only one instance.
- Factory Pattern β Delegating object creation to a dedicated method.
- Observer Pattern β Notifying dependents automatically when state changes.
- Strategy Pattern β Swapping interchangeable algorithms at runtime.
- Decorator Pattern β Adding behavior by wrapping objects.
- Dependency Injection β Supplying a component's dependencies from outside.
- MVC Architecture β Separating model, view and controller responsibilities.
- Refactoring β Restructuring code without changing behavior.
- Technical Debt β Future cost incurred by expedient design shortcuts.
- Code Smells β Surface hints of deeper design problems.
- Layered Architecture β Organizing code into stacked responsibility tiers.
- Clean Architecture β Dependency rules keeping business logic independent of frameworks.
- Domain-Driven Design β Modeling software around the business domain's language.
- Microservices β Systems composed of small independently deployable services.
Advanced (16)
- Monolith vs Microservices β Trade-offs between single-deployable and service-based systems.
- Event-Driven Architecture β Components communicating through produced and consumed events.
- CQRS and Event Sourcing β Separating reads from writes and storing changes as events.
- API Design β Crafting clear stable interfaces between systems.
- REST β Architectural style using resources and standard HTTP verbs.
- GraphQL β Query language letting clients request exactly the data they need.
- Software Metrics β Measurements of size, complexity and quality.
- Cyclomatic Complexity β Count of independent paths through code.
- Performance Profiling β Measuring where programs spend time and memory.
- Formal Verification β Mathematically proving software meets its specification.
- Mutation Testing β Evaluating test strength by injecting faults.
- Property-Based Testing β Checking invariants against many generated inputs.
- Chaos Engineering β Deliberately injecting failure to test resilience.
- Site Reliability Engineering β Applying software practice to operations with error budgets.
- Software Estimation β Predicting effort and schedule for development work.
- Open Source Practices β Collaboration models around publicly shared code.
How to study Software Engineering
Pick a small project and apply one practice at a time: write a requirement, design it on paper, add tests, then review a teammateβs change. Reflect on which practice removed the most pain, and keep that habit for the next project.
Frequently asked questions
What is the difference between software engineering and programming?
Why does software design matter?
How much testing is enough?
Is software engineering only useful for large teams?
Which design pattern should I learn first?
Open the interactive Software Engineering area Take the Software Engineering quiz
Other areas
- π» Programming Fundamentals
- π§± Data Structures
- βοΈ Algorithms
- π Computer Architecture & Logic
- π₯οΈ Operating Systems
- π Computer Networks
- ποΈ Databases
- πΈοΈ Web Development
- π Security & Cryptography
- β Theory & Discrete Math
- 𧬠Languages & Compilers
- π€ AI & Machine Learning
- βοΈ Distributed Systems & Cloud
- π¨ Graphics, Vision & Media
- π Math for Computing
- π Concurrency & Parallelism
- π± Mobile, Embedded & IoT
- π οΈ DevOps & Tooling
- π Emerging & Frontier Topics