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 below books in parallel: - Grady Booch et al. (2005). Unified Modeling Language User Guide. - Craig Larman (2004). Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development. - Robert C. Martin and Micah Martin (2006). Agile Principles, Patterns, and Practices in C#.
After that please read this "Erich Gamma et al. (1994). Design Patterns: Elements of Reusable Object-Oriented Software" 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 Volume 1: A System of Patterns" book.
After that please read this "Bertrand Meyer (1997). Object-Oriented Software Construction" book and this "Grady Booch et al. (2007). Object-Oriented Analysis and Design with Applications" book.
After finishing the books please click Topic 13 - Software Project Management to continue.