<?xml version="1.0" encoding="UTF-8"?>
<org.eclipse.epf.uma:ContentDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:org.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.6/uma.ecore" xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.1" xmi:id="-HTMJFV29MTZkKWqnIo01Gg" name="core_principle_focus,_9gocwMvoEdqukPpotm3DYg" guid="-HTMJFV29MTZkKWqnIo01Gg" authors="Steve Adolph" changeDate="2007-07-03T22:27:16.890+0330" changeDescription="Added first draft of content." version="0.02">
  <mainDescription>&lt;h1>&#xD;
    Introduction&#xD;
&lt;/h1>&#xD;
&lt;p>&#xD;
    The architecture of a software system is the organization or structure of the system's significant components&#xD;
    interacting through interfaces, with components composed of successively smaller components and interfaces.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Without an architectural foundation, a system will evolve in an inefficient and haphazard way. Such a system often&#xD;
    proves difficult to extend, reuse, or integrate without substantial rework. It is also difficult to organize the team,&#xD;
    or to communicate ideas without the &lt;b>common technical focus&lt;/b> that the architecture provides.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Focus on the architecture early to minimize risks and organize development.&#xD;
&lt;/p>&#xD;
&lt;h1>&#xD;
    Practices&#xD;
&lt;/h1>&#xD;
&lt;h2>&#xD;
    Create the architecture for what you know today&#xD;
&lt;/h2>&#xD;
&lt;p>&#xD;
    As Albert Einstein said, make everything as simple as possible, but no simpler. Software projects are&#xD;
    resource-constrained, and the desire of developers to create elegant solutions may lead to a system of greater&#xD;
    complexity than the stakeholder requires. Efforts to future-proof a system in a turbulent or uncertain environment will&#xD;
    likely lead to code bloat, which increases overall costs and complexity with few real benefits.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Create architectures that address the stakeholder’s real needs, and provide appropriate flexibility and speed for the&#xD;
    requirements as they are known today. Avoid the desire, no matter how well-intentioned, to speculate on future&#xD;
    requirements and thereby over-engineer the architecture. There is a distinction between over-architecting and building&#xD;
    an architecture that is flexible and extensible. For example, there may not be an apparent reason&#xD;
    for creating three architectural layers in a system, but it is probable that the system will grow in ways one&#xD;
    can't predict, so we should architect for that. &#xD;
&lt;/p>&#xD;
&lt;h2>&#xD;
    Leverage the architecture as a collaborative tool&#xD;
&lt;/h2>&#xD;
&lt;p>&#xD;
    Lack of a common understanding by developers about a system leads to indecision and contrary opinions among developers,&#xD;
    and can quickly paralyze the project. Developers may have different mental models of the system and work at cross&#xD;
    purposes to each other.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Create and evolve the system architecture with the intention of using it to align the developers' competing mental&#xD;
    models of the system. A good architecture facilitates collaboration by providing a common vocabulary for all&#xD;
    discussions regarding the system under development.&#xD;
&lt;/p>&#xD;
&lt;h2>&#xD;
    Cope with complexity by raising the level of abstraction&#xD;
&lt;/h2>&#xD;
&lt;p>&#xD;
    Software is complex, and people have a limited capacity for coping with complexity. As a system gets larger, it is&#xD;
    difficult for the team to develop a common understanding of the system, because it's hard to see the bigger&#xD;
    picture.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Use models to raise the level of abstraction to focus on important high-level decisions, such as relationships and&#xD;
    patterns, rather than getting bogged down in details. Modeling raises the level of abstraction, and allows the system to&#xD;
    be more easily understood from different perspectives.&#xD;
&lt;/p>&#xD;
&lt;h2>&#xD;
    Organize the architecture into loosely coupled, highly cohesive components&#xD;
&lt;/h2>&#xD;
&lt;p>&#xD;
    Tight coupling between components makes a system fragile and difficult to understand. Software is expensive to create,&#xD;
    so if existing components can be reused, that may reduce effort required to create a system.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Organize the architecture of the system into components to maximize cohesion and minimize coupling. This improves&#xD;
    comprehension, and increases flexibility and opportunities for re-use.&#xD;
&lt;/p>&#xD;
&lt;h2>&#xD;
    Reuse existing assets&#xD;
&lt;/h2>&#xD;
&lt;p>&#xD;
    It is wasteful to build what you can simply reuse, download, or even buy.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Make every effort to reuse existing assets. Developers are often reluctant to reuse assets, because those assets do not&#xD;
    exactly meet their needs, or those assets are of poor quality. Be prepared to balance the savings you can realize using&#xD;
    an existing asset, even if the asset requires you to make some accommodation in the architecture or relax a constraint.&#xD;
&lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>
