A side effect of my decision
not to become an independent consultant at this time
means that I have to shelve some of the projects I was considering. One
of these projects was to create a training program for software
architects which I was discussing with a couple of training centers
here in Israel.
Since It seems I am not going to promote it, I
thought I'd share what I think a training program for .NET/Java
architects should look like in the hope that someone would find it
useful and do promote it (or parts of it)
Soft SkillsThe way I see it architects needs a bunch of soft skills to be able to perform their roles.
Here is the list
I identified in the past (by the way, I began a series of posts on each of these skills and never got to finish it - maybe it is time that I will :) )
- Leadership. Influencing others to accomplish tasks and following your guidance
- System thinking. Understand decisions and constrains in the
wide scope pertaining to whole of the solution at hand. This includes
the ability to abstract problems.
- Strategic thinking. Understanding decisions and constrains and their alighments to the overall business of the company.
- Organizational politics. Understand the environment you operate in and how it influences you.
- Communications. Making sure you get your point across.
- Human relations. Understand the "people" aspects or human
factors and dynamics. This includes things like negotiation, pragmatism
etc
I am not sure if you can teach all of them, but few courses that can help (in my opinion) include:
- Presentation Skills - While getting the architecture and
technology right is what matters, if you can't explain it to the
different stakeholders you're toast.
- Strategic Planning - This has to do with the vision thing I
expect architects to manifest. Note that having a vision should not be
confused with future-proofing a solution. future-proof means excess
work not needed. Having a vision is knowing where you want to end - it
can still be perfectly valid to completely re-write your applications
along the way
Project Management While the architect is not the
project manager (mostly anyway), I think understanding the constraints
coming from the project management point of view is very important.
Since most environments call for a mix of agile and formal disciplines
(hey, you've got to be pragmatic). I would train architect both in
SCRUM and RUP (or some other formal methodology)
Also while not
all environments needs this I would give an 2 days overview of
important standards. The first would be IEEE 1471, which defines a
standard for documenting software architectures. I would also teach ISO
90003 and CMMI.
It should be noted that the ISO 90003 is much
better than the previous incarnation (ISO 9003) as it basically lets
you define what you want to do to cover the different areas. The
standard just helps you make sure you think about the various parts of
project management (requirements, environment etc.). For instance I
demonstrated how key areas of 90003 can be mapped to SCRUM to get it
approved on my last project.
Languages, Design and PatternsI would want the .Net/Java architect training program to include at least 2 of the following languages:
Ruby,
Scala,
Erlang,
F#,
Python ,
Groovy ,
OCamlThe
reason for this is that these languages have different design goals
than .NET and Java so learning them gives you additional perspectives
and broaden your horizons for other ways of thinking (even if you don't
use them in your project directly). You might have noticed that there's
no .NET or Java training here. The reason for that is that's a
prerequisite as far as I am concerned. You should master at least one
Object
Oriented principles - hopefully aspiring architects already know this.
However, I often see people who discovered some of the principles by
themselves but haven't heard about all of them.
I am talking about
principles such as Liskov Substitution Principle , Open Closed
Principle, Single Responsibility Principle , IoC containers, Don't
Repeat Yourself and YAGNI (I summarized my opinion on most of them in
this paper)
The next step is to cover some design issues like
Domain Driven Design, UI Design, Database modeling, Database alternatives l(after all the
database is dead, right? )
Advanced
design patterns - When most people hear the term design patterns they
think about the GoF patterns. There are however literally hundreds of
design patterns. Some of them are even worth learning :) . For instance
there are patterns for
concurrent and parallel systems like Proactor, Reactor Half-sync/Half-Async etc;
Workflow patterns like Cancelling partial Join, Recovery Action etc;
SOA patterns (ok, so I am still working on that :) )
Architecture Workshops
Another important part of the training, in my opinion, is to do some
workshops and actually try to apply some of the material covered.
- Architecture Evaluation - workshop 2-3 days - It is probably
worthwhile to delve a little on scenario based evaluation techniques
such as LAAAM and ATAM. While I prefer evaluating architecture in code,
the scenario based thinking is very valuable for eliciting
architectural requirements
- Distributed Systems Architectures workshop - I'll expand on this in the next post
Lastly, there are also a few miscellaneous subjects like
architect 101,
the SPAMMED architecture framework , Agile architecture,
Behavior Driven Design , common frameworks (though hopefully this would not be needed ) like Spring/Spring.Net, Hibernate/NHibernate, iBatis etc.
PS
Note that there are a few architect training programs available out there
One is offered by the Software Engineering Institute (SEI)
and includes a 6 courses. SEI program seems to be focuses on formal
sides of architecture as it includes courses on documenting software
architecture and ATAM (You can see an old presentation I have on ATAM
here)
Dana Bredemeyer also offer architect training.
Dana offers several workshops that cover the software architecture profession.
TOGAF (which is more of an enterprise architecture framework) offers both
a certification and coursesLastly, IASA is considering creating a software architect program and
has a few courses in developmentIf you know any others I'd be happy to hear about them