Showing posts with label software architecture. Show all posts
Showing posts with label software architecture. Show all posts

Saturday, March 5, 2011

Roles and Responsibilities of a Software Architect

The following is a list (which is not intended to be comprehensive, by any means) of the roles and responsibilities of a Software Architect.

  • Roles of a Software Architect
    • Customer Facing - Evangelist, Negotiator
    • Team Facing - [Designer, Programmer], Process Guide
    • Management Facing - Evangelist, Negotiator

  • Responsibilities of a Software Architect
    • Estimation
    • Analyze skill requirements
    • Ensure requirements make sense (esp. NFRs)
    • Prepare domain model
    • Design solution architecture (candidate + selected)
      • Balance trade offs
      • Capture rationale
    • Select technology
    • Provide technical guidance (research, samples, references, training to team)
    • Define development environment
      • Automated Builds
      • Continuous Integration
      • Unit Testing
      • Software Configuration Management (SCM)
      • Metrics
    • Pioneer new technologies; training team where gaps exist
    • Troubleshooting/Performance optimization (especially in maintenance)
    • Maintain engineering discipline/rigor
    • Monitor and control via reviews
    • Risk/Issue assessment
    • Input to defect triage process
    • Assess team member performance, provide feedback
    • Recruitment (conducting interviews, identifying organizational skill gaps)
    • Pre-sales (especially in a consultancy environment)

If this describes what you do, you just might be a Software Architect...

Tuesday, August 5, 2008

Ctrl-Shift-B: Interactive Application Architecture Patterns

I've been looking into the viability of using the Model-View-Presenter pattern just recently and came across another in-depth article by Derek Greer.

This is easily one of the best articles I've read - get yours at Ctrl-Shift-B: Interactive Application Architecture Patterns.

It's a pity the guy doesn't seem to get to post more often - (being a software developer, it isn't surprising...)

I will be posting my findings on the Model-View-Presenter pattern soon, but I suggest you don't hold your breath.... (after all, I'm a software developer too!)

Monday, August 4, 2008

Ctrl-Shift-B: The Art of Separation of Concerns

Derek Greer has written a detailed post on Separation of Concerns (SoC), at Ctrl-Shift-B: The Art of Separation of Concerns.

He also explains how we can achieve good SoC by decomposing a design into verticals (modules) and horizontals (layers), also looking at how aspects (AOP) allow us to take this to yet another level.

The post also discusses Inversion of Control (IoC) and Dependency Injection (DI)... and how they contribute to good separation as well.

All-in-all, a good read.

Remember:

(High SoC) == (High cohesion, Low coupling) == A Good Thing!

Tuesday, May 1, 2007

Anemic vs. Rich Domain Models

There's debate at almost religious intensity on some forums as to the type of domain model to be used in developing applications.

The rich Domain Model (proposed by Martin Fowler) suggests having e.g. Employee objects, with all operations on an Employee provided by the class itself - such as Employee.Save(). Fowler argues that this makes for better object orientation, as there is greater encapsulation and the opportunity for polymorphic use of objects.

The alternative is the Anemic Domain Model (the term coined by Fowler himself makes clear how much he dislikes the model by using a term with negative implications) and probably inspired by the design of stateless session beans from EJB. This design has (to follow the above example) Employee objects containing their own data, but EmployeeManager or EmployeeService classes containing the operations - such as EmployeeManager.Save(Employee).

Wikipedia labels the latter as an anti-pattern; however, given that there are so many proponents of the Anemic Domain Model (ADM), labeling it an anti-pattern seems to be an extremist, dogmatic point of view. The pro-ADM argument is that breaking the functionality out into separate classes further enhances separation of concerns, which is a good design practice.

Personally, I've found the ADM to be a simple one to develop, lending itself well to generation of code via templates etc. Furthermore, with the whole SOA/Web Service buzz, services as per ADM make a lot of sense; even use of the GOF Facade design pattern would probably lead to the same solution. Say in a Web Service application, the designer would be forced to make the Domain Model dependent on the relevant Web Service - in my book, placing Web Service calls behind Employee.Save() would be mixing up far too many concerns (i.e. business logic + web service invocation code).

Fowler's rich Domain Model is an ideal solution - and I've used it successfully on several in-process solutions - and if it can be achieved outside of the pro-ADM arguments just outlined - I'm all for it. Maybe having the UI talk to a rich Domain Model (your formal API), which in turn talks to the back end comprising an ADM would be the answer... however, this would mean code that would be repetitive and leave that much more room for defects to creep in.

It all comes down to a question of how pragmatic a software designer is willing to be. The only certainty is that this argument will not be going away anytime soon.

A few blogs which have opinions on this topic:
Finding references on this matter is not hard at all...
Google for rich Domain Model
Google for Anemic Domain Model