<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5119025</id><updated>2012-01-23T21:57:20.428+01:00</updated><title type='text'>Hitchhiker's Guide to Software Architecture and Everything Else - by Michael Stal</title><subtitle type='html'>If you are a software engineer: DON'T PANIC!
This blog is my place to beam thoughts on the universe of Software Architecture right to your screen. On my infinite mission to boldly go where (almost) no one has gone before I will provide in-depth coverage of architectural topics, personal opinions, humor, philosophical discussions, interesting news and  technology evaluations.

(c) Prof. Dr. Michael Stal</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default?start-index=101&amp;max-results=100'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>190</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5119025.post-7360686696884029635</id><published>2012-01-07T14:45:00.001+01:00</published><updated>2012-01-07T14:45:59.555+01:00</updated><title type='text'>Trapped</title><content type='html'>DSLs are currently being promoted by a large number of activists. If you ever read the seminal Pragmatic Programmers book, you'll also find such a recommendation there. So, will the software engineering universe soon turn into a paradise?Let me tell you two examples from industrial practice:Once upon a time, in the logistics domain, a smart and lazy software engineer introduced a new language just for himself, in a very ad-hoc manner. When they saw the result, all his colleagues got very excited about the concept and started extending the language for their own purposes. The language inevitably grew and grew. Soon, an increasing number of system parts were depending on the language. Unortunately, when our smart inventor reached a high age, he had to leave and let his colleagues alone. But now, there was no one left in the company who really understood the language concept and its realization. It is claimed that the language keeps still growing. Other theories assume the system had to be completely rewritten in the meantime.In another universe and another time, another software engineer was convincing his fellows to introduce DSLs. All the IT dwarfs went crazy inventing their own languages. Yes, they even made competitions who could come up with the most fasinating or useful language. After a while, the DWARF software system was nothing but an ocean of languages.  Only wizards were able to generate a working solution. When a furious dragon (= customer) attacked their town, everything imploded. No one has a clue where the remains of the dwarf town are located.What can we learn from these failures?DSL design is (like) architecture design. An ad-hoc language will lead to design erosion, and cause more harm than good in the long run. DSLs represent strategic design tools that should only be in the hands of experienced designers.There are purposes for which DSLs are a perfect fit. But there are also circumstances where they shouldn't be applied. Overdoing it increases accidental complexity.It is like component-based re-use. Each DSL should only have one responsibility.Plan to grow the DSLs systematically, refactor it and verify its correctness. Communicate with all stakeholders that are affected by the DSL.Consider the design choices for the language syntax. Should it be a text-based language, a graphical language, or both? Mind the XML hell - long, long ago almost everyone was striving for XML based languages. But in some &lt;irony&gt; rare &lt;/irony&gt; contexts XML made writing configurations and documents ineffective, uncomprehensible, and tedious. I've seen systems wirh thousands of XML files.Let experts build and grow languages.It is amazing how (often) our discipline gets addicted to all kinds of panacea. Once you are lost in the buzzword jungle, all systems and stakeholders will suffer fom DSL paranoia.DSLs are an awesome means for boosting productivity. However, used by the wrong persons or with the wrong motivations, it is easy to shoot yourself in the foot.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7360686696884029635?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7360686696884029635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7360686696884029635' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7360686696884029635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7360686696884029635'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2012/01/trapped.html' title='Trapped'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-523699122573154106</id><published>2011-10-12T23:22:00.001+02:00</published><updated>2011-10-12T23:22:16.184+02:00</updated><title type='text'>Architecture Governance</title><content type='html'>In a large project a product line is developed that supports multiple smart phones. The platform development team puts all code in its super magical configuration management system. Whenever one of the phone teams starts with a product development, it extracts the platform code from the CM system, and adapts it to its own needs. With other words, even the core assets (i.e., the platform itself) are modified. Of course, the platform team is not aware of all these activities. C'est la vie.&lt;br /&gt;&lt;br /&gt;This is an example for reuse, albeit one which rather serves as a war story. How come? Imagine, the next version of the mobile platform is going to be developed. How can the domain engineers ever evolve a system that was modified by various product development groups in different ways?  The product line has been literally transformed in a bunch of one-off applications by unsystematic reuse. One approach to prevent such architectural war stories is what we call Architecture Governance. &lt;br /&gt;&lt;br /&gt;Architecture Governance is a systematic approach for managing architectures and controlling all modifications in order to ensure quality and sustainability. This holds for all modifications, those for developing the system and those for evolving it. &lt;br /&gt;&lt;br /&gt;But who is in control? On one hand, there should be an architecture control board in charge of the technical architecture, and on the other hand, another control board should be in charge of the business and business strategy - Luke Hohmann once coined the terms "tarchitecture" and "marchitecture" in this context.&lt;br /&gt;&lt;br /&gt;It s important to think about governance in general. Architecture governance is no island. It must be balanced with IT Governance, SOA Governance, and other classes of governance. Governance is about preferring control and monitoring over trust.&lt;br /&gt;&lt;br /&gt;WTF does "control" mean? In the product line example, it means we need to introduce an owner of the platform. And we need someone responsible for business &amp; strategy. Only these two "persons" are allowed to decide about modifications of the platform in terms of business and architectural sustainability. Of course, the business control board is supervising the architecture control board. Eventually, it is the business that drives the development.&lt;br /&gt;&lt;br /&gt;For architecture control, guiding principles should provide policies for modification and evolution. Obviously, the internal and external quality of the system as well as its expected behavior must never be compromised. That's why we need tools to check and enforce policies, tools to assess the architecture, and test suites to obtain respective information. This is where monitoring comes in. By the way, "tools" in this context also include reviews. And mind the gardening activities! How can a system be systematically prepared for modification. This is where reengineering and in particular refactoring become important.&lt;br /&gt;&lt;br /&gt;But there are even more details to bother about:&lt;br /&gt;&lt;br /&gt;We need to address legal and regulatory issues. Any change must not violate such standards. Think of safety features for medical products  as an example.&lt;br /&gt;&lt;br /&gt;It is important to care about quality of service. Assume, a modification leads to a breakdown of KPIs or SLAs.&lt;br /&gt;&lt;br /&gt;Don't ignore or neglect quality attributes in general. Does a modification influence sensitivity or tradeoff points? Will it introduce new risks?&lt;br /&gt;&lt;br /&gt;An issue might also be patent scanning. Is there any new code introduced such as an Open Source Software that violates intellectual property rights?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But it is not only about tools. It is also about a governance process as well as assignment of responsibilities to roles and persons. For example: Who is allowed to change, configure, update, or add what and when. What measures are necessary in order to guarantee quality and sustainability. How does information flow between the different actors. What happens in the case of policy violations. &lt;br /&gt;&lt;br /&gt;Note: This does not only hold for product lines but also for one-off applications. Unsystematic modification almost always leads to potential problems, because of unwanted side affects, accidental complexity, and lack of transparency.&lt;br /&gt;&lt;br /&gt;What does this imply for the design of new architectures? It is the same issue: we need a business owner, an architecture owner, a design and implementation strategy, test-driven development, refactoring, and so forth. I happen to have introduced all these topics already in my blog :-) Modifying and evolving a system is only a special case of designing it. &lt;br /&gt;&lt;br /&gt;By the way: An agile development process supports architecture governance in that its iterative incremental approach already introduces control and monitoring points. &lt;br /&gt;&lt;br /&gt;In practice, there are many ways to deal architecturally with architecture governance. I cannot describe all of them for the sake of brevity. But let me give you some examples:&lt;br /&gt;&lt;br /&gt;Using the Layers patterns in a strict sense helps to protect subsystems. Think about Safety segregation.&lt;br /&gt;&lt;br /&gt;Clean Coding represents a good way to make control and monitoring easier.&lt;br /&gt;&lt;br /&gt;Well documented software architectures are easier to modify and control.&lt;br /&gt;&lt;br /&gt;There are many architectural means to foster governance. &lt;br /&gt;&lt;br /&gt;Keep in mind that architecture governance is not about controlling architects or developers. Instead, governance helps architects and developers to keep in control. It requires additional efforts but its RoI is very high. Ignoring governance leads to project failure, overcomplex systems, buggy implementations, and design erosion. And eventually to dissatisfied customers and users (and dissatisfied architects and developers). Don't let the software govern you. Govern the software!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-523699122573154106?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/523699122573154106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=523699122573154106' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/523699122573154106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/523699122573154106'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/10/architecture-governance.html' title='Architecture Governance'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8716738779696288169</id><published>2011-10-06T23:02:00.001+02:00</published><updated>2011-10-06T23:03:50.573+02:00</updated><title type='text'>Steve Jobs, 1955  -  2011</title><content type='html'>Born in 63, I had the great opportunity to grow up with personal computers. Even around the Eighties Woz and Steve Jobs were already legends for their visionary minds and creations. I liked the first LISAs and Macs but unfortunately could't afford to buy one. &lt;br /&gt;&lt;br /&gt;When Steve had to leave Apple in 1985 he created the NeXT which has been an extraordinarily successful machine, not so much from a business perspective but from a creative one.&lt;br /&gt;&lt;br /&gt;But his popularity exploded eventually after Steve Jobs rejoined Apple as CEO. Steve Jobs stands for creativity, vision, courage, leadership, charisma. He honestly lived and worked literally day and night for Apple and its users. In contrast to many competitors he gave products not only functionality but personality and style.&lt;br /&gt;&lt;br /&gt;What only few people know is that Steve also had a strong influence on software. Not only on UI topics but also on programming languages, operating systems, and many other aspects.&lt;br /&gt;&lt;br /&gt;I personally have never been an Apple "fan boy" before I bought my first iPod, but now I love their products. However, I must confess that other mothers also have beautiful daughters. Nonetheless it is evident that Apple has always been the driver of amazing innovations that were frequently copied by competitors.&lt;br /&gt;&lt;br /&gt;That's the reason, why I want to thank you, Steve. Many things we take for granted simply wouldn't exist without you. I fell deep respect for you and your work. I am sure, you'll always be unforgotten as one of the leading personalities in the IT Hall of Fame. And I really hope, your spirit will always persist within Apple. &lt;br /&gt;&lt;br /&gt;The last thing I learned from you, although this has been a sad and bitter experience is: Carpe Diem! And that we should see the people behind and in front of all these nice products.&lt;br /&gt;&lt;br /&gt;Send my greetings also to Doug Adams. So long, and thank you for all the apples!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8716738779696288169?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8716738779696288169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8716738779696288169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8716738779696288169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8716738779696288169'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/10/steve-jobs-1955-2011.html' title='Steve Jobs, 1955  -  2011'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5242832954849556289</id><published>2011-09-20T17:38:00.001+02:00</published><updated>2011-09-20T17:39:38.966+02:00</updated><title type='text'>Using War Stories</title><content type='html'>For the education of software architects we are using war stories to emphasize important learnings. The whole curriculum is based on the mantra of learning from failure. Errare humanum est! Thus, it is important to see what can go wrong and how to deal with it in a better way. Everyone of us architects knows a whole bunch of war stories from the own career. I also caused failures, but learned from them. It is basically the same like children when they learn to walk. They'll fail but keep on trying until they eventually succeed. It is not a shame to think about own failures. Some cultures force people to always appear perfect which is a bad fundament. As we all encounter failure, it is better to learn what exactly went wrong and why instead of just hiding it from others and ourselves. When we educate architects we do not just teach them theory but also and even more practice. As Einstein once said, "in theory, theory and practice are the same. In practice they aren't."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5242832954849556289?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5242832954849556289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5242832954849556289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5242832954849556289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5242832954849556289'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/09/using-war-stories.html' title='Using War Stories'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6492908382732195330</id><published>2011-09-16T22:13:00.001+02:00</published><updated>2011-09-16T22:13:45.189+02:00</updated><title type='text'>Fractal Design</title><content type='html'>&lt;p&gt;If you are going to design a system, you basically need to identify prioritized main use cases and quality attribute scenarios among other forces to design the system. Together with a problem domain model that shows the inner constituents, and a context model that integrates the system into its environment, the design can evolve in a evolutionary way. As a result of the design activities, architects are able to introduce subsystems as well as their relations according to functional or qualitative drivers. And, of course, interfaces start to appear, each of them defining one specific and explicit role of the subsystem.&lt;/p&gt;  &lt;p&gt;A subsystem is itself integrated into an environment – the enclosing system under development. So the subsystem can also act as a system. Thus the same principles apply for the subsystem acting as a system itself – you may even define use cases and quality scenarios for the subsystem with use cases and scenarios being derived as a subset of the “outer” use cases and scenarios. After this step, “subsubsystems” are created, often coined “components”.&lt;/p&gt;  &lt;p&gt;What we do here is applying the same design principle in a top-down manner. &lt;/p&gt;  &lt;p&gt;But is it useful or possible to apply the principle infinitely? No, because at some level the solution domain is shining through. Solution domains tend to introduce their own composition techniques such as assemblies, bundles, EJBs, services, classes and objects. If the top-down design approach reaches this level, designers must map the architecture artifacts to the solution domain. Maybe, we should call this level architectural twilight zone or the problem-solution-boundary &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh5.ggpht.com/-XWpHpUXsK8A/TnOt-JPdjcI/AAAAAAAAAH8/uN1kUVxpPaQ/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#333333" size="2"&gt;Side remark: To overcome the twilight zone, we could introduce DSLs and use Model-Driven Software Development.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As a rule of thumb, we typically obtain 2 sublevels (subsystems, subsubsystems) as architects. If less, the design is too abstract and vague. If more, we are introducing too many details.&lt;/p&gt;  &lt;p&gt;One of the core challenges in this context is the fact that there might be different strategies to view a domain and thus different ways to cut a system into subsystems. &lt;/p&gt;  &lt;p&gt;Partitioning a system into subsystems independent of the hierarchy level is influenced by functional aspects and the problem domain. Thus, subsystems should introduce meaningful subdomains of the surrounding problem domain. With other words: methods like Domain-Driven Design together with some extensions can help nicely. &lt;/p&gt;  &lt;p&gt;No matter what you do, there will always be crosscutting qualities and topics. The same observation can be made when structuring an organization into divisions, departments, groups. Have you ever seen an organization without overlapping units? The introduction of crosscutting concerns may introduce new sub^&lt;sup&gt;n&lt;/sup&gt;systems, add new interfaces or even change their implementation depending on the invasiveness of the concrete concern. Each concern can be considered a subordinate view mixed into the subsystem respectively its domain.&lt;/p&gt;  &lt;p&gt;Architecture design is basically fractal design up to two levels of depth. The priorities of use cases and quality scenarios as well as their properties (strategic versus tactical) define how and in which order the functional model needs to be refined hierarchically by integrating scenario-based views. &lt;/p&gt;  &lt;p&gt;Of course, one person’s solution domain can be another person’s problem domain which is why exceptions to the aforementioned rule might apply.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6492908382732195330?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6492908382732195330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6492908382732195330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6492908382732195330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6492908382732195330'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/09/fractal-design.html' title='Fractal Design'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-XWpHpUXsK8A/TnOt-JPdjcI/AAAAAAAAAH8/uN1kUVxpPaQ/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5302591028453366701</id><published>2011-09-08T12:36:00.001+02:00</published><updated>2011-09-08T12:36:38.442+02:00</updated><title type='text'>The Telephone Test for Software Architecture</title><content type='html'>We all know that a software architecture should reveal two properties among many others for an adequate internal quality:&lt;br /&gt;&lt;br /&gt;Simplicity implies that the software architecture only addresses inherent complexity without introducing accidental complexity. Since, there are typically several ways to solve a problem, there is no simplest architecture available. Instead, there rather are solution architectures that follow one specific solution path with a minimal number of artifacts. As some quotes propose, simplicity is achieved if you cannot take something away from your system without failing to meet its specification.&lt;br /&gt;&lt;br /&gt;Expressiveness implies that the artifacts of your architecture are easy to understand. That is, artifacts should have expressive names, and each responsibility should be assigned to one artifact. Thus, components with a multitude of responsibilities are often a bad idea such as are responsibilities spread across multiple components. However, it is particularly difficult to achieve the latter goal due to cross-cutting concerns. An additional step to achieve expressiveness is having role-based, explicit interfaces with concrete contracts.&lt;br /&gt;&lt;br /&gt;But how can you test simplicity and expressiveness? There is a good low-tech suggestion for doing this: Let a software architect explain the architecture to an engineer not involved in the project, for instance using a phone call. Limit the time to - let's say - 10 minutes. If the other engineer gets a good idea of the architecture, it is an indication that the architecture is simple and expressive. Of course, I am assuming that the software architect is a person good in communication as I expect from architects, anyway. &lt;br /&gt;&lt;br /&gt;Some might argue that design metrics could also help in this context. Indeed, metrics provide some insights. But we shouldn't forget that metrics analyze the structure, not the semantics. Thus, they are not capable of deciding about expressiveness.&lt;br /&gt;&lt;p class='blogpress_location'&gt;Location:&lt;a href='http://maps.google.com/maps?q=Eduard-Schmid-Stra%C3%9Fe,Munich,Germany%4048.127691%2C11.578741&amp;z=10'&gt;Eduard-Schmid-Straße,Munich,Germany&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5302591028453366701?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5302591028453366701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5302591028453366701' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5302591028453366701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5302591028453366701'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/09/telephone-test-for-software.html' title='The Telephone Test for Software Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1952888605737300038</id><published>2011-09-07T13:39:00.001+02:00</published><updated>2011-09-07T13:39:39.490+02:00</updated><title type='text'>Apples and Oranges</title><content type='html'>&lt;p&gt;How often do we hear statements like how immature software engineering is compared to other engineering disciplines? Of course, construction building is a very old craft where engineers could collect huge amounts of knowledge, methods, and experiences over thousands of years. &lt;/p&gt;  &lt;p&gt;On the other hand, there is a huge gap between traditional engineering disciplines and software engineering:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;While other engineering disciplines are focused on specific domains, software engineering is supposed to support countless problem domains.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is why we came up with technologies that are more general in terms of problem domains such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;UML&lt;/li&gt;    &lt;li&gt;Architecture Definition and Specification Languages&lt;/li&gt;    &lt;li&gt;Generic Design Patterns (GoF)&lt;/li&gt;    &lt;li&gt;Components and Services&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;However, there is a huge trap using such approaches. Due to their general and generic nature, they are far away from the realities of the problem domain. Thus, communication between software engineers and non IT-knowledgeable stakeholders does suffer.&lt;/p&gt;  &lt;p&gt;It is interesting how many experts still emphasize those general-purpose tools and technologies. So to speak, they are addicted to the One-Size-Fits-All drug.&lt;/p&gt;  &lt;p&gt;For instance, look at architecture description languages that introduce general components and connections. The problem is that for a concrete problem domain, such generality simply does not work. It is a difference, whether you are dealing with a medical imaging modality or a VoIP platform. Yes, we can … call all building blocks of such systems components or subsystems. And, yes we can … call all interaction paths connections. But, here we are unifying different concepts under one common umbrella.&amp;#160; &lt;/p&gt;  &lt;p&gt;What software people often forget is that there are two universes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the Solution Domain with all its supporting tools and technologies. In this domain, general-purpose approaches as the aforementioned make sense,&lt;/li&gt;    &lt;li&gt;AND the Problem Domain.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In the Problem Domain we can not naively leverage concepts like UML, Components or General Design Patterns. Instead, we need to follow a Problem Domain First Approach. Thus, it is necessary to start with concepts of the problem domain. What does that mean in practice?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Introduce DSLs and Domain-Driven-Design to cover the problem domain instead of relying on UML. As a matter of fact we can use the underlying meta-model of UML as a base. It is possible to evolve such a language in an iterative approach.&lt;/li&gt;    &lt;li&gt;Think about the basic building blocks not as components and subsystems, but use the terminology of the problem domain. You can define your own problem-specific components, subsystems, or services for this purpose. This is exactly what we did for a very large Enterprise Communications System.&lt;/li&gt;    &lt;li&gt;Consider the availability of Analysis Patterns for your problem domain and subdomains. Use them if available. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Building the Software Architecture then consists of mapping the problem domain to the solution domain. How could we do that? I mentioned the Onion Model several times. So steps could be:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Understand the problem domain and build a model of it jointly with domain experts&lt;/li&gt;    &lt;li&gt;Leverage use cases to understand what the system under development is supposed to deliver from a black-box view.&lt;/li&gt;    &lt;li&gt;Use the problem domain model to map the use cases to the problem domain artifacts introducing further functional aspects.&lt;/li&gt;    &lt;li&gt;Stepwise extend the architecture by using strategic quality-attribute scenarios with descending priorities.&lt;/li&gt;    &lt;li&gt;Prepare the architecture for tactical requirements by using the tactical quality attribute scenarios with descending priorities.&lt;/li&gt;    &lt;li&gt;Do all this just considering three abstraction levels to limit complexity.&lt;/li&gt;    &lt;li&gt;Apply architecture patterns to structure the overall system.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mind the Change! Unlike in many other disciplines, software is considered so soft that it should even support strategic late changes. This is like switching your project goal from creating a coffee machine to creating a power plant. Unfortunately, customers are rarely aware of this problem because they are being constantly told by sales and marketing that changes are no problem. Thus, make customers and maybe even more sales and marketing aware of this fact. And use an agile approach to embrace change. But also have courage to deny changes. This is another reason why the Problem-Domain-First approach is so important. How else could you know what changes or extensions are typical for a problem domain? Think of the tax legislation in your country. It is not helpful to only think of interception and extension hooks or Strategy pattern instantiations in this context. &lt;/p&gt;  &lt;p&gt;All general approaches for software engineering have their value and can be used as the underpinnings of your systems. But they should not be used for covering the whole software development from problem domain to solution domain. This is also what we can substantially learn from other engineering disciplines.&lt;/p&gt;  &lt;p&gt;Thus, don’t mix apples and oranges. Otherwise, the result may disappoint you.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1952888605737300038?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1952888605737300038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1952888605737300038' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1952888605737300038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1952888605737300038'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/09/apples-and-oranges.html' title='Apples and Oranges'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7428064852657944328</id><published>2011-09-04T13:36:00.001+02:00</published><updated>2011-09-04T13:40:32.880+02:00</updated><title type='text'>Emergence</title><content type='html'>As explained in my last posting, emergence is a powerful approach for solving some hard problems in a non-deterministic way. It's a kind of magic? Not really, it is more an architecture pattern.&lt;br /&gt;&lt;br /&gt;What do we need for implementing emergence?&lt;br /&gt;&lt;br /&gt;We require &lt;br /&gt;&lt;br /&gt;a set of active agents,&lt;br /&gt;a (set of) communication mechanism(s),&lt;br /&gt;a common goal the agents implicitly or explicitly share,&lt;br /&gt;an environment,&lt;br /&gt;cooperation strategies of agent (optionally),&lt;br /&gt;a method to determine when to stop (optionally).&lt;br /&gt;&lt;br /&gt;The agents are active in that they execute some functionality in order to reach a goal or subgoal. They communicate with other agents to transfer information. And they recognize when their work is done or when they should stop.&lt;br /&gt;&lt;br /&gt;There is a lot of possible variation here:&lt;br /&gt;&lt;br /&gt;Agents might all share the same role (behavior) or they may have different roles.&lt;br /&gt;Agents might be organized in a peer-to-peer fashion or hierarchically.&lt;br /&gt;Agents might share the same goal or have individual or role-based goals.&lt;br /&gt;Control might be distributed across all agents, or only be assigned to one or a multiple of them. &lt;br /&gt;Agents might be preinstantiated at start-up or adapt their number or roles according to environmental conditions or achievement (being born, living, dying).&lt;br /&gt;Agents might be able to give life to new agents. They may also be able to terminate other agents, even themselves.&lt;br /&gt;There even could be some environmental conditions that result in death or birth of agents.&lt;br /&gt;Communication might be one-to-one or one-to-many or abide to any other message exchange pattern.&lt;br /&gt;Communication might be synchronous or asychronous.&lt;br /&gt;Agents might adapt their behavior including communication due to environmental changes or interaction with other agents.&lt;br /&gt;Which implies, the environment might change.&lt;br /&gt;Agents might "move" in their environment.&lt;br /&gt;There could also be diverse neighbor environments.&lt;br /&gt;&lt;br /&gt;In a Map-Reduce system we have a controlling agent and subordinate agents. The controlling master might instantiate slaves depending on problem complexity. Goal of the system is to reach a common goal such as finding all specific entities in an environment. The master communicates with the slaves and provides a subgoal to each of them. The slaves solve the subgoal and may act as masters for their subgoal, thus recursively applying the pattern. Slaves send their findings back to their master which then recombines partial results to the common result.&lt;br /&gt;&lt;br /&gt;In Leader-Followers, the leader is always the controlling agent. When it receives an information from its environment, it promotes a follower to become the leader, and switches its role to worker. A worker who is done with a job, switches its role into follower and enters the followers list.&lt;br /&gt;&lt;br /&gt;All these systems reveal emergent behavior. And this also resembles swarms like ant populations. There are different roles such as queen, warrior, worker, etc. The population's goal is to sustain by ensuring the survival of the population and their offspring as well as giving birth to new populations. When searching and locating food sources, ants use pheromons for communication. They show warrior strategies for fighting enemies. And they always adapt to their environment in terms of food, war, weather conditions. Ants might even adapt distribution of their roles such as creating more warriors when necessary. The whole population appears as a kind of smart creature.&lt;br /&gt;&lt;br /&gt;A human might also be considered as a whole consisting of smaller agents (cells) and this is how evolution actually developed complex life forms.&lt;br /&gt;&lt;br /&gt;And if you think about it, the Web itself is just an emergent system.&lt;br /&gt;&lt;br /&gt;When we are going to build such an emergent system, we need to consider all these aspects defined above such as roles, hierarchies, communication styles, goals, controls, environment, adaptation, cooperation strategies.&lt;br /&gt;&lt;br /&gt;One promising way to implement such systems are Actor-based approaches.&lt;br /&gt;&lt;br /&gt;If we had a toolkit for emergent system that allows to configure the different variation points, we could play around with the concept. Akka is one of the excellent frameworks that could serve as a base for such a toolkit.&lt;br /&gt;&lt;br /&gt;So, eventually emergent systems are developed using emergent design approaches. Until then, there is a large journey ahead of us.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7428064852657944328?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7428064852657944328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7428064852657944328' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7428064852657944328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7428064852657944328'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/09/emergence.html' title='Emergence'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2706653067255373031</id><published>2011-08-31T12:47:00.001+02:00</published><updated>2011-08-31T12:59:42.188+02:00</updated><title type='text'>The Whole is more than the Sum of its Parts – Creating Complex Systems from Simple Entities</title><content type='html'>&lt;p&gt;The Internet represents an ubiquitous infrastructure that enables complex systems such as clouds, SOA-based systems, e-mail, or Web 2.0 applications. Despite of its overall complexity, the basic ingredients of the Internet are rather &amp;quot;simple&amp;quot; and easy to understand. Think of parts like TCP/IP, HTTP(S), HTML, URIs, DNS, IMAP, SMTP, REST, or RSS, to name just a few. &lt;/p&gt;  &lt;p&gt;Another example though not software-related is Lego. Children (and adults :-) can build the most sophisticated systems from very simple Lego bricks. And even in biological systems like ant populations or in physical systems - like the whole universe itself - we can make similar observations. &lt;/p&gt;  &lt;p&gt;Infrastructures such as the Internet with high inherent complexity consist of such simple constituents. Why are we still capable of providing new kinds of innovative software applications based on technologies that are more than 20 to 40 years old? What do all of these examples have in common? &lt;/p&gt;  &lt;p&gt;Well, they basically combine simple building blocks with a set of interaction-, adaptation-, and composition-mechanisms. Moreover, they allow to compose higher level building blocks (from simpler parts) that support their own abstract set of interaction, adaptation, and composition. Think of Layered Architecture! And mind the fact that the building blocks in this context are not only static entities but (might) also include behavioral aspects making them active objects. &lt;/p&gt;  &lt;p&gt;Interestingly, the composition or interaction of parts leads to cross-cutting functionality that wouldn't be possible otherwise. Most recently, there have been scientific papers claiming that the human personality is &amp;quot;just&amp;quot; a result of cross-cutting behavior - but that what I'd like to mention as an interesting side-remark.&lt;/p&gt;  &lt;p&gt;In general, approaches are summarized under emergent behavior or emergence when we speak about (inter)active parts. In this context, I am considering the term &amp;quot;emergent&amp;quot; as a broader concept also including passive ingredients. &lt;/p&gt;  &lt;p&gt;But why should we care? What can we software engineers learn from the principle of emergence, evolution or composition? &lt;/p&gt;  &lt;p&gt;It is possible to build very complex systems based on simple building blocks. That is very obvious because eventually all physical systems are composed from simple elements. However, we need to address the challenge, how, why and when to apply such composition techniques to our own software. And we also need to address the issue of quality. &lt;/p&gt;  &lt;p&gt;While it is theoretically possible to build every system using very small, atomic parts, this would lead to unacceptable development efforts, bad maintenance and low expressiveness. Think about using a Turing Machine for implementing a word processor. Hence, the gap between the behavior we are going to provide in resulting applications respectively artifacts and the basic building blocks used for their construction shouldn't be too wide. &lt;/p&gt;  &lt;p&gt;On the other hand, we’d like to support the creation of a whole family of applications in a given domain. (If you are knowledgeable about Product Line Engineering, this should sound familiar.)&lt;/p&gt;  &lt;p&gt;There are three fundamental possibilities to construct such systems:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Bottom Up, i.e., creating a base of entities that spans a whole domain. We can view the domain as a “language” with the base acting as a kind of “grammar”. &lt;/li&gt;    &lt;li&gt;Top-Down: i.e., thinking about what kind of artifacts we’d like to create and trying to figure out a set a set of entities from which these artifacts can be composed via one or more abstraction layers. &lt;/li&gt;    &lt;li&gt;Hybrid: maybe, the most pragmatic approach which combines Top-Down and Bottom-Up. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To make things even more complex, the “grammar” could be subject to evolution which might change the “grammar” and/or the language.&lt;/p&gt;  &lt;p&gt;Very theoretical, so far. Agreed, so let me show a practical show case.&lt;/p&gt;  &lt;p&gt;A prominent example is the Leader-Followers pattern. Roughly speaking, an active leader is listening to an event source. Whenever the leader detects an event, it turns into a worker and actively handles the event, but only after it selected one of the followers to be the next leader. As soon as the “new born” worker has completed its event handling activity, it turns into a follower. And then the whole story might repeat again. This pattern works nicely for applications such as a logging server. Its beauty stems from the fact that active agents comprise a self-organizing system, leading to non-deterministic behavior.&lt;/p&gt;  &lt;p&gt;Engineers often prefer centralized approaches with one or more central&amp;#160; hubs or mediators. That is, we like to introduce a central control. There must be someone or something in control to achieve a common goal, right? &lt;/p&gt;  &lt;p&gt;In fact, this assumption is wrong. In some cases, it is necessary to have a control, but this control does not need to be a central component but can be distributed across several entities. Let me give you a real life example:&lt;/p&gt;  &lt;p&gt;Some day, you are visiting a shopping mall. After having a nice time, you are leaving the mall. But you forgot where you left the car. Thus, all members of the family start searching in the parking lot until someone locates the car and notifies everyone else. Normally, at least in some families, this search activity would be rather unorganized. Or each family members would agree to search in a specific area, but no one would prescribe how the search pattern looks like. Nonetheless, all share a common goal and will finally succeed. (Let me just assume, the car hasn’t been stolen :-)&lt;/p&gt;  &lt;p&gt;An architecture concept that resembles this situation could be active agents that communicate with each other using a blackboard. Just assume, we are building a naive web crawler. On the blackboard you could write down the link where you’d like to start the web crawling. An agent takes the token (i.e., the link) and starts to search the Web page. On the Web page it finds further links which it writes to the blackboard, each link representing a separate token. Now, all active agents can access the blackboard, grab a token, analyze the corresponding page and write the links they find on the blackboard. But, wait a moment, when does the search end? The problem boils down to the question how we handle duplicates (Web sites the system already parsed). For this purpose, we could introduce a hash table where we store pages the agents have already visited. If an agent reads a token which represents an already visited URL, it just throws the token away and tries to grab another one. As soon as there are no more tokens available, the crawling is completed. &lt;/p&gt;  &lt;p&gt;Sometimes, we also need (single or multiple) controls. For instance, in most Peer-to-Peer networks, the search for a resource starts using an initial set of controls that aggregate information about their environment. But the search or the registration of resources are conducted in a self-organizing and decentralized way. Note, that the introduction of controls or hubs is not necessary for functional reasons, but helps to increase scalability and performance.&lt;/p&gt;  &lt;p&gt;A Sensor (or Robot) Network is an example, where we might even need no control at all. Just consider the case, that we distribute sensors across a whole area to measure environmental data. Even if some of these sensors fail, we are still able to gather sufficient data, given a certain amount of sensors is available. But, of course, one could argue, that there must be someone central who monitors al the sensors. By the way, the network of weather stations is an excellent show case for this strategy.&lt;/p&gt;  &lt;p&gt;To summarize this part, in such scenarios with active components, we can have the full range of centralized control, decentralized control, or no control at all. Anyway, the important thing is that each active entity has a predefined goal and there is communication between these entities either using a Peer-to-Peer communication style or one (or more) information hub(s).&lt;/p&gt;  &lt;p&gt;As already mentioned, we could add evolutionary elements by letting the agents adapt to changing environments using strategies like survival of the fittest and uncontrolled modification. Genetic algorithms are the best example for this architectural style. Like in neuronal networks, the main challenge for a software engineer is the fact that such systems mostly reveal their functionality using cross cutting and non-deterministic behavior. This makes it difficult to create such systems in a top-down way. Most of the time, such systems are composed bottom-up leveraging a “configurable” evaluation function. With the evaluation function, systems can measure how good the results are and adapt dynamically until the results reach a required level of quality.&lt;/p&gt;  &lt;p&gt;Now, I’d like to move to more “conventional” software architectures. As we know, all software architectures are idiomatic, usually providing a stack of idiomatic layers and composition of idiomatic subsystems&amp;#160; and components. (Whatever, “subsystem” and “component” mean in this context :-) Note, that this also holds for patterns and especially for pattern languages.&lt;/p&gt;  &lt;p&gt;By&amp;#160; “idiomatic” I am referring to the point that architectural artifacts offer a kind of API which define syntax and semantics from their consumers’ perspective. By composing these artifacts, higher level functionality can be addressed using lower level functionality. Artifacts at the same level cooperate to achieve composite behavior.&amp;#160; Again, we are introducing entities, composition, and communication. Cross cutting behavior addresses composites that reveal specific functionalities or quality attributes. To this end, even quality attributes could be considered functional: they may imply additional functionality or comprise cross cutting behavior.&lt;/p&gt;  &lt;p&gt;With other words, in software engineering we face the challenge of hierarchies and composition&amp;#160; respectively integration of languages. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The more complex these languages are, the more complex it is to use them. &lt;/li&gt;    &lt;li&gt;The more complex the compositions of languages are, the more complex it is to integrate them into a whole. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Thus, we need to balance between complexity of these languages and the complexity of their composition. This balance of forces can be achieved by building an appropriate hierarchy of he languages.&lt;/p&gt;  &lt;p&gt;Thus, yet another definition of “Software Architecture” could be:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Software architecture is about the hierarchical integration of artifacts that balances the idiomatic complexity of its constituents and the complexity of their composition. In order to meet the given forces, it addresses strategic design decisions using different viewpoints, prepares mandatory tactical aspects, and abides to common guiding principles.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The secret of good design is appropriate partitioning in core parts which are then composed to build a whole such that it can easily address inherent complexity, without introducing accidental complexity. In a platform or product line, this can be really challenging, because we must enable application engineering to create each member of the product family by using the common parts, while allowing to deal with variability. As we are dealing with hierarchies of artifacts, this turns out to be even more complex. When extending the scope of a product line, there might be implications on all aspects of the reference architecture.&lt;/p&gt;  &lt;p&gt;The goal of architecture design should be to design complex functionality by composing simple artifacts in a simple way. The tradeoff is between complexity of artifacts and complexity of composition as well as finding an appropriate hierarchical composition. All approaches such as AOP, model-driven design, Component-Based Development, or SOA try to achieve this nirvana. However, introducing basic artifacts and composition techniques is beneficial not sufficient. Instead, it is crucial to cover the problem domain and its mapping to the solution domain.&lt;/p&gt;  &lt;p&gt;This is what all the well-known definitions of Software Architecture typically forget to mention :-)&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2706653067255373031?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2706653067255373031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2706653067255373031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2706653067255373031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2706653067255373031'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/08/whole-is-more-than-sum-of-its-parts.html' title='The Whole is more than the Sum of its Parts – Creating Complex Systems from Simple Entities'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6107266249892657317</id><published>2011-08-25T16:29:00.001+02:00</published><updated>2011-08-25T16:29:22.021+02:00</updated><title type='text'>Make it explicit</title><content type='html'>In development projects one of the main challenges comprises clarifying the requirements and assumptions. Knowledge about the problem (and solution) domains proves to be critical in this context. How else would a software engineer understand the requirements? I claim that one of the most critical problems is implicit knowledge which is knowledge taken for granted by some stakeholders, e.g., the customers, but not known to others. &lt;br /&gt;&lt;br /&gt;An appropriate approach to address at least parts of this issue is to conduct a KANO analysis where engineers will define features all customers would expect, but also excitement features that may surprise the users in a positive way. Take the iPhone as an example: Expected features include the ability to make phone calls, to maintain a contact list, or to send SMS messages. If a product lacks one of these, customers will be disappointed, but even the coverage of all expected features won't make a customer excited. Excitement features of the iPhone include the Touch Screen and the possibility to add functionality using apps. It is important to mention that today's excitement features will become expected features in the future. Obviously, developers of a mobile phone need to know the expected features in order to prevent any disappointment. However, in many cases these expected features are only known implicitly which works fine if you are familiar with the problem domain, but leads to trouble if this is not the case. Thus, the first conclusion is to make these requirements explicit. The introduction of a problem domain model and of a feature tree prove to be excellent ways to understand the domain and the features as well as their dependence and interaction. &lt;br /&gt;&lt;br /&gt;So far I mentioned functional aspects, but implicit assumptions about quality attributes should not be neglected either. Suppose, it would take minutes to find a person in the contact list or to initiate a phone call. Such cross-cutting concerns may not appear in the requirements specification, but nonetheless are essential for successful development. Thus, also the quality attributes must be made explicit which does not only turn out to be important for design but also for the establishment of a test strategy and test plans. &lt;br /&gt;&lt;br /&gt;Besides requirements the business strategy and business case often make implicit assumptions such as the kinds of users or market segments or features or future evolution. Whenever architects are not informed about these assumptions, they can neither check their feasibility or validity nor can they provide the right solution. How could someone provide a solution for a vaguely understood problem anyway? Conclusion: always make sure that you obtain sufficient information from management. And mind the ambiguity problem! For instance, I once asked several product managers about their usability requirement. It turned out that every single one of them had a completely different understanding of usability. This is the reason, why a common model and effective communication are so important.&lt;br /&gt;&lt;br /&gt;Another problem area is the mapping from the problem domain to the solution domain. Developers may use particular technologies, because they find these the right ones for addressing the problem. Or managers may prescribe technologies without knowing their implications. Architects may enforce decisions without giving a rationale. And developers may make implicit but wrong assumptions about the architecture.Thus, making decisions based on explicit assumptions is inevitable for successful design. For example, architects and developers should verify assumptions and document decisions explicitly. If you don't believe this, think about gifts you gave other persons based on your assumptions.&lt;br /&gt;&lt;br /&gt;A benefit of explicit information is that it can be cross-checked and allows traceability. In a development project all the groups of stakeholders should not consider themselves as disconnected islands. Instead, they should share knowledge by using effective communication strategies. Also, they should make their decision process and decisions transparent to the other groups. Basically, it is like having one common information repository where stakeholders may have different views. But these different views must map consistently to each other. This is the reason why architects are the right persons to enforce making everything explicit. In particular, the development of platforms and product lines is very sensitive to implicit information, because failure to consider this information has an impact on many applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Posted using BlogPress from my iPad&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6107266249892657317?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6107266249892657317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6107266249892657317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6107266249892657317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6107266249892657317'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/08/make-it-explicit.html' title='Make it explicit'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6810606665502190669</id><published>2011-04-21T12:25:00.001+02:00</published><updated>2011-04-21T12:25:07.411+02:00</updated><title type='text'>SEACON 2011 Architecture Day  in Hamburg</title><content type='html'>&lt;p&gt;This year the German event &lt;a href="http://www.sigs-datacom.de/index.php?id=seacon2011"&gt;SEACON 2011&lt;/a&gt; is taking place from 27th to 29th June. The venue is the Atlantik-Hotel in Hamburg, a very nice location famous for its permanent guest, German Pop/Rock Tycoon Udo Lindenberg.&lt;/p&gt;  &lt;p&gt;I was responsible to organize the architecture day on 29th June. And we managed to get excellent speakers covering a lot of interesting&amp;#160; architecture topics. Jim Webber from Thoughtworks is going to give the keynote address: “Lessons learned in large HTTP-centric Systems”. Attendees will also have the opportunity to visit half-day tutorials on Dynamic Software Analysis (Johannes Siedersleben) and Software Quality (Erik Dörnenburg). In addition, the &lt;a href="http://www.sigs-datacom.de/seacon2011/konferenz/konferenzprogramm.html"&gt;agenda&lt;/a&gt; is filled with excellent talks by renowned speakers and practitioners.&lt;/p&gt;  &lt;p&gt;For software architects this will be a highlight in 2011. The event SEACON Architecture Day might become an established event on Software Architecture. It is up to you. Attend and enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6810606665502190669?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6810606665502190669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6810606665502190669' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6810606665502190669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6810606665502190669'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/04/seacon-2011-architecture-day-in-hamburg.html' title='SEACON 2011 Architecture Day  in Hamburg'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5209425004425975026</id><published>2011-02-05T00:17:00.001+01:00</published><updated>2011-02-05T00:22:43.607+01:00</updated><title type='text'>The hard way to Distribution and Concurrency</title><content type='html'>&lt;p&gt;The Web is hot. So is Cloud Computing. And Multicores might even become hotter. Whenever there are additional capabilities, software developers will immediately start to exploit them. Why else do we always require new hardware for new operating system versions? &lt;/p&gt;  &lt;p&gt;In particular, dealing with distribution and concurrency is pretty simple. Just start a thread in Java or .NET, and the force will be instantaneously with you. Or click on some menu items of your favorite tools to distribute functionality elegantly across the network.&amp;#160; &lt;/p&gt;  &lt;p&gt;Unfortunately, many projects fail in providing distributed or concurrent functionality. How comes all these nice programming platforms and libraries don’t suffice? &lt;/p&gt;  &lt;p&gt;And the answer of course is software architecture. Especially for cross-cutting concerns such as distribution and concurrency the programming level offers the wrong abstraction layer. It is not sufficient to address concurrency programmatically. Foremost, we must address the architectural layer, then the design aspects before thinking about programming idioms.&lt;/p&gt;  &lt;p&gt;Let me investigate concurrency as an example. For this purpose I’ll consider different domains with respect to concurrency:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In home automation systems there is a large variability of different services with various durations. Think about switching lights on/off, or controlling the climate system. Typical home automation systems are reactive systems that use a central component for event notification and event handling. As many events might occur in parallel,&amp;#160; the Concurrent Reactor Pattern offers the right architectural approach.&lt;/li&gt;    &lt;li&gt;For an image processing system we need a completely different architecture. Here, image data is created, processed and transmitted between subsequent components.&amp;#160; Hence, the Pipes &amp;amp; Filters architecture pattern with concurrent filters fits nicely into the domain.&lt;/li&gt;    &lt;li&gt;When dealing with control systems or Web Servers with asynchronous events arriving all the time that must be handled in a synchronous way, a Half Sync / Half Async architecture provides a message queue which decouples the synchronous from the asynchronous world. &lt;/li&gt;    &lt;li&gt;In Servers that process single messages such as Log Servers, a Leader/Followers patterns applies perfectly. The leader is in charge of receiving the next event. If it receives an event, it promotes one thread in the followers chain to the next leader, while becoming itself a worker that after work completion will become a follower. A nice example for a self-organizing infrastructure.&lt;/li&gt;    &lt;li&gt;In a warehouse system we’d like various actors to store or load items at the same time. Thus, the warehouse core cannot only provide one single interface. Instead, multiple interfaces operate on the warehouse core logic. They can synchronize their data by using a Half Object plus Protocol pattern.&amp;#160; &lt;/li&gt;    &lt;li&gt;In a mobile network or an AI system multiple, concurrent agents may need to coordinate their activities to achieve a common goal. For such systems, patterns like the Blackboard pattern are applicable.&lt;/li&gt;    &lt;li&gt;For divide-and-conquer processing the Master/Slave pattern helps structuring our Map/Reduce problem to sets of interacting components, some of them responsible for the Map, most of them responsible for the Reduce functionality.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We got various example domains, all of which had to use a different concurrency architecture approach due to their diversity of forces such as existence of sessions, variety of services, synchronization necessities, and many others.&lt;/p&gt;  &lt;p&gt;Our first conclusion is: different problem contexts require different concurrency architectures. There can’t be a single concurrency architecture for all problems. In addition, we need to deal with architectural issues &lt;strong&gt;before&lt;/strong&gt; introducing finer grained design aspects.&lt;/p&gt;  &lt;p&gt;For the next step of refinement it is essential to solve issues at the design level. Think about Half Sync / Half Async where we need to determine&amp;#160; how to organize the synchronous worker threads of the Half Sync layer and how to let them access the shared queue of incoming events in a coordinated way, to address only a few aspects. &lt;/p&gt;  &lt;p&gt;Therefore, we need to ask questions like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;How will we manage shared resources such as threads or connections? Thread pools and other design tactics come into my mind.&lt;/li&gt;    &lt;li&gt;How do we efficiently deal with sharing and locking of data? We might use monitor objects or Software Transactional Memory approaches.&lt;/li&gt;    &lt;li&gt;How can concurrent entities communicate with each other and coordinate each other? Actor-based programming&amp;#160; patterns are one option here.&lt;/li&gt;    &lt;li&gt;How can we efficiently access data? Think about caching, eager evaluation and lazy evaluation?&lt;/li&gt;    &lt;li&gt;Is there a way to efficiently handle I/O? Asynchronous processing such as Proactors, Active Objects, or Asynchronous Completion Tokens come to our rescue.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Basically, all of those design aspects are on the component level. Fortunately, there are many design patterns that help us in implementing this abstraction level.&lt;/p&gt;  &lt;p&gt;Our second conclusion: whenever we conduct fine grained design (i.e, tactical design), design patterns and design tactics offer guidance.&amp;#160; &lt;/p&gt;  &lt;p&gt;Only in the final step, we are going to leverage all programming language and library features. Eventually, we end up using methods for thread creation and management, mutexes, agents, semaphores, and all those other idiomatic features modern programming platforms provide.&lt;/p&gt;  &lt;p&gt;In the best case, a DSL and/or a library could help increasing the abstraction layer of the implementation by hiding details of the underlying hardware system. Think about OpenMP, PLINQ, Akka STM, and many other solutions.&lt;/p&gt;  &lt;p&gt;What we learn from this example is that cross-cutting concerns like infrastructure or quality attributes require a sound fundamental architectural approach which is refined using design tactics and design patterns, and then implemented with the available tools offered by the programming platform. For instance, creating a concurrent solution requires an architecture-first instead of an implementation-first approach. For the same reason, SOA approaches favor interface-first over implementation-first styles.&lt;/p&gt;  &lt;p&gt;Sure, programming might be much more enjoyable and exciting than drawing architectural boxes and lines, but at the end ad-hoc implementation of cross-cutting concerns causes more harm than fun. And don’t forget: creating a sound software architecture is sexy – at least for software engineers.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5209425004425975026?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5209425004425975026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5209425004425975026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5209425004425975026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5209425004425975026'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/02/hard-way-to-distribution-and.html' title='The hard way to Distribution and Concurrency'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1045401328056057783</id><published>2011-01-23T16:35:00.001+01:00</published><updated>2011-01-23T16:35:53.498+01:00</updated><title type='text'>Where we can meet</title><content type='html'>&lt;p&gt;I will participate in the OOP Conference 2011 in Munich which starts on Monday, the 24th January.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tuesday morning I will talk on &lt;em&gt;Design Tactics&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Tuesday evening I will present &lt;em&gt;Actor-based Programming&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Wednesday evening my &lt;em&gt;Scala&lt;/em&gt; tutorial will take place&lt;/li&gt;    &lt;li&gt;Tuesday and Thursday I will also have the Meet-the-Editor events each 30 minutes where you might talk to me in my role as editor-in-chief of JavaSPEKTRUM&lt;/li&gt;    &lt;li&gt;Tuesday evening I will act in the IT Stammtisch organized by the unique and nice Nikolai Josuttis. So, if you would like to see me very uncomfortable, you should definitely attend this panel show.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I will also attend the QCon 2011 in London (7th to 11th March) where I will&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;have a tutorial on &lt;em&gt;functional programming with Scala and F#&lt;/em&gt; on monday&lt;/li&gt;    &lt;li&gt;host a track on &lt;em&gt;Software Architecture Improvement&lt;/em&gt; at wednesday (talking myself in the introductory session)&lt;/li&gt;    &lt;li&gt;present the &lt;em&gt;Onion model&lt;/em&gt; in Floyd’s track about models&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Hope to meet you!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1045401328056057783?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1045401328056057783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1045401328056057783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1045401328056057783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1045401328056057783'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/01/where-we-can-meet.html' title='Where we can meet'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3931303866310786542</id><published>2011-01-16T00:46:00.001+01:00</published><updated>2011-01-16T02:00:24.960+01:00</updated><title type='text'>The Beauty and Quality of Software</title><content type='html'>&lt;p&gt;In my spare time I often enjoy digital photography. Capturing people, streets, buildings, wildlife or landscapes involves a lot of fun and is a relaxing experience. After taking photos and when processing images with Adobe Lightroom, I am used to differentiate those pictures I consider decent from those I am going to throw away. The obvious question for a photographer is whether there are some guidelines or indicators that help taking better photos and also help rating photos. And, indeed, there actually are such quality indicators.&lt;/p&gt;  &lt;p&gt;Independent of the content of a picture, there exist some common properties I consider important when rating a photo e.g.,&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does the photo clearly focus on one specific object or does it rather confuse by showing various things without any focus? &lt;/li&gt;    &lt;li&gt;Is the horizon depicted horizontally? Even if there is only 1 degree deviation the human watcher won’t feel comfortable. &lt;/li&gt;    &lt;li&gt;Are there some interesting kinds of symmetries in the image? &lt;/li&gt;    &lt;li&gt;Does the photo contain a chaos of many different things or does it concentrate on one specific detail? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are many other indicators for the internal quality such as the rule of thirds. Interestingly these rules are really helpful. However, they are not proofs for good or bad quality of a photo, but mere indicators. For example, sometimes deliberately breaking symmetry or violating the rule of thirds may lead to much more expressive photos. No rule without exception.&lt;/p&gt;  &lt;p&gt;How does all of that relate to software architecture? The question is whether we can apply some indicators to get a first impression about the internal quality of an architecture, something I consider as architectural beauty. When I once read Dave Cutler’s book on the design of Windows NT, it really opened my eyes. All parts of the architectural design were easy to understand. The architecture was expressed in a kind of idiomatic way, where the same principles have been applied to different parts. The partitioning of the overall operating system in different layers and components with clear responsibilities helped me grasping the details easily. On the other hand, I have also experienced bad architectures with over-generic designs, where it took me weeks to get the slightest clue what they were trying to implement. So are there quality indicators for good or bad design?&lt;/p&gt;  &lt;p&gt;Obviously, there must be such indicators. Otherwise, the widespread addiction to metrics wouldn’t make too much sense. Metrics combined with CQM tools (CQM = Code Quality Management) and Architecture Analysis tools can reveal issues such as insufficient cohesion or coupling. Metrics however must always be considered relative! For instance, there is no rules of thumb whether 5k LOCs are good or bad. It might be good in one case, but bad in another. Applying the McCabe Cyclomatic Complexity can lead to wrong conclusions (If you don’t believe me, calculate the cyclomatic complexity of an Observer scenario with 80 observers). Why is that? Metrics operate on syntactic level. Thus, they can only measure syntactic properties. They are not capable of dealing with semantics. Hence, all metrics must be set into the right context by human engineers. While a coupling of 5 itself might not be too valuable, the increase of the coupling from 5 to 10 after one iteration reveals a potential problem.&lt;/p&gt;  &lt;p&gt;One of the more absolute indicators are architecture smells which also help figuring out the necessity of architecture refactoring. Let me give you a few examples:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;dependency cycles&lt;/strong&gt; between architectural components imply that you cannot understand, test, change one component without addressing the other component in the cycle. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Inexpressive component names&lt;/strong&gt; prevent engineers to understand the architecture without digging deeper into more details. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;component responsibility overload&lt;/strong&gt; means that a component is implementing too many different responsibilities preventing clear separation of concerns. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Unnecessary indirection layers&lt;/strong&gt; do not only negatively affect developmental qualities such as maintainability or extensibility but also operational quality attributes such as performance. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Implicit dependencies&lt;/strong&gt; often lead to a shift between desired architecture and implemented architecture. One notable example is violating strict layering, thus introducing unnecessary und unknown dependencies. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Over-generic design&lt;/strong&gt;:&amp;#160; When there are dozens of Strategy patterns (or proxies, visitors, etc.) in your design, this often denotes a clue for a potential problem lurking in your design. A Strategy pattern basically means “I have no clue but want to defer the decision to another place”. Applying many Strategy patterns mean, the architects had absolutely no clue. Instead of opening the system according to the Open/Close principle for some variability points, they applied Strategy unsystematically. This is the best way to achieve less flexibility and less performance. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Architecture smells can often be detected using architecture analysis (tools). If we think about these smells, we recognize that there must be something more that gives us indication about the internal quality/beauty of an architecture. Something which resembles which I addressed in the introduction on digital photography. &lt;/p&gt;  &lt;p&gt;I can not speak for the whole community of software architects in general. However, here are the quality indicators that help me assessing a software architecture:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: A software architecture is simple when it addresses the requirements with the least possible number of design artifacts&amp;#160; (KiSS) and does not introduce accidental complexity by additional entities (aka design pearls) that are not required. There is the old rule: “an architecture is simple when you cannot remove anything without failing to meet some requirements”. Hence, a simple architecture is not a simplistic architecture. To achieve simplicity, one guideline is to root all architecture decisions in the architecturally relevant requirements. You can measure simplicity of an architecture using a simple test: ask the architect to introduce the architecture within at most 30 minutes only using a flip chart to draw the architectural baseline. I know, this also depends on the presentation skills of the architect but that’s another story. Nonetheless, a listener should be able to repeat the core architectural decisions. There is one caveat: Some “smart” software developers try getting rid of complexity by just hiding it in the guts of the implementation. For example, a system could theoretically consist of one single object with a doIt method. This is like some of the ESB and EAI products that just hide the mess behind some wrappers. This, however, does not introduce simplicity, but rather moves complexity to lower layers. The same simplicity test would definitely reveal that kind of bad trick. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Expressiveness&lt;/strong&gt;: An architecture is expressive when you can easily grasp the purpose of all entities and the whole architecture by looking at the architecture baseline. I don’t claim an architecture needs to be self-explanatory such as understanding it by just looking at the UML diagrams. This can’t work because diagrams fail to reveal leading design principles and the rationale of design decisions.&amp;#160; What I mean: Just looking at the architecture design should give you enough understanding to grasp the whole architecture vision by diving into some additional details. How can you achieve expressiveness? First of all, give expressive names to all entities, so that another engineer gets the idea. For all components make sure:&amp;#160; It should do one thing but it should do it right. And each component should only have one responsibility. Assigning lots of responsibilities to the same component leads to inexpressive architecture as do all responsibilities crosscutting through your design. Role-based design is a perfect tool to assign role-specific interfaces to components. Speaking about interfaces: Also add a contract to each interface that specified what (kind of protocol) the interface expects and what it provides. Aspect-oriented development may help dealing with crosscutting concerns. Another important issue in this context is to make all dependencies explicit in the architecture. That’s a no-brainer because implicit dependencies are simply not visible in the design so that an architecture reviewer won’t recognize them easily. Expressiveness can be verified by a simple telephone test. Ask an architect to explain his/her architecture via a 10 min telephone call. After the call you should be able to understand at least the coarse grained architecture. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Behavioral Symmetry&lt;/strong&gt;: Suppose, you got are viewing sequence&amp;#160; diagrams of a transaction-based enterprise system. Although there is a method invocation called beginTransaction, you’ll recognize no endTransaction, commit or rollback. Won’t you feel uncomfortable with such an observation? Symmetry of behavior is a good indication, something might be wrong with the design. As it holds for all quality indicators, it is not a proof for bad quality. For example, in a distributed system the remote server might allocate memory for a new result object, while the client is supposed to free it after use. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Orthogonality or Structural Symmetry&lt;/strong&gt;: I once had to review a software architecture where they used several solutions for the same problem. Hence, I required to understand all these various solutions to understand the architecture. Structural Symmetry means, you are leveraging the same solution for all instances of the same problem. Even if MFC provided a handful of string classes, you should not use all of them in the same application. This is particularly essential when dealing with crosscutting concerns such as error handling, tracing, logging. Imagine, each developer would introduce his/her own error management strategy. In this case you need to cope with broken structural symmetry. To avoid structural asymmetry, you may introduce guidelines and conventions&amp;#160; for crosscutting concerns or recurring problems. It is not sufficient to provide documents, though, but you should also enforce these guidelines actively in the project. When reviewing software architecture, ask for such guidelines and ask how they have been enforced. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Pattern Density&lt;/strong&gt;:&amp;#160; We all have heard about the “not invented here” syndrome and may even have experienced it ourselves. Patterns capture the knowledge of experts how to solve recurring problems. Thus, a wise engineer would rather apply a pattern instead of coming up with a homegrown solution. The more patterns have been used, the better. Wait a second! That is not quite true. In this context, by using&amp;#160; patterns I mean using them whenever they solve a problem you really have. Not like in the “hammer-and-nail” syndrome with an attitude like the following one: even I got no need for Observer in my system, I will change the system so that I can apply the only pattern I know. Applying patterns is not trivial. Patterns are not Lego building blocks you can add to your architecture. Rather, you need to adapt your design, map the pattern roles to your architecture and integrate all the patterns properly. In some hotspot areas of an architecture design, the same components may contribute to several patterns. Thus, even high pattern density could be malicious if the patterns have&amp;#160; not been integrated properly. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Emergence&lt;/strong&gt;: In an ant colony all individual elements reveal very “simple” behavior, but the whole colony seems to act smartly. Another example for the whole being more than the sum of its parts (Aristoteles). The Internet and the Web&amp;#160; are also good examples for this kind of emergence. They consist of simple elements such as Ethernet, TCP/IP, DNS, HTTP, SMTP, RSS which serve as the building blocks for a complex ecosystem. Emergence also means decentralization and self-organization. Many architects are completely addicted to centralization. Often when quality attributes such as scalability, availability or fault-tolerance have high priority such as in Cloud or P2P Computing, decentralized approaches are much more effective. Think of the Leader/Followers patterns as an example which introduces a self-organizing pool of threads that reduces resource competition by only allowing the leader to access the joint event source.&amp;#160; Another indirect consequence of emergence is that you shouldn’t strive for fat APIs that implement all methods, but just simple APIs providing methods with which you can&amp;#160; easily implement more advanced functionality. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Partitioning and Spacing&lt;/strong&gt;: The responsibilities in your design should be mapped systematically to components and subsystems. For example, subsystems should only contain functionality that reveals some semantic coherence. That is, the closer two different kinds of functionality are semantically related, the closer should they be aggregated in the design. Layering is a good way for separating different levels of abstractions with top layers being more abstract (close to the problem domain) and low layers being less abstract (close to the solution domain). Basically, you need some kind of systematic top-down design and problem decomposition so that the resulting subsystems and components will offer an adequate partitioning of responsibility and a sufficient spacing (different kinds of concerns should be mapped to different subsystems, layers, components). In addition, architecture entities should offer a clean partitioning into role-based interfaces instead of relying on one bloated interface per component or subsystem. An example could be an additional interface that enhances the testability of the system.&amp;#160; Or an interface for configuring a component. If possible commonly used interfaces such as configuration interfaces, should be defined uniformly for the whole system. Otherwise, configuration would need to deal with many different configuration approaches (see the Component Configurator Pattern for more details). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are definitely&amp;#160; some more qualities I could add to this list of indicators. However, in my experience these aforementioned quality indicators already offer you an excellent mental tool for assessing the internal quality and thus the beauty of a software architecture. &lt;/p&gt;  &lt;p&gt;Mind the gap:&amp;#160; As mentioned several times, each of these quality indicators just serves as an indicator, not as a proof. But if the design under consideration does not provide one of these internal quality properties, the responsible architects should at least offer you a good and convincing rationale why this property is missing. &lt;/p&gt;  &lt;p&gt;Needless to say, that quality indicators should not only be leveraged for assessing existing software designs. Likewise, you should consider them valuable when designing a new software architecture. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3931303866310786542?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3931303866310786542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3931303866310786542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3931303866310786542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3931303866310786542'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/01/beauty-and-quality-of-software.html' title='The Beauty and Quality of Software'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-596989151708217924</id><published>2011-01-07T23:39:00.001+01:00</published><updated>2011-01-07T23:40:31.116+01:00</updated><title type='text'>Qcon 2011 in London: 100 British Pounds discount</title><content type='html'>&lt;p&gt;I will host a track on Architecture Improvements at QCon 2011 with a row of excellent speakers. In addition, I will give a talk on Software Architecture Design as well as a tutorial on Functional Programming with Scala and F#.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="speaking-at" border="0" alt="speaking-at" src="http://lh6.ggpht.com/_Lz31k3xpEB0/TSeWJik4emI/AAAAAAAAAG4/WHNlUv8tRX0/speaking-at%5B3%5D.jpg?imgmax=800" width="154" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;If you’re interested in attending the conference just use the promo code STAL100 for receiving a 100 BP discount.&lt;/p&gt;  &lt;p align="left"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;Here’s the URL for the &lt;a href="http://qconlondon.com/"&gt;QCon&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-596989151708217924?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/596989151708217924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=596989151708217924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/596989151708217924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/596989151708217924'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/01/qcon-2011-in-london-100-british-pounds.html' title='Qcon 2011 in London: 100 British Pounds discount'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_Lz31k3xpEB0/TSeWJik4emI/AAAAAAAAAG4/WHNlUv8tRX0/s72-c/speaking-at%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7513014581452449095</id><published>2011-01-03T06:52:00.000+01:00</published><updated>2011-01-03T06:52:38.422+01:00</updated><title type='text'>Small is better - really?</title><content type='html'>In different panels and discussions I often hear programming languages such as Scala are not a good idea due to their "language size". Less syntax is better to learn a language which is why, for example, Clojure is superior to Scala. Often, the proponents of this argument point to languages such as C++, C# or Java as negative examples. Resembles software architecture a lot, doesn't it? Honestly, I object to this conclusion. Take languages such as brainf*ckr or the Turing Machine. Very simple syntax indeed, but would you consider them powerful languages? Definitely not! In my viewpoint it is not the size that matters but the noise-to-signal-ratio. If you need to express a solution for a given problem, how much efforts do you need to find and articulate the solution using the language idioms. The more appropriate and concise idioms are available that support your solution, the better. As in software architecture some qualities are important when judging languages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;appropriateness to solve a specific class of problems&lt;/li&gt;&lt;li&gt;simplicity &lt;/li&gt;&lt;li&gt;expressiveness&lt;/li&gt;&lt;li&gt;orthogonality of language structures&lt;/li&gt;&lt;li&gt;approach of least surprise&lt;/li&gt;&lt;li&gt;emergence of features&lt;/li&gt;&lt;li&gt;avoiding implcit dependencies and influences (such as temporaries in C++)&lt;/li&gt;&lt;li&gt;availability of powerful language idioms&lt;/li&gt;&lt;/ul&gt;By the way, these qualities are also applicable to software architectures. This is no surprise because we are speaking about architecture of programming languages here.&lt;br /&gt;&lt;br /&gt;There are several conclusions we could draw from that qualities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Even if a language offers most of these qualities at the beginning, it might erode over time when it is evolved in an unsystematic or improper way&lt;/li&gt;&lt;li&gt;Several problem classes might imply various languages. So, we have to choice between a best of breed approach for each problem class as a polyglot programmer would prefer, or we could try to indentify some multi-paradigm language. Note, however, that multi-paradigm languages are those which are often very likely to erode, especially when more and more paradigms are added as an afterthought. However, this is a risk, not a predefined fact. For instance, multiple paradigms were cleanly integrated in Scala from day one, while C++ started as a structured language with&amp;nbsp; additional classes.&lt;/li&gt;&lt;li&gt;The language core might be excellent but it won't be helpful if the support libraries and tools do not reveal the same qualities mentioned above. A fool with a tool is still a fool. So, even for the best languages, APIs of libraries need to integrate tightly.&lt;/li&gt;&lt;li&gt;If you follow the Pragmatic Programmers advice to learn a new language every year, you will also be able to extend your knowledge about new solution paradigms and idioms. This will drastically improve your skills as programmer and architect. Mind the gap: it is not sufficient to just learn a language, you also need to practice it for a while. &lt;/li&gt;&lt;/ul&gt;Unfortunately, using multiple languages at the same time might be a bad idea. I experienced a project where people invented their own language. After a while, only one expert was left who did understand the language which was not that comfortable for the organization. If you plan to use multiple languages, think about the problems at hand. If they can be better solved using multiple languages, go for it, but make sure, several people in your team know these languages. If possible, use languages that run on either the DLR/CLR or the JVM, because then they will share the same SDKs and (often) even the same tools. Make yourself aware that you&amp;nbsp;ARE already using several languages such as HTML5, XML, SQL, DSLs&amp;nbsp;and so forth. We already have become polyglot programmers. But that doesn't mean you should strive for large numbers of languages in your projects. &lt;br /&gt;&lt;br /&gt;Personally, I have learned a lot of languages in my career: x86-ASM, Pascal, Modula2, VB, Java, C, C++, Ruby, Lisp, Clojure, Scala, C#, F#, CIP, Haskell, D, Axum, ... All of these languages have their purpose and their strengths, but also their weaknesses and problem areas they cannot address well.&amp;nbsp;Some of them are large and easy to learn such as Scala, while others are small and difficult to learn such as Lisp which is why they invented Scheme :-)&lt;br /&gt;&lt;br /&gt;Size does not necessarily matter, the problem you are going to solve does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7513014581452449095?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7513014581452449095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7513014581452449095' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7513014581452449095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7513014581452449095'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2011/01/small-is-better-really.html' title='Small is better - really?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8405479571412785649</id><published>2010-12-23T12:49:00.001+01:00</published><updated>2010-12-23T12:51:20.903+01:00</updated><title type='text'>Books, books, books and tools</title><content type='html'>&lt;p&gt;In vacations I often dedicate some time to reading new interesting books as well as experimenting with programming languages. For a software architect I consider it essential to stay in sync with technology evolution. Honestly, I do not believe in ivory tower architects who just know UML and Powerpoint. So, what are my plans for this christmas season? &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;One of my favorites is Martin Fowler’s and Rebecca Parson’s book “Domain-Specific Languages”! This book explains DSLs but also educates how to practically leverage internal and external DSLs. &lt;/li&gt;    &lt;li&gt;From the Pragmatic Programmers I received “Seven Languages in Seven Weeks” by Bruce A. who provides a hands-on tour on Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. If you are a fan of programming languages, this is definitely a good read.&lt;/li&gt;    &lt;li&gt;Of course, I am also enjoying fiction books as well such as Michael Crichton’s “The Great Train Robbery”. I recently started to read Crichton’s novels and really like his work. In addition, I am reading some layman books on the universe and quantum physics. I am currently&amp;#160; too lazy to reread Feynman’s Lecture Notes on Physics.&lt;/li&gt;    &lt;li&gt;For my preparation for OOP 2011 where I will give three talks, one on actor-based programming, one on Scala, and one on design tactics, I have programmed a lot with Scala 2.8.1, sbt, and Akka.&amp;#160;&amp;#160; But I am also currently trying to dive more into Clojure. I used Lisp in the university, recovered my knowledge a few years ago, and now starting to get familiar with Clojure. This is where monads come in. Interestingly, there are many definitions and explanations of monads but none of the is really decent. Maybe, I will give a try in the future, and also fail &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh3.ggpht.com/_Lz31k3xpEB0/TRM3VhmlOOI/AAAAAAAAAGo/Zp3mZLXozy8/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So many new things to learn in such little time. Unfortunately, the times are over where I could learn the whole JDK or .NET in a weekend. Software engineers have to get more and more focused. It is even impossible to keep yourself up-to-date with enterprise technologies alone, or concurrency techniques, or mobile computing, you name it. Nonetheless, systems are gaining more and more complexity, becoming bigger, using more technologies. Interestingly, we are always testing our limits. No matter how excellent our tools are, we try building systems that are more complex than our skills allow. With other words, technology and complexity are always ahead of us. Software architectures do not only fail to master inherent complexity but become beasts filled with accidental complexity. Our capabilities do not scale with our problems. Did I mention Henri Petroski’s book “Learning from Failure”. The essence of this book is that we always will go over the limits, but the best thing to survive is to learn from failure. This basically resembles what Thomas Kuhn once said about technology evolution and revolution.&lt;/p&gt;  &lt;p&gt;Fortunately, it also means a lot of fun to learn new things or technologies, try them out, learn their strengths and weaknesses, increase your mental toolset. It opens the horizon to some new ideas and ways. This is why learning is one of the most important skills for software engineers.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;So, what are your plans for the rest of this year?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8405479571412785649?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8405479571412785649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8405479571412785649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8405479571412785649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8405479571412785649'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/12/books-books-books-and-tools.html' title='Books, books, books and tools'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_Lz31k3xpEB0/TRM3VhmlOOI/AAAAAAAAAGo/Zp3mZLXozy8/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5595641086237062690</id><published>2010-11-19T17:46:00.001+01:00</published><updated>2010-11-19T17:46:04.085+01:00</updated><title type='text'>Understanding software architecture</title><content type='html'>&lt;p&gt;While creating software architecture is a&amp;#160; very creative activity which I really enjoy, analyzing existing software systems is much harder and happening frequently. &lt;/p&gt;  &lt;p&gt;There are several reasons for this observation:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Often, the designed and the implemented architecture differ dramatically. In these cases, the documents are nothing than fairy tales.&lt;/li&gt;    &lt;li&gt;In some cases, I am encountering a kind of documentation hell. The information surely can be found somewhere, but it is almost impossible to figure out what could be the right document. I am here to find not to search.&lt;/li&gt;    &lt;li&gt;Another “highlight” are insufficient abstraction levels in the documentation. No one can read end even less persons can understand an architecture document that covers 1000 pages. Likewise, the other extreme isn’t helpful. For example, I once received a software architecture document consisting of one page filled with UML diagrams.&amp;#160; &lt;/li&gt;    &lt;li&gt;What I really dislike are documents that only show the WHAT but not the WHY. However, I definitely need to know the rationale of all those decisions. All design pears that pop up from the void of the universe are worthless to all those mediocre reviewers who must understand them.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So how you could approach such an endeavor. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Firstly, get an idea about the domain, the development organization and the business, that is, the ecosystem, in which the software system lives.&lt;/li&gt;    &lt;li&gt;Get an overview of the coarse grained architecture, from the user view and the developer view. I prefer strategic architecture design documents, guidelines, programming conventions, presentation slides, and even marketing material for this purpose.&lt;/li&gt;    &lt;li&gt;Get a knowledge about the tools and technologies of the solution domains that have been used.&lt;/li&gt;    &lt;li&gt;Interview some designers and developers in order to understand the implemented architecture (and the designed architecture) as well as its weaknesses and strengths. The more documents additionally capture the design essence the better. Both information sources will provide you with a good idea about the architecture.&lt;/li&gt;    &lt;li&gt;Use architecture analysis tools to understand the internal quality of the systems (and also its pain points).&lt;/li&gt;    &lt;li&gt;Try to change or implement yourself in the codebase of the system to stay close to the ground and thus to reality.&lt;/li&gt;    &lt;li&gt;At the end, you should yourself be able to explain the architecture to other persons.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Basically, what you need to do to understand an existing software system is similar to conducting the first phases of an architecture review. &lt;/p&gt;  &lt;p&gt;Don’t be shy and ask any questions that come to your mind. Often, these Q&amp;amp;A settings help architects figure out potential problems in their design, and help you understand the architecture. So, it can lead to a Win-Win situation.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5595641086237062690?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5595641086237062690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5595641086237062690' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5595641086237062690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5595641086237062690'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/11/understanding-software-architecture.html' title='Understanding software architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3874378419108070412</id><published>2010-08-29T11:58:00.001+02:00</published><updated>2010-08-29T11:58:44.151+02:00</updated><title type='text'>Software Architecture Reviews</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Software Architecture Reviews represent one of the most important approaches for introspecting software design. The best way for introducing such assessments is to establish regular evaluation workshops in all iterations. Architects and designers will review the software architecture focusing on internal qualities such as unavailability of dependency cycles and quality attributes such as performance or modifiability. If they find any issues, they will define action items and means for getting rid of the challenges (also known as problems). My own experience shows that this is definitely the recommended way, because regular reviews will detect any issues as early as possible before they cause further harm such as accidental complexity or design erosion. If introspection tools such as Odasa or SotoArc are available, detecting internal quality issues is often surprisingly easy. And if architects compare quality attributes with architecture decisions in early stages, they will reduce the probability that an important nonfunctional requirement was neglected or designed in a wrong way. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, many architecture reviews are initiated very late. This makes problem detection and architecture refactoring much more complex. Nonetheless, such architecture reviews are always a good solution to get rid of architectural problems, especially when the organization could not handle such issues successfully in the development project. These reviews should have a clear scope. Otherwise, the review will take place for large time frames which is not acceptable in most cases. Scoping in this context means to define a main objective of the review as well as 2-3 key areas where potential problems supposedly lurk in the guts of the design. The result of such a "large" review should be a document with key findings, e.g., weaknesses and strength of the architecture. However, it should not only contain the weaknesses but also appropriate solutions for addressing these weaknesses. Some review methods don't consider solutions mandatory in such a report. I definitely do. Even more, I consider ways to get rid of the weaknesses the most important result of a review.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Such a report should reveal the following structure:&lt;br /&gt;&lt;/p&gt;&lt;ul style='margin-left: 38pt'&gt;&lt;li&gt;Scope of the review and review method&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Documents (project documents) and information used (for example:  interviews, test plans, source code, demos) &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Executive Summary&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Overview of the software architecture under review&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Findings and Recommended Solutions&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Summary&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While regular, iterative reviews can be conducted by project members such as architects and developers, larger review projects should be done by "external" reviewers. There are two main reasons for this recommendation: First of all, external reviewers often see more. And secondly, higher management representatives are often inclined to accept external recommendations more than the ones from their own project members. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Interestingly, an architecture review is not constrained to software architecture challenges. It might also reveal problems in the organization, development processes, roles and responsibilities, communication, technologies, tools, business. To be honest, only rarely the results will address design problems only. That is another reason why architecture reviews should have external reviewers.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There is a whole selection of different review methods such as CBAM, SAAM, ATAM documented in literature. We at Siemens have developed our own method called Experience-based Reviews. While the former 3 methods are scenario-based (which I will explain in a later blog post), experience based methods are driven by the experience of the reviewers and are less formalized. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Such a review normally consists of the following phases:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A Kickoff Workshop where reviewers and project stakeholders meet to introduce the review method, illustrate the software architecture, and define the review scope&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the Information Collection phase, all available information is collected by the reviewers such as documents, test plans, source code, demos. Further information is collected by conducting interviews with the project's stakeholders, 1 hour for each and constrained to one interviewee. Information is kept anonymous in order to establish a relationship of trust between reviewers and interviewees.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the Evaluation phase all information is evaluated. Strengths, weaknesses, opportunities, and risks are defined by the reviewers. So are all the possible solutions for the weaknesses and risks.  At the end the reviewers create a review report draft structured as mentioned above. They then send this report to all stakeholders, leverage their feedback, and disseminate the final report.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A Final Workshop helps to summarize the key findings and discuss open issues.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This approach works extremely well if the reviewers are experienced. We normally will use the Master/Apprentice pattern to educate architects how to conduct an experience-based review. Senior reviewers will lead the reviews and teach junior reviewers by training-on-the-job.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;All of these approaches define qualitative assessment methods. In addition, architects and developers should also leverage quantitative methods when actually creating design and implementation. Tools for quantitative assessment consist of but are not limited to feasibility prototypes, simulations and metrics.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Architecture assessment methods are a bit like testing or refactoring. Many engineers think they can survive a project without these disciplines. But in all but trivial projects this proves to be a wrong assumption. The more you invest in early and regular testing, refactoring, architecture assessment  efforts, the better your RoI will be. Do less in the beginning, pay more in the end!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  &lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3874378419108070412?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3874378419108070412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3874378419108070412' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3874378419108070412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3874378419108070412'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/08/software-architecture-reviews.html' title='Software Architecture Reviews'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4485735265868117525</id><published>2010-06-18T00:06:00.001+02:00</published><updated>2010-06-18T00:06:27.033+02:00</updated><title type='text'>I have been upgraded</title><content type='html'>&lt;p&gt;Because I got so many questions on this: Most recently, my name got a little bit longer. The University of Groningen in the Netherlands (RuG, Rijksuniversiteit Groningen) has appointed me Professor Extraordinarius. Thus, I am now member of the Bernoulli Institute of Mathematics and Natural Sciences where I will give lectures and more. &lt;/p&gt;  &lt;p&gt;If you now ask: this is in addition to my main profession at Siemens which by the way supported me in achieving the position. Of course, I am very glad to cooperate with Paris Avgeriou who is a professor himself at the RUG. Another personal friend and promoter, Jan Bosch, is member of the same institute. Needless to say, that Paris and Jan are internationally renowned software architecture experts with whom it is a lot of fun to work together. I am quite impressed by their knowledge and expertise, they also use to distribute to their students.&lt;/p&gt;  &lt;p&gt;My appointment was greatly supported by Nicolai Petkov, another professor at RuG, whom I really like and respect. After the deans of all Computer Science Instititutes in other Dutch Universities&amp;#160; had agreed to my appointment after checking my C/V and my References I finally received the appointment letter.&lt;/p&gt;  &lt;p&gt;The RuG is quite famous for its research on software engineering, in particular in Product Line Engineering. Not to forget all the RuG offspring such as Jan Ommering and a lot of other great Product Line gurus. I do not only enjoy that but also the Dutch mentality and great hospitality whenever I am in Groningen. Only a few weeks ago I’ve been there to give lectures to students as I already mentioned in my last blog post. &lt;/p&gt;  &lt;p&gt;Thus, I will be able in the future to support Ph.D students, master students as well as postdocs. They may learn from my experiences, but I will also learn a lot from them. You could call that a Win-Win situation. &lt;/p&gt;  &lt;p&gt;So that’s the big news. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4485735265868117525?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4485735265868117525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4485735265868117525' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4485735265868117525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4485735265868117525'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/06/i-have-been-upgraded.html' title='I have been upgraded'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3687232611656996609</id><published>2010-06-11T10:02:00.002+02:00</published><updated>2010-06-11T10:06:14.254+02:00</updated><title type='text'>Teaching Students in Software Architecture</title><content type='html'>This week I have been giving lectures on software architecture for master and PhD students at the Rijksuniversiteit in Groningen (RuG). It worked excellent and it was a lot of fun. I teached them systematic software architecture design, design tactics and introduced a pattern system for distributed and concurrent systems. What worked particularly well was the split into a presentation part and a tutorial part - each lasting 2 hours per day - where participants were designing example projects in groups of up to 5 people. This way, they would not only learn about architecture design, but also about group interaction. In fact, many problems in software architecture are caused by people issues such as lack of (efficient) communication.&lt;br /&gt;&lt;br /&gt;They will also get a group assignment and an individual assignment for the time until end of June.The former one will comprise completing the architecture design and providing an architecture description while the individual assigment requires students to create a design essay on an architectural quality (in the context of their example project). &lt;br /&gt;&lt;br /&gt;I received positive feedback that I did not introduce just a bunch of unrelated patterns but narrated a pattern story of how to apply patterns for the design of middleware and distributed systems. From my viewpoint, this is the best method to educate students that patterns are not just disconnected islands of code, at least they shouldn't be. Most of the power of patterns comes from using systems of patterns. Pattern languages would be even more attractive, but unfortunately there is only a bunch of them and the ones existing are really complex.&lt;br /&gt;&lt;br /&gt;For the lecturer it is important to be constantly available for the exercise groups during the tutorial parts. I got a lot of questions about architecture design, modeling and documentation. It is pretty close to architecture enforcement. You cannot simply throw an (exercise) specification over the fence and expect attendees to exactly understand all issues. Management by walking around is much more effective.&lt;br /&gt;&lt;br /&gt;As material for the course I relied on the excellent Software Architecture in Practice book, 2nd edition, by Len Bass,&amp;nbsp; Paul Clements and Rick Kazman and of course - needless to say - on our POSA book series (Pattern-oriented Software Architecture). Using POSA patterns is beneficial in that it shows&amp;nbsp; that the pattern community does not only depend on the GoF pattern book.&lt;br /&gt;&lt;br /&gt;In summary, the mixture of conceptual parts and exercise parts works nicely to educate students about software architecture.&lt;br /&gt;Looking forward to providing more lectures in ths future and keeping in touch with the students.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3687232611656996609?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3687232611656996609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3687232611656996609' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3687232611656996609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3687232611656996609'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/06/teaching-students-in-software.html' title='Teaching Students in Software Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5495002245990488069</id><published>2010-04-12T11:28:00.001+02:00</published><updated>2010-04-12T11:28:25.412+02:00</updated><title type='text'>Functional Programming</title><content type='html'>&lt;p&gt;In the last months I have intensified my skills in functional programming. My favourite programming languages have been Scala and F# so far. Only a few years ago I recovered my Lisp abilities when I had been ill for some weeks.&amp;#160; It is interesting how many functional languages currently evolve. Guess, it is closely related to the availabilty of virtual platforms such as the JVM and the CLR. No need to develop a whole bunch of APIs or IDEs anymore. just use the Java SDK or the .NET Framework Classes, and provide some plug-ins for Visual Studio, Eclipse, NetBeans, or any other IDE of your choice. A real paradise for language developers. Reminds me of the Eighties when all those OO languages appeared such as C++, Smalltalk, Objective C, or Eiffel. I anticipated several years ago that this would happen. Interesting, you might ask, but how is all this related to architecture? A lot if you ask me. Remember the book on object-oriented design patterns by Erich Gamma, Ralph Johnson, Richard Helm and the unforgettable John Vlissides. This book (as well as hopefully our POSA books) have changed the world in&amp;#160; that they brought software architecture in people’s minds. The same will happen through functional programming.&lt;/p&gt;  &lt;p&gt;Functional programming enforces another way of thinking. Functions are first class entitites that can be assigned to values, passed as arguments to higher-order functions, or just created anonymously (called: closures). In pure functional programming there are no variables anymore, just immutable values. All of this was already specified by Church &amp;amp; all in the Thirties.&amp;#160; While the first functional languages such as Lisp, ML were difficult to understand for everyday programmers, new functional languages deviate from the academic approach and turn into hybrid languages that integrate object-oriented features, and permit mutability by supporting imperative programming styles. &lt;/p&gt;  &lt;p&gt;Sometimes mutability is important such as for I/O and GUI operations or logging/tracing. But there are many situations where mutability is like shooting yourself in the foot. Think of race conditions in multithreaded applications. Most accidental complexity is caused by mutable state. No mutable state implies no race conditions. Or think of side-effects that make your application hard to understand and debug. These side-effects are simply missing in functional languages. Think of testing or validating your functionality. Guess why Joshua Bloch spends so much space in his book on Effective Java illustrating how to make Java classes immutable.&lt;/p&gt;  &lt;p&gt;In contrast to object-oriented approaches functions are used to abstract functionality and function composition is the basic means of composing artifacts. That’s a perfect extension to object oriented abstraction and composition.&amp;#160; Hybrid languages such as Scala use this combination to make building internal DSLs surprisingly easy. For instance, the Actor functionality looks like an integral constituent of the language, while in fact it is just a library. If you wonder what actors are: they can be considered abstract tasks or objects running on their own threads. They do not provide any possibility for reading or changing their internal state. The only way to communicate with actors is by exchanging messages´with them. If these messages are immutable values, there is no chance of side-effects.&amp;#160; What a perfect way for implementing multithreaded applications.&lt;/p&gt;  &lt;p&gt;Another famous example for functional features used to provide an internal DSL is LINQ (Language Integrated Query) in Microsoft .NET. Using extension functions, closures, anonymous types, and type inference helped to seamlessly integrate LINQ into languages such as C#.&lt;/p&gt;  &lt;p&gt;Sometimes you need to deal with state. Languages like Clojure also support Shared Transactional Memory, a good way to encapsulate all state changes within transactions. &lt;/p&gt;  &lt;p&gt;What makes the functional paradigma so effective, is it’s succinctness. As an example we’ll use F#:&lt;/p&gt;  &lt;p&gt;let rec fib x = &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if x &amp;lt; 2 then 1 &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else fib (x–1) + fib (x-2)&lt;/p&gt;  &lt;p&gt;let results = Array.map fib [| 1 .. 40 |]&lt;/p&gt;  &lt;p&gt;The code above introduces a recursive function for calculating fibonacci numbers, then builds an array containing the first fourty fibonacci numbers. Try this with Java, C# or C++.&lt;/p&gt;  &lt;p&gt;Many problems can be described in a much more natural way using functional features. &lt;/p&gt;  &lt;p&gt;Thus we already know several aspects where functional languages are beneficial for the architect:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;introducing internal DSLs&lt;/li&gt;    &lt;li&gt;Parallel and Asynchronous Programming (e.g, targeting Multicores)&lt;/li&gt;    &lt;li&gt;Implementing some parts of an architecture in a much more succinct way&lt;/li&gt;    &lt;li&gt;Improving testability&lt;/li&gt;    &lt;li&gt;Understandability of design (expressiveness, simplicity)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As mentioned previously, functional approaches do not represent a panacea. Neither does Object-Oriented Programming. But they&amp;#160; surely offer an excellent extension to imperative or object-oriented design and implementation. Consider them a perfect extension of Object-Orientation.&lt;/p&gt;  &lt;p&gt;It is time to follow the advice of the Pragmatic Programmers and learn at least one additional language per year. My recommendation: focus on functional languages for this purpose.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5495002245990488069?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5495002245990488069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5495002245990488069' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5495002245990488069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5495002245990488069'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/04/functional-programming.html' title='Functional Programming'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7275077823703357161</id><published>2010-03-29T21:13:00.001+02:00</published><updated>2010-03-29T21:13:13.942+02:00</updated><title type='text'>Implicit versus explicit</title><content type='html'>&lt;p&gt;In a very larg telecommunications application I was supposed to review, the software architects had introduced a strict layering to shield different abstraction of functionality from each other. One of the lower layers comprised the database system, while the topmost layer consisted of the application UIs. Whenever something in the DBMS layer changed, the UIs broke. This shouldn’t happen according to the software architecture document. Thus, I asked the UI developer whether he abided by the strict layering. His answer was no, because he got the order to optimize performance which required him to access the data directly. What we see, is a typical example of implicit design decisions. When designers or developers break the architecture or use it in an unanticipated way without communicating the issue to software architects, this will inevitably lead to severe problems which are typically hard or even impossible to detect.&lt;/p&gt;  &lt;p&gt;In another project the development organization built a GUI for a monitoring framework. After the application had been relaesed, customers started to complain about a feature they were expecting but which was missing. This illustrates what happens if requirements engineering or customers have implicit expectations. Unfortunately, these requirements change over the years. While 20 years ago almost every developer was satisfied with command line compilers and had to explicitly specify she would prefer more IDE-like environments, today this feature is considered an implicit requirement. You don’t need to mention it explicitely anymore. KANO-Analysis is a perfect tool for such investigations. For programming environments this is very obvious bút what if you’re working in a domain where you don’t know about all these hidden requirements. Thus, mind all invisiple traps.&lt;/p&gt;  &lt;p&gt;There are two conclusions we can draw from these examples:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;In a software development project, any information should be made explicit, even facts we normally believe every stakeholder should know. If communication among stakeholders is the most important asset in such projects, nothing shall remain implicit. Implicit information is unavailable information! &lt;/li&gt;    &lt;li&gt;In every project we need enforcement. Requirements engineering must enforce that the development team really knows and uses all requirements. In a specification all implicit requirements must be turned into explicit requirements, because implicit requirements are typically swallowed by black holes. Software architects must enforce the architecture by closely cooperating with developers and must ensure quality by closely cooperating with testers.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Work based on implicit information can only possibly work in small teams that use an agile approach and where every team member has an explicit knowledge of implicit information. But do you dare to take the risk that all information gaps are really closed?&lt;/p&gt;  &lt;p&gt;Always be an explicit software architect without a hidden agenda!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7275077823703357161?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7275077823703357161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7275077823703357161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7275077823703357161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7275077823703357161'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/03/implicit-versus-explicit.html' title='Implicit versus explicit'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3365964164865627831</id><published>2010-03-12T23:24:00.001+01:00</published><updated>2010-03-14T11:11:58.992+01:00</updated><title type='text'>Over the Fence</title><content type='html'>&lt;p&gt;It is surprising how many software architects still create their design, throw it over the fence, and then expect others to follow the divine strategies implicitely hidden behind the lines and diagrams.&lt;/p&gt;  &lt;p&gt;This behavior also holds for different teams with key developers or subsystem architects that are ought to coordinate design activities, while in practice they are happily inhabiting their isolated islands.&lt;/p&gt;  &lt;p&gt;I’ll never forget a telecommunications project where the architects had introduced excellent guidelines and a decent strategic design. However, I was called for an architecture review, because the implementation had turned out to be not quite decent, to say the least. When I searched for the root of all problems, it became clear very soon that no one in the project had really cared about any of the architecture guidelines. And even worse, the strictly layered architecture design had been seriously violated. For example, whenever the database schemas were evolved, the clients broke, although they were totally isolated from each other by a “firewall” of 3 layers. The key developer of the GUI told me in an interview, that he considered performance optimization as his primary directive so that it semed to be totally acceptable to directly access the database.&lt;/p&gt;  &lt;p&gt;We can learn from these war stories that good communication is the (most) critical aspect in any project. Without good architecture enforcement, there is no good architecture. But how can architects&amp;#160; pragmatically ensure high quality as well as conformance with the architecture design? Management by walking around does the trick. You should frequently visit the different teams and make sure, they really understand the infinite wisdom and essence in your architecture design and architecture guidelines. This is the best way to get their buy-in and support. In addition, you ‘ll detect any architectural shift early. In particular, when developers add accidental complexity by introducing design pearls that are not motivated by requirements. I wholeheartedly believe, agility implicitely requires architects to work this way. But it is not the case that architects are inerrable, (although we’d really like to see the universe from this perspective). Sometimes, even clever wizards fail. As an architect I am definitely better off when developers show me where I was plain wrong. Believe me, this is much better than testers, reviewers or customers happily finger pointing to your design flaws. Thus, architecture enforcement is a bidirectional interaction between architects and implementation, with architects being the drivers. &lt;/p&gt;  &lt;p&gt;As Lenin once said: trust is good but control is better. Think about this before throwing your design over the fence in the next project. Some things tend to backfire heavily.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3365964164865627831?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3365964164865627831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3365964164865627831' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3365964164865627831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3365964164865627831'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/03/over-fence.html' title='Over the Fence'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6188386922445971921</id><published>2010-02-21T16:55:00.001+01:00</published><updated>2010-02-21T16:57:43.414+01:00</updated><title type='text'>The Extensibility Syndrome</title><content type='html'>&lt;p&gt;In one of the Facebook groups I am member of there is currently a discussion going on how to deal with extensible design, especially how to prove to a client that a system meets its extensibility expectations.&lt;/p&gt;  &lt;p&gt;Focus on extensibility is important but can also be a big hazard, in particular, when engineers overdo it. For example, consider the application of the Strategy pattern. Basically, applying the Strategy patterns implies some kind of uncertainty which algorithm actually should be used. If many Strategy pattern instances are used, this almost always means that the engineers have no clue in which direction the system should be extensible. Of course, the same holds for overuse of other extensibility patterns as well. Such systems become a nightmare for developers and users.&lt;/p&gt;  &lt;p&gt;Thus, make clear with requirements engineering or customers what kind of extensibility they really need.&lt;/p&gt;  &lt;p&gt;What needs to be extended:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Should an algorithm be exchanged?&lt;/li&gt;    &lt;li&gt;Is it a whole subsystem or layer that is subject to change or extensibility?&lt;/li&gt;    &lt;li&gt;Is it a component that needs to be changed or extended?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When will it be extended?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Now,&lt;/li&gt;    &lt;li&gt;Mandatory in the future,&lt;/li&gt;    &lt;li&gt;Optionally in the future?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Which binding time?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;source code,&lt;/li&gt;    &lt;li&gt;compile time,&lt;/li&gt;    &lt;li&gt;link time,&lt;/li&gt;    &lt;li&gt;runtime,&lt;/li&gt;    &lt;li&gt;maintenance time?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Who will be in charge of extending?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;operator,&lt;/li&gt;    &lt;li&gt;user,&lt;/li&gt;    &lt;li&gt;developer&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You should only consider those extensions that are mandatory, none of the possible or optional ones that may or may not appear in the future.&lt;/p&gt;  &lt;p&gt;In the beginning of software design introduce change scenarios as proposed by the book Software Architecture in Practice, 2nd edition (Bass, Clements, Kazman). Here you’ll learn how to describe modifiability scenarios using scenario diagrams and rating them using so-called utility trees.&lt;/p&gt;  &lt;p&gt;You may also use design tactics diagrams that deal with how to implement the different kinds of extensibility mentioned above.&lt;/p&gt;  &lt;p&gt;If you follow the principles of my Onion Model, then each architecture design step will only be driven by requirements and their priorities. This way, you can establish requirements traceability within your architectural design.&lt;/p&gt;  &lt;p&gt;For extensibility and change scenarios, a Commonality/Variability analysis can be leveraged, especially when dealing with a wide variety of extensions such as in platform or software product line development.&lt;/p&gt;  &lt;p&gt;In contrast to common believe extensibility or change is only applicable after you’ve designed those parts of your architecture that are subject to extension or change. You can either extend some functional entities or operational qualities such as scalability mechanisms. This implies that all extensibility and change design activities follow after functional and operational design and not before.&lt;/p&gt;  &lt;p&gt;When opening your functional &amp;amp; operational design for extensions or change always use the Open/Close principle to prevent unwanted side effects.&lt;/p&gt;  &lt;p&gt;To prove that a software architecture is extensible such as expected by the customer you got different means.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;An end-user or operator might like to see the implemented change scenarios and how they actually work in the implementation.&lt;/li&gt;    &lt;li&gt;Another engineer might like to see how the architecture and implementation support extensions.&lt;/li&gt;    &lt;li&gt;A requirements engineer may like to see the mapping from requirements to architecture decisions.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Modifiability aspects (e.g., extensibility and changeability) are much more difficult than they seem at first place. When the amount of extensibility is overwhelming, you’ll often find wizards or configuration automatisms to hide the mess underneath (which does not imply that wizards or configurators are indicators for bad design). &lt;/p&gt;  &lt;p&gt;As Heraklitus once said: panta rhei – everything changes. Thus, be prepared!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6188386922445971921?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6188386922445971921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6188386922445971921' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6188386922445971921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6188386922445971921'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/02/extensibility-syndrome.html' title='The Extensibility Syndrome'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2597499046269311749</id><published>2010-02-12T14:42:00.001+01:00</published><updated>2010-02-12T14:50:24.316+01:00</updated><title type='text'>Does Cloud Computing have an Architectural Impact?</title><content type='html'>&lt;p&gt;Let’s suppose you have good reasons to leverage a Cloud infrastructure. Will this decision hava any impact on your architecture? The answer is quite easy: It depends :-)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you just use virtualization to exactly simulate a physical environment like in Amazon EC2, then your applications will be oblivious to the Cloud infrastructure. &lt;/li&gt;    &lt;li&gt;If you leverage SaaS (Software as a Service) like Salesforce.com then it’s a SEP (Somebody Else’s Problem).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;However, if you use PaaS (Platform as a Service) or IaaS (Infrastructure as a Service) for your applications, then things definitely will change.&lt;/p&gt;  &lt;p&gt;It is not so much the domain-specific logic that is influenced, but infrastructural and non-functional requirements will experience an impact.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In a Cloud environment different storage means are supported. In general, you’ll find Blobs and NoSQL databases. Designing the persistence infrastructure must take these issues into account unless you are still relying on a mainstream DBMS running somewhere in the Cloud. &lt;/li&gt;    &lt;li&gt;For messaging Message Queues are available. Thus, message-oriented communication between Cloud-aware subsystems is a reasonable approach for connecting islands with each other. Often, SOA style communication protocols such as RESTful communication or SOAP/WS-* are supported. These protocols alone imply different architecture paradigms - designing the communication and distribution infrastructure can be a challenge.&lt;/li&gt;    &lt;li&gt;All operational qualities such as performance, availability, scalability, fault-tolerance need to be implemented with the SLAs in mind the Cloud provider offers. If, for example, availability zones are supported in the Cloud you better plan how to leverage them according to your needs. In a public cloud security is even a more critical issue. You cannot naively trust the Cloud provider to keep your mission-critical data secret. Thus, you have to provide means like encryption almost everywhere. For performance reasons, you might want to consider the Cloud as a Grid such as in Apache HADOOP. But how can you partition your system in a suitable way. Is Mapreduce what you need or, otherwise, does your application require a different kind of approach? There are many different concurrency architectures like Master/Slave, Pipes &amp;amp; Filters, Concurrent Reactor that could be appropriate. In contrast to typical application development you are much more constrained when addressing these operational qualities, because many decisions the Clound infrastructure has already made for you. It is YOU who needs to integrate with the Cloud, not vice-versa.&lt;/li&gt;    &lt;li&gt;Developmental qualities such as modularity, modifiability, maintainability can be hard to achieve in such an environment. First of all, you should introduce some kind of governance approach. Secondly, you need to modularize in such a way that governance issues live in harmony with the kind of modularization propagated by the Cloud, in particular by the PaaS APIs. For command &amp;amp; control purposes you need to think about how to administer the Cloud applications. There might be 3rd party products for this purpose. It, however, might also be the case you have to implement your own tooling.&lt;/li&gt;    &lt;li&gt;If, for some reason, you need to use different cloud infrastructures, interoperability might be a big issue given that today’s approaches almost inevitably lead to vendor-lock-in. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Not always, you will be able to start with a green field project, but rather need to deploy an existing application ecosystem or parts of it to the Cloud infrastructure. Migration is not straightforward as we already saw earlier. You may need to combine reengineering and refactoring activities for this purpose.&lt;/p&gt;  &lt;p&gt;This posting describes only the tip of the iceberg. I hope, people will develop some best practices (patterns) for how to leverage existing Cloud platforms. I’d be rather sceptical if someone would come up with such patterns soon. You surely remember, patterns must be independently used in three different applications to make them patterns. I cannot imagine, we already obtained that much experience in practice.&lt;/p&gt;  &lt;p&gt;So, if you are going to design for Amazon EC2, Google Web Engine or Microsoft Azure don’t forget: Mind the Cloud!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2597499046269311749?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2597499046269311749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2597499046269311749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2597499046269311749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2597499046269311749'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/02/does-cloud-computing-have-architectural.html' title='Does Cloud Computing have an Architectural Impact?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7450514036404377046</id><published>2010-02-11T19:54:00.001+01:00</published><updated>2010-02-11T19:55:41.099+01:00</updated><title type='text'>Requirements traceability – The Holy Grail</title><content type='html'>&lt;p&gt;It often occurs that I am supposed to review an architecture document – that’s one important part of my job. After having read the document, I always try to summarize what I just read. And in many cases, this proves to be rather difficult. One of the reasons is that the subsequent parts of the document seem to be only loosely connected such as graphical models popping up without textual explanation or architectural &amp;amp; technical decisions appearing without any hint what the design rationale could be. However, a reader who is dependent on rumors, insider knowledge, and vague assumptions will see the hodgepodge of syntax but never fully understand the semantics behind this syntax. If the reader is a tester, requirements engineer, fellow architect, or developer such situations need to be considered harmful. Yes I can see the answer is 42, but was the question respectively problem that lead to this result?&lt;/p&gt;  &lt;p&gt;The big secret is requirements traceability. Each and every architectural decision must be strongly derived from forces (i.e., requirements and risks). This also helps to keep the architecture simple, expressive and balanced, because this way we can get rid of all these design pearls smart developers and architects typically invent.&lt;/p&gt;  &lt;p&gt;From the forces elicitated at the beginning of a project architects derive architecturally relevant requirements. This includes requirements clarification and priorization. Remember: Garbage-in-Garbage-out. If the initial assumptions are wrong, the resulting implementation can under no circumstances meet the expectations.&amp;#160; Of course, we do not expect requirements to be fully available at project startup. We have become extraordinary agile wizards, anyway, and can also handle requirements dropping in. Needless to say, we can not gurantee the same perfect software &amp;amp; system architecture we would have come up with if all these requirements had been fully available from day 1.&lt;/p&gt;  &lt;p&gt;As we already got those long-term experience, we are using the &lt;a href="http://stal.blogspot.com/2008/07/onion-model.html"&gt;onion&lt;/a&gt; model.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For all use cases (part of user requirements) we are deriving a black box view of our system. From this descriptions we also obtain actors and required/provided interfaces. As we see, this step is driven by requirements.&lt;/li&gt;    &lt;li&gt;The domain model is another force. It is a means to understand typical entities in the underlying domain as well as their relationships and interactions. They will turn the black-box view into a white box view. Now you can start to map the use cases to sequence diagrams which is also requirements driven. All of a sudden the domain-specific subsystems, components, interactions, interfaces are disclosed refining our external model. Eric Evans is an excellent source how to deal with such domain-driven design.&lt;/li&gt;    &lt;li&gt;So far we have focused on the domain entities. It is time to add infrastructural requirements such as communication, persistence and concurrency infrastructures as well as operational requirements such as performance, safety, availability. This we do by starting with the highest priorities- that’s why priorization is so essential – and ending with the lowest priorities. Each architecture decision is strongly rooted in requirements. &lt;/li&gt;    &lt;li&gt;The same is done with the mandatory developmental requirements like modifiability, maintainability and then with the optional developmental requirements.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All these decisions are depicted in diagrams, but also explained in the textual descriptions.&lt;/p&gt;  &lt;p&gt;What are the benefits of such an approach:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;We get requirements traceability: Firstly, we know which requirements lead to which architectural decisions, thus also obtaining a mechanism to check whether we have already covered all the necessary requirements in our design. Secondly, we know which effects an architectural change such as a refactoring will have on requirements, thus preventing or at least lowering the risk of accidental complexity. Thirdly, all decisions are made explicit. Implicit parts lurk like invisble ghosts deep in the guts of the architecture hurting us when we are least prepared.&lt;/li&gt;    &lt;li&gt;We are driven by priorities. If we miss our milestones, we skip the less important requirements instead of the really important things.&lt;/li&gt;    &lt;li&gt;Readers of our documents will not only understand the “what” but also the “why” making it much easier to get their buy-in. This is what we call design rationale.&lt;/li&gt;    &lt;li&gt;If we additionally come up with leading guidelines and principles for cross-cutting concerns in the beginning we will increase internal qualities such as symmetry, orthogonality, simplicity.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The journey is the reward in software architecture. Don’t tell readers about the target to aim for, but also about the way how you get there. On each junction, explain why you prefer one over the other road.&lt;/p&gt;  &lt;p&gt;Writing of such documents can be such a fun. And reading them even more. For example, read Dave Cutler’s book about the creation of Windows NT. &lt;/p&gt;  &lt;p&gt;A architecture document shall contain guidelines and design rationale, but no labyrinths.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7450514036404377046?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7450514036404377046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7450514036404377046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7450514036404377046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7450514036404377046'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/02/requirements-traceability-holy-grail.html' title='Requirements traceability – The Holy Grail'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2846505958314875800</id><published>2010-01-30T14:31:00.001+01:00</published><updated>2010-01-30T14:34:01.234+01:00</updated><title type='text'>Back from the OOP 2010</title><content type='html'>&lt;p&gt;This year’s OOP conference in Munich has been a lot of fun. I met Markus Völter, Stefan Tilkov, Floyd Marinescu, Jan Bosch, Eric Evans, Philippe Kruchten, Roman Pichler, Peter Hruschka, Kersten Auel, Rene Schönfeldt,&amp;#160; Klaus Rohe, Matthias Bohlen, Gernot Starke, Jutta Eckstein, Nico Josuttis, Gregor Hohpe, Robert C. Martin, Matthias Bohlen, Kevlin Henney and my good ole friend Frank Buschmann. Especially the networking part was overwhelming. So many speakers and participants you can learn from.The talks and keynotes are definitely helpful to hear about new trends, perspectives and experiences. But the personal communication is the essence of such conferences. That’s the reason why I don’t believe in online events. Sure, it’s a nice add-on but it cannot substitute the “human” factor. In the middle of the week we had a meeting of the Siemens Senior Software Architects where I enjoyed meeting some of the aforementioned celebrities but also the smart senior architects within Siemens who do excellent work day by day. They might not be that much in the limelight, but those people are&amp;#160; the real heroes of software engineering among all those “nameless” other heroes such as development heads, team leads, testers or developers. As Jan mentioned: there are two types of architects. Those talking about software architecture and those practicing it. Fortunately, I am a hybrid belonging to both types.&lt;/p&gt;  &lt;p&gt;This year’s keynotes&amp;#160; offered excellent quality. I’ll never forget Uncle Bob’s entertaining talk on the polyglot programmer where he dived into the history of programming languages in a very entertaining way. Or two speakers from Zühlke Engineering who presented a great keynote on functional programming. Not to forget Gernot Starke with his talk on software architects and stealing in your neighbor’s garden. Unfortunately, I could not make it to his keynote but from what I heard it was one of the highlights.&lt;/p&gt;  &lt;p&gt;Most of the topics presented in talks and tutorials covered the typical topics you’d expect. Cloud Computing and Functional Programming as well as Agility represented the hot topics. What I liked most were all these more practice-oriented talks offering some insights for practioners and also revealing some real life show cases. For instance, I enjoyed Kurt Höpli’s talk on building and controlling environmental sensors in a project in Switzerland. And I also experienced a lot of fun in Markus Völter’s talk on how to apply Model-Driven-Software-Development&amp;#160; within an embedded systems context. Never I will forget how Eric Evans and Hans Dockter presented Domain-Driven-Design convincing some attendees to participate as actors. And I’ll remember also Lothar Mieske who presented the real look-and-feel of all those Cloud Computing platforms. I could add much more but this should give you an impression and suffice as a pars pro toto.&lt;/p&gt;  &lt;p&gt;Personally, I have been very busy the week. First, I gave a full-day tutorial on Software Architecture – From Requirements to Architecture. It was the tutorial with the largest numbers of attendees. This makes interaction somewhat difficult but nonetheless worked much better than expected. My talk on Hitchhiker’s Guide to Cloud Computing had about 80-100 attendees. To my pleasure the Global Technology Field Cluster Lead of my organization also attended the talk. For me, it was the biggest surprise that the talk “Introduction to Scala” had attracted so many people. I was totally electrified and I mean this literally cos’ static charge hit me whenever I pressed the page-down key. When people are interested, I will record this talk with Camtasia and publish the video clip in YouTube and other media. All in all, I got really overwhelming feedback. Thank you to all attendees for their nice evaluation sheets :-)&lt;/p&gt;  &lt;p&gt;Next year the OOP will celebrate its 20th anniversary. Hope that many of you will join the event. It is really an extraordinary experience.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2846505958314875800?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2846505958314875800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2846505958314875800' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2846505958314875800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2846505958314875800'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/01/back-from-oop-2010.html' title='Back from the OOP 2010'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5882766013033345742</id><published>2010-01-21T07:11:00.002+01:00</published><updated>2010-01-21T07:53:12.031+01:00</updated><title type='text'>Stakeholder-specific Communication</title><content type='html'>Communication is one of the most importants aspects of software architecture design. The architecture itself is a means of communicating design decisions to customers, product managers, project managers, testers, integrators, and developers. However, these stakeholders have different expectations regarding the software architecture. While developers need a clear guideline how to implement the architecture design, customers may be more interested how (well) the software meets their requirements. The software architecture documentation and all other means of communication such as presentations must cover these various perspectives. To address such broad spectrum of interests, architects could provide a specific document for each particular kind of stakeholder which leads to an unacceptable amount of effort and time. This is why documents should rather explain the architecture decisions  - the "what", the "how" and the "why" - in a top-down approach and add a guide-to-the-reader motivating who (i.e. which stakeholder) should read what in which order. For presentations or other forms of communication it might be worthwhile to introduce a specific variant for each stakeholder. A project manager or customer is typically not that interested in all those strategic and tactical design destails, while developers need all the information they can get. Thus, communication between architects and other stakeholders should take the stakeholder-specific interests into account. This implies, that architects need to have a clear understanding of these interests before starting documenting or communicating. Otherwise, they won't get buy-in for their software architecture by these different stakeholders. Personally, I have experienced so many projects where managers couldn't follow and understand what the architects told them overwhelmed by details they did not (have to) care about. And I also have been in so many meetings where software architects introduced high-level abstractions that could not provide the details developers and testers expected.&lt;br /&gt;As a prerequisite it is necessary to ensure a common understanding of terminology. Did you ever attend a meeting where different participants had a different understanding of terms? Communication will not work and succeed when one person is speaking english, while the communication's target can only understand spanish. This might be obvious for real languages, but it is often underestimated for domain-specific languages. Did you once try to read and understand (!)  a treatment record of your physician? He speaks english, you speak english, but this won't help you much. As a consequence, introducing a domain-specific language is valuable and essential. It does not have to be a full-blown language in the strict formal sense, but often it makes sense to offer more than just a glossary. The core functional architecture should represent the problem domain.&lt;br /&gt;As a consequence, all communication between architects and stakeholders must happen in a stakeholder-specific way. When giving a presentation on the software architecture, make sure you know the target audience and their interests. Don't assume, other types of stakeholders understand software architecture the way you do. You are the doctor and they are the patients, so-to-speak. Communication may succeed or fail. The risk of failure can only be minimized if you can take and understand the perspective of your communication partners.&lt;br /&gt;Obviously, these statements also hold for other kinds of communication. Have you ever tried to explain to your spouse why you need that cool new gadget for several hundred bucks? Try that by telling her/him the technical specifications. Won't work very well, right?  What we take for granted in such situations (i.e., adapting the communication to your communication partner), represents also a conditio-sine-qua-non in software engineering. So, better mind the stakeholder-specific communication in the future :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5882766013033345742?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5882766013033345742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5882766013033345742' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5882766013033345742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5882766013033345742'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/01/stakeholder-specific-communication.html' title='Stakeholder-specific Communication'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7207702659085318019</id><published>2010-01-09T12:04:00.001+01:00</published><updated>2010-01-09T12:04:50.768+01:00</updated><title type='text'>Real Software Engineers</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Real software engineers don’t need safety nets. Instead, they are ready to face all dangers and risks without any fear. For this reason, they dislike (unit) testing, because (unit) testing is for pussies (i.e., those who do not trust their own code.) Since real software engineers never make mistakes, testing would be a mere waste of time.&lt;/li&gt;    &lt;li&gt;Real software engineers won’t document their design, because these designs contain an incredible amount of design pearls other mortals would not be able to comprehend, anyway.&lt;/li&gt;    &lt;li&gt;Nor do real software engineers read other design documents nor manuals, either because their fellow engineers did not provide documentation or because they do not trust these documents. &lt;/li&gt;    &lt;li&gt;Instead, their main guidelines are:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;All you need is code&lt;/li&gt;      &lt;li&gt;Bubbles don’t crash &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Real software engineers do not check or prioritize requirements. Instead, they got intuition for customers’ needs which drives all their activities. &lt;/li&gt;    &lt;li&gt;Real Software Engineers do not communicate (much) with other stakeholders, because other stakeholders are just obstacles on the way to project completion. That’s also the reason why real software engineers hate meetings.&lt;/li&gt;    &lt;li&gt;Real software engineers do rarely speak English, German, …. They rather express themselves using C#, Java, C++, …&lt;/li&gt;    &lt;li&gt;Real Software Engineers feel more comfortable in the solution domain. Their goal is to provide solutions instead of getting lost in problem domains. This is why they prefer playing around with solution technologies.&lt;/li&gt;    &lt;li&gt;Real software engineers can turn any problem into a nail for which they can use their favourite hammer.&lt;/li&gt;    &lt;li&gt;Real software engineers do not need software architecture because a predefined architecture would just limit their creativity. A good architecture is always created ad-hoc for solving real problems in a pragmatic way. &lt;/li&gt;    &lt;li&gt;Real software engineers do not foster re-use. First of all, re-use has never worked in practice. And secondly, re-using design or code typically requires more resources than reinventing the wheel. This is often due to the fact that re-usable artifacte were created by other real software engineers who failed to document their work. &lt;/li&gt;    &lt;li&gt;Real software engineers won’t read this blog because in the time needed for reading, they could add another feature to their software.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7207702659085318019?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7207702659085318019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7207702659085318019' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7207702659085318019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7207702659085318019'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/01/real-software-engineers.html' title='Real Software Engineers'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5134953108453677063</id><published>2010-01-07T19:09:00.001+01:00</published><updated>2010-01-07T19:11:39.401+01:00</updated><title type='text'>Architecture Documentation Revisited</title><content type='html'>&lt;p&gt;Did you ever read a novel which later has been used as foundation for a movie? I bet, you were rather disappointed how the movie differed from your reading experience and thus from your expectations.&lt;/p&gt;  &lt;p&gt;Did you ever read an architecture document – yes, there is vague evidence and hope that something such as architecture documents exists – and then compared the documented design with the implemented system? &lt;/p&gt;  &lt;p&gt;In software architecture design, documents are not just by-products created for write-only brain dumps.&amp;#160; Instead, they are supposed to be read by someone – a fact that might be surprising for some engineers. &lt;/p&gt;  &lt;p&gt;Architecture documents serve as the basic means for communicating architectural decisions, i.e. they explain the “what” and the “why” – aka design rationale. Target audience of architecture documents are foremost all stakeholders, not just the authors themselves. &lt;/p&gt;  &lt;p&gt;In addition, those documents should be up-to-date. Did you ever struggled through 100s of pages of a design document, and right after you finished, someone told you, the document was outdated? &lt;/p&gt;  &lt;p&gt;Does this mean, we should adapt the documentation after each change? No, it only implies, architecture documents should be updated regularly. Consider versioning architecture documents in this context! &lt;/p&gt;  &lt;p&gt;An architecture specification should also be subject for testing. Don’t take testing too literally! What I suggest is that documents are being reviewed for their usability/readability, internal consistency and completeness, as well as their consistency with the actual implementation. Needless to mention, that the reviewers shouldn’t be the authors but a selection of stakeholders.&lt;/p&gt;  &lt;p&gt;Always use the right style of documentation depending on purpose and target audience. A user document that describes a system should contain tutorials as well as a reference manual. If no one understands it, the best design ever won’t help you much. &lt;/p&gt;  &lt;p&gt;My strategy for documenting is to walk to the other side of the fence thinking about how a specific stakeholder would like to get the material presented. I am not writing the document for myself but for others, anyway. And I always take care of updating the documentation whenever the system has been updated to a new (minor or major) version. Readers should not be punished by reading my document but consider this as an entertaining and profitable activity. Reading design documents is fun or at least should be! Who claims, IT documents must always be written in a technical and boring style? &lt;/p&gt;  &lt;p&gt;Remember: the most important capability of a software architect are communication skills. Documenting is one particular way of communicating. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5134953108453677063?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5134953108453677063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5134953108453677063' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5134953108453677063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5134953108453677063'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2010/01/architecture-documentation-revisited.html' title='Architecture Documentation Revisited'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2728947589192393152</id><published>2009-12-09T20:26:00.001+01:00</published><updated>2009-12-09T20:28:55.061+01:00</updated><title type='text'>A picture can say more than thousand words - a word can say more that thousand pictures</title><content type='html'>&lt;p&gt;One of the key problems in architecture documents is the idea illustrations are sufficient for explaining design.&lt;/p&gt;  &lt;p&gt;Let me give you an example:&lt;/p&gt;  &lt;p&gt;Eo---oP&lt;/p&gt;  &lt;p&gt;What could the diagram illustrate? &lt;/p&gt;  &lt;p&gt;Could this describe a hydrogen atom consisting of a proton and an electron?&lt;/p&gt;  &lt;p&gt;Does it represent the association between an entity bean and its persistence store?&lt;/p&gt;  &lt;p&gt;Or is it something completely different?&lt;/p&gt;  &lt;p&gt;Diagrams are models. They can only express a subset of reality. If you do not know the concrete context, you’ll have no way to figure out what the diagram actually means.&amp;#160; But if you are familiar with s special context, you might be inclined to map a diagram to your own context which, however, might be painfully wrong. &lt;/p&gt;  &lt;p&gt;Thus, an architect should always explain the context of a diagram as well as the constituents and their meaning textually in the document.&lt;/p&gt;  &lt;p&gt;What about the other way round?&lt;/p&gt;  &lt;p&gt;Again, an example:&lt;/p&gt;  &lt;p&gt;Component A is connected with B, C, D. D is connected with E and C. F is connected with D and A … a lot of more information …&lt;/p&gt;  &lt;p&gt;In the example above, plain text is not really helpful. Here seems to be a good place to add a diagram that graphically illustrates the components and their connections. Text alone is not capable of describing complex structures which often appear in architecture design. &lt;/p&gt;  &lt;p&gt;Hence, we recognize that diagrams need explanations to understand their semantics. Otherwise they just represent syntactic glibberish. In addition, UML, SysML and other graphical notations might lead to ambiguous illustrations which are open to interpretation. Thus, tell the reader what exactly the model behind the diagram is supposed to be.&lt;/p&gt;  &lt;p&gt;As a consequence, all design documents that are automatically generated have almost no value.&amp;#160; For example, design rationale (such as requirements and their association with architectural decisions) is better described using textual language instead of diagrams.&lt;/p&gt;  &lt;p&gt;Thus, use diagrams carefully in your design documents. But also be aware of text that does only describe what is depicted in diagrams, but does not introduce information such as pre- and postconditions, invariants, contextual information, design rationale, …&lt;/p&gt;  &lt;p&gt;Guess, why there are UML use case diagrams that illustrate a set of use cases, but no graphical means for describing the use cases themself?&lt;/p&gt;  &lt;p&gt;Use text and diagrams wisely! Don’t consider design documents as write-only-entities. You will see what I mean whenever you have to understand&amp;#160; documents of your fellow engineers. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2728947589192393152?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2728947589192393152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2728947589192393152' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2728947589192393152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2728947589192393152'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/12/picture-can-say-more-than-thousand.html' title='A picture can say more than thousand words - a word can say more that thousand pictures'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4545102421207906308</id><published>2009-11-29T21:33:00.001+01:00</published><updated>2009-11-29T21:33:14.674+01:00</updated><title type='text'>Maturity matters</title><content type='html'>&lt;p&gt;This time a rather small posting only.&lt;/p&gt;  &lt;p&gt;I am wondering what the top research fields in software architecture currently are? Of course, fields such as MDSDL/DSLs come immediately to my mind. Cool stuff! Investigate these topics and fame is guaranteed!&lt;/p&gt;  &lt;p&gt;Others are already sufficiently mature. I am thinking of mapping requirements to architecture decisions. Ok, maybe there are still some deficiencies in this area. Hmmh, there might be even significant gaps, especially when dealing with operational and developmental qualities. Must reevaluate my opinion.&lt;/p&gt;  &lt;p&gt;What about documenting software architecture? There are dozens of templates available, even books. A lot of agreement here, but what about modeling? Is UML the “ultimate ratio”? How can we model, what should we model? How can we cover design rationale? How deep should we go? Did I ever read a really good architecture documentation?&lt;/p&gt;  &lt;p&gt;I got it. Patterns are super mature. I have been author of pattern books myself. These books are now available since 14 years. Some architects even know the names of all patterns. But do most architects know patterns others than GoF? And even if they do, do they apply them?&lt;/p&gt;  &lt;p&gt;Isn’t refactoring a good candidate or reverse engineering? Architecture refactoring isn’t established in most development organizations. If I say architecture refactoring, I really mean architecture refactoring, not code refactoring. &lt;/p&gt;  &lt;p&gt;What about software architecture design? We have been designing software systems for decades and they work! No, most of them suck! Unfortunately, design by accident is the norm, not the exception.&lt;/p&gt;  &lt;p&gt;… thinking, diving deeper, diving broader, getting frustrated …&lt;/p&gt;  &lt;p&gt;Why is my impression that most areas in software architecture are still rather immature?&lt;/p&gt;  &lt;p&gt;Maybe, the answer is that software architecture itself is a big collection of research topics. &lt;/p&gt;  &lt;p&gt;Or maybe, I am blinded by the light.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4545102421207906308?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4545102421207906308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4545102421207906308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4545102421207906308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4545102421207906308'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/11/maturity-matters.html' title='Maturity matters'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4870493937135593760</id><published>2009-11-10T18:22:00.001+01:00</published><updated>2009-11-10T19:16:12.133+01:00</updated><title type='text'>Architect – what architect?</title><content type='html'>&lt;p&gt;In many projects and organizations I am constantly meeting software architects. Given the quantity I’d only expect only a fraction of software development projects to encounter any issues in software architecture and design. As we all certainly know, quite the opposite is true. &lt;/p&gt;  &lt;p&gt;Ok, nice and true words, but what exactly is the reason for this observation?&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Of course, I absolutely have no clue :-; So let me just make some assumptions.&lt;/p&gt;  &lt;p&gt;Could it be that the term “software architect” on a business card is subject to a variety of different interpretations? &lt;/p&gt;  &lt;p&gt;In one company, someone may be promoted to software architect, just because she/he is the only one who owns a pattern book. [Beware of humour!] &lt;/p&gt;  &lt;p&gt;Consulting companies may entitle some of their engineers as software architects, because they can charge more for architects than for developers. &lt;/p&gt;  &lt;p&gt;A handful of companies may offer a challenging education program to become a software architect. &lt;/p&gt;  &lt;p&gt;With other words, it is not clearly defined what a software architect is or should be. Nothing prevents you from calling yourself a software architect. You may remember that I am proposing a rather tough profile for software architects. Well, I know too many projects that failed&amp;#160; miserably because of lack of competencies, experience or skills by the responsible software architects. &lt;/p&gt;  &lt;p&gt;Note: not only the skills count! As software engineering is heavily related to communication and learning from failure, becoming a software architect requires starting as a developer, taking over more and more responsibilities over the years, before finally turning into a butterfly.&lt;/p&gt;  &lt;p&gt;Another issue I often encounter is the missing separation between software and system architects. Today, many system architects are also considered as software architects. This might work very well if the system architect is an experienced software architect. Likewise, the aforementioned setting is adequate for software-intensive developments. But here again, the system architect needs also to be an experienced software architect. If the latter doesn’t hold, the software relevance is obviously underestimated and will inevitably lead to trouble.&lt;/p&gt;  &lt;p&gt;Hold on, there is even another possibility. Even if you can justify that you are a software architect now, this doesn’t mean you’ll be a software architect forever. One of the most fundamental challenges is to know the state of the art of relevant software technologies and methods as well as appreciating and practicing coding and testing skills. Guess, you have been appointed as a software architect ten years ago, but in the meantime you were constrained to using UML tools, Powerpoint and other Office applications. With other words: would you trust a surgeon to operate on your heart who lacks ten years of practice?&lt;/p&gt;  &lt;p&gt;I bet, you made some similar experiences in your environment. If that is the case, a comment would be highly appreciated. If not, even more!&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4870493937135593760?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4870493937135593760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4870493937135593760' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4870493937135593760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4870493937135593760'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/11/architect-what-architect.html' title='Architect – what architect?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-991024715503916676</id><published>2009-11-06T16:59:00.001+01:00</published><updated>2009-11-06T16:59:46.522+01:00</updated><title type='text'>Sick Architecture</title><content type='html'>&lt;p&gt;You may wonder why my publication rate in this blog has decreased dramatically. I am staying at home due to an infection for three weeks now which wasn’t that helpful for my blog.&lt;/p&gt;  &lt;p&gt;To keep things running I have decided to create a new posting. Well, the title is intentionally related to my current health situation. &lt;/p&gt;  &lt;p&gt;To be honest, I think that software architecture design reveals some interesting commonalities with sickness:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Both often require intense treatment by experts&lt;/li&gt;    &lt;li&gt;Different experts offer different opinions and treatment plans &lt;/li&gt;    &lt;li&gt;Both are typically open-ended to some extent&lt;/li&gt;    &lt;li&gt;Both are not subject to planning in most situations&lt;/li&gt;    &lt;li&gt;Both mostly feel very miserable&lt;/li&gt;    &lt;li&gt;To reduce the risk of getting infected some kind of prevention strategy is always a good advise&lt;/li&gt;    &lt;li&gt;It is better to cure the cause not the symptoms. Thus, be aware of all interdependencies and follow a holistic approach&lt;/li&gt;    &lt;li&gt;Viruses are a problem in both worlds&lt;/li&gt;    &lt;li&gt;Healthcare never ends – it is important in the whole lifecyle&lt;/li&gt;    &lt;li&gt;Learning from failure is recommended to avoid similar problems in the future&lt;/li&gt;    &lt;li&gt;Prevention is always better&amp;#160; (i.e, cheaper) than healing&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Most software architectures I know are not in a good and healthy shape - at least in some intermediate phases. Why? Because they were not devleoped with the aforementioned bullet list in mind.&amp;#160; Thus, health monitoring (i.e, reviews) and treatments (i.e., refactoring) should be an essential tool in the architect’s framework.&lt;/p&gt;  &lt;p&gt;Does this sound reasonable? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-991024715503916676?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/991024715503916676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=991024715503916676' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/991024715503916676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/991024715503916676'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/11/sick-architecture.html' title='Sick Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8046066770019652730</id><published>2009-10-15T09:14:00.002+02:00</published><updated>2009-10-15T09:47:06.452+02:00</updated><title type='text'>Data centric Architecture</title><content type='html'>In most projects there is a big emphasize on functionality. Use case modelling defines responsibilities of the system as well as how it interacts with actors. Logical modelling then maps the use cases to related subsystems/components which, of course, is functionality based. At the end we'll get functional interfaces between subsystems or between components. Do you recognize that methods such as UML mostly focus on methods?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, in many cases the data exchanged between architectural entities is rather complex. For example, in healthcare scenarios complex structures with patient information or charging information are the rule. Not dealing with data as first class citizens might lead to various issues such as versioning problems, or inadequate partitioning or aggregation of data. Thus, architects should deal with data modelling very soon if they are facing complex structures in their development projects.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Data modelling starts with the domain model. What are the main entities in your problem domain and which kind of data do they need to persist, share, or transfer?&lt;br /&gt;&lt;br /&gt;Then in the next "layer" when we are introducing the subsystems we'll have to think about data structures in subsystems and data structures exchanged between subsystems. For example, what exactly are the data structures required in the functional interfaces. Obviously, these data structures can be partially derived from the domain model with further data structures required by infrastructural entities or non-functional qualities.&lt;br /&gt;&lt;br /&gt;In the component layer we are starting to deal with finer grained data types.&lt;br /&gt;&lt;br /&gt;Last but not least we'll have to define how data is mapped to implementation artifacts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thus, we should also follow a top-down approach for data modelling. And likewise we need to consider bottom-up constraints such as special data requirements of infrastructures or platforms. With other words, data modelling must go hand in hand with all the other architectural modelling activities:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Important questions to ask when modelling data:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Who is the originator of data?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Who is the consumer of data?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How does data move from the originator to the consumers? &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do we need to collect/aggregate data from different sources (transfer objects)?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What about quality constraints such as performance (e.g., caching data), security (e.g., encrypting data), modifiability (e.g., versioning data), concurrency (e.g., locking data), availability and reliability (e.g., replicating data, data persistence)?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Where and how is data stored?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How do different data structures depend/relate?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I think, data modelling is an underestimated and undervalued activity in architecture design. What about your experiences and opinions?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8046066770019652730?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8046066770019652730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8046066770019652730' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8046066770019652730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8046066770019652730'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/10/data-centric-architecture.html' title='Data centric Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4992227027172483162</id><published>2009-09-18T16:36:00.001+02:00</published><updated>2009-09-19T10:54:57.227+02:00</updated><title type='text'>Ineffective Communication</title><content type='html'>&lt;p&gt;It might not be that obvious why time management is of high importance especially for software architects. But of course, being a software architect in a mission critical project requires your full attention. However, in a couple of projects I met software architects who were simply overwhelmed by communication requests and finally got stuck in a kind of waste time singularity. Ineffective communication can significantly reduce your productivity.&amp;#160; &lt;/p&gt;  &lt;p&gt;Unfortunately, there are many opportunities where your focus on the real important things is easily lost. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;My favourite are &lt;em&gt;unnecessary meetings (including telephone conferences)&lt;/em&gt;.&amp;#160; As software architects are caught in the gravitational center of the project they receive a lot of meeting requests, by managers, developers, other engineers. If you are a very communicative and friendly person – and I bet you are – you might be inclined to say “yes, we can” to all those nice invitations. It is often overseen that meetings also require preprocessing and postprocessing activities. Hence, don’t just count the time you’re spending in the meeting room! Consider carefully what type of meeting you are asked to attend. Is it an essential meeting where your participation is absolutely required (class A meeting)? Or more one of those nice-to-have-meetings? Only accept class A meeting invitations! Even for class A meetings ask yourself whether this meeting has the right setting in terms of people invited, time frame, goals, agenda. With other words: is the benefit you obtain larger than the time spent? Sometimes, a small face-to-face meeting offers more value than a large official meeting. And of course, act thoughtfully if you invite to meetings yourself! As an Outlook junkie do not only enter meetings in your calendar but also time slots for your actual work. Mind the fact that other people tend to fill the gaps in your calendar assuming those gaps are indications of idle time. Personally, I also enter slots for my spare time, just in case. Needless to say that you should also consider travel time in this context. Care about meeting netiquette: there is no place for cell phones or notebooks in a meeting – a few exceptions granted. &lt;/li&gt;    &lt;li&gt;Another critical challenge is &lt;em&gt;e-mail&lt;/em&gt;. Communication by e-mail can be very ineffective (but also the most effective means in other situations). Try to reduce corporate spam which consists of all those mails which steal your time for no good reason. Organize your inbox in folders and prioritize mails as soon as it arrives. Process the mail depending on its priority. Read mail only at specific points of time and tell your communication peers about this fact. And do not send unnecessary mail yourself! Before writing an e-mail, always hold on and consider whether you would also have sent an letter containing the same information in the stone age of communication. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;At the end, it is the project success that counts. Good results require effective architects with as much productive working time as possible. Productive hours depend on effective communication. It is the quality not the quantity! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4992227027172483162?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4992227027172483162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4992227027172483162' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4992227027172483162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4992227027172483162'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/09/ineffective-communication.html' title='Ineffective Communication'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3823652249629525242</id><published>2009-09-05T23:50:00.001+02:00</published><updated>2009-09-05T23:50:55.783+02:00</updated><title type='text'>Vacation - the end is near</title><content type='html'>&lt;p&gt;The last weeks I have relaxed a lot: visiting Dresden, running, swimming and biking, as well as practicing with my DSLR. In addition, I read two books on Scala, updated an article on D (the language), installed several apps on my IPhone (yag – yet another gadget),&amp;#160; prepared slides for ADC 2009 and OOP 2010, participated in a new episode for our SoftwareArchitecTOUR podcast, … and spent a little time on further expanding my work on architecture refactoring. &lt;/p&gt;  &lt;p&gt;However, I intentionally did not work on software architecture or on this blog. This will change beginning with upcoming monday. Now, that I got some new and fresh ideas, I can continue my journey on software architecture issues.&lt;/p&gt;  &lt;p&gt;By the way: I did not mention it so far but maybe you like to follow me on twitter (username: stal_m).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3823652249629525242?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3823652249629525242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3823652249629525242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3823652249629525242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3823652249629525242'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/09/vacation-end-is-near.html' title='Vacation - the end is near'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1689983908628187940</id><published>2009-08-21T00:41:00.001+02:00</published><updated>2009-08-21T00:41:06.557+02:00</updated><title type='text'>And now for something completely different</title><content type='html'>&lt;p&gt;This is my first week of a 3 weeks vacation. It is really hot in Munich why I am currently enjoying swimming, biking and visiting beer gardens more than software engineering.&lt;/p&gt;  &lt;p&gt;Nonetheless, I am currently educating myself in a new programming language. Scala by Martin Odersky combines a pure object-oriented langauge with functional features. And it runs on the JVM. An earlier version of Scala does also support the .NET CLR. &lt;/p&gt;  &lt;p&gt;What I like most is the proper integration of functional features. Closures, for comprehensions, nested functions, pattern matching are notable examples. While Scala is statically typed (it is not a dynamic language), it offers type inference for variables, arguments and results.&lt;/p&gt;  &lt;p&gt;In addition, it provides some cool extensions to Java: all types are objects, no static members, support of covariance and contravariance, to name a few.&amp;#160; Traits are available instead of interfaces – they can behave like interfaces but also allow implementations of methods. With traits the problem of multiple inheritance (mind the diamond configuration) can be avoided. This is possible by introducing inheritance linearization and a kind of virtual super.&lt;/p&gt;  &lt;p&gt;With all of these features Scala code can be much more compact than Java - and it interoperates well with Java components.&lt;/p&gt;  &lt;p&gt;Well, I am really kinda enthusiastic. If you ask me, Scala could be a strong competitor for Java and C#.&amp;#160; But of course, there is not a big company backing Scala such as Sun or Microsoft. Thus, the community will decide.&lt;/p&gt;  &lt;p&gt;Loving the JVM but preferring other languages than Java? No more excuses, Dave!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1689983908628187940?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1689983908628187940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1689983908628187940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1689983908628187940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1689983908628187940'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/08/and-now-for-something-completely.html' title='And now for something completely different'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-432873766029978279</id><published>2009-08-01T11:39:00.001+02:00</published><updated>2009-08-01T11:39:34.825+02:00</updated><title type='text'>Neverending Story</title><content type='html'>&lt;p&gt;One of the prominent questions I often hear in software development projects is when to start with architecture design. Sometimes, architects hesitate to start until almost all requirements are available in high quality. This strategy is highly recommendable when you like to postpone architecture design forever. There is not a single project with medium to high complexity I remember where we knew all forces in full depth and breadth at project start.&lt;/p&gt;  &lt;p&gt;First of all, it heavily depends on the software development process. In a Waterfall model without iterations you are stuck anyway. Thus, I generally recommend an iterative-incremental approach. In software developments with all their volatility only piecemeal growth can succeed. &lt;/p&gt;  &lt;p&gt;It is important to have a &lt;strong&gt;sufficient&lt;/strong&gt; quality and quantity of requirements available, for example, the most important 30%-50% of use cases and non functional qualities with unique priorities. This way, you can come up with a conceptual architecture which you can then use as a base for iterative-incremental refeinement. &lt;/p&gt;  &lt;p&gt;After the baseline is available prioritize all user requirements (use cases), map them to end-to-end scenarios and integrate them into the architecture, keeping the non-functional qualities in mind. To deal with non functional qualities let key developers, architects or even teams work on principles and guidelines how to address these qualities. Do this after the baseline architecture design but before starting the end-to-end iterations.&lt;/p&gt;  &lt;p&gt;As soon as new requirements appear or have been concretized assign them priorities and put them into the “backlog”. &lt;/p&gt;  &lt;p&gt;To introduce a kind of safety net for embracing change, introduce test-driven design methods, flash architecture reviews after each iteration, and (architecture and code) refactoring activities after each flash review.&lt;/p&gt;  &lt;p&gt;Keep in mind that sometimes you need courage to decide even when not all details are available.&amp;#160; It is typical for all creative and volative acts that not all details are known in advance, nor the ways how to cope with them.&lt;/p&gt;  &lt;p&gt;As a consequence, it is much more productive and effective to follow wrong paths sometimes instead of following no path at all. &lt;/p&gt;  &lt;p&gt;To keep it simple: Prefer acting over reacting&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-432873766029978279?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/432873766029978279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=432873766029978279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/432873766029978279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/432873766029978279'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/08/neverending-story.html' title='Neverending Story'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2636700807694708919</id><published>2009-07-23T07:25:00.003+02:00</published><updated>2009-07-23T07:49:38.367+02:00</updated><title type='text'>May the force be with you</title><content type='html'>Sometimes it is getting confusing. There are so many influential factors driving software architecture. Here is my small domain language&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Forces &lt;/span&gt;is the set of all influential factors an architect is facing: requirements, risks, constraints, business needs.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Requirements &lt;/span&gt;are the (documented) set of all expectations for a software system. According to Wikipedia a requirement represents a necessary attribute, capability, characteristic, or quality of a system in order for it to have value and utility to a user. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;System requirements&lt;/span&gt; address the system as a whole. From system requirements we need to derive architecturally relevant requirements that drive architecture and design. That is the architect's job.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;A Functional requirement&lt;/span&gt; defines functionality a system is supposed to provide, sometimes also known as capability. &lt;span style="font-style: italic;"&gt;Use cases&lt;/span&gt; are functional requirements. They define what the user expects from the system on a black-box level. &lt;span style="font-style: italic;"&gt;User stories&lt;/span&gt; according to Wikipedia denote software system requirements&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Requirement" title="Requirement"&gt;&lt;/a&gt; formulated as one or two sentences in the everyday or business language of the user.&lt;/li&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;Non-functional requirement&lt;/span&gt; (also known as &lt;span style="font-style: italic;"&gt;quality requirement&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;quality attribute&lt;/span&gt; or "&lt;span style="font-style: italic;"&gt;ility&lt;/span&gt;") is constraining a solution. There are two subcategories here: &lt;span style="font-style: italic;"&gt;operational requirements&lt;/span&gt; as the name suggests constrain the runtime behavior of the system (e.g., security, performance) while &lt;span style="font-style: italic;"&gt;developmental requirements&lt;/span&gt; constrain the design from a developmental perspective (e.g., maintainability, modifiability). As operational requirements often have a systemic approach to a system they are subject to architecture design and therefore are also called &lt;span style="font-style: italic;"&gt;strategic requirements&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;Tactical requirements&lt;/span&gt; such as modifiability mostly have only local scope.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Constraints &lt;/span&gt;- what a surprise - are constraining the solution. A constraint might be technical (we need to use Windows 7 as our OS), organizational (subsystem A should be developed at location A), standard &amp;amp; law (we must abilde to FDA rules), business-related (target costs should not exceed xxx$).&lt;/li&gt;&lt;/ul&gt;It is the job of a software architect to base all decisions on the forces of the project. Still she/he has sufficient freedom to make architecture and design a complex task. Architecture is about communication and courage to decide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2636700807694708919?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2636700807694708919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2636700807694708919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2636700807694708919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2636700807694708919'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/07/may-force-be-with-you.html' title='May the force be with you'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1087522329880226226</id><published>2009-07-20T09:24:00.001+02:00</published><updated>2009-07-20T09:25:23.054+02:00</updated><title type='text'>No future for architects?</title><content type='html'>&lt;p&gt;I am a big fan of Star Trek, especially of The Original Series and The Next Generation. From a technology viewpoint, it is amazing how all of these technologies such as warp drives or beaming have influenced science. Did you know that the inventor of the mobile phone had also Star Trek in mind?&lt;/p&gt;  &lt;p&gt;However, there is one sad aspect. What about Software Engineering? Whenever software plays a role in any of the episodes, you’ll recognize Spock or Data just coding. Do they ever design? There is also no software engineering team in the Enterprise although software should be an important asset in the system architecture. I am missing a chief engineer for software engineering aspects!&lt;/p&gt;  &lt;p&gt;Does the computer program itself? Will UML disappear in the future? Or is it just software engineering being too boring for SciFi fans? Interestingly, there are also seem to be no restrooms in the spaceships. This is what they have in common with software engineers :-) &lt;/p&gt;  &lt;p&gt;Thus, we could ask how software engineering especially the discipline of software architects will evolve in the future? Will we still use a successor of UML in hundred years? How could the role of software architects evolve?&lt;/p&gt;  &lt;p&gt;The best approach to predict the future is identifying space of improvement. It is very likely that such areas will be addressed. How should the ideal process of software design look like? What is the software architect supposed to know and to do?&lt;/p&gt;  &lt;p&gt;In most SciFi movies automatization/Model-Driven Software Development and AI are often the answer. Architects express their intent, smart systems then try clarify open issues, and eventually the result is generated.&lt;/p&gt;  &lt;p&gt;Another approach could be an organization like the Borgs who strongly follow an agile approach with code ownership, collective programming and test-first. &lt;/p&gt;  &lt;p&gt;Any opinions?&lt;/p&gt;  &lt;p&gt;Keep in mind: Resistance is futile!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1087522329880226226?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1087522329880226226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1087522329880226226' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1087522329880226226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1087522329880226226'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/07/no-future-for-architects.html' title='No future for architects?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4535464736515847512</id><published>2009-07-19T10:23:00.001+02:00</published><updated>2009-07-19T10:23:09.739+02:00</updated><title type='text'>RRC Card</title><content type='html'>&lt;p&gt;Most of you already know the CRC (depicting Class, Responsibilities, Collaborators) which is a low tech technique for discussing software artifacts in brainstorming sessions for software design.&lt;/p&gt;  &lt;p&gt;I propose another kind of card for depicting the roles in a particular project: the RRC Card: Role Responsibilities Collaborators. &lt;/p&gt;  &lt;p&gt;The idea is simple:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The first &lt;strong&gt;R&lt;/strong&gt; stands for role by which I mean a concrete person and her/his role&lt;/li&gt;    &lt;li&gt;The second &lt;strong&gt;R&lt;/strong&gt; stands for Responsibilities: what responsibilities should this role have to meet its expectations &lt;/li&gt;    &lt;li&gt;The &lt;strong&gt;C&lt;/strong&gt; stands for Collaborators: from which other roles does this role depend, e.g., with which other roles must it interact&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you start with a project, you could ask the parties involved to jointly fill out these RRC cards, thus making clear how responsibilities are partitioned and how roles are supposed to interact.&lt;/p&gt;  &lt;p&gt;Example:&lt;/p&gt;  &lt;p&gt;---------------------------------------------------&lt;/p&gt;  &lt;p&gt;R: Michael / Architecture Consultant&lt;/p&gt;  &lt;p&gt;---------------------------------------------------&lt;/p&gt;  &lt;p&gt;Responsibilities&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Collaborators&lt;/p&gt;  &lt;p&gt;Mentor and coach&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lead Architect: Paul&lt;/p&gt;  &lt;p&gt;Help design&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Architect: Tom&lt;/p&gt;  &lt;p&gt;Implement&lt;/p&gt;  &lt;p&gt;----------------------------------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If you already in a project in deep trouble you could ask persons to fill out how they live their own role and likewise fill out RRC cards for other persons, thus identifying conflicts between expectation and reality. &lt;/p&gt;  &lt;p&gt;Document these RRC cards in a document (e.g., paper-based or Wiki-based)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4535464736515847512?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4535464736515847512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4535464736515847512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4535464736515847512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4535464736515847512'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/07/rrc-card.html' title='RRC Card'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5209624885865820363</id><published>2009-07-18T12:14:00.001+02:00</published><updated>2009-07-18T12:20:44.512+02:00</updated><title type='text'>Risk-driven</title><content type='html'>&lt;p&gt;In addition to requirements and business expectations, risks represent an important driver of architecture design activities. Not addressing risks appropriately is a major reason for project failure. But what exactly is a risk and how can I identify potential risks as an architect. &lt;/p&gt;  &lt;p&gt;On a very coarse grained level, risk might be considered as not knowing the outcome of an event or activity. It is the threat or propability that “an action or event will adversely or beneficially affect an organisation's ability to achieve its objectives” [Wikipedia].&lt;/p&gt;  &lt;p&gt;There are as many different types of risks in a&amp;#160; software development project as there are influential factors. &lt;/p&gt;  &lt;p&gt;For example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Technical risk: Is EJB the right technology for achieving 100000 transactions per hour in our Web store? &lt;/li&gt;    &lt;li&gt;Organizational risk: Is the organization appropriate for this kind of development project?&lt;/li&gt;    &lt;li&gt;Political risk: Does this product manager follow her/his hidden agenda? Is this supplier really trying to support us or is he in fact competing with us?&lt;/li&gt;    &lt;li&gt;Design Risk: Is this design decision appropriate for dealing with the requirements?&lt;/li&gt;    &lt;li&gt;Requirements risk: Do we really understand the requirements of our organization or the customers?&lt;/li&gt;    &lt;li&gt;Process risk: Is this the right development process?&lt;/li&gt;    &lt;li&gt;…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For dealing with risks, there are lot of different ways. Technical risks and architecture risks can be reduced by a requirements-driven, test-driven approach with explicit assessment activities and refactoring activities. Political risks require the architect to communicate and lead efficiently and effectively.&lt;/p&gt;  &lt;p&gt;An important point is this context: to be able to deal with risks, we must make them explicit. Implicit risks are often overseen, forgotten or ignored. You should really know your “enemy”.&lt;/p&gt;  &lt;p&gt;Making risks explicit means to document AND communicate them.&lt;/p&gt;  &lt;p&gt;I recommend to introduce a template for risk assessment comprising:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Name of the risk&lt;/li&gt;    &lt;li&gt;Priority/Relevance of the risk&lt;/li&gt;    &lt;li&gt;Type of risk: organizational, technical, …. &lt;/li&gt;    &lt;li&gt;Rationale: explain why this is a risk&lt;/li&gt;    &lt;li&gt;Context: what else should we know when dealing with this risk&lt;/li&gt;    &lt;li&gt;Strategies: possible ways to deal with the risk&lt;/li&gt;    &lt;li&gt;Decision: the recommended strategy to deal with the risk for the concrete context, and the rationale for this decision&lt;/li&gt;    &lt;li&gt;See also: other risks this risk implies or similar risks that could be treated with the same strategy&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Not all of these fields need to be available in the beginning. You could start with name, type, context, thus collecting the risks first. Then, you could prioritize the risks, and eventually extend the templates for this risks identified as high risks with missing information. &lt;/p&gt;  &lt;p&gt;Let me give you an example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Name: Uncertainty Using EJB&lt;/li&gt;    &lt;li&gt;Priority: high (******)&lt;/li&gt;    &lt;li&gt;Type: technical&lt;/li&gt;    &lt;li&gt;Rationale: capability to meet the performance requirements of 100000 transactions/hour. We are not sure whether EJB will be appropriate&lt;/li&gt;    &lt;li&gt;Context: Our developers are not experienced with EJB&lt;/li&gt;    &lt;li&gt;Strategies:1) Build performance prototype first. 2) Hire external expert. 3) Use Enterprise OSGi instead. 4) Outsourcing.&lt;/li&gt;    &lt;li&gt;Decision: Hire external consultants. Let them build a performance prototype and then help implementing the system when EJB proves to be a reasonable choice.&lt;/li&gt;    &lt;li&gt;See also: we are not sure whether MySQL can cope with the throughput requirements.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It is worth mentioning that risk assessment is not exclusively provided by software architects. In fact, all roles in the project must help and closely cooperate for risk assessment. This way, everyone involved is aware of potential risks. And of course, some risks such as those implied by organization, test quality, or quality of requirements must be identified and clarified by other roles such as product and project management, requirements engineering or test and quality management.&lt;/p&gt;  &lt;p&gt;Architecture and design decisions should then take risks into account.&lt;/p&gt;  &lt;p&gt;Mind the risks: The highest risk is not systematically dealing with risks.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5209624885865820363?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5209624885865820363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5209624885865820363' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5209624885865820363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5209624885865820363'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/07/risk-driven.html' title='Risk-driven'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4382283557967921633</id><published>2009-07-17T08:13:00.002+02:00</published><updated>2009-07-17T08:32:11.484+02:00</updated><title type='text'>Who is responsible</title><content type='html'>Suppose, you are working in a software development project as a software architect. You are still waiting for the requirements to be available in sufficient quality and quantity and priorization. Even after months almost nothing happens. Sure, the problem is caused by requirements engineering. But what is your responsibility as an architect? Your responsibility is to communicate and escalate which requires courage. For example, you could tell the stakeholders what implications the current situation might have - for example, you cannot start with architecture design which means development cannot start with implementation etc.  You should never fall into the "this is not my job" trap. After all, software architects need to drive the project. Sometimes, it might be even possible to take responsibility for requirements as an architect but this should be the exception not the rule. &lt;br /&gt;Similar issue for test &amp; quality: if test coverage is only limited, bugs are seldomly found during testing, or tests themselves are faulty, then you could finger point to testers and developers. However, it is your job as an architect to deal with quality. Don't try to escape your responsibility in this area. Test First Design makes it very clear that testing requires the different roles to cooperate.&lt;br /&gt;What about business aspects? I know, you got this product manager who is in charge of all business aspects. But software architects are responsible in helping develop the technology roadmap, identifying patents, estimating the business implication of architecture decisions. Even more, architects must base every architectural decision on requirements and business needs.&lt;br /&gt;Hmmh, what about project management? Of course, an architect should not be forced to also act as a project manager. These two rules are very difficult to live at the same time in the same project. But what if project management needs to estimate costs and resources? Here the software architect needs to provide support. What skills do developers need? How many developers and how much time are necessary to develop subsystem A.&lt;br /&gt;I don't claim that architects shuld be jack of all trades but masters of none. Their main focus should be on software architecture. However, they cannot ignore what is happening on the boundaries between software architecture and the rest of the project. They should feel responsible for project success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4382283557967921633?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4382283557967921633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4382283557967921633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4382283557967921633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4382283557967921633'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/07/who-is-responsible.html' title='Who is responsible'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-713215159027496205</id><published>2009-05-21T18:52:00.001+02:00</published><updated>2009-05-21T20:59:22.550+02:00</updated><title type='text'>Domain Models (continued)</title><content type='html'>&lt;p&gt;Throughout my life as a software engineer I have participated in many different projects in various domains. Needless to say, I encountered some deja vu experiences in those projects, also known as war stories. One remarkable example always has been the problem domain itself. Even in projects with lots of experienced participants the problem domain had been often root of misunderstandings and misconceptions.&amp;#160; In large projects with outsourcing partners, external partners and other suppliers common knowledge of the problem domain is essential. A project&amp;#160; with lack of problem domain knowledge among the stakeholders is doomed to fail. Remember the tower of babel where lack of communication and insufficient common understanding lead to lethal catastrophe. &lt;/p&gt;  &lt;p&gt;As I am mostly acting as software architecture mentor and coach or technology expert I am often master of the solution domain, but not of the problem domain. For me it is inevitable to obtain a detailed knowledge of the problem domain. This is even more important when developing product lines or platforms, because in that case lack of common understanding influences more than one product or solution.&lt;/p&gt;  &lt;p&gt;How could we address that problem? My recommendation is to introduce a domain model. Of course, I am referring to the problem domain in this context.&amp;#160; A domain model is not just a glossary of terms – a common misconception I am often facing. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;A &lt;strong&gt;domain model&lt;/strong&gt; consists of all core concepts (actors, subsystems, components, services, …) relevant within that domain as well as the relationships and interactions between these core concepts.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A large domain typically consists of subdomains. For example, a telecommunications domain for Unified Communication might introduce subdomains such as basic communication or presence. As a consequence, the domain should be partitioned hierarchically into subdomains.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;There are different ways to descible a domain model, from informal approaches to strictly formal definitions such as a domain-specific language. In all cases, stakeholders might select textual or graphical representations, whatever is more appropriate. &lt;/p&gt;  &lt;p&gt;Note that I have not assigned the responsibility of introducing a domain model to software engineers. Defining a common domain model should rather be a joint endeavor of all stakeholders, maybe driven by requirements engineers and architects. &lt;/p&gt;  &lt;p&gt;If you have ever read definitions of software architecture like the one by ANSI/ISO, you might recognize that architecture definitions match closely with my definition of domain models. First of all, those architecture definitions are insufficient (due to their genericity). Secondly, a domain model is a good starting point for creating the architecture. Take the use cases (black box view) and specify their dynamics using the domain model entities (white box views). Supplement this architecture core with design tactics for non-functional requirements. This will lead to the architecture baseline. Using the domain model also helps you staying focused on the problem domain instead of diving to the solution concepts too early. &lt;/p&gt;  &lt;p&gt;Eventually, a domain model defined, understood and agreed by the various stakeholders such as requirements engineers, developers, testers, architects, product managers, customers serves as a fundamental mean for architecture design and communication.&amp;#160; &lt;/p&gt;  &lt;p&gt;Of course, the solution domain itself can also be expressed by a domain model. This is why the main task of an architect consists of mapping a problem domain to a solution domain. &lt;/p&gt;  &lt;p&gt;Formalizing both to a sufficient extent helps automating this process using model-based software development approaches. Such automation, however, might be too expensive for one-off applications or smaller product lines.&lt;/p&gt;  &lt;p&gt;Whenever you are participating in a development process in the presence or future: do not forget to specify the domain model if not already available.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-713215159027496205?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/713215159027496205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=713215159027496205' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/713215159027496205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/713215159027496205'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/05/domain-models.html' title='Domain Models (continued)'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2073953242619061821</id><published>2009-05-17T19:29:00.001+02:00</published><updated>2009-05-17T19:29:32.056+02:00</updated><title type='text'>Podcast on Software Architecture</title><content type='html'>&lt;p&gt;For those of you capable of understanding German, I’d like to point you to our new Podcast on Software Architecture called &lt;a href="http://www.heise.de/developer/podcast/"&gt;Software ArchitekTOUR&lt;/a&gt;. You may also search in the ITunes Store for the podcast and find it – for example, search for ARCHITEKTOUR in the podcast category.&lt;/p&gt;  &lt;p&gt;The Podcasters are&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Markus Völter (freelancer, associated with ITEMIS)&lt;/li&gt;    &lt;li&gt;Stevan Tilkov (innoQ)&lt;/li&gt;    &lt;li&gt;Christian Weyer (thinktecture)&lt;/li&gt;    &lt;li&gt;Michael Stal (Siemens)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To stay in touch with reality we have split up the podcast in three subcategories:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;General Architecture Topics (sponsored by IBM)&lt;/li&gt;    &lt;li&gt;Java and Software Architecture (sponsored by innQ, itemis, thinktecture and Siemens)&lt;/li&gt;    &lt;li&gt;Microsoft Technologies and Architecture (sponsored by Microsoft)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are already 4 episodes available. Episode 0 is more intended to introduce ourselves. Episodes 1-3 cover patterns in general, as well as patterns in Java respectively .NET.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Listen, enjoy, and give us feedback&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2073953242619061821?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2073953242619061821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2073953242619061821' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2073953242619061821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2073953242619061821'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/05/podcast-on-software-architecture.html' title='Podcast on Software Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7681665662861853399</id><published>2009-05-12T09:00:00.001+02:00</published><updated>2009-05-12T09:02:58.399+02:00</updated><title type='text'>Simplicity rules</title><content type='html'>&lt;p&gt;Many architectures are overwhelming. Not that they shine due to their excellent quality. Rather they appear as a big ball of mud. I already mentioned what I am calling design erosion in the context of architecture refactoring. &lt;/p&gt;  &lt;p&gt;To keep an architecture small, expressive and simple we can do a couple of things as software architects. &lt;/p&gt;  &lt;p&gt;For example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Each and every design decision must be based on an architecturally-relevant requirement. There is no decision without documented reason. Of course, this requires architects to feel responsible for the quality of these architecture requirements, but not for requirements engineering, of course! It is recommended practice to keep track on where in the architecture which requirements are “located”. Requirements traceability is an essential value, especially when assessing, refactoring or evolving a system. I am assuming here that architects already checked for the feasibility and essence of the requirements from a business perspective. Availability of 99.99999% is not reasonable in a project with a budget of 100k bucks.&amp;#160; &lt;/li&gt;    &lt;li&gt;Introduce symmetry and conceptual integrity. This includes the prescription of specific patterns, the introduction of design and coding guidelines, as well as the introduction of guidelines for (at least the most important) non-functional qualities. This prevents that the same problem is solved in various ways within the same solution space and it makes sure, we are applying best practices from experts instead of reinventing the wheel. War story: A system where designers have introduced dozens of ways for fault handling will be inexpressive and complex.&lt;/li&gt;    &lt;li&gt;Don’t consider technologies as toys. Many projects play with technologies. They base their decisions on a technology-first approach. This is human and we as software engineers like to experiment with the new hip operating system or SOA middleware. But in practice, we should first create an appropriate architecture meeting the requirements (see first bullet point) before we should start introducing new technologies. The business and the requirements drive the architecture, not technology.&lt;/li&gt;    &lt;li&gt;Test technology. The previous point does not mean we should not care about technology – only that we first address the requirements. Every technology must be checked for its appropriateness. If your task is to build a high performant messaging backbone, then you better check whether EJB is really the proper platform to use. Don’t trust any vendor’s promises here! They do not know your problem context and system environment. Building throw-away prototypes is the best way to check technologies.&lt;/li&gt;    &lt;li&gt;Apply a test-driven development approach: this is to introduce a kind of safety net. Emphasize testability in your architecture design, e.g., by proper modularization, interfaces, and service contracts. Test-driven in this sense also includes regular design and architecture assessment where you try to identify architecture smells. &lt;/li&gt;    &lt;li&gt;Regular architecture refactoring helps address architecture issues early. When a dependency cycle has just been introduced unintentionally, it is not a big issue to detect this kind of design erosion early with architecture reviews or architecture analysis tools. You are then able to get rid of the problem early by architecture refactoring. The more you wait, the more architecture entities will make it difficult to address the problem without heavy impact. Thus, do regular architecture reviews and refactorings. &lt;/li&gt;    &lt;li&gt;Strategic before tactical design. Don’t try to introduce over-generic solutions with myriads of configuration options. First address all strategic requirements (functional requirements and operational requirements) before dealing with tactical issues such as modifiability. Use the Open/Close principle to open your architecture for variation. &lt;/li&gt;    &lt;li&gt;Introduce priorities for all requirements/features. The priorities help decide which requirement to address first in architecture design. If security is more important than performance, you’ll end up in a completely different solution architecture, then wheny performance has the higher priority.&lt;/li&gt;    &lt;li&gt;Follow an approach of piecemeal growth. In all but the most trivial applications a big design upfront approach will be doomed to fail. Thus, assign requirements depending on their priorities to iterations and build your system incrementally. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;These are only a handful of recommendations. Certainly, there are even more. Any tipps from your side?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7681665662861853399?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7681665662861853399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7681665662861853399' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7681665662861853399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7681665662861853399'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/05/simplicity-rules.html' title='Simplicity rules'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5417842957563381256</id><published>2009-03-28T14:00:00.001+01:00</published><updated>2009-03-28T14:00:55.407+01:00</updated><title type='text'>Get off of my Cloud</title><content type='html'>&lt;p&gt;It enters the stage as one of the great buzzwords of the last months and if we had not to deal with an economic crisis these days it would gain much more attention. Cloud Computing and its relatives such as SaaS are dominating the IT world. Ever heard about Windows Azure, Google Web Apps, Amazon E2C and S3? The idea behind this paradigm is rather old: why not provide resources transparently as services&amp;#160; in a hosting infrastructure? This would let IT departments and CIOs refrain from being infrastructure providers. Instead they could focus on their actual job: providing IT functionality to drive their company's business.&amp;#160; &lt;/p&gt;  &lt;p&gt;By services I don't just mean applications, but all kinds of services.&amp;#160; An application such as a CRM app could be a service. Likewise, services could comprise a&amp;#160; piece of middleware such as a persistence solution or a workflow management system. And in the most extreme case, even the infrastructure itself, for example, operating systems, storage or network solutions might be deployed as services. Services where ever you look.&lt;/p&gt;  &lt;p&gt;The idea behind cloud computing is a very promising one. Just take trusted infrastructure providers, let them host the applications (services) we need within an Internet-based cloud, and access these services from an inexpensive device. No need to buy or maintain your own data center solutions anymore. A data center on everyone's desktop if you like. Whenever you need more resources, just take them from the cloud and only pay for what you use. &amp;quot;Elastic computing&amp;quot; made real. Sounds like a good idea in an economic crisis, doesn't it? The strength and weakness of Cloud computing today is its dependence on external providers. Would you run your mission-critical applications with sensitive data on a 3rd party infrastructure that is not under your control and which supports multi-tenancy? What about services running in a remote country that you do not trust? How can a provider guarantee quality-of-service in an Internet-based infrastructure? Remember all the recent downtimes of Google Mail. What if all your company mail is running on such a network?&lt;/p&gt;  &lt;p&gt;These problems imply a strategy where mission critical applications only run in a private cloud, while only a fraction of less critical applications may leverage public clouds. As soon as the Cloud Computing technology evolves and matures, more and more services might be moved to public clouds.&amp;#160; Then, private clouds could also be extended using public clouds. By the way, this extension approach is only feasible if standards foster interoperability of cloud solutions.&lt;/p&gt;  &lt;p&gt;From 10000 feet Cloud Computing denotes sort of a business solution that introduces pay-per-use models for all types of services. Regarding technology this solution is based upon a bunch of existing paradigms such as virtualization, SOA, Multicore CPUs, NAS, or Web 2.0. &lt;/p&gt;  &lt;p&gt;What all those people enthusiastic about Cloud computing tend to forget, is that there is no free lunch. It, indeed, represents a promising technology with a high coolness factor. However, from a software architecture perspective, it is rarely sufficient to just deploy application silos in virtual machines that are hosted somewhere else in the network. To really leverage clouds your applications need to be aware of the cloud infrastructure. You might split islands of functionality into interconnected services, and integrate application services with other platform or infrastructure services. What about issues such as collocation of services and data? In addition, engineers need to create desktop-like GUIs that communicate with backend services as promoted by Web 2.0. Last but not least, quality of service such as availability or responsiveness does not only depend on infrastructure and platform but is heavily influenced by the solution architectures.&amp;#160; The best infrastructure or platform does not help if the software architecture is a bunch of crap.&lt;/p&gt;  &lt;p&gt;Cloud Computing offers fascinating new possibilities. But we shouldn't suffer from the hammer-and-nail syndrome. When applied inefficiently Cloud computing will inevitably lead to problems and disappointments. If your management or CIO department is all of a sudden promoting Cloud computing, this might be a good thing, but it also requires you as a software engineer to deal with expectation management. And finally, mind the architecture!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5417842957563381256?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5417842957563381256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5417842957563381256' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5417842957563381256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5417842957563381256'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/03/get-off-of-my-cloud.html' title='Get off of my Cloud'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-504019063374433612</id><published>2009-03-27T19:30:00.001+01:00</published><updated>2009-03-27T19:30:07.398+01:00</updated><title type='text'>My Domain is my Castle</title><content type='html'>&lt;p&gt;One of the most important (first) steps in architecture modeling encompasses the description of the domain model. This model introduces all entities relevant within the current domain as well as their relationships and interactions. It represents the main language all stakeholders should understand. All further activities in architecture modeling basically take the domain model and enrich it with additional infrastructure entities.&amp;#160; &lt;/p&gt;  &lt;p&gt;Sounds very abstract, right? Let me give you a concrete example. Suppose, we are going to develop a Web store. What are the typical objects that appear in the problem space and are well known to all stakeholders? &lt;/p&gt;  &lt;p&gt;For example, I'd expect entities such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;web store user: someone accessing the web store&lt;/li&gt;    &lt;li&gt;customer: someone interested to buy items&lt;/li&gt;    &lt;li&gt;shopping cart: used to add, remove, pay goods&lt;/li&gt;    &lt;li&gt;product catalog: presents all available products classified by categories and allows to search for these products using different types of query&lt;/li&gt;    &lt;li&gt;customer database: place where all customer information is stored&lt;/li&gt;    &lt;li&gt;order processing: responsible to process orders&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you think about this example further, you'll recognize there are some typical relationships between domain objects. For example: a web store user could be a customer or an administrator. A customer typically owns at most one shopping cart at the same time.&lt;/p&gt;  &lt;p&gt;You also can easily defer some interactions between the entities. It is obvious there must be a relationship between the shopping cart and the product catalog, because the information about purchased items is read and updated from the product catalog. Of course, the shopping cart needs to interact with the order processing system after the customer has pressed the order button.&lt;/p&gt;  &lt;p&gt;With other words: when thinking about how use cases would be mapped to sequence or interaction diagrams, the knowledge about the domain model is essential. It is the step taking you from a black box perspective to a gray box perspective.&lt;/p&gt;  &lt;p&gt;There are different ways to express such a domain model. You could invent a graphical representation or use a textual language instead. If a domain object model gets formalized, we call this a DSL (Domain-Specific Language). In this case, engineers could even provide generators that map from the problem domain to the solution domain, i.e., that map problem domain objects and relations to solution domain objects and relations.&lt;/p&gt;  &lt;p&gt;Using domain models offers huge advantages: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;it introduces a common vocabulary among all stakeholders which supports effective discussions and often prevents a steep learning curve for domain dummies&lt;/li&gt;    &lt;li&gt;it reduces the chance of missing to address important parts of a domain&lt;/li&gt;    &lt;li&gt;it eases architecture modeling significantly&lt;/li&gt;    &lt;li&gt;it helps focusing on the problem domain instead of always diving into the solution domain&lt;/li&gt;    &lt;li&gt;when enriched with domain patterns (analysis), it boosts productivity&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It is neither necessary nor useful trying to come up with a complete domain model in the first place. In most cases, there will be an initial, maybe incomplete, domain model which engineers together with the other roles will evolve over time. &lt;/p&gt;  &lt;p&gt;There are several examples, where the domain model is already available. Think about GUIs, compilers, and some kinds of healthcare domains. In these domains, it is useless and a complete waste of time to come up with your own domain model.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So, whenever you are being involved in a new software architecture, always mind the domain object model! It will be your best friend.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-504019063374433612?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/504019063374433612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=504019063374433612' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/504019063374433612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/504019063374433612'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/03/my-domain-is-my-castle.html' title='My Domain is my Castle'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8225884171432858498</id><published>2009-03-21T12:24:00.001+01:00</published><updated>2009-03-21T12:27:16.225+01:00</updated><title type='text'>Software and System Architecture</title><content type='html'>&lt;p&gt;Currently, I am involved in a large-scale project where Siemens Healthcare is building a couple of very innovative and exciting particle therapy systems. These systems are rather challenging as they consist of complex software, hardware&amp;#160; - for example, a circular particle accelerator - and all the other constituents such as the building, the CT devices. It is a typical project where software while being a major element is only contributing a small part of the system. However, within our company which yields revenues of over 70 billion euros a year, software engineering has become a major business factor. According to an estimation 60-70% of these revenues already depend on software.&amp;#160; Now imagine, 10% or even more of our projects would fail - what a nightmare! There are two implications: first of all, lead software architects must be well educated in software architecture and technology and show the right leadership skills. Secondly, system and software architecture must be treated as two sides of the same coin. So, what are the responsibilities&amp;#160; of software architects and system architects and how should they cooperate? I tried to find an appropriate definition in Wikipedia and failed. Especially, system architecture seems to be not well understood or ambiguous. &lt;/p&gt;  &lt;p&gt;From my viewpoint an effective partitioning in software and system architecture depends on the characteristics of the project itself. If software constitutes the main part of the product or solution, then the lead software architect could and should also be system architect. Obviously, an additional IT architect&amp;#160; makes a lot of sense if the underlying infrastructure is sufficiently complex, but that's a different story.&lt;/p&gt;  &lt;p&gt;In projects where hardware and software are of the same relevance or where hardware dominates, for example in most embedded systems, a system architect should be in the lead and co-operate with a hardware and a software architect. The system architect then should care a lot about testing. I have been involved in projects where I was in charge of the software system but got only rarely access to the target system. Thus, we had to use the development system where everything worked stunningly fine, but got deadlocks when finally moving to the target system - the OS of the target system had a faulty implementation of&amp;#160; the Sockets libraries. This implies, that the system architect should allow software and hardware development to happen almost independently, but introduce a lot of sync points where software/hardware integration is checked thoroughly. By the way, a similar problem occurs when partitioning a software system into modules which are then designed and implemented by different teams - think of outsourcing in the extreme case. If integration and system testing is neglected, you will encounter a lot of bad experiences. It is much more complex and challenging to check hardware/software integration than the integration of software modules - at least in theory :-;&amp;#160; One of the bad experiences you might need to cope with is that hardware requirements are often considered almost fixed, while software requirements are considered &amp;quot;soft&amp;quot;. Would you ever change the main specifications of an airplane shortly before it is delivered? Definitely not! But this does not hold for software systems.&amp;#160; One of the consequences of this fact might be that the hardware team has already finished their part, being reluctant to change anything. As the software requirements have changed in the project, software development has fallen behind schedule. In these situations, software architects sometimes become the scapegoats of system development. A good system architect should be capable of handling these situations effectively and efficiently by better synchronizing the different teams.&lt;/p&gt;  &lt;p&gt;A system architect should also make sure that the overall system requirements are mapped consistently and completely to software architecture and hardware related requirements. He or she should care about requirements traceability, especially for those requirements that have to be implemented in software and hardware as well.&amp;#160; If hardware comprised the core part of the system, software architects should have a sound understanding of the overall system, not just of the &amp;quot;soft&amp;quot; parts.&lt;/p&gt;  &lt;p&gt;Basically, you could consider the partitioning of software and system architecture responsibilities in almost the same way like splitting responsibilities between software architects and the lead architect. The system architect is in charge of the whole system, while the software architect is in charge of a part of the system.&lt;/p&gt;  &lt;p&gt;There is a lot more to say about this topic. But I am curious what you think and I am wondering about your experiences with software and software architecture as well as with the respective roles. Any comments highly appreciated.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8225884171432858498?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8225884171432858498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8225884171432858498' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8225884171432858498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8225884171432858498'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/03/software-and-system-architecture.html' title='Software and System Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8137492094993324507</id><published>2009-03-18T20:33:00.006+01:00</published><updated>2009-03-18T20:57:11.310+01:00</updated><title type='text'>News from the Engineering Frontier</title><content type='html'>I have been to the Canary Islands for a month. Since then I have been totally busy in two projects. One of them is dealing with medical particle therapy solutions, while the other one consists of setting up a certification program for software architects within Siemens. I am in charge of this program. Last week I was giving a seminar on software architecture with 12 guys from Siemens. I had a really great time and hope the same holds for the participants.&lt;br /&gt;&lt;br /&gt;It is time to post more on this blog. Yes, I feel guilty for being so lazy. But you know, I am in love with Work-Life-Balance. To be honest, I needed a timeout from all software engineering business for a while, instead focusing on sports activities and digital photography. Now, I am really motivated to enter the software architecture bandwagon again. Last monday, we (= Markus Voelter,Stefan Tilkov, Christian Weyer, and myself) started with a new podcast series on software architecture. This will be in german with some company sponsors. I will keep you informed about the details when things mature. I am wondering whether a software architecture podcast in english would make sense. &lt;br /&gt;&lt;br /&gt;In the medical particle therapy project we have just defined a possible partitioning between system architecture and software architecture. Seems to be a major source of misunderstandings in many projects. Same for differentiating problem and solution domain. Engineers seem to be addicted to the solution domain drug. Instead of thinking hard about the problem domain we always try entering safe ground, in particular by addressing solutions very early. The problem is: how can we define a solution when we don't understand the problem?  On the other side, bubbles don't crash, as we also know. We could endlessly define UML diagrams without ever dealing with implementation. As Bertrand once said: all you need is code. Thus, we need to ensure the feasability of our solution very early. How can we satisfy both goals? Needless to say, agile development is the right answer. &lt;br /&gt;&lt;br /&gt;Of course, there are a lot of additional issues when addressing the boundary between system and software architecture. This will be subject to upcoming posts, All feedback and comments as always highly appreciated&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8137492094993324507?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8137492094993324507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8137492094993324507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8137492094993324507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8137492094993324507'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/03/news-from-engineering-frontier.html' title='News from the Engineering Frontier'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2926966755362655651</id><published>2009-01-20T00:43:00.001+01:00</published><updated>2009-01-20T00:43:13.560+01:00</updated><title type='text'>Views on a Cat</title><content type='html'>&lt;p&gt;Suppose, you're going to design a new software system for a specific domain. One of the first steps is to introduce a domain object model which comprises the core entities in the domain as well as their relationships. That's easy, you might say. If it is that simple, why do so many&amp;#160; projects fail in establishing the right domain object model? And, of course, this challenge inevitably appears in all kinds of modeling activities.&lt;/p&gt;  &lt;p&gt;But now for something completely different - as Monty Python would say. I got two nice cats at home. In order to model a cat, there are different possibilities:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;(ATOM) We could consider a cat as a mere collection of molecules.&lt;/li&gt;    &lt;li&gt;(GENE) Obviously, a cat can be uniquely identified using its DNA. &lt;/li&gt;    &lt;li&gt;(BODY) Another approach is modeling a cat as an aggregation of subsystems such as legs, joints, muscles, intestines.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Does it make sense to apply the first model (ATOM) in order to understand how a cat moves? No, because the detail level is overwhelming.&lt;/p&gt;  &lt;p&gt;Is it useful to use the third model for understanding all chemical activities within a cat? Definitely not!&lt;/p&gt;  &lt;p&gt;With other words, we can model the same physical concepts in different ways, each of these views strongly depending on the purpose of the model. Don't let yourself be confused. It is not as simple as having only one model for one purpose. For example, to understand the physical appearance of a cat, you could apply model ATOM as well as model BODY.&lt;/p&gt;  &lt;p&gt;What are the implications of this observation?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;First of all, you might require different models (views) in order to define and understand a software system.&lt;/li&gt;    &lt;li&gt;Secondly, each model should be motivated by a concrete and useful purpose.&lt;/li&gt;    &lt;li&gt;Thirdly, all participants should agree on syntax and semantics of the model.&lt;/li&gt;    &lt;li&gt;And last but not least, all models should be documented.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mind the word &amp;quot;useful&amp;quot; in the second bullet point. As organization drives architecture, the organization often directly maps to entities in the model. If your organization is badly structured, your architecture will reveal the same problem. Think about this in the context of your own organization.&lt;/p&gt;  &lt;p&gt;As another consequence I'd like to emphasize that it is not sufficient just inventing a couple of sophisticated models. The set of models should also be simple, complete and consistent. All of the models should complement each other in a meaningful and appropriate way. That's the reason why we got view sets such as the UML 4+1 view.&lt;/p&gt;  &lt;p&gt;Unfortunately, I often sit in project meetings where people strongly believe they are all sharing the same view of their domain, while in fact they are not. Endless discussions might be an indicator for this problem. Thus, it is essential to explicitly come up with a common domain model that is agreed among all participants. Basically, the design of such a model should be one of the early steps&amp;#160; in a development project (directly after scoping but before architecture design). Needless to say that software engineers are surrounded by models: they have specific views of the problem domain and the solution domain, use tools such as compilers or database systems that themselves are built on top of models.&lt;/p&gt;  &lt;p&gt;If a software developer's life is about models and model transformations (e.g., the mapping from the problem domain to the solution domain) we should consider models as first class citizens and invest sufficient time for choosing the right viewpoints and establishing the right models. &lt;/p&gt;  &lt;p&gt;Interestingly, even our view of the physical world such as the way we understand a cat is determined by models. But this is a different story.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2926966755362655651?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2926966755362655651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2926966755362655651' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2926966755362655651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2926966755362655651'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/01/views-on-cat.html' title='Views on a Cat'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7207803899086306255</id><published>2009-01-09T16:55:00.001+01:00</published><updated>2009-01-11T13:04:27.874+01:00</updated><title type='text'>Archidictatorship versus Develepocracy</title><content type='html'>&lt;p&gt;In the software development projects where I am involved as an architect I&amp;#160; can typically observe different types of software architects. Let me illustrate two extremes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Some architects try hard not to decide anything or at least not too early. These architects typically integrate all other project participants in the decision process.&amp;#160; On one hand, this can be a very successful approach. If everyone agrees to important decisions, everyone remains motivated. On the other hand, the same habitude leads to the risk of decisions being postponed endlessly. Eventually, architects constantly drawing new UML diagrams or deep diving into technical details are a problem not a solution.&amp;#160; In most cases, wrong decisions are better than no decisions, because wrong decisions can be detected very early and all problems resolved. Think of refactoring as a tool! &lt;/li&gt;    &lt;li&gt;Other architects prefer a kind of tyranny. They got a lot of self esteem, believe to know everything, adore the Borgs for their &amp;quot;resistance is futile&amp;quot; strategy. This style of leadership can come very handy in critical situations where project success depends on strong leadership, for example when you require fast decisions. The downside of this dictatorship is that architects behaving this way may not get buy-in from other participants, thus leading to a high level of demotivation. And obviously, too much power in the hands of the wrong persons can lead to projects being doomed to fail miserably. A negative implication might be that those dictators want to get involved in every decision, even in unimportant ones.&amp;#160; As no one is able to understand all details in the case the project is large enough, you'll inevitably will experience lots of wrong decisions. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You will argue that these leadership styles are not specific to software architects, and, of course, you are absolutely right!&lt;/p&gt;  &lt;p&gt;What I'd like to emphasize in this posting is the importance of leadership skills for software architects. Of course, there are situations where an architect should be dictator, and other situations where democracy might be the more appropriate choice. &lt;/p&gt;  &lt;p&gt;Unfortunately, or should I say fortunately, all of us got different personalities. Your leadership style should fit with your personality, because otherwise everyone will recognize the discrepancy.&lt;/p&gt;  &lt;p&gt;I won't cover leadership styles in too much detail because there are persons much more knowledgeable than I in this context. Just read this &lt;a href="http://www.nwlink.com/~donclark/leader/leadstl.html"&gt;&lt;strong&gt;one&lt;/strong&gt;&lt;/a&gt; or that &lt;strong&gt;&lt;a href="http://www.mindtools.com/pages/article/newLDR_84.htm"&gt;one&lt;/a&gt;&lt;/strong&gt;. A Web search will even yield more material.&lt;/p&gt;  &lt;p&gt;What I consider really helpful is a kind of self analysis. For instance:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;em&gt;Personality&lt;/em&gt;: analyze your own personality, try to find your strengths and weaknesses. Ask other people how they assess you as an architect. How do you evaluate yourself acting as an architect? A very helpful tool might be to analyze previous projects: where did you succeed and why and where did you fail. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Leadership Styles&lt;/em&gt;: read about all possible leadership styles. Nothing more to add here. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Context&lt;/em&gt;: Think in your project context what leadership style should be applied in which situation. Of course, you can't act as a dictator in front of your head of R&amp;amp;D. Likewise, always striving for full agreement by every developer can result in endless recursion. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;For a software architect, the time spent for communication might be as large as 50%. Communication means interacting with other people, informing them, guiding and mentoring them, or getting their buy-in. Without the right social skills and leadership style, a software architect is doomed to fail.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7207803899086306255?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7207803899086306255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7207803899086306255' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7207803899086306255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7207803899086306255'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2009/01/archidictatorship-versus-develepocracy.html' title='Archidictatorship versus Develepocracy'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1096629435249850568</id><published>2008-12-03T12:24:00.003+01:00</published><updated>2008-12-05T20:56:52.966+01:00</updated><title type='text'>Panic mode</title><content type='html'>If you carefully observe the current economic crisis, you'll recognize that some market participants are acting in panic mode. This comes to no surprise if you ever have read books like those by Jose Ortega y Gasset. Unfortunately, panic mode is never helpful because it leads to spontaneous activities that are not motivated by thorough and systematic planning. Instead, people tend to think they have to react quickly and often draw the wrong conclusions which worsens the situation instead of improving it. If you look at some current stock values such as Intel or Siemens the situation is somehow out of control. With other words: it could be a could idea to buy stocks now. Maybe, Douglas Adams was wright when he once mentioned that nothing can travel faster than light with one exception: bad news!  &lt;br /&gt;  &lt;br /&gt;If you look at software development projects, you'll often find the same issues. As soon as deadlines are getting delayed or dropped, participants are increasingly starting to get nervous. After a while the whole organization is typically entering panic mode. There is a possible alternative flow which I call Lemmings mode. This is when people refuse to recognize they are facing some severe problems and continue the project without any countermeasures which denotes a typical human behavior.  &lt;br /&gt;As an alien you'll recognize panic mode in an existing project by encountering different indicators. For example, if meeting frequency is high, and architects and developers spend more time for meetings than for productive work, this might either be a clue for developer's hell or for a project in panic mode. The same holds for situations where the organization is constantly generating new or enforcing uncontrolled and unplanned activities (actionism) in a higher rate than they can be processed. If you interview people in such a project context, you'll receive inconsistent and contradicting statements, because there is no synchronization or coordination in place.   &lt;br /&gt;  &lt;br /&gt;Although it is obvious that panic mode worsens the situation and even leads to conflicts among the persons involved, projects fall into this trap pretty often. I believe, this is caused by the psychological fact that all participants in such a project are caught in the trap. In these situations, I generally recommend to involve an external person who is not part of the problem (aka as project) and acts more as an external observer and mediator. In addition, this mediator needs a peer in the organization's senior management able to enforce all recommendations (if accepted), because otherwise all suggestions would be ignored. To be honest, architecture reviews or other forms of assessments work exactly that way.   &lt;br /&gt;  &lt;br /&gt;A way to address problems very early in projects is to use an agile approach, especially to elaborate what risks exist and how to address them systematically. In contrast to common believe such risks are non constrained to architecture and technology but also extend to politics, partner and vendor relationships, organization, quality, development processes. Risks analysis is not just about recognizing the risks but also about strategies and tactics for addressing them.  &lt;br /&gt;  &lt;br /&gt;By the way, this is exactly what currently happens in the economic crisis. Since market participants don't seem to be able to address the challenges themselves, politicians and central banks are forced to bring countermeasures in place. All the risks in the market have been subject to constant ignorance.   &lt;br /&gt;  &lt;br /&gt;The later risks are detected, the more likely the project will enter panic mode. This is why I always recommend regular flash reviews of architecture, code, test strategy, development process (for example, at the end of an iteration). They represent means for detecting problems very early and for getting rid of them (for example, by refactoring).   &lt;br /&gt;  &lt;br /&gt;To cite Douglas Adams: DON'T PANIC!  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1096629435249850568?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1096629435249850568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1096629435249850568' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1096629435249850568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1096629435249850568'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/12/panic-mode.html' title='Panic mode'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2558047630473256790</id><published>2008-11-07T17:57:00.001+01:00</published><updated>2008-11-07T17:57:32.481+01:00</updated><title type='text'>Why the waterfall model does not work</title><content type='html'>&lt;p&gt;Again and again I have met managers and software engineers who tried to convince me that agile processes while being appropriate for somebody else's project were simply not applicable to their problem contexts for several reasons. They came up with rather lame reasons like being used to waterfall models or the claim that agile processes do only work for small teams. Especially I am enjoying people's reaction when I am talking about really huge projects I had been involved and which followed the Scrum method.&lt;/p&gt;  &lt;p&gt;From my viewpoint the question shouldn't be whether to use agile development processes instead of a waterfall approach. I would rather suggest to let all those waterfall addicted prove why they consider waterfall approaches more suitable in terms of a concrete project.&amp;#160; &lt;/p&gt;  &lt;p&gt;It is true that an agile method is not superior in planning projects. Even in an agile context you will need to estimate resources, budgets, or time-frames in advance.&amp;#160; But in contrast to a waterfall approach you get an early feedback if your initial planing proves to be plain wrong: If after the third iteration you got an substantial delay you are able to react with appropriate countermeasures. In a waterfall model the old saying is that while 80% of the project have been completed, you still need to address the remaining 80%. You may be doomed to fail at the beginning of the project but a waterfall model lets you live with this illusion till the sad end. An agile method on the other hand just provides a whole range of safety nets. You may fall but contact with ground usually is much smoother. &lt;/p&gt;  &lt;p&gt;Let me take it the other way round. What are the preconditions to make a waterfall model succeed?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All requirements are available at project start and will remain unchanged.&lt;/li&gt;    &lt;li&gt;All of the requirements are consistent and complete.&lt;/li&gt;    &lt;li&gt;No errors will be introduced in any phase of software development.&lt;/li&gt;    &lt;li&gt;Likewise, all tools, legacy components, infrastructure parts fully adhere to their specifications and, of course, are consistent and complete themselves.&lt;/li&gt;    &lt;li&gt;All stakeholders start with a full understanding of the problem domain. Developers, testers, architects also have a full understanding of the solution domain.&lt;/li&gt;    &lt;li&gt;There will be no misunderstandings in any communication between stakeholders. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obviously, most of these preconditions never hold in any real-life project. We have to cope with error and failure. In agile approaches, the principle of piecemeal growth helps to master complexity. Safety nets such as test-driven development or reviews enable quick detection of potential problems. Means like refactoring support us in addressing the problems we detect and to embrace change.&amp;#160; Agile communication and customer participation&amp;#160; help in keeping all stakeholders synchronized. &lt;/p&gt;  &lt;p&gt;Two of the main principles of agile engineering might be called &amp;quot;embrace change&amp;quot; and &amp;quot;learning from failure&amp;quot;. &lt;/p&gt;  &lt;p&gt;And if we look at nature, evolution basically also represents an agile approach. For all creationists: evolution does not necessarily rule out that there could be a master plan behind everything.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What's your take on the agile versus waterfall dispute?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2558047630473256790?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2558047630473256790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2558047630473256790' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2558047630473256790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2558047630473256790'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/11/why-waterfall-model-does-not-work.html' title='Why the waterfall model does not work'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2891380499976667996</id><published>2008-10-24T21:05:00.001+02:00</published><updated>2008-10-24T21:12:55.183+02:00</updated><title type='text'>Integration</title><content type='html'>&lt;p&gt;Integration represents one of the difficult issues when creating a software architecture. You need to integrate your software in an existing environment and you typically also integrate external components into your software system. Last but not least you often even integrate different home-built parts to form a consistent whole. Thus, integration basically means to plug two or more pieces together where the pieces were built independently and the activity of plugging requires some previous efforts to make the pieces fit together. The provided interface of component A must conform to the required interface of component B.&amp;#160; If these components run remotely, interoperability and integration are close neighbors. &lt;/p&gt;  &lt;p&gt;For complex or large systems, especially those distributed across different network nodes, integration becomes one of the core issues.&lt;/p&gt;  &lt;p&gt;Integration necessities of external components or environments should be treated as high-priority requirements, while internal integration often is caused by the top-down architecture creation process. Examples for external component integration comprise using a specific UI control, running on a specific operating system, requiring a concrete database, or prescribing the usage of a specific SOA service. Internal integration comes into play when an architect partitions the software systems into different subsystems that eventually need to be integrated with each other.&lt;/p&gt;  &lt;p&gt;Unfortunately, integration is a multi-dimensional problem. It is necessary to integrate services, but also to integrate all the heterogeneous document and data formats. It is required to integrate vertically such as connecting the application layer with the enterprise layer and the enterprise layer with the EIS layer. Likewise, we need to integrate horizontally such as connecting different application silos using middleware stacks such as SOAP.&amp;#160; In addition, shallow integration is not always the best solution.&amp;#160; What is shallow integration in this context? Suppose, you have developed a graph structure such as a directory tree. Should you rather create one fat integration interface with complex navigation functionality or better provide many simple integration interfaces for all nodes in the tree?&lt;/p&gt;  &lt;p&gt;What about UI integration where you need to embed a control into a layout? &lt;/p&gt;  &lt;p&gt;What about process integration where you integrate different workflows such as a clinical workflow that combines HIS functionality (Hospital Information System) with RIS functionality (Radiology Information System)? Or workflows that combine machines with humans?&amp;#160; &lt;/p&gt;  &lt;p&gt;What if you have built a management infrastructure for a large scale system and now try to integrate an addition component that wasn't built with this management infrastructure in mind?&lt;/p&gt;  &lt;p&gt;Think about data integration where multiple components or applications need to access the same data such as accessing a common RDBMS. How should you structure the data to meet their requirements? And how should you combine data from different sources to glue data pieces to a complete transfer object?&lt;/p&gt;  &lt;p&gt;Semantic integration is another dimension where semantic information is used to drive the integration such as automatically generating adapter interfaces for matching the service consumer with the service provider. &lt;/p&gt;  &lt;p&gt;And finally, what about all these NFRs (non-functional requirements)? Suppose, you have built a totally secure system and now need to connect with an external component? &lt;/p&gt;  &lt;p&gt;It is needless to say that integration is not as simple as it often appears in the beginning. Even worse, integration is often not addressed with the necessary intensity early in the project. Late integration might require refactoring activities and sometimes even complete reengineering if there are no built-in means for supporting &amp;quot;deferred&amp;quot; integration - think of&amp;#160; plug-in-architectures as a good example for this.&lt;/p&gt;  &lt;p&gt;Architects should explicitly address integration issues from day 1. As already mentioned, I recommend to place integration issues as high-priority requirements into the backlog. Use cases and sequence diagrams help determining functional integration (the interfaces) as well as document/data transformation necessities (the parameters within these interfaces). During the later cycles in architecture development, operational issues can also be targeted with respect to the integrated parts. Last but not least, architects and developers need to decide which integration technologies (SOA, EAI, middleware, DBMS, ...) are appropriate for their problem context. Integration is an aspect crosscutting through all your system!&lt;/p&gt;  &lt;p&gt;Agile processes consider integration as a first-class citizen. In a paradigm that promotes piecemeal growth, continuous integration becomes the natural metaphor. From my perspective, all software developments with high integration efforts must inevitably fail when not leveraging an agile approach. &lt;/p&gt;  &lt;p&gt;To integrate is agile!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2891380499976667996?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2891380499976667996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2891380499976667996' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2891380499976667996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2891380499976667996'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/10/integration.html' title='Integration'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6241690507161852636</id><published>2008-10-03T22:29:00.001+02:00</published><updated>2008-10-03T22:33:38.635+02:00</updated><title type='text'>Trends in Software Engineering</title><content type='html'>&lt;p&gt;It has been a pretty long time since my last posting. Unfortunately, I was very busy this summer due to some projects I am involved in. In addition, I enjoyed some of my hobbies such as biking, running and digital photography. For my work-life balance it is essential to have some periods in the year where I am totally disconnected from IT stuff. But now it is time for some new adventures in software architecture.&lt;/p&gt;  &lt;p&gt;Next week I am invited to give a talk on new trends in software engineering. While a few people think, there is not more to discover and invent in software engineering, the truth is that we are still representatives of a somehow immature discipline. Why else are so many software projects causing trouble? I won't compare our discipline with other ones such as building construction&amp;#160; because I don't like comparing apples with oranges. For example, it is very unlikely that a few days before your new house is built, you're asking the engineer to move a room from the ground floor to the first floor. Unfortunately, those things actually happen in software engineering on a regular basis.&lt;/p&gt;  &lt;p&gt;A few years ago I wrote an article for a wide spread&amp;#160; german IT magazine on exactly the same issue. I built my thoughts around the story of a future IT expert traveling back with a time machine to our century. When he materializes, a large stack of magazines falls on his head - unintentionally - and he cannot remember anything but his IT knowledge. How would such a person evaluate the current state of affairs in software engineering?&amp;#160; Do you think, Mr. Spock from spaceship Enterprise will use pair programming or AOP? Wouldn't look very cool in a SciFi series, would it?&lt;/p&gt;  &lt;p&gt;To understand what software engineering is heading for in the future, it is helpful to understand that all revolutions always are rooted in continuous evolution. At one point in time, existing technology&amp;#160; cannot scale anymore with some new requirements which forces researchers to come up with new ideas. Mind also the competition challenge. The first one to address new requirements may be the market leader. Learning from failure is an important aspect in this context. So, what is currently missing or failing in software engineering? Where do we need some productivity boosts? An example for such new requirements might be new kinds of hardware or software. Take Multi Core CPUs as an example. How can we efficiently leverage these CPUs with new paradigms for parallel programming.&lt;/p&gt;  &lt;p&gt;As another example I consider the creation of software architecture. In contrast to many assumptions, most projects develop their software architecture still in an ad-hoc manner. We need well educated and experienced software architects&amp;#160; as well as systematic approaches to address this problem of ad-hoc development. Especially, the agility issue is challenging. Software engineers need embracing change in order to survive. Architecture refactoring is a promising technology in this area, among many others, of course. &lt;/p&gt;  &lt;p&gt;Another way of boosting productivity is to prevent unnecessary work. Here, product line engineering and model-based software development are safe bets. If the complexity of problem domains grow we cannot handle the increased complexity with our old tool set, We need better abstractions such as DSLs. And I simply cannot believe for the same reason that in a world with an increasing amount of problem domains, general purpose languages are the right solution. Wouldn't this be another instance of the hammer-nail syndrome? Believe me, dynamic and functional languages will have increasing impact.&amp;#160; &lt;/p&gt;  &lt;p&gt;In a world where connectivity is the rule, integration problems are inevitable. In this context, SOA comes immediately to my mind. With SOA I refer to an architecture concept, not to today's technology which I still consider immature. New, better SOA concepts are likely to appear in the future. SOA will evolve such as CORBA and all other predecessors did. Forget all the current ESB crap which already promises to cure all world problems.&lt;/p&gt;  &lt;p&gt;There is a lot more which will influence emerging software engineering concepts. Think of grids, clouds, virtualization, decentralized computing! Look at CMU SEI's document on Ultra-Large Scale Systems Linda Northrop was in charge of. You'll find there sufficient research topics we have to solve before ULS will be available.&lt;/p&gt;  &lt;p&gt;For us software engineers the good news is that we are living in an exciting&amp;#160; (although challenging) period of time.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6241690507161852636?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6241690507161852636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6241690507161852636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6241690507161852636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6241690507161852636'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/10/trends-in-software-architecture.html' title='Trends in Software Engineering'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2328808221326321881</id><published>2008-08-28T10:39:00.004+02:00</published><updated>2008-08-28T11:26:56.387+02:00</updated><title type='text'>The Silver Bullet</title><content type='html'>As I just read in a comment about silver bullets, I couldn't resist to address this topic :-)&lt;br /&gt;Frederick F. Brooks brought up the concept of silver bullets. Of course, Frederick was not refering to some weird persons who are turning into computer geeks during full moon and can only be stopped using these nice little silver bullets. Instead, he claimed that there never ever will be any software technology that can boost software development productivity by a factor of 10 or more. So far, he has been right. Object-Orientation? Really productivity-boosting, but not to an order of magnitude. Models? Nice try, but someone has to build the model and the generator. &lt;br /&gt;But won't there be any technology in the future that can refute this thesis? Suppose, an alien lifeform with incredible technology is visiting planet earth. How would they design software systems? Do we really believe, they would leave their giant space ship with a notebook, start modeling their systems with a kind of UML tool, and program in Java?  &lt;br /&gt;Thus,  could the Silver Bullet be a universal law, or just a kind of constraint only humans are facing due to their limited capabilities?&lt;br /&gt;Frederick F. Brooks also brought up the concept of accidental versus inherent complexity. Basically, each problem has an inherent complexity. You can't specify a a linear algorithm for the general sorting problem. Forget it, there is really no way!  But we ourselves are causing a lot of problems  by accidental complexity. Using an array for storing a sparsely populated 1000x1000 matrix isn't a very smart approach, right?&lt;br /&gt;No technology can get rid of inherent complexity, but it could hide this kind of complexity from the user. Hiding complexity is one way to increase productivity - just make it a SEP (Somebody Else's Problem). Helping to address accidental complexity is another. Consequently, the best productivity boost results from combining both. &lt;br /&gt;According to philosopher Thomas Kuhn, evolution of technologies is more a linear process. A technology can only scale upon specific limits. If it reaches the limits, workarounds will help postponing the necessity for a new approach. But at some point in time, a completely new and revolutionary approach  will appear (such as switching from structured programming to OOP) and the same kind of technology cycle will restart. It is a kind of spiral model if you will. &lt;br /&gt;The only point where we could observe productivity boosts are the technology revolution events. However, new technology revolutions are mostly rooted in existing technologies. Thus, an immediate productivity gain is simply not possible.&lt;br /&gt;But as a thought experiment: if you just compared the way of approaching software development challenges now and 40 years ago, you could recognize a tremendous increase of effectiveness. There is a long way from software engineering in the sixties to that of today. No person could have skipped all the intermediate results and challenges.&lt;br /&gt;Thus, if an alien race would land on earth, it appears very likely they could introduce us to new ways of building software systems that offers magnitude of productivity increase. &lt;br /&gt;Conclusion: Silver bullets are theoretical beasts only existing in the Star Trek Universe. As pragmatic architects we must leverage the tools and technologies existing today. And we shouldn't believe all those technology panaceas vendors and market analysts are constantly promoting such as SOA, SaaS, you name it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2328808221326321881?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2328808221326321881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2328808221326321881' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2328808221326321881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2328808221326321881'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/silver-bullet.html' title='The Silver Bullet'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5168426223504872485</id><published>2008-08-12T21:52:00.001+02:00</published><updated>2008-08-12T21:54:43.713+02:00</updated><title type='text'>Now it is proven - NESSI exists!</title><content type='html'>&lt;p&gt;ok, but what is it? &lt;/p&gt;  &lt;p&gt;According to its &lt;a href="http://www.nessi-europe.com/"&gt;web site&lt;/a&gt;, &amp;quot;NESSI is the European Technology Platform dedicated to Software and Services. Its name stands for the &lt;strong&gt;Networked European Software and Services Initiative&lt;/strong&gt;.&amp;quot;&lt;/p&gt;  &lt;p&gt;Yes, it is not very clear from this definition. So, let me try my own explanation.&lt;/p&gt;  &lt;p&gt;Suppose, you'd like to leverage SOA to connect heterogeneous islands. Maybe, you are going to build a healthcare system that connects different international regions, allowing physicians to access your healthcare data if required and permitted. An underlying SOA infrastructure should provide:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SOA based middleware and process modeling&lt;/li&gt;    &lt;li&gt;Enterprise Application Integration facilities&lt;/li&gt;    &lt;li&gt;a kind of internet bus that supports various protocol families&lt;/li&gt;    &lt;li&gt;registries and repositories&lt;/li&gt;    &lt;li&gt;horizontal services such as security&lt;/li&gt;    &lt;li&gt;&amp;#160;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sure, you can obtain such ingredients, if you accept vendor lock--in. I don't list all the big SOA proponents here as they are quite obvious. The truth is that is almost impossible to cope with such heterogeneity. If you try, you will be soon overwhelmed by sheer complexity.&lt;/p&gt;  &lt;p&gt;Unfortunately, there is another dimension to this problem:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Even if you have all these facilities at hand, you need to standardize the vertical domains. What if the whole SOI (Service Oriented Infrastructure) is standardized but two banks don't agree in what a customer or bank account is?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So far, solutions have either attempted to address the technology issue or to address the domain standardization.&lt;/p&gt;  &lt;p&gt;What NESSI tries is to address those challenges.&lt;/p&gt;  &lt;p&gt;It is required to create a kind of standardized SOA operating system and to define domain-specific standards for how to create applications on top of this platform. From my personal viewpoint the combination of Open Source Software with standards would be a perfect fit. It is necessary to create both, standardized APIs and a reference implementation able to handle mission critical applications.&lt;/p&gt;  &lt;p&gt;Is a platform sufficient? Absolutely not, because we also need to cope with service engineering and governance issues and non functional requirements and tools. Consequently, NESSI is also trying to address these points.&lt;/p&gt;  &lt;p&gt;All of these aforementioned&amp;#160; problems are hard to solve but on the other hand we have to solve them anyway, because they root in inherent complexity. If we need to solve them to finally live the dream of &amp;quot;the network is the computer&amp;quot;, then NESSI represents an excellent opportunity. &lt;/p&gt;  &lt;p&gt;But that's my personal viewpoint. What is your's?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5168426223504872485?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5168426223504872485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5168426223504872485' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5168426223504872485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5168426223504872485'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/now-it-is-proven-nessi-exists.html' title='Now it is proven - NESSI exists!'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1916496152948316774</id><published>2008-08-12T17:22:00.001+02:00</published><updated>2008-08-12T17:23:42.542+02:00</updated><title type='text'>Michael's Event Calendar</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In September I will visit my colleagues in Bangalore and give a seminar on Distributed System Architecture. &lt;/li&gt;    &lt;li&gt;On 14th October I will give a keynote on COMPARCH 2008 in Karlsruhe. I was invited by Ralf Reussner and Clemens Szyperski, two well-known gurus on architecture and components. Guess, what topic I will cover? Yes, architecture refactoring, my preferred topic these days.&amp;#160; &lt;/li&gt;    &lt;li&gt;Originally, I planned to attend this year's OOPSLA conference in Nashville. I have two accepted tutorials, one on high quality software architecture, the other one on Software Architecture Refactoring. Unfortunately, I am so busy within Siemens that I won't make it to the OOPSLA. However, an excellent member of my staff will give the two tutorials instead. Marwan is not an emergency solution but an excellent architect himself, formerly working for Lufthansa Systems. You will have a lot of fun attending our two tutorials. Mentally, I will be there, of course :-)&lt;/li&gt;    &lt;li&gt;In November I will most likely be invited to the Microsoft TechED in Barcelona giving two talks.&lt;/li&gt;    &lt;li&gt;In December I will be available on a panel at the Service Wave Conference of the European NESSI initiative.&lt;/li&gt;    &lt;li&gt;In January 2009 there is my local event, the OOP 2009 in Munich. I don't yet know what topics I will address but be sure I will be around :-)&lt;/li&gt;    &lt;li&gt;I am planing to submit for next year's ACCU in Oxford (April).&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1916496152948316774?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1916496152948316774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1916496152948316774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1916496152948316774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1916496152948316774'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/michael-event-calendar.html' title='Michael&amp;#39;s Event Calendar'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4279562732532808040</id><published>2008-08-12T17:03:00.001+02:00</published><updated>2008-08-12T17:22:17.458+02:00</updated><title type='text'>Mojave - Episode II</title><content type='html'>&lt;p&gt;Did you hear about Microsoft's Mojave Project where they told a bunch of selected people - most of them Vista critics -&amp;#160; of a cool new operating system called Mojave? Supposedly, most of them were kind of enthusiastic about Mojave. To their big surprise, Mojave turned out to be Vista - the devil in disguise if you will in remembrance of an old Elvis hit.&lt;/p&gt;  &lt;p&gt;What can architects learn from this? &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;First of all, we can hide all the mess of our systems behind a nice look and feel. The best software system will not be accepted if its usability sucks, and vice-versa. &lt;/li&gt;    &lt;li&gt;Secondly, if we got an excellent system that people for some strange reasons don't appreciate, we could try to put a new API or Look &amp;amp; Feel on top. Maybe, the interface is the only thing that sucks in our system.&lt;/li&gt;    &lt;li&gt;Last but not least, we could also learn that nice architecture and design diagrams might impress others so much that they consider the system as a neat piece of design while in fact the implementation is totally different from the design.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Regarding the original Mojave experiment I really doubt that the reviewers had the write level of expertise and mind set. Don't judge a software system by its cover!&amp;#160; Review and evaluate the design and the implementation thoroughly.&amp;#160; &lt;/p&gt;  &lt;p&gt;Architects shouldn't just believe but rather evaluate and enforce.&lt;/p&gt;  &lt;p&gt;But of course, in some stakeholder presentations such as presenting the system to your top management you can add a marketing layer while remaining politically correct and honest.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4279562732532808040?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4279562732532808040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4279562732532808040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4279562732532808040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4279562732532808040'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/mojave-episode-ii.html' title='Mojave - Episode II'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4895635061429499116</id><published>2008-08-11T23:11:00.001+02:00</published><updated>2008-08-11T23:11:09.406+02:00</updated><title type='text'>Art, Craft or Science?</title><content type='html'>&lt;p&gt;Is software design an art, a craft or a science? This question has been the starting point for many entertaining discussions. And many different opinions and answers exist.&lt;/p&gt;  &lt;p&gt;So what is my take on this?&lt;/p&gt;  &lt;p&gt;To build a software system requires engineers to come up with a mapping that takes the problem and maps it to a concrete solution. Requirements describe the problem and the desired properties of the solution. Unfortunately, the mapping typically is not unique in that there might be many solutions solving the same problem. With other words, architects and developers face a lot of freedom. The bad thing about freedom is that it always forces architects to take decisions. In other words, &lt;em&gt;to architect is to decide&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Of course, we appreciate if we can immediately find an appropriate solution for all problems, just following a divide-and-conquer strategy of software development.&amp;#160; But this never happens in practice.&lt;/p&gt;  &lt;p&gt;Two problems come to my mind in this context:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sometimes we encounter problems for which we neither know a solution nor can find a solution elsewhere (finding a solution means either knowing a direct solution or being able to map the actual problem to another problem for which you already know a solution - for example, if we are able to map our algorithmic problem to a sorting problem.) &lt;/li&gt;    &lt;li&gt;In contrast to mathematics, the problem itself is a moving target in software engineering. Pantha rhei. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The first issue implies that you may not find a pattern or some other kind of best practice for your concrete problem context. Instead, you need some intuition. Hopefully, you recognize that the problem at least resembles another kind of problem for which you already have a vague solution idea so that this can serve as a good starting point. By the way, this is the reason why it turns out to be so hard to build a general problem solver for software engineering. Freedom is very hard to deal with by a general problem solver.&lt;/p&gt;  &lt;p&gt;The second issue, coping with change, requires some sort of agility. In contrast to logic, our axioms keep changing while we are applying the calculus. The only way to deal with change is to embrace change everywhere, in the process, in the tool chain, in designing, in testing, in refactoring, in programming, in communicating.&lt;/p&gt;  &lt;p&gt;What makes software design so hard sometimes is when both problems appear in parallel.&lt;/p&gt;  &lt;p&gt;When people ask whether software engineering is a craft, a science, or an art, the answer should be obvious now. It is a science as we try hard to follow formal approaches where feasible. It is a craft because solving problems often requires experience and best practices. And it is an art as software engineering leaves enough freedom for intuitive and even artistic solutions.&lt;/p&gt;  &lt;p&gt;I guess this is what makes our job so interesting.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4895635061429499116?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4895635061429499116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4895635061429499116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4895635061429499116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4895635061429499116'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/art-craft-or-science.html' title='Art, Craft or Science?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2213676011404933499</id><published>2008-08-08T23:20:00.001+02:00</published><updated>2008-08-08T23:23:04.698+02:00</updated><title type='text'>Architect always implements</title><content type='html'>&lt;p&gt;When I once invited Bertrand Meyer to our location in Munich, he gave an excellent talk on Software Engineering. His most memorable messages were &amp;quot;Bubbles don't crash&amp;quot; and &amp;quot;All you need is code&amp;quot;.&lt;/p&gt;  &lt;p&gt;With the first message &amp;quot;Bubbles don't crash&amp;quot; Bertrand referred to all those engineers who have turned into Powerpoint or UML freaks. A Powerpoint slide or UML diagram will never crash (if you don't use it as a model for code generation, the MDSD guys might argue). It is surprisingly easy to impress people with simple boxes and lines (sometimes dubbed software architecture). Especially it is rather simple to impress top management which is why the wrong consultants can potentially cause so much damage. Some might respond that high abstraction levels are the only way to understand and build complex systems. That's certainly true. On the other hand, you would not be able to build a ship if you never had any idea about water. The same holds for software systems. It is simply not possible to develop a software system without any idea on top of which runtime environment it is supposed to execute.&lt;/p&gt;  &lt;p&gt;Even if you had in-depth knowledge of your software system's runtime environment and built an excellent software architecture, it is NOT a no-brainer to transform a software architecture to a working implementation. That's why Bertrand introduced the &amp;quot;All you need is code&amp;quot; attitude. What helps you the best theory, if you can't turn it into practice? As an architect you need to have implementation skills, either for implementing parts of the system yourself or for assessing the results of other team members. How could you ever build a good bicycle without biking yourself?&lt;/p&gt;  &lt;p&gt;The problem arises how to ensure that we as software architects can meet these requirements. &amp;quot;Architect always implements&amp;quot; means that you should also implement in a project, but definitely not on a critical path. By implementing you will earn the respect of developers, while keeping in touch with the implementation at the same time. And you will have to eat your own dog food. Whenever something is not as expected you can detect the problem and help solving it. However, in some projects architects are busy due to communication, design, and organization efforts so that spending time for implementation will be almost impossible. Never say impossible in this context, do not even think it!&amp;#160; Even in such scenarios I recommend spending some of your time for code reviews and some of your spare time to get familiar with software technologies being used in your project context. Otherwise you will create kinds of Software Frankensteins: creatures you are not proud of and who tend to live forever unless not eliminated in an early stage.&lt;/p&gt;  &lt;p&gt;Architects are not just masters of Microsoft Office and&amp;#160; of a bunch of drawing tools they leverage to create design pearls, throw them over the fence to the developers who ought to build a perfect implementation, while the architects enjoy their holidays on a nice Carribean island.&lt;/p&gt;  &lt;p&gt;Be pragmatic! I guess, the Pragmatic Programmers book series was created for exactly the same reason; to make us aware of the relevance of practical experience. &lt;/p&gt;  &lt;p&gt;Never ever forget: ARCHITECTS ALWAYS IMPLEMENT. There is no exception to this rule. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2213676011404933499?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2213676011404933499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2213676011404933499' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2213676011404933499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2213676011404933499'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/08/architect-always-implements.html' title='Architect always implements'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5971441376167342820</id><published>2008-07-26T17:40:00.001+02:00</published><updated>2008-07-26T17:42:18.658+02:00</updated><title type='text'>Pseudo Effectiveness</title><content type='html'>&lt;p&gt;Do you know these co-workers who are always answering e-mail in the middle of the night, who are in their offices until midnight, who have so many contacts to customers, who have an infinite list of activities, who have their mobile phone directly integrated into their body, and who always tell you about the big work overload they have?&amp;#160; All those unknown heroes who always sacrifice their spare time on the altar of the god of infinite work?&lt;/p&gt;  &lt;p&gt;Of course, many of us in the IT world are more busy than it proves to be healthy or effective. But occasionally people only claim to be active and involved, while in fact they are not. Unfortunately, it is not easy to differentiate between actual effectiveness and that kind of pseudo effectiveness. Sometimes, the one who does the job gets not promoted while the one presenting beautiful slides about the work results of others is.&amp;#160;&amp;#160;&amp;#160; Of course, you may also refer to the Peter principle in this context :-)&lt;/p&gt;  &lt;p&gt;Why do I discuss pseudo effectiveness in this architecture blog? As an architect, you might experience high impact if there are people with high pseudo effectiveness involved in your projects. Think about outsourcing sites where you have the feeling that productivity is very low. Think about developers or architects who have the same skill level, but whose work results are completely different in terms of quantity and quality. Also think about job promotions where you got the gut feeling of being ignored while in fact you did an excellent job in contrast to this other guy. &lt;/p&gt;  &lt;p&gt;But be aware of the fact that all of us are somehow guilty of pseudo effectiveness. A little chat with co-workers in the cafeteria, some daydreaming in front of the workstation, some Internet surfing. All this may count up to a significant amount of time during the day. But as you might remember from my previous posts breaks are important. I claim that productivity significantly drops when ignoring such kind of work-life balance.&lt;/p&gt;  &lt;p&gt;How can you detect real pseudo effectiveness? The only way is by analyzing actual productivity. For which tasks has the person been responsible for and what are the actual outcomes? In this context, the goals should be defined in such a way so that there is no space for pseudo effectiveness. Someone who needs a week to write a simple letter may seem very active, while in fact being very ineffective and inefficient. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5971441376167342820?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5971441376167342820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5971441376167342820' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5971441376167342820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5971441376167342820'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/pseudo-effectiveness.html' title='Pseudo Effectiveness'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4809206524808198753</id><published>2008-07-25T12:30:00.002+02:00</published><updated>2008-07-25T12:57:53.068+02:00</updated><title type='text'>Design Pearls</title><content type='html'>If you ever have been to Florence, you surely have admired all those incredible ancient buildings fully covered with ornaments. In the past, constructing beautiful buildings has been en vogue. Today, we simply could not afford the costs required for such endeavors. &lt;br /&gt;&lt;br /&gt;What holds true for building construction, is also applicable to software development. But software engineers don't consider themselves just as craftsmen, but also as artists. We strive for architectural beauty and aestethic design, not being satisfied with functional aspects.&lt;br /&gt;&lt;br /&gt;While architecture beauty is an important achievement, improving qualities such as expressiveness, simplicity or symmetry, design pearls define the other extreme.&lt;br /&gt;By design pearls I am referring to masterpieces of software design which don't stop just meeting the requirements, but also add unnecessary burden (or ornaments if you will) to the system.&lt;br /&gt;&lt;br /&gt;While design pearls show the mastership of one single individual they are counterproductive for team development as they decrease simplicity (there are more artifacts than necessary for the given task) and symmetry (they don't follow the KiSS principle but try to constantly reinvent the wheel).&lt;br /&gt;&lt;br /&gt;We can avoid design pearls by strictly following a requirements-driven approach. All architecture concepts in a system must be rooted in a concrete requirement. In addition, we should use patterns where useful. A pattern is a "complete disregard of originality". It just helps reusing common wisdom, instead of coming up with new solutions.  And we should strive for architecture quality indicators such as simplicity, expressiveness, orthogonality and symmetry. One way to aim for symmetry is to introduce design guidelines from day 1. Instead of letting developers figure out how to cope with cross cutting concerns such as exception handling, it is better to give them a framework of rules and guidelines.&lt;br /&gt;&lt;br /&gt;In summary: design pearls are really nice to look at but ugly to change and extend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4809206524808198753?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4809206524808198753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4809206524808198753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4809206524808198753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4809206524808198753'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/design-pearls.html' title='Design Pearls'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7232594114234591747</id><published>2008-07-20T21:49:00.001+02:00</published><updated>2008-07-20T21:49:22.252+02:00</updated><title type='text'>An Anecdote on Architecture Training</title><content type='html'>&lt;p&gt;Recently, I gave an architecture training within Siemens. There was another Siemens seminar in the same hotel dealing with project teams.&amp;#160; In one of the breaks, a guy asked me whether I knew more details about this architecture seminar. He could not believe, that someone within Siemens was teaching on building architecture.&amp;#160; I explained to him that the seminar was actually covering software architecture, not building construction. He asked me whether I could recommend the seminar. &amp;quot;Yes, absolutely&amp;quot;, I said to him, &amp;quot;to be honest, I am the speaker&amp;quot;. What can we learn from this: be cautious if you tell someone you are an architect.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7232594114234591747?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7232594114234591747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7232594114234591747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7232594114234591747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7232594114234591747'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/anecdote-on-architecture-training.html' title='An Anecdote on Architecture Training'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5705224230432328247</id><published>2008-07-16T23:29:00.001+02:00</published><updated>2008-07-16T23:29:50.945+02:00</updated><title type='text'>Stop those Control Freaks</title><content type='html'>&lt;p&gt;Suppose, you are in a meeting with other people. You need more information on the Hubble constant and ask the audience for details. Someone (maybe a friendly physics professor) comes to the white board and explains the theory. &lt;/p&gt;  &lt;p&gt;Hmmh, how does that relate to software architecture? If you think about the situation, you'll recognize that the solution is based on a decentralized approach.&lt;/p&gt;  &lt;p&gt;Normally, we are more used to centralization. Maybe, we are even addicted to all those centralized concepts. There is a central directory server, a central hub in the EAI solution, a central database, ... But as the example illustrates, sometimes decentralization is the better choice. &lt;/p&gt;  &lt;p&gt;In the real life example we have used a P2P concept by leveraging broadband communication - ok, you just spoke very loud so that everyone paid attention to your question. Is this the only way to implement decentralization? No, there are several other alternatives. &lt;/p&gt;  &lt;p&gt;For example,&amp;#160; Swarm Intelligence: Suppose, I can't remember where I have parked my car. To increase search speed, all family members will visit different areas to locate the car. All searchers carry mobile phones to communicate with each other. After my wife found the car, she tells everyone where it is.&lt;/p&gt;  &lt;p&gt;Another example could be Ad Hoc Networking: In the nearby forest, I find an interesting bird. I tell other people approaching my location about the bird who themselves tell other people who ... After a short period of time the scene is crowded with interested people.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Decentralized thinking means getting rid of central nodes or central controls. This might increase fault tolerance, but decrease efficiency. Often centralized concepts are mixed with decentralized ones. For example, there might be registries where all possible peers in a P2P network are known.&lt;/p&gt;  &lt;p&gt;From an architecture viewpoint, several patterns support decentralization. For instance, the Lookup/Locator pattern, Blackboard architecture pattern, or the Leader/Followers pattern.&lt;/p&gt;  &lt;p&gt;One of the qualities we can get from a decentralized system is emergence. The system as a whole reveals smart behavior that is more than just the combination of all nodes. Think of swarm intelligence like in an ant population. &lt;/p&gt;  &lt;p&gt;From my viewpoint, decentralization is still neglected in software engineering, especially in software architecture. And as the examples shows, real life offers an abundance of decentralized concepts.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5705224230432328247?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5705224230432328247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5705224230432328247' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5705224230432328247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5705224230432328247'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/stop-those-control-freaks.html' title='Stop those Control Freaks'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1850597339258097542</id><published>2008-07-14T19:11:00.001+02:00</published><updated>2008-07-14T19:15:46.702+02:00</updated><title type='text'>Architecture Design - How deep should it go?</title><content type='html'>&lt;p&gt;In my last posting I introduced the &lt;a href="http://stal.blogspot.com/2008_07_01_archive.html"&gt;Onion model&lt;/a&gt; for architecture design. Often it is very difficult to determine when architecture design stops and fine-grained design begins. Thus, I am going to illustrate some of my thoughts.&lt;/p&gt;  &lt;p&gt;Before you start the most important precondition for architecture design is the availability of&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the business goal of the software architecture&lt;/li&gt;    &lt;li&gt;a subset of all requirements (15-30%), but make sure the most important ones are already available&lt;/li&gt;    &lt;li&gt;a coarse-grained test strategy.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are different recommendations for architecture design. First of all, I consider it essential to differentiate between strategic design and tactical design:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Strategic design is about all those requirements that have a systemic impact on the whole software architecture. Basically, these are the inner layers of the onion. All architecture decisions that do not only reveal a local impact on a component together contribute to architecture design.&lt;/li&gt;    &lt;li&gt;Tactical design is simply about the rest: all decisions that show only local affects. Interestingly, variability issues often denote tactical design issues, even in product lines. Things like exchangeability of an algorithm only imply, we need to open our strategic architecture to support variation of the particular family of algorithms (a.k.a. strategies). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This definition comes close to what Grady Booch once meant by &amp;quot;software architecture is about the important things&amp;quot;.&lt;/p&gt;  &lt;p&gt;Another consideration consists of reducing the number of abstractions. This is what I call the Pyramid model:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the top of the pyramid is the system itself,&lt;/li&gt;    &lt;li&gt;the middle layer represents all subsystems,&lt;/li&gt;    &lt;li&gt;the bottom layer comprises all components the subsystems consist of&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For architecture design we should only follow the pyramid model. All abstractions underneath the bottom layer of the pyramid are part of fine-grained design. Note, that it might be subject to your own definition how the system, subsystems, or components of the pyramid model map to the concrete abstractions in your domain. This might look different between an embedded system and an Enterprise SOA system where subsystems might become services.&lt;/p&gt;  &lt;p&gt;All architecture decisions should be completely rooted in requirements and risks. All extra add-ons increase complexity and thus decrease simplicity and expressiveness.&amp;#160; &lt;/p&gt;  &lt;p&gt;Don't be caught by the trap that architecture is only about problem domain and not about solution domain although you always should strive for keeping your architecture as independent from specific technical issues as possible (always try to defer all technology decisions to a later phase). &amp;quot;Hard&amp;quot; requirements such as &amp;quot;cycle time must not exceed 1 msec&amp;quot; or &amp;quot;use of SQL Server 2003 is mandatory&amp;quot; will be treated as first class requirements. And those requirements may also have systemic impact, thus contributing to strategic design.&lt;/p&gt;  &lt;p&gt;In the documentation of your architecture follow a newsletter style. This implies, each artifact (system, subsystem, component) should be explained using a newspaper-like article. Architecture design is just that and no more.&lt;/p&gt;  &lt;p&gt;In addition to architecture design you should:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;specify design and architecture guidelines for all crosscutting concerns. This is best done before architecture design for all important systemic requirements. For other concerns you might create guidelines in parallel to architecture design.&lt;/li&gt;    &lt;li&gt;create technology prototypes for all important risks. For example, if you need to guarantee 2000 transactions per second, make sure your middleware of choice really supports this requirement.&lt;/li&gt;    &lt;li&gt;refine the test strategy you should have established after requirements engineering. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These rules of thumb are intentionally somewhat vague. Again, I'd like to refer to Grady Booch in this context: &amp;quot;there is no cookbook for software architecture&amp;quot;. &lt;/p&gt;  &lt;p&gt;Fortunately, there are some good practices to share.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1850597339258097542?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1850597339258097542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1850597339258097542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1850597339258097542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1850597339258097542'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/architecture-design-how-deep-should-it.html' title='Architecture Design - How deep should it go?'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4374528600610307289</id><published>2008-07-03T13:33:00.003+02:00</published><updated>2008-07-04T14:23:38.779+02:00</updated><title type='text'>The Onion Model</title><content type='html'>Whenever people ask me how to systematically create an architecture, I present them my Onion Model.  &lt;br /&gt;&amp;#160; &lt;br /&gt;If you like to sow &lt;a href="http://lh5.ggpht.com/michael.stal/SG4WRVaV9wI/AAAAAAAAADc/tr5sm7FmXYI/s1600-h/onion%5B2%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="159" alt="onion" src="http://lh4.ggpht.com/michael.stal/SG4WSCrlF5I/AAAAAAAAADg/IXpIfn9co3U/onion_thumb.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt;an onion, you need some preparation. It is important to take care of the right environment and also to think about the requirements an onion needs to grow and what risks you might encounter. From a business perspective, you should also consider what type of onion you like to harvest, but that's a different story.  &lt;br /&gt;  &lt;br /&gt;The inner core of the onion will be the domain model including all core components, their relationships and interactions.  &lt;br /&gt;  &lt;br /&gt;For the next layers you will need a prioritized list of strategic requirements. These requirements influence systemic architecture decisions. For example, reliability, availability, or security. All of them represent operational requirements that result in specific infrastructures. If performance is the most important operational requirement, you will build a performance layer around the domain logic core. With other words, the domain logic will be embedded into the performance infrastructure. Then you turn to the second most important operational requirement. If security is the number two requirement, your existing onion that consist of the functional core embedded to an performance infrastructure will get wrapped by a security layer. This continues until your architecture is stable.  &lt;br /&gt;  &lt;br /&gt;At the end you need to address tactical issues such as flexibility or maintainability. These will become the outer layers of the onion. For some of them, you will need open up your strategic architecture, for instance, by providing hooks.   &lt;br /&gt;  &lt;br /&gt;Eventually, you'll get an &amp;quot;onion&amp;quot; which was designed with a functional core in mind. All important requirements had an higher impact on the onion than the less important ones which was ensured by priorization of onion layers.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4374528600610307289?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4374528600610307289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4374528600610307289' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4374528600610307289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4374528600610307289'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/07/onion-model.html' title='The Onion Model'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/michael.stal/SG4WSCrlF5I/AAAAAAAAADg/IXpIfn9co3U/s72-c/onion_thumb.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3552612654657602987</id><published>2008-06-23T07:34:00.003+02:00</published><updated>2008-06-23T07:55:02.624+02:00</updated><title type='text'>Focus matters</title><content type='html'>A lot of software systems do not meet some of their requirements and business objectives. Other systems have turned to design pearls only a few architects can understand. In either case you are in trouble. If a system does not meet its requirements or business goals customers will be dissatisfied. In addition, the system cannot be evolved to future versions before the problems are addressed, often causing large and expensive refactoring activities. If a system is a design pearl, it contains a lot of unnecessary architecture artifacts, making the system less expressible and simple. After short or medium time, these systems tend to become big balls of mud.&lt;br /&gt;To prevent such problems there are different means. One of the most important one being requirements traceability. Each architecture change must address a requirement and/or a business goal. You should also clearly trace back the architecture decision to the requirement or business goal in your documentation. Architecture review methods such as ATAM use this information to figure out tradeoff points, sensitivity points, risks and chances of your architecture. &lt;br /&gt;In the optimal case there will be patterns available to support your architecture design. For orthogonality you should apply the same patterns for the same problem contexts. Likewise, relevant cross-cutting concerns such as error management should be explicitly addressed by architects and enforced through guidelines.&lt;br /&gt;Note, however, that architects may come up with the best architecture or the most consistent and complete guidelines, but will fail if the implemented architecture differs from the envisioned architecture. Thus, architects should walk around and communicate to enforce the architecture vision. &lt;br /&gt;Just staying in office, throwing the architecture over the fence, and hoping everything will be in place after a while, is the best receipt for project failure. &lt;br /&gt;As change is the rule and not the exception, architects must always ensure that any change in the set of business goals or requirements will lead to an appropriate architecture refactoring. With other words: if the focus may change and you need to stay in focus, then you'll have to change if the focus actually changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3552612654657602987?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3552612654657602987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3552612654657602987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3552612654657602987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3552612654657602987'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/06/focus-matters.html' title='Focus matters'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2554762399402260457</id><published>2008-05-30T23:22:00.001+02:00</published><updated>2008-05-30T23:28:35.844+02:00</updated><title type='text'>There is no business like office business</title><content type='html'>&lt;p&gt;In the last weeks I enjoyed small talk with several software engineers from various companies. Topics included technology and architecture, but also office work, management, colleagues and career paths. And several times I heard from companies where a couple of characteristic metrics for measuring engineer productivity exist. Let me exaggerate a little bit:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;One of the wide spread metrics is office availability. I am speaking about engineers sitting in their offices or cubicles from early in the morning until late in the evening. This is something I fully understand for projects being in critical phases or delayed. Of course, I also did it and will do it in the future. But I also heard about engineers staying in their offices very late to send an implicit message to their management. Something, like &amp;quot;Look, I am working so hard for the company. If you don't promote me, you should suffer from remorse.&amp;quot; However, the truth according to several studies is that you cannot be productive for 8 hours or more per day, at least not over a longer time span. Even worse, if you stay in office, your bug rate will increase significantly and the results will be not better than staying in office for less time. I know the stories about employees in Silicon Valley or Redmond sleeping near to their office PC. There is a reason why eXtreme Programming does recommend reducing work time to under 40 hours per week. And all of you believing in 16 hour work days, no matter wether you are good (engineer) or evil (manager): productivity in such overload situations is not possible. You either have many simple tasks or spend significant time twiddling your thumbs. Today, I read an article that an increasing number of IT workers suffers from the burn-out syndrome or other diseases which are caused by work overload. &lt;/li&gt;    &lt;li&gt;Another wide spread metrics is internal visibility. Do you remember Bertrand Meyer's &amp;quot;bubbles don't crash&amp;quot;? Management tends to rather promote engineers who spend significant time presenting and chatting to management. If you don't provide a steady stream of good news (even if you invented this stream of good news) to the right persons, they won't even notice your existence in the worst case. Often, not the real results count but management visibility which is measured by .. guess what .. Powerpoint presentations, Word documents and Excel sheets. Don't forget that e-mails and meetings represent additional, important means in this context. Considered from this perspective, virtual reality has already conquered the world.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are a lot of lessons we can learn from these statements. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;First of all, Work/Life balance may be a buzzword, but from a useful one if you ask me. For example, if I recognize that my productivity is dropping to almost zero,&amp;#160; I am leaving office, go for running or biking, and then continue with my work, often until late in the evening. Such extended breaks provide me with a significant productivity boost. It might appear unbelievable, but I am definitely more productive that way than if I had spent the breakout time for office work.&lt;/li&gt;    &lt;li&gt;If I need to concentrate I will also work at home from time to time rather than spending the time in the office. With my phone constantly ringing, colleagues dropping by, and other continuous interrupts, offices don't really provide an adequate environment for creativity and brain workers. Ok, I am missing my colleagues and the social interactions after a short time. Thus, home office is the exception. Fortunately, there are so many opportunities (phone conferences, meetings) to interact :-)&lt;/li&gt;    &lt;li&gt;Effectiveness and efficiency are/should be the only things that count. It does not matter when or where you created your results. However, you need to make sure, managers are aware of your work and what you achieve. Marketing your own person is an important issue in a universe where managers can't afford tracking all work results from all engineers. If you coach some colleagues as a mentor and if you promote their visibility and career path, inform your managers. Improving skills of co-workers and other more indirect results offer high business value to a company. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Interestingly, all these points are also valid for architects. However, home days are often a bad idea in those hot project phases when creating or enforcing software architecture. For an architect, communication represents the most important instrument. Communication works best in Face-to-Face meetings. But, nonetheless, also in these situations you need to plan your recreational breaks to enforce Work/Life Balance.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2554762399402260457?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2554762399402260457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2554762399402260457' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2554762399402260457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2554762399402260457'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/05/there-is-no-business-like-office.html' title='There is no business like office business'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8402993736313738527</id><published>2008-05-12T18:44:00.001+02:00</published><updated>2008-05-12T18:46:10.683+02:00</updated><title type='text'>Developer Usability</title><content type='html'>&lt;p&gt;In the last months I've seen a lot of frameworks, platforms and libraries which revealed a substantial lack of usability. Developers reported to me that using those APIs was more a nightmare than a pleasure. Some of them just stopped using these artifacts, others built their own workarounds on top. When asking the API-developers for their comments, it turned out that most of those APIs have been built without any consideration of usability. In addition, adequate documentation was missing very often, which of course is also related to usability. Interestingly, I often hear the same complaints from end users. The UIs of most applications or devices are a pain. For instance, I am using a SAP-based system for ordering work items. What I need to fill in in all those fields is by no means self-explanatory. Help is missing or inappropriate. Error messages don't give any guidance what could be wrong. Suppose, shops like Amazon would come up with such UIs. How successful, do you think, would they be? Whenever we are building such systems we need two things:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;a clear understanding of the domain&lt;/li&gt;    &lt;li&gt;a tight interaction with users to ensure usability&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For example, if we read the book by Krzysztov Kwalina and Brad Adams on how to design frameworks, you will find the recommendation on scenario-based design. Find out how end users could best use the system you are going to build in terms of user scenarios. Implement the API to support the most important and common scenarios. After the first prototype/iteration of the system is available, ask the target audience to use it and give feedback what they like or don't like. Then improve it!&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;In contrast to common belief, architecture is not only about functional requirements and operational qualities. It is also about usability. A system that meets all requirements but is not usable, is of no value for its users. As an example: I owned Rio and Creative MP3 players which provided an incredible amount of features, but lacked usability. After a while I switched to Apple IPods which have less features and are significantly more expensive but offer a great user experience.&amp;#160; &lt;/p&gt;  &lt;p&gt;At the end, you should strive for making the end user's life a pleasure. In this context, just remember that you yourself are using many more systems than you are developing.&amp;#160; Something similar is written in many public restrooms within Germany: Leave the room in such a way you'd like to discover it. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8402993736313738527?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8402993736313738527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8402993736313738527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8402993736313738527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8402993736313738527'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/05/developer-usability.html' title='Developer Usability'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2224614450490288928</id><published>2008-03-14T13:14:00.003+01:00</published><updated>2008-03-14T13:18:38.570+01:00</updated><title type='text'>On vacation</title><content type='html'>If you already wondered, I am currently on vacation travelling abroads. That is the reason why I have only seldomly access to the Web. Now, I am sitting in front of an Internet PC in my hotel's lobby. I will be back on 28th March. Then, I will provide you with some new stuff. So far, I wish you some nice easter holidays.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2224614450490288928?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2224614450490288928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2224614450490288928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2224614450490288928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2224614450490288928'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/03/on-vacation.html' title='On vacation'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1696902228049084371</id><published>2008-02-25T09:13:00.006+01:00</published><updated>2008-02-25T10:53:21.096+01:00</updated><title type='text'>DSLs revisited</title><content type='html'>DSLs are everywhere. At least, we can read and hear a lot of good things about Domain Specific Languages. Unfortunately, many experts I meet are not always that sure what a DSL really is.&lt;br /&gt;&lt;br /&gt;As a lazy person, I will not bore you with my own definition but just cite what Markus Voelter once said. In a former &lt;a href="http://voelterblog.blogspot.com/2007_09_01_archive.html"&gt;posting &lt;/a&gt;Markus defined a DSL as follows:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;A DSL is a concise, precise and processable description of a viewpoint, concern or aspect of a system, given in a notation that suits the people who specify that particular viewpoint, concern or aspect.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Given that definition, UML is a vehicle to define DSLs. Take use case diagrams as an example. However, UML might better suit software engineers.&lt;br /&gt;&lt;br /&gt;An ADL (Architecture Description Language) like Wright is a formal language to describe architectural designs.&lt;br /&gt;&lt;br /&gt;BPEL or ARIS are DSLs to describe business processes. While BPEL is much more system centric, ARIS can also be understood by business analysts.&lt;br /&gt;&lt;br /&gt;Thought questions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Is a programming language such as Java also a DSL? &lt;/li&gt;&lt;br /&gt;&lt;li&gt;And what about natural language?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;DSLs are useful to describe a viewpoint, concern or aspect of a system. But, what means do we have to introduce our own DSLs?&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Meta data annotations (Java) or attributes (.NET) can serve as the core elements of a DSL. Take the different attributes WCF (Windows Communication Foundation) introduces to help describe contracts.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;UML provides a meta model for introducing DSLs as well as specific DSLs (the different diagrams to specify viewpoints).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;XML can serve as a foundation for introducing DSLs. Example: BPEL, WS-*, XAML.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Programming languages like Ruby or Smalltalk let you intercept the processing of program statements, thus enabling DSLs. Example: Ruby on Rails.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Integrated DSLs like LINQ are embedded into their surrounding language.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;APIs define a kind of language. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;The hard way might be designing your own language using plain-vanilla tools such as ANTLR. Note: It is not only the compiler or interpreter but also the run-time system we have to cope with.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;According to the Pragmatic Programmers designing a DSL can be very effective. &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It may help you visualize and communication the viewpoint, aspect, concern the DSL addresses.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It may enable you providing a generator that generates significant parts instead of forcing you to hand-craft. This is not restricted to code but you could also generate tests or documents.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Stefan Tilkov provided an excellent example. Suppose, you are developing a Java application. Writing the unit tests in JUnit would be the normal way of operation. But, maybe JRuby would be a much better way to write unit tests. As both run on top of the JVM, this can be achieved easily. In this context, we use JRuby+xUnit APIs as our DSL. &lt;/p&gt;&lt;br /&gt;I believe, DSLs help climb over the one-size-fits-all barrier traditional programming languages introduce. Creating a DSL does not need to be as complex as defining a programming language. Using XML Schema or Meta data annotations or UML Profiles are nice examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1696902228049084371?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1696902228049084371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1696902228049084371' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1696902228049084371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1696902228049084371'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/dsls-revisited.html' title='DSLs revisited'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8028592275623120892</id><published>2008-02-23T19:57:00.001+01:00</published><updated>2008-02-23T19:57:56.035+01:00</updated><title type='text'>Generative versus Generic Programming</title><content type='html'>&lt;p&gt;Andrey Nechypurenko, a smart colleague of mine, recently brought up an excellent thought. If we already know a domain very well, why should we bother building model-driven generators? Couldn't we just provide an application framework instead? Indeed, each framework introduces a kind of language. It implements commonalities but also hooks to take care of variability. So, when should we use model-driven techniques and when should we better rely on frameworks?&lt;/p&gt;  &lt;p&gt;My first assumptions were:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A DSL is much closer to the problem domain which helps different stakeholders to participate establishing the concrete model. If stakeholder participation is essential, than a DSL might definitely be the better way.&lt;/li&gt;    &lt;li&gt;DSLs are (often) more productive. It is much more verbose to program against a framework than designing using a DSL. Needless to say, that we need to take the efforts for providing the generator into account.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;At least in my opinion the answer could also be to use both, a framework that captures the domain's core abstractions and a generator that generates applications on top of this framework.&lt;/p&gt;  &lt;p&gt;Any thoughts about these issues?&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8028592275623120892?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8028592275623120892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8028592275623120892' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8028592275623120892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8028592275623120892'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/generative-versus-generic-programming.html' title='Generative versus Generic Programming'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2520758883123538433</id><published>2008-02-18T23:55:00.001+01:00</published><updated>2008-02-18T23:58:17.991+01:00</updated><title type='text'>Relativity</title><content type='html'>&lt;p&gt;Today, I had an inspiration. My spouse told me it will take 5 minutes to get ready for leaving home, but actually it took her over 20 minutes. As those &amp;quot;events&amp;quot; constantly happen, my assumption is that women are moving with much faster speed than men. This way,&amp;#160; 5 minutes on their spaceship equals 20 minutes of our time. &lt;/p&gt;  &lt;p&gt;I also remember a professor at my university asking a student about the &amp;quot;evaluator problem&amp;quot;.&amp;#160; The student did not really understand the question. Do you? Actually, the right answer turned out to be that he was using C style malloc for allocating storage in his compiler's attribute evaluator. &lt;/p&gt;  &lt;p&gt;What can we learn from this? Humans might have a completely different perspective on reality depending on her/his background and context. Whenever we are dealing with architecture design, we'll have to communicate with all those stakeholders. In order to prevent misunderstandings like the ones illustrated above, we need to introduce a kind of formal language and a common scale - with other words: a common understanding.&lt;/p&gt;  &lt;p&gt;One of the most critical points in design is the consideration and elicitation of requirements. This also holds for requirement priorities. For example, a project manager might be more interested in partitioning the architecture so that the different teams can develop in the most effective way, while an architect will follow a completely different rationale for modularisation. &lt;/p&gt;  &lt;p&gt;In many projects I was also surprised by the fact how important a common project glossary is. Otherwise, people will interpret the same terms differently which is not a big boost for effective communication. For example, in one SOA-based project senior managers considered process monitoring to reveal the business perspective (Business Process Monitoring). They were interested to observe the number of successful business transactions or cash flow. What they actually got from development was system monitoring functionality such as showing load, bandwidth or faults. Guess, how long it took development to correct this?&lt;/p&gt;  &lt;p&gt;It is very likely, that you also experienced the architecture/implementation gap in your career. This inevitably occurs whenever architects throw their design specification over the fence and then leave the development team alone.&amp;#160; Did you ever read a specification and understood it without any problems? Me neither! Some parts might be missing, other ones might not be implementable, and others might be contradicting. Even formal standards such as CORBA, SOAP, HTTP that were developed by expert groups within long time periods, reveal those problems. How can you then expect your own specification to be perfect? What is not perfect, will then be corrected or interpreted in unanticipated ways.&lt;/p&gt;  &lt;p&gt;Thus, it is essential that such clarifications happen as soon as possible in a project.&amp;#160; It is your responsibility as an architect to tackle this problem. Remember how often I already mentioned that effective communication is the most important skill - one of the few moments where I do not abide to the DRY principle. There are lot of methods and tool that explicitly address this issue. Think of agile methods, domain driven design, use case analysis, to name just a few. &lt;/p&gt;  &lt;p&gt;Reality is relative. Thus introduce a common frame of reference for the stakeholders. This holds for software engineering, but also for real life :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2520758883123538433?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2520758883123538433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2520758883123538433' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2520758883123538433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2520758883123538433'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/relativity.html' title='Relativity'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-296844720544102554</id><published>2008-02-16T11:59:00.001+01:00</published><updated>2008-02-17T00:54:39.142+01:00</updated><title type='text'>Workflows</title><content type='html'>&lt;p&gt;Workflow engines such as Microsoft's WF (Workflow Foundation) are only rarely used these days. Most developers totally underestimate their power. However, in an integrated world where processes respectively workflows increasingly need to connect disparate heterogeneous applications, just hard coding these workflows in traditional languages such as Java does not make any sense. First of all, coding in Java or C# requires programming skills, while often business analysts are the ones in charge of business processes. And secondly, hard coding in Java, C#, C++ implies that all changes must happen in source code with the code base representing a beast containing both business logic and workflow related content.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Before covering the meat of this posting, I need to define what I understand by a workflow. By the way, I will use the terms workflow and business process interchangeably as I don't consider the differences stated by other authors very convincing. &lt;/p&gt;  &lt;p&gt;If we just refer to Wikipedia we will find the following definition:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A &lt;b&gt;workflow&lt;/b&gt; is a reliably repeatable pattern of activity enabled by a systematic organization of &lt;a href="http://en.wikipedia.org/wiki/Resource"&gt;resources&lt;/a&gt;, defined &lt;a href="http://en.wikipedia.org/wiki/Roles"&gt;roles&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mass"&gt;mass&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Energy"&gt;energy&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Information"&gt;information&lt;/a&gt; flows, into a &lt;i&gt;work process&lt;/i&gt; that can be documented and learned. Workflows are always designed to achieve processing intents of some sort, such as physical transformation, &lt;a href="http://en.wikipedia.org/wiki/Service_%28economics%29"&gt;service&lt;/a&gt; provision, or &lt;a href="http://en.wikipedia.org/wiki/Information_processing"&gt;information processing&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sounds rather confusing, right? Let me try my own definition. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A workflow defines a set of correlated activities each of which representing a (composite) component that takes input, transforms it, and sends the result via its output ports to subsequent activities. Transitions to an activity may be triggered implicitly by (human or machine initiated events) or by explicit transfer of control &lt;/li&gt;    &lt;li&gt;Workflows can be considered as a Pipes &amp;amp; Filters architecture with the filters being the activities and the pipes being the communication channels between them &lt;/li&gt;    &lt;li&gt;All activities within a workflow share the same context such as common resources &lt;/li&gt;    &lt;li&gt;Workflows are (composite) activities themselves &lt;/li&gt;    &lt;li&gt;A workflow language is a DSL that allows to declaratively express workflows. Examples include BPEL, ARIS, or XAML as used in WF &lt;/li&gt;    &lt;li&gt;A workflow runtime manages the (local) execution and lifetime of workflow instances &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In fact, a workflow closely resembles traditional program code with the statements being the activities.&amp;#160; &lt;/p&gt;  &lt;p&gt;A typical real-life example is visiting a restaurant.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The workflow starts when you enter the restaurant and arrive at the &amp;quot;wait to be seated&amp;quot; sign. &lt;/li&gt;    &lt;li&gt;The waitress will now ask you whether you have a reservation. &lt;/li&gt;    &lt;li&gt;If yes, she will look up the reservation and escort you to your table &lt;/li&gt;    &lt;li&gt;If no, she will try to determine whether a table is available &lt;/li&gt;    &lt;li&gt;If yes, she will escort you to the table &lt;/li&gt;    &lt;li&gt;If no, she may ask you to come back later =&amp;gt; stop &lt;/li&gt;    &lt;li&gt;The waitress will provide you with a menu &lt;/li&gt;    &lt;li&gt;At the same time, another waitress might offer you water &lt;/li&gt;    &lt;li&gt;... &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;You will recognize easily that UML activity diagrams could be used to design workflows. Activities are either triggered by events or by active commands (e.g., you ask the waitress to bring you another beer which is like an event or she could ask you if you need anything else which is more like an &amp;quot;invocation&amp;quot;). Thus, you could either use such a diagram to express a workflow or maybe a more domain-specific kind of language/model such as BPEL. This language could be graphical, textual, audio-based, and so forth.&lt;/p&gt;  &lt;p&gt;The advantage of a (domain-specific) language is obvious. It is much easier for domain experts to express the workflows themselves. Moreover, the workflow descriptions could be either used to generate the actual code or to execute the workflow in a runtime engine. &lt;/p&gt;  &lt;p&gt;Sometimes workflow transitions depend on conditions such as &amp;quot;if customer is a special guest, give him a window table.&amp;quot; These conditions however might also be subject to change. Coding such conditions in activities thus reveals the same problems as coding workflows in C# or Java. As a consequence, we should also specify such rules in a declarative fashion. This is where Business Rules Engines enter the stage. Business rules might be explicitly expressible in a workflow language or just be hidden in special activity types. &lt;/p&gt;  &lt;p&gt;How can we retrieve the workflows in the act of architecture creation. User stories, Use cases and scenarios, help determing the workflow in a system. Which of these should be hard coded and which ones should be better implemented using a Workflow language, depends on requirements, frequency of change, required variability, and other factors, questions a software architect needs to address.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-296844720544102554?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/296844720544102554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=296844720544102554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/296844720544102554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/296844720544102554'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/workflows.html' title='Workflows'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7229212302930478420</id><published>2008-02-15T14:30:00.001+01:00</published><updated>2008-02-15T14:35:03.720+01:00</updated><title type='text'>Removing unnecessary abstractions</title><content type='html'>&lt;p&gt;A good architecture design should always only contain a minimal set of abstractions and dependencies. According to Blaise Pascal a system is simple, when it is not possible to remove something without violating the requirements. Again, we can consider this from an architecture entropy viewpoint. Minimalism and simplicity imply the lowest possible entropy.&lt;/p&gt;  &lt;p&gt;Let me give you an example how a design should not look like. Suppose, you are developing a graphical editor. In the first design sketch you introduce an abstraction called Shape with functionality such as Draw(). From this base type you are then inheriting subtypes such as PolygonicShape and RoundedShape. Finally, the abstractions Rectangle and Square and Triangle will become direct descendants of PolygonicShape, and so forth. &lt;/p&gt;  &lt;p&gt;After a while you might recognize that it does not make any sense to introduce the intermediary layer consisting of PolygonicShape and RoundedShape. You find out that in your context all concrete classes such as Ellipse, Rectangle, Triangle, ... should be directly derived from Shape, because you don't differentiate between types of shapes in your software.&lt;/p&gt;  &lt;p&gt;By removing the intermediary layer you have eliminated unnecessary abstractions and dependencies. Obviously, this also adheres to the KiSS Principle. But why, you may ask, are we not removing Shape too? The answer is very simple: Shape introduces common behavior required to handle all concrete shape subtypes uniformly in the editor. Otherwise, we would need to introduce large switch statements, type codes or reflection mechanisms in several places of our application. Thus, removing Shape would impose a much higher entropy.&lt;/p&gt;  &lt;p&gt;As you can surely see, determining the applicability of this architecture refactoring is not trivial, because you need to consider different layers and levels of abstractions in your design. For example, in another context it might be important to introduce intermediary abstractions such as PolygonicShape because you need to treat polygons different from rounded shapes. In this sense truth is always relative.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7229212302930478420?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7229212302930478420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7229212302930478420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7229212302930478420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7229212302930478420'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/removing-unnecessary-abstractions.html' title='Removing unnecessary abstractions'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5160259037309610226</id><published>2008-02-14T22:22:00.001+01:00</published><updated>2008-02-15T07:52:39.655+01:00</updated><title type='text'>Work Life Balance - Revisited</title><content type='html'>&lt;p&gt;Right after each of my postings related to Work Life Balance, my inbox grew due to people asking me about how I personally keep the balance. That's the reason why I want to spend some sentences on this personal issue although it is not related to Software Architecture (al least at the first sight).&lt;/p&gt;  &lt;p&gt;I still consider myself a workaholic on rails. Only a few years ago I used to work the whole week without too many exceptions. After some health problems, I remembered the time when I had been totally enthusiastic about sports. And then I started to go biking and running regularly. That's where the rails come in. Ok, I did too much running and got problems with my knee which is the reason why I am more biased to biking these days. Typically, I will run or bike almost every day from spring to autumn. For example, I enjoy to bike to work (10 km). On my way back to home I will often use a detour leading through a large forest and along a bike lane near the Isar river here in Munich (30-50 km).&amp;#160; Sometimes, I leave office late afternoon and continue my work at home. If possible, I am also running which is an incredibly excellent way to relax, especially in winter when biking is not that cool (or should I better&amp;#160; say when it is too cool). After 10-12 km which may take more than 60 minutes depending on my training intensity all problems are gone and my mind is open for new ideas. &lt;/p&gt;  &lt;p&gt;My other hobbies include composing music, reading books, listening to podcasts, audiobooks or music on my IPod, among many other interests. Yes, I definitely got more interests than time.&lt;/p&gt;  &lt;p&gt;My experience has taught me that sports (no matter what) is the most important way to keep your balance. So is meeting people who have no interest in any IT topics. Same for all hobbies that help forgetting about any work related challenges (formerly known as problems). I have never been as creative as when keeping my work/life in balance. The more time I spend for sports and other interests, the more productive I will be. This is kind of surprising as I always believed in the opposite statement (the more time spent, the more productivity).&lt;/p&gt;  &lt;p&gt;Just relax!&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5160259037309610226?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5160259037309610226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5160259037309610226' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5160259037309610226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5160259037309610226'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/work-life-balance-revisited.html' title='Work Life Balance - Revisited'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-3580723622473354263</id><published>2008-02-14T18:11:00.001+01:00</published><updated>2008-02-14T18:16:39.680+01:00</updated><title type='text'>All about Cycles</title><content type='html'>&lt;p&gt;Here comes a real world example. In a management application the distributed agents in charge of managed objects (such as routers, load balancers, switches, firewalls) are accessed by a centralized monitoring application.&amp;#160; For this purpose, the sensors offer functionality such as setter/getter functions. The monitoring subsystem inherently depends on the agents it monitors. After a while, the developers of the agent subsystem think about returning time stamps to the monitoring subsystem whenever it requests some information. But where could they obtain these central time stamps? The team decides to add time stamp functionality to the central monitoring subsystem. Unfortunately, the agents now depend on the monitoring subsystem. Developers have established a dependency cycle.&lt;/p&gt;  &lt;p&gt;&amp;quot;So, who cares?&amp;quot;, you might say. The problem with such circular references is that they add accidental complexity. Mind the implications such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If there is a cycle within your architecture involving two or more subsystems, you won't be able to test one of the subsystems in isolation without needing to test the other ones. &lt;/li&gt;    &lt;li&gt;Re-using one of the subsystems in the cycle implies you also need to re-use the other subsystems in the cycle.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It is pretty obvious that dependency cycles are a bad thing. They represent an architectural smell. But how can we cure the problem? Can you hear the horns playing a fanfare? The answer is: by applying an architectural refactoring!&lt;/p&gt;  &lt;p&gt;So, how could we get rid of a dependency cycle?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Option 1: by redirecting the dependency to somewhere else. In the example above, we could introduce a time subsystem the agents use to obtain time stamps instead of adding this functionality to the monitoring subsystem. This way, we broke the cycle.&lt;/li&gt;    &lt;li&gt;Option 2: by reversing one of the dependencies. For example if we exchange a publisher/subscriber pull model (event observer itself asking for events) with a push model (event provider always notifies event consumer). Another example is introducing interfaces: instead of letting a component depend on another component we could introduce interfaces. This way, a component always uses interfaces and never component implementations directly.&lt;/li&gt;    &lt;li&gt;Option 3: by removing the dependency completely if it is not necessary. For example consider Master/Detail relationships in relational databases. Only one dependency direction makes sense here. The other one is obsolete. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Dependency Injection as provided by all those IoC Containers is very helpful to avoid dependency cycles. Even if you got no dependency cycles in your system, you should always avoid unnecessary dependencies - because they inevitably increase entropy and thus the chance of circular references.&lt;/p&gt;  &lt;p&gt;But how can we detect such dependency cycles within our system? This is where CQM (Code Quality Management) tools enter the stage. Of course, these tools are not restricted to problems with dependencies. They are also helpful with a lot of other architecture quality related measurements. &lt;/p&gt;  &lt;p&gt;Can we always avoid cycles? No, because sometimes they are inherent in the domain. For example, in Microsoft COM due to the usage of reference counting cycles were required in graph structures consisting of COM objects. However, one could certainly ask if the design of COM was appropriate in this respect. But that's a completely different issue.&lt;/p&gt;  &lt;p&gt;Thus, the general guideline should always be: avoid unnecessary (accidental) dependencies, break dependency cycles!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-3580723622473354263?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/3580723622473354263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=3580723622473354263' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3580723622473354263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/3580723622473354263'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/all-about-cycles.html' title='All about Cycles'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-9039588080887489660</id><published>2008-02-12T17:23:00.001+01:00</published><updated>2008-02-12T17:23:49.670+01:00</updated><title type='text'>Emergence</title><content type='html'>&lt;p&gt;Suppose, you are going to develop a traffic control system for a rather large city. The goal is to optimize traffic throughput which could be measured by average miles of each cyclist and motorist. In a first approach, you may suggest to use a purely centralized control subsystem. &lt;/p&gt;  &lt;p&gt;There are various problems with this task:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In a rather large traffic infrastructure, traffic can never be controlled from a centralized component. First of all, this component would represent a single point of failure. Secondly, it would not scale or perform at all due to the sheer amount of traffic signals involved.&lt;/li&gt;    &lt;li&gt;The requirement of traffic optimization reveals a significant problem. Assume, that there is a main road through the city. The best way to achieve the goal could be to just set all traffic lights on the main road to green. Participants driving on side streets would then need to wait forever. That's what is called starvation in multithreading.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;How could we solve those problems?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Instead of using a centralized approach, we could rely on a completely decentralized approach. For example, each street crossing could permanently measure the traffic and adapt its traffic lights automatically to the current situation. If all street crossing act independently, local tactics might dominate global strategy. Obviously, this is not what we want. Strategy should always dominate tactics. Hence, let local decisions of street crossings depend on &amp;quot;neighboring&amp;quot; street crossings. If appropriate, we could also mix centralized control with decentralized autonomous adaptations. That basically means, that we control the overall strategy, but allow the system to automatically and locally adapt its tactics. Is it always useful to apply decentralized approaches? No. Here is a real life experiment: Take a number of people in a row each of them stretching one of their fingers. Put a large stick on their fingers. And then tell the group to systematically and gently put down the stick to the ground. They won't succeed until finally one person will become the leader and coordinate the whole action.&lt;/li&gt;    &lt;li&gt;We also learn from the example that we need really to address requirements with much more care, especially in systems with complex interactions. In the example above the target function should not only consider average flow but also take possible starvation into account. By the way, the traffic example could also be replaced by a Web shop and Web traffic.&amp;#160; In this example, starvation would imply that some shoppers would have a fantastic experience while others could not receive any Web page in an appropriate response time. Guess, how often the latter ones would re-visit the shop. Wrong understanding of requirements can seriously endanger your whole business goals.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The question is how to design such decentralized systems. There are lots of options: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Infrastructure: P2P networks are one way to organize resources so that they can be located and used in a decentralized way. Cloud Computing formerly known as Grid Computing is another cool example.&lt;/li&gt;    &lt;li&gt;Algorithms: Genetic algorithms help systems to automatically adapt themselves to their context. &lt;/li&gt;    &lt;li&gt;Cooperation models: Swarm Intelligence such as ants also illustrates how emergent behavior can substitute centralized control.&lt;/li&gt;    &lt;li&gt;Architecture: Patterns such as Leaders/Followers or Blackboard help introduce decentralized approaches. &lt;/li&gt;    &lt;li&gt;Technologies: Rules engines and declarative languages such as Prolog are useful for providing decentralized computing.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The problem with decentralized versus centralized systems is often when to use what. And in addition, to decide how much decentralized the system should be. This is not always obvious. Let me give you some examples instead:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In a sensor network you might place many small robots to a specific area in order to monitor environmental data. These robots would be completely autonomous. Even if some of them fail, the overall system goal can be achieved.&lt;/li&gt;    &lt;li&gt;In a Web Crawler several threads could search for URLs in parallel, but they would need to synchronize themselves (e.g., using a tuple space) in order to prevent endless loops. This resembles ant populations.&lt;/li&gt;    &lt;li&gt;In a car or plane you need central control, but some parts can also operate and adapt&amp;#160; independently such as Airbags or ESP. This is more a hybrid approach with the global strategy implemented by a centralized approach.&lt;/li&gt;    &lt;li&gt;In embedded (real-time) controllers (such as your mobile phone) everything typically is centralized&amp;#160; because behavior must be statically predicted and configured.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The more co-operation your components require and/or the more determinism you need, the less a decentralized approach seems appropriate, and vice versa.&amp;#160; &lt;/p&gt;  &lt;p&gt;The best way to design such decentralized systems is to introduce the concept of emergent behavior. For example, define a set of simple local rules to which the system parts must abide. And then let the parts take control.&amp;#160; By the way, this is exactly how the Internet works. But in the Internet, you will also find a hybrid approach combining centralized backbones with decentralized nodes.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-9039588080887489660?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/9039588080887489660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=9039588080887489660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/9039588080887489660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/9039588080887489660'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/emergence.html' title='Emergence'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5764884779477589686</id><published>2008-02-09T22:04:00.001+01:00</published><updated>2008-02-09T23:50:47.400+01:00</updated><title type='text'>Nervous Breakdown by Communication Overkill</title><content type='html'>&lt;p&gt;Whenever I meet IT experts in airline lounges or conference rooms they are often very busy in synchronizing their memory with the continuous information flow from their company, customers, and other sources. Typically, they are armed with a quite impressive weaponry that includes blackberries, (&amp;gt;= 1) mobile phones, notebooks, and PDAs. Asking them about the effectiveness and efficiency of their work, they mostly complain about the impossibility to perform real work in their office in addition to the burden of all these travels and meetings. If we did a cost/benefit analysis relating the quantity of information exchange to work effectiveness, we would certainly be (negatively) surprised.&lt;/p&gt;  &lt;p&gt;Let me just provide a theoretical example.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In average, meetings will require 2 hours per day. Given the fact, how ineffective meetings are planned and performed, I assume that at least 2 thirds of the time spent is a complete waste.&lt;/li&gt;    &lt;li&gt;If you receive 100 mails per day, then throwing away 50 of them, might only take 5 minutes. However, reading 30 mails will require additional 30 minutes. And answering the remaining 20 will require 60 minutes. Thus, you've spent at least 1 1/2 hours for handling email. &lt;/li&gt;    &lt;li&gt;Travel might also require 1 hour in average per day.&lt;/li&gt;    &lt;li&gt;From time to time, you will have some personal face to face communication with colleagues, some of them just flocking to your office.&lt;/li&gt;    &lt;li&gt;Telephone calls will require at least another hour per day. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each media break (such as the arrival of e-mail, SMS, phone calls, meetings, etc) also interrupts your work and causes continuous context switches. As you know, context switches are ineffective time durations, not only in a CPU but also in real life.&lt;/p&gt;  &lt;p&gt;If you summarize all of this, it is not very difficult to recognize the problem.&lt;/p&gt;  &lt;p&gt;How does this relate to software architects? As you definitely know, a software architect is in charge of designing a software architecture which requires a lot of communication activities. The more ineffective communication proves to be, the less time can be spent for the actual job.&lt;/p&gt;  &lt;p&gt;We are all part of a vicious cycle that involves ineffective communication, unnecessary breaks and context switches. The only way to solve the problem is not to stop communicating but to spend your time much more effectively.&lt;/p&gt;  &lt;p&gt;Personally, I consider the following means very helpful:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you need to work on a document or review, use your home office, given that you can work there without any major interrupts. &lt;/li&gt;    &lt;li&gt;When you feel tired, exhausted or relax, go to the gym, or do whatever you feel appropriate to improve your mood. It is simple math. If you need to spend n hours for your work, it is not necessary to spend these hours in a row. For your company, mixing work time and recreation time is much more productive and less error-prone, especially when your job requires creativity. &lt;/li&gt;    &lt;li&gt;Time box all meetings. I found out that m one-hour meetings are much more effective than one m-hour meeting. Needless to mention, meetings should be effective themselves (agenda known in advance, specific and clear objectives of the meeting available, have a moderator, and so forth).&lt;/li&gt;    &lt;li&gt;Prioritize mails and phone calls. Tell people and train them, that you are not able to answer all mails or phone calls all the time. Consider voice-mail and mailboxes as friends. They allow you answering whenever you are prepared, not when the callers are. Switch off mobile phones, blackberries when you are in meetings, need to relax. Not to communicate sometimes is not a luxury but a necessity. By the way, it is not rude to tell colleagues that you are not ready to talk to them but that you will come back tothem later, if you are currently busy.&lt;/li&gt;    &lt;li&gt;In your spare-time or holidays don't accept any business-related communication except for emergencies. &lt;/li&gt;    &lt;li&gt;Travel is important as face-to-face meetings are the most effective form of communication, but don't underestimate the impact of traveling on your effectiveness. Thus, only travel when really necessary.&lt;/li&gt;    &lt;li&gt;Plan your time thoroughly (time management). And also plan sufficient spare time for recreation to keep your work/life balance and may be even your relationships healthy. &lt;/li&gt;    &lt;li&gt;Diversify your work day. Three meetings or telephone conferences in a row are boring, exhausting and ineffective. The same holds for sitting in front of your PC or notebook (or TV) for several hours.&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There is the common misconception that knowledge workers such as software architects should always be available for communication and work 12 hours a day without any break. Eventually, the job of architects is to build high quality software architectures, and to do this successfully they need motivation, fun, and focus. In the end, multitasking such as communication in one thread while designing in the other is not feasible for humans. Sufficient recreation time (for example due to avoidance of communication overkill) is an essential means to do our jobs successfully. &lt;/p&gt;  &lt;p&gt;Sometimes relaxing is more productive than working.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5764884779477589686?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5764884779477589686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5764884779477589686' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5764884779477589686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5764884779477589686'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/nervous-breakdown-by-communication.html' title='Nervous Breakdown by Communication Overkill'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2386028860762800372</id><published>2008-02-09T18:27:00.001+01:00</published><updated>2008-02-09T18:27:48.327+01:00</updated><title type='text'>Architecture Governance</title><content type='html'>&lt;p&gt;I consider cross-cutting concerns such as error handling as one of the major challenges in any software development project. These cross-cutting issues should be subject to what I call architecture governance.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;We need to establish rules how to uniformly handle these issues throughout the project. Otherwise, every developer or architect will provide her/his own solution which significantly reduces symmetry and orthogonality.&amp;#160; I've seen many projects where error reporting was provided by some subsystems using return values while others used exceptions instead. Even in projects where exception handling had been common practice, developers introduced their own exception types for similar exceptions. Guess, how well such an architecture is balanced.&lt;/li&gt;    &lt;li&gt;We need to define roles and persons in charge of supervising software development and enforcing the rules. In one project architects had created documents for all of these concerns. Unfortunately, developers didn't care about the documentation. Policy enforcement tools such as FxCop for .NET can provide help. Trust is good but control is better.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The best way to guarantee proper handling of these concerns is to provide guidelines from day 0. Architects are in charge to establish a strategic architecture document as well as the design guidelines and programming conventions in the beginning, not as an afterthought. All places where those rules are then violated within the project are subject to refactoring.&lt;/p&gt;  &lt;p&gt;What are typical cross-cutting concerns in this context? Examples include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Error Management&lt;/li&gt;    &lt;li&gt;Security Checks (such as most cross-cutting non-functional qualities)&lt;/li&gt;    &lt;li&gt;Naming Conventions&lt;/li&gt;    &lt;li&gt;Mandatory Patterns&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Why is that important? Because allowing everyone doing whatever she/he considers best, will lead to less expressiveness and readability, high accidental complexity, less developer usability, missing orthogonality and symmetry. With other words, it will have an negative impact on all architecture qualities.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;This is why Architecture Governance is essential!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2386028860762800372?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2386028860762800372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2386028860762800372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2386028860762800372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2386028860762800372'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/02/architecture-governance.html' title='Architecture Governance'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5323948529391211170</id><published>2008-01-31T19:06:00.000+01:00</published><updated>2008-01-31T19:14:42.084+01:00</updated><title type='text'>Learning from failure: Bangalore and Software Architecture</title><content type='html'>&lt;p&gt;I am currently enjoying my time here in Bangalore (India) where I am giving some talks and trainings on Software Architecture. Especially, the hospitality here is marvellous. Bangalore is a very fast growing city with very nice people and a hot spot due to its IT companies and IT experts. On one hand, all the high tech industry is quite impressing. On the other hand, it is astonishing to see hightech centers in a lowtech infrastructure. Interesting, you might think, but how is this related to software architecture? When speaking to colleages here and to my driver (you cannot and should not manage to drive yourself as someone more used to the US or German car driving patterns :-), they told me a lot of interesting things related to Bangalore's infrastructure which I consider likewise applicable to software architecture. Don't be embarassed that I explicitly use Bangalore. It is a pars-pro-toto. Any other big metropoles would do also, but now that I am here ....&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Bangalore's population significantly increased over the last years. Unfortunately, the infrastructures could not be increased accordingly. What formerly has been garden city, a small green place, has now become a big metropole. A good example is the traffic infrastructure. It has turned to a significant bottleneck (also known as nightmare) so that it might take you an hour even for small distances. What can we learn as software architects: We must plan for non-functional qualities such as scalability and prepare the system to increase when the load increases. Doing this as an afterthought can prove to be almost impossible. Of course, this is hard for a city.&lt;/li&gt;&lt;li&gt;As an implication of the insufficient traffic infrastructure, drivers of cars, motorbikes, bicycles, busses, trucks, rickshaws will just use any available gap of a traffic lane. Thus 3 lane streets will become 6 lane streets. There is almost no traffic control except for a few police men (and I am not sure how much control thy really have). The most important tool is the horn to tell other persons that you are here. What can we learn as software architects: governance is an important issue. Make sure that everyone abides to the rules. Overload situations in a system also make it nondeterministic as you can never anticipate how much time particular activities will require.&lt;/li&gt;&lt;li&gt;If you drive around in Bangalore, you will find no direction signs at all. Want to go somewhere? Better know the route or follow a trial-and-error approach until the end. What we can learn as software architects: usability and habitability should be considered important. Otherwise, users may have a very unpleasent time with your product.&lt;/li&gt;&lt;li&gt;The current airport is a former military airport and thus can provide only limited and sometimes slow service. Now, the local government is opening a new international airport to solve the problem. Unfortunately, there will be no fast train or highway connections from the airport to the city center. People from Electronics City (the Silicon Valley of India) suppose, it will take them 3 hours to reach the airport. What can we learn as software architects: If a service is very performant or offers otherwise high quality of service, this won't help you much once it takes a long time to send your request to the&lt;br /&gt;service or to receive a response. You always need to look on the system as a whole. And you always should remember the weakest link in the chain defines what quality you will obtain. &lt;/li&gt;&lt;li&gt;To improve the infrastructure several construction works are on the way. For example, there will be a new multi lane highway. However, this highway will end in a two lane highway. Guess what what happens on the junction of these highways? What&lt;br /&gt;can we learn as software architects: Also mind the connections. Local optimizations might help locally but can not solve problems that should be addressed globally. First think strategically and then tactically.&lt;/li&gt;&lt;li&gt;In the previous days there were some news about people who suffered severe illnesses from drinking the local drinking water. It turned out that some people didn't follow the regulations and just installed sewage pipelines near water pipelines.&lt;br /&gt;Imagine what will happen if erosion leads to lecks where both systems join? What can we learn as software architects? First of all, it is not sufficient to provide guidelines and throw them over the fence. An architect must also control that developers abide to the rules. Second, design erosion can lead to unwanted side effects. Instead of waiting for problems to occur, it is better to apply refactorings or even a complete reengineering. The latter is almost impossible for a real city infrastructure. Third, you need to keep in mind how infrastructures interact with each other. Fourth, you need to plan upfront for modifiability and later evolution to prevent such workarounds.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Take this example and think about ULS (Ultra Large-Scale Systems). The ULS proponents compare ULS with building cities instead of building houses where you also will also have to deal with human interaction and creating/maintaining/evolving large infrastructures. As soon as we are starting to deal with such ULS (systems of systems) we need to make sure such design erosion will not happen. There is a lot to learn from real life for cyber techies.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5323948529391211170?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5323948529391211170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5323948529391211170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5323948529391211170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5323948529391211170'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/learning-from-failure-bangalore-and.html' title='Learning from failure: Bangalore and Software Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-2309299540573464010</id><published>2008-01-25T19:33:00.001+01:00</published><updated>2008-01-25T19:33:17.188+01:00</updated><title type='text'>My Trip to India</title><content type='html'>&lt;p&gt;Tomorrow I will travel to Bangalore, India, for one week. There I will give some talks on Software Architecture in the context of a software architecture education program for our colleagues. I am really looking forward to this trip. &lt;/p&gt;  &lt;p&gt;expect further postings after my return&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-2309299540573464010?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/2309299540573464010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=2309299540573464010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2309299540573464010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/2309299540573464010'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/my-trip-to-india.html' title='My Trip to India'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7569369213178649570</id><published>2008-01-18T23:17:00.001+01:00</published><updated>2008-01-19T16:27:05.982+01:00</updated><title type='text'>(Re-)Use a Component</title><content type='html'>&lt;p&gt;It sounds so incredibly simple. Suppose, you are currently developing a car navigation system. During lunch break you meet some friends who are working in another part of your company which has already developed a component&amp;#160; for calculating routes. &amp;quot;That's cool&amp;quot;, you think. &amp;quot;Why not just take the same component which will significantly reduce costs&amp;quot;. Now, you start dreaming about extra holidays in Honolulu paid by your boss for saving so much money. You can't stop immediately walking to Wally who is one of your cynical colleagues in order to check the value of your recent inspiration. &lt;/p&gt;  &lt;p&gt;&amp;quot;Hmmh&amp;quot;, he murmurs, &amp;quot;sounds like a really great idea&amp;quot;. But then he continues, &amp;quot;... but there may be some - well - small problems on your way to paradise&amp;quot;. He starts his endless list of potential hurdles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The existing routing component which I will coin R has been developed for Windows Mobile, but your application needs to support Linux and Android as well. You'll require some wrapper facades to make R portable. This could take a significant amount of time and developers. &lt;/li&gt;    &lt;li&gt;Also the interfaces of R are not exactly in the shape you expect. Your developers may integrate some of them using plain-vanilla wrappers while other interfaces will require significant refactorings. For example. incompatible data types, different protocols and some internal dependencies make your life much harder. And mind the multiple components dilemma! Components may influence each other. I remember commercial components that caused serious problems whenever we used them in combination.&amp;#160; And, of course, R also expects some interfaces from its environment which are currently not available in your application. &lt;/li&gt;    &lt;li&gt;Another issue is the dependency problem. Component R requires different other libraries and components. This means, developers must either also migrate these other dependent software artifacts or try to transform the component in such a way that it can leverage similar artifacts of the target environment. &lt;/li&gt;    &lt;li&gt;In the application for which the partner development team has created R&amp;#160; were some special requirements related to fault management, availability, security and reliability which are a little bit different in your application. Either you need to adapt your application to R (very unrealistic) or R must be adapted to your application. &lt;/li&gt;    &lt;li&gt;As R is part of a multiple products some variability has been identified and appropriate variability mechanisms established within R. Unfortunately, these mechanisms do not match your variability requirements very well. &lt;/li&gt;    &lt;li&gt;Another problem you may encounter is the 99% problem. R might provide almost all functionality you require. Only 1% is missing, but adding this 1% will require a significant amount of time and resources. &lt;/li&gt;    &lt;li&gt;Tests for R have been developed for the exact context in which R currently resides. Thus, you'll need to establish modified test plans and a test strategy for quality assurance. &lt;/li&gt;    &lt;li&gt;Unfortunately, you also have to consider an additional dimension. R currently is owned by the partner development which also is responsible for its evolution. With other words, bugs, technical innovations or requirement changes will cause the component to be constantly modified in the future. As R is owned by someone else, you cannot expect that the owning department will be able to consider your requirements in the first place. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ok, sounds like bad news. And as you know, bad news are the only thing traveling faster than light. It is not a good idea to rip a component from its context and then hope it will run unchanged in another context. Instead, a lot of efforts are necessary to transform a component from context A to context B. And the problem will get even worse when the same component is supposed to execute in many contexts. &lt;/p&gt;  &lt;p&gt;You learned your first lesson: ad-hoc re-use causes more harm than benefits. So let us take another direction. Why not take the component R and make it a re-usable component in your organization serving more than one application? With other words, let us take a systematic approach. &lt;/p&gt;  &lt;p&gt;A systematic approach requires a completely different setting.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All shared components are developed for the application in different products from the beginning. You may not always start from scratch, but use existing components as a base. &lt;/li&gt;    &lt;li&gt;In your organization you need to establish an independent team that owns the component (or various components) and acts as a supplier to all product groups. It is also the component group's responsibility to take care of quality assurance. Of course, it is necessary to establish some governance measures as well. &lt;/li&gt;    &lt;li&gt;All product groups and the component group need to define a common development process which integrates component development &amp;amp; evolution with product development &amp;amp; evolution. Component release planning must follow release planning of products. However, different versions or branches of the same component may co-exist. &lt;/li&gt;    &lt;li&gt;It is also essential that component development would suffer from a whole spectrum of diverse contexts in which components reside. Thus, products should abide to some constraints and share practices and guidelines. One example to make this point more concrete: If product P expects errors to be reported by exceptions, while product Q is using error values instead, how should a component be able to provide all of these diverse policies. This simply isn't feasible. In this case, the company policy&amp;#160; would force the component and all products to use exception handling.&amp;#160; Another example is documentation and design. Anyway, the organization should introduce (and enforce!) some common guidelines for product and component development. &lt;/li&gt;    &lt;li&gt;For the case of bug fixes or other relevant changes to components a feedback loop between product teams and development teams needs to be established.&amp;#160; &lt;/li&gt;    &lt;li&gt;It must also be defined which requirements the component group must address. This includes functional and non-functional qualities. Especially, the variability requirements need thorough consideration. A component should not be a jack of all trades (trying to meet all product requirements) but also can't be a master of none (just providing functionality without considering product requirements and usability issues). &lt;/li&gt;    &lt;li&gt;Such a systematic approach does not only require changes of the development organization but of the organization as a whole. For instance, product managers must now deal with different groups. Test managers must adapt their test strategies.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obviously, such a systematic approach for re-use requires a cost benefit analysis. It is rather unlikely that an organization would establish such an approach for only two products that share the same component.&lt;/p&gt;  &lt;p&gt;All your beautiful dreams have vanished. What looked so easy and promising, turned out to be rather complex and expensive. There is no free lunch. &lt;/p&gt;  &lt;p&gt;But wait a second: what if your products often had a very similar scope containing almost the same functionality? What if were are in the business of building lots and lots of car navigation systems? What if these products could use all these powerful components for routing, MMI, GPS, speech recognition, ...?&amp;#160; What if you had a framework combining these components to a powerful and adaptable whole? All of a sudden, the sun is rising again. In this case, a systematic re-use might be expensive to establish but once appropriate processes and organization structures are in place, it will be very effective.&amp;#160; We have entered the universe of product line engineering. &lt;/p&gt;  &lt;p&gt;Even then, you have to consider all the dangers lurking in derelict parts of the galaxy. Mind the dark energy that tears everything apart and mind the dark matter that leads to system collapse. Be aware of black hole components in your architecture!&amp;#160; But that's a different story.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7569369213178649570?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7569369213178649570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7569369213178649570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7569369213178649570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7569369213178649570'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/re-use-component.html' title='(Re-)Use a Component'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7065679538769348791</id><published>2008-01-12T17:54:00.001+01:00</published><updated>2008-01-12T18:05:04.224+01:00</updated><title type='text'>OOP Conference 2008</title><content type='html'>&lt;p&gt;Only as a side remark. I will participate in this year's OOP conference giving a talk and a tutorial. Note: the presentation language will be german.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In the talk I will address Software Architecture Refactoring, currently my favorite topic. As far as I have heard over 170 people already have already registered for the talk. I am quire impressed how many people are interested in the topic. On the other side, architecture refactoring is something new (which really strike me when I came up with this field because I assumed that almost every architect should have knowledge in this field)&lt;/li&gt;    &lt;li&gt;In the full day tutorial (on friday, the 25th January) I will introduce SOA with .NET. Despite of the title, the tutorial could also be interesting for people not interested in .NET, as I also will include many parts that address SOA in a more general way. But, of course, technologies such as WCF, WF and BizTalk will get sufficient coverage.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you are planning to attend any of these events, don't hesitate to approach me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7065679538769348791?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7065679538769348791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7065679538769348791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7065679538769348791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7065679538769348791'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/oop-conference-2008.html' title='OOP Conference 2008'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-1354706135421772410</id><published>2008-01-12T17:42:00.001+01:00</published><updated>2008-01-12T17:42:43.229+01:00</updated><title type='text'>Architectural Entropy</title><content type='html'>&lt;blockquote&gt;   &lt;p&gt;Several years ago I introduced the term entropy in the context of software architecture. Entropy defines the number of concepts appearing in a software architecture. If your design consists of two simple components associated with one unidirectional relationship, this design probably has a low entropy. I only say &amp;quot;probably&amp;quot; because it depends on whether the internals of the component are complex or not. If, however, you increase the number of components or relations or their internal complexity, entropy inevitably also increases. High entropy often is an indicator for high complexity. High complexity always means high entropy. But high entropy does not enforce high complexity. A system that consists of almost infinite simple components that are not related with each other implies high entropy but not high complexity. You should also consider the other direction. A system that consists of only one single god component may be very complex. Hence, entropy can non only be measured by addressing one view or abstraction level (e.g., the component layer) but must consider all views and abstraction layers.&lt;/p&gt;    &lt;p&gt;Obviously, incremental architecture design must lead to higher entropy, because we constantly add things. One of the fundamental issues in achieving high&amp;#160; architecture quality is minimizing entropy. Activities such as software architecture refactoring are doing exactly this. Quality factors such as loose coupling, symmetry, conceptual integrity, orthogonality strive for reducing entropy or at least keeping it small.&lt;/p&gt;    &lt;p&gt;The art of software architecture is controlling entropy. &lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-1354706135421772410?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/1354706135421772410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=1354706135421772410' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1354706135421772410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/1354706135421772410'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/architectural-entropy.html' title='Architectural Entropy'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4658721510001607851</id><published>2008-01-03T10:00:00.000+01:00</published><updated>2008-01-03T10:20:25.548+01:00</updated><title type='text'>Context and Boundaries</title><content type='html'>One of the most important issues when starting a new project is the differentiation between those parts that are in the software system and those which are external. We need to specify clear boundaries between the system going to be built and its environment.  This is an issue developers often neglect. One of the obvious implications of not considering boundaries are misunderstandings during the design and architecture modelling phase. Are these boundaries simply a consequence of the underlying domain? Not at all! If we are going to create a Web Shop, the order processing subsystem is definitely an important concept of the domain. However, we could either introduce our plain-vanilla, homegrown order processing subsystem or just integrate an existing system such as SAP R/3 to provide the same service. In other words, first we need to consider which services are required, then we need to decide whether we will build these services as part of our software system  or just (re-)use other external services for the same purpose.&lt;br /&gt;How to proceed: I am a big fan of component-based design. I just consider components to be independent artifacts (i.e., modular units of testing, deployment, implementation, modularization,...)  providing services to their environment (services may be functionality or  events or configuration interfaces) and consuming services from their environment (such as functionality or events). Note: components can aggregate other components. I will design all subsystems including the whole system itself using this component concept.  Hence, I need to define which interfaces my system will provide to its environment and which it will need to obtain. For example, one typical required interface of a Web Shop is access to a credit card company to verify customer credibility.&lt;br /&gt;When designing such context diagrams the obvious choice is to leverage UML component diagrams.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4658721510001607851?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4658721510001607851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4658721510001607851' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4658721510001607851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4658721510001607851'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2008/01/context-and-boundaries.html' title='Context and Boundaries'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4207903873923266712</id><published>2007-12-19T16:27:00.000+01:00</published><updated>2007-12-19T20:17:45.791+01:00</updated><title type='text'>Requirements Part II - The Art of Multi-Facet Design</title><content type='html'>I'd like to continue my previous posting with an architectural design consideration. Basically, an architect maps the concrete problem (which is an entity of the problem domain) to a concrete solution (which is an entity of the solution domain).&lt;br /&gt;Requirements help to decide which paths to take at specific points. This implies that requirements constrain the solution space. If multiple requirements are "applicable" at a specific point, priorities define the precedence which is why we must assign unique priorities to them. Not very complex so far, right?&lt;br /&gt;&lt;br /&gt;But how do we really implement a solution architecture?&lt;br /&gt;The first thing we obtain is a functional object model consisting of all the entities in the domain as well as their relationships. For instance, if we are going to build a Web shop, this model would probably consist of concepts such as customer, shopping cart, order system, product catalog, payment system. It is highly recommendable to define a domain model (domain-driven design) first to achieve a sound understanding and a common vocabulary among all stakeholders. Use cases are the means to drive this activity. They help designing the external boundaries of the system to be built but also the internal components required to implement the use cases. Obviously, functional requirements also have priorities which is why the use case priorities should drive the process.&lt;br /&gt;&lt;br /&gt;Then we need to take into account infrastructural issues such as distribution, security, ... According to their priorities, we start with the most important infrastructure which needs to integrate into and with the functional model. For example, if we need to add distribution-specific infrastructure to our Web shop, we would introduce a broker-based architecture with customer browsers being the clients and the web shop being the server. Now let us assume, security is the next important requirements. We are now going to integrate an appropriate securiy infrastructure into our result we achieved after embedding the functional entities into the distributed infrastructure. We will add security components such as firewalls, identity management functionality, ... We continue with this approach until we have considered all operational requirements. What we did is extending the functional model (problem domain driven) with non-functional infrastructure parts (solution domain driven).&lt;br /&gt;&lt;br /&gt;In the third step we add the infrastructure required by developmental qualities such as configurability, extensibility, and the like. This means that all those strategies, interceptors, configuration interfaces will be added at the end.&lt;br /&gt;&lt;br /&gt;What we reached is an onion model with the functional architecture being the core part, the layers derived from the operational/infrastructural requirements being the middle part, and the developmental infrastructures being the outer part.&lt;br /&gt;If you think about it, this is exactly what a building architect or other engineering disciplines do. Our resulting software architecture represents an integration of different functional and non-functional perspectives which is why I call it Multi-Facet Design.&lt;br /&gt;&lt;br /&gt;But what about Software Product Line Engineering, In SPLE we will have to introduce a Commality/Variability analysis in order to determine all commanlities and variants. Variants will be considered as variations of a commonality and hence can be defined in terms of a commonality. Sounds abstract, but let me introduce an example. If we take our Web shop, we could define that we need to support different payment options (credit card, bank transfer, Paypal) depending on the customer. The variability is now defined as possible payment options. But the commonality in this example is the payment system itself. As a consequence, we need to consider the payment component in the core design, but specify the exact variations in the developmental design. For example, we could introduce the strategy pattern for the payment system to allow different options.&lt;br /&gt;&lt;br /&gt;What about embedded systems?&lt;br /&gt;All stringent constraints emerging from embedded systems such as scarce memory resources or CPU limitations or limited battery life will be handled as high priority requirements. One of the consequences is that static configurations are always preferred over dynamic configurations in such systems to allow determinism and control of QoS properties. Needless to say that realtime capabilities place additional burden to the engineer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4207903873923266712?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4207903873923266712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4207903873923266712' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4207903873923266712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4207903873923266712'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/12/requirements-art-of-multi-facet-design.html' title='Requirements Part II - The Art of Multi-Facet Design'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8809549738492644544</id><published>2007-12-17T22:48:00.001+01:00</published><updated>2007-12-17T22:53:39.377+01:00</updated><title type='text'>Requirements</title><content type='html'>&lt;p&gt;Recently, I have been involved in consulting some friends about a software development project. At some point in time we started intensively discussing requirements. Soon I recognized there were some funny misunderstandings related to what requirements are. Sentences such as &amp;quot;Oh, all these use cases are our requirements&amp;quot; emerged from the void of the universe and gave me some hints there could be a problem. When I asked them for their use-cases, the only thing they could show me was a UML use case diagram. Not really what you expect as an architect. So, my first activity was explaining the theory of requirements, at least my small, probably incomplete perspective on the world of requirements.&lt;/p&gt;  &lt;p&gt;Functional requirements define the what of the system in terms of the problem space. Thus, they should be expressed in the language of the target domain. All functional requirements span a full range of possible solutions.&lt;/p&gt;  &lt;p&gt;Non-functional requirements come in two flavors, operational requirements and developmental requirements. They impose constraints on the full range of solutions and thus represent beasts of the solution domain.&lt;/p&gt;  &lt;p&gt;Operational requirements are directly related to the operation of the software system. They define qualities such as security, performance, fault-tolerance and can be measured or tested.&lt;/p&gt;  &lt;p&gt;Developmental requirements are directly related to the architecture of the software system. They define qualities such as maintainability, usability, or flexibility.&amp;#160; While some metrics exist for developmental requirements, they are normally not measurable.&lt;/p&gt;  &lt;p&gt;It is interesting that most projects don't fail because of functional requirements but because of failing to meet the non-functional ones. Thus, it is often recommendable to assign sub teams or at least experts to the most important non-functional qualities in the project. They should then prepare checklists, strategies and tactics for ensuring the quality they are responsible for.&lt;/p&gt;  &lt;p&gt;I often use the invasiveness as an additional property. A concrete instantiation of a requirement is invasive if it has an impact on the functional subsystems or relationships. Cross-cutting concerns such as security are mostly invasive.&lt;/p&gt;  &lt;p&gt;To express functional requirements use-cases represent an excellent means. Note: Use cases are textual descriptions with sections such as actors, goals, exceptions, preconditions. A use case diagram is merely a graphical summary of use cases. For all other, i.e. non-functional requirements I recommend using utility trees such as introduced by Bass, Clements, Kazman. For example, a requirement such as flexibility could imply a lot of different things, maybe changeability, extensibility, or removability.&lt;/p&gt;  &lt;p&gt;In the activity of architecture design, all decisions are based on requirements. Unfortunately, requirements can contradict each other. For instance, mind the availability/consistency paradox or flexibility versus performance. This means that all requirements must get a unique priority to let architects decide which path to choose at all decision points. NEVER accept requirements to have the same priority. If they have, assign priorities yourself. This also means: all architectural decisions must be solely based on requirements. Don't create design pearls, create the simplest possible architectures that work (i.e., that meet their requirements)!&lt;/p&gt;  &lt;p&gt;Features are also requirements. So are commonalities and variants. However, they are at a very high level of abstraction and need to be mapped to finer levels first. &lt;/p&gt;  &lt;p&gt;Requirements are the most important entities in a software development project. They help asking the right questions and making the right decisions. Requirements are a tool to constrain the problem and solution domain in such a way that an implementation can be developed effectively and efficiently. If you don't value requirements, you are doomed to fail, because you don't know what you are expected to build. Requirements are your friends, treat them as such!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8809549738492644544?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8809549738492644544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8809549738492644544' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8809549738492644544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8809549738492644544'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/12/requirements.html' title='Requirements'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-7030834020471896575</id><published>2007-12-12T23:20:00.001+01:00</published><updated>2007-12-12T23:20:03.145+01:00</updated><title type='text'>About Learning  &amp; Documenting</title><content type='html'>&lt;p&gt;Currently, I am pretty busy. That's the reason why I couldn't add more postings for a while. This posting will also be a short one.&lt;/p&gt;  &lt;p&gt;It might seem somehow unrelated to architecture, but nonetheless I find it valuable. I am currently very busy preparing some presentations as well as an article on Software Architecture Refactoring for the german OBJEKTspektrum magazine.&lt;/p&gt;  &lt;p&gt;I made some observations about my work style in the last months that I'd like to share with you.&lt;/p&gt;  &lt;p&gt;For learning new IT-related things I am often documenting what I learned using Powerpoint presentations. Then, I will constantly rearrange the slides in such a way that they reflect how I consider the material should be organized to help educating others in a better, more effective way. Powerpoint also serves as a tool for organizing my thoughts and works better for me than mind mapping tools for this purpose.&lt;/p&gt;  &lt;p&gt;When I am writing an article, I often prepare the material as a presentation and then use the presentation as a story line for the article. This helped me writing scientific papers as well as other professional articles. The presentation contains much less content by nature but forces me to design the rough storyline, while I am sometimes lost in details when I start writing articles. &lt;/p&gt;  &lt;p&gt;I often also use pattern templates to organize my efforts when I need to solve architectural problems. Pattern templates are very powerful, because they require me thinking in terms such as context, problem, forces, solution, consequences and so forth. &lt;/p&gt;  &lt;p&gt;In summary, I guess such tools really help me being better organized. Any similar experiences by someone else?&lt;/p&gt;  &lt;p&gt;I am really wondering what tools and methods others recommend.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-7030834020471896575?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/7030834020471896575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=7030834020471896575' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7030834020471896575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/7030834020471896575'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/12/about-learning-documenting.html' title='About Learning  &amp;amp; Documenting'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4721028314860474071</id><published>2007-11-17T20:16:00.001+01:00</published><updated>2007-11-17T20:16:22.140+01:00</updated><title type='text'>SOA Pitfalls - Integrating your Legacy Apps</title><content type='html'>&lt;p&gt;The Past: I can still remember the time when television was mostly black and white and color TVs were not widely available. One company constantly kept claiming in newspaper advertisements they had developed a color filter you just needed to place on your B+W TV set to transform it to a full Color TV set. What an easy solution! And the product did a perfect job given you enjoy random and constantly changing colors such as magenta faces or green skies. Sounds funny, but, of course, no one of us techno geeks would ever be so naive, right?&lt;/p&gt;  &lt;p&gt;40 years later - The Present: Very often I am now involved in SOA projects.&amp;#xA0; And in many cases, even developers believe it is sufficient to simply wrap&amp;#xA0; existing application APIs using WS-* based&amp;#xA0; interfaces to open and integrate all applications into SOA wonderland. However, you might ask, if that is so simple, why do so many SOA integration endeavors fail?&lt;/p&gt;  &lt;p&gt;The Future: SOA integration is not as simple as providing plain adapters. If business processes are the main reason for SOA-enabling an enterprise, it is much more effective to identify an appropriate partitioning of functionality into separate services that are then subject to orchestration. As a first step you need to obtain a consistent and prioritized list of business requirements from which you then define your enterprise architecture in a top-down manner. This might typically begin with simple company internal workflows and end in complex B2B scenarios. You'll need to refactor or even reengineer existing applications if securing investments is important in your company. This implies opening applications by providing service interfaces (in a bottom-up approach). Of course, qualities such as operational and developmental ones introduce additional levels of complexity. For example, opening up an existing intranet application for a B2B partnership scenario requires a whole lot of security considerations.&lt;/p&gt;  &lt;p&gt;In summary, the adapter pattern might be simple but its concrete application can incur a whole lot of complexity. Building SOA applications naively will save a lot of time and resources in the short term, but imply a large amount of additional costs&amp;#xA0; in the mid- and long term.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4721028314860474071?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4721028314860474071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4721028314860474071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4721028314860474071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4721028314860474071'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/11/soa-pitfalls-integrating-your-legacy.html' title='SOA Pitfalls - Integrating your Legacy Apps'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4277964200556803377</id><published>2007-11-16T10:24:00.000+01:00</published><updated>2007-11-16T10:25:22.023+01:00</updated><title type='text'>What is Software Architecture</title><content type='html'>Like Andrew Tanenbaum, I could argue that there are so many definitions for software architecture that it is difficult to choose from them. You may also define it as follows: Software architecture is taken into consideration only when it hurts.&lt;br /&gt;One possible definition for software architecture could be as follows:Software architecture denotes the set of artifacts and practices required to build a software system so that it achieves its implicit and explicit qualities. It includes the systematic partitioning of the software system into appropriate subsystems and relationships as well as the guiding principles used for that purpose. The partitioning of responsibilities and interactions need to be modelled using an interrelated set of viewpoints to address the functional and non-functional qualities.&lt;br /&gt;Note that I am using "systematic" as an important attribute here as I don't consider ad-hoc systems (for example just hacking a Java program) as software architecture. From this personal definition follows that software architecture is both an entity and an act.&lt;br /&gt;I am wondering what your favourite of software architecture is. Maybe one of the dozens available at the CMU SEI webpages?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-4277964200556803377?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/4277964200556803377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=4277964200556803377' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4277964200556803377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/4277964200556803377'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/11/what-is-software-architecture.html' title='What is Software Architecture'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-791833321776052229</id><published>2007-11-11T13:05:00.001+01:00</published><updated>2007-11-11T13:05:00.779+01:00</updated><title type='text'>Beware of DSLs</title><content type='html'>&lt;p&gt;At ooPSLA 2007 in Montreal there had been a very entertaining (and educating) panel on object-oriented programming languages and Simula 67 as their common ancestor. And the panelists were pretty excellent: Anders Hejlsberg (C#), James Gosling (Java), Guy Steele (Lisp/Scheme/Fortress), Bertrand Meyer (Eiffel), Ole Lerman Madsen (Beta). Now you might ask how this is related to software architecture. &lt;/p&gt;  &lt;p&gt;First of all, programming languages have some influence on the way we think about architecture. Don't believe those experts that want to make you believe architecture design is completely unrelated to paradigms and languages. For example, one of the goals of Simula 67 was to provide a means for modeling systems which often got lost in state-of-the-art languages. &lt;/p&gt;  &lt;p&gt;And secondly, we are currently facing a lot of discussions about DSLs (Domain specific languages). The panelists expressed their&amp;#xA0; concern that now people are starting to develop DSLs who have no experience in language design. It is not trivial to design a language that is complete and consistent as well as usable.&amp;#xA0; Believe me, I worked on such topics during my time at university.&lt;/p&gt;  &lt;p&gt;The conclusions the panelists drew was that they prefer to add more modeling capabilities to programming languages over DSLs. Ruby is one of the examples in this area, but ,of course, it is only the beginning. Upcoming languages such as Scala, offer a lot of cool features for this purpose. &lt;/p&gt;  &lt;p&gt;I discussed that issue with Markus (V&amp;#xF6;lter), one of the gurus in Model-Driven Software Development and he shared this conclusion.&lt;/p&gt;  &lt;p&gt;My conclusion and observation: Bad DSL design can cause more harm than value. Only language experts should become DSL designers. Designing DSLs on top of programming languages might be an appropriate approach. I already discussed Integrated DSLs in a previous posting. &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-791833321776052229?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/791833321776052229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=791833321776052229' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/791833321776052229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/791833321776052229'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/11/beware-of-dsls.html' title='Beware of DSLs'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-6233244818323583151</id><published>2007-11-11T12:43:00.001+01:00</published><updated>2007-11-11T13:18:48.475+01:00</updated><title type='text'>Project Diary</title><content type='html'>&lt;p&gt;Did you ever experience those never ending and and continuous discussions about project topics and decisions which you thought had been already addressed?&amp;#xA0; &lt;/p&gt;  &lt;p&gt;Did you ever read an architecture document feeling a little bit confused or lost, because you couldn't remember the rationale of all those decisions?&lt;/p&gt;  &lt;p&gt;I am sure, you know what I mean. The problem with software development projects is that there are basically two sources of information besides personal communication:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Meeting Minutes &lt;/li&gt;    &lt;li&gt;Architecture Documents &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfortunately, most architecture documents only describe the what, but not the how or why. Meeting Minutes strive for brevity and often don't include all those discussions. In addition, spontaneous meetings of project (sub) teams are often not documented at all. &lt;/p&gt;  &lt;p&gt;Your gut feeling may tell you that something is missing here.&lt;/p&gt;  &lt;p&gt;What I propose for development projects is an additional document, which I call &amp;quot;Project Diary&amp;quot;. This document does not need to be very formal. It should not describe what is already available in other documents (meeting minutes, architecture documents) but instead refer to these sources. And, of course, architecture documents and meeting minutes, should also refer to the project diary. Its sole purpose is to complement these aforementioned documents by adding information such as alternatives discussed for solving a particular problem and the reason why a specific decision was preferred.&lt;/p&gt;  &lt;p&gt;The organization of such project diaries may be by date or by topic or by both. &lt;/p&gt;  &lt;p&gt;I don't recommend any specific template to use. My experience with all kind of project documents tells me that it is more important to come up with a uniform, complete and consistent style than to&amp;#xA0; strictly follow a specific template. Just take your style of choice.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;Sometimes, project members don't like the additional efforts of a project diary, especially in very small teams. In these cases I often have written a project diary without telling anyone. As soon as critical situations or fruitless discussions appeared, I would then just read from my project diary. This way, I could convince many people that a project diary offers more value than costs. &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-6233244818323583151?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/6233244818323583151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=6233244818323583151' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6233244818323583151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/6233244818323583151'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/11/project-diary.html' title='Project Diary'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-5842742590242852727</id><published>2007-11-07T23:35:00.001+01:00</published><updated>2007-11-07T23:35:57.084+01:00</updated><title type='text'>Corny Joke - somehow adapted</title><content type='html'>&lt;p&gt;After their death three IT persons arrived in hell. Among them a senior manager, a consultant and a software architect. One of the devils was in charge of taking care of these unfortunates. However, hell population has the same kind of feelings towards IT experts like the rest of mankind. Thus, the devil offered a deal to the newcomers.&amp;#xA0; &amp;quot;There is a chimpanzee around this corner. Each of you you will need to make the chimpanzee first laugh, then cry, and finally make him return back to his cage. If you succeed, we'll send you back to earth.&amp;quot; First the senior manager approached the chimpanzee. No matter what he said or did, the monkey showed absolutely no reaction. Then the consultant tried his luck. After an hour he also gave up. Finally, it was the turn of the software architect. After a few seconds the chimpanzee started screaming with laughter. After some more seconds he was moved to tears. And as soon as the architect had spoken some additional words, the monkey started panicking, returned immediately to his cage, locked the door and threw away the key. &amp;quot;Ok&amp;quot; the devil said, &amp;quot;I will keep my word, but could you, please, tell me what exactly you said to the chimpanzee?&amp;quot; &amp;quot;Of course!&amp;quot;, the architect responded, &amp;quot;First, I told him what job I have which made him laugh. Then I told him what income I get which made him cry. Finally, I told him that we are still searching for new architects!&amp;quot; &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-5842742590242852727?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/5842742590242852727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=5842742590242852727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5842742590242852727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/5842742590242852727'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/11/corny-joke-somehow-adapted.html' title='Corny Joke - somehow adapted'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-8183415108933435021</id><published>2007-10-28T11:11:00.001+01:00</published><updated>2007-10-28T11:11:40.507+01:00</updated><title type='text'>OOPLSA 2007 (Additional Info)</title><content type='html'>&lt;p&gt;All keynotes are now available as Podcasts. Interested? Click &lt;a href="http://www.oopsla.org/oopsla2007/index.php?page=podcasts/"&gt;here&lt;/a&gt;!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5119025-8183415108933435021?l=stal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stal.blogspot.com/feeds/8183415108933435021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5119025&amp;postID=8183415108933435021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8183415108933435021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5119025/posts/default/8183415108933435021'/><link rel='alternate' type='text/html' href='http://stal.blogspot.com/2007/10/ooplsa-2007-additional-info.html' title='OOPLSA 2007 (Additional Info)'/><author><name>Michael</name><uri>http://www.blogger.com/profile/11984599832785431031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://lh4.google.com/michael.stal/RxJ9IcesJcI/AAAAAAAAACM/yvpXysrfNtw/micha_foto_thumb%5B2%5D.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5119025.post-4181365393000280085</id><published>2007-10-25T16:06:00.001+02:00</published><updated>2007-10-25T17:34:33.332+02:00</updated><title type='text'>OOPSLA 2007 [unplugged]</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.google.com/michael.stal/RyCkAmna6YI/AAAAAAAAACU/AwtTwz4qQXE/oopsla%5B2%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="57" alt="oopsla" src="http://lh6.google.com/michael.stal/RyCkA2na6ZI/AAAAAAAAACc/tF2z6P3cEjw/oopsla_thumb.gif" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I will just provide you with my unedited script on the OOPSLA 2007 which took place 21.10.-25.10.2007 in Montreal, Canada. I decided not to edit or beautify it. Hope, you are not offended by this fact. Yes, I know, this is a huge posting. Of course, the most important part is not included here: personal communication. This always has been one of the most important experiences on a conference like this.&lt;/p&gt; &lt;p&gt;Nonetheless, I hope you find it helpful to get an impression.  &lt;p&gt;Some General Statistics:  &lt;p&gt;Attendees 1225&lt;br&gt;90% male&lt;br&gt;60% newcomers&lt;br&gt;Most are architects, researchers, developers, also some testers&lt;br&gt;78% academy, 22% industry&lt;br&gt;Most 25-34, then in the age of 35-44&lt;br&gt;31% from rest of the world, the others from Canada and US  &lt;p&gt;Conference Chair: Richard P. Gabriel (IBM Distinguished Engineer)  &lt;p&gt;Tutorials I gave:&lt;br&gt;One on High Quality Software Architecture which was very well received. In this tutorial I explained different perspectives relevant to get high quality such as process principles, quality attributes, and architectural principles.  &lt;p&gt;In my 2nd tutorial I addressed Software Architecture Refactoring. This is a new topic I already explained in other postings which is why I don't get into the details here. The tutorial was number one in terms of attendance. I got interviewed by infoQ (video) and will post where and when it will be available.  &lt;p&gt;The 3rd tutorial was actually given by my team member Jörg Bartholdt on WS-* standards.  &lt;p&gt;Tutorials I attended:&lt;br&gt;The one by Martin Odersky on SCALA (Scalable Language) which runs on the Java VM was an eye-opener. This language combines OO and functional programming. A free compiler is available for download. Highly recommendable.  &lt;p&gt;I also went to a tutorial on product line engineering by Charles W. Krueger (BigLever). Very good introduction. Nonetheless, I found it a little bit disappointing as it focused on a concrete product, namely GEARS provided by the speaker's company.  &lt;p&gt;First Keynote, Peter Turchi (Professor Literature/Poetry), Warren Wilson College&lt;br&gt;Some extract: Are we done? Can we write anything new? This is the typical pattern of repetition we experience in daily life.  &lt;p&gt;Getting lost is important for imagination but is hard and requires some preparation. This especially holds for reading.  &lt;p&gt;Exploration is part of the writing activity. Important is to discover things others haven't (examples: Galileo, Herschel, ...). "Seeing is an art which must be learnt". Example: upside down map where Australia is on the top. Different kind of seeing the world. How we see depends (in part) of what we want to see. Example: maps always show the bias of their maker.  &lt;p&gt;"Being disoriented can be fun (and instructive)". "Perhaps being lost, one should get loster". Models/perspectives on reality.  &lt;p&gt;Panel: Celebrating 40 years of language evolution: Simula67 to the Present and beyond&lt;br&gt;Steven Fraser (Cisco), moderator&lt;br&gt;J. Gosling: Played around with Simula, was an eye-opener, had a nice threading facility (in fact co routines), was driven by simulation, big question in next 10 years will be multi cores. Programming will be different. Other kinds of problems, 3D rendering for video games.&lt;br&gt;A. Hejlsberg: influences from functional programming, dynamic, declarative, Meta programming, lot of interesting things happening, e.g., LINQ, we need to think about newer models. For example, how can we deal with concurrent programming? No good solutions currently available&lt;br&gt;Ole Lehrmann Madsen, Aarhus: was a Simula 67 programmer, started BETA,&amp;nbsp; Simula 1 in early 60ies. Originally for Operation Research, then more general purpose. Extension of Algol, also a tool for modeling, sth. we are missing today&lt;br&gt;B. Meyer, ETH, Eiffel Software: One single environment for everything. &lt;br&gt;Guy L. Steele: cites some quotations on languages&lt;br&gt;Q: to Anders, Concurrent and functional programming - programming as a problem statement? Anders: you mostly say the what and the how. Too much "how". Need moving up abstraction level. LINQ also applicable to parallel querying such as in PLINQ. A lot of things to do e.g. in Meta programming. Bertrand: Functional languages may make procedural languages more flexible. Don't think functional programming can become mainstream. We would like to embrace the angel (mathematics) but we can't ignore the beast (hardware). Concurrency is biggest topic, changing little by little. Look at SCOOP. &lt;/p&gt; &lt;p&gt;James: Functional will be important. Only small percentage of community can handle functional programming. Humans want to be procedural. Guy: Likely programming will become very functional but not completely. Functional programming simply ignores state. Important for distribution.&lt;br&gt;Q: Languages changes programmer. Best way to make more creative. In which direction do you want to change?&lt;br&gt;Bertrand: Kristen Nygaard. Programming as modeling. Programming is understanding. Think about your system throughout the lifecycle. Wealth of inheritance, e.g. multiple inheritance. Generics. Idea of semantics: describe abstract logical properties. Ole: modeling is important. Teaching a student a conceptual framework for students, not letting them depend just on the language. It is not about just adding fancy features to languages. Simula was not originating from programming.&lt;br&gt;Q: Kristen started to talk about the future, mentioned OO was good but not sufficient. Started COOL (project on teaching programming) and STAGE (web like multi paradigm language. Make actors and give them a script). How about this idea?&lt;br&gt;A: (Ole): New challenges are beyond Simula concepts. Global pervasive computing cannot be covered this way because you don't know about what's around. Time and location did not matter when Simula emerged. STAGE was intended to extend Simula. Bertrand: Kristen was very proactive.&lt;br&gt;Q: Programming is not very satisfying. It is more about finding the right API? Will this happen to concurrency? &lt;/p&gt; &lt;p&gt;James: Smartness is&amp;nbsp; not sufficient (look at Silicon Valley). Sophisticated software for embedded systems where you have to know it must be. Anders: 40 years of evolution have not made that difference. Still have to write standard statements such as i=i+1. This could and should change. Correct? Such as Avionics? There is no shortage of problems. &lt;br&gt;Q: Why don't eat OO language designers eat their own dog food? Still same old ACSII style programming? &lt;/p&gt; &lt;p&gt;Bertrand: no one cares about characters. Anders: Meta programming is important. Ruby is successful not due to typelessness but due to Meta programming facilities. If Meta language and language are the same, then productivity will increase. But "types are better". Nonetheless, dynamic languages are often precursors.&lt;br&gt;Q: One way of interpreting STAGE is enabling hierarchies of virtual machines. Linguistic machinery. &lt;br&gt;A: Ole: Why did not others discover Simula co routines which Ole thinks is the same considered in hierarchical machines. Bertrand: Co routines mechanisms is like reducing 3D to 2D.&amp;nbsp; Extremely elegant but not a solution for concurrency. Preconditions do not mean the same thing. Correctness can not be as strict anymore. Co routines do not help you there. &lt;/p&gt; &lt;p&gt;James: co routines was only a "hack".&amp;nbsp; But it encouraged a programming style with independent code entities. &lt;/p&gt; &lt;p&gt;Anders: part of the problem with concurrency is the huge mass of different ways for it. Language designers should look what is lacking in languages. Such as using lambda expressions. There is not one single model. &lt;/p&gt; &lt;p&gt;Guy: too strong commitment to stacks. Useful but enemy of concurrency. &lt;br&gt;Q: Historically languages came from computation. Now, the physics must be recognized such as in concurrency? &lt;/p&gt; &lt;p&gt;Bertrand: task of languages is too abstract. Otherwise, we would have to read hardware-manuals to understand FORTRAN.&lt;br&gt;Q: More domain specific kind of languages?&lt;br&gt;A: Ole: Simula started as simulation language. Then added class simulation framework. Then added syntax elements for this framework.&amp;nbsp; Had to develop domain specific language. Anders: DSLs very quickly need elements from normal programming languages (type systems/expressions). They don't raise the abstraction this way. Instead of DSLs raise abstraction by general purpose languages. &lt;/p&gt; &lt;p&gt;James: involved in real-time programming. Lot of languages expressing QoS. Rest is just crap. Then people don't use the DSLs anymore, because rest of infrastructure never gets sufficient. Bertrand: modeling is not modeling the world. Relationship between both is very indirect. Whole idea of OO is to implement DSLs (specialized tools, libraries, syntax not required).&lt;br&gt;Q: Real world is concurrent. What are your favorite metaphors for concurrency and collaboration?&lt;br&gt;Anders: can not give a good answer. Typically not much&amp;nbsp; concurrency visible to the developer, even though underneath a lot of stuff involved.&amp;nbsp; Same for agent systems. The more hiding, the more successful. &lt;/p&gt; &lt;p&gt;Bertrand: correctness not the same on multiple CPUs. Testing feasible but not useful anymore. &lt;br&gt;Q: Multiprocessor is hype today. But what about solid state memory? &lt;/p&gt; &lt;p&gt;Anders: Solid state memory may have more impact in the next time. Hard to reason about how long time cpu cycles takes. No exact answer. James:databases? Just use RAM. Just use transaction lock. &lt;/p&gt; &lt;p&gt;Keynote on Second Life, Jim Purbrick, Mark Lentczner, Linden Lab&lt;br&gt;People can do anything, so they do anything to experiment. Demographics match demographics of real world. Lot of code running, teaching ordinary people to build software. 15% of 2nd life population codes. LSL script. VM - very low number of features. Must fit in 16k. Everything in message passing. 14500 regions each of them running in a separate CPU. Each of them running 1k-2k scripts. Massively concurrent! Scripts can move. Thus they must be able to be persisted.  &lt;p&gt;Keynote by Frederick Brooks (The Mythical Man Month)&lt;br&gt;In history a lot of artists could provide their design alone (art, engineering, craftsmanship). This is not possible any more because of the increased sophistication of every aspect of engineering. We also get a hurry to get to market (early birds win). We need to have specialized expertise. More work: task partitioning, interface definition, shared element standardization, common style definition, integration and testing, on-going interface interpretation &amp;amp; reconciliation. Challenge is conceptual integrity. Many great engineering designs are still today principally the work of one mind, or two (Cray, Menn's bridges, a set of beloved software systems). Fan Clubs: FORTRAN, VM/360, UNIX, Linux Pascal, C, Macintosh, APL.  &lt;p&gt;No Fan-Club: COBOL, OS/360, Windows, Algol, PL/I, PC, Ada. Differences between both: Fan Club means: developed by one mind. No Fan Club: design committees.&lt;br&gt;How to get conceptual integrity? Design as interdisciplinary negotiation? NO! Mill's Chief Programmer concept - a supported designer. A system Architect for design beyond one chief designer. The architect: agent, approver, advocate for the user.&lt;br&gt;A system architect who really cares. One user-interface designer. Documented assumptions: user population characteristics, application, and its future use and development, BETTER TO BE WRONG THAN SILENT OR VAGUE!, forces discussion, enables sensitivity analysis, directs verification efforts.&lt;br&gt;A Style Sheet: consistent styling of details is the hallmark of conceptual integrity.&lt;br&gt;The Cathedral and the Bazaar (Raymond's brilliant essay on Linux). Bazaar as an evolutionary model. No committee design - each piece has conceptual integrity. Emphasizes early and large scale testing. Marshals many minds for fixing, not just testing. The market votes among alternatives by adaptation.&amp;nbsp; based on a gift &amp;lt;-&amp;gt; prestige culture. Among people who are fed anyway. Works when the builders are the clients (know requirements from personal experience). Also applicable for an air traffic control system? Hopefully, not!&lt;br&gt;When does collaboration help? &lt;br&gt;- determining needs from users (more users =&amp;gt; more diverse questions)&lt;br&gt;- conceptual exploration - radical alternatives&lt;br&gt;- not conceptual design nor detailed design (distinguish sharing design from delegating design) But pair programming wins.&lt;br&gt;Design Reviews&lt;br&gt;- especially with different expertise&lt;br&gt;- need and exploit richer graphical representations&lt;br&gt;Some Collaboration Caveats&lt;br&gt;- Real design is more complex (than in textbook examples)&lt;br&gt;- demands change control&lt;br&gt;- Collaboration is no substitute for&lt;br&gt;&amp;nbsp; the dreariness of labor and the loneliness of thought&lt;br&gt;Telecollaboration&lt;br&gt;Why?&lt;br&gt;- specialized skills&lt;br&gt;- geographic dwelling presence (national+cultural, city vs. suburban vs. rural)&lt;br&gt;- work around the clock&lt;br&gt;- cheap labor&lt;br&gt;- political factors&lt;br&gt;Example: Airbus 380. Telecollaboration plus resident ambassadors, a plane between Bristol and Toulouse every day.&lt;br&gt;Making telecollaboration work&lt;br&gt;Face time is crucial, low tech often suffices, shared document important then voice then way behind: videoconference (vital issues, people insecure, interviewing strangers, organizational or national cultures different).&lt;br&gt;Clean Interfaces: make big differences in error rates, in joy of work. Telecollaboration study: Mostly technology driven, not design-driven. A library shelf approach: 19 of 20 book on tools.  &lt;p&gt;Panel "No Silver Bullet" Reloaded - A retrospective on "essence and accidents of software engineering"&lt;br&gt;Steven Fraser (panel), Frederick P. Brooks (University of North Carolina), Martin Fowler (ThoughtWorks), Ricardo Lopez (Qualcomm), Aki Namioka (Cisco), Linda Northrop (SEI), David Lorge Parnas (University of Limerick), Dave Thomas (Bedarra Labs)&lt;br&gt;Introductory Remarks:&lt;br&gt;Brooks: Difficulties in engineering can be separated in essence (structure) and accidents. Forecasted that productivity can only be achieved by conceptual work, not by eliminating the accidents. Bold statement: no technology will appear in ten years that gives a tenfold improvement (measured from 1986). Did not happen.&lt;br&gt;Parnas: There isn't a silver bullet. Silver bullet: no skill needed to use. Interesting question: why did Fred feel the need to write the paper and why do we still ask the question. Two points: designing software is hard, cannot cope with simple&amp;nbsp; approach. Point two: poor work man blames his tools. Developers are poor men. Looking for some magic. Myth we have had such a lot of progress. But that isn't the case. Why don't we use the lead bullets?&lt;br&gt;Linda: read the paper when everyone talked about the software crisis. Used the points in the paper over and over again. Figuring out what to say not how to say is the problem. Some progress has been made. Product line engineering: ten fold increase but that are only exceptions. Modeling is the essential point. People tend to focus on languages instead. We need great designers and cultivate atmosphere of hard work, also in interdisciplinary areas.&lt;br&gt;Aki: Is responsible for Cisco regarding services. Discipline has extended tremendously. Tools help even non-software developers build functionality. Software engineering takes a village to develop a software system. Many issues to cope with. It is a team effort.&lt;br&gt;Dave Thomas: Considers Fred's article as a challenge. Current state of OO technology is a disaster. No hope. Very hard to build stable products on top. Things may be created by smart people but the reality is normal people are challenged. Stuff too complicated. It is not sufficient to give certificates. Need more competence. Object are great but they have gone amok. Same for agility. Successes in niches. &lt;br&gt;Ricardo Lopez: We got a lot of silver bullets but they are killing us. Silver bullets comes from fearing. Trying to avoid what we fear. Fearing complexity is like fearing life. But this is elegant. Search for productivity is another driver (we are always trying to optimize). Silver bullet: we need to address and embrace complexity without fear. You are the silver bullet. Collaboration helps sharing experience which gives an order of magnitude. Silver bullet is inside of us.&lt;br&gt;Martin Fowler: distinction between essential and accidental has had a great influence. [Changes to a werewolf with cries of pain and will be the bad "person" in the panel arguing against the rest of the panelists]. OO is a dangerous and evil idea, but I could overcome it. Great ideas but no one actually does it. I love multicore concurrency systems. Use of prebuilt structures is a great theory. Only helps if libraries are good. Also requires good designers. No one outside OOPSLA does fortunately understand this. Invisibility of software development helps even more, at least to ordinary population. Rapid prototyping. One of the surprises ho many waterfalls I saw. Even lead bullets help, because people are crazy&amp;nbsp; about silver bullets.&lt;/p&gt; &lt;p&gt;Questions by the audience&lt;br&gt;Q: Paper was too successful. Often used by managers to reject new techniques. &lt;br&gt;A: Fred: If technologies are not addressing the sense they are not addressing the right thing. &lt;br&gt;&amp;nbsp;&amp;nbsp; Linda: More address the customers and the business case and product needs but don't sell the technology. Other reason for silver bullets is greed&lt;br&gt;Q: How does this apply to individual productivity?&lt;br&gt;A: Agility is the way to let people grow. Make best people role models for not so good developers. Establish opportunity for others to learn.&lt;br&gt;Dave Parnas: Amount of training time matters. If small learning curve, then it is a silver bullet. Otherwise it is a lead bullet. If it is a silver bullet, sell it to IBM. Otherwise educate.&lt;br&gt;Dave Thomas: If it takes that small time, it is a scam. Find the better people and get them together.&lt;br&gt;Martin [aka werewolf]: There are not too many good people. Even if, people don't try hard enough to collaborate. People want everything easy and comfortable.&lt;br&gt;Q: What are about smaller lightweight teams with single individuals? &lt;br&gt;A: Dave Thomas: comes back to requiring good developers which is rarely possible. Leadership helps.&lt;br&gt;Fred: Growing teams. Book peopleware is extremely good. The Carolina Way: book how to make a good team out of Madonnas.&lt;br&gt;Linda: it takes a leader. Management is not enough. We need to be disciplined.&lt;br&gt;Martin: Peopleware is a dangerous book. Fortunately it is hard work to manage a team. It is more than Microsoft Project. Very easy to derail.&lt;br&gt;Q: How do we measure productivity?&lt;br&gt;A: Martin: you can't measure your productivity? You can't argue excessively about objects versus functions.&lt;br&gt;Ricardo: Metrics are crap. You can't measure the aggregate productivity. You may could derive micro economics from macro economics. &lt;br&gt;David Parnas: Preferred to have non-quantitative measures. E.g., give it a stranger and measure how long it will takes. That’s what we would quantify.&lt;br&gt;Aki: Often people only want to increase to get more. Then she asks what she/he means by productivity.&lt;br&gt;Q: What about non-linear increase of productivity?&lt;br&gt;A: Aki: often complexity is increasing by qualities such as security, transactions, ....&lt;br&gt;&amp;nbsp;&amp;nbsp; Dave Parnas: critisizes web sites. web sites are often done by smart people which then no one is able to extend&lt;br&gt;&amp;nbsp;&amp;nbsp; Linda: We need to have more design upfront.&lt;br&gt;&amp;nbsp;&amp;nbsp; Dave Thomas: Communication is often the issue. Get rid of all the middleware and business objects crap.&lt;br&gt;Q: Mostly people address in environments on accidents and incidents. When will we have an environment that handles essence?&lt;br&gt;&amp;nbsp;&amp;nbsp; Aki: Tools have improved.&lt;br&gt;&amp;nbsp;&amp;nbsp; Dave Parnas: When going to building. First build the foundation then address the rest.&lt;br&gt;&amp;nbsp;&amp;nbsp; Martin: Communication between users and developers. Communication here is hard. Business people don't want to talk to developers. Developers have no social skills. Software people get frustrated so that they loose interest in business case. Then they start building large infrastructures to overcome boredom.&lt;br&gt;Q: By Brian Foote. World runs on bad code. Software is a success story. Shouldn't we teach people how to write more bad code?&lt;br&gt;A: Ricardo: Wonderful success (civilization is embracing software success) makes us more vulnerable. Code should contain some self-correction. No technology can be perfect. Focus on guaranteeing code won't cause big problems.&lt;br&gt;David Parnas: Excellent developers writing code no one else can cause a problem.&lt;br&gt;Dave Thomas: Mismatch between smart minds also might be a problem.&lt;br&gt;Q: We have unrealistic objectives. Silver bullet could be training bringing IT people to business people?&lt;br&gt;A: David Parnas: might be good. But the same would be to have every driver being a mechanics. But we need people who make things for other people.&lt;br&gt;Q: Articles by Brooks and Parnas were silver bullets. Only we need no silver bullets now, then thus this mean non one can come up with one?&lt;br&gt;A: Dave Parnas: I did not provide a silver bullet. Nobody is against good ideas.&lt;br&gt;Q: It took a thousand years to go from geometry to calculus. How do we finish objects? How do we provide good libraries?&lt;br&gt;A: David Parnas. Calculus is a wonderful thing. It is a lead bullet but no silver bullet.&lt;br&gt;&amp;nbsp;&amp;nbsp; Fred: better when system satisfies somebody than anybody.&lt;br&gt;&amp;nbsp;&amp;nbsp; Ricardo: does not consider metaphor valid (romans just ignored Archimedes).&lt;br&gt;&amp;nbsp;&amp;nbsp; Dave Thomas: best way to get components is to stop people developing frameworks. Most frameworks can only be used by experts. Better provide functionality as component. Is not optimistic that this is approaching.&lt;br&gt;Final statements&lt;br&gt;Martin: software development has made progress. But werewolf is not harmed. People underestimate. Human beings have this optimism.&lt;br&gt;Ricardo: We're in trouble. Werewolf is annihilated, but then new werewolves arrive.&amp;nbsp; Synergies with your peers are important.&lt;br&gt;Dave Thomas: New generation can face the challenge. &lt;br&gt;Aki: Search for creating silver bullets, we have made it easier to develop. But highly sophisticated developers are required. Complex systems are still there but we will have to appreciate there also system that does not need that skills.&lt;br&gt;Linda: We are continue to try getting better. Focus in essence not on accidents.&lt;br&gt;David Parnas: It is unfair to criticize waterfall model. Because some notions have just been misinterpreted. We are making progress by building simpler systems, not by more complex systems. My dog does not fear werewolves because he does not try to get simple answers.&lt;br&gt;Fred: No field of engineering where people look more thoroughly on other's work. Very dangerous thing. &lt;/p&gt; &lt;p&gt;Keynote: ELEPHANT 2000 for the year 2005: A Programming Language Based on Speech Acts, John McCarthy (AI, Lisp, ...)&lt;br&gt;Natural language offers semantic features that are absent in present programming languages. Example: Passenger has made a reservation. Nothing said about databases here. Name cause of slogan: an elephant never forgets. Reservation is made to a virtual object. Referring to the future ("baggage handlers ready one hour before flight arrives"). References to the past by suitable data structures. Compiler has to invent them. References to future are more difficult (not always possible). E.g.: Prediction to actual arrival difficult. AI maybe required.&lt;br&gt;Speech Acts: initiated by "ordinary language philosophers" who didn't like logic. They study sentences without truth values. "I now pronounce you man and wife". Not imply an assertion.&amp;nbsp; "I sentence you to be hanged by neck until dead".&amp;nbsp; Speech acts include offers, acceptances, statements, questions, command, ... One can also state, describe, assert, warn,... Personal intent to be considered (why does someone do/say sth.). &lt;br&gt;Programs that buy and sell good and services make commitments and receive them.&lt;br&gt;They undertake financial obligations on behalf of their owners.&lt;br&gt;Correct performance includes fulfilling obligations and insisting these to be fulfilled. They are operating in society.&lt;br&gt;At some execution point a program may execute a statement asserting the intention that variable x will remain less than y.&lt;br&gt;Is the execution correct so far? Will this process terminate? Internal speech acts give a form of intrinsic correctness. For example, correct programs carry out their intentions.&lt;br&gt;Two kinds of external specification: Input-output specifications depend on program and language. Verification can be done using these.&lt;br&gt;The accomplishment specifications. Depends on facts about the world. "Customers will be satisfied with a service".&lt;br&gt;Elephant programs have both.&lt;br&gt;Arguments against verification because people have confused these two kinds.&lt;br&gt;Speech acts philosophers&amp;nbsp; distinguish illocutionary and perlocutionary speech acts. "He told her" vs. "he convinced her". To some extent, this corresponds to input-output and accomplishment specs.&lt;br&gt;Look at paper!&lt;br&gt;&lt;a href="http://www-formal.stanford.edu/jmc/elephant.html"&gt;http://www-formal.stanford.edu/jmc/elephant.html&lt;/a&gt;  &lt;p&gt;Then he explained the history of Lisp. How they came up with AI (Minsky and him, how the Lambda calculus was partially used, how garbage collection was invented)  &lt;p&gt;Keynote: David Parnas - Precise Software Documentation - Making OO work&lt;br&gt;What is OO - A Buzzword for Our Times. My meaning: "design software by data holding objects making the job easier", no special language necessary, languages supposed to make it easier, ...&lt;br&gt;separation of concerns&lt;br&gt;information hiding modules (invented by Parnas)&lt;br&gt;- stresses work assignments, flexibility, substitutability&lt;br&gt;abstract data types&lt;br&gt;...&lt;br&gt;No conflict! &lt;br&gt;It is a recipe for disaster  &lt;p&gt;Same examples used over and over again&lt;br&gt;Reacted to the "hiding" alone&lt;br&gt;you have to tell them something - accurately, precisely&lt;br&gt;read the 2nd edition of The Mythical Man Month&lt;br&gt;There was an earlier article on the interface documentation&lt;br&gt;For 30 years, I have known that documentation was the other side of the coinlevels of abstraction (relation never clearly defined, stress on subset ability - many different ideas)  &lt;p&gt;35 years later&lt;br&gt;never doubted the truth of the information hiding theorem information hiding is no empirical result. It is a theoretical result. Think of subsystems A and B with fixed interface.  &lt;p&gt;Requires empirical verification.&lt;br&gt;- that people can know what to hide&lt;br&gt;- that the interface can be efficient&lt;br&gt;- that we can describe interface without giving away secrets  &lt;p&gt;Old Problem: Documentation&lt;br&gt;Apeldoorn, 1969. Philips. Were unable to write specs for software components that were complete and precise. Parnas found it very difficult. Components had to know a lot information about each other such as data structures. &lt;br&gt;Still a problem. Think of Microsoft. Inability to provide good professional reference documentation is costing us millions maintaining complex products.&lt;br&gt;Role of documents in engineering&lt;br&gt;record key design decisions.&lt;br&gt;binding on everyone and fully controlled.&lt;br&gt;precise documents that use mathematics.&lt;br&gt;are not introductions or tutorials.&lt;br&gt;are not extracted documents (javadoc)&lt;br&gt;show "separation of concerns"  &lt;p&gt;40 years software crisis&lt;br&gt;obviously not a crisis&lt;br&gt;underlying causes  &lt;p&gt;- lack of discipline, careful choice of interfaces and structural decisions&lt;br&gt;- lack of review  &lt;p&gt;Decisions that are not fully documented are not taken.  &lt;p&gt;What is documentation?&lt;br&gt;Practical tool (not just theoretical achievement)&lt;br&gt;repository of info&lt;br&gt;convenient reference (organized like a dictionary not like an introduction manual)&lt;br&gt;easier to use for information than code&lt;br&gt;structured to avoid inconsistency&lt;br&gt;quicker and more authorative than trial executions&lt;br&gt;useful before, during and after the coding  &lt;p&gt;Computer Science&amp;nbsp; and Documentation&lt;br&gt;Managers and engineers bemoaned inability to document&lt;br&gt;not just fragments of software&lt;br&gt;programming in another language&lt;br&gt;regar
