<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>Ulterior Motive Lounge</title>
        <link>http://geekswithblogs.net/UlteriorMotiveLounge/Default.aspx</link>
        <description>UML Comics and more from Martin L. Shoemaker (The UML Guy),Offering UML Instruction and Consulting for your projects and teams.</description>
        <language>en-US</language>
        <copyright>Martin L. Shoemaker</copyright>
        <managingEditor>Martin@TheUMLGuy.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Ulterior Motive Lounge</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>All right, Mr. DeMille, I'm ready for my close-up</title>
            <category>Development Community</category>
            <category>Development Processes</category>
            <category>It's all about communication.</category>
            <category>UML</category>
            <category>VSTS 2010 (Codename Rosario)</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/05/26/all-right-mr.-demille-im-ready-for-my-close-up.aspx</link>
            <description>&lt;p&gt;Back in January, &lt;a target="_blank" href="http://www.brianhprince.com/"&gt;Brian H. Prince&lt;/a&gt; from Microsoft interviewed me about the UML features in Visual Studio Team System 2010. Today, he informed me that &lt;a target="_blank" href="http://channel9.msdn.com/shows/ARCast.TV/ARCastTV-Martin-Shoemaker-discusses-UML-in-VSTS2010/"&gt;the interview is finally live on Channel 9&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=132437"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=132437" 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/UlteriorMotiveLounge/aggbug/132437.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/05/26/all-right-mr.-demille-im-ready-for-my-close-up.aspx</guid>
            <pubDate>Tue, 26 May 2009 23:58:43 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/132437.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/05/26/all-right-mr.-demille-im-ready-for-my-close-up.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/132437.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ulterior Motive Lounge: A Map of Carnivore Park</title>
            <category>Ulterior Motive Lounge</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/01/10/ulterior-motive-lounge-a-map-of-carnivore-park.aspx</link>
            <description>&lt;p&gt;&lt;a target="_blank" href="http://www.ulteriormotivelounge.com/ulteriormotivelounge/Map.aspx"&gt;As I’ve written elsewhere&lt;/a&gt;, I love maps. And I love a story that includes maps. Maps help me to see where the action takes place; and they give me tantalizing clues to action yet ahead. When I first opened a hardcover of &lt;a target="_blank" href="http://www.amazon.com/Hobbit-There-Back-Again-Collectors/dp/0395177111"&gt;The Hobbit&lt;/a&gt; and unfolded the big map of Wilderland, I was hooked.&lt;/p&gt;
&lt;p&gt;So for those who love maps like I do, here’s a map of Carnivore Park. (Click picture for a larger image.) This is where the rest of the story takes place; and following it is a map guide that &lt;em&gt;may&lt;/em&gt; contain clues to what lies ahead.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/9138/o_Carnivore%20Park.jpg"&gt;&lt;img title="Carnivore Park" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="415" alt="Carnivore Park" width="644" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/WindowsLiveWriter/UlteriorMotiveLoungeAMapofCarnivorePark_15FC/Carnivore%20Park_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Carnivore Park lies within a dormant volcanic island, bought and run by Owner. The volcano cone makes a natural barrier to dinosaurs – and to prying eyes, of course. The west end faces open ocean. The east end faces Central America, though a long way away. The east end beach has been artificially built up, along with two breakwaters. A concrete apron allows cargo and passengers to disembark and take the switchback up the slope to the entrance to The Park.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt;
&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The interior of The Island may &lt;em&gt;seem&lt;/em&gt; natural, but it’s actually nearly 100% sculpted or planted. The topsoil has been imported from rich fertile swamps on the mainland. The river has some contribution from springs and runoff, but is heavily fed by a hidden desalination plant. The ridge through the Park is actually a concrete wall, with interior chambers and bolt holes. The plateaus of the visitor center are partly natural, but largely shaped concrete. Roads run along the ridges, sometimes fenced from the dinosaurs, sometimes separated by “natural” barriers, and sometimes exposed.&lt;/p&gt;
&lt;h2&gt;The Visitor Port&lt;/h2&gt;
&lt;p&gt;Ship and helicopter landings.&lt;/p&gt;
&lt;h2&gt;Carnivore Park&lt;/h2&gt;
&lt;p&gt;The main park buildings reside on a set of artificially enhanced plateaus. Trees and other obstacles are carefully arranged to block any view of dinosaurs from the Pavilion or the rest of the control area; but the Lodge is elevated so that the higher (and more expensive) storeys have a view into the main Park.&lt;/p&gt;
&lt;h2&gt;The Pavilion&lt;/h2&gt;
&lt;p&gt;This is the entry to the Park. It includes the Operations Center, the Gift Shop, the Quick Bite Café, the Boring Exposition, and the Laboratories.&lt;/p&gt;
&lt;h3&gt;Gift Shop&lt;/h3&gt;
&lt;p&gt;Souvenir shop. Sells Park merchandise. Also sells &lt;a target="_blank" href="http://www.cafepress.com/UMLounge"&gt;LoungeWare&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Quick Bite Café&lt;/h3&gt;
&lt;p&gt;A cafeteria.Specializes in curried “dinosaur” dishes (actually chicken).&lt;/p&gt;
&lt;h3&gt;The Boring Exposition&lt;/h3&gt;
&lt;p&gt;Auditorium named for Wayne H. Boring. Used for reviews and presentations.&lt;/p&gt;
&lt;h3&gt;Operations Center&lt;/h3&gt;
&lt;p&gt;The nerve center for the Park.&lt;/p&gt;
&lt;h3&gt;The Laboratories&lt;/h3&gt;
&lt;p&gt;A sign on the door reads “Here there be dragons!”&lt;/p&gt;
&lt;h2&gt;The Lodge&lt;/h2&gt;
&lt;p&gt;Guest lodging at the Park. Across from The Pavilion.&lt;/p&gt;
&lt;h3&gt;Drumbeats&lt;/h3&gt;
&lt;p&gt;Nightclub at the top of The Lodge.&lt;/p&gt;
&lt;h3&gt;The Food Chain&lt;/h3&gt;
&lt;p&gt;Restaurant in The Lodge.&lt;/p&gt;
&lt;h3&gt;The Pool&lt;/h3&gt;
&lt;p&gt;A place to unwind when not out seeing the dinosaurs.&lt;/p&gt;
&lt;h3&gt;On The Rocks&lt;/h3&gt;
&lt;p&gt;Bar near The Pool.&lt;/p&gt;
&lt;h3&gt;The Petting Zoo&lt;/h3&gt;
&lt;p&gt;An area near the Pool where small, cute dinosaurs are available for petting and feeding. &lt;/p&gt;
&lt;h2&gt;The Park&lt;/h2&gt;
&lt;p&gt;A giant, dormant volcano cone, perfect for confining dinosaurs.&lt;/p&gt;
&lt;h3&gt;The Garden&lt;/h3&gt;
&lt;p&gt;Where the herbivores run “free”. Visitors can approach by ascending walking trails.&lt;/p&gt;
&lt;h3&gt;Carnivore Country&lt;/h3&gt;
&lt;p&gt;An area where various smaller carnivores roam.&lt;/p&gt;
&lt;h3&gt;Rex’s Crib&lt;/h3&gt;
&lt;p&gt;An area set aside for Tyrannosaurs Rex specimens, including extra reinforced fencing and other safeguards.&lt;/p&gt;
&lt;h3&gt;Raptor Country&lt;/h3&gt;
&lt;p&gt;An area dedicated to Velociraptors and their prey.&lt;/p&gt;
&lt;h3&gt;The Backlots&lt;/h3&gt;
&lt;p&gt;Fenced areas deep within the public viewing areas, well-screened by trees. These are areas where workers prepare and care for dinosaurs (and dinosaur meals) before release into the viewing areas. Each has a number of isolation pens, carefully screened by trees from other pens.&lt;/p&gt;
&lt;h3&gt;River Country&lt;/h3&gt;
&lt;p&gt;A boat tour (not yet approved by Money Man) through swamp and river dinosaur habitats. Also passes through The Glasshouse.&lt;/p&gt;
&lt;h3&gt;The Glasshouse&lt;/h3&gt;
&lt;p&gt;A large glass enclosure for flying dinos.&lt;/p&gt;
&lt;h3&gt;The Power Center&lt;/h3&gt;
&lt;p&gt;Includes a geothermal power station, water pumps, and fence control.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=128539"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=128539" 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/UlteriorMotiveLounge/aggbug/128539.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/01/10/ulterior-motive-lounge-a-map-of-carnivore-park.aspx</guid>
            <pubDate>Sat, 10 Jan 2009 07:35:07 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/128539.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2009/01/10/ulterior-motive-lounge-a-map-of-carnivore-park.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/128539.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Not that I'm ungrateful, but I think you're in the wrong place...</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/13/not-that-im-ungrateful-but-i-think-youre-in-the.aspx</link>
            <description>&lt;p&gt;In an effort to understand and better serve my readers, I keep an eye on my referral logs. I like to know who likes what they read here, and then learn what else they read.&lt;/p&gt;
&lt;p&gt;But this one has me boggled. One of my most recent referrals is from &lt;a href="http://fanpop.com/spots/the-l-word/headlines"&gt;the headlines page for fanpop's community for The L-Word&lt;/a&gt;. It's a link to &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/11/ship-it-on-the-side-episode-3.aspx"&gt;my recent post&lt;/a&gt; for &lt;a href="http://www.shipitontheside.com"&gt;Ship It On The Side&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I appreciate the link. Really, I do. But this site has pretty much nothing to do with the lesbian scene in L.A. Sorry.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127880"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127880" 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/UlteriorMotiveLounge/aggbug/127880.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/13/not-that-im-ungrateful-but-i-think-youre-in-the.aspx</guid>
            <pubDate>Sat, 13 Dec 2008 12:42:01 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127880.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/13/not-that-im-ungrateful-but-i-think-youre-in-the.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127880.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ship It On The Side Episode 3</title>
            <category>It's all about communication.</category>
            <category>UML</category>
            <category>Development Processes</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/11/ship-it-on-the-side-episode-3.aspx</link>
            <description>&lt;a href="http://shipitontheside.com/2008/12/3-use-cases/"&gt;Ship It On The Side Episode 3 -- Use Cases&lt;/a&gt; is now released. Complete with goats!&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127805"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127805" 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/UlteriorMotiveLounge/aggbug/127805.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/11/ship-it-on-the-side-episode-3.aspx</guid>
            <pubDate>Thu, 11 Dec 2008 07:45:15 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127805.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/11/ship-it-on-the-side-episode-3.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127805.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The UML Learning Path</title>
            <category>It's all about communication.</category>
            <category>UML</category>
            <category>Development Processes</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/the-uml-learning-path.aspx</link>
            <description>&lt;p&gt;(Click picture for a larger image.)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/9261/o_UML%20Learning%20Path.jpg"&gt;&lt;img alt="The UML Learning Path" src="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/9261/r_UML%20Learning%20Path.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No, I'm not going to name any of the devs who inspired this post. They wouldn't know who I am, anyway.&lt;/p&gt;
&lt;p&gt;But it takes an extremely high degree of arrogance to go from "I don't see a way to use this" to "This has no value, no matter who says they're getting value out of it. So I'll dismiss it, and I'll mock them" Either arrogance, or more likely, insecurity: "I don't understand this; so since those people think it's important, either they understand something I don't, or they're fools. I'll mock them, so everyone thinks they're fools. That will make &lt;em&gt;me&lt;/em&gt; look smart."&lt;/p&gt;
&lt;p&gt;And that insecurity manifests in a lot of places on a lot of topics, not just UML: Agile Development, Orchestrated Development, CMMI, Test Driven Development, C#, Java, Ruby, linux, .NET... Any time you move from "I don't see it" to "It's worthless", look around: if other developers are putting those tools to productive use, then it's &lt;em&gt;not&lt;/em&gt; worthless. It just doesn't help &lt;em&gt;you&lt;/em&gt;. So do you call it worthless, and imply they're fools? Or do you openly mock them, demonstrating that &lt;em&gt;you're&lt;/em&gt; a fool?&lt;/p&gt;
&lt;p&gt;Or do you follow the only exit path in this diagram? There is only one, after all. Once you &lt;em&gt;get&lt;/em&gt; UML, you've gotten it for good. You may not use it all the time, but you'll understand when and why you &lt;em&gt;should&lt;/em&gt; use it. But the only exit path is the middle: you recognize that UML (or Agile, or Orchestrated, or...) is having some value on some projects, so it's not worthless; but you just can't see the value. You remain open-minded.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127800"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127800" 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/UlteriorMotiveLounge/aggbug/127800.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/the-uml-learning-path.aspx</guid>
            <pubDate>Thu, 11 Dec 2008 02:41:34 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127800.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/the-uml-learning-path.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127800.aspx</wfw:commentRss>
        </item>
        <item>
            <title>UML Jokes</title>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/uml-jokes.aspx</link>
            <description>&lt;p&gt;In case &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/category/9116.aspx"&gt;the Lounge&lt;/a&gt; isn't satisying your hunger for UML humor, check out &lt;a href="http://www.umljokes.com"&gt;UML Jokes&lt;/a&gt;, a contest for UML jokes. Sadly, it expired in February, I didn't start the Lounge until September, and I just found the site now. So congratulations to the winners! And if there's another round, look for a Lounge submission.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127783"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127783" 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/UlteriorMotiveLounge/aggbug/127783.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/uml-jokes.aspx</guid>
            <pubDate>Wed, 10 Dec 2008 06:09:15 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127783.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/12/10/uml-jokes.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127783.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ship It On The Side</title>
            <category>Speaking Engagements</category>
            <category>It's all about communication.</category>
            <category>Requirements Patterns and Antipatterns</category>
            <category>Development Processes</category>
            <category>Personal</category>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/29/ship-it-on-the-side.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://www.getflowerpot.com"&gt;Curtis Gray&lt;/a&gt; informs me that the first &lt;a href="http://shipitontheside.com/"&gt;Ship It On The Side&lt;/a&gt; podcast is now published.Listen to us talk about building and shipping great software while holding down day jobs.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127456"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127456" 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/UlteriorMotiveLounge/aggbug/127456.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/29/ship-it-on-the-side.aspx</guid>
            <pubDate>Sat, 29 Nov 2008 21:59:02 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127456.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/29/ship-it-on-the-side.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127456.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Thanks, comment spammers!</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/26/thanks-comment-spammers.aspx</link>
            <description>Comment moderation is now activated. Thanks, comment spammers!&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127418"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127418" 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/UlteriorMotiveLounge/aggbug/127418.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/26/thanks-comment-spammers.aspx</guid>
            <pubDate>Thu, 27 Nov 2008 04:46:56 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127418.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/26/thanks-comment-spammers.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127418.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Doctors are the Stupidest Users!</title>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/20/doctors-are-the-stupidest-users.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Note to doctors:&lt;/strong&gt; &lt;em&gt;No, I don't really mean that title. I use provocative titles to get attention and capture an attitude. What? What are you doing? You're going to stick that thermometer &lt;strong&gt;where?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Doctors are the stupidest users. If you've ever had to write software for doctors, you've discovered this: the phrase "RTFM" was &lt;em&gt;made&lt;/em&gt; for doctors. They just can't be bothered to read even the simplest help docs. They can't bother to learn even simple tools that a bright grade-schooler can master.&lt;/p&gt;
&lt;p&gt;OK, that's the programmer perspective. Now let's look at it from the doctor's perspective. On her desk is a small mountain of medical journals she needs to read to keep up with her specialty.&lt;/p&gt;
&lt;p&gt;Next to those is a small mountain of textbooks for the &lt;em&gt;new&lt;/em&gt; specialty she's trying to learn.&lt;/p&gt;
&lt;p&gt;Next to &lt;em&gt;those&lt;/em&gt; is a small mountain of new regulations and guidelines she must comply with to maintain her license.&lt;/p&gt;
&lt;p&gt;Next to &lt;em&gt;those&lt;/em&gt; is a small mountain of insurance guidelines she'll probably never have time to read but should if she wants to make sure she's charging within guidelines.&lt;/p&gt;
&lt;p&gt;Next to &lt;em&gt;those&lt;/em&gt; is a small mountain of insurance paperwork that demands her scarce attention. She has no time for it; but if she doesn't keep up with it, patients may be denied treatment that would've been approved if she had.&lt;/p&gt;
&lt;p&gt;Next to &lt;em&gt;those&lt;/em&gt; is a small mountain of accounting statements that she'd rather not bother with, but has to if she wants to pay her student loans and malpractice insurance.&lt;/p&gt;
&lt;p&gt;And next to &lt;em&gt;all&lt;/em&gt; of those is a &lt;em&gt;large&lt;/em&gt; mountain of patient histories, test reports, specialist reports, and hospital reports she needs to keep straight in order to treat her patients.&lt;/p&gt;
&lt;p&gt;And somewhere, buried under all of those papers, are a few pictures of the family she hopes to see once or twice this week.&lt;/p&gt;
&lt;p&gt;And along comes this programmer person who says, "What's the deal? This is easy! Just read this, and this, and then try this, and learn this, and look at this, and it's easy! You're a doctor. You're supposed to be smart. This should be easy!"&lt;/p&gt;
&lt;p&gt;After she schedules the programmer for an emergency barium enema, the doctor goes back to her work.&lt;/p&gt;
&lt;p&gt;This is part of the reason (by no means the entire reason) that there's a profession of Medical Technician. These people's responsibility, in part, is to be the doctor's user interface to programs that the doctor just has no time to master. They have time to specialize in arcane software. They usually have more technical experience.&lt;/p&gt;
&lt;p&gt;But really: should it be this way? Not that I want to put Medical Technicians out of work; but shouldn't the programmers spend more effort understanding the doctors and their needs, rather than requiring the doctors to understand programs and programmers?&lt;/p&gt;
&lt;p&gt;For years, I've spoken and taught about a principle I call Conservation of Complexity. For any given task, there's a minimum complexity required for that class. You can't make it less complex. (But trust me, some idiot can &lt;em&gt;always&lt;/em&gt; make it &lt;em&gt;more&lt;/em&gt; complex...) If I'm automating that complexity, I take some of that work onto myself, and leave some for the user; but no matter what I do, I can't reduce the complexity below the minimum. And being lazy by nature, I'll want to do the minimum necessary to meet the requirements: minimum complexity for me, and let the user do the work.&lt;/p&gt;
&lt;p&gt;But we can cheat! We can't reduce the complexity of &lt;em&gt;one&lt;/em&gt; instance of the task; but we &lt;em&gt;can&lt;/em&gt; reduce the complexity of &lt;em&gt;multiple&lt;/em&gt; instances, &lt;em&gt;especially&lt;/em&gt; when those instances are performed by &lt;em&gt;multiple&lt;/em&gt; users. In so doing, we can reduce the &lt;em&gt;net&lt;/em&gt; complexity in the system.&lt;/p&gt;
&lt;p&gt;Let's say the user and I split the complexity, C: I get 0.5 C, and he gets 0.5 C. Now if 100 users do the task 100 times, we have:&lt;/p&gt;
&lt;p&gt;Cnet = 0.5 C + 100 * 100 * 0.5 C = 5000.5 C&lt;/p&gt;
&lt;p&gt;Cave = Cnet / n = 5000.5 C / 10000 = 0.50005 C&lt;/p&gt;
&lt;p&gt;So we've cut the complexity in half. That's great, right? That's why we write code, right?&lt;/p&gt;
&lt;p&gt;But suppose some idiot -- i.e., me -- didn't make that app very usable for the user. Oh, it's easier than working by hand, or I won't sell any copies; but say it's 0.8 C. In that case:&lt;/p&gt;
&lt;p&gt;Cave = 0.80005 C&lt;/p&gt;
&lt;p&gt;So I took an easy way out. The system is still less complex on the whole. We're still winning, right?&lt;/p&gt;
&lt;p&gt;But now, let's go the opposite way. Let's say I put in the extra effort to reduce the user's work to 0.2 C. And let's assume this takes me a simply &lt;strong&gt;ghastly&lt;/strong&gt; effort, 2 C. That means that:&lt;/p&gt;
&lt;p&gt;Cave = 0.2002 C&lt;/p&gt;
&lt;p&gt;By me working twice as hard, the system as a whole works roughly 80% less.&lt;/p&gt;
&lt;p&gt;Now these numbers are just examples, of course. But I think they make my point: if all I worry about is getting code out the door, I may not work hard; but my users have to work a lot harder. Too often, we programmers see our perspective too clearly, and the other guy's perspective too dimly. (In other words, we're human.) But the smarter thing to do is to put forth the extra effort to reduce the user's complexity. Because after all, there's &lt;em&gt;money&lt;/em&gt; to be made in reducing your user's workload!&lt;/p&gt;
&lt;p&gt;I'm reading Alan Cooper's &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0672316498/cooperinteractio/103-5669419-0767830"&gt;The Inmates are Running the Asylum&lt;/a&gt;; and with practically every page, I'm reminded of Conservation of Complexity. And of the doctors.&lt;/p&gt;
&lt;p&gt;Also see Joel Spolsky's &lt;a href="http://www.amazon.com/User-Interface-Design-Programmers-Spolsky/dp/1893115941/ref=sr_1_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1227238251&amp;amp;sr=1-4"&gt;discussion on mental models&lt;/a&gt;. He approaches the same idea: the programmer has a mental model of how the code works; the user has a mental model of how the code works; and great software results when the programmer's mental model is very close to the user's. It's easier for a team of motivated programmers to change their handful of mental models than to change all those users.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127261"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127261" 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/UlteriorMotiveLounge/aggbug/127261.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/20/doctors-are-the-stupidest-users.aspx</guid>
            <pubDate>Fri, 21 Nov 2008 04:33:43 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127261.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/20/doctors-are-the-stupidest-users.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127261.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ulterior Motive Lounge Intermission 3: Plan for the Future, Learn from the Past</title>
            <category>Ulterior Motive Lounge</category>
            <category>UML</category>
            <category>Development Processes</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/19/ulterior-motive-lounge-intermission-3-plan-for-the-future-learn.aspx</link>
            <description>&lt;p&gt;UPDATE: My word, what a lot of typos! I blame the bright sunlight and the glare it created on my Tablet PC. And I wasn't gonna move, because bright sunlight in Michigan is a rare treat right now. Fixed!&lt;/p&gt;
&lt;p&gt;In &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-23-girls-just-wanna-write-code.aspx"&gt;our last Episode&lt;/a&gt;, The UML Guy and Geek Girl explored how State Diagrams help you to model the rich range of flow in a user interface. Today, The UML Guy has an announcement. (Click picture for a larger image.)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/9138/o_Intermission%203.jpg"&gt;&lt;img alt="Ulterior Motive Lounge Intermisuion 3" src="http://geekswithblogs.net/images/geekswithblogs_net/UlteriorMotiveLounge/9138/r_Intermission%203%20Small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To this point, the Lounge has been somewhat random and piecemeal. (In other shocking news, rain has been somewhat wet!) I approached UML topics as I found them important or interesting, or when a particular film inspired them. Sometimes I approached them because of specific questions from readers.&lt;/p&gt;
&lt;p&gt;One thing common to many good UML books is that they want to show you that UML is a language, not a process. I approve of that, in theory. But as an instructor, when I tried to structure &lt;a href="http://www.TheUMLGuy.com"&gt;my UML classes&lt;/a&gt; that way, students struggled with this approach. Without a process, they didn't know &lt;em&gt;why&lt;/em&gt; they would draw a particular diagram, or &lt;em&gt;when&lt;/em&gt;. Eventually, I decided they needed to learn UML in the context of a "just enough" process. From that decision and a lot of thought, I ended up with my minimalist Five Step UML process: &lt;strong&gt;Define&lt;/strong&gt;, &lt;strong&gt;Refine&lt;/strong&gt;, &lt;strong&gt;Assign&lt;/strong&gt;, &lt;strong&gt;Design&lt;/strong&gt;, &lt;strong&gt;Repeat&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Define&lt;/strong&gt; your customer's goals and requirements in Use Case Diagrams. Add Class Diagrams as a visual glossary. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Refine&lt;/strong&gt; those requirements into processes and rules using Activity Diagrams for the Use Cases. Use State Diagrams, Sequence Diagrams, or Communication Diagrams if they help; but primarily rely on Activity Diagrams. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Assign&lt;/strong&gt; the steps in those rules to parts of the system by adding Swimlanes to the Activity Diagrams. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Design&lt;/strong&gt; the relations of those parts through Class Diagrams. You may also need Object Diagrams, Component Diagrams, or Deployment Diagrams. We haven't seen those in the Lounge yet; but they're enough like Class Diagrams that you should be able to read them if you can read Class Diagrams. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Repeat&lt;/strong&gt; the process across Use Cases. Then repeat at different scales: with Classes, or across Components or Processors. Look at more detailed Use Cases. Repeat, repeat, repeat. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This has proven &lt;em&gt;much&lt;/em&gt; more successful as a teaching tool, and also as a light-weight process. Even an Agile process. It's just enough UML to help you ask and answer questions. You'll learn more as you apply it and grow with it.&lt;/p&gt;
&lt;p&gt;But even just showing students a UML-based process in the abstract doesn't do much. They need to see UML in action. What they need is a Case Study.&lt;/p&gt;
&lt;p&gt;And very early on, I knew that some day, the Lounge would need Case Studies. The Back to the 80s series (&lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-13-back.-to-the-80s.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-qa-2-battle-of-the-twitter-guest.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-14-lets-all-go-to-the.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-15-back.-to-the-80s-part.aspx"&gt;here&lt;/a&gt;) is something of a mini-Case Study; but for Volume II, I wanted something meaty: a single film that would serve as a complete project, with a wide range of development disciplines and tasks. After discussion with &lt;a href="http://www.twitter.com/EpeeBill"&gt;Editor Bill&lt;/a&gt; and feedback from &lt;a href="http://www.carverlab.com"&gt;Curtis Gray&lt;/a&gt;, we think we've found the ideal film. It's not &lt;em&gt;quite&lt;/em&gt; an 80s film; but let's face it, it's not like I've ever enforced that rule in the past. And the potential in this film is just too good to pass up!&lt;/p&gt;
&lt;p&gt;All right, all right, I'll be honest... &lt;strong&gt;I get to draw freakin' dinosaurs &lt;u&gt;and&lt;/u&gt; UML!&lt;/strong&gt; There was &lt;em&gt;no way&lt;/em&gt; I could pass this up once I thought about it.&lt;/p&gt;
&lt;p&gt;So join The UML Guy, Geek Girl, The Reader, and a bunch of new cast members and old friends as they head off to the tropics. But fair warning: assuming you know how this story will play out could be hazardous to your health. I don't control this strip any more. The characters have minds of their own; and so do the dinosars...&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127234"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127234" 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/UlteriorMotiveLounge/aggbug/127234.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/19/ulterior-motive-lounge-intermission-3-plan-for-the-future-learn.aspx</guid>
            <pubDate>Wed, 19 Nov 2008 19:55:42 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127234.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/19/ulterior-motive-lounge-intermission-3-plan-for-the-future-learn.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127234.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Quantity IS Quality</title>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/quantity-is-quality.aspx</link>
            <description>&lt;p&gt;On a mailing list where I hang out, a participant recently said (paraphrased): “He believes that popularity proves quality. I believe that there is almost no correlation between quality and popularity.”&lt;/p&gt;
&lt;p&gt;We hear this sort of thing all the time. There’s an implication among self-appointed elites that “the masses” — i.e., everyone who’s not them — just can’t recognize quality. It’s assumed that “popular” is proof that something is bad. You see this attitude in film snobs who insist that an Oscar nomination for &lt;em&gt;The Return of the King&lt;/em&gt; is some sort of travesty, because the film is a popular fantasy and not some art house flick or some historical epic. To be fair: you see it in &lt;em&gt;Lord of the Rings&lt;/em&gt; fans who for years have been telling others who didn’t like the books that they just didn’t appreciate great literature. And before the films, you could see it among the &lt;em&gt;literati&lt;/em&gt; who snubbed &lt;em&gt;Lord of the Rings&lt;/em&gt; because it’s a popular fantasy rather than a dreary, post-modern, self-referential, obscurantist yawn. You see it in opera buffs who assume the rest of us are subintelligent because we don’t share their passion for opera. You see it in young rebels who look down on the lives of the conformist “sheeple” and who demonstrate that &lt;em&gt;they&lt;/em&gt; are individuals and not “sheeple” — by all dressing and talking and acting and piercing alike. And you even see it in gourmets who extol the virtues of French food over more pedestrian fare like food from McDonald’s.&lt;/p&gt;
&lt;p&gt;But the truth is: they’re wrong, every single one of them. They proceed from two clearly false assumptions: that there is one clear, objective, inarguable standard of quality; and that of all human beings, they somehow have been born with/been granted/achieved the unique ability to pronounce what the standard is.&lt;br /&gt;
&lt;a id="more-224"&gt;&lt;/a&gt;&lt;br /&gt;
But the fact is just the opposite. If I can avoid butchering the Latin too poorly, &lt;em&gt;de gustibus non disputandum&lt;/em&gt;: with taste there can be no dispute. Or in the modern vernacular: &lt;em&gt;there’s no accounting for taste.&lt;/em&gt; When someone tries to tell you that his tastes are objectively correct, he’s demonstrating how self-centered he is or how shallow his thinking is.&lt;/p&gt;
&lt;p&gt;Does that mean there are no things that are objectively better than some other things? Can’t we all agree that Shakespeare is better than “The Simpsons”? Nope: I could gather up quite a debate on both sides of that issue; and the pro-Simpsons side would be every bit as educated and erudite as the pro-Shakespeare side.&lt;/p&gt;
&lt;p&gt;Can’t we all agree that French food is better than McDonald’s? No, for multiple reasons: many people dislike new tastes, and prefer comfort and familiarity; not everyone likes the spices in French food; and if you grew up with French food every day, you might see it as “normal” and McDonald’s as a new experience, where novelty makes it attractive.&lt;/p&gt;
&lt;p&gt;And so on, and so on, and so on. If you take &lt;strong&gt;any&lt;/strong&gt; “objective” measure of general quality (as opposed to quality for a particular purpose, which may be assessed much more precisely) and examine it all the way down to its roots, you find personal tastes, past experiences, biases, and other responses that aren’t objective at all. There’s no objective measure of quality.&lt;/p&gt;
&lt;p&gt;Except one. See, like many things that are immeasurable in the small, quality is measurable in the large, through statistics. No one person can absolutely proclaim that a certain thing is a quality product; but we can measure with reasonable precision how many people accept and endorse the quality of a product, by virtue of their purchases. In other words, the list writer I paraphrased has it exactly wrong: the closest thing we have to an objective measure of quality &lt;strong&gt;is&lt;/strong&gt; popularity. If a significant number of people enjoy a product, then the odds that you will like it are higher. We’re all individuals, not ruled by statistics; but statistics are a useful piece of information to help you find products to try. Quantity purchased &lt;strong&gt;is&lt;/strong&gt; a valid measure of quality. The market identifies products that the largest number of people accept as quality products.&lt;/p&gt;
&lt;p&gt;And before anyone chimes in about betamax, QWERTY keyboards, CDs vs. albums, Microsoft, or any other oft-cited “evidence” that the market can produce the “wrong” answer: go reread my post, because you still missed the point. Don’t force me to go haul out the evidence that shows the conventional wisdom is wrong in every one of these cases, or I’ll produce so much it crashes the server. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127128"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127128" 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/UlteriorMotiveLounge/aggbug/127128.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/quantity-is-quality.aspx</guid>
            <pubDate>Sun, 16 Nov 2008 00:20:52 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127128.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/quantity-is-quality.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127128.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Concern vs. Worry vs. Obliviousness</title>
            <category>Development Processes</category>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/concern-vs.-worry-vs.-obliviousness.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1449" bv:cns="cns!2D0DCE281FBB99D!1449" bv:ca="true" bv:cat="Code Is Not Enough"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1449"&gt;
&lt;table cellspacing="0" cellpadding="2" width="100%" border="3"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;
            &lt;h3&gt;Concern&lt;/h3&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;
            &lt;h3&gt;Worry&lt;/h3&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;
            &lt;h3&gt;Obliviousness&lt;/h3&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"Has this happened yet?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"This could never happen." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"How likely is this to happen?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"This could never happen." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"How can we tell if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"See no evil, hear no evil, speak no evil..." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"Can we prevent this from happening?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"This could never happen." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"What will be the impact if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"No problem..." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"Can we prepare for that impact?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Cross that bridge when we come to it." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"Can we manage that impact if it happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Cross that bridge when we come to it." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"Who will be responsible for watching and managing this?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, who will we blame if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"I didn't do it!" &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"We'd better do something about this!" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Somebody'd better do something about this!" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"This could never happen." &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="33%"&gt;"There's nothing to do about this right now, so let's focus on what we &lt;strong&gt;can&lt;/strong&gt; do." &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Oh, no, what if this happens?" &lt;/td&gt;
            &lt;td valign="top" width="33%"&gt;"Looks like smooooooth sailing ahead."&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Which column describes &lt;strong&gt;your&lt;/strong&gt; project management techniques? &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This has &lt;em&gt;nothing&lt;/em&gt; to do with any of my current projects or clients. The person who inspired this already knows who he is, and is firmly in column 1. Any &lt;em&gt;other&lt;/em&gt; resemblance to actual persons or events is purely coincidental. &lt;/p&gt;
&lt;p&gt;No llamas were injured in the making of this post. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127127"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127127" 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/UlteriorMotiveLounge/aggbug/127127.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/concern-vs.-worry-vs.-obliviousness.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:56:39 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127127.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/concern-vs.-worry-vs.-obliviousness.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127127.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The Department of Motor Vehicles and Clipboards</title>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-department-of-motor-vehicles-and-clipboards.aspx</link>
            <description>&lt;div&gt;All right, I've had enough. It's time for me to issue a decree:&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Henceforth, programmers who wish to use the clipboard must be licensed in the same fashion as automobile drivers are licensed by the Department of Motor Vehicles.&lt;/strong&gt; (Yes, yes, we call it the Secretary of State's Office here in Michigan; but more people know it as the DMV.)&lt;/div&gt;
&lt;div&gt;1. Before you may use the clipboard to copy code, you must take 20 hours of classroom instruction on how &lt;em&gt;not&lt;/em&gt; to use your clipboard.&lt;/div&gt;
&lt;div&gt;2. Before you may be fully licensed to use your clipboard, you must undergo a six-month probationary period during which you may only use the clipboard with a grown up, licensed programmer observing your use of the clipboard.&lt;/div&gt;
&lt;div&gt;3. Upon completing your probationary period, you may apply for a clipboard license at your nearest Department of Responsible Programmers. There your code will be examined for any signs of clipboard abuse. (&lt;strong&gt;Note:&lt;/strong&gt; Unlike the tests at the DMV, this examination will &lt;em&gt;not&lt;/em&gt; be easy. It will be brutal. You have been warned.)&lt;/div&gt;
&lt;div&gt;4. If your code is deemed acceptable by a Responsible Programmer, you will receive a clipboard license, and be authorized to copy code as needed.&lt;/div&gt;
&lt;div&gt;5. At any time, your code may be inspected for clipboard abuse. You will receive one (1) point for each line of unjustified code copying. If you accumulate 100 or more points, you will have to return to Clipboard School, or lose your license.&lt;/div&gt;
&lt;div&gt;6. If at any time you accumulate 200 points, your clipboard license will be immediately revoked. You will be eligible to reapply after 1 year.&lt;/div&gt;
&lt;div&gt;7. If at any time you accumulate 500 points, you will be shot. While we know this is harsh, it's the only economical option. We can't afford the cost of maintaining your code.&lt;/div&gt;
&lt;div&gt;8. Clipboarding while drunk is grounds for immediate revocation of your license.&lt;/div&gt;
&lt;div&gt;Yes, this means &lt;strong&gt;you!&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127126"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127126" 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/UlteriorMotiveLounge/aggbug/127126.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-department-of-motor-vehicles-and-clipboards.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:55:03 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127126.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-department-of-motor-vehicles-and-clipboards.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127126.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dr. Strained Memory or: How I Learned to Stop Worrying and Love Compact Framework Memory Management</title>
            <category>.NET</category>
            <category>CE/Mobile/Compact Framework/Whatever buzzword Microsoft has slapped on it this week</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dr.-strained-memory-or-how-i-learned-to-stop-worrying.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1416" bv:cns="cns!2D0DCE281FBB99D!1416" bv:ca="true" bv:cat=".NET Compact Framework Programming"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1416"&gt;
&lt;div&gt;OK... So why has &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1415.entry"&gt;my DODO been incalculable&lt;/a&gt;? Well, because we've been chasing down memory problems in our .NET Compact Framework 2.0 app that runs under Windows CE 5.0.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And if that just sent a chill down your spine, then you've probably been here before. You have my sympathies.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;If you haven't been here before but you're planning a CF/CE app: Be afraid. Be very afraid.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The following is a brief summary of what we've learned (the hard way) about memory management in a Compact Framework application. &lt;/div&gt;
&lt;h2&gt;"In the beginning, the Universe was created. This made a lot of people angry, and has been widely regarded as a bad idea."&lt;/h2&gt;
&lt;div&gt;My client's application comes in two versions: one that runs on a laptop, and one that runs on a handheld computer running &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms905511.aspx"&gt;Windows CE 5&lt;/a&gt;. Since both versions run .NET -- &lt;a href="http://support.microsoft.com/?scid=ph;en-us;8291"&gt;.NET Framework 2.0&lt;/a&gt; on the laptop, &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/netframework/aa497277.aspx"&gt;.NET Compact Framework 2.0&lt;/a&gt; on the handheld -- they figured to share a lot of code between the two platforms, including a homebrew implementation of a &lt;a rel="nofollow" href="http://msdn.microsoft.com/msdnmag/issues/06/08/DesignPatterns/default.aspx"&gt;Model-View-Presenter&lt;/a&gt; architecture. The implementation of View (and Presenter, to a lesser extent) had to change across platforms; but for the most part, what was a good architecture for the laptop was seen as a good architecture for the handheld.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;First mistake, there...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And although I wasn't here when that mistake was made, I probably would've made the same mistake myself. I didn't realize that on the handheld platform, you need different coding priorities.&lt;/div&gt;
&lt;h2&gt;"Do you know what the secret of life is? This. One thing. Just one thing. You stick to that and the rest don't mean ****."&lt;/h2&gt;
&lt;div&gt;When you code, the quality of the result depends significantly on your priorities: what do you want from the code? Every developer has an idea of the "correct" coding priorities. Some value small code, or fast code, or readable code, or clever code. Steve McConnell once advised deciding &lt;em&gt;and announcing&lt;/em&gt; your priorities for a given project before work begins, so everyone knows what's important for &lt;em&gt;this&lt;/em&gt; project. You might make a prioritized list, such as:&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;Correctness. &lt;/li&gt;
    &lt;li&gt;Maintainability/readability. &lt;/li&gt;
    &lt;li&gt;Speed. &lt;/li&gt;
    &lt;li&gt;Extensibility. &lt;/li&gt;
    &lt;li&gt;Efficient use of memory. &lt;/li&gt;
    &lt;li&gt;Schedule. &lt;/li&gt;
    &lt;li&gt;Modularity. &lt;/li&gt;
    &lt;li&gt;Reusability.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And so on. Just let the team know what's expected from them, and you're more likely to get it from them. &lt;/p&gt;
&lt;p&gt;But for many teams, that list is too much bother. They can get by with a simple mantra: &lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;strong&gt;Make it run.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it right.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it fast.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;Make it run, so users can give you feedback. Make it right from their feedback. And then optimize only when necessary to make the users happy, because optimization can be difficult to read and maintain and is prone to bugs. &lt;/p&gt;
&lt;p dir="ltr"&gt;Well, we've learned a new mantra for the handheld: &lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Make it small.&lt;/strong&gt; &lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Make it run.&lt;/strong&gt; &lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Make it right.&lt;/strong&gt; &lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Make it fast.&lt;/strong&gt; &lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Repeat, repeat, repeat...&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;You have to make it small &lt;strong&gt;first&lt;/strong&gt;; because on CE 5, if it's not small, it will never run right, and it will be fast only in crashing. And then, when you take steps to make it run and right and fast, you'll inevitably make it larger, and risk crashing due to that. &lt;/p&gt;
&lt;p dir="ltr"&gt;So on CE 5, you have to design for small first. Adding small afterward is a great way to push your DODO to Infinity. I should know. &lt;/p&gt;
&lt;h2 dir="ltr"&gt;"A Man's Gotta Know His Limitations."&lt;/h2&gt;
&lt;p dir="ltr"&gt;So here's the short summary of what we've learned about our limits. First, keep in mind that this code comes in two general types: Native, and Managed. Native Code is code compiled directly for the platform, and responsible for managing and allocating its own memory and other resources. Managed Code is .NET Compact Framework code, which runs inside the Common Language Runtime, a Native Code "shell" that loads and runs and manages Managed Code. It takes care of allocating memory; and if -- &lt;strong&gt;if&lt;/strong&gt; -- you let it, it does its darnedest to clean up that memory when you're done with it. And Managed Code may very well load and call Native Code for certain purposes. (Native Code can load and run Managed Code as well; but for this discussion, that's irrelevant.) &lt;/p&gt;
&lt;p dir="ltr"&gt;Some of what follows applies only to Native Code. Some applies only to Managed Code. And some applies to both. &lt;/p&gt;
&lt;h3 dir="ltr"&gt;"I want to be an explorer, like the Great Magellan." "Oh, you're too late! There's nothing left to explore!"&lt;/h3&gt;
&lt;p dir="ltr"&gt;CE 5 uses Virtual Memory and memory mapping to give each running  process a "private" memory space. I'm no memory management guru; but as best I understand it, this means that each process thinks it "owns" the machine. The Operating System (CE 5) maps into part of that memory space. The app and all its data map into another part. On handheld devices, memory is usually pretty limited (128 MB on board, in our case, and 1 GB on card), and probably less than the addressable space in a process's memory map. &lt;/p&gt;
&lt;p dir="ltr"&gt;The OS itself loads into a given memory location. I can't say where, because I'm not a memory guru. I'm trying to give an overview here, not details. But the important part is that your process then receives an address space in which your process lives in the space from 0 GB to 1 GB, and "global" storage lives in 1 GB to 2 GB. The OS lives beyond that space. &lt;/p&gt;
&lt;h3 dir="ltr"&gt;"Game over, man! Game over!"&lt;/h3&gt;
&lt;p dir="ltr"&gt;OK, so your process's memory map lets it address 1 GB (between addresses 0 GB and 1 GB); but here's the kicker, and here's where our troubles began. The actual memory accessible to your app -- also known as the Virtual Memory, i.e., the chunk of memory mapped into that 1 GB space -- &lt;strong&gt;is restricted to 32 MB on Windows CE&lt;/strong&gt;. Period. No matter what you do. If your app needs more than 32 MB to store your currently loaded code and data, that's it. You're gonna crash. In our case, &lt;em&gt;we&lt;/em&gt; didn't crash; but we made calls to &lt;a target="_blank" href="http://www.microsoft.com/sql/editions/compact/default.mspx"&gt;SQL Mobile&lt;/a&gt; in a low-memory condition, and it'll crash like clockwork, every time. &lt;/p&gt;
&lt;p dir="ltr"&gt;So that's simple, right? Stay under 32 MB, right? What kind of freakin' &lt;em&gt;handheld&lt;/em&gt; app needs 32 MB, anyway? &lt;/p&gt;
&lt;p dir="ltr"&gt;Well, one that was ported from the laptop without sufficient consideration for &lt;strong&gt;Make it small, make it run, make it right, make it fast&lt;/strong&gt;, that's what kind. &lt;/p&gt;
&lt;p dir="ltr"&gt;And oh, if only it were as simple as waving a magic wand and saying "Keep it under 32 MB"... &lt;/p&gt;
&lt;h3 dir="ltr"&gt;"Take your stinking paws off me, you damned dirty ape!"&lt;/h3&gt;
&lt;p dir="ltr"&gt;Maybe, &lt;em&gt;maybe&lt;/em&gt; you can find a way to do what you need within 32 MB. (Probably not: when you tell customers that they're getting portability as a tradeoff for power and features, they never hear the tradeoff part. They'll want your handheld app to be portable &lt;em&gt;and&lt;/em&gt; as powerful as your laptop app &lt;em&gt;and&lt;/em&gt; as fast. Learn to tell them "no" as early as possible.) &lt;/p&gt;
&lt;p dir="ltr"&gt;But you're not the only one who gets to use that 32 MB. No, in fact, every app in the system has its stinking paws on your 32 MB, &lt;strong&gt;including&lt;/strong&gt; the OS! &lt;/p&gt;
&lt;p dir="ltr"&gt;See, when an app is actively running on the handheld, its Virtual Memory is mapped into a special reserved 32 MB slot in the system, slot 0. Your app itself is loaded at the bottom of slot 0, growing up. Any &lt;strong&gt;unmanaged&lt;/strong&gt; DLLs it loads are loaded at the top of slot 0, growing down as each is loaded. (Each DLL is allocated space in 64K chunks, so DLLs that are close to 64K in size -- or 128K, or 192K, or... -- are loaded most efficiently.) And the space in between is available for your app's data. You can also store data in the "global" area from 1 GB to 2 GB; but that's a lot more difficult to use, so you don't want to if you don't have to. &lt;/p&gt;
&lt;p dir="ltr"&gt;But here's the tricky part: because handhelds have limited memory, CE 5 optimizes the memory used by DLLs. If a DLL is loaded in one app, CE doesn't load it into another app that also uses it. CE loads it once, period. But in order to do this, CE loads the DLL into the same location in every app that uses it -- and effectively, &lt;strong&gt;every app that &lt;em&gt;doesn't&lt;/em&gt; use it.&lt;/strong&gt; The unmanaged DLLs are loaded into the top of slot 0 itself, and just left there as different apps are mapped into slot 0 and back out again. So your app takes the hit for every unmanaged DLL loaded anywhere in the device. That can &lt;em&gt;even&lt;/em&gt; include OS DLLs: if the OS runs out of room for its DLLs in its reserved memory, it loads them into slot 0. (In our case, after the vendor did some tuning, that only meant one unmanaged DLL loaded into slot 0 by the OS itself.) &lt;/p&gt;
&lt;h3 dir="ltr"&gt;"Invention, my dear friends, is 93% perspiration, 6% electricity, 4% evaporation, and 2% butterscotch ripple." "That's 105 percent."&lt;/h3&gt;
&lt;p dir="ltr"&gt;Now if the 32 MB limit sounds scary, and the external DLLs chewing up your 32 MB sounds even scarier... Well, you're right, they are scary. &lt;/p&gt;
&lt;p dir="ltr"&gt;But before you set out to try to work around them, ask yourself one thing: are you using .NET Compact Framework 2.0 (or later)? Because if you are, then the CF team has already given you an invention where they put in the perspiration, electricity, evaporation, and butterscotch ripple. Sadly, it's &lt;em&gt;not&lt;/em&gt; a 105% solution (more like an 80% solution in our case); but it's very likely better than you have time and resources to devise and implement and test and maintain yourself. So before you start jumping through hoops, let's look at the hoops they've already jumped through for you. &lt;/p&gt;
&lt;p dir="ltr"&gt;When you build a .NET app (Compact Framework or regular Framework), the &lt;em&gt;real&lt;/em&gt; application is the CLR itself. It's the thing that runs, not your code; and then it loads your code, and uses your code to tell it what to do. &lt;/p&gt;
&lt;p dir="ltr"&gt;So what this means on the Compact Framework is that the CLR can be smart: it &lt;em&gt;knows&lt;/em&gt; about the 32 MB limit, so it works overtime to try to get around it. The biggest technique it uses is that &lt;em&gt;all&lt;/em&gt; of your Managed DLLs &lt;em&gt;and&lt;/em&gt; your managed application are loaded into the global storage area between 1 GB and 2 GB. Then, as you call the code in your app and your DLLs, the CLR loads the pieces you use into an area within your 32 MB VM. This JIT (Just In Time) Heap starts at about 1 MB, and grows as needed; but if the CLR sees that memory is low, it "pitches" code out of the JIT Heap, keeping only the more recently used code. So the JIT Heap can be treated as a 1 MB block under normal circumstances. &lt;/p&gt;
&lt;p dir="ltr"&gt;And another way in which the CF CLR is smart: if any one object you allocate is larger than 2 MB (or it might be 1 MB, I'll need to check), it &lt;em&gt;automatically&lt;/em&gt; allocates from the global storage, &lt;em&gt;without&lt;/em&gt; making you jump through all the hoops involved. The CLR knows how to jump through the hoops. That's its job. &lt;/p&gt;
&lt;p dir="ltr"&gt;If you think you can write better memory management than the CLR provides, be my guest. Be sure to allow lots of time in your schedule for design, redesign, implementation, testing, fixing, retesting, refixing, reretesting, reredesign, nervous breakdowns... Now CLR memory management does not come without a cost, of course: the CLR itself requires another 1 MB block out of your VM. And other data used by the CLR can add up as well, in the form of different heaps: &lt;/p&gt;
&lt;ul dir="ltr"&gt;
    &lt;li&gt;
    &lt;div&gt;The AppDomain Heap describes the assemblies, modules, and types used by your app. The CLR uses these to find and load and decipher code as you call it. It grows as the overall app+DLLS grow.&lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
    &lt;div&gt;The Process Heap and the Short Term Heap are memory used and discarded by the CLR as it works. These are usually small, usually transitory, and pretty much always beyond your control.&lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
    &lt;div&gt;And finally, the GC (Garbage Collected) Heap itself, where the CLR allocates all of your data (other than large allocations stuck in global storage). Anything in here can be released by your code at any time, and the CLR will Garbage Collect it to free up space when it sees a need.&lt;/div&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So your real limit in a Managed app is: 32 MB, minus the size of Native DLLs in slot 0 (in our case, 5 MB, mostly due to SQL Mobile), minus 1 MB for the CLR, minus the sum of all the heaps (with a minimum around 2 MB). That's how much Native data you can afford. Because remember: &lt;strong&gt;your Native DLLs will allocate memory in your 32 MB VM as well.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;And frankly, for many sorts of handheld apps, that's a lot. But for anything ambitious, anything that really makes customers excited... That's not enough. &lt;/p&gt;
&lt;p&gt;In testing of our app (explanations below), the JIT Heap, the AppDomain Heap, and the GC Heap have climbed to nearly 13 MB. Add in 5 MB for Native DLLs, 1 MB for the CLR, and 1 MB for the Process and Short Term Heap, and we're up to 20 MB out of 32. That's enough to make me nervous. And for large SQL Mobile queries, that may be enough to crash. (SQL Mobile usually crashes when we make a large query with less than 2 MB VM free; but we once saw it crash with 3.4 MB free.) &lt;/p&gt;
&lt;h2&gt;"No. Try not. Do... or do not. There is no try."&lt;/h2&gt;
&lt;p&gt;So now you know the CF 2.0/CE 5.0 memory landscape. You know, kind of, what your limitations are. &lt;/p&gt;
&lt;p&gt;So if your app starts crashing and memory errors seem to be the diagnosis, you need to throw out stuff that might waste memory, right? &lt;/p&gt;
&lt;p&gt;No. Wrong. Stop. Remember this important mantra:&lt;strong&gt; We're not guessing, we're profiling.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;With a lot -- &lt;strong&gt;a lot&lt;/strong&gt; -- of experience, you can begin to guess where system performance problems are, and be right maybe half the time. (And by performance, I include memory usage, CPU usage, and other ways your app might bog down a machine.) But people with that much experience will usually tell you: don't guess, use a profiler. &lt;/p&gt;
&lt;p&gt;Now on the laptop, there are many profiling tools available. On CE 5, not so many. One of the best we could find is &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C8174C14-A27D-4148-BF01-86C2E0953EAB&amp;amp;displaylang=en"&gt;the .NET Compact Framework Remote Performance Monitor&lt;/a&gt;. (That's a link to the CF 3.5 Power Toys from Microsoft; but the RPM in there works fine with CF 2.0.) This tool will tell you the size of your different heaps. It will also take "snapshots" of your GC heap, which will let you see how many objects of different classes are in use, and how much space they consume. (In our case, the worst offender is &lt;strong&gt;14,408 Strings&lt;/strong&gt;, requiring &lt;strong&gt;0.89 MB of storage&lt;/strong&gt;. The top 10 classes for memory usage consume over 2.6 MB out of a 3.3 MB GC heap. I won't know why until I do more research. I have my guesses, but &lt;strong&gt;we're not guessing, we're profiling.&lt;/strong&gt;) &lt;/p&gt;
&lt;p&gt;Another useful memory profiling tool is &lt;a target="_blank" href="http://support.microsoft.com/kb/326164"&gt;DUMPMEM&lt;/a&gt;. (This is targeted at Pocket PC 2002, but still works OK for CE 5.) This tool is a bit verbose, with &lt;strong&gt;a lot&lt;/strong&gt; of nearly unreadable information; but near the end of the report, it spells out all of the apps running on your device, including which unmanaged DLLs each has loaded. &lt;/p&gt;
&lt;p&gt;Beyond those, we found it easiest to write our own profiling tools. They're crude, but they helped us match memory usage to user activities in the application. They rely heavily on &lt;a target="_blank" href="http://www.opennetcf.com/library/sdf/html/d5516377-cde7-1f1d-f035-bcff8a8278ec.htm"&gt;the MemoryManagement class&lt;/a&gt; from the &lt;a target="_blank" href="http://www.opennetcf.com/"&gt;OpenNETCF&lt;/a&gt; libraries. &lt;/p&gt;
&lt;h2&gt;"Tweaking? A project that needs tweaking?"&lt;/h2&gt;
&lt;p&gt;Finally, some general lessons we learned about memory management under CF 2.0 and CE 5.0: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Design for small from the start. Don't try to add it later. Yes, I repeat myself. It bears repeating. &lt;/li&gt;
    &lt;li&gt;We're not guessing, we're profiling. Yes, I repeat myself. It bears repeating. &lt;/li&gt;
    &lt;li&gt;Don't waste time trying to "tweak" your way to sufficient memory. Tweaking is usually a sign that you're guessing, not profiling. We did a lot of little tweaks that saved us a few K here, a hundred K there... Those all made some difference, but at a lot of cost; whereas finding and eliminating the 14,408 cached strings will probably make the difference we need. When you try to tweak to fit, it's like &lt;a target="_blank" href="http://www.youtube.com/watch?v=Ll2kajMH2u0"&gt;Human Tetris&lt;/a&gt;: you &lt;em&gt;might&lt;/em&gt; twist yourself into exactly the right shape; but if you're wrong, you won't know it until you go &lt;strong&gt;splat!&lt;/strong&gt; Instead of tweaking, profile, identify and locate the major leaks, and fix them. Repeat, repeat, repeat. &lt;/li&gt;
    &lt;li&gt;Build memory diagnostics in from the start. You'll curse me now. You'll thank me later. &lt;/li&gt;
    &lt;li&gt;Graph your diagnostics, and identify on the graphs what the user was doing at each major change. That will help you in locating the major leaks. &lt;/li&gt;
    &lt;li&gt;Don't try to outsmart the CLR and the GC. Maybe you are smarter, but do you have time to build and test and maintain your smarter solution? &lt;/li&gt;
    &lt;li&gt;Sometimes, when your code is leaking, it can &lt;em&gt;appear&lt;/em&gt; that the GC is not collecting. It is, at least as much as it can, and I have the graphs to prove it. Trust the GC. &lt;/li&gt;
    &lt;li&gt;Never call GC.Collect() directly. It never helps -- &lt;em&gt;never!&lt;/em&gt; -- and it often hurts. It never helps because the GC is optimized to not waste too much CPU time. If called, it doesn't do any real garbage collection until a trigger has happened: cumulative Managed allocations have passed a megabyte boundary; GDI+ resources (pens, fonts, brushes, etc.) are used up; or memory is used up. If none of those have happened, no garbage is collected. But it &lt;em&gt;may&lt;/em&gt; hurt, because before testing the triggers, it suspends your whole app, including waiting for each thread to reach a "suspendable" state. So though calling GC.Collect() won't save you any memory, it can cost you time. &lt;/li&gt;
    &lt;li&gt;&lt;em&gt;Maybe&lt;/em&gt; call the unmanaged heap compact API. This seldom has had any effect for us; but on rare occasions, it has reclaimed some Virtual Memory for us. We're still kind of undecided. &lt;/li&gt;
    &lt;li&gt;If you can, wait for CE 6.0. It has a radically expanded memory mapping scheme, including 2 GB of VM per process. If that's not enough, you don't understand that the "C" in "CF" and "CE" stands for "Compact", as in "tiny". If 2 GB is too tiny for you, you're on the wrong platform. But as of this writing, there are &lt;em&gt;no&lt;/em&gt; production devices running CE 6.0. &lt;/li&gt;
    &lt;li&gt;Consider this: is a &lt;a target="_blank" href="http://www.microsoft.com/windows/products/winfamily/umpc/default.mspx"&gt;UMPC&lt;/a&gt; compact enough for your customers? It's small. It's portable. And it will run the same code as your laptop does. (For us, the answer is no; but maybe you'll have a different answer...) &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;"Think it'll work?" "It would take a miracle."&lt;/h2&gt;
&lt;p&gt;Actually, no, you won't need a miracle to live within the memory limits of CF 2.0 and CE 5.0. You'll just need awareness, design, profiling, patience, perseverance, and maybe a little bit of luck. And maybe I've given you a few more rabbits for your hat. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127125"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127125" 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/UlteriorMotiveLounge/aggbug/127125.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dr.-strained-memory-or-how-i-learned-to-stop-worrying.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:53:26 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127125.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dr.-strained-memory-or-how-i-learned-to-stop-worrying.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127125.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Don't Make Me Send Yoda Over There to Whack You With a Stick...</title>
            <category>Development Processes</category>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dont-make-me-send-yoda-over-there-to-whack-you.aspx</link>
            <description>&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1397"&gt;
&lt;div&gt;15.5 hours in to what I hoped would be a 5 hour day...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Working the last major bug on the bug list...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;A bug that has literally consumed over 200 hours of development spread among various team members...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;A bug that our best minds looked at, and looked at, and looked at, to no avail...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;A bug that got the project lead so frustrated, he did the programming equivalent of taping electrical tape over the blinking VCR clock...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And today, the black-electrical-tape patch started showing massive bugs of its own...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;So we hunted... And we searched... And I got an idea for some code I could scavenge from another project...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Still didn't work... But that gave me a hint of where to look, because &lt;em&gt;none&lt;/em&gt; of our hypothesized causes could've afflicted this new code...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Whatever was wrong was low level and fundamental... And one of my coworkers told me the sort of thing it looked like to him... And that gave me another hint...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And so I started the process of elimination... Comment out code until it worked, uncomment until it broke again, and narrow in on the single line that made the difference...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And I found it:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;div&gt;Application.DoEvents();&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div dir="ltr"&gt; &lt;/div&gt;
&lt;div dir="ltr"&gt;That means "Let the UI do whatever it wants. I can wait for it."&lt;/div&gt;
&lt;div dir="ltr"&gt; &lt;/div&gt;
&lt;div dir="ltr"&gt;My boss had been finding Application.DoEvents() all through parts of the code... And the only explanation mentioned anywhere was, "Well, we tried this, and it worked. So we kept it."&lt;/div&gt;
&lt;div dir="ltr"&gt; &lt;/div&gt;
&lt;div dir="ltr"&gt;Yoda was right: Do, or do not... There is no "try"...&lt;/div&gt;
&lt;div dir="ltr"&gt; &lt;/div&gt;
&lt;div dir="ltr"&gt;&lt;strong&gt;If you don't understand how the code works, it doesn't.&lt;/strong&gt;&lt;/div&gt;
&lt;div dir="ltr"&gt; &lt;/div&gt;
&lt;div dir="ltr"&gt;Don't make me send Yoda over there to whack you with a stick...&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127123"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127123" 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/UlteriorMotiveLounge/aggbug/127123.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dont-make-me-send-yoda-over-there-to-whack-you.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:49:38 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127123.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/dont-make-me-send-yoda-over-there-to-whack-you.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127123.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Take Pity on the Poor Maintenance Coder</title>
            <category>Development Processes</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/take-pity-on-the-poor-maintenance-coder.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1388" bv:cns="cns!2D0DCE281FBB99D!1388" bv:ca="true" bv:cat="Code Is Not Enough"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1388"&gt;
&lt;div&gt;It might be you.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127122"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127122" 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/UlteriorMotiveLounge/aggbug/127122.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/take-pity-on-the-poor-maintenance-coder.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:47:45 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127122.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/take-pity-on-the-poor-maintenance-coder.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127122.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Process is a Lie</title>
            <category>Development Processes</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/process-is-a-lie.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1034" bv:cns="cns!2D0DCE281FBB99D!1034" bv:ca="true" bv:cat="Code Is Not Enough"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1034"&gt;
&lt;p&gt;Process is a lie. All of it. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you're spitting and fuming because you believe in software development processes, bear with me. I have a point to make, and you'll enjoy it. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you've never believed in software development processes and you're cheering me on, take a seat and a deep breath. I have a point to make, and you're not gonna like it. But you need to hear it.&lt;/em&gt; &lt;/p&gt;
&lt;h1&gt;Process is a Lie? &lt;/h1&gt;
&lt;p&gt;Process is a lie, because process is a plan for how we'll work. And plans are lies. All of them. &lt;/p&gt;
&lt;p&gt;A plan says, "This is what will happen, and this is what we'll do." A more realistic plan says, "This is what will happen, and this is what we'll do. These are things that &lt;em&gt;could&lt;/em&gt; happen instead, and this is how we'll handle them." And a truly realistic plan says, "This is what will happen, and this is what we'll do. These are things that &lt;em&gt;could&lt;/em&gt; happen instead, and this is how we'll handle them. And in case something happens that we haven't foreseen, these are the resources we keep in reserve and the options we keep open." &lt;/p&gt;
&lt;p&gt;And even truly realistic plans fail. Nineteenth century German Field Marshall Helmuth Graf von Moltke told us: "No battle plan survives contact with the enemy." &lt;/p&gt;
&lt;p&gt;Some developers and teams are process averse. And one common reason is that they've experienced plenty of process failures. &lt;/p&gt;
&lt;p&gt;And yet Field Marshall von Moltke made plenty of battle plans. He wasn't saying "Plans are bad." He was saying "Plans are never enough. But they're still essential." &lt;/p&gt;
&lt;p&gt;Process is never enough. But it's still essential. Process failure &lt;em&gt;might&lt;/em&gt; indicate a flaw in that particular process; but often, it indicates that no process survives contact with the enemy. &lt;/p&gt;
&lt;p&gt;Now the enemy in this case is not the customer (at least, not if your customer relations are healthy). The problem itself is the enemy, and your team is the invading army, trying to find its weak points, pick it apart, and conquer it. And the problem fights back! It hides minor details until they become critical. It changes due to unforeseen circumstances. It's a lot bigger than it looks. And sometimes it draws a lot of its problem friends into the battle when you least expect them. &lt;/p&gt;
&lt;p&gt;Your process is your battle plan; and it &lt;em&gt;is&lt;/em&gt; wrong, in ways you can't foresee until they happen. But that doesn't make it wrong. &lt;/p&gt;
&lt;h1&gt;Wrong, but Not Wrong? &lt;/h1&gt;
&lt;p&gt;OK, now Martin's getting confusing: it's wrong, but it's not wrong. What gives? Well, a plan can be (&lt;em&gt;will&lt;/em&gt; be) wrong in details and yet still be right overall. Like all plans, your process is what you expect to do, not what you actually end up doing. A process or plan establishes a basic framework for how you'll handle the simple, mundane matters that arise; but realism tells us that things are going to happen that aren't covered by the plan. The process guides you in handling what you can foresee, so that you can spare more attention and thought for the eventualities you can't foresee. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The plan or process lets you handle simple stuff without thinking, so you have more thought to devote to the hard stuff. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So a well-designed process is good, as far as it goes; but you have to be ready to step outside it or beyond it when the need arises. And a &lt;em&gt;really good&lt;/em&gt; process includes a process for changing or sidestepping the process. The &lt;a href="http://www.constitution.org/constit_.htm"&gt;U.S. Constitution&lt;/a&gt; includes an amendment process for this reason. &lt;/p&gt;
&lt;p&gt;One of the most common sources of process disillusionment is &lt;a href="http://en.wikipedia.org/wiki/ISO_9000"&gt;the ISO-9000 family of standards for quality management systems&lt;/a&gt;. Many an organization has implemented failed ISO-9000 initiatives; and while I won't name names to protect the not-quite-innocent, more than one organization has implemented "pretend" ISO-9000 initiatives to attain certification, but never really follow their own standards. &lt;/p&gt;
&lt;p&gt;And yet ISO-9000 is, at its core, a good &lt;em&gt;process for designing processes&lt;/em&gt;. It really amounts to this: &lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Document what your process is. &lt;/li&gt;
    &lt;li&gt;Document how you gather data and measure it. &lt;/li&gt;
    &lt;li&gt;Document how you correct it when it fails. &lt;/li&gt;
    &lt;li&gt;Document how you change it when needed. &lt;/li&gt;
    &lt;li&gt;Document how you handle exceptions when needed. &lt;/li&gt;
    &lt;li&gt;Document how you'll train people in the process. &lt;/li&gt;
    &lt;li&gt;Document that you're following the process, including data. &lt;/li&gt;
    &lt;li&gt;Document that you're correcting when needed. &lt;/li&gt;
    &lt;li&gt;Document the exceptions when they happen. &lt;/li&gt;
    &lt;li&gt;Document training results. &lt;/li&gt;
    &lt;li&gt;Document changes to your process. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Forgive me if I'm being dense, but what could be wrong with &lt;em&gt;any&lt;/em&gt; of those items? &lt;/p&gt;
&lt;p&gt;No, when ISO-9000 fails, it's almost never because of ISO-9000 itself. Rather, it's because your process stinks; and when you're process stinks, either your team abandons it, or they blindly follow it. In some cases, the stinky process comes from outside "experts" or consultants who don't know how your team actually works. Often it's a "canned" process that the team is "shoehorned" into, with disastrous results. &lt;/p&gt;
&lt;p&gt;What's missing, then, is an often-overlooked step 0: &lt;strong&gt;Decide what your process &lt;em&gt;really&lt;/em&gt; is.&lt;/strong&gt; Don't let some outsider tell your team their process; ask your team what their process is. Ask them questions and get them thinking about it. And &lt;em&gt;then&lt;/em&gt; document it, document your data, etc., etc., etc. &lt;/p&gt;
&lt;p&gt;Yes, it's possible that your team needs to learn and adopt better processes. Absolutely. But the wrong process can be worse than no process at all. If your team isn't ready or able to be &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!993.entry"&gt;circus horses&lt;/a&gt;, then a circus horse process &lt;em&gt;will&lt;/em&gt; fail. You can cajole and fume and order and threaten all you want, and it won't change anything: some teams aren't ready or suited for some levels of formality. &lt;em&gt;Or&lt;/em&gt; informality: some people adapt well to more formal processes, and find informal processes to be chaotic time-wasters. They're proud circus horses, not smelly, dirty cattle. &lt;/p&gt;
&lt;h1&gt;CAFÉ, or CAFÉ? Your Choice… &lt;/h1&gt;
&lt;p&gt;So yes, you need a development process, whether you think you do or not. In fact, if you don't think you have a process, you're probably following the most common development process, CAFÉ: &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://byfiles.storage.live.com/y1pHGNmJSJ6sradVSPpVQ9IL3QHGBnOHYoSiXWgV_8FcQ57clew4w0lU2mr-GsaCtlIifhWPkLS_k4"&gt;&lt;img style="WIDTH: 255px; HEIGHT: 217px" height="200" alt="CAFE" width="238" src="http://byfiles.storage.live.com/y1pHGNmJSJ6sradVSPpVQ9IL3QHGBnOHYoSiXWgV_8FcQ57clew4w0lU2mr-GsaCtlIifhWPkLS_k4" /&gt;&lt;/a&gt;&lt;a target="_blank" href="http://byfiles.storage.live.com/y1pHGNmJSJ6sraggezXijVi8csvrgibsH-793C4LnxddM4y2FNpWdQMhyGYj706Fh77s457Tdjivso"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 5: CAFÉ – Code And Fix, Endlessly&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;And if you're &lt;em&gt;really&lt;/em&gt; lucky, sometimes you hit the end of that process. Maybe. &lt;em&gt;If&lt;/em&gt; you define "Bugs" in a very forgiving fashion. &lt;/p&gt;
&lt;p&gt;The trick is finding the &lt;em&gt;right&lt;/em&gt; process, one that fits well how you're already working. Then try to describe that process so that you and your team can reach a common process. Then document that process. Then apply that process, and see where it falls short, and make it better over time. &lt;/p&gt;
&lt;p&gt;Most popular software development processes today are &lt;em&gt;incremental&lt;/em&gt;, building small chunks of functionality and then adding more over time. Why? Because that way you never get too far down a wrong path. You get quick feedback on what you're doing right and wrong. And then you fix the code that's wrong. (In fact, these incremental processes are all, at their core, more structured descendants of CAFÉ.) &lt;/p&gt;
&lt;p&gt;Well, developing your development process should also be incremental. &lt;em&gt;Don't&lt;/em&gt; try to change everything overnight. &lt;em&gt;Do&lt;/em&gt; try to change. Then look at what worked, and do more of it. Look at what didn't work, and fix it. Repeat, repeat, repeat. When it comes to your process, you want the &lt;em&gt;other&lt;/em&gt; CAFÉ: Change And Fix, Endlessly. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127121"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127121" 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/UlteriorMotiveLounge/aggbug/127121.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/process-is-a-lie.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:44:59 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127121.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/process-is-a-lie.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127121.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The Horse and the Stag</title>
            <category>Aesop's Fables of Software Development</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-horse-and-the-stag.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1031" bv:cns="cns!2D0DCE281FBB99D!1031" bv:ca="true" bv:cat="Aesop’s Fables of Software Development"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1031"&gt;
&lt;p style="MARGIN-LEFT: 36pt"&gt;AT ONE TIME the Horse had the plain entirely to himself. Then a Stag intruded into his domain and shared his pasture. The Horse, desiring to revenge himself on the stranger, asked a man if he were willing to help him in punishing the Stag. The man replied that if the Horse would receive a bit in his mouth and agree to carry him, he would contrive effective weapons against the Stag. The Horse consented and allowed the man to mount him. From that hour he found that instead of obtaining revenge on the Stag, he had enslaved himself to the service of man. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1004.entry"&gt;Aesop's&lt;/a&gt; lesson here is about the dangers of Lock In: once you choose a tool or platform, you've surrendered some control to that tool or platform. You need to be wary of Lock In. A tool may lack features you need, or may provide them is a substandard form. A tool can force you to take steps and work in ways that may be wrong for your project, or may not fit your skill set. And Lock In can also leave you stranded if your tool supplier goes out of business; and it can leave you just as stranded if your tool supplier comes up with a new tool and stops supporting the old one. So put not your faith in tools! &lt;/p&gt;
&lt;p&gt;But doesn't that conflict with &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1006.entry"&gt;The Boy and the Nettles&lt;/a&gt;, where Aesop advised you… &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you choose a platform, use the platform. Grasp the nettle boldly. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;…? &lt;/p&gt;
&lt;p&gt;Well, there's not a conflict there, so much as a tension between two forces. It's important to know that both forces are at work: the benefits of a tool, and the risks of a tool. You don't get one without the other. The key is to find the tool with the most benefits &lt;strong&gt;for your project&lt;/strong&gt; and the fewest risks &lt;strong&gt;for your project&lt;/strong&gt;; and then study the risks, see how they affect you, and decide a plan to work around them. Find the right balance of benefits vs. risk. &lt;/p&gt;
&lt;p&gt;Let's look at our three risk areas in more detail: &lt;a href="http://tabletuml.spaces.live.com/mmm2007-10-25_18.59/#_Tool_Risk:_Lack"&gt;lack of features&lt;/a&gt;, &lt;a href="http://tabletuml.spaces.live.com/mmm2007-10-25_18.59/#_Tool_Risk:_Lack_1"&gt;lack of fit&lt;/a&gt;, and &lt;a href="http://tabletuml.spaces.live.com/mmm2007-10-25_18.59/#_Tool_Risk:_Lack_2"&gt;lack of support&lt;/a&gt;. &lt;/p&gt;
&lt;h1&gt;Tool Risk: Lack of Features &lt;/h1&gt;
&lt;p&gt;One way to have the fewest risks is to choose a tool with a large number of features and capabilities. As I explained in &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1006.entry"&gt;The Boy and The Nettles&lt;/a&gt;, that's one benefit of &lt;a href="http://support.microsoft.com/?scid=ph;en-us;8291"&gt;.NET development&lt;/a&gt;: no matter what common development task you can name, it's in there. For .NET 1.0, I made a presentation called &lt;strong&gt;.NET is an Elephant&lt;/strong&gt;. With art courtesy of my lovely wife Sandy, I created this image: &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://byfiles.storage.live.com/y1pHGNmJSJ6srawydod5E16InkbsPoFUlvdmaecCOpwp01zhJu640VZY_t4wm47MW5WTih_qfZPMv8"&gt;&lt;img height="200" alt="NET Elephant" width="243" src="http://byfiles.storage.live.com/y1pHGNmJSJ6srawydod5E16InkbsPoFUlvdmaecCOpwp01zhJu640VZY_t4wm47MW5WTih_qfZPMv8" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 3: .NET is an Elephant&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;My point was to convey that there's a &lt;em&gt;lot&lt;/em&gt; in .NET. If I were to actually list all of the feature sets, you wouldn't see the elephant for the words. &lt;/p&gt;
&lt;p&gt;And then with .NET 2.0, I expanded the picture: &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://byfiles.storage.live.com/y1pHGNmJSJ6srYprXZ8huTcvXByD7Dyj0eHb8zO5q9wj058q0neZZx6X4HyIXBic02IFSk8VKHWtZ0"&gt;&lt;img height="180" alt="NET Elephant 2" width="300" src="http://byfiles.storage.live.com/y1pHGNmJSJ6srYprXZ8huTcvXByD7Dyj0eHb8zO5q9wj058q0neZZx6X4HyIXBic02IFSk8VKHWtZ0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 4: .NET is a Whole Lotta Elephants!&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;And again, I would need a whole circus parade to list even some of the .NET 2.0 features. And then 3.0, and 3.5, and WPF, and WCF, and WF, and Live, and Silverlight, and HealthVault, and Windows Automotive, and… Well, suffice it to say, lack of feature support should &lt;em&gt;not&lt;/em&gt; be a worry for .NET developers. (Lack of time to learn them all, on the other hand…) &lt;/p&gt;
&lt;p&gt;And you can find rich-featured tools for other platforms as well. Don't ask me for guidance! I've got too much to learn just keeping up with .NET. I can read up on what's being done with other tools and platforms, but there's no time for me to gain deep knowledge. (I would start by asking &lt;a href="http://srtsolutions.com/blogs/diannemarsh/default.aspx"&gt;Dianne Marsh&lt;/a&gt;.) &lt;/p&gt;
&lt;p&gt;Now a separate question is whether your tool provides &lt;em&gt;good&lt;/em&gt; support for the feature you need. I won't repeat myself on the choices involved there. Go back and read &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1006.entry"&gt;The Boy and The Nettles&lt;/a&gt; for my advice on that. &lt;/p&gt;
&lt;h1&gt;Tool Risk: Lack of Fit &lt;/h1&gt;
&lt;p&gt;If your tool doesn't fit your problem or your constraints, that can be difficult; but often, you can create a technological bridge for this. It may not be efficient; but often, it's easier and faster than creating your own solution from scratch. &lt;em&gt;And&lt;/em&gt; it may be more efficient, as well, unless you're a genius who's sure you can come up with a better solution right out of the gate. &lt;/p&gt;
&lt;p&gt;As an example, for a while there was a fairly thriving consulting niche for people who could produce &lt;a href="http://www.adobe.com/products/acrobat/adobepdf.html"&gt;PDF files&lt;/a&gt; from online forms. Users would fill in the forms, the system would create a PDF, and then the system would either display the PDF in a Web page or email it to the user. At the time, the most popular and common tool for building PDFs was &lt;a href="http://www.adobe.com/"&gt;Adobe's&lt;/a&gt; Acrobat Writer; but that was a desktop application, and the system required access via the Web. So the niche was in creating Web server plug-ins (using various technologies) that would feed documents to Acrobat Writer, gather up the results, and return them to the server. Today, there are canned solutions for this; but at the time, &lt;em&gt;any&lt;/em&gt; solution was better than none. Acrobat Writer didn't fit the Web, but we could make it fit. &lt;/p&gt;
&lt;p&gt;But if your tool doesn't fit your team, that's a more serious problem. Don't assume your team can learn a new tool too quickly. Nothing against your team, it's just that power tools usually have a lot of depth and complexity beneath an easy, appealing surface. So make sure you give your team learning time. Get them books. Send them to conferences. And yes, though I have self interest in saying so, send them to classes! Sometimes an expert can show them in five minutes what they would spend weeks digging out on their own. &lt;/p&gt;
&lt;p&gt;And &lt;em&gt;if&lt;/em&gt; you can find them, hire some experts to come in as tool gurus or mentors. &lt;/p&gt;
&lt;h1&gt;Tool Risk: Lack of Support &lt;/h1&gt;
&lt;p&gt;Sometimes managers worry, "What if our tool vendor goes out of business?" If you're using .NET, I think this is a very low risk. &lt;a href="http://moneycentral.msn.com/detail/stock_quote?symbol=MSFT"&gt;A market cap of &lt;strong&gt;$340 billion&lt;/strong&gt;&lt;/a&gt; doesn't disappear overnight. In fact, I'll make a bold prediction right now: Microsoft will still be a significant factor in the software development market ten years from now. I made that prediction a decade ago, and people laughed at me. They were sure that Linux was going to "finally kill Microsoft". (You have to imagine the glee in their eyes when they said this…) I was right, and they were wrong. Well, I'm predicting it again: no company is guaranteed to last forever (&lt;a href="http://www.lloyds.com/About_Us/History/Chronology.htm"&gt;Lloyd's of London&lt;/a&gt; notwithstanding), but Microsoft will still be big a decade from now. I've got a free dinner I'm willing to bet on it. Any takers? &lt;/p&gt;
&lt;p&gt;So Microsoft will still be around; but what if they stop supporting .NET? That's a more serious concern, since Microsoft has rather radically overhauled their core technologies over the past decade. Large companies with long-range planning like to amortize strategic technology investments over as long as 15 years! Well, Microsoft usually phases out support for old technologies over 10 years, and stops most active support over 5, give or take. And the "dominance" of a given Microsoft OS is even shorter. For example, they have released seven consumer OSes in the last 15 years: Windows 3.0, Windows 3.1 (different enough that I think it deserves to be listed separately), Windows 95, Windows 98, Windows Millenium Edition (painful flashbacks…), Windows XP Home, and Windows Vista Home. That's barely two years each! &lt;/p&gt;
&lt;p&gt;But the underlying technologies are changing more slowly: 95, 98, and ME had a lot of common core; and XP and Vista are first cousins at the farthest. If I write .NET code, &lt;em&gt;most&lt;/em&gt; of what I wrote works equally well on XP as on Vista. &lt;/p&gt;
&lt;p&gt;And beyond that, I can offer only this observation, somewhere between faith and prediction: in my recent experience, when a new Microsoft tool makes an old one obsolete, I find that the new one is superior on so many fronts that it's a clear benefit to adopt it; and &lt;em&gt;one&lt;/em&gt; of those fronts is that it's easier to learn and adopt. So instead of feeling that I might "lose time" by investing in and using new tools that may go away, I find that I &lt;em&gt;gain time&lt;/em&gt; by using something that's easier and leads to a solution faster than the previous tools I was using. Plus the &lt;em&gt;next&lt;/em&gt; new tools will usually build on pieces of the &lt;em&gt;current&lt;/em&gt; new tools, so time spent learning the tools today usually pays off with the tools tomorrow. &lt;/p&gt;
&lt;p&gt;But you say, "But we're a Mac shop!" Well, &lt;a href="http://moneycentral.msn.com/detail/stock_quote?symbol=AAPL"&gt;Apple will probably last the decade, too&lt;/a&gt;, so the same basic principles apply. &lt;/p&gt;
&lt;p&gt;"But unlike Martin, I'm not a Microsoft toadie," you say. Or "But our critical tool provider is a &lt;em&gt;lot&lt;/em&gt; smaller than Microsoft." Well, there are no guaranteed answers. There's no guarantee &lt;em&gt;your&lt;/em&gt; company will be around in 10 years to support &lt;em&gt;your&lt;/em&gt; customers. And there's &lt;em&gt;almost&lt;/em&gt; a guarantee that whoever you assign to write your own solutions won't be around in 10 years to maintain it. 5 years is iffy. And let's be honest: unless it's a core piece of the code that the developers spend most of their time in, they'll forget how it works in six months. Well, maybe three. Or one… So writing your own solution isn't much less risky than trusting to a reliable tool vendor. (See &lt;a href="http://tabletuml.spaces.live.com/blog/cns!2D0DCE281FBB99D!1006.entry"&gt;The Boy and The Nettles&lt;/a&gt; for more thoughts on this.) Now &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1590590872/martinlshoema-20"&gt;good design practices&lt;/a&gt; can help mitigate that risk, but not eliminate it. &lt;/p&gt;
&lt;p&gt;That sort of risk is one motivation for Open Source development: if it's Open Source, then you can always fix it yourself if you have to; and there's a chance other people in the community are maintaining it; and you can find support forums online. Sometimes that works; but sometimes Open Source projects get abandoned. And sometimes some good Open Source Version 1 products become Closed Source Version 2 products, once the producers have established a market for them. Nothing wrong with that; but it means you either have to stick with and maintain the old version, or go back to trusting a vendor to stay in business and support a product. &lt;/p&gt;
&lt;p&gt;Honestly, while this risk is non-zero, I think it's exaggerated. I'll take a small risk with a really good tool any time. If you do your homework and check reviews on the tool, you can minimize the risk. And unless the tool is core to your business, making your own is a greater risk. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127120"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127120" 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/UlteriorMotiveLounge/aggbug/127120.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-horse-and-the-stag.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:42:54 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127120.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/the-horse-and-the-stag.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127120.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Aesop’s Fables of Software Development</title>
            <category>Aesop's Fables of Software Development</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/aesops-fables-of-software-development.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1004" bv:cns="cns!2D0DCE281FBB99D!1004" bv:ca="true" bv:cat="Aesop’s Fables of Software Development"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1004"&gt;
&lt;p&gt;&lt;em&gt;2500 years ago, a man named Aesop gathered the accumulated software development knowledge of the ancient Greeks, and presented the knowledge to history. However, since so few people in the intervening millennia knew anything about software, they misinterpreted Aesop's lessons as simple morality fables, rather than as hard advice for software managers. Now you can learn what Aesop had to teach us about software development processes and management. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The pioneering programmer known as &lt;a href="http://en.wikipedia.org/wiki/Aesop"&gt;Aesop&lt;/a&gt; is still studied today; but we tend to forget his role as a programmer, due mainly to the limitations of his hardware platform: &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://byfiles.storage.live.com/y1pHGNmJSJ6sraIrfWpFL_RvBZnhds7AiZjZEvlvZE0C7gyp2sj6SmkiBHhz01Y5xSTuyotijk0M-0"&gt;&lt;img height="200" alt="Aesop's Computer" width="191" src="http://byfiles.storage.live.com/y1pHGNmJSJ6sraIrfWpFL_RvBZnhds7AiZjZEvlvZE0C7gyp2sj6SmkiBHhz01Y5xSTuyotijk0M-0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: Aesop's Computer &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As any programmer can tell you, everything comes down to &lt;a href="http://tabletuml.spaces.live.com/mmm2007-10-25_18.59/#NoteToHardwareTechsAndEndUsers"&gt;hardware problems&lt;/a&gt;. In Aesop's case, these included: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Hertz. Not giga, not mega, not even kilo. Hertz. &lt;/li&gt;
    &lt;li&gt;No GUI. Not even Windows 1.0. &lt;/li&gt;
    &lt;li&gt;It was imported from China. The shipping time for replacement parts was a bummer. &lt;/li&gt;
    &lt;li&gt;It was programmed in an obscure language: Φ. (Later Φ++.) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And as any programmer can also tell you, if it's not a hardware problem, it's a &lt;a href="http://tabletuml.spaces.live.com/mmm2007-10-25_18.59/#NoteToHardwareTechsAndEndUsers"&gt;user problem&lt;/a&gt;: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Users didn't know what they wanted. &lt;/li&gt;
    &lt;li&gt;Users kept changing their minds. &lt;/li&gt;
    &lt;li&gt;Users were impatient. &lt;/li&gt;
    &lt;li&gt;Users didn't want to pay for quality. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Sadly, while hardware has improved since Aesop, users never change…) &lt;/p&gt;
&lt;p&gt;So because of problems beyond his control, Aesop never shipped a product; but he &lt;em&gt;did&lt;/em&gt; learn a lot about development practices and project management. His best practices captured in a book: ΑΕΣΟΠ Φ ΑΒΑΚΥΣ. This was later mistranslated as "Aesop's Fables". When the art of programming was lost (in the &lt;a href="http://en.wikipedia.org/wiki/Library_of_Alexandria"&gt;Library of Alexandria&lt;/a&gt;, naturally), later translators misunderstood Aesop's masterwork. For the most part, they missed the point of his lessons entirely, interpreting them as simple morality lessons. &lt;/p&gt;
&lt;p&gt;But now, thanks to recent X-ray images of scrolls from Pompeii (and way too much time on my hands), I've restored Aesop's lessons for you in this series of essays. Look for three overarching themes: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Better programming techniques. &lt;/li&gt;
    &lt;li&gt;Better process techniques. &lt;/li&gt;
    &lt;li&gt;How could we be so stupid? &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a&gt;Note to hardware techs and end users… &lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No, I don't really think hardware and users are the cause of all problems. We're all in this together, all contributing to problems and all contributing to solutions. But when talking with programmers, some jokes are just expected. (Don't even get me started on manager jokes…) &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127119"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127119" 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/UlteriorMotiveLounge/aggbug/127119.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/aesops-fables-of-software-development.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:39:12 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127119.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/aesops-fables-of-software-development.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127119.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Murphy’s Dictionary: Short Cut</title>
            <category>Murphy's Dictionary</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-short-cut.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!1030" bv:cns="cns!2D0DCE281FBB99D!1030" bv:ca="true" bv:cat="Murphy's Dictionary"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!1030"&gt;
&lt;p&gt;&lt;strong&gt;Short Cut&lt;/strong&gt; (&lt;em&gt;n&lt;/em&gt;): Something that will take longer and cost more, but might gain some immediate goal. (Odds of gaining that immediate goal average around 7.3%.) &lt;/p&gt;
&lt;p&gt;Example: "Yeah, we know we needed to test that, but it would take all week. We need to ship today, so we're going to take this short cut instead: we'll test &lt;em&gt;after&lt;/em&gt; we ship." &lt;/p&gt;
&lt;p&gt;Commentary: Really, if the short cut were a good idea, why didn't you plan to do it that way in the first place? As Professor Tolkien wrote, "Short cuts make long delays." Or as I keep telling people: Short cuts take longer and cost more, every single time. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127118"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127118" 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/UlteriorMotiveLounge/aggbug/127118.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-short-cut.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:35:55 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127118.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-short-cut.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127118.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Murphy's Dictionary: Show Stopper</title>
            <category>Murphy's Dictionary</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-show-stopper.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!171" bv:cns="cns!2D0DCE281FBB99D!171" bv:ca="true" bv:cat="Murphy's Dictionary"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!171"&gt;
&lt;div&gt;&lt;strong&gt;Show Stopper&lt;/strong&gt; (&lt;em&gt;n&lt;/em&gt;): The largest bug that isn't fixed yet.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Example: "Last week, the show stopper was that the brakes cut out. This week, the show stopper is that the buttons are cyan instead of teal."&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127117"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127117" 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/UlteriorMotiveLounge/aggbug/127117.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-show-stopper.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:34:30 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127117.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary-show-stopper.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127117.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Murphy’s Dictionary</title>
            <category>Murphy's Dictionary</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!998" bv:cns="cns!2D0DCE281FBB99D!998" bv:ca="true" bv:cat="Murphy's Dictionary"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!998"&gt;
&lt;p&gt;What would you get if you married Ambrose Bierce's &lt;a target="_blank" href="http://www.alcyone.com/max/lit/devils/c.html"&gt;Devil's Dictionary&lt;/a&gt;… &lt;/p&gt;
&lt;p style="MARGIN-LEFT: 36pt"&gt;CYNIC, &lt;em&gt;n&lt;/em&gt;. &lt;/p&gt;
&lt;p style="MARGIN-LEFT: 36pt"&gt;A blackguard whose faulty vision sees things as they are, not as they ought to be. Hence the custom among the Scythians of plucking out a cynic's eyes to improve his vision. &lt;/p&gt;
&lt;p style="TEXT-ALIGN: justify"&gt;…with the engineering adage &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Murphy's_law"&gt;Murphy's Law&lt;/a&gt;… &lt;/p&gt;
&lt;p style="MARGIN-LEFT: 36pt; TEXT-ALIGN: justify"&gt;If there's more than one possible outcome of a job or task, and one of those outcomes will result in disaster or an undesirable consequence, then somebody will do it that way. &lt;/p&gt;
&lt;p style="TEXT-ALIGN: justify"&gt;…? &lt;/p&gt;
&lt;p&gt;Murphy's Dictionary: an ongoing series of definitions of what words &lt;em&gt;really&lt;/em&gt; mean on a typical development project. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127116"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127116" 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/UlteriorMotiveLounge/aggbug/127116.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:32:32 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127116.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/murphys-dictionary.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127116.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Code Is Not Enough</title>
            <category>Code is not Enough</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/code-is-not-enough.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!2D0DCE281FBB99D!997" bv:cns="cns!2D0DCE281FBB99D!997" bv:ca="true" bv:cat="Code Is Not Enough"&gt;
&lt;div class="bvMsg" id="msgcns!2D0DCE281FBB99D!997"&gt;
&lt;p&gt;So you're a coding ace. You know the latest languages. You use the latest tools. You even write your own tools, so your development environment practically reads your mind. You eat, sleep, and breathe code. &lt;/p&gt;
&lt;p&gt;So why do you keep missing your deadlines? &lt;em&gt;Code is not enough.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;You love to code. You can hardly believe that people pay you to "work" at a hobby you often do for no pay at all. You're never without a few personal projects under development. &lt;/p&gt;
&lt;p&gt;So why do you feel so stressed at work? &lt;em&gt;Code is not enough.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;Code may be the fun part of programming, but it's only a small part of the development process. It's not enough to see you through a tough project. It's not enough to help you develop business and meet requirements. It's not enough to make your project a success. &lt;/p&gt;
&lt;p&gt;Code is not enough. And in these essays, I'll discuss the rest of the development process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127115"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127115" 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/UlteriorMotiveLounge/aggbug/127115.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/code-is-not-enough.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:31:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127115.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/code-is-not-enough.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127115.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ulterior Motive Lounge Episode 23: Girls Just Wanna Write Code</title>
            <category>Ulterior Motive Lounge</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-23-girls-just-wanna-write-code.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!B4665B67C2981533!562" bv:cns="cns!B4665B67C2981533!562" bv:ca="true" bv:cat="Ulterior Motive Lounge"&gt;
&lt;div class="bvMsg" id="msgcns!B4665B67C2981533!562"&gt;
&lt;p&gt;In &lt;a href="http://theumlguy.spaces.live.com/blog/cns!B4665B67C2981533!555.entry"&gt;our last Episode&lt;/a&gt;, Linguist Coder and Prototype Analyst kidnapped The UML Guy and demanded he explain arrows in UML. After a rescue by the police, The UML Guy returns to the Lounge. (Click the picture for a larger image.) &lt;/p&gt;
&lt;p&gt;&lt;a href="http://5rhwsa.blu.livefilestore.com/y1p3c35XhsesiTa78bvey1rrKvj68Gaypl0TTLtDp4aFgObgGmeN0tV0b9oglb6vSNG7QItiRCie36RY3f_yF70DQ?PARTNER=WRITER"&gt;&lt;img height="496" alt="Episode 23" width="773" border="0" src="http://5rhwsa.blu.livefilestore.com/y1p9zxy8rAACrNOlNNpQ9Z3ZxoflRbDCJ-zPmxPvp3xpXr59ZNOqabG-l__dJcwRS_xv5rbdjI-BKSj69BRScCl7w?PARTNER=WRITER" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This one is for &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/04/04/who-is-jennifer-marsman.aspx"&gt;Jennifer Marsman&lt;/a&gt;, who is quite possibly the second-most-fanatical UML geek that I know. She's also the creator of &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/tags/Featured+Women+in+Tech/default.aspx"&gt;Featured Women in Technology&lt;/a&gt;, an ongoing series of profiles on women who shine in technology fields. Jennifer does her part to show young women that technology isn't an all-men's club. And boy, is she right! Besides her profiles of &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/06/13/featured-woman-in-technology-dianne-marsh.aspx"&gt;Dianne Marsh&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/05/30/featured-woman-in-technology-katy-kneale.aspx"&gt;Katy Kneale&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/05/16/featured-woman-in-technology-janet-galore.aspx"&gt;Janet Galore&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/05/09/featured-woman-in-technology-carey-payette.aspx"&gt;Carey Payette&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/04/25/featured-woman-in-technology-amity-binkert.aspx"&gt;Amity Binkert&lt;/a&gt;, and &lt;a target="_blank" href="http://blogs.msdn.com/jennifer/archive/2008/04/18/featured-woman-in-technology-lidiane-souza.aspx"&gt;Lidiane Souza&lt;/a&gt;, I would add (off the top of my head) &lt;a target="_blank" href="http://twitter.com/lynnmolenkamp"&gt;Lynne Molenkamp&lt;/a&gt;, &lt;a target="_blank" href="http://twitter.com/crazeegeekchick"&gt;Dana Coffey&lt;/a&gt;, &lt;a target="_blank" href="http://www.dasblonde.net/2007/06/24/WCFWebcastSeries.aspx"&gt;Michelle Leroux Bustamante&lt;/a&gt;, &lt;a target="_blank" href="http://www.poppendieck.com/"&gt;Mary Poppendieck&lt;/a&gt;, &lt;a target="_blank" href="http://www.thedatafarm.com/blog/"&gt;Julie Lerman&lt;/a&gt;, &lt;a target="_blank" href="http://visuallounge.techsmith.com/"&gt;Betsy Weber&lt;/a&gt;, &lt;a target="_blank" href="http://www.codinggeekette.com/"&gt;Sarah Dutkiewicz&lt;/a&gt;, &lt;a target="_blank" href="http://twitter.com/AnneGogh"&gt;Anne Gogh&lt;/a&gt;, &lt;a target="_blank" href="http://gloveless.weebly.com/"&gt;Gina Loveless&lt;/a&gt;, &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Grace_Hopper"&gt;Grace Hopper&lt;/a&gt;, &lt;a target="_blank" href="http://www.rachelappel.com/"&gt;Rachel Appel&lt;/a&gt;, &lt;a target="_blank" href="http://twitter.com/janinemoore"&gt;Janine Moore&lt;/a&gt;, &lt;a target="_blank" href="http://maggieplusplus.com/"&gt;Maggie Longshore&lt;/a&gt;, &lt;a target="_blank" href="http://www.naramore.net/blog"&gt;Elizabeth Naramore&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/SoCalDevGal"&gt;Lynn Langit&lt;/a&gt;, &lt;a target="_blank" href="http://www.grandioseideas.com/"&gt;Jennifer Davis&lt;/a&gt;, and &lt;a target="_blank" href="http://www.geekswithblogs.net/kirstinj"&gt;Kirstin Juhl&lt;/a&gt;. Plus many more whom I forget at the moment, but whom I respect as colleagues, and to whom I offer my sincere apologies for my feeble memory. And lest we forget, Jennifer Marsman. &lt;/p&gt;
&lt;p&gt;The Lounge is a bit testosterone heavy so far. Partly due to the characters I used as inspirations, partly no doubt from my own experience, the Lounge cast so far has run about 7 males per female. I decided that was out of balance (although honestly, it's a better ratio than most places I've worked); so it was time to add Geek Girl to the cast. Think of her as a spokesperson for all the engineers and designers and evangelists and authors and speakers in the list above. With &lt;a target="_blank" href="http://www.imdb.com/name/nm0004751/"&gt;Crystal Bernard's&lt;/a&gt; accent, because &lt;a target="_blank" href="http://www.amazon.com/Wings-The-Fifth-Season/dp/B000UAE7SG/ref=sr_1_12?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1226716305&amp;amp;sr=1-12"&gt;Wings&lt;/a&gt; happened to be on while I was drawing this Episode. (It's amazing the tricks the mind plays. I could "hear" Geek Girl in my head, clear as a bell, and couldn't place the voice, even as the same voice was speaking in the background.) &lt;/p&gt;
&lt;p&gt;Modeling user interfaces in UML is a common problem; and State Diagrams are easily the best answer I've found. They're a great way to show flow that's based on user decisions, not on some algorithm. With Events and Actions, they're a great way to show control events and how your system responds to them within a given form. &lt;/p&gt;
&lt;p&gt;And perhaps most important, they're a great way to handle The Cancel Problem. In a modern GUI, it's often the case that a user can cancel at almost any point. Even worse: if you're building a Web app, they can always just close the browser, or even disconnect from the Web. That's not an &lt;em&gt;immediate&lt;/em&gt; cancel; but it &lt;em&gt;will&lt;/em&gt; be a cancel when the Web session times out. If there's some work that &lt;em&gt;has to&lt;/em&gt; be done to clean up when the user cancels, trying to draw control flow with Activity Diagrams, or even with State Diagrams, becomes a nightmare as you try to draw arrows from every possible cancel point to the clean up work. But with a Superstate that contains all of the cancelable Substates, you can easily show that all of these Substates handle cancel in the same way: by performing this clean up work. In today's Episode, for example, no matter where you are in the Booking process when you cancel, you &lt;em&gt;have to&lt;/em&gt; go to Releasing, or the suspect will get lost in the system. &lt;/p&gt;
&lt;p&gt;User interfaces aren't the only things you can model with State Diagrams, of course. They're a powerful tool for modeling certain kinds of business processes. In particular, if you have a document-centric process, where some document (such as an Order for goods) passes to different departments as different people act on it and different events occur, then you can easily automate that process as a document object that passes through different States in response to some Events, and which does work within a State in response to other Events. This can be a convenient way to model processes built within a &lt;a target="_blank" href="http://www.amazon.com/Applied-SOA-Service-Oriented-Architecture-Strategies/dp/0470223650/ref=pd_bbs_sr_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226717128&amp;amp;sr=8-9"&gt;Service Oriented Architecture&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Another value of State Diagrams is that a number of tools will turn these directly into executable code. In particular, &lt;a target="_blank" href="http://www.amazon.com/Essential-Workflow-Foundation-Microsoft-Development/dp/0321399838/ref=pd_bbs_sr_5?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226717240&amp;amp;sr=8-5"&gt;Windows Workflow Foundation&lt;/a&gt; is a powerful tool that lets you graphically design both Sequential Workflows (similar to Activity Diagrams) and State Workflows, and then execute them directly. There's some work involved in hooking them into a user interface, but there's amazing flexibility and power in being able to depict and edit a flow graphically and then change your mind without having to change a lot of code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127114"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127114" 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/UlteriorMotiveLounge/aggbug/127114.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-23-girls-just-wanna-write-code.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:23:55 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127114.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-23-girls-just-wanna-write-code.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127114.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Ulterior Motive Lounge Episode 22: Time's Arrow</title>
            <category>Ulterior Motive Lounge</category>
            <link>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-22-times-arrow.aspx</link>
            <description>&lt;div class="bvEntry" id="entrycns!B4665B67C2981533!555" bv:cns="cns!B4665B67C2981533!555" bv:ca="true" bv:cat="Ulterior Motive Lounge"&gt;
&lt;div class="bvMsg" id="msgcns!B4665B67C2981533!555"&gt;
&lt;p&gt;In &lt;a href="http://theumlguy.spaces.live.com/blog/cns!B4665B67C2981533!541.entry"&gt;our last Episode&lt;/a&gt;, Apathetic Coder and The UML Guy derived code from Sequence Diagrams. Today, the Lounge has a pair of unexpected visitors. (Click picture for a larger image. UPDATE: The larger image is broken somehow. I probably can fix that later tonight.) &lt;/p&gt;
&lt;p&gt;&lt;a href="http://5rhwsa.blu.livefilestore.com/y1p4guSfwEmeKf-x3SLenpAUf9xSN7gT5GiYfz33_Pu80kMRMJYGtp5_hQYX0F5VMiVBH6cvwR-9vFFmsvIBePTeQ?PARTNER=WRITER"&gt;&lt;img height="500" alt="Episode 22" width="777" border="0" src="http://5rhwsa.blu.livefilestore.com/y1prVnDA_JAMS_MiKI6nl2yYsylkGSEJ57zF2Db8YsbuB_1PmbGXkhwpKjBjw0SRr8r1WvLPmYbq-4luTiGPkq8vQ?PARTNER=WRITER" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This Episode is a hodgepodge of obscure references: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Star-Trek-Generation-Episode-Times/dp/630461408X/ref=sr_1_9?ie=UTF8&amp;amp;s=video&amp;amp;qid=1226513626&amp;amp;sr=8-9"&gt;Star Trek&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/JLA-Zatannas-Search-Gardner-Fox/dp/1401201881/ref=sr_1_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226513668&amp;amp;sr=8-9"&gt;Zatanna the Magician&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Ransom-Red-Chief-Christopher-Lloyd/dp/B0002F6AVQ/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1226513713&amp;amp;sr=8-1"&gt;The Ransom of Red Chief&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Benjamin-Franklins-Numbers-Mathematical-Odyssey/dp/0691129568/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226513794&amp;amp;sr=8-2"&gt;Benjamin Franklin&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Database-Design-Entity-Relationship-Diagrams-Foundations/dp/0849315484/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226513847&amp;amp;sr=8-1"&gt;Entity Relationship Diagrams&lt;/a&gt; (ERDs). &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Modeling-Theory-Practice-Graeme-Simsion/dp/0977140016/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226513898&amp;amp;sr=8-1"&gt;Data Flow Diagrams&lt;/a&gt; (DFDs). &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://theumlguy.spaces.live.com/blog/cns!B4665B67C2981533!358.entry"&gt;Episode 8&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Night-Court-Complete-First-Season/dp/B0006N2EZK/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1223337538&amp;amp;sr=8-1"&gt;Night Court&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Columbo-Complete-Season-Peter-Falk/dp/B0002COTDA/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1226514026&amp;amp;sr=8-2"&gt;Columbo&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.amazon.com/Who-Framed-Roger-Rabbit-Vista/dp/B00007AJGH/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1226514057&amp;amp;sr=8-1"&gt;Who Framed Roger Rabbit?&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Plus a couple of coworkers with unusual interests: Scott Morris, who specializes in assembling rapid prototypes of systems; and &lt;a target="_blank" href="http://www.harrymgilbert.com/music/default.html"&gt;Harry Gilbert&lt;/a&gt;, linguist and programmer and musician (among other talents).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don't know all of these references, this Episode can be completely baffling. &lt;/p&gt;
&lt;p&gt;Kinda like the arrows can be in UML, until you get used to them. &lt;/p&gt;
&lt;p&gt;To me, the UML arrows are natural. They're "right". They're what I learned, and they make sense. &lt;/p&gt;
&lt;p&gt;But to people skilled in ERDs and DFDs, the arrows are &lt;em&gt;precisely&lt;/em&gt; backwards. In those notations, arrows indicate the direction that data moves: in other words, from provider to client. UML's arrows run from client to provider. &lt;/p&gt;
&lt;p&gt;For that difference, I can only apologize. The notation is what it is. It took me two years of teaching UML before some student had the guts to raise a hand and ask "Why are the arrows backwards?" Now at least I'm aware of the issue, and (usually) remember to bring it up early so that you can grapple with it. &lt;/p&gt;
&lt;p&gt;At the same time, what's the client and what's the provider isn't necessarily cut and dried. In fact, it can be an arbitrary implementation decision. Does a book refer to its chapters, or does a chapter refer to its book? Or both? And if the answer &lt;em&gt;is&lt;/em&gt; both, is that one association, or two? In code, it almost has to be two; and in UML, we would model that as two arrows. But if it's a single association, we model that as just a line, not an arrow. That's also a common way to model the association when we haven't yet decided what's the client and what's the provider. &lt;/p&gt;
&lt;p&gt;So if the arrows are confusing, I apologize. I'll do my best to make really clear examples. &lt;/p&gt;
&lt;p&gt;This Episode is for Harry and Scott, who demanded it. Now, they didn't hold me at gunpoint, but they got &lt;em&gt;really&lt;/em&gt; close... &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127113"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=127113" 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/UlteriorMotiveLounge/aggbug/127113.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martin L. Shoemaker</dc:creator>
            <guid>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-22-times-arrow.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:20:36 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/UlteriorMotiveLounge/comments/127113.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/UlteriorMotiveLounge/archive/2008/11/15/ulterior-motive-lounge-episode-22-times-arrow.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/UlteriorMotiveLounge/comments/commentRss/127113.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>