Facebook Pixel
Searching...
English
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Modern Software Engineering

Modern Software Engineering

Doing What Works to Build Better Software Faster
by David Farley 2021 256 pages
4.19
500+ ratings
Listen

Key Takeaways

1. Software engineering is about applying scientific principles to create efficient, economic solutions

Software engineering is the application of an empirical, scientific approach to finding efficient, economic solutions to practical problems in software.

Scientific approach to software. Software engineering goes beyond coding; it's about applying scientific principles to solve practical problems efficiently. This approach involves formulating hypotheses, conducting experiments, and making data-driven decisions. Engineers must balance technical excellence with economic constraints, always striving for the most efficient solution.

Practical problem-solving. Unlike computer science, which focuses on theoretical aspects, software engineering is grounded in real-world applications. It requires:

  • Understanding user needs and business requirements
  • Designing scalable and maintainable systems
  • Implementing solutions with optimal performance
  • Continuously evaluating and improving the software

2. Optimize for learning through iteration, feedback, and empiricism

Feedback is essential to our ability to learn. Without fast, effective feedback, we are guessing.

Iterative development. Embracing an iterative approach allows teams to learn and adapt quickly. This involves:

  • Breaking work into small, manageable increments
  • Regularly reviewing and adjusting based on new information
  • Continuously improving the product and process

Feedback loops. Establishing effective feedback mechanisms is crucial for learning and improvement. Key aspects include:

  • Automated testing to catch issues early
  • Continuous integration and deployment for rapid validation
  • Regular user feedback and usage analytics
  • Team retrospectives for process improvement

Empirical decision-making. Basing decisions on observable evidence rather than assumptions or guesswork leads to better outcomes. This involves:

  • Measuring key metrics to guide decisions
  • Conducting experiments to validate hypotheses
  • Using data to inform design and architectural choices

3. Manage complexity through modularity, cohesion, and separation of concerns

Pull the things that are unrelated further apart, and put the things that are related closer together.

Modularity. Breaking systems into smaller, manageable components is essential for managing complexity. Benefits include:

  • Easier understanding and maintenance of individual parts
  • Improved testability and reusability
  • Flexibility to evolve different parts of the system independently

Cohesion and separation of concerns. Grouping related functionality together while keeping unrelated elements separate enhances system design. This principle applies at various levels:

  • Function and class design
  • Module and service architecture
  • Team organization and responsibilities

Information hiding. Encapsulating implementation details behind well-defined interfaces reduces coupling and allows for easier changes. This involves:

  • Defining clear contracts between components
  • Hiding internal complexity from external consumers
  • Enabling independent evolution of different parts of the system

4. Embrace change and continuous improvement in software development

As soon as one freezes a design, it becomes obsolete.

Adaptability. Software development is an ongoing process of learning and discovery. Successful teams:

  • Expect and plan for change rather than trying to avoid it
  • Design systems that are flexible and easy to modify
  • Continuously refactor and improve existing code

Incremental design. Instead of trying to create perfect designs upfront, focus on evolving the design incrementally:

  • Start with a minimal viable solution
  • Regularly reassess and adjust the design based on new information
  • Use techniques like refactoring to improve design quality over time

Continuous delivery. Adopting practices that enable frequent, reliable software releases:

  • Automate build, test, and deployment processes
  • Implement feature toggles for controlled rollouts
  • Gather and act on user feedback quickly

5. Prioritize testability and automation to enhance quality and productivity

If you can't, or won't, change the code, then the code is effectively dead.

Design for testability. Creating software that is easy to test leads to higher quality and more maintainable systems:

  • Use dependency injection to create loosely coupled components
  • Design clear interfaces between modules
  • Create small, focused units of code that are easy to test in isolation

Automated testing. Implementing comprehensive automated tests provides numerous benefits:

  • Catches bugs early in the development process
  • Enables confident refactoring and changes
  • Serves as living documentation of system behavior
  • Improves overall software quality and reliability

Continuous integration. Regularly integrating and testing code changes helps:

  • Identify integration issues early
  • Ensure the system is always in a working state
  • Provide rapid feedback to developers

6. Decouple systems and teams to enable scalability and flexibility

If your team and my team can make progress without needing to coordinate our activities, the "State of DevOps" reports say that we are more likely to be supplying high-quality code more regularly.

Microservices architecture. Adopting a microservices approach can improve scalability and team autonomy:

  • Break systems into small, independently deployable services
  • Allow teams to own and evolve services independently
  • Enable different technologies and approaches for different services

Team autonomy. Organizing teams around business capabilities rather than technical layers:

  • Reduces coordination overhead
  • Improves decision-making speed
  • Increases team ownership and accountability

API-driven development. Defining clear interfaces between systems and teams:

  • Reduces coupling between different parts of the system
  • Enables independent evolution of services
  • Facilitates easier integration and testing

7. Balance abstraction and pragmatism in software design

All models are wrong, some models are useful.

Appropriate abstraction. Finding the right level of abstraction is crucial for managing complexity:

  • Abstract away accidental complexity while preserving essential complexity
  • Create domain-specific abstractions that align with business concepts
  • Avoid over-engineering and premature abstraction

Pragmatic design. Balance idealism with practicality in software design:

  • Focus on solving real problems rather than hypothetical scenarios
  • Be willing to make trade-offs based on current constraints
  • Continuously reassess and evolve abstractions as needs change

Domain-driven design. Aligning software design with the business domain:

  • Create a ubiquitous language shared by developers and domain experts
  • Model software components after real-world concepts and processes
  • Use bounded contexts to manage complexity in large systems

Last updated:

Review Summary

4.19 out of 5
Average of 500+ ratings from Goodreads and Amazon.

Modern Software Engineering receives mixed reviews. Many praise its comprehensive overview of software engineering principles, emphasizing empiricism, complexity management, and continuous delivery. Readers appreciate the focus on fundamental concepts rather than specific technologies. However, some criticize the book for being repetitive, lacking concrete examples, and overly promoting Test-Driven Development. While experienced engineers may find little new information, beginners and those seeking a refresher on core principles generally find value in the book's content, despite its verbose writing style.

Your rating:

About the Author

David Farley is a renowned software engineer, author, and educator. He is best known for his contributions to continuous delivery practices and his work on software engineering principles. Farley has authored multiple books on software development, including "Continuous Delivery" and "Modern Software Engineering." He shares his expertise through various media, including a popular YouTube channel focused on continuous delivery and software engineering topics. Farley's background as a practitioner informs his teaching and writing, which emphasize empirical approaches, modularity, and test-driven development. His work has influenced many in the software industry, promoting more efficient and effective development practices.

Download PDF

To save this Modern Software Engineering summary for later, download the free PDF. You can print it out, or read offline at your convenience.
Download PDF
File size: 0.45 MB     Pages: 10

Download EPUB

To read this Modern Software Engineering summary on your e-reader device or app, download the free EPUB. The .epub digital book format is ideal for reading ebooks on phones, tablets, and e-readers.
Download EPUB
File size: 3.18 MB     Pages: 8
0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Create a free account to unlock:
Bookmarks – save your favorite books
History – revisit books later
Ratings – rate books & see your ratings
Unlock unlimited listening
Your first week's on us!
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Nov 22,
cancel anytime before.
Compare Features Free Pro
Read full text summaries
Summaries are free to read for everyone
Listen to summaries
12,000+ hours of audio
Unlimited Bookmarks
Free users are limited to 10
Unlimited History
Free users are limited to 10
What our users say
30,000+ readers
“...I can 10x the number of books I can read...”
“...exceptionally accurate, engaging, and beautifully presented...”
“...better than any amazon review when I'm making a book-buying decision...”
Save 62%
Yearly
$119.88 $44.99/yr
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Settings
Appearance