For some people, S/W arch is writing readable, maintainable code. Things like Design patterns, FP, TDD, microservices etc. There is a lot of literature on this out there.
For others, it means having the ability to design the next Kafka/Spark/React. You can get basic theory for this by reading books on Domain Modelling, Distributed computing and Algorithms. So books like The Algorithm design manual, Designing Data intensive Applications, The Parallel and Concurrent Programming in Haskell, Functional and reactive domain modelling etc. The http://aosabook.org has good case studies to read as well. However, to actually build these systems require facing the problem in the 1st place and being unable to use existing systems to solve it. Or doing phd in them. It happens rarely.
Finally, the last one is my day job. Which is to convert ramblings and fantasies of leadership into a production systems, minimizing the number of curse words people use when working on it. I haven't really found any good guides to do this though. Things which help me are:
- Always thinking what could go wrong. And if it does, who should be notified if the system can't recover. A lot of times when I don't have the answer, I ask around. Things like slack channels, mailing lists, or even having coffee with people in industry who have tackled stuff like this.
- Communication skills. This doesn't mean small talk, but being able to have conversations and meetings which help define requirements and ensure everyone is on the same page. Also making sure there are hard numbers. ie. instead of "fast","responsive" etc, get latency, throughput, uptime numbers.
- Understanding business/technical capabilities and limitations. Things like business impact(LTR etc), capabilities of current infrastructure, skill levels of various people/contractors involved etc
So, I started learning about design patterns. In particular, I spent a lot of time reading through this site [1] and "Head First Design Patterns".
It was a mistake.
I've used maybe 2-3 of these design patterns when actually writing code, and never because I intended to use, say, a factory or a singleton -- I wrote what code I thought was most appropriate and it turned out to match an existing pattern.
--
Here's what's more valuable to learn:
- SOLID principles
- Realizing that what depends on what in your web application matters.
You want your business logic depending on your DB access code and your web layer depending on your business logic.
You do NOT want your business logic depending on your web layer.
- Realizing that your web app is really just some business logic which has a HTTP interface.
- Organizing software into layers. In a web app you'd have layers for middleware, controllers, business logic, and database access.
- Folder structure. I have a folder for each layer and try to have a descriptive name for each file in it. If a folder is getting messy, add another folder inside it with a descriptive name.
- Understand that refactoring is a fact of life. When you start a project, there's no way you can think of the optimal design up-front. This means you'll write code, accrue technical debt, and will need to refactor. Realize that this is 100% normal.
I think one of the best ways to learn software architecture is to have a clear view of what the challenges are, and the Kleppman book does a really good job of providing that clear view.
However, at the same time I was also doing lots of software development. I tried out lots of different solution styles. So don't ignore that aspect.
Super friendly guy, too. (And a board game geek.)
Thankfully, some of these things have been opened up:
https://www.goodreads.com/book/show/224110.Software_Architec...
https://www.goodreads.com/book/show/25380761-software-archit...
https://www.goodreads.com/book/show/6329721-software-archite...
https://www.goodreads.com/book/show/1171676.Software_Archite...
https://www.goodreads.com/book/show/1347952.Design_and_Use_o...
You can also look at https://ocw.mit.edu/courses/engineering-systems-division/esd... , which although it's not specific to software systems has a lot of concepts that are common to all kinds of systems (I took that course in 2013), such as interfaces or modules.
[1] "Design Patterns: Elements of Reusable Object-Oriented Software"
It systematically simulates integrated circuit systems and large industrial production lines.
In the computer field, for the first time, it was realized that the unification of hardware engineering and software engineering on the logical model. It has been extended from `Lisp language-level code and data unification` to `system engineering-level software and hardware unification`.
It brings large industrial production theory and methods to software engineering. It incorporates IT industry into modern large industrial production systems, This is an epoch-making innovative theory and method.
There are only five basic components:
1. Pipeline (pure function)
2. Branch
3. Reflow (feedback, whirlpool, recursion)
4. Shunt (concurrent, parallel)
5. Confluence.
https://en.wikipedia.org/wiki/Entity_component_system
http://adventures.michaelfbryan.com/posts/ecs-outside-of-gam...