<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Modelling the software system</title>
        <link>http://geekswithblogs.net/theArchitectsNapkin/category/8232.aspx</link>
        <description>Modelling the software system</description>
        <language>en-US</language>
        <copyright>Ralf Westphal</copyright>
        <managingEditor>info@ralfw.de</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>The environment of software cells</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/07/07/the-environment-of-software-cells.aspx</link>
            <description>&lt;p&gt;I´ve talked about what software cells are - &lt;a href="http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/22/software-cells-as-asynchronous-islands-of-code.aspx"&gt;asynchronous "islands" of code&lt;/a&gt; on &lt;a href="http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/13/software-cell---whatacutes-in-a-name.aspx"&gt;several levels of abstraction&lt;/a&gt; -, and I showed you how easy they make it for you to &lt;a href="http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/17/set-the-logic-free.aspx"&gt;place (business) logic where it´s most appropriate&lt;/a&gt;. Software cells - to me - are the structural elements for modelling an application in the large. If you´re faced with a modelling problem, don´t fear the blank flipchart! Just start with a single software cell comprising the whole of your application and do a stepwise decomposition. The goal of this first phase is to determine just functional responsibilities that can and should be executed in parallel. Most importantly that´s the processes of any application. But don´t stop there! There´s potential for parallel processing within (!) many processes. You should try to tap into it because that way you can make your application more responsive and scale better.&lt;/p&gt;  &lt;p&gt;So far I´ve primarily covered the very nature of software cells and the meaning of their "interior". What´s missing is a discussion of their environment. A software cell is just a piece of code that needs to be triggered and which (mostly) relies on some resources.&lt;/p&gt;  &lt;p&gt;&lt;img height="282" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_13b6a707-2428-4c0e-95d6-3d1b1f37a8c4.png" width="285" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;When you start out modelling an application what you´re most interested in is determining the "parties" relevant to a software cell which you don´t have any control over. You want to know who´s using an application and what kind of resources the application is going to use. The former I call &lt;em&gt;actors&lt;/em&gt;, the latter are, well, &lt;em&gt;resources&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Actors are active, they use a software cell, they control its functions. That´s why the arrow is pointing from the actors to the software cell. Although the term "actor" might hint at humans being actors, in fact any "entity" which has the ability to trigger functions in a software cell can be an actor. Of course users (or user roles) are modelled as actors, but also an SAP system or some other application can be an actor. Whenever you do not add any code to a controlling "entity" it´s an actor.&lt;/p&gt;  &lt;p&gt;&lt;img height="281" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_2f701a2a-4c73-46b1-93e2-8210416ff908.png" width="282" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;On the other hand your application (or any software cell) is not only acted upon but also acts itself upon "entities". Those entities I call resources. They are passive with regard to a software cell. But not only files can be resources. Also other programs - again like an SAP system - can be resources. Whenever you do not add any code to a controlled "entity" it´s a resource.&lt;/p&gt;  &lt;p&gt;&lt;img height="278" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_7cb356f1-d1a6-468b-baf6-e1a750a5c219.png" width="280" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Actors and resources can be introduced on any level of abstraction while modelling the nested software cell hierarchy. However, in the end, they should be visible on all levels. It needs to be clear, which actor uses which software cell, and which software cell uses which resource.&lt;/p&gt;  &lt;p&gt;The arrows in the above pictures show control flow. The entity where and arrow starts controls the entity the arrow is pointing to. Data flow, however, is in both directions. An actor triggers some function on a software cell thereby sending it data. Later the software cell returns some result to the actor.&lt;/p&gt;  &lt;p&gt;&lt;img height="284" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_98304d5c-163d-4952-aec1-238540e1e361.png" width="317" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;In addition to actors and resources software cells can be the entities using other software cells or they can be used by others.&lt;/p&gt;  &lt;p&gt;&lt;img height="297" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_3aeb100d-2005-4ff4-a753-ce2aa925a2b6.png" width="298" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;The environment of a software cell thus consists of actors, resources, as well as other software cells. Whatever entity the logic core of a software cell is communicating with via an API (e.g. ADO.NET, System.Net, System.IO, System.Windows.Forms) belongs to its environment. Think of the membrane of the software cell as a placeholder for all such APIs. They stand between the logic of one software cell and another. And they decouple a software cell from humans or other software.&lt;/p&gt;  &lt;p&gt;&lt;img height="295" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Theenvironmentofsoftwarecells_DEC2/image_8e947573-8db1-47a5-8f57-d6aa7f3b9036.png" width="296" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123623"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123623" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/123623.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/07/07/the-environment-of-software-cells.aspx</guid>
            <pubDate>Mon, 07 Jul 2008 09:31:43 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/123623.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/07/07/the-environment-of-software-cells.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/123623.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/123623.aspx</trackback:ping>
        </item>
        <item>
            <title>Software cells as asynchronous islands of code</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/22/software-cells-as-asynchronous-islands-of-code.aspx</link>
            <description>&lt;p&gt;During the first phase of architecting a software you try to break up the "application blob" in OS processes. They are the corner stones of any application. You can view them as large software components: usually they are binary, they are defined by explicit or visual contracts, they are units of deployment and maybe even re-use.&lt;/p&gt;  &lt;p&gt;&lt;img height="277" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_1fa9c691-65fa-4d24-867d-4d1cfe495bc6.png" width="278" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Because identifying the OS processes in your application is so important, I might have emphazised the notion of a software cell being an OS process a bit too much. You might have gotten the impression, software cells in the end are nothing but OS processes. But that´s not what I mean. Really. It´s just that software cells are most often used to depict an OS process.&lt;/p&gt;  &lt;p&gt;So let me try a more formal definition of what I think a software cell is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;A software cell is a unit of code - logically or physicall - which operates asynchronously with regard to other units of code.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This clearly is true for an OS process. It runs on its own thread or even its own machine. And so it is also true for an aggregation of processes, e.g. a whole application or a service. They run on one or more threads dedicated to them.&lt;/p&gt;  &lt;p&gt;However, I see a process as a physically separate unit of code, whereas a whole application is more like a logical unit of code, since it´s not one "thing" you can put your finger on. Instead it´s distributed across several physical "things" (OS processes, machines etc.). But you can draw a circle around several processes thereby aggregating several units of code into a higher level unit of code and call them an application.&lt;/p&gt;  &lt;p&gt;&lt;img height="286" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_d6b19ad3-6c09-4399-a317-bb31c2be9a3b.png" width="284" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;But what about smaller units of code, smaller than an OS process? They can be software cells, too. A single OS process software cell can contain/host/consist of several in-process software cells. I call them &lt;em&gt;active components&lt;/em&gt; or &lt;em&gt;worker components&lt;/em&gt; or &lt;em&gt;async components&lt;/em&gt;. (More of components in future postings.)&lt;/p&gt;  &lt;p&gt;The software cell hierarchy thus extends from the very large to the pretty small, from cross-process to in-process.&lt;/p&gt;  &lt;p&gt;&lt;img height="295" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_21feb58f-835c-44fb-b641-3c1c38d99ac2.png" width="294" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Now, although a service is different from an active component which in turn is not the same as an OS process, they all share one characteristic: the run in parallel with other software cells on the same level. That´s what I find important to express across all levels of abstraction.&lt;/p&gt;  &lt;p&gt;Why is that important? Because communication between parallel units of code is so different from synchronous units of code. Synchronous sequential processing within a software cell uses the stack and therefore is secure, fast, reliable etc. Asynchronous units of code on the other hand cannot communicate via a stack. They need some other means which always is an indirection of some kind. That makes async communication much slower than sync communication (up 3 orders of magnitude and more). And often it also makes communication less reliable and less secure etc. With async communication the &lt;a href="http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing"&gt;"Fallacies of Distributed Computing"&lt;/a&gt; kick in. It´s because of them that I find it so important to be so conscious about where async units of code are in an architecture. That´s why I devote a whole concept with its own visual notation to this. Software cells are supposed to protect your thinking from slipping into one or more of the fallacies.&lt;/p&gt;  &lt;p&gt;Software cells run on their own threads. Software cells thus need to communicate with their environment through some medium. This can be an in-proc queue, or some other form of shared memory, or a database, or a TCP connection, or the Windows message pump. You name it.&lt;/p&gt;  &lt;p&gt;&lt;img height="316" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_f20a6d1f-2e34-43e2-93c4-df447773c78b.png" width="317" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Whenever you see a relationship between two software cells you immediately know it´s a simplyfication. In reality any communication between the software cells is not direct, but mediated. So medium or even infrastructure necessarily sits between them. Like a stack between two synchronous methods, but much slower.&lt;/p&gt;  &lt;p&gt;This has some implications. Whenever you draw a software cell you need to ask yourself a couple of questions. Here are some that come to my mind right away:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;How is the software cell started and stopped? &lt;/li&gt;    &lt;li&gt;Can the software cell be paused or interrupted? &lt;/li&gt;    &lt;li&gt;How are processing failures reported to the environment of the software cell? &lt;/li&gt;    &lt;li&gt;How should data be passed into and out of the software cell? &lt;/li&gt;    &lt;li&gt;How is shared data protected from inconsistencies through concurrent access by several software cells? &lt;/li&gt;    &lt;li&gt;How can I be informed of certain states during a process executed by a software cell? &lt;/li&gt;    &lt;li&gt;How can I know if a software cell is still alive and progressing? &lt;/li&gt;    &lt;li&gt;How fast, reliable, secure etc. is a software cell and a connection to it? &lt;/li&gt;    &lt;li&gt;Does it matter to a client of a software cell, where and if the software cell is running? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Some of these questions relate directly to the above fallacies. But there are more that need to be answered. Especially you need to ponder how the communication between a software cell and its environment should take place.&lt;/p&gt;  &lt;p&gt;For in-process software cells (active components) you might just use a &lt;em&gt;Queue&amp;lt;T&amp;gt;&lt;/em&gt; - with some synchronization code added. For two OS process software cells, though, you´d need to switch to TCP sockets or MSMQ or WCF. Or you use the file system as a medium: one software cell could create and write a file, the other could react on that and read the file.&lt;/p&gt;  &lt;p&gt;And there´s one more twist to active components: they are running inside an OS process and so you should decide if they should be hosted inside a special AppDomain. It´s like deciding whether two OS process software cells should run on the same machine or not.&lt;/p&gt;  &lt;p&gt;&lt;img height="306" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_b9d45735-9b0e-434e-af9c-f48511a75863.png" width="305" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;As you can see, co-locating or not is an issue you have to decide on, too, at every level of abstraction in your architecture.&lt;/p&gt;  &lt;p&gt;Think of software cells as islands with their own population. The people living on an island happly work on some tasks - at their own speed. &lt;/p&gt;  &lt;p&gt;&lt;img height="305" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_d9decf5e-63d6-4fe6-ac38-2361fee4b855.png" width="304" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;You can communicate with them, e.g. by sending a message in a bottle or calling them via sattelite or dropping something from a plane. The islands can be located close to each other in the same sea or exist far apart in different oceans. Most importantly they all work pretty autonomously on their own threads. &lt;/p&gt;  &lt;p&gt;&lt;img height="293" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/hostetc_1346B/image_ef2a87e5-b21b-4017-9619-dcceeff289a4.png" width="297" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;What´s the benefit of all this?&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Thinking in terms of async units of code on several levels of abstraction makes you very conscious with regard to the costs and means of distribution.&lt;/li&gt;    &lt;li&gt;As long as you model your applications with software cells you keep it flexible with regard to the topology. Software cells can be moved around between processes and machines etc. comparatively easily. This is due to the explicit medium always used to communicate between them. It naturally decouples them.&lt;/li&gt;    &lt;li&gt;Since software cells are basically distributable units of code (remember: always indirect communication through some medium), you get a head start in terms of scalability. A software cell can be "multiplied" pretty easily to compensate higher load. Asynchronous processing is main road to scalability, not faster processors. Software cells make scale-out easier.&lt;/li&gt; &lt;/ol&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123060"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123060" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/123060.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/22/software-cells-as-asynchronous-islands-of-code.aspx</guid>
            <pubDate>Sun, 22 Jun 2008 13:47:33 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/123060.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/22/software-cells-as-asynchronous-islands-of-code.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/123060.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/123060.aspx</trackback:ping>
        </item>
        <item>
            <title>Set the logic free</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/17/set-the-logic-free.aspx</link>
            <description>&lt;p&gt;The main concern of software cells is how business logic is distributed. But as I write "business logic" I don´t really feel comfortable. The term sounds as if software cells were just a tool to help modelling business applications - as opposed to games or compilers or infrastructure. But right to the contrary: software cells claim to be a universal meta model for software. You can model any software with them. That´s why I don´t like to use the term "business logic". I prefer the neutral and unqualified term "logic".&lt;/p&gt;  &lt;p&gt;So at the core of a software cell is logic code as opposed to technical or infrastructural code. If you like, qualify logic with "business" or "domain" or "application". But in the end it´s only important that the logic code, the core code is not concerned with technical details. It should not directly call, for example, a communication or persistence API. But more of this separation of concerns in another posting.&lt;/p&gt;  &lt;p&gt;When thinking of logic, think of all that which is not dependent on a certain way of accessing this code or storing data or comunication with other software. Think of the invariant code that is independent of such "interface details" - whereas "interface" means interfacing with other software cells or infrastructure or resources or humans.&lt;/p&gt;  &lt;p&gt;&lt;img height="297" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_fae4fc98-69c5-4c8d-a61a-a9f2ef4664a4.png" width="300" border="0" /&gt;  &lt;/p&gt;  &lt;p&gt;If you think of a prime calculation application, what would such invariant code be? Well, for example the prime calculation algorithm. You need it regardless of whether the primes are displayed on a web page or in a desktop client; you need it regardless of whether the primes are send to another program via TCP or stored in a flat file for later import into Excel.&lt;/p&gt;  &lt;p&gt;Ok, so at the heart of the software cell concept is application logic. At the core of any software cell is logic code. It´s the code that solves the problem the whole application is about in the first place.&lt;/p&gt;  &lt;p&gt;Now you might say, that´s not much different from what you have thought of N-tier business logic all along - and I can´t but agree.&lt;/p&gt;  &lt;p&gt;However - and this to me is an important however -, the N-tier architectural model pretty much confines the logic to one OS process. If you´re talking about a 3-tier application you mean 3 OS processes with (all) the colorful (business) logic residing in the middle tier process:&lt;/p&gt;  &lt;p&gt; &lt;img height="286" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_4b819e75-45bc-452e-9600-610365f0db9a.png" width="288" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;That might have been ok in the mid 1990s. Back then distribution of code was not that easy with either socket or DCOM communication. And it seemed less often necessary than today. Client/Server architectures were the norm, N-tier architectures seemed to solve the scalability problem of internet applications, and that was pretty much it.&lt;/p&gt;  &lt;p&gt;But today... today communication is much, much easier. Web services, .NET Remoting and Enterprise Services are simple to use RPC technologies. Even socket programming is no longer a black art with the System.IO and System.Net namespaces. And WCF is here to change the very paradigm of distributed communication by providing a neat unified message oriented API.&lt;/p&gt;  &lt;p&gt;This in turn makes distribution easier. Setting up an application to consist of several very different "presentation tiers" and several "middle tiers" and several "backend tiers" all serving different purposes and maybe communicating in a P2P manner with other similar "tiers" is becoming the norm. That´s why I don´t see the term "tier" for an application´s OS process to fit anymore. For certain architectures it´s ok to use - but to let your modelling process be guided by it, seems limiting. Take off the "N-tier glasses"! And in terms of the &lt;a href="http://www.praetrans.com/en/ptf.html"&gt;pre-trans-fallacy&lt;/a&gt; enter the trans level: go beyond the slavish adherence to the N-tier "rule"! Set yourself free to think in different, more flexible terms. That´s what software cells are all about. Think cells instead of tiers.&lt;/p&gt;  &lt;p&gt;What does that mean for your logic code? Well, it means, it should be able to move freely among the topology of an application. The meta model of software should allow logic to exist at any place an architect sees fit. That´s what software cells are about. They allow you to model OS process topologies and more to fit a problem and not a pattern. And they allow you to put logic in any place you like.&lt;/p&gt;  &lt;p&gt;When you start a project, though, all application logic sits in one place: in the one and only all encompassing single software cell representing your entire solution:&lt;/p&gt;  &lt;p&gt; &lt;img height="266" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_f732295d-1914-42d5-861f-82adfe2b13fb.png" width="267" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="151" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_44ec8e87-1597-452e-8622-8615c2b43b7b.png" width="195" align="right" border="0" /&gt;This single logic core contains all the logic code your application needs - despite you not knowing what this code will look like in detail. You just take it as a black box, or a black box made up of several parts or aspects. Each being a different, (sooner or later) clearly distinguishable responsibility.&lt;/p&gt;  &lt;p&gt; But that´s just the start. Sooner or later you´ll want to decompose the initial single software cell into 2 or 3 software cells. That means - to come back to the biological cell analogy - you cause a cell division. Whereas biological &lt;a href="http://en.wikipedia.org/wiki/Mitosis"&gt;mitosis&lt;/a&gt; creates two clones, though, software cell division creates two or more software cells that look different. And that´s the whole point when distributing logic in this manner: the logic in the original cell should be split up. Parts of it go into one of the "child cells", other parts go into other "child cells".&lt;/p&gt;  &lt;p&gt;&lt;img height="129" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_735273fd-5d9e-42fe-bd29-15be4eb93000.png" width="129" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_db5c0db8-8ad4-4161-a957-410c7bf717c7.png" width="236" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_934d306d-cee7-47b3-b1b4-036a49191de6.png" width="238" border="0" /&gt;  &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_e0902a15-5eb8-4233-bda4-577e1af31dc0.png" width="237" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_32ee79dc-5566-4d9d-b16f-8518911bbad7.png" width="235" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img height="133" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_13f500d4-7dd0-4658-b948-70b19955dcfa.png" width="134" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;The reverse is also possible: you might look at a software cell diagram and decide to merge software cells into one. Either physically, i.e. reduce the number of OS processes by aggregating logic from two or more processes in just one. Or logically by wrapping software cells in a software cell on a higher level of abstraction. This happens most often when you try to depict legacy systems with software cell diagrams. There already exist several OS processes and you need to describe the status-quo in a more coarse grained way to management.&lt;/p&gt;  &lt;p&gt;Decomposition and aggregation might be the most common operations on software cells and their logic cores. But there´s yet another transformation you can apply: you can of course move logic from one software cell to another.&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_59593b08-7af8-4718-9973-38d69f72f0e5.png" width="234" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Although this might sound and look a bit abstract to you right now, I assure you, it has great practical value. This value lies in eliminating any &lt;a href="http://en.wikipedia.org/wiki/Cognitive_dissonance"&gt;cognitive dissonance&lt;/a&gt; stemming from conflicts when trying to find the right place for business logic according to the canonical N-tier architecture pattern. This value lies in freeing your thinking about architecture. The pain when trying to fit your solution to the N-tier model might seem weak - but I argue, it´s there and it´s not weak, but only subdued or even denied. So once you look for it in yourself or your peers, you´ll realize its prevalence.&lt;/p&gt;  &lt;p&gt;I´m not against layers as a pattern. They have their place and I´ll talk about them in due course. But layers and tiers as other patterns should not be the starting point of your thinking. Or at least, don´t believe them to be the ultimative truth.&lt;/p&gt;  &lt;p&gt;If you want to use layers, use them as a structuring pattern for something. Don´t just draw layered boxes. Rather plan a structure and then (!) arrange it in layers. See layers/tiers as superimpositions over an architecture, but not as the architecture itself or its goal:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Businesslogicsetfree_11172/image_1b501939-a14b-4f3b-a618-7f2e680d7d50.png" width="232" border="0" /&gt;  &lt;/p&gt;  &lt;p&gt;The stuff to arrange, the structural elements , that´s software cells with their logic. They are the material to build architectures from in the large. Why? Because they give you maximum freedom in arranging the most important part of any software: the logic.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122925"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122925" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/122925.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/17/set-the-logic-free.aspx</guid>
            <pubDate>Tue, 17 Jun 2008 17:32:45 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/122925.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/17/set-the-logic-free.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/122925.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/122925.aspx</trackback:ping>
        </item>
        <item>
            <title>Software cell - What&amp;acute;s in a name?</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/13/software-cell---whatacutes-in-a-name.aspx</link>
            <description>&lt;p&gt;Software cells to me are the basic building blocks of software in the large. Don´t think in smaller terms as a software architect - at least at first. Keep your planning on the process level or above, e.g. on the service level. Services - as in SOA - can be depicted as software cells, too. You can think of a service as a composite consisting of several smaller software cells.&lt;/p&gt;  &lt;p&gt;As peel away the layers of your software system, your application starting from the top, i.e the &lt;strong&gt;whole application&lt;/strong&gt;...&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_7a98f0ab-3307-4255-9609-453150b5c498.png" width="238" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;...you get to the layer of &lt;strong&gt;services&lt;/strong&gt;...&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_a1747e68-6900-40d2-b00d-f617618a1031.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;...which you can drill down into to get to the actual &lt;strong&gt;OS processes&lt;/strong&gt; constituting these services:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_89f72ebd-6112-4d93-aaaf-bec18fbf7dfb.png" width="235" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;(Please notice, how a service from the previous/higher level has become an OS process on this level. That´s because the service just needs one OS process. No further refinement was needed.)&lt;/p&gt;  &lt;p&gt;Software cells thus lend themselves not only to planning a single application, but also to think in SOA terms. Which brings me to the question: what is it, that makes a software cell a software cell? Why the similarity to biological cells? Why didn´t I choose another analogy?&lt;/p&gt;  &lt;p&gt;At the core of the cell analogy is, well, the core. A core of something sitting in the middle of an area surrounded by a wall.&lt;/p&gt;  &lt;p&gt;Let me explain the genesis of this analogy: It was in 2005, I guess, during a vacation in beautiful Ireland, when I toyed around with software architecture depictions. I was pretty much in a trance the whole time - much to the grief of my girlfriend. The driving force behind my thinking was distress with the architectural layer pattern. Layered architectures or N-tier architectures seemed inflexible and misleading to me.&lt;/p&gt;  &lt;p&gt;First of all, they suggest a certain direction of development. You´re either a person who likes to start with the tangible and visual, so you emphasize the presentation layer. That where you feel comfortable. So you work yourself from there down to the invisible parts you might be so sure about anymore. Or you´re a person who likes to lay a solid foundation. So you start at the backend, the data access layer and work your way up to the frontend.&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_ec644dbd-4bb4-4a28-b7e7-9413e46c2fdf.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Either way what´s kind of left out by these "processes" is the most important part of any application: its busines logic. Although the literature always underlines its importances, this message often does not materialize in project reality which is driven by one of the personality types just described. This is because the layer pattern does not favor any layer. All layers are created equal, so to speak.&lt;/p&gt;  &lt;p&gt;So my first approach to improving the architectural pattern/symbol situation was to morph the layer pattern into a "burger pattern":&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_bc7bd623-63e7-45fa-aca1-230dcae91c8d.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;It changes the importance and the priority in favor of the business logic. That´s where the meat (!) is of an application. That´s the area you should flesh (!) out first. Business logic should be developed in a way as to be pretty invariant with regard to how it is access from any frontend or what kind of backend it uses to retrieve/store data. Frontend technologies change all the time, so do backends. Yesterday we used ADO.NET, today it´s some O/R Mapper, tomorrow it might be an only storage service like Amazon´s S3 or SimpleDB. Would you want to modify the business logic along with those changes? No, I don´t think so. That´s why it´s more important to think about it first, to put it in the center of your planning.&lt;/p&gt;  &lt;p&gt;Then I played around with those "burgers" (even though my mother used to tell me, "Don´t play with your food!").  Here´s what a multi-layer application looks like:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_5568d8e9-5fa0-46a9-84a5-747ea12392df.png" width="235" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;And here´s an N-tier application: &lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_5568d8e9-5fa0-46a9-84a5-747ea12392df.png" width="235" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;But wait, isn´t that the same picture as for a multi-layer software? Yes. The reason is, that N-tier diagrams, which are just multi-layer diagrams, usually don´t graphically distinguish between a layer and a tier. They assume you know, that in an N-tier diagram a layer is at least an OS process.&lt;/p&gt;  &lt;p&gt;I think, that´s bad, because it leads to falling prey to one or more of the &lt;a href="http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing" target="_blank"&gt;"fallacies of distributed computing."&lt;/a&gt; So at least, when you know you´re dealing with different OS processes, pull apart the layers/tiers and connect them with arrows like this:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_e05350c6-a1eb-4c96-aab4-af3ba2ec6fa2.png" width="237" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately that raises some questions: Is all the code in a tier of the same color? If so, where do you put validation code, for example? Validation sure is a business logic responsibility. But you don´t want to be forced to do all validation in the green OS process. Some validation should already be done right after data entry in the frontend. But that would mix blue code with green code. Or you might want to validate data right before storing it, just to be sure. That would mix red code with green code. Not a beautiful sight, or is it?&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_dffc6c59-2064-49b0-b1a0-67db46f3ea7a.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;But the shudder that ran through me when I saw this "distributed burger" led me to an insight: business logic is not limited to the "middle tier", but can appear in all tears. That´s not even an exception, but the norm. You should not avoid it, because it´s so natural.&lt;/p&gt;  &lt;p&gt;Unfortunately the N-tier architectural pattern does not account for such naturalness.&lt;/p&gt;  &lt;p&gt;So, what to do? Avoid putting business logic in the frontend or backend (e.g. as a stored procedure) and thus not be able to model what´s coded? Or spit into the holy grail of distributed systems modelling, the N-tier pattern? Tertium non datur?&lt;/p&gt;  &lt;p&gt;After having a Guinness or two I chose a third way: I did away with layers and tiers.&lt;/p&gt;  &lt;p&gt;Instead I made what seemed awkward in the N-tier model the center of a new model: If we business logic is so important and we can´t avoid putting business logic in all tiers, why not put business logic at the heard of everything - plus give a tier a distinct shape?&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_4850a16f-0322-4e20-91db-300135ae281b.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Isn´t that straightforward? Each circle represents a tier (and thus readily distinguishes itself from a layer), each tier/circle contains business logic.&lt;/p&gt;  &lt;p&gt;Thinking further along this line then led me to the visual unification of "all tiers are created equal". From a structural or syntactic point of view there is no difference between a presentation tier, a business logic tier, and a data access tier. So why not represent them using the same symbol?&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_255a5226-9d66-44d2-9d7d-a2576be812e4.png" width="237" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;This was the birth of the software cell. The dot in the middle signifying the ubiquitous business logic.&lt;/p&gt;  &lt;p&gt;Syntactically it is on par with the simple box of a tier. But semantically is has more to offer:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A software cell makes clear, at least an OS process is meant when it´s drawn. &lt;/li&gt;    &lt;li&gt;A software cell makes clear, at the core of every OS process is the business logic. &lt;/li&gt;    &lt;li&gt;A software cell makes clear, business logic can be present in any OS process. &lt;/li&gt;    &lt;li&gt;A software cell makes clear, there is a gap between them that needs to be explicitly bridged. (Tier boxes on the other hand could be just stacked, not leaving a gap, and thus glossing over the fact, that communication between tiers has different characteristics than communication between in-proc layers.) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In addition the circle of a software cell allows for more flexible connections with other software cells. Drawing distributed systems - which are increasingly becoming the norm - thus has become much easier with software cells instead of tier boxes.&lt;/p&gt;  &lt;p&gt;And think of it: What a great analogy to think of software systems consisting of many processes as "tissues" made up of software cells. Why not seeing such service tissues as "organs" of an even larger software system or "software organism"?&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_ae0332c2-5e76-4952-aaf2-23961f29b0c1.png" width="238" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;By making business logic core and making OS processes as well as OS process aggregates clearly visible in an architecture, it´s easier for autonomy - one of the fundamental values of SOA - to enter the picture. Software cells are code units running all by themselves in a separate physical or logical address or data space. They share, so to speak, the same "milieu" (alluded to by the colors of the "tissues" in the above drawing).&lt;/p&gt;  &lt;p&gt;You decide, how much business logic to "lump together in a software cell organ" until autonomy "sets in". Physically a single software cell representing an OS process is already autonomous in so far as it´s running on its own thread in its own address space. But logically, with regard to the problem domain, though, it might not be able to truely act autonomous. Nevertheless it´s on a good way, because it´s naturally decoupled from other software cells. But that´s a topic for another posting.&lt;/p&gt;  &lt;p&gt;Let me close by making again clear, how software cells lend themselves to describing software systems on different levels of abstraction by adding levels above the previous drawing:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_085728ec-62cb-4eec-98cf-d6cfa509cbec.png" width="237" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_4d581197-811c-4e7d-94b8-ae69b9cbf176.png" width="238" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;On which level does the software system or its parts become autonomous with regard to the respective environments? It´s up to you - as it always has been. But with software cells it´s easier to "visually think" autonomy, because the very concept of (semantic) and symbol (syntax) for software cells carry autonomy at the core.&lt;/p&gt;  &lt;p&gt;Take a software cell, connect it to another, connect both to yet another... there is no limit to the connectability of a software cell. Model strictly hierarchical software or P2P software in the same easy manner:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_b51716d9-30ba-435b-bc0b-7083c13ce8ac.png" width="237" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_6579fb37-937b-4eb7-be45-d30ea2f3501f.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Software cells don´t restrict you syntactically. You´re free to shape the topology of your distributed system as you like. That´s freedom the N-tier paradigm does not offer. That´s why I saw the need for a new, more flexibel meta-model for larger scale software structures.&lt;/p&gt;  &lt;p&gt;Let me close for today by saying, that it´s of course ok to use boxes in software cell diagrams, too. If you like, group software cells on any level by surrounding them with a box or any other shape of your liking. That way you can add dimensions for e.g. platform, machine, or some logical context:&lt;/p&gt;  &lt;p&gt; &lt;img height="298" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/SoftwarecellWhatsinaname_F7D4/image_f268c836-8af7-47b9-bb25-61d9594c8821.png" width="295" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Just be sure not to overburden the napkin with details!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122852"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122852" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/122852.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/13/software-cell---whatacutes-in-a-name.aspx</guid>
            <pubDate>Fri, 13 Jun 2008 20:07:38 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/122852.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/13/software-cell---whatacutes-in-a-name.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/122852.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/122852.aspx</trackback:ping>
        </item>
        <item>
            <title>Software cells as large scale building blocks</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/12/software-cells-as-large-scale-building-blocks.aspx</link>
            <description>&lt;p&gt;The basic building blocks of software when you start architecting it are... well, not classes, and no UML packets either. I believe it should be something more high level and general.&lt;/p&gt;  &lt;p&gt;Classes are too fine grained to be used as architectural modelling elements. No chip architect would start planning a new processor by arranging single transistors, and no building architect would plan a house by thinking about where to place each brick:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_3.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Such a detailed view of a house might be nice for home owners to give them an impression of how their house will look. So it´s about the look and feel and has always been an art of its own:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="208" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_925bb8a7-8fdf-4d04-8730-cc2019afc7a6.png" width="260" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;source: &lt;/em&gt;&lt;a title="http://upload.wikimedia.org/wikipedia/commons/c/ca/Erlach_4.jpg" href="http://upload.wikimedia.org/wikipedia/commons/c/ca/Erlach_4.jpg"&gt;&lt;em&gt;http://upload.wikimedia.org/wikipedia/commons/c/ca/Erlach_4.jpg&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using the almost lowest level structural elements for planning how something is built, though, works only for very, very simple things. Think of a flip-flop circuit or a shepard´s hut:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="127" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_02ca42e0-64ea-44f6-ac76-f6407c6e4a30.png" width="200" border="0" /&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="127" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_e4a27e29-565e-4aea-8066-2b82a5c2f235.png" width="164" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;sources: &lt;/em&gt;&lt;a title="http://pics.computerbase.de/lexikon/121846/180px-Flipflop_by_trexer.png" href="http://pics.computerbase.de/lexikon/121846/180px-Flipflop_by_trexer.png"&gt;&lt;em&gt;http://pics.computerbase.de/lexikon/121846/180px-Flipflop_by_trexer.png&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="http://www.planetfear.com/includes/images/uploaded/24200746122613JP-stone-hut.jpg" href="http://www.planetfear.com/includes/images/uploaded/24200746122613JP-stone-hut.jpg"&gt;&lt;em&gt;http://www.planetfear.com/includes/images/uploaded/24200746122613JP-stone-hut.jpg&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As a software architect you need more coarse grained material to form an application out of. At least to start with. Do rough sketches first, then refine them. Start in the large, then drill down into the small.&lt;/p&gt;  &lt;p&gt;But what is a structural element of software in the large? A UML package? I don´t find that very useful out of two reasons: On one hand an UML package has close ties with a particular programming language (Java), and why should I as an architect be concerned with that (at the outset)? On the other hand an UML package is something very generic, too generic, I´d even say (think UML stereotypes), and why should I as an architect be not more specific?&lt;/p&gt;  &lt;p&gt;Hence I feel there´s a lack of an appropriate structural element for modelling software in the large. Services, too, do not help. They are an application of structural elements. So what I came up with are software cells. To me they are the basic, rough, and coarse grained modelling elements for architecture in the large. Their depiction is simple as I showed in my &lt;a href="http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/11/how-to-fill-an-empty-napkin.aspx" target="_blank"&gt;previous posting&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img height="179" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_34fd7b40-3c03-4813-b8f9-94e399812e30.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Now, what is a software cell? Well, a software cell is a larger unit of code. It can be just C# code or it can be the sum of C# plus T-SQL plus IronPython plus Java plus VBA. The only criteria to call something a software cell is: you develop the code. So basically the "membrane" separates your code from the rest of the world, from some environment.&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_269c3208-6b18-4f0a-a4bd-4eeada705e60.png" width="237" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;You could also think of a software cell as an island of your code that´s separated from other code islands or some mainland by large stretches of water:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_2b171ba7-d2e6-4f7f-8c9b-0f733d2d4417.png" width="236" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;How much of your code goes into a software cell? At the beginning, it´s all the code you´re going to develop for an application. From 30,000 ft your application always looks like one large softwar cell:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_d230f900-ffcf-4d3b-8ed7-dbe210a3ac24.png" width="237" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;But then, when you sink lower, zoom in during your planning, when you refine your picture of the application, then you come to see more details. The one island of code in fact is several islands:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_2ac48bf0-a7e5-4389-b56b-590b3ab8a192.png" width="237" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;This way you build your software in the large on an arbitrary number of levels of abstraction. Here´s a more handy tree view of such nesting of software cells. It´s the stepwise structural decomposition of the root software cell, which - in the beginning - was the sole representation of the application to plan:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_bc41d381-a8b3-4d47-8c94-9a61859912c7.png" width="237" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Each level of this tree contains as many software cell as you see fit. All together they describe your application on different levels of abstraction/detail. But they are just "blobs of your code" representing some kind of task or responsibility on a high level. Except for the leaves of such a tree of nested software cells they are all virtual or logical. They exist only on your napkin and in your head. Their purpose is to keep complexity at bay.&lt;/p&gt;  &lt;p&gt;The leaves, though, are real. They are operating system (OS) processes (or .NET AppDomains if you need more than one in an OS process). So the goal of the initial architectural phase is to determine which OS processes your application should consist of.&lt;/p&gt;  &lt;p&gt;Since all applications require at least one OS process to run their code in it´s always right to fill the first blank napkin with a software cell. You could even draw it before your boss has started to explain what kind of application he envisions. With a software cell on your napkin you´re never wrong. Be it a "Hello, world!" program or an ERP system.&lt;/p&gt;  &lt;p&gt;This might sound trivial to you, but my experience with lots of software teams tells me, it´s far from it. Many, many developers have difficulties to find an entry point into a software architecture. What they fall back on in such a situation are... more or less formal UML class diagrams. That´s like starting to plan the Empire State Building with some door or corner stone. Or it´s like planning a painted portrait by drawing an ear lobe. Maybe some master artist can start like this, but not us mere mortals. For us it´s much easier not to start with a detail, but with a big picture right in front of us - on the back of a napkin. That´s what software cells are about.&lt;/p&gt;  &lt;p&gt;Software cells are the large scale building blocks for our applications. With them you can quickly refine your picture of a software from initial code blob containing everything you need to develop to a number of OS processes among which you distribute the code. Here´s a series of napkins as a testimonial to this approach:&lt;/p&gt;  &lt;p&gt;&lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_cd07d664-f7cf-4654-a253-6b11e7545c71.png" width="235" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_4c53db7e-1558-48db-bd94-527d1f4c0872.png" width="236" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_a7f3cf21-eae5-463e-9af2-9c1101cdfacd.png" width="238" border="0" /&gt; &lt;img height="236" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_28f90c96-d88a-4285-ae02-98e358293db6.png" width="238" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;I began the architecture with just a single software cell to represent all of the application to develop. As I said, that´s never wrong.&lt;/p&gt;  &lt;p&gt;Then I decomposed the software cell into two very different ones, e.g. a software cell for frontend stuff and one for business logic stuff. Maybe I first thought a client/server architecture would fit the problem best.&lt;/p&gt;  &lt;p&gt;But then I realized it would be better to distribute the business logic stuff across at least two software cells, both being candidate OS processes.&lt;/p&gt;  &lt;p&gt;Finally I devided the frontend stuff into two software cells (or candidate OS processes), because I learned from my boss, he would like a web frontend as well as a desktop frontend.&lt;/p&gt;  &lt;p&gt;And, upps, before I forget, there is another concern coming up: What about reports? If the application needs to print long running reports they could be produced by yet another software cell (aka service) instead of one of the business logic software cells. So I spawn another software cell from the code I imagined to go into the blue software cells:&lt;/p&gt;  &lt;p&gt;&lt;img height="310" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_22.png" width="310" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;This is the lowes level of abstraction at the end of the first architecturing phase. These software cells are now to become the OS processes of the application. And depending on who you´re talking to you can pull out an appropriate napkin on a level of abstraction right for your audience.&lt;/p&gt;  &lt;p&gt;Here´s the decomposition for you as an overview of all levels:&lt;/p&gt;  &lt;p&gt;&lt;img height="347" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Whatsinasoftwarecell_6966/image_477ddfbc-d594-4ebe-8264-3c789c897bf0.png" width="352" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;With your senior developers you talk on level 4, the OS process level. The newly hired junior dev might need a more gentle introduction to the application starting on level 2, and your boss or his customer just wants to see the big, big picture on level 0.&lt;/p&gt;  &lt;p&gt;In any case: If a napkin gets crowded by symbols and lines, take a new one from the pile. Insert a level of abstraction and drill down using a couple of napkins for the details.&lt;/p&gt;  &lt;p&gt;Ok, where are we now? I showed you how to start architecting you next application not by trying to dream up some class it might contain, but rather by determining the OS processes it will be distributed across. That´s maybe just one or it´s a dozen on several machines and different platforms. Start by assuming there is at least one, depict it as a software cell, then refine each software cell in a recursive process into "smaller", more focused software cells until you´re confident you´ve reached the leafs of the software cell tree. That´s the OS processes.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122819"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122819" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/122819.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/12/software-cells-as-large-scale-building-blocks.aspx</guid>
            <pubDate>Thu, 12 Jun 2008 15:23:03 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/122819.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/12/software-cells-as-large-scale-building-blocks.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/122819.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/122819.aspx</trackback:ping>
        </item>
        <item>
            <title>How to fill an empty napkin</title>
            <link>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/11/how-to-fill-an-empty-napkin.aspx</link>
            <description>&lt;p&gt;Before I bore you with some theory let me quickly show you, how I think you can fill any (!) empty napkin in a minute with a meaningful sketch of a software system, be it completely new or already 30 years old, whether it´s object oriented or all assembler code, and regardless of its size.&lt;/p&gt;  &lt;p&gt;Imagine your boss calling you in to talk to you about a new software project. He explains to you his grand vision of a one-size-fits-all "Hello, world!" program. And you can´t hold back your excitement. What a great opportunity for you to show off your skills as a software architect! You go through the requirements with him and make sure you understand every detail. Then you impress your boss with your first architectural sketch. It´s rough, yes, but at least you can show him something right away. You don´t fear an empty sheet of paper (or Visio drawing canvas). Right to the contrary! You love napkins when they are empty!&lt;/p&gt;  &lt;p&gt;Here´s what you draw for your boss on the back of a napkin you happen to have brought with you:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Howtofillanemptynapkin_1303E/image_18.png"&gt;&lt;img height="239" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Howtofillanemptynapkin_1303E/image_thumb_6.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That´s it. Plain simple, and enough to convey your understanding of his amazing idea.&lt;/p&gt;  &lt;p&gt;And what is it you depicted? It´s the whole application, all that you have to develop and don´t know yet how to implement. All the intricacies and complexities of the application are represented by, well, just one "software cell" - the circle with the dot in the middle:&lt;/p&gt;  &lt;p&gt;&lt;img height="179" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Howtofillanemptynapkin_1303E/image_16.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;I call it a software cell, because it looks like a biological cell with a membrane and a core:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="193" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Howtofillanemptynapkin_1303E/image_15.png" width="260" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;source: &lt;/em&gt;&lt;a title="http://www.schule.at/index.php?url=kategorien&amp;amp;kthid=6191" href="http://www.schule.at/index.php?url=kategorien&amp;amp;kthid=6191"&gt;&lt;em&gt;http://www.schule.at/index.php?url=kategorien&amp;amp;kthid=6191&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And like a biological cell a software cell encapsulates complex processes and shields them from the outside world. By drawing a software cell you thus distinguish an inside from an outside, a system from its environment.&lt;/p&gt;  &lt;p&gt;&lt;img height="183" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/theArchitectsNapkin/WindowsLiveWriter/Howtofillanemptynapkin_1303E/image_14.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;That´s not difficult, isn´t it? But it´s an important first step, since it draws a line in the sand separating what you have to implement from what you don´t have to implement. And it´s important because it starts software development on a level of abstraction your boss is still comfortable with. He´s an important stakeholder of the whole effort, so you want him to feel comfortable and confident and understanding as long as possible. How better to do that than by drawing pictures even he understands?&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122805"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122805" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/theArchitectsNapkin/aggbug/122805.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ralf Westphal</dc:creator>
            <guid>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/11/how-to-fill-an-empty-napkin.aspx</guid>
            <pubDate>Wed, 11 Jun 2008 20:45:16 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/theArchitectsNapkin/comments/122805.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/theArchitectsNapkin/archive/2008/06/11/how-to-fill-an-empty-napkin.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/theArchitectsNapkin/comments/commentRss/122805.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/theArchitectsNapkin/services/trackbacks/122805.aspx</trackback:ping>
        </item>
    </channel>
</rss>