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 and what are their responsibility, how they work together, how data will be organized, how data will be flowed within your application, how users will interact with the application, etc. 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, etc.
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 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 (enterprises, games, desktop, web, mobile, security, etc.) 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 its 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.
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.
After that please read - this Robert C. Martin (2017). Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Pearson Education book, and - this Len Bass, Paul Clements and Rick Kazman (2012). Software Architecture in Practice. Addison-Wesley book.
After finishing the books please click Topic 13 - Software Project Management to continue.