Thoughts On Software Architecture and Corporate Structure

How is a company structured like a piece of software, and what best practices can be shared between the design of both?

I’ve been thinking a lot lately about the the effects that the organizational structure of a company can have on the work done  there. I don’t have a background in either business or management; my background is technical, and this is thus the primary lens through which I tend to filter things and around which I form mental models of the world. It’s not always accurate or appropriate, because the world works in a very different ways than a computer does. But good design is good design, and as evidenced by such influential work as Don Norman’s book “The Design of Everyday Things,”  Christoper Alexander’s notion of a design pattern, or Janine M. Benyus exploration of a phenomenon known as biomimicry, sometimes, borrowing ideas from a different domain can be an surprisingly fruitful exercise.  

In answer to the question posed above, there are several principles which I think can be applied to the design both software architecture as well as the structure of a company: 

 

A well organized company, like well architected software, is divided up into a modular set of functional components,

Modularization is perhaps the most important characteristic a corporation or piece of software can have. Each node, be it a software module or team of employees, has a mandate to perform a very specific task in the context of a greater whole; when all nodes are working in concert with one another, the entity as a whole works. Nodes should work seamlessly with other nodes to achieve a certain task, but shouldn’t be held responsible for performing the task assigned to another. After all, that’s not what it was built to do. There should not be an n-by-n relationship of accountability among the functioning parts: each one shouldn’t have to know what all the others are doing. Instead, it is the role of some kind of controller module upstream to make sure that everything is running smoothly. Software design patterns such as MVC (Model-View-Controller) are premised on this paradigm. Keeping to a model like this helps avoid spaghetti code and spaghetti management. 

 

all of which are allocated discrete, well-documented roles defined before they are built,

In software development, the programmer writes pre- and postconditions in order to establish the role of a particular software component. With these boundaries well defined at design-time, the programmer is less likely to try to sneak additional functionality into code that was never meant to accommodate it. The same holds true in an organization. If the mandate of a team is well defined and appropriately suited to the skillset of the members of that team, then the team will likely perform well.  If the team’s mandate changes, then some examination is in order to make sure that it can still perform its duties appropriately under the new definition. Some flexibility in re-using, reassigning and re-appropriating code or people is of course desirable, but eventually you reach a point of diminishing returns and end up so far from where you started that it just makes sense to scrap the whole thing and rewrite it from scratch.

 

all of which can communicate with one another using a universal and mutually agreed-upon protocol,

Message passing is a huge part of efficiently written software. With all the modular pieces buzzing along, doing their own thing, it becomes important that they have some mechanism to communicate with one another. Many programming languages have some level of built-in support for passing information back and forth between chunks of code, and it is often best to leverage these facilities. By mapping out the communication paradigm before a single line of code is written and keeping consistent throughout the whole application, the programmer saves him- or herself the trouble of inventing a new set of messages each time an additional module is added. 

The notion of communication here applies both between modules, or teams, which may constantly interact with each other and require well-defined APIs for interaction, and  for more asynchronous, interrupt-driven messages, which may better be handled by an event-based notification system. In a corporation, top-down information, such as announcements or strategic direction, should be able to easily be transmitted down the corporate hierarchy (this is often handled in meetings and email lists); equally important (though much harder to implement appropriately) is for messages coming from the lower levels to be heard at the very top without having been distorted or in any way compromised along the way. 

 

… and finally, all of which are constantly being monitored, maintained, upgraded, and, if necessary, refactored or phased out.

A company, or a piece of software, is subject to the same rules of survival as any living entity: adapt or become extinct. In a market which is in constant flux, the only way to stay on top is to avoid stagnation and embrace change.

While there is something to be said for not fixing something which isn’t broken, if your software is chugging along just fine using decades old technology, while the competition is constantly migrating to the latest and greatest  (and seeing the associated financial returns), then the functional state of the software is irrelevant; something at a much higher level is indeed broken. If your algorithm was top notch for years, but the competition figured out how to do the same thing faster/cheaper/better, then it’s time to refactor your algorithm.

The same holds true on a macro level for the businesses that create the software -  legacy systems, legacy organizational structure, outdated processes, and other baggage will inevitably keep accumulating over time, weighing down the enterprise and all but canceling out any innovation that is achieved. Without constant vigilant monitoring, and mechanisms to execute on whatever metrics those monitoring systems return (good or bad), then the organization inevitably has resigned itself to being retroactively labeled as a Version 1.0 relic in whatever industry it once commanded a presence.

Share and Enjoy:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google

No related posts.

This entry was posted on Monday, July 21st, 2008 at 11:13 pm and is filed under Business. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

11 Responses to “Thoughts On Software Architecture and Corporate Structure”

  1. Jennifer Says:

    Dan-
    Your observations about programming applied to the business model could also be extended further. I am a biologist trained under Benyus to practice biomimicry, and I do believe you are on to something here.
    I would love to see your insight applied at a civic level as well. It seems to me right now that as we start to tackle some of the major problems of our infrastructure that have lead to our situation- such as water supply collapse- we keep seeing the same situation. In engineering we have a problem and then come up with a solution that works immediately. We use it until it fails. Then we come up with a solution to make the first one work 90% of the time. Then the next set of solutions make the system work 95% of the time. You get the idea. Until we have this almost working, aging and collapsing infrastructure that costs more in the short term to fix, but really needs a new start. Especially when our original concepts of use and conservation have changed.
    I will be sure to pass this on to some friends of mine who lecture on biomimicry as a business model.

  2. Dan Says:

    Hi Jennifer -

    Thanks for the comments – I love your idea of leveraging the design of technological or biological systems to solve problems of civil engineering; it really makes me wonder if there are design tenets that are applicable irrespective of domain? For example, taking a tip from the oldest and IMHO //best designer ever// — nature — it should be fairly obvious that the waterfall model of development is fundamentally flawed in comparison to more rapid iterative models (or, in the case of evolution, not so rapid :)

    As you point out, I’m hoping that the sea change in our collective notions of use (consumption) and conservation will catalyze civic designs that are significantly more forward-looking that that of the past couple generations. In addition to changes in the way we do design, maybe it’s also a matter of being more proactive than reactive in terms of maintence?

    So, in the example of the water supply, in addition to designing it modularly with the potential for easily making future changes, rather than saying “we’ll fix our water supply when we experience a drought or contamination,” we should be constantly optimizing it even if it’s not truly ‘broken’ ?

    I know very little about civic design / planning … any suggestions on good places to start?

    Lots to think about here …

  3. EMC2 Says:

    Isnt’s this System Thinking ?

  4. Dan Says:

    Hi EMC2 – Thanks for the reference (Wikipedia article was a great primer). Yes, I suppose that the notion of ‘universal design tenets’ are indeed what the Systems Thinking methodology attempts to define. I think there is also something very interesting about then applying specific elements/lessons/paradigms of each domains to one another to see what works, what doesn’t, etc.

  5. andyskipper.com - freelance web developer in london Says:

    [...] A very interesting read from Dan Greenblatt: Thoughts On Software Architecture and Corporate Structure [...]

  6. the eye of ria » Blog Archive » 对软件架构和企业组织结构的思考 Says:

    [...] Greenblog最近在一篇博客里分析了软件架构与高效的组织结构在原则上的相似性,以之回答下面的问题: [...]

  7. TM Says:

    In reference to your statement “it really makes me wonder if there are design tenets that are applicable irrespective of domain? For example, taking a tip from the oldest and IMHO //best designer ever// — nature —” I’ve got a suggestion for you. Go to
    http://www.biomimicryinstitute.org/about-us/biomimicry-a-tool-for-innovation.html.
    About half way down the page is a butterfly image that says “Life’s Principles.” This is essentially a concept map of nature’s design principles and it touches on some of the concepts that you mentioned in your original post. It’s a tool that we use with our clients to get them thinking about systems, sustainability and biomimetic design. Enjoy!

  8. Dan Says:

    @TM: Thanks for the pointer to this resource. Great principles to keep in mind when doing any kind of design…

  9. MT Heart Says:

    Interesting. I’m surprised to see no mention of Conway’s Law though – “Any piece of software reflects the organizational structure that produced it.”

    It is a consequence of the fact that two software modules A and B cannot interface correctly with each other unless the designer and implementer of A communicates with the designer and implementer of B. Thus the interface structure of a software system necessarily will show a congruence with the social structure of the organization that produced it.

    http://en.wikipedia.org/wiki/Conway’s_Law

  10. Dan Says:

    @MT: Thanks for the link; I think I may have come across that at some point in the past, but the Wikipedia article was a good refresher.

    I wonder if there are corollaries here for companies that don’t produce software … how does their end product (or service) reflect the structure/culture that produced it.

  11. Imran Sobh Says:

    I really like this post, and there are some good links to other topics–just read the Conway’s Law Wikipedia entry. I have always been very much of the opinion that well designed products come from well designed companies, so its good to hear the thought validated, at least in terms of software structure :)

    Computing analogies also interest me since cognitive psychologist often refer to the architecture of a computer as an analogy for the brain (short term memory = RAM, long term memory = HDD, executive functions = processor, etc… ). Also, like I mentioned before, early organization management theorists looked at organizations as machines with replaceable “parts” instead of people, which I think makes it easier to dehumanize employees.

Leave a Reply