Why do I need to learn about software design?
What will you do if you are tasked to build a house. You will need to sketch its first and build the house based upon the sketch. Otherwise you may build a house that may collapse in a few weeks or cannot be decorated due to errors. The situation is similar when you create software. You need to plan how you will build it first by deciding how many components and objects will be used for constructing to solve at least a core problem, what are their responsibility, how they work together, how data will be organized, how data will be flowed within these components, how users will interact with your application, how these components will be deployed. Software design knowledge will show you how to do these tasks.
What can I do after finishing learning software design?
You will know how to create a design for an application including static and dynamic structure, data organization, business processing workflows.
Is is really useful? I feel that you can write the code right after having the requirements and I could refactor my code when needed.
That's great if you can do it like that. Just return to this topic (i) when you do not know how to write the code for a feature or (ii) when you cannot refactor your code because only a small change breaks the whole application or (iii) when you write a software system together with 20 other developers and you do not know how to integrate results of all the developers into one solution or (iv) when you software system serves 20 users simultaneously very well but it stops when serving 2,000 users simultaneously and you do not know how to fix it.
Alright! What should I do now?
Software design requires a lot of reading. Each application type (enterprise systems, games, intelligent systems) require specific design knowledge. At this point we focus only on the basic elements of software design.
In order to get familiar with software design please read these 3 books below in parallel: - Grady Booch et al. (2005). The Unified Modeling Language User Guide. Addison Wesley Professional - Craig Larman (2004). Applying UML And Patterns. 3rd Edition. Prentice Hall - Robert C. Martin (2003). Agile Software Development - Principles, Patterns, and Practices. Pearson
After that please read this Erich Gamma et al (1994). Design Patterns Elements Of Reusable Object Oriented Software. Addison-Wesley Professional book. Please focus on the Motivation section of each pattern. You can skip a pattern if the problem presented in the Motivation section is not relevant to your situation.
After that please read - this Frank Buschmann et al. (1996). Pattern-Oriented Software Architecture: A System Of Patterns. John Wiley & Sons Ltd book, and - this Deepak Alur, Dan Malks and John Crupi (2003). Core J2EE Patterns: Best Practices And Design Strategies. Prentice Hall PTR book, and - this Martin Fowler et al. (2002). Patterns Of Enterprise Application Architecture. Addison Wesley book.
After that please read - this Meilir Page-Jones (1988). The Practical Guide to Structured Systems Design. Pearson Education book, and - this Bertrand Meyer (1997). Object-Oriented Software Construction. Prentice Hall book, and - this Grady Booch et al. (2007). Object-Oriented Analysis and Design with Applications. Pearson book, and - this David Budgen (2003). Software Design. Pearson book and this David Budgen (2020). Software Design. CRC Press book to learn how to design software systematically.
After that please read this Robert C. Martin (2017). Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Pearson Education book to learn how to create a real world architecture for an enterprise system.
After that please read - this Len Bass, Paul Clements and Rick Kazman (2012). Software Architecture in Practice. Addison-Wesley book to review software architecture aspects, and - this Paul Clements et al. (2010). Documenting Software Architectures: Views and Beyond. Pearson book to learn how to document an architecture so that it can be used for communicated, built and maintained, and - this Humberto Cervantes and Rick Kazman (2016). Designing Software Architectures: A Practical Approach. Addison-Wesley Professional book to learn how to create an architecture systematically, and - this Nick Rozanski and Eoin Woods (2012). Software Systems Architecture: Working with Stakeholders Using Viewpoints and Perspectives. Addison-Wesley Professional book to learn how to apply theory to create an architecture systematically in real world.
After finishing the books please click Topic 13 - Software Project Management to continue.