About
Rhino Research is a consulting and training company focusing on software architecture. Our primary consultant and instructor is Dr. George Fairbanks, who has a Ph.D. in Software Engineering from Carnegie Mellon University and has been teaching software architecture and object oriented design since 1998. More…
Just Enough Software Architecture book
Just Enough Software Architecture: A Risk-Driven Approach by George Fairbanks.
Buy the hardback from Amazon for $34.50 or the e-book for $19.50.
Public Talks
- 9 Feb 2010: Boulder Java User Group – Design Fragments.
- 4 Mar 2010: CU Boulder Colloquium – Design Fragments.
- 6 May 2010: IASA Denver ITARC — Architecture Haiku
- 21 May 2010: SEI SATURN conference – Risk Driven Architecture.
- 14-15 June 2010: AgileRoots 2010 — Architecturally Evident Coding Style in Salt Lake City
- 21 July 2010: Northern Colorado Architects Group — Architecture Haiku in Ft. Collins
- 3 Aug 2010: Denver Open Source User Group — Architecture Haiku
- 7 Sept 2010: Boulder Java User Group — Architecture Haiku
- 17-21 Oct 2010: SPLASH / OOPSLA — tutorial on Architecturally Evident Coding Style
Recent blog posts
- Architecture Hoisting - video of Atlanta talk
- Speaking at Atlanta IASA, Weds 14th, 2012
- Book on sale: Now just $19.50 with free shipping (limited time)
- More book citations: Muddy architecture
- New review of my book
- Talk on expressing architecture in code: AgileRoots 2010
- CompArch/WICSA 2011 - Panel discussion and Haiku tutorial
- Much good news: Second printing, Amazon top-10
- Another great Amazon review of my book
- Interview in InfoQ -- and in Japan




I bet you informally think about components and connectors now
Thanks Larry, I enjoy our discussions.
That’s good to hear. It’s not completely obvious they should be treated separately — there are plenty of places where they are tangled up but I think it’s a good aspirational goal to separate them. This means it may be possible to convince folks that architecture activities can be part of agile development, just like refactoring, which does not produce customer-visible product, but is a necessary to repeatably deliver value.
Altogether too often folks incorrectly assume that Architecture = Big Design Up Front (BDUF). I do not agree. I think of architecture as an engineering activity that you can do up front, in between, or later during refactoring. Of course there are things that are easier to decide in advance, like the architectural style of the entire system (e.g., client-server, REST, peer-to-peer, pipe-and-filter), but agile folks already agree with that too. As you say, choosing a framework such as J2EE or .Net can effectively decide your architectural style.
You are right that most developers are thinking in terms of objects and design patterns. Interestingly, though, they weren’t thinking in terms of design patterns a decade ago (roughly) when the GoF book came out. Of course they were applying patterns informally and may have had pet names for them. The GoF book made a convincing argument that we should officially recognize what we’ve been doing already and give the patterns standard names. It also gave us a better handle by which to describe and compare potential solutions. Your short dialog about the developers is a great example.
There are striking parallels here with architecture. Only rookie developers consider functionality exclusively. Almost every project has some kind of internal divisions, be they clients and servers or various modules. We talk about the state of a protocol between two objects (or clients and servers). What’s missing here is that these ideas have not been reified and made explicit. When you say “component” you might be referring to a chunk of code, while I might mean a runtime chunk (e.g., you could have two runtime components as clients but just one compile-time module that has the source for them). Obviously we’d prefer to standardize some terminology. Being able to name architectural styles, which are just patterns at the architectural level, has the same benefits as naming design patterns.
You can solve the same problem thinking 1) just about the objects, or 2) by objects + design patterns, or 3) objects + design patterns + architectural abstractions. If you’ve got 5 objects, choose #1. if you’ve got 500 objects, #2 is still practical. If you’ve got 5000 objects, your brain starts to get full and you have to reach for #3.
We should probably be explicit about the hypothesis. One might be that “Objects are all you need”. Of course that’s easy to poke holes in, because we don’t strictly need objects. We could code in C or assembly. But we find objects a convenient abstraction. We think about objects rather than the machine code that makes them run. That way we free up our brains to solve the problem rather than thinking about registers and moving data between memory and the CPU.
Another possible hypothesis is that “Architectural abstractions like components and connectors can help us to understand large codebases”. We can quibble about what is large and if they are helpful or a nuisance on small codebases. I have done some work on big projects and my experience is that at some point you need to clump together big chunks of code. About 15 years of work has gone into defining and explaining the component and connector abstractions. They’re not perfect but they work better than 5000 objects.