<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>J.D. Meier's Blog : Patterns</title><link>http://blogs.msdn.com/jmeier/archive/tags/Patterns/default.aspx</link><description>Tags: Patterns</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Cheat Sheet: patterns &amp; practices Pattern Catalog Posted to CodePlex</title><link>http://blogs.msdn.com/jmeier/archive/2008/10/21/cheat-sheet-patterns-practices-pattern-catalog-posted-to-codeplex.aspx</link><pubDate>Tue, 21 Oct 2008 17:26:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9009678</guid><dc:creator>J.D. Meier</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jmeier/comments/9009678.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jmeier/commentrss.aspx?PostID=9009678</wfw:commentRss><description>&lt;p&gt;As part of our &lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/02/patterns-practices-app-arch-guide-2-0-project.aspx"&gt;patterns &amp;amp; practices Application Architecture Guide 2.0 project&lt;/a&gt;, we've been hunting and gathering our patterns from across our patterns &amp;amp; practices catalog.&amp;#160; Here's an initial draft of our patterns &amp;amp; practices Patterns Catalog at a Glance:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Cheat%20Sheet:%20patterns%20%26%20practices%20Pattern%20Catalog&amp;amp;referringTitle=Cheat%20Sheets" target="_blank"&gt;Cheat Sheet: patterns &amp;amp; practices Patterns Catalog&lt;/a&gt; (CodePlex)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Pattern Catalog&lt;/strong&gt;    &lt;br /&gt;To collect the patterns, we first identified the key projects that focused on patterns:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707841.aspx" target="_blank"&gt;Composite Application Guidance for WPF&lt;/a&gt; (MSDN)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998446.aspx" target="_blank"&gt;Data Patterns&lt;/a&gt; (MSDN)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998469.aspx" target="_blank"&gt;Enterprise Solution Patterns Using Microsoft .NET&lt;/a&gt; (MSDN)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms978729.aspx" target="_blank"&gt;Integration Patterns&lt;/a&gt; (MSDN)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480545.aspx" target="_blank"&gt;Web Service Security Guidance: Scenarios, Patterns, and Implementation Guidance for Web Services Enhancements (WSE) 3.0&lt;/a&gt; (MSDN)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Next, we organized the patterns and summarized in tables.&amp;#160; You can browse the tables below to see which patterns are associated with which project.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Composite Application Guidance for WPF&lt;/strong&gt; &lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Category&lt;/th&gt;        &lt;th&gt;Patterns&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Composite User Interface Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Adapter; Command; Composite and Composite View;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Modularity&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Event Aggregator; Facade; Separated Interface and Plug In; Service Locator&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Testability&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Inversion of Control; Dependency Injection; Separated Presentation; Supervising Controller; Presentation Model&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Data Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Category&lt;/th&gt;        &lt;th&gt;Patterns&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Data Movement Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Data Replication; Master-Master Replication; Master-Slave Replication; Master-Master Row-Level Synchronization; Master-Slave Snapshot Replication; Capture Transaction Details; Master-Slave Transactional Incremental Replication; Master-Slave Cascading Replication &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Pattlets&lt;/td&gt;        &lt;td&gt;Maintain Data Copies; Application-Managed Data Copies; Extract-Transform-Load (ETL); Topologies for Data Copies&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;strong&gt;Enterprise Solution Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Category&lt;/th&gt;        &lt;th&gt;Patterns&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Deployment Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Deployment Plan ; Layered Application; Three-Layered Services Application; Tiered Distribution; Three-Tiered Distribution &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Distributed Systems&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Broker; Data Transfer Object; Singleton &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Performance and Reliability&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Server Clustering; Load-Balanced Cluster; Failover Cluster &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Services Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Service Interface; Service Gateway &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Web Presentation Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Model-View-Controller; Page Controller; Front Controller; Intercepting Filter; Page Cache; Observer &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Pattlets&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Abstract Factory; Adapter; Application Controller; Application Server; Assembler; Bound Data Control; Bridge; Command(s); Decorator; Fa&amp;#231;ade; Four-Tiered Distribution; Gateway; Layer Supertype; Layers; Mapper; Mediator; MonoState; Observer; Naming Service; Page Data Caching; Page Fragment Caching; Presentation-Abstraction-Controller; Remote Fa&amp;#231;ade; Server Farm; Special Case; Strategy; Table Data Gateway; Table Module; Template Method &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Integration Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Category&lt;/th&gt;        &lt;th&gt;Patterns&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Integration Layer&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Entity Aggregation; Process Integration; Portal Integration. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;System Connections&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Data Integration; Function Integration; Service-Oriented Integration; Presentation Integration &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Additional Integration Patterns&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Pipes and Filters; Gateway &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Web Services Security Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Category&lt;/th&gt;        &lt;th&gt;Patterns&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Authentication&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Brokered Authentication; Brokered Authentication: Kerberos; Brokered Authentication: X509 PKI; Brokered Authentication: STS; Direct Authentication &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Authorization&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Protocol Transition with Constrained Delegation; Trusted Subsystem &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Exception Management&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Exception Shielding &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Message Encryption&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Data Confidentiality &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Message Replay Detection&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Message Replay Detection &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Message Signing&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Data Origin Authentication &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Message Validation&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Message Validator &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Deployment&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;Perimeter Service Router &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;br /&gt;  &lt;p&gt;&lt;strong&gt;Pattern Summaries&lt;/strong&gt;     &lt;br /&gt;The following pattern summaries are brief descriptions of each pattern, along with a link to the relevant MSDN pages.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Composite Application Guidance for WPF&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Modularity&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707905.aspx" target="_blank"&gt;Service Locator&lt;/a&gt;. Create a service locator that contains references to the services and that encapsulates the logic to locate them. In your classes, use the service locator to obtain service instances. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Testability&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707845.aspx" target="_blank"&gt;Dependency Injection&lt;/a&gt;. Do not instantiate the dependencies explicitly in your class. Instead, declaratively express dependencies in your class definition. Use a Builder object to obtain valid instances of your object's dependencies and pass them to your object during the object's creation and/or initialization. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707904.aspx" target="_blank"&gt;Inversion of Control&lt;/a&gt;. Delegate the function of selecting a concrete implementation type for the classes' dependencies to an external component or source. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707885.aspx" target="_blank"&gt;Presentation Model&lt;/a&gt;. Separate the responsibilities for the visual display and the user interface state and behavior into different classes named, respectively, the view and the presentation model. The view class manages the controls on the user interface and the presentation model class acts as a fa&amp;#231;ade on the model with UI-specific state and behavior, by encapsulating the access to the model and providing a public interface that is easy to consume from the view (for example, using data binding). &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707862.aspx" target="_blank"&gt;Separated Presentation&lt;/a&gt;. Separate the presentation logic from the business logic into different artifacts. The Separated Presentation pattern can be implemented in multiple ways such as Supervising Controller or Presentation Model, etc. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707873.aspx" target="_blank"&gt;Supervising Controller&lt;/a&gt;. Separate the responsibilities for the visual display and the event handling behavior into different classes named, respectively, the view and the presenter. The view class manages the controls on the user interface and forwards user events to a presenter class. The presenter contains the logic to respond to the events, update the model (business logic and data of the application) and, in turn, manipulate the state of the view. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Data Movement Patterns&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978671.aspx" target="_blank"&gt;Data Replication&lt;/a&gt;.&amp;#160; Build on the data movement building block as described in Move Copy of Data by adding refinements that are appropriate to replication. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978735.aspx" target="_blank"&gt;Master-Master Replication&lt;/a&gt;. Copy data from the source to the target and detect and resolve any update conflicts that have occurred since the last replication (due to changes to the same data on the source and target). The solution consists of a two replication links between the source and the target in opposite directions. Both replication links transmit the same replication set in both directions). Such a pair of replication links is referred to as related links in the more detailed patterns. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978740.aspx" target="_blank"&gt;Master-Slave Replication&lt;/a&gt;. Copy data from the source to the target without regard to updates that may have occurred to the replication set at the target since the last replication. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998434.aspx" target="_blank"&gt;Master-Master Row-Level Synchronization&lt;/a&gt;. Create a pair of related replication links between the source and target. Additionally, create a synchronization controller to manage the synchronization and connect the links. This solution describes the function of one of these replication links. The other replication link behaves the same way, but in the opposite direction. To synchronize more than two copies of the replication set, create the appropriate replication link pair for each additional copy. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998430.aspx" target="_blank"&gt;Master-Slave Snapshot Replication&lt;/a&gt;. Make a copy of the source replication set at a specific time (this is known as a snapshot), replicate it to the target, and overwrite the target data. In this way, any changes that may have occurred to the target replication set are replaced by the new source replication set. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978709.aspx" target="_blank"&gt;Capture Transaction Details&lt;/a&gt;. Create additional database objects, such as triggers and (shadow) tables, and to record changes of all tables belonging to the replication set. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998441.aspx" target="_blank"&gt;Master-Slave Transactional Incremental Replication&lt;/a&gt;. Acquire the information about committed transactions from the source and to replay the transactions in the correct sequence when they are written to the target. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978712.aspx" target="_blank"&gt;Master-Slave Cascading Replication&lt;/a&gt;. Increase the number of replication links between the source and target by adding one or more intermediary targets between the original source and the end target databases. These intermediaries are data stores that take a replication set from the source, and thus act as a target in a first replication link. Then they act as sources to move the data to the next replication link and so on until they reach the cascade end targets (CETs). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Enterprise Solution Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Deployment Patterns&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978676.aspx" target="_blank"&gt;Deployment Plan&lt;/a&gt;. Create a deployment plan that describes which tier each of the application's components will be deployed to. While assigning components to tiers, if it&amp;#8217;s found that a tier is not a good match for a component, determine the cost and benefits of modifying the component to better work with the infrastructure, or modifying the infrastructure to better suit the component. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978678.aspx" target="_blank"&gt;Layered Application&lt;/a&gt;. Separate the components of your solution into layers. The components in each layer should be cohesive and at roughly the same level of abstraction. Each layer should be loosely coupled to the layers underneath. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978689.aspx" target="_blank"&gt;Three-Layered Services Application&lt;/a&gt;. Base your layered architecture on three layers: presentation, business, and data. This pattern presents an overview of the responsibilities of each layer and the components that compose each layer. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978701.aspx" target="_blank"&gt;Tiered Distribution&lt;/a&gt;. Structure your servers and client computers into a set of physical tiers and distribute your application components appropriately to specific tiers. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978694.aspx" target="_blank"&gt;Three-Tiered Distribution&lt;/a&gt;. Structure your application around three physical tiers: client, application, and database. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Distributed Systems&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978706.aspx" target="_blank"&gt;Broker&lt;/a&gt;. Use the Broker pattern to hide the implementation details of remote service invocation by encapsulating them into a layer other than the business component itself. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978717.aspx" target="_blank"&gt;Data Transfer Object&lt;/a&gt;. Create a data transfer object (DTO) that holds all data that is required for the remote call. Modify the remote method signature to accept the DTO as the single parameter and to return a single DTO parameter to the client. After the calling application receives the DTO and stores it as a local object, the application can make a series of individual procedure calls to the DTO without incurring the overhead of remote calls. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998426.aspx" target="_blank"&gt;Singleton&lt;/a&gt;. Singleton provides a global, single instance by making the class create a single instance of itself, allowing other objects to access this instance through a globally accessible class method that returns a reference to the instance. Additionally declaring the class constructor as private so that no other object can create a new instance. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Performance and Reliability&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998414.aspx" target="_blank"&gt;Server Clustering&lt;/a&gt;. Design your application infrastructure so that your servers appear to users and applications as virtual unified computing resources. One means by which to achieve this virtualization is by using a server cluster. A server cluster is the combination of two or more servers that are interconnected to appear as one, thus creating a virtual resource that enhances availability, scalability, or both. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978730.aspx" target="_blank"&gt;Load-Balanced Cluster&lt;/a&gt;. Install your service or application onto multiple servers that are configured to share the workload. This type of configuration is a load-balanced cluster. Load balancing scales the performance of server-based programs, such as a Web server, by distributing client requests across multiple servers. Load balancing technologies, commonly referred to as load balancers, receive incoming requests and redirect them to a specific host if necessary. The load-balanced hosts concurrently respond to different client requests, even multiple requests from the same client. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978720.aspx" target="_blank"&gt;Failover Cluster&lt;/a&gt;. Install your application or service on multiple servers that are configured to take over for one another when a failure occurs. The process of one server taking over for a failed server is commonly known as failover. A failover cluster is a set of servers that are configured so that if one server becomes unavailable, another server automatically takes over for the failed server and continues processing. Each server in the cluster has at least one other server in the cluster identified as its standby server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Services Patterns&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998421.aspx" target="_blank"&gt;Service Interface&lt;/a&gt;. Design your application as a collection of software services, each with a service interface through which consumers of the application may interact with the service. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998420.aspx" target="_blank"&gt;Service Gateway&lt;/a&gt;. Encapsulate the code that implements the consumer portion of the contract into its own Service Gateway component. Service gateways play a similar role when accessing services as data access components do for access to the application's database. They act as proxies to other services, encapsulating the details of connecting to the source and performing any necessary translation. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Web Presentation Patterns&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978748.aspx" target="_blank"&gt;Model-View-Controller&lt;/a&gt;. The Model-View-Controller (MVC) pattern separates the modeling of the domain, the presentation, and the actions based on user input into three separate classes. The model manages the behavior and data of the application domain, responds to requests for information about its state (usually from the view), and responds to instructions to change state (usually from the controller). The view manages the display of information. The controller interprets the mouse and keyboard inputs from the user, informing the model and/or the view to change as appropriate. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978764.aspx" target="_blank"&gt;Page Controller&lt;/a&gt;. Use the Page Controller pattern to accept input from the page request, invoke the requested actions on the model, and determine the correct view to use for the resulting page. Separate the dispatching logic from any view-related code. Where appropriate, create a common base class for all page controllers to avoid code duplication and increase consistency and testability. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978723.aspx" target="_blank"&gt;Front Controller&lt;/a&gt;. Front Controller solves the decentralization problem present in Page Controller by channeling all requests through a single controller. The controller itself is usually implemented in two parts: a handler and a hierarchy of commands. The handler receives the HTTP Post or Get request from the Web server and retrieves relevant parameters from the request. The handler uses the parameters from the request first to choose the correct command and then to transfers control to the command for processing. The commands themselves are also part of the controller. The commands represent the specific actions as described in the Command pattern. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978727.aspx" target="_blank"&gt;Intercepting Filter&lt;/a&gt;. Create a chain of composable filters to implement common pre-processing and post-processing tasks during a Web page request. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978759.aspx" target="_blank"&gt;Page Cache&lt;/a&gt;. Use a page cache for dynamic Web pages that are accessed frequently, but change less often. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978753.aspx" target="_blank"&gt;Observer&lt;/a&gt;. Use the Observer pattern to maintain a list of interested dependents (observers) in a separate object (the subject). Have all individual observers implement a common Observer interface to eliminate direct dependencies between the subject and the dependent objects. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Integration Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Integration Layer&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978573.aspx" target="_blank"&gt;Entity Aggregation&lt;/a&gt;. Introduce an Entity Aggregation layer that provides a logical representation of the entities at an enterprise level with physical connections that support the access and that update to their respective instances in back-end repositories. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978592.aspx" target="_blank"&gt;Process Integration&lt;/a&gt;. Define a business process model that describes the individual steps that make up the complex business function. Create a separate process manager component that can interpret multiple concurrent instances of this model and that can interact with the existing applications to perform the individual steps of the process. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978585.aspx" target="_blank"&gt;Portal Integration&lt;/a&gt;. Create a portal application that displays the information retrieved from multiple applications in a unified user interface. The user can then perform the required tasks based on the information displayed in this portal. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Integration Topologies&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978579.aspx" target="_blank"&gt;Message Broker&lt;/a&gt;. Extend the integration solution by using Message Broker. A message broker is a physical component that handles the communication between applications. Instead of communicating with each other, applications communicate only with the message broker. An application sends a message to the message broker, providing the logical name of the receivers. The message broker looks up applications registered under the logical name and then passes the message to them. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978583.aspx" target="_blank"&gt;Message Bus&lt;/a&gt;. Connect all applications through a logical component known as a message bus. A message bus specializes in transporting messages between applications. A message bus contains three key elements, set of agreed-upon message schemas, set of common command messages, and shared infrastructure for sending bus messages to recipients. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978603.aspx" target="_blank"&gt;Publish / Subscribe&lt;/a&gt;. Extend the communication infrastructure by creating topics or by dynamically inspecting message content. Enable listening applications to subscribe to specific messages. Create a mechanism that sends messages to all interested subscribers. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;System Connections&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978572.aspx" target="_blank"&gt;Data Integration&lt;/a&gt;. Integrate applications at the logical data layer by allowing the data in one application (the source) to be accessed by other applications (the target). &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978578.aspx" target="_blank"&gt;Function Integration&lt;/a&gt;. Integrate applications at the business logic layer by allowing the business function in one application (the source) to be accessed by other applications (the target). &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978594.aspx" target="_blank"&gt;Service-Oriented Integration&lt;/a&gt;. To integrate applications at the business logic layer, enable systems to consume and provide XML-based Web services. Use Web Services Description Language (WSDL) contracts to describe the interfaces to these systems. Ensure interoperability by making your implementation compliant with the Web Services family of specifications. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978588.aspx" target="_blank"&gt;Presentation Integration&lt;/a&gt;. Access the application's functionality through the user interface by simulating a user's input and by reading data from the screen display. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Web Service Services Security Patterns&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Authentication&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480560.aspx" target="_blank"&gt;Brokered Authentication&lt;/a&gt;. The Web service validates the credentials presented by the client, without the need for a direct relationship between the two parties. An authentication broker that both parties trust independently issues a security token to the client. The client can then present credentials, including the security token, to the Web service. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480562.aspx" target="_blank"&gt;Brokered Authentication: Kerberos&lt;/a&gt;. Use the Kerberos protocol to broker authentication between clients and Web services. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480565.aspx" target="_blank"&gt;Brokered Authentication: X509 PKI&lt;/a&gt;.&amp;#160; Use brokered authentication with X.509 certificates issued by a certificate authority (CA) in a public key infrastructure (PKI) to verify the credentials presented by the requesting application. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480563.aspx" target="_blank"&gt;Brokered Authentication: STS&lt;/a&gt;.&amp;#160; Use brokered authentication with a security token issued by a Security Token Service (STS). The STS is trusted by both the client and the Web service to provide interoperable security tokens. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480566.aspx" target="_blank"&gt;Direct Authentication&lt;/a&gt;. The Web service acts as an authentication service to validate credentials from the client. The credentials, which include proof-of-possession that is based on shared secrets, are verified against an identity store. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Authorization&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480585.aspx" target="_blank"&gt;Protocol Transition with Constrained Delegation&lt;/a&gt;.&amp;#160; Use the Kerberos protocol extensions in Windows Server. The extensions require the user ID but not the password. You still need to establish trust between the client application and the Web service; however, the application is not required to store or send passwords. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480587.aspx" target="_blank"&gt;Trusted Subsystem&lt;/a&gt;.&amp;#160; The Web service acts as a trusted subsystem to access additional resources. It uses its own credentials instead of the user's credentials to access the resource. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Exception Management&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480591.aspx" target="_blank"&gt;Exception Shielding&lt;/a&gt;.&amp;#160; Sanitize unsafe exceptions by replacing them with exceptions that are safe by design. Return only those exceptions to the client that have been sanitized or exceptions that are safe by design. Exceptions that are safe by design do not contain sensitive information in the exception message, and they do not contain a detailed stack trace, either of which might reveal sensitive information about the Web service's inner workings. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Message Encryption&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480570.aspx" target="_blank"&gt;Data Confidentiality&lt;/a&gt;.&amp;#160; Use encryption to protect sensitive data that is contained in a message. Unencrypted data, which is known as plaintext, is converted to encrypted data, which is known as cipher-text. Data is encrypted with an algorithm and a cryptographic key. Cipher-text is then converted back to plaintext at its destination. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Message Replay Detection&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480598.aspx" target="_blank"&gt;Message Replay Detection&lt;/a&gt;.&amp;#160; Cache an identifier for incoming messages, and use message replay detection to identify and reject messages that match an entry in the replay detection cache. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Message Signing&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480571.aspx" target="_blank"&gt;Data Origin Authentication&lt;/a&gt;.&amp;#160; Use data origin authentication, which enables the recipient to verify that messages have not been tampered with in transit (data integrity) and that they originate from the expected sender (authenticity). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Message Validation&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480600.aspx" target="_blank"&gt;Message Validator&lt;/a&gt;.&amp;#160; The message validation logic enforces a well-defined policy that specifies which parts of a request message are required for the service to successfully process it. It validates the XML message payloads against an XML schema (XSD) to ensure that they are well-formed and consistent with what the service expects to process. The validation logic also measures the messages against certain criteria by examining the message size, the message content, and the character sets that are used. Any message that does not meet the criteria is rejected. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Deployment&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480606.aspx" target="_blank"&gt;Perimeter Service Router&lt;/a&gt;.&amp;#160; Design a Web service intermediary that acts as a perimeter service router. The perimeter service router provides an external interface on the perimeter network for internal Web services. It accepts messages from external applications and routes them to the appropriate Web service on the private network. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;My Related Posts&lt;/strong&gt;&lt;/p&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/02/patterns-practices-app-arch-guide-2-0-project.aspx"&gt;patterns &amp;amp; practices App Arch Guide 2.0 Project&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/26/app-arch-guide-2-0-overview-slides.aspx"&gt;App Arch Guide 2.0 Overview Slides&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/24/abstract-for-application-architecture-guide-2-0.aspx"&gt;Abstract for Application Architecture Guide 2.0&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/03/app-arch-meta-frame.aspx"&gt;App Arch Meta-Frame&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/18/app-types.aspx"&gt;App Types&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/22/architecture-frame.aspx"&gt;Architecture Frame&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/11/guidelines-are-live.aspx"&gt;App Arch Guidelines&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/07/layers-and-components.aspx"&gt;Layers and Components&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/09/17/key-software-trends.aspx"&gt;Key Software Trends&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2008/10/09/cheat-sheet-patterns-practices-catalog-at-a-glance-posted-to-codeplex.aspx"&gt;Cheat Sheet: patterns &amp;amp; practices Catalog at a Glance Posted to CodePlex&lt;/a&gt;&lt;/li&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9009678" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jmeier/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://blogs.msdn.com/jmeier/archive/tags/AppArch/default.aspx">AppArch</category></item><item><title>10 Success Patterns for PMs</title><link>http://blogs.msdn.com/jmeier/archive/2008/08/13/10-success-patterns-for-pms.aspx</link><pubDate>Wed, 13 Aug 2008 08:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8856254</guid><dc:creator>J.D. Meier</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/jmeier/comments/8856254.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jmeier/commentrss.aspx?PostID=8856254</wfw:commentRss><description>&lt;P&gt;Here's a brief set of success patterns I've shared with a few colleagues.&amp;nbsp; These are the patterns I see that make a difference in getting results. 
&lt;P&gt;&lt;STRONG&gt;10 Success Patterns&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Empathic listening.&lt;/LI&gt;
&lt;LI&gt;Rapport before influence&lt;/LI&gt;
&lt;LI&gt;Character trumps emotion trumps logic&lt;/LI&gt;
&lt;LI&gt;Match their style&lt;/LI&gt;
&lt;LI&gt;Ask WIIFY&lt;/LI&gt;
&lt;LI&gt;Distinguish between responsibility and authority&lt;/LI&gt;
&lt;LI&gt;Turn chickens into pigs&lt;/LI&gt;
&lt;LI&gt;Adapt, adjust, or avoid situations&lt;/LI&gt;
&lt;LI&gt;Know the system.&lt;/LI&gt;
&lt;LI&gt;Analyze it over time. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Success Patterns Explained&lt;BR&gt;&lt;/STRONG&gt;Here's the essence of each:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Empathic listening&lt;/STRONG&gt;.&amp;nbsp; Listen until the other person "feels" they've been heard.&amp;nbsp; Once they feel heard, they're more likely to listen to you.&amp;nbsp; You can do this 1:1 or in a large meeting.&amp;nbsp; Covey uses an "Indian Talking Stick."&amp;nbsp; The person with the stick talks until they feel heard.&amp;nbsp; A former Softie told me his team used an eraser as "the mutex."&amp;nbsp;&amp;nbsp; See &lt;A href="http://blogs.msdn.com/jmeier/archive/2008/04/04/stephen-covey-at-microsoft.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2008/04/04/stephen-covey-at-microsoft.aspx"&gt;Stephen Covey Speaks at Microsoft&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Rapport before influence&lt;/STRONG&gt;.&amp;nbsp; This is true whether it’s a presentation, interview … etc.. For example, go to a comedy club and see how the comedian gets the crowd laughing only&amp;nbsp; after they have rapport.&amp;nbsp; See &lt;A href="http://blogs.msdn.com/jmeier/archive/2007/09/21/how-might-that-be-true.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2007/09/21/how-might-that-be-true.aspx"&gt;How Might That Be True?&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Character trumps emotion trumps logic&lt;/STRONG&gt;.&amp;nbsp; If you base all your arguments on logic, but fail to persuade, now you know.&amp;nbsp; See &lt;A href="http://blogs.msdn.com/jmeier/archive/2008/03/18/win-the-heart-the-mind-follows.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2008/03/18/win-the-heart-the-mind-follows.aspx"&gt;Win the Heart, the Mind Follows&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Match their style&lt;/STRONG&gt;.&amp;nbsp; You don't have to go overboard, but a little bridge can go along way.&amp;nbsp; If somebody is visual, could you whiteboard it for them?&amp;nbsp; If somebody's detail oriented, can you provide the details?&amp;nbsp; If somebody needs to hear action, can you turn your ideas into action?&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Ask WIIFY&lt;/STRONG&gt;.&amp;nbsp; Ask the question What's In It For You?&amp;nbsp; If you're a marketer, this might come natural for you.&amp;nbsp; If you're an engineer, this might feel weird.&amp;nbsp; It's about shifting the focus from the thing to the person. If nobody shows up to your meetings, tailor the invite to be explicit about what's in it for the attendees. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Distinguish between responsibility and authority&lt;/STRONG&gt;.&amp;nbsp; Know whether you influence a decision or own it.&amp;nbsp; When you don't have authority, but you need to get results, leverage the model in &lt;A href="http://blogs.msdn.com/jmeier/archive/2007/03/09/influencing-without-authority.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2007/03/09/influencing-without-authority.aspx"&gt;Influencing Without Authority&lt;/A&gt;. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Turn chickens into pigs&lt;/STRONG&gt;.&amp;nbsp; A pig's committed while a chicken's involved.&amp;nbsp; Don't let a chicken have a controlling vote, without turning them into a pig.&amp;nbsp; See &lt;A href="http://blogs.msdn.com/jmeier/archive/2008/03/25/turning-chickens-into-pigs.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2008/03/25/turning-chickens-into-pigs.aspx"&gt;Turning Chickens into Pigs&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Adapt, adjust, or avoid situations&lt;/STRONG&gt;.&amp;nbsp; Learn how to read situations. Some situations you should just avoid.&amp;nbsp; Some situations you should adapt yourself, as long as you play to your strengths.&amp;nbsp; Some situations you should adjust the situation to set yourself up for success. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Know the system&lt;/STRONG&gt;.&amp;nbsp;&amp;nbsp; Analyze the problem from a system standpoint.&amp;nbsp; What are the components and subsystems?&amp;nbsp; What are the inputs and outputs?&amp;nbsp; Who are the players?&amp;nbsp;&amp;nbsp; What levers can you pull that make the most impact?&amp;nbsp; If you don't know, who does?&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Analyze it over time&lt;/STRONG&gt;.&amp;nbsp; Look at the problem or solution over time. Build your temporal skills.&amp;nbsp; The more you play "what ifs" in the future, the easier it gets to anticipate.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Do you have any favorite success patterns to share? 
&lt;P&gt;&lt;STRONG&gt;My Related Posts&lt;/STRONG&gt; 
&lt;UL&gt;
&lt;LI&gt;&lt;A class="" href="http://blogs.msdn.com/jmeier/archive/2007/04/09/7-habbits-of-effective-program-managers.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2007/04/09/7-habbits-of-effective-program-managers.aspx"&gt;7 Habits of Highly Effective Program Managers&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/jmeier/archive/2007/10/08/patterns-and-practices-for-new-hires.aspx" mce_href="http://blogs.msdn.com/jmeier/archive/2007/10/08/patterns-and-practices-for-new-hires.aspx"&gt;Patterns and Practices for New Hires&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8856254" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jmeier/archive/tags/Effectiveness/default.aspx">Effectiveness</category><category domain="http://blogs.msdn.com/jmeier/archive/tags/Patterns/default.aspx">Patterns</category></item><item><title>Patterns vs. Tooling</title><link>http://blogs.msdn.com/jmeier/archive/2007/11/12/patterns-vs-tooling.aspx</link><pubDate>Mon, 12 Nov 2007 10:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6130146</guid><dc:creator>J.D. Meier</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jmeier/comments/6130146.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jmeier/commentrss.aspx?PostID=6130146</wfw:commentRss><description>&lt;P&gt;I'm a fan of patterns.&amp;nbsp; I think of patterns simply as problem and solution pairs.&amp;nbsp; I wandered by &lt;A class="" href="http://blogs.msdn.com/thehoggblog/" target=_blank mce_href="http://blogs.msdn.com/thehoggblog/"&gt;The Hogg Blog&lt;/A&gt; and noticed Jason's post on &lt;A class="" href="http://blogs.msdn.com/thehoggblog/archive/2007/11/08/the-great-debate-patterns-vs-tooling.aspx" target=_blank mce_href="http://blogs.msdn.com/thehoggblog/archive/2007/11/08/the-great-debate-patterns-vs-tooling.aspx"&gt;The Great Debate: Patterns vs Tooling&lt;/A&gt;.&amp;nbsp; Since patterns and tooling both have their place, I think there's less of a debate and more of a gap between state of the art and state of the practice.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Why Patterns&lt;BR&gt;&lt;/STRONG&gt;I think patterns are an efficient way to share insights.&amp;nbsp; Consolidating 100's of words down into a few is pretty powerful.&amp;nbsp; A pattern language is a great way to map out the terrain of a domain.&amp;nbsp; I think of the pattern language as a constellation of meaningful nuggets.&amp;nbsp; I think the most insighful nuggets are the ones that help you with the toughest forks in the road.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Patterns in&amp;nbsp;Practice&lt;/STRONG&gt;&lt;BR&gt;While working on our security and performance guidance, our team was able to rapidly solve and share end-to-end solutions for incredibly complex application scenarios.&amp;nbsp; As we worked through customer scenarios, we would pattern match against our deployment patterns and application infrastructure patterns.&amp;nbsp; To put this in perspective, I remember a customer that had been prototyping a solution for six months, that we solved in ~3 hours because we had a collection of patterns to draw from.&amp;nbsp; We got to a vantage point where we could solve some of the&amp;nbsp;toughest architetural issues for customers in a few minutes.&amp;nbsp; Looking back, I wish we had a more agile way for sharing our learnings with more customers, and I think patterns and pattern languages could have been part of the answer.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key Usage Scenarios&lt;/STRONG&gt;&lt;BR&gt;There's lots of uses for patterns, but here's some examples:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Building vocabulary&lt;/STRONG&gt;.&amp;nbsp; A lot of light bulbs went off for me when Ward pointed out that patterns help build a shared vocabulary.&amp;nbsp; It's a way to talk about our craft and to hand knowledge down from one generation to the next.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Sharing solutions&lt;/STRONG&gt;.&amp;nbsp; This is what patterns do best.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Encapsulating principles&lt;/STRONG&gt;.&amp;nbsp;&amp;nbsp; It's one thing to talk about a bunch of underlying principles.&amp;nbsp; It's another to have a nicely named pattern.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Key Issues with Patterns&lt;/STRONG&gt;&lt;BR&gt;Here's some of the issues I've run into with&amp;nbsp;some patterns and repositories&amp;nbsp;over the years:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Problems solved&lt;/STRONG&gt;.&amp;nbsp; I don't tend to see enough patterns around the more interesting, engineering problems where patterns are worth the effort.&amp;nbsp; I think quality attributes are great candidates for patterns (security patterns, performance patterns, reliability patterns, flexibility patterns ... etc.) &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Locked in print or teasers to more&lt;/STRONG&gt;.&amp;nbsp; A lot of the most insightful patterns are locked in print.&amp;nbsp; It makes it tough to share, particularly when we don't all have the same bookshelf.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Bad organization&lt;/STRONG&gt;.&amp;nbsp; I've seen only a handful of pattern libraries that impress me.&amp;nbsp; I'm not saying they don't exist, but that I haven't seen a lot I like.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Relevancy&lt;/STRONG&gt;.&amp;nbsp; I think one of the biggest issues is just finding relevant patterns for your problem at hand.&amp;nbsp; No matter how well a library of patterns is organized, it still helps to have a shepherd.&amp;nbsp; Web 2.0 can help here.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Bad templates&lt;/STRONG&gt;.&amp;nbsp; Sometimes the structure of information is as important as the information. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Bloat.&lt;/STRONG&gt;&amp;nbsp; Blah, blah, blah.&amp;nbsp; I'm not a fan of verbosity when I need to get my job done.&amp;nbsp; I've seen some patterns that were more complicated than the solution they were describing.&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Vocabulary&lt;/STRONG&gt;.&amp;nbsp; While patterns can help build a shared vocabulary, it can be tough in the beginning, like learning&amp;nbsp;yet another vocabulary.&amp;nbsp; Convergence takes time.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Silos and pockets of insight&lt;/STRONG&gt;.&amp;nbsp; I don't think patterns are as prevalent as they could or should be.&amp;nbsp; I find a lot of the best nuggets are spread a great deal over time and space.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;From concept to code can be a big jump&lt;/STRONG&gt;.&amp;nbsp; Sometimes you can't get there from here, or it'a a painful process.&amp;nbsp; I think this is very much a tooling opportunity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Silly or make-believe patterns&lt;/STRONG&gt;.&amp;nbsp; I've come across a lot of patterns that seem to be patterns for the sake of patterns.&amp;nbsp; Ward always told me that the best patterns tell you something you didn't expect or that surprised you.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Lack of anti-patterns&lt;/STRONG&gt;.&amp;nbsp; I actually think there's not enough anti-patterns.&amp;nbsp; While there's more than one way to solve a problem, sometimes there's a few places you really shouldn't go, and that's where anti-patterns fit in.&amp;nbsp;&amp;nbsp; Some of the best security insights are documented as anti-patterns.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Key Opportunities for Patterns&lt;BR&gt;&lt;/STRONG&gt;I think there's more opportunity than ever for building better pattern libraries and leveraging social software scnearios and tooling opportunities.&amp;nbsp; Here's some examples:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Guidance Explorer&lt;/STRONG&gt;.&amp;nbsp;&amp;nbsp; &lt;A class="" href="http://www.codeplex.com/GuidanceExplorer" target=_blank mce_href="http://www.codeplex.com/GuidanceExplorer"&gt;Guidance Exploer&lt;/A&gt; lets you easily cross-link patterns or link them to other items.&amp;nbsp; For example, imagine a pattern that links to a code example or a how to or a set of guidelines and checklists.&amp;nbsp; We've also played with the idea of showing patterns as mind maps so you can see the related patterns.&amp;nbsp; Guidance Explorer can also help solve the relevancy issue, by providing more fine-grained organization, as well as make it easy to build a collection of the ones you want.&amp;nbsp; All we have to do is fill up our pattern node with a critical mass of more useful patterns.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Web 2.0&lt;/STRONG&gt;.&amp;nbsp; I think &lt;A class="" href="http://developer.yahoo.com/ypatterns/" target=_blank mce_href="http://developer.yahoo.com/ypatterns/"&gt;Yahoo Design Patterns&lt;/A&gt; is a good example.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tooling support&lt;/STRONG&gt;.&amp;nbsp; I'd like&amp;nbsp;to see more drag+droppable patterns and pattern-based modeling going forward.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;My Favorite Pattern Guides&lt;BR&gt;&lt;/STRONG&gt;Here's a few of the pattern guides I've found to be useful:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="" href="http://msdn2.microsoft.com/en-us/library/aa480545.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/aa480545.aspx"&gt;Scenarios, Patterns, and Implementation Guidance for Web Services Enhancements (WSE) 3.0&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321127420" target=_blank&gt;Patterns of Enterprise Application Architecture&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321127420" width=1 border=0&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/020172149X?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=020172149X" target=_blank&gt;The Design of Sites: Patterns, Principles, and Processes for Crafting a Customer-Centered Web Experience&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=020172149X" width=1 border=0&gt;&amp;nbsp;(if you build Web apps, this is a MUST read)&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/0596007124?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124" target=_blank&gt;Head First Design Patterns (Head First)&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596007124" width=1 border=0&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/1861005288?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1861005288" target=_blank&gt;J2EE Design Patterns Applied&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1861005288" width=1 border=0&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/0130142603?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0130142603" target=_blank&gt;Java 2 Performance and Idiom Guide&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0130142603" width=1 border=0&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.amazon.com/gp/product/0321200683?ie=UTF8&amp;amp;tag=thbosh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321200683" target=_blank&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (The Addison-Wesley Signature Series)&lt;/A&gt;&lt;IMG style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: 0px; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" height=1 alt="" src="http://www.assoc-amazon.com/e/ir?t=thbosh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321200683" width=1 border=0&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6130146" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jmeier/archive/tags/Patterns/default.aspx">Patterns</category></item></channel></rss>