Category Archives: OOP

Topic 15 – Advanced Software Design

Why do I need to learn about advanced software design?

I think that I already learned about software design in the Topic 12 – Introduction to Software Design.

Now your task is not just to build a house.  Your task is to build a city. 

The situation is similar to when you create complex software. Now, you are responsible for creating a software system containing about 10,000 classes for 5,000 people to use in 15 years. The maximum system downtime must be less than 5 minutes in 15 years.
Image that you have to create a system that serves millions of people simultaneously like Facebook or YouTube or Amazon or Office 365 or Gmail. Are you able to create it?
Image that you are tasked to create frameworks for developers to extend such as ASP.NET Web Forms or ASP.NET MVC or  Laravel or Yii. Are you able to create one?
If you are not sure how to fulfill these tasks then probably, you should learn how other people crafted similar systems and adapt their experiences to your case. Advanced software design knowledge will then be useful for you.

What can I do after finishing learning advanced software design?

You will know how to design a very complex software system that satisfies not only functional requirements but also security, modifiability, scalability, reusability, extensibility and reliability requirements.

That sounds interesting! What should I do now?

Advanced software design requires a lot of reading. Please do review your software design knowledge introduced in the Topic 12 - Introduction to Software Design first.
Because nowadays software can be applied to many fields, each of them requires specific advanced software design knowledge, in this topic, we only focus on enterprise software because of its popularity.
Before you design a complicated system you must thoroughly  understand its sophisticated requirements. This is a critical step when building a large system. Please read this "David C. Hay (2002). Requirements Analysis: From Business Views to Architecture" book to learn how to capture requirements for an enterprise system.
After that please read this "Deepak Alur et al. (2003). Core J2EE Patterns: Best Practices and Design Strategies" book this "Martin Fowler (2002). Patterns of Enterprise Application Architecture" book.
After that please read 
- this "Eric Evans (2003). Domain-Driven Design: Tackling Complexity in the Heart of Software" book and
- this "Jimmy Nilsson (2006). Applying Domain-Driven Design and Patterns: With Examples in C# and .NET" book and 
- this "Scott Millett and Nick Tune (2015). Patterns, Principles, and Practices of Domain-Driven Design" book.
After that please read this "David Budgen (2011). Software Design" book.
After that please read this "Len Bass et al. (2012). Software Architecture in Practice" book, especially chapter 5, 8 and 11.
After that please read 
- this "Cloves Carneiro Jr. and Tim Schmelmer (2016. Microservices from Day One: Build robust and scalable software from the start" book and 
- this "Sam Newman (2016). Building Microservices: Designing Fine-Grained Systems" book.

After finishing the books please click Topic 16 – Calculus to continue.

Topic 12 – Introduction to Software Design

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.

Topic 4 – Object-Oriented Programming

Why do I need to know an object-oriented programming language?

Because most of modern applications are written using an object-oriented programming language. Using an object-oriented programming language as a tool will save you a lot of time and cost when you create a modern application.

Alright! What should I do now?

Please read this "Jim Keogh and Mario Giannini (2004). OOP Demystified" book.

Is that all?

Unfortunately, the book is not sufficient although it already gives you the fundamental concepts of object-oriented programming. The book does not teach you how to create real world applications using an object-oriented programming language.

We recommend that you read it first because it introduces basic concepts of object-oriented programming very well. It helps you to distinguish object-oriented concepts from procedural programing concepts very clearly so that you could read other books to dig into object-oriented programming in a right way.

Please read this "RB Whitaker (2015). The C# Player's Guide" book to understand how to use object-oriented concepts to create real world software using a specific object-oriented programming language.

After that please get 
- this "Joseph Albahari and Ben Albahari (2015). C# 6.0 in a Nutshell: The Definitive Reference" book or 
- this "Herbert Schildt (2010). C# 4.0 The Complete Reference." book and 
take a quick look at them so that you can refer to specific topics when creating real world applications.

I hear that there are many object-oriented programming languages such as C++, C#, Java, PHP, Objective-C, Swift, Python, Ruby, etc. How many object-oriented programming languages should I know?

As many as possible. However, in this stage, you can learn only C# or Java or C++.
- If you are required or prefer to learn C++, please read this "Bjarne Stroustrup (2013). The C++ Programming Language" book.
- If you are required or prefer to learn Java, please read this "Herbert Schildt (2014). Java: The Complete Reference" book.

Then if you are interested in in-depth object-oriented concepts then please read 
- this "Matt Weisfeld (2013). The Object-Oriented Thought Process" book and 
- this "Bertrand Meyer (1997). Object-Oriented Software Construction" book and 
- this "Grady Booch et al. (2007). Object-Oriented Analysis and Design with Applications" book.
They will help you understand the object-oriented concepts more deeply.

After finishing the books please click Topic 5 - Introduction to Windows Programming to continue.