All simple problems have essentially been solved. What remain are complex problems, with thousand of movable parts and very difficult to satisfy end-users. Consequently, creating (and maintaining) software to solve these complex problems has become incredibly hard…
I have to admit that things were easier when I started learning and practising software engineering in the 1990s. Thirty years later, teaching, learning and doing software development, based on sound engineering and system design principles, are not easy and need courage and energy.
As I always say, I am a Computer Scientist but I don’t like the term “Computer Science”. What I do is neither about computers (in the same way that surgery is not about the scalpel) nor is a science (as a science describes some part of reality). Rather, I prefer the term “Informatique” (in French) or “Informatics” which say that what is important is the flow of information.
But, maybe, there is another way to look at “Informatics”: it is about dealing with complexity.
For example, let’s say that you need to build a “system” which NEEDS to work 24/7. This obligatorily means that the system needs to have redundancy (one computer might fail) and needs some kind of load balancing (to which computer to assign the work to be done?) and, probably, some synchronisation issue to deal with. In practice, there will be 100s of other aspects to take care of if one wants to build a fully functional system.
Hence, the importance of this fantastic “System Design” course.
Go through the course topic by topic. Discuss with people who are already conversant in them. Read articles online. Rinse and repeat.
After some weeks (or months), you will become a much better system designer. And, most importantly, you will be the one with the knowledge and skills to provide software solutions to the complex problems which real people are facing.
Enjoy (and don’t hesitate to ask me questions if there is something you don’t understand). I’ll try to answer 🙂