Sunday, 11 February 2007

The responsibilities of a software architect

After having been working as an software architect in various companies for 10+ years I would like to offer my humble opinion in this matter.

I like the idea of conceptual grouping of what we do when developing software. RUP defines 4 such groups that can be used to describe the various phases a software project can go through.
  • Inception
    • determining whether its worthwhile going through with the project
    • setting up prototypes
    • gauging the complexities
  • Elaboration
    • gathering most significant functional requirements
    • building candidate architecture and functional skeletons
    • defining the non functional requirements
    • setting up the project (defining standards etc. etc.)
    • hiring people, etc. etc.
  • Construction
    • implementing more functionality and features
    • gathering more requirements
    • changing requirement and implementation if needed
  • Transition
    • finalization, making battle ready
    • releasing

We can think about software development in this way:
  1. There is a need for computer program to be implemented, and the reasons can be:
    • economical (we need to save money or make more money)
    • human (as a tool, visualization, training)
  2. Try to define what we need this computer program to do for us
  3. Try to come up with the best possible way known at the time to do this, best here can be:
    • fastest
    • most elegant
    • cheapest
    • most compliant
  4. Commence with implementation following some kind of process, best practise here:
    • iteratively
    • incremental
    • use case/scenario/story/task/feature drive

Some tools and principles that I have found that will aid in this activity:
  1. Continuous integration
  2. TDD
  3. Refactoring
  4. Scripting languages
  5. RAD
  6. Separation of concern
  7. Issue tracker
  8. Wiki (with support for active discussions)
  9. There is no substitute for skill and experience!
  10. Communication and feedback
  11. KISS
  12. YANGNI
  13. Code reviews
  14. Curtness, humbleness and mutual respect
  15. Managing expectations
  16. Avoid rather than detect problems but handle gracefully when so
  17. Collective ownership
  18. Delegation is a great way manage time
  19. Open source tools of all kinds...

Here are some of the responsibilities I would expect from a software architect in short form:
  • Requirements gathering and synthesising
  • System architecture - servers, routers bandwidths and so on
  • Nonfunctional requirements - capacity planning, scalability and performance conformance
  • Application architecture and design coming from some kind of analysis based on the above
  • Setting up project and hiring people
  • Setting up candidate architecture and skeletons
  • Establishing coding guidelines and standards
  • Establishing project methodology and process
  • Deciding on tools for development, communication and management
  • Training people
  • Documentation
  • Analysis, Design and Implementation - Hands on!

These are some of the attitudes I think a software architect should have:
  • Enthusiastic
  • Evangelistic
  • Humble
  • Clear and to the point
  • Agile
  • Pragmatic

The architect is the driver, the leader and the motivator. Without a good architect there can be no supper tomorrow :)

No comments: