Join the discussion

Write your take first — we'll ask for email only when you're ready to publish.

  • Hacker News
  • I would like to spend my time more on gaining a mental model of the projects I work on, but I get very demotivated if I start disliking things like the programming language, certain arch. Choices or anything that gets too complex that doesn't seem like its worth my time

    It's heavily dependent on the project, but I feel like working as a "fullstack dev" kind of removes the fun of programming. I'm already spending 40 hrs a week looking at the most dull project I can imagine

  • I'm surprised that it seems no-one has brought up Residuality (see https://www.architecture-weekly.com/p/residuality-theory-a-r...) which is a very interesting take on architecture (as opposed to design) which aligns with my own experiences.

    As well as the book (https://leanpub.com/residuality) the author has one on the philosophy of architecture (https://leanpub.com/architectsparadox).

  • I think there is huge space for architecture case studies that help a non coder learn how to critique llm architecture decisions.

    I’m a NP - lots of learning came in clinical rotations where you see real life situations and how they are addressed. I want something like this for software architecture.

    The closest I’ve seen is the open source case study books referenced previously but these are older.

    I’d like to be able to see explanations at various layers of abstraction about why certain decisions are made or not.

    by npl
  • I think that words like "clean code" or "beautiful code" does help juniors to learn best practices of software architecture.

      - Junior asks to senior: what did you we use an ORM ?
      - senior answers: because it's cleaner.
      - junior: ???
    
    I prefer when people are able to define a clear list of objectives:

      - maintenable;
      - performant, scalable;
      - efficient;
      - resilient;
      - observable;
      - testable (and tested);
      - secured;
      - readable for new devs that come on board.
    
    Each criteria balance the others, and the more we add criteria the more it helps to make good choice when we hesitate. It is also meaningful for people outside of the dev team, we can reach an agreement with the customer so he knows what he pays for.

    "maintenable" can be also defined, since a project is mostly in maintenance mode during its lifetime (which means the project is successful, which is good !). The ability to incorporate new features without breaking architecture or even without breaking a single method signature is a good starting point.

    Being super careful with abstractions. Here someone wrote something like that: "abstraction often hides how what you want is simple". True, ORM I am looking at you. In most case data should be threaten as first class citizen, it also fosters good collaboration with the DBA.

    Thinking beyond "the happy path" without falling in premature optimization is also a challenge. A nice one, once again to it avoids to go head first in implementing a good idea without considering drawbacks.

    I also tend to imagine that the one that will work on my code had a very bad day so it must be pleasant to read what I wrote. Comments here and there, locale variable here and there even if they can be avoided, variable naming, etc...

    Being selective about frameworks. They are good servant but bad leaders. "Be an engineer, not a frameworker" says an article.

  • In this vein, I really recommend "Architecture of Open Source Applications."[1] It's a book series where you learn architecture by example, with each chapter written by a maintainer of the project in question. This lets you learn not only what the architecture is, but what are the constraints that shaped it, usually history and changing project visions.

    Not all chapters are equally good or equally interesting, that's the curse of a multi-author book, and all of them are dated, but I think the book is worth reading nonetheless.

    [1] http://aosabook.org/

  • The best way to learn architecture is to:

    1. Maintain a large enough project. Not create, but support.

    2. Do it for at least couple or few projects.

    If project is too small, any architecture works fine. "Large" can be in terms of lines of code, but better in terms of people who ever worked on it, or even better -- teams.

    At least two different projects is to have something to compare. I've seen people stuck for decades on one project and not knowing any modern ways to solve a problem.

    But often the architects who get promoted because they created, not maintained a project. Especially visible in Google, as you don't get promoted for maintaining anything, only for shipping something new (and better jumping off as soon as possible afterwards).

    Counterintuitively, people in the best position to be architects are actually side contractors from head shops, who get invited to maintain an existing project no one from a company is willing to (as they all jumped off where promotions go). First, they have to maintain an architecture, and second they did it on several projects, so can compare. The downside though, is if they bill by the hour, the tend to over-complicate architecture to bill more hours.

  • The recommendations are often very good, for example Ousterhouts A Philosophy of Software Design, but seem to be on software development in general, not actually software architecture in particular.

    For that, I would recommend the classic texts, such as Software Architecture: Perspectives on an Emerging Discipline (Shaw/Garlan) and really anything you can find by Mary Shaw. Including more recent papers that explore why the field of software architecture did not go the way they foresaw, for example Myths and Mythconceptions: What Does It Mean to Be a Programming Language, Anyhow? or Revisiting Abstractions for Software Architecture and Tools to Support Them

    More practically: look at why Unix pipes and filters and REST are successful, and where they fall down and why. Hexagonal architecture is also key.

    And a plug for my own contribution, linking software architecture with metaobject protocols as a new foundation for programming languages and programming: Beyond Procedure Calls as Component Glue: Connectors Deserve Metaclass Status. An answer to Mary Shaw's Procedure Calls Are the Assembly Language of Software Interconnection: Connectors Deserve First-Class Status.

    Answering the question: if procedure calls are the assembly language, what might a high level language look like? And also maybe that software architecture might have a brighter and more practical future ahead of itself.

  • I'll give you the cheat sheet:

    - Good design is a single idea pervaded throughout.

    - More generally, your goal should be to minimize surprise.

    - If your system allows it, people will do it.

    - Everyone will not just. If your solution starts with "if everyone will just..." then you don't have a solution.

    - Isolate the parts of your system that transform data from the ones that use it. Data models outlive code.

    - Coupling is the root of most evil.

    - Versioning is inevitable.

    - Make state explicit.

    - Every piece of information should have a single source of truth.

    - You should spend more time thinking about naming things correctly.

    - If testing is difficult, the design is wrong.

    - You will regret every undocumented decision.

    - Communication is a tax that you should justify before paying it.

    Remember that the job of an engineer at any level is to use rules of thumb to solve problems for which there is incomplete information.

Explore Birbla archives