O'Reilly logo
live online training icon Live Online training

Practical Software Design from Problem to Solution

Topic: Software Development
Simon Roberts

Real-world software design is subject to, and must balance, a great many conflicting constraints. Few programmers have a good understanding of design when they start their careers, and it’s common for programmers to struggle with this for a long time. This course will help you increase your knowledge of software design so you can create more robust designs that survive better through your product’s life cycle. It will help you enumerate, and choose among, appropriate techniques for mitigating those problems; make justifiable, sensible decisions where trade-offs are still necessary; and finally recognize the underlying design principles in common example situations.

This course first investigates the nature of the real-world problems. Any practicing programmer will have been exposed to most of these, but the hectic, time-pressed, nature of daily work typically prevents them from building mental clarity about what the problems and their relationship with known solutions. This course will also illustrate how these principles underlie the design patterns, reinforcing the network of understanding that will ensure the information is understood, retained, and can be applied.

What you'll learn-and how you can apply it

  • Identify the common problems facing designers of real-world commercial software
  • Enumerate, and choose among, appropriate techniques for mitigating those problems
  • Make justifiable, sensible decisions where tradeoffs are still necessary
  • Recognize the underlying design principles in common example situations

This training course is for you because...

  • You want to increase your knowledge of software design
  • You want to create more robust designs that survive better through your product’s life cycle
  • You want to build design skills that are independent of language and programming paradigm


  • You should be comfortable creating basic designs that satisfy simple functional requirements.
  • You should be able to implement those designs, coding in a language of your choice.

About your instructor

  • Simon started out working as a software engineer, specializing in industrial control systems, and had a sideline teaching for a local University in his then-home-town of Cambridge, England.

    In 1995 he joined Sun Microsystems, Inc. as a senior instructor and course developer. Simon spearheaded the introduction of Java training by Sun Microsystems in the U.K. in 1995. He developed the first Java certification exams for Sun before he moved to the U.S. in 1998.

    Since leaving Sun in 2004, Simon has developed and delivered training for clients around the world.

    Simon believes that training should have an immediate purpose and application, and that the most effective training is usually "on the job" mentoring, helping to remove the immediate roadblocks to productivity that so often plague workers in fast moving environments.


The timeframes are only estimates and may vary according to how the class is progressing

Understanding the core problems of real-world software design (50 mins)

  • Scale and complexity
  • Changing requirements, changing teams, changing technologies
  • The joy of physics and mathematics versus the messy complexity of business

10 minute break

Approaches to solving problems (50 mins)

  • Identifying helpful boundaries
  • Handling volatile elements of our problem domain
  • Sub-dividing within boundaries, and putting the pieces back together so they work, and we can understand them
  • Limiting the consequences of change

10 minute break

Applying key principles, and recognizing them in well-known approaches (110 mins)

  • Classic procedural programming approaches
  • Classic object oriented programming approaches

10 minute break

  • Comparing classical inheritance and prototypal inheritance
  • Classic functional programming approaches
  • Investigating the consistency of principles across paradigms