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.