Home Page

This notebook is dedicated to software architecural principles.

Let us consider three primary aspects of software development:


  • Computer Science - Here I refer to the underlying principles and theories of computer science, namely, data structures, algorithms, space and runtime complexities of potential solutions, time/space tradeoffs, problem decomposition, number theory, parsing theory, etc.

  • Software Engineering - When I think of software engineering, I think mainly of applying processes and practices that are necessary to produce practical real-world applications that can be shipped to customers. This would include the craft of writing clean, readable, maintainable code, as well as peripheral activities such as quality assurance and project management, agile practices, etc.

  • Software Architecture - By "architecture" I refer more to the bigger picture of system design; not so much low-level algorithmic details, but the bigger picture of how a large problem is decomposed into workable subsystem. A very good starting point for software architecture is to understand common design patterns that can be reused across solutions. We also consider major architectural genres such as object-oriented design and functional programming.

This notebook is dedicated to the later discipline - software architecture.