<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>+dotNetTemplar+ - Technical</title>
    <link>http://dotnettemplar.net/</link>
    <description>Non nobis Domine non nobis sed nomini Tuo da gloriam.</description>
    <image>
      <url>http://dotnettemplar.net/images/dotnettemplar_96.jpg</url>
      <title>+dotNetTemplar+ - Technical</title>
      <link>http://dotnettemplar.net/</link>
    </image>
    <language>en-us</language>
    <copyright>J. Ambrose Little</copyright>
    <lastBuildDate>Sun, 25 Sep 2011 21:20:15 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.2.8279.16125</generator>
    <managingEditor>ambrogio@gmail.com</managingEditor>
    <webMaster>ambrogio@gmail.com</webMaster>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=a161db77-1738-4afc-8605-5779d8cbc2c9</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,a161db77-1738-4afc-8605-5779d8cbc2c9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,a161db77-1738-4afc-8605-5779d8cbc2c9.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a161db77-1738-4afc-8605-5779d8cbc2c9</wfw:commentRss>
      <slash:comments>343</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This blog has been retired. For the foreseeable future, I will maintain the content
here as is.
</p>
        <p>
          <a href="http://ambroselittle.wordpress.com/about/" title="Ambrose Little's Blogs">Check
out my current blog(s).
</a>
        </p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a161db77-1738-4afc-8605-5779d8cbc2c9" />
      </body>
      <title>Who is dotNetTemplar?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,a161db77-1738-4afc-8605-5779d8cbc2c9.aspx</guid>
      <link>http://dotNetTemplar.Net/Who+Is+DotNetTemplar.aspx</link>
      <pubDate>Sun, 25 Sep 2011 21:20:15 GMT</pubDate>
      <description>&lt;p&gt;
This blog has been retired. For the foreseeable future, I will maintain the content
here as is.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://ambroselittle.wordpress.com/about/" title="Ambrose Little's Blogs"&gt;Check
out my current blog(s).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a161db77-1738-4afc-8605-5779d8cbc2c9" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,a161db77-1738-4afc-8605-5779d8cbc2c9.aspx</comments>
      <category>Non-Technical</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=a39051d7-559b-4766-934b-8262425b6d7d</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,a39051d7-559b-4766-934b-8262425b6d7d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,a39051d7-559b-4766-934b-8262425b6d7d.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a39051d7-559b-4766-934b-8262425b6d7d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img src="http://i.zdnet.com/blogs/archslide.png" title="New MS Tech Stack Slide" />
          <br />
          <span style="font-size:8pt;">Courtesy of ZDNet</span>
        </p>
        <p>
Much ado has been made in the recent months about the impending death of &lt;insert
name of MS UI stack here&gt;. This week, at BUILD, Microsoft has finally stepped up
and shown us what their view of the future is. Note that, in their architecture diagram,
the current "desktop" technologies are represented as a peer. Included in the right
side is Windows Forms, which of any .NET technology has long been exaggerated as dead;
and yet it is still alive.
</p>
        <p>
The point is, despite all the "future is Metro" talk by other analysts (e.g., <a href="http://www.zdnet.com/blog/microsoft/microsoft-to-developers-metro-is-your-future/10611">Mary
Jo herself</a>), the fact remains that these are peer technologies, and Microsoft
is not "killing" anything in the right side. In fact, there is no such intent expressed
implicitly or explicitly.
</p>
        <p>
That's not to say, of course, that nothing has changed. That's not to say that we
can or should ignore Metro/WinRT (duh!). But there seems to be this common knee jerk
reaction when a new technology is released to say that the current ones are now dead
or somehow not worth investing in further. That reaction just doesn't reflect reality.
</p>
        <p>
As impressed and (mostly) happy as I am about the direction expressed in the Win8
stack, we need to keep in mind that we are still in the early stages, still in gestation.
The baby isn't even born yet, and once it is born, it will take time to grow up and
mature. In the meantime, we have these mature, stable, currently released technologies
that are great to build on.
</p>
        <p>
I think it's great that Microsoft has released this stuff early. I like that about
them better than other tech vendors. Although they've been more tightlipped about
this than any other tech they've released, the fact remains we have plenty of time
to plan, prepare, design, prototype, explore, and ultimately build for the new stack.
In the meantime, we can still safely invest in the current technologies.
</p>
        <p>
The future is uncertain. That is the nature of the future. Devs need to quit unrealistically
asking Microsoft to guarantee them the future of technology. We know that it would
be bad business for Microsoft to kill off these current technologies; so bad, we should
feel it as a positive guarantee that they are here to stay for any future that we
should be currently planning for. We will always have legacy. Someday, the Win8 stack
will, I assure you, be legacy.
</p>
        <p>
The things that remain constant are: 
</p>
        <ul>
          <li>
Understand the needs of your application context.</li>
          <li>
Understand the capabilities, strengths, and weaknesses of the various technologies
you can build on, including current investments.</li>
          <li>
Understand your team's capabilities, strengths, and weaknesses, including current
investments.</li>
          <li>
And choose the technology stack that makes the most sense, best balancing all these
considerations, realizing that you won't make all the right choices (in retrospect)
and that this is just life as a software professional.</li>
        </ul>
        <p>
Everything else is just a bunch of unnecessary worry and hullaballoo.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a39051d7-559b-4766-934b-8262425b6d7d" />
      </body>
      <title>Love the Bomb</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,a39051d7-559b-4766-934b-8262425b6d7d.aspx</guid>
      <link>http://dotNetTemplar.Net/Love+The+Bomb.aspx</link>
      <pubDate>Thu, 15 Sep 2011 01:58:18 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img src="http://i.zdnet.com/blogs/archslide.png" title="New MS Tech Stack Slide" /&gt;
&lt;br /&gt;
&lt;span style="font-size:8pt;"&gt;Courtesy of ZDNet&lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
Much ado has been made in the recent months about the impending death of &amp;lt;insert
name of MS UI stack here&amp;gt;. This week, at BUILD, Microsoft has finally stepped up
and shown us what their view of the future is. Note that, in their architecture diagram,
the current "desktop" technologies are represented as a peer. Included in the right
side is Windows Forms, which of any .NET technology has long been exaggerated as dead;
and yet it is still alive.
&lt;/p&gt;
&lt;p&gt;
The point is, despite all the "future is Metro" talk by other analysts (e.g., &lt;a href="http://www.zdnet.com/blog/microsoft/microsoft-to-developers-metro-is-your-future/10611"&gt;Mary
Jo herself&lt;/a&gt;), the fact remains that these are peer technologies, and Microsoft
is not "killing" anything in the right side. In fact, there is no such intent expressed
implicitly or explicitly.
&lt;/p&gt;
&lt;p&gt;
That's not to say, of course, that nothing has changed. That's not to say that we
can or should ignore Metro/WinRT (duh!). But there seems to be this common knee jerk
reaction when a new technology is released to say that the current ones are now dead
or somehow not worth investing in further. That reaction just doesn't reflect reality.
&lt;/p&gt;
&lt;p&gt;
As impressed and (mostly) happy as I am about the direction expressed in the Win8
stack, we need to keep in mind that we are still in the early stages, still in gestation.
The baby isn't even born yet, and once it is born, it will take time to grow up and
mature. In the meantime, we have these mature, stable, currently released technologies
that are great to build on.
&lt;/p&gt;
&lt;p&gt;
I think it's great that Microsoft has released this stuff early. I like that about
them better than other tech vendors. Although they've been more tightlipped about
this than any other tech they've released, the fact remains we have plenty of time
to plan, prepare, design, prototype, explore, and ultimately build for the new stack.
In the meantime, we can still safely invest in the current technologies.
&lt;/p&gt;
&lt;p&gt;
The future is uncertain. That is the nature of the future. Devs need to quit unrealistically
asking Microsoft to guarantee them the future of technology. We know that it would
be bad business for Microsoft to kill off these current technologies; so bad, we should
feel it as a positive guarantee that they are here to stay for any future that we
should be currently planning for. We will always have legacy. Someday, the Win8 stack
will, I assure you, be legacy.
&lt;/p&gt;
&lt;p&gt;
The things that remain constant are: 
&lt;ul&gt;
&lt;li&gt;
Understand the needs of your application context.&lt;/li&gt;
&lt;li&gt;
Understand the capabilities, strengths, and weaknesses of the various technologies
you can build on, including current investments.&lt;/li&gt;
&lt;li&gt;
Understand your team's capabilities, strengths, and weaknesses, including current
investments.&lt;/li&gt;
&lt;li&gt;
And choose the technology stack that makes the most sense, best balancing all these
considerations, realizing that you won't make all the right choices (in retrospect)
and that this is just life as a software professional.&lt;/li&gt;
&lt;/ul&gt;
&gt;
&lt;p&gt;
Everything else is just a bunch of unnecessary worry and hullaballoo.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a39051d7-559b-4766-934b-8262425b6d7d" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,a39051d7-559b-4766-934b-8262425b6d7d.aspx</comments>
      <category>dotNet</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=2493a2c9-8a67-49f6-8761-96b5b299e986</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,2493a2c9-8a67-49f6-8761-96b5b299e986.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,2493a2c9-8a67-49f6-8761-96b5b299e986.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2493a2c9-8a67-49f6-8761-96b5b299e986</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">The good folks over at Microsoft have released
their <a href="http://www.codeplex.com/Silverlight">Silverlight Toolkit</a> today
(or I guess yesterday, now).  It's a good start to complement what you get in
the core/box.  I personally found the AutoCompleteBox probably the most interesting
control, and the theming capabilities being introduced with the ImplicitStyleManager
are promising, too.  I also like the way the team is running the toolkit project
on codeplex and all.  Shawn Burke (of Ajax Control Toolkit fame) is a great guy
to be leading that group of talented folks.<br /><br />
Of course, in my humble opinion ;-), no discussion of Silverlight controls would be
complete without looking at the outstanding work that Infragistics is doing, particularly
in the data visualization space.  In our current CTP that you can download now,
we have the xamWebChart, xamWebGauge, xamWebMap, xamWebTimeline, and xamWebZoombar.<br /><br />
If you go to <a href="http://infragistics.com/silverlight">http://infragistics.com/silverlight</a>,
you can read about all those controls, but I encourage everyone to just go play with
them in our really awesome (if I do say so myself!) <a href="http://labs.infragistics.com/silverlight/datavisualizationsamples/">Silverlight
controls samples browser</a>.  I mean, it is just plain fun tweaking around with
it.  I could sit and watch the datapoint transitions all day, and the chart zooming
is freakin' cool.  Needle dragging gauge, overview plus detail implementation
for the map, timeline...  Heck, who am I kidding?  It's all sweet!<br /><img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/9749b1b1-dcf6-4d13-b692-d760cb6fb596/00000053.png" /><br /><img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/16f14cf8-468d-4a90-af59-253fffa69445/00000051.png" />     <img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/0a190bfb-f80e-4e61-8c88-dd912ce57987/00000052.png" /><br /><br />
I'm not just saying that because I work there; I really was just having fun and am
frankly impressed with the work our guys are doing.  Kudos to our entire Silverlight
team!   Great job, guys!  I'd name names, but I'm bound to forget someone. 
You know who you are!<br /><br />
And the fact that I'm playing with this in Safari on my Mac over my crappy hotel internet
access just makes it that much cooler and fun.  You gotta love Silverlight!  
<br /><br />
If you're interested more in Line of Business (e.g., Outlook bar, hierarchicial data
grid, tree, etc.), check out our info on <a href="http://www.infragistics.com/dotnet/netadvantage/silverlight.aspx">Silverlight
LOB controls</a>.  According to our roadmap published there, you should see a
CTP of our first release towards the end of this year.  Silverlight rocks, and
I'm looking forward to seeing it develop and being a part of making it even better.<br /><br />
You should stop by our booth at PDC, if you haven't already, and ask about all this. 
We're Booth #201 (about 3 down on the left from the middle entrance).  There's
still some time left, and you can pummel the guys and gals there with your questions. 
Of course, you can always just call, chat, or email someone as well (or use the contact
link on this blog, and I'll put you in touch).  
<br /><br />
Also, feel free to stop me in the hall at PDC if you want.  I won't bite. 
Everyone says I look like Kevin Smith (which is why I was Silent Bob at the Expo reception
Monday), so you should be able to recognize me, even without the trenchcoat. :) 
Now I have to get to sleep so I can keep my promise and not be a zombie (and ergo
not bite).  G'night!<br /><p></p><img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=2493a2c9-8a67-49f6-8761-96b5b299e986" /></body>
      <title>Silverlight Controls</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,2493a2c9-8a67-49f6-8761-96b5b299e986.aspx</guid>
      <link>http://dotNetTemplar.Net/Silverlight+Controls.aspx</link>
      <pubDate>Wed, 29 Oct 2008 09:10:19 GMT</pubDate>
      <description>The good folks over at Microsoft have released their &lt;a href="http://www.codeplex.com/Silverlight"&gt;Silverlight
Toolkit&lt;/a&gt; today (or I guess yesterday, now).&amp;nbsp; It's a good start to complement
what you get in the core/box.&amp;nbsp; I personally found the AutoCompleteBox probably
the most interesting control, and the theming capabilities being introduced with the
ImplicitStyleManager are promising, too.&amp;nbsp; I also like the way the team is running
the toolkit project on codeplex and all.&amp;nbsp; Shawn Burke (of Ajax Control Toolkit
fame) is a great guy to be leading that group of talented folks.&lt;br&gt;
&lt;br&gt;
Of course, in my humble opinion ;-), no discussion of Silverlight controls would be
complete without looking at the outstanding work that Infragistics is doing, particularly
in the data visualization space.&amp;nbsp; In our current CTP that you can download now,
we have the xamWebChart, xamWebGauge, xamWebMap, xamWebTimeline, and xamWebZoombar.&lt;br&gt;
&lt;br&gt;
If you go to &lt;a href="http://infragistics.com/silverlight"&gt;http://infragistics.com/silverlight&lt;/a&gt;,
you can read about all those controls, but I encourage everyone to just go play with
them in our really awesome (if I do say so myself!) &lt;a href="http://labs.infragistics.com/silverlight/datavisualizationsamples/"&gt;Silverlight
controls samples browser&lt;/a&gt;.&amp;nbsp; I mean, it is just plain fun tweaking around with
it.&amp;nbsp; I could sit and watch the datapoint transitions all day, and the chart zooming
is freakin' cool.&amp;nbsp; Needle dragging gauge, overview plus detail implementation
for the map, timeline...&amp;nbsp; Heck, who am I kidding?&amp;nbsp; It's all sweet!&lt;br&gt;
&lt;img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/9749b1b1-dcf6-4d13-b692-d760cb6fb596/00000053.png"&gt;
&lt;br&gt;
&lt;img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/16f14cf8-468d-4a90-af59-253fffa69445/00000051.png"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://content.screencast.com/users/ambrogio/folders/Jing/media/0a190bfb-f80e-4e61-8c88-dd912ce57987/00000052.png"&gt;
&lt;br&gt;
&lt;br&gt;
I'm not just saying that because I work there; I really was just having fun and am
frankly impressed with the work our guys are doing.&amp;nbsp; Kudos to our entire Silverlight
team!&amp;nbsp;&amp;nbsp; Great job, guys!&amp;nbsp; I'd name names, but I'm bound to forget someone.&amp;nbsp;
You know who you are!&lt;br&gt;
&lt;br&gt;
And the fact that I'm playing with this in Safari on my Mac over my crappy hotel internet
access just makes it that much cooler and fun.&amp;nbsp; You gotta love Silverlight!&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
If you're interested more in Line of Business (e.g., Outlook bar, hierarchicial data
grid, tree, etc.), check out our info on &lt;a href="http://www.infragistics.com/dotnet/netadvantage/silverlight.aspx"&gt;Silverlight
LOB controls&lt;/a&gt;.&amp;nbsp; According to our roadmap published there, you should see a
CTP of our first release towards the end of this year.&amp;nbsp; Silverlight rocks, and
I'm looking forward to seeing it develop and being a part of making it even better.&lt;br&gt;
&lt;br&gt;
You should stop by our booth at PDC, if you haven't already, and ask about all this.&amp;nbsp;
We're Booth #201 (about 3 down on the left from the middle entrance).&amp;nbsp; There's
still some time left, and you can pummel the guys and gals there with your questions.&amp;nbsp;
Of course, you can always just call, chat, or email someone as well (or use the contact
link on this blog, and I'll put you in touch).&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
Also, feel free to stop me in the hall at PDC if you want.&amp;nbsp; I won't bite.&amp;nbsp;
Everyone says I look like Kevin Smith (which is why I was Silent Bob at the Expo reception
Monday), so you should be able to recognize me, even without the trenchcoat. :)&amp;nbsp;
Now I have to get to sleep so I can keep my promise and not be a zombie (and ergo
not bite).&amp;nbsp; G'night!&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=2493a2c9-8a67-49f6-8761-96b5b299e986" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,2493a2c9-8a67-49f6-8761-96b5b299e986.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=c78651b4-40b7-471a-a9d2-08c0004f48b5</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,c78651b4-40b7-471a-a9d2-08c0004f48b5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,c78651b4-40b7-471a-a9d2-08c0004f48b5.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c78651b4-40b7-471a-a9d2-08c0004f48b5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just ran across <a title="Alan Cooper's keynote at Agile 2008" href="http://www.cooper.com/journal/2008/08/alans_keynote_at_agile_2008.html" target="_blank">Alan
Cooper's keynote at Agile 2008</a>.  The gist is that he's making the case for
integrating interaction design into Agile development, something that is near and
dear to me, as well.  I was pleasantly surprised by his talk, and I recommend
it to all my dev friends.  
</p>
        <p>
You can quickly scan through the <a title="Cooper's Agile 2008 Slides and Notes" href="http://www.cooper.com/journal/agile2008/" target="_blank">slides
and his notes</a> to get the whole story.  I'm not sure if I could have said
it better myself!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c78651b4-40b7-471a-a9d2-08c0004f48b5" />
      </body>
      <title>Cooper's Keynote at Agile 2008</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,c78651b4-40b7-471a-a9d2-08c0004f48b5.aspx</guid>
      <link>http://dotNetTemplar.Net/Coopers+Keynote+At+Agile+2008.aspx</link>
      <pubDate>Sat, 16 Aug 2008 18:45:23 GMT</pubDate>
      <description>&lt;p&gt;
I just ran across &lt;a title="Alan Cooper&amp;#39;s keynote at Agile 2008" href="http://www.cooper.com/journal/2008/08/alans_keynote_at_agile_2008.html" target="_blank"&gt;Alan
Cooper's keynote at Agile 2008&lt;/a&gt;.&amp;#160; The gist is that he's making the case for
integrating interaction design into Agile development, something that is near and
dear to me, as well.&amp;#160; I was pleasantly surprised by his talk, and I recommend
it to all my dev friends.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
You can quickly scan through the &lt;a title="Cooper&amp;#39;s Agile 2008 Slides and Notes" href="http://www.cooper.com/journal/agile2008/" target="_blank"&gt;slides
and his notes&lt;/a&gt; to get the whole story.&amp;#160; I'm not sure if I could have said
it better myself!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c78651b4-40b7-471a-a9d2-08c0004f48b5" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,c78651b4-40b7-471a-a9d2-08c0004f48b5.aspx</comments>
      <category>Best Practices</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=880bd271-c486-4545-a561-45f23ff347d2</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,880bd271-c486-4545-a561-45f23ff347d2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,880bd271-c486-4545-a561-45f23ff347d2.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=880bd271-c486-4545-a561-45f23ff347d2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm heading out to San Francisco Monday to get my UX on at UX Week 2008! It's my first
time both in the city and at that conference. Looking forward to meeting new folks
and talking about making great software experiences. If you're in the area or at the
conference, send me an email (ambrogio[at]gmail) or ping me on <a href="http://uxweek.crowdvine.com/profiles/22260" title="Ambrose on crowdvine - UX Week 2008" target="_blank">crowdvine</a>.
I'd be glad to get together to talk about UX, software, architecture, whatever!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=880bd271-c486-4545-a561-45f23ff347d2" />
      </body>
      <title>Get My UX On!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,880bd271-c486-4545-a561-45f23ff347d2.aspx</guid>
      <link>http://dotNetTemplar.Net/Get+My+UX+On.aspx</link>
      <pubDate>Sat, 09 Aug 2008 02:36:18 GMT</pubDate>
      <description>&lt;p&gt;
I'm heading out to San Francisco Monday to get my UX on at UX Week 2008! It's my first
time both in the city and at that conference. Looking forward to meeting new folks
and talking about making great software experiences. If you're in the area or at the
conference, send me an email (ambrogio[at]gmail) or ping me on &lt;a href="http://uxweek.crowdvine.com/profiles/22260" title="Ambrose on crowdvine - UX Week 2008" target="_blank"&gt;crowdvine&lt;/a&gt;.
I'd be glad to get together to talk about UX, software, architecture, whatever!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=880bd271-c486-4545-a561-45f23ff347d2" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,880bd271-c486-4545-a561-45f23ff347d2.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=693dc6a7-c541-424d-aece-992a902745ab</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,693dc6a7-c541-424d-aece-992a902745ab.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,693dc6a7-c541-424d-aece-992a902745ab.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=693dc6a7-c541-424d-aece-992a902745ab</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wrox has started a new thing as of late they're calling <a href="http://www.wrox.com/WileyCDA/Section/id-321042.html">Wrox
First</a>.  It's essentially a wiki of the book that I and my fellow Silverlight
2 authors are working on--<a href="http://silverlight2.wrox.com/">Silverlight 2 Programmer's
Reference</a>.  Not only do you get early access, you can also shape how the
book develops by making comments and suggestions.  My <a href="http://silverlight2.wrox.com/join">understanding</a> is
that it's just $19.99 and will get you access to drafts, revisions, and the final
chapters as they are in the book for up to a year after publishing.  
</p>
        <p>
Seems like an interesting option for those who want the book and sample code now rather
than waiting until later this year when it is published.  Let me know what you
think!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=693dc6a7-c541-424d-aece-992a902745ab" />
      </body>
      <title>Wrox Silverlight 2 Programmer's Reference Early Access</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,693dc6a7-c541-424d-aece-992a902745ab.aspx</guid>
      <link>http://dotNetTemplar.Net/Wrox+Silverlight+2+Programmers+Reference+Early+Access.aspx</link>
      <pubDate>Tue, 29 Jul 2008 18:35:41 GMT</pubDate>
      <description>&lt;p&gt;
Wrox has started a new thing as of late they're calling &lt;a href="http://www.wrox.com/WileyCDA/Section/id-321042.html"&gt;Wrox
First&lt;/a&gt;.&amp;nbsp; It's essentially a wiki of the book that I and my fellow Silverlight
2 authors are working on--&lt;a href="http://silverlight2.wrox.com/"&gt;Silverlight 2 Programmer's
Reference&lt;/a&gt;.&amp;nbsp; Not only do you get early access, you can also shape how the
book develops by making comments and suggestions.&amp;nbsp; My &lt;a href="http://silverlight2.wrox.com/join"&gt;understanding&lt;/a&gt; is
that it's just $19.99 and will get you access to drafts, revisions, and the final
chapters as they are in the book for up to a year after publishing.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Seems like an interesting option for those who want the book and sample code now rather
than waiting until later this year when it is published.&amp;nbsp; Let me know what you
think!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=693dc6a7-c541-424d-aece-992a902745ab" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,693dc6a7-c541-424d-aece-992a902745ab.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=a3264de0-a7b8-47e9-91f7-6b36ff2adbd2</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,a3264de0-a7b8-47e9-91f7-6b36ff2adbd2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,a3264de0-a7b8-47e9-91f7-6b36ff2adbd2.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a3264de0-a7b8-47e9-91f7-6b36ff2adbd2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Phwew!  I just moved yesterday (actually all weekend and yesterday and still
more unpacking to go now!).  Man, all that moving is starting to wear, but we're
very happy in the new place.  A lot more space to make room for number four!
:)
</p>
        <p>
On to the point.  Josh Smith has extended his <a title="Josh Smith Extends Podder Skinning Competition" href="http://joshsmithonwpf.wordpress.com/2008/07/01/the-podder-skinning-competition-deadline-has-been-extended/" target="_blank">Podder
skinning competition</a>.  For those who don't know, Podder is this nifty WPF-based
podcasting client/player.  He designed it so that you can completely change the
look and feel using skins.  I suggested a better term would be skeletoning, since
you can change the structure in addition to the styling, but so far that hasn't caught
on.  Be sure to tell him you think that's a better term! 
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a3264de0-a7b8-47e9-91f7-6b36ff2adbd2" />
      </body>
      <title>Podder Skinning Contest Extended</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,a3264de0-a7b8-47e9-91f7-6b36ff2adbd2.aspx</guid>
      <link>http://dotNetTemplar.Net/Podder+Skinning+Contest+Extended.aspx</link>
      <pubDate>Wed, 02 Jul 2008 13:39:04 GMT</pubDate>
      <description>&lt;p&gt;
Phwew!&amp;#160; I just moved yesterday (actually all weekend and yesterday and still
more unpacking to go now!).&amp;#160; Man, all that moving is starting to wear, but we're
very happy in the new place.&amp;#160; A lot more space to make room for number four!
:)
&lt;/p&gt;
&lt;p&gt;
On to the point.&amp;#160; Josh Smith has extended his &lt;a title="Josh Smith Extends Podder Skinning Competition" href="http://joshsmithonwpf.wordpress.com/2008/07/01/the-podder-skinning-competition-deadline-has-been-extended/" target="_blank"&gt;Podder
skinning competition&lt;/a&gt;.&amp;#160; For those who don't know, Podder is this nifty WPF-based
podcasting client/player.&amp;#160; He designed it so that you can completely change the
look and feel using skins.&amp;#160; I suggested a better term would be skeletoning, since
you can change the structure in addition to the styling, but so far that hasn't caught
on.&amp;#160; Be sure to tell him you think that's a better term! 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=a3264de0-a7b8-47e9-91f7-6b36ff2adbd2" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,a3264de0-a7b8-47e9-91f7-6b36ff2adbd2.aspx</comments>
      <category>dotNet</category>
      <category>Family Life</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=699ccc01-b482-4082-aeaa-64e9122a7c99</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,699ccc01-b482-4082-aeaa-64e9122a7c99.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,699ccc01-b482-4082-aeaa-64e9122a7c99.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=699ccc01-b482-4082-aeaa-64e9122a7c99</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm not sure why this didn't occur to me before...  I read recently another brief
article about the negative impact of email on productivity the other day, so I was
thinking about a way to deal with it that didn't involve, e.g., closing Outlook and
maybe even setting an "I'm not available by email until 3p today" out of
office type message--seems a bit extreme, and it would also preclude my getting meeting
reminders.  
</p>
        <p>
It occurred to me that what usually happens is I get the nifty little toaster popup
notification while doing something, almost always click on it for more detail, and
then get drawn into a distraction over it.  Similarly, I was using one of those
Gmail Vista gadgets that would highlight when I had Gmail waiting, or I'd leave it
open and minimized and see the Inbox count in the taskbar.  The problem was not
(for me) so much getting too much email as having the regular interruptions that were
occasioned by these terribly useful notification mechanisms.  
</p>
        <p>
Having isolated the problem, i.e., having framed the question correctly (which usually
the most important part of solving a problem), I asked "How can I make these
notifications go away?"  And the answer was immediately apparent: turn them
off. :)
</p>
        <p>
To that end, I went into Outlook advanced email options (Tools -&gt; Options -&gt;
Email Options -&gt; Advanced Email Options--who knew notifications were advanced?!)
and deselect all the notification options:
</p>
        <p>
          <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="511" alt="Advanced E-mail Options Dialog" src="http://dotnettemplar.net/blogfiles/MinimizingEmailDistractions_EDF2/adv_email_3.jpg" width="389" border="0" />
        </p>
        <p>
I then removed the Gmail notifier gadget, and I close my Gmail when done with it. 
The magic is that I still get my task and meeting reminders, but I don't get the regular
interruptive notifications.  This had an immediate noticeable effect--I could
work through to a good stopping point on the thing I was working on, i.e., a point
I'd normally take a break, and <em>then</em> I'd check my email.  Wow! 
Who knew something so simple could make such a difference?  I figure if it is
critical, somebody will call or come knocking on my door. :)
</p>
        <p>
As a complimentary technique to that, I have taken my Inbox strategy to the next level,
following a bit of advice given by <a title="Mark Hurst" href="http://goodexperience.com/mark/" target="_blank">Mark
Hurst</a> (who wrote a book on <em>Bit Literacy</em> [that I haven't read]). 
One of his suggestions to avoid information overload is to keep your Inbox empty. 
I <a title="Tips for Managing Massive Amounts of Email" href="http://dotnettemplar.net/Tips+For+Managing+Massive+Amounts+Of+Email.aspx">previously
already worked to do that</a> because I used my Inbox like a to-do list (and don't
like having a long to-do list), but Mark's advice is precisely not to do that--use
it as an Inbox and get stuff out of it immediately.  
</p>
        <p>
Having not read the book (in which I'm sure are tons of helpful little tidbits), I
take that to mean act on it immediately if possible, file it if need be, or <em>set
up a task </em>to do something with it later.  I was already doing the first
two, but I've found this additional third technique to be a nice add.  There
is a distinct satisfaction (for me anyway) to having an empty inbox--maybe it's my
personality type. :)
</p>
        <p>
I hope this maybe helps others out there in the same boat.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=699ccc01-b482-4082-aeaa-64e9122a7c99" />
      </body>
      <title>Minimizing Email Distractions</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,699ccc01-b482-4082-aeaa-64e9122a7c99.aspx</guid>
      <link>http://dotNetTemplar.Net/Minimizing+Email+Distractions.aspx</link>
      <pubDate>Fri, 20 Jun 2008 21:28:31 GMT</pubDate>
      <description>&lt;p&gt;
I'm not sure why this didn't occur to me before...&amp;#160; I read recently another brief
article about the negative impact of email on productivity the other day, so I was
thinking about a way to deal with it that didn't involve, e.g., closing Outlook and
maybe even setting an &amp;quot;I'm not available by email until 3p today&amp;quot; out of
office type message--seems a bit extreme, and it would also preclude my getting meeting
reminders.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
It occurred to me that what usually happens is I get the nifty little toaster popup
notification while doing something, almost always click on it for more detail, and
then get drawn into a distraction over it.&amp;#160; Similarly, I was using one of those
Gmail Vista gadgets that would highlight when I had Gmail waiting, or I'd leave it
open and minimized and see the Inbox count in the taskbar.&amp;#160; The problem was not
(for me) so much getting too much email as having the regular interruptions that were
occasioned by these terribly useful notification mechanisms.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Having isolated the problem, i.e., having framed the question correctly (which usually
the most important part of solving a problem), I asked &amp;quot;How can I make these
notifications go away?&amp;quot;&amp;#160; And the answer was immediately apparent: turn them
off. :)
&lt;/p&gt;
&lt;p&gt;
To that end, I went into Outlook advanced email options (Tools -&amp;gt; Options -&amp;gt;
Email Options -&amp;gt; Advanced Email Options--who knew notifications were advanced?!)
and deselect all the notification options:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="511" alt="Advanced E-mail Options Dialog" src="http://dotnettemplar.net/blogfiles/MinimizingEmailDistractions_EDF2/adv_email_3.jpg" width="389" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
I then removed the Gmail notifier gadget, and I close my Gmail when done with it.&amp;#160;
The magic is that I still get my task and meeting reminders, but I don't get the regular
interruptive notifications.&amp;#160; This had an immediate noticeable effect--I could
work through to a good stopping point on the thing I was working on, i.e., a point
I'd normally take a break, and &lt;em&gt;then&lt;/em&gt; I'd check my email.&amp;#160; Wow!&amp;#160;
Who knew something so simple could make such a difference?&amp;#160; I figure if it is
critical, somebody will call or come knocking on my door. :)
&lt;/p&gt;
&lt;p&gt;
As a complimentary technique to that, I have taken my Inbox strategy to the next level,
following a bit of advice given by &lt;a title="Mark Hurst" href="http://goodexperience.com/mark/" target="_blank"&gt;Mark
Hurst&lt;/a&gt; (who wrote a book on &lt;em&gt;Bit Literacy&lt;/em&gt; [that I haven't read]).&amp;#160;
One of his suggestions to avoid information overload is to keep your Inbox empty.&amp;#160;
I &lt;a title="Tips for Managing Massive Amounts of Email" href="http://dotnettemplar.net/Tips+For+Managing+Massive+Amounts+Of+Email.aspx"&gt;previously
already worked to do that&lt;/a&gt; because I used my Inbox like a to-do list (and don't
like having a long to-do list), but Mark's advice is precisely not to do that--use
it as an Inbox and get stuff out of it immediately.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Having not read the book (in which I'm sure are tons of helpful little tidbits), I
take that to mean act on it immediately if possible, file it if need be, or &lt;em&gt;set
up a task &lt;/em&gt;to do something with it later.&amp;#160; I was already doing the first
two, but I've found this additional third technique to be a nice add.&amp;#160; There
is a distinct satisfaction (for me anyway) to having an empty inbox--maybe it's my
personality type. :)
&lt;/p&gt;
&lt;p&gt;
I hope this maybe helps others out there in the same boat.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=699ccc01-b482-4082-aeaa-64e9122a7c99" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,699ccc01-b482-4082-aeaa-64e9122a7c99.aspx</comments>
      <category>General Computing</category>
      <category>Non-Technical</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I haven't done any research, so maybe it is out there.  But I had a thought the
other day as I accepted yet another invite to connect from yet another social networking
site from someone I have connected with numerous times.  
</p>
        <p>
Wouldn't it be great if I could have one, unified set of social contacts, <em>my</em> social
network, that I could then just share out to various social networking sites? 
I mean, sure, folks would have to opt into it, someone would have to think about the
privacy issues, but good grief, it seems like we need something like that...
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0" />
      </body>
      <title>OpenSocial - The OpenID for Social Networks?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0.aspx</guid>
      <link>http://dotNetTemplar.Net/OpenSocial+The+OpenID+For+Social+Networks.aspx</link>
      <pubDate>Thu, 15 May 2008 17:02:49 GMT</pubDate>
      <description>&lt;p&gt;
I haven't done any research, so maybe it is out there.&amp;#160; But I had a thought the
other day as I accepted yet another invite to connect from yet another social networking
site from someone I have connected with numerous times.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Wouldn't it be great if I could have one, unified set of social contacts, &lt;em&gt;my&lt;/em&gt; social
network, that I could then just share out to various social networking sites?&amp;#160;
I mean, sure, folks would have to opt into it, someone would have to think about the
privacy issues, but good grief, it seems like we need something like that...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,4ca4f77e-e022-4e16-921b-e4b0a4d7f1d0.aspx</comments>
      <category>General Computing</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just reading the first article in the latest edition of Microsoft's <em>The Architecture
Journal</em>.  It's called "We Don't Need No Architects" by Joseph
Hofstader.  I thought, oh good, someone voicing a dissident opinion, but the
article is rather a rebuttal to that claim.  I figure maybe a response to the
response is in order. :)
</p>
        <p>
Mr. Hofstader suggests that architects think in terms of bubbles and devs think in
terms of code and, by extension, only see part of the picture.  He describes
various "architectural" activities such as analyzing the problem domain,
choosing and applying appropriate technologies to solve problems, and the use of patterns.
</p>
        <p>
Is it just me, or is this a sort of dumbing down of the developer role in order to
support a, potentially unnecessary, distinction between it and "the architect"? 
I mean, a smart developer needs to do all of these things, too.  They're not
just code monkeys.
</p>
        <p>
In fact, in introducing such a division in responsibilities, we would actually seemingly
perpetuate a long-standing problem in software development--a disjuncture between
the problem and solution space because we keep trying to insert these <em>business
translators</em> (call them technical business analysts, software architects, whatever
you want) into our methodology.  
</p>
        <p>
What's wrong with this?  First, it puts the burden for understanding the business
onto one (or a few) persons, but more importantly, it limits that mind share to those
individuals.  That is never a good thing, but it is especially bad for software. 
In so doing, it also puts a burden on those individuals to correctly interpret and
translate (a considerable challenge) and finally to sufficiently communicate a design
to developers--enter large specification documents, heavier process, and more overhead.
</p>
        <p>
On the other hand, domain-driven design, for instance, is all about instilling domain
knowledge into the solution and coming to a common alignment between the business
and the solution creators.  It's axiomatic in business that you need a shared
vision to be successful, and this approach to software creation is all about that. 
Shared vision, mutual cooperation, and a shared language.  
</p>
        <p>
It eliminates the need for a translator because both learn to speak the same domain
language.  It eliminates the knowledge bottlenecks (or at least really reduces
them), and it increases shared knowledge.  And DDD is not burdened with the distinction
between an architect and a developer.  Agile methodologies in general are geared
towards reducing barriers and overhead in the creation of software (and that's why <a title="Scott Ambler's Annual Agile Survey Results" href="http://www.ambysoft.com/surveys/" target="_blank">they're
generally more successful</a>, and <a title="Ambler on Scaling Agile" href="http://www.ibm.com/developerworks/blogs/page/ambler" target="_blank">they <em>can</em> scale</a>).
</p>
        <p>
I hope that all the brilliant and more-well-known/respected folks will forgive me;
this is not intended as a slight, but I have to ask--are we creating the "architecture"
profession unconsciously just to create a more defined career path (i.e., a way for
us techies to move up the ranks)?  Are we just going with the flow from an <a title="Ambrose on 'Creating Software is Not Like Building'" href="http://dotnettemplar.net/Creating+Software+Is+Not+Like+Building.aspx" target="_blank">old
but broken analogy</a>?  Are we introducing roles that really would be better
served through other, non-architecty roles?
</p>
        <p>
To this last point, I see some folks suggesting "infrastructure" and "business"
and "software" and "whatehaveyou" architects.  Why are we
so keen on the term "architect"?  I'll grant, it does sound really
fancy, but it is so, so painfully clear that it is ambiguous and overloaded (and inaccurate,
if you ask me) .  Maybe these other roles do need to exist in some organizations,
but it seems like we're just bent on calling them "architect" for no apparent
good reason other than we've latched onto it as a <em>respectable</em> (and well-paid)
moniker.  
</p>
        <p>
In choosing to proliferate the "architect" terminology, we're perpetuating
and extending the confusion around it.  We're purporting to solve the problem
of it being ill-defined, but in reality we're doing the opposite.  And everyone
(IASA, Open Group, Microsoft, to name some just in the latest issue of the Journal)
is trying to do it all at once with little coordination.  
</p>
        <p>
It seems borderline insane.  
</p>
        <p>
Or maybe I'm the crazy one?
</p>
        <p>
          <em>there is no spoon</em>
        </p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5" />
      </body>
      <title>We Don't Need No Architects--Really!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5.aspx</guid>
      <link>http://dotNetTemplar.Net/We+Dont+Need+No+ArchitectsReally.aspx</link>
      <pubDate>Wed, 23 Apr 2008 19:15:42 GMT</pubDate>
      <description>&lt;p&gt;
Just reading the first article in the latest edition of Microsoft's &lt;em&gt;The Architecture
Journal&lt;/em&gt;.&amp;#160; It's called &amp;quot;We Don't Need No Architects&amp;quot; by Joseph
Hofstader.&amp;#160; I thought, oh good, someone voicing a dissident opinion, but the
article is rather a rebuttal to that claim.&amp;#160; I figure maybe a response to the
response is in order. :)
&lt;/p&gt;
&lt;p&gt;
Mr. Hofstader suggests that architects think in terms of bubbles and devs think in
terms of code and, by extension, only see part of the picture.&amp;#160; He describes
various &amp;quot;architectural&amp;quot; activities such as analyzing the problem domain,
choosing and applying appropriate technologies to solve problems, and the use of patterns.
&lt;/p&gt;
&lt;p&gt;
Is it just me, or is this a sort of dumbing down of the developer role in order to
support a, potentially unnecessary, distinction between it and &amp;quot;the architect&amp;quot;?&amp;#160;
I mean, a smart developer needs to do all of these things, too.&amp;#160; They're not
just code monkeys.
&lt;/p&gt;
&lt;p&gt;
In fact, in introducing such a division in responsibilities, we would actually seemingly
perpetuate a long-standing problem in software development--a disjuncture between
the problem and solution space because we keep trying to insert these &lt;em&gt;business
translators&lt;/em&gt; (call them technical business analysts, software architects, whatever
you want) into our methodology.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
What's wrong with this?&amp;#160; First, it puts the burden for understanding the business
onto one (or a few) persons, but more importantly, it limits that mind share to those
individuals.&amp;#160; That is never a good thing, but it is especially bad for software.&amp;#160;
In so doing, it also puts a burden on those individuals to correctly interpret and
translate (a considerable challenge) and finally to sufficiently communicate a design
to developers--enter large specification documents, heavier process, and more overhead.
&lt;/p&gt;
&lt;p&gt;
On the other hand, domain-driven design, for instance, is all about instilling domain
knowledge into the solution and coming to a common alignment between the business
and the solution creators.&amp;#160; It's axiomatic in business that you need a shared
vision to be successful, and this approach to software creation is all about that.&amp;#160;
Shared vision, mutual cooperation, and a shared language.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
It eliminates the need for a translator because both learn to speak the same domain
language.&amp;#160; It eliminates the knowledge bottlenecks (or at least really reduces
them), and it increases shared knowledge.&amp;#160; And DDD is not burdened with the distinction
between an architect and a developer.&amp;#160; Agile methodologies in general are geared
towards reducing barriers and overhead in the creation of software (and that's why &lt;a title="Scott Ambler&amp;#39;s Annual Agile Survey Results" href="http://www.ambysoft.com/surveys/" target="_blank"&gt;they're
generally more successful&lt;/a&gt;, and &lt;a title="Ambler on Scaling Agile" href="http://www.ibm.com/developerworks/blogs/page/ambler" target="_blank"&gt;they &lt;em&gt;can&lt;/em&gt; scale&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
I hope that all the brilliant and more-well-known/respected folks will forgive me;
this is not intended as a slight, but I have to ask--are we creating the &amp;quot;architecture&amp;quot;
profession unconsciously just to create a more defined career path (i.e., a way for
us techies to move up the ranks)?&amp;#160; Are we just going with the flow from an &lt;a title="Ambrose on &amp;#39;Creating Software is Not Like Building&amp;#39;" href="http://dotnettemplar.net/Creating+Software+Is+Not+Like+Building.aspx" target="_blank"&gt;old
but broken analogy&lt;/a&gt;?&amp;#160; Are we introducing roles that really would be better
served through other, non-architecty roles?
&lt;/p&gt;
&lt;p&gt;
To this last point, I see some folks suggesting &amp;quot;infrastructure&amp;quot; and &amp;quot;business&amp;quot;
and &amp;quot;software&amp;quot; and &amp;quot;whatehaveyou&amp;quot; architects.&amp;#160; Why are we
so keen on the term &amp;quot;architect&amp;quot;?&amp;#160; I'll grant, it does sound really
fancy, but it is so, so painfully clear that it is ambiguous and overloaded (and inaccurate,
if you ask me) .&amp;#160; Maybe these other roles do need to exist in some organizations,
but it seems like we're just bent on calling them &amp;quot;architect&amp;quot; for no apparent
good reason other than we've latched onto it as a &lt;em&gt;respectable&lt;/em&gt; (and well-paid)
moniker.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
In choosing to proliferate the &amp;quot;architect&amp;quot; terminology, we're perpetuating
and extending the confusion around it.&amp;#160; We're purporting to solve the problem
of it being ill-defined, but in reality we're doing the opposite.&amp;#160; And everyone
(IASA, Open Group, Microsoft, to name some just in the latest issue of the Journal)
is trying to do it all at once with little coordination.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
It seems borderline insane.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Or maybe I'm the crazy one?
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;there is no spoon&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,396c9d5c-f506-4b7f-8f9b-a7f9aeee6df5.aspx</comments>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few buddies of mine, <a href="http://weblogs.asp.net/plip/">Phil Winstanley</a> and <a href="http://www.ipona.com/">Dave
Sussman</a>, have asked me to pass along that they're doing an upcoming DeveloperDeveloperDeveloper
event in Galway, Ireland on 3 May.  So on the off chance I have some readers
in that area, I figured I'd pass it along.
</p>
        <p>
          <a href="http://www.dddireland.com/">Enjoy!</a>
        </p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2" />
      </body>
      <title>DeveloperDeveloperDeveloper Ireland</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2.aspx</guid>
      <link>http://dotNetTemplar.Net/DeveloperDeveloperDeveloper+Ireland.aspx</link>
      <pubDate>Tue, 15 Apr 2008 21:13:13 GMT</pubDate>
      <description>&lt;p&gt;
A few buddies of mine, &lt;a href="http://weblogs.asp.net/plip/"&gt;Phil Winstanley&lt;/a&gt; and &lt;a href="http://www.ipona.com/"&gt;Dave
Sussman&lt;/a&gt;, have asked me to pass along that they're doing an upcoming DeveloperDeveloperDeveloper
event in Galway, Ireland on 3 May.&amp;nbsp; So on the off chance I have some readers
in that area, I figured I'd pass it along.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dddireland.com/"&gt;Enjoy!&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,86ff2a90-fb9f-47e0-aaf3-0fb0769cd2f2.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=93662066-e506-4d73-a17a-6346fcbf2f22</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,93662066-e506-4d73-a17a-6346fcbf2f22.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,93662066-e506-4d73-a17a-6346fcbf2f22.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=93662066-e506-4d73-a17a-6346fcbf2f22</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm becoming more and more averse to the term architecture and architect in terms
of creating software, partially because it is such an overloaded term that seems to
cause so much continual opining about its meaning but, more importantly, because I
don't think it is like what we do, at least not to the extent that seems to be commonly
thought.
</p>
        <p>
We are not building houses (or bridges, or skyscrapers, or cities).  Houses,
and other physical constructions, rely on pretty much immutable laws of nature, of
physics, chemistry, etc.  These sciences are sciences in the established sense--you
can perform experiments repeatedly and get the same results, and others who perform
those experiments will get the same results.  Physical building, architecture,
and engineering is fundamentally a scientific endeavor because it is essentially serving
scientific laws.<sup>1</sup></p>
        <p>
          <u>
            <strong>Software Serves Human Social Needs</strong>
            <br />
          </u>Software, on the other hand, is fundamentally a human and social endeavor. 
Above the basic electrical and magnetic level, i.e., hardware, it is purely human
constructs built on layers of human-created abstractions built to serve human social
needs--for, ultimately, business or pleasure.  As such, we (as a human industry)
are pretty much free to create the abstractions as we see fit.  
</p>
        <p>
Beyond the basic hardware translation layer, we are not bound by elemental laws, only
by our imagination.  The problem is, it seems to me, that early software development
was very closely tied to the electrical engineering disciplines that gave birth to
computing machinery, so the early abstractions were engineering-oriented and assumed
an unnecessary scientific and engineering bent.  Subsequent developments, for
the most part, have built on this engineering basis, and our educational system has
perpetuated it.  Even though relatively few software creators these days need
to understand the inner workings of the hardware (and even one layer of abstraction
up), such low-level engineering is at the core of many computer science curricula.
</p>
        <p>
As the power of computing machinery has grown, we've expanded the uses of software
to take advantage of the new power, but we have remained an essentially engineering-based
culture and have accrued other engineering-related words such as architecture and
architect.  We have engineers and developers, systems analysts, and architects. 
We have projects and project managers, and many try to manage software projects as
if they were building projects.  We have builds, and we say we're building or
developing or engineering software.
</p>
        <p>
We have, built into our very language, an implicit association with physical building,
and we have the association repeatedly reinforced by those who want to draw direct
analogies between our trades.  Certainly, there are similarities, but I tend
to think much of those similarities have been manufactured--they're not inherent to
the nature of software.  We've painted ourselves into a corner by such analogies
and borrowing of techniques and language.
</p>
        <p>
          <u>
            <strong>Perceived Crisis of Complexity and Terminology</strong>
          </u>
          <br />
Now we're having this crisis, as some seem to paint it, where we need to elaborate
further and push the idea that our systems are like cities and that we need varying
levels and kinds of architects to help plan, build, maintain, and expand these software
cities.  We have folks struggling to define what an architect is, what architecture
is, and creating various stratifications within it to expand on this analogy. 
We purportedly need enterprise architects, solutions architects, infrastructure architects,
data architects, and more.
</p>
        <p>
There is I think a well-intentioned effort to fix it because we do see this corner
we've painted ourselves into, but we're reaching for the paint brush and bucket to
solve it--reaching for those same ill-fashioned analogies, techniques, mindset, and
culture.  We see all this accrued complexity, and our solution is to make things
even more complex, both terminologically and systematically, because we're engineers
and scientists, and scientific problems are solved with scientific methods and precision,
no?. 
</p>
        <p>
It seems the underlying problem is that we're approaching the problem all wrong. 
The problems we're solving are fundamentally human problems, particularly social problems. 
And by social, I don't mean social networking software that is now en vogue; I mean
social in the basic sense of dealing with interactions between humans, be that economic,
entertainment, education, social connection, or whatever.  It follows, then,
that the best solution will be fundamentally human in nature, not scientific, not
engineering.
</p>
        <p>
          <strong>
            <u>Realigning with Our Core Problem Domain</u>
          </strong>
          <br />
Maybe we should avoid likening ourselves to engineering and scientific disciplines,
and especially, we should shun terminology that ties us to them and binds our thinking
into those molds.  As a man thinks, so is he, as the saying goes.  Surely,
we can and should learn what we can from other disciplines, but we need to be more
reticent to insinuate them into our own as we have done with building.
</p>
        <p>
I do think various solutions have been tried to better align software with its problem
domain.  Object-oriented design is at a generic level an attempt to urge this
sort of alignment, as is its more developed kin, domain-driven design.  Agile
and its like work toward human-oriented processes for creating software.  Natural
language systems, workflow systems, small-scale (solution-level) rule engines, and
even some higher-level languages have attempted this.  And in fact, as a rule,
I think they succeed better than those more closely tied to the computing and building
conceptual models, except that even these more human-oriented abstractions are chained
by the lower level abstractions we've created.
</p>
        <p>
What we need to do is continue to develop those human-oriented models of creating
software.  It seems that we may be at a breaking point, however, for our continued
use of the building paradigm.  Our repeated struggles with the terminology certainly
seem to speak to that.  Our terribly confused and complicated enterprise systems
landscape seems to speak to that.  Our control-driven, formal, gated processes
have been most well shown to be broken and inappropriate to the task of software creation.
</p>
        <p>
          <strong>
            <u>New Terminology</u>
          </strong>
          <br />
To make the next step, perhaps we should reexamine at a fundamental level how we think
about software, both the artifacts <em>and </em>how we create them.  I think
we need to make a clean break with the engineering and building analogy.  Start
fresh.  Unshackle our minds.  Maybe we need to drill down the abstraction
layers and figure out where we can most effectively make the transition from hardware
control to our human, social domain.  I imagine it would be lower than we have
it now.  Or maybe it is just a matter of creating a better language, an intentional
language (or languages) and a move away from our control-oriented languages.  
</p>
        <p>
At a higher level, we certainly need to rethink how we think about what we do. 
Some folks talk about the "architect" being the "bridge" (or translator)
between the business and the technical folks.  If that is a technical role, which
I tend to doubt, it seems like a more appropriate title would be Technical Bridge
or Technical Translator or Technical Business Facilitator or even just Software Facilitator.  <em>Call
it what it is</em>--don't draw unnecessarily from another dubiously-related profession.
</p>
        <p>
But maybe thinking this role is best served with a technical person is not ideal. 
Maybe we technical folks are again trying to solve the problem with the wrong tools--<em>us</em>.  
Well-intentioned though many are, if we are technical in tendency, skills, talent,
and experience, we are not as well equipped to understand the squishy, human needs
that software serves or best identify how to solve such squishy human problems.
</p>
        <p>
Since software is essentially a human-oriented endeavor, perhaps we need a role more
like that which has been emerging on the UX side of things, such as [user] experience
designer or interaction designer.  They are better-equipped to really grok the
essentially human needs being addressed by the software, and they can provide precise
enough specification and translation to technical folks to create the experiences
they're designing, even with the tools we have today.
</p>
        <p>
Then again, some say that architects are the ones concerned with high-level, "important"
views of a solution, interactions among individual pieces, that they are those who
model these high-level concerns and even provide concrete tools and frameworks to
help effectively piece them together.  I say that we could call this role solution
coordinator, solution designer, or solution modeler.  But then, according to
folks like Eric Evans, these folks should be hands-on to be effective,<sup>2</sup> which
I also believe to be true.  In that case, what they become, really, is a kind
of manager or, simply, team leader, someone who's been there and done that and can
help guide others in the best way to do it.  At this point, the skills needed
are essentially technical and usually just a matured version of those actually crafting
the solution.  
</p>
        <p>
Instead of software developers and architects, how about we just have <em>technical
craftsmen?</em>  The term is appropriate--we are shaping (crafting) technology
for human use; it also scales well--you can add the usual qualifiers like "lead,"
"manager," "senior," whatever fits your needs.  There's no
unnecessary distinction between activities--whether the craftsman is working on a
higher-level design or a lower-level, it is all essentially the activity of shaping
technology for human use.  Depending on the scale of the team/endeavor, one craftsman
may handle all levels of the craft or only part, and in the latter case, the division
can easily be made based on experience and leadership.  And finally, it does
not introduce cognitive dissonance through extremely-overextended and inaccurate analogy
(like developer and architect).
</p>
        <p>
Even if you don't like the term craftsman--we could collaborate to choose another
that doesn't chain us to wrong thinking--the point remains that we should recognize
that we've introduced unnecessary and unhelpful distinction in our discipline by using
the dev and architect terminology.  We could begin to solve the conundrum by
abandoning these titles.
</p>
        <p>
          <strong>
            <u>Resisting the Urge to Rationalize and Control</u>
          </strong>
          <br />
Also, by looking at each solution as a craft--an individual solution tailored to address
a particular human problem, it becomes clearer that we need not be so ready to try
to rationalize all of these solutions into some greater system.  As soon as we
do that, we fall back into the engineering and computing mode of thinking that will
begin to impose unnatural constraints on the solutions and inhibit their ability to
precisely and accurately solve the particular human need.<sup>3</sup>  
</p>
        <p>
As I <a title="in 'Software as a Biological Ecosystem'" href="http://dotnettemplar.net/Software+As+A+Biological+Ecosystem.aspx">suggested
before</a>, we should rather treat these solutions more like a biological ecosystem--letting
selection and genetic mutation mechanisms prevail in a purely pragmatic way that such
systems have so well embedded in their nature.  I believe it is a misplaced good
intention to try to govern these systems in a rationalistic, control-driven way. 
We deceive ourselves into thinking that we are managing complexity and increasing
efficiency when in reality we are increasing complexity that then, recursively, also
has to be managed in such a philosophy (creating an infinite complexity management
loop).  We also reduce efficiency and effectiveness (well-fittedness) of solutions
by interfering with solutions with controls and imposing artificial, external constraints
on them to serve our governance schemes.<sup>4</sup></p>
        <p>
          <strong>
            <u>Wrapping It All Up</u>
          </strong>
          <br />
Once we stop trying to align ourselves with a fundamentally different endeavor--physical
building--we free ourselves to essentially orient what we're doing towards the right
domain--human social problems.  In doing so, we can re-examine our abstraction
layers to ensure they most effectively fit that domain at the lowest possible level,
and then we can start building new layers as needed to further enable effective (well-fitted)
solutions for that domain.  By changing our language, we solve cognitive dissonance
and illuminate where distinctions are truly needed, <em>or not needed</em>, and may
even recognize where skills that are <em>not </em>inherently technical would better
serve our solutions (such as UX pros).  And lastly, by treating the solutions
as fundamentally human, we recognize that the most efficient, effective, time-tested<sup>5</sup> and
proven technique for managing them is more biological and less rational.  We
see that they can best manage themselves, adapting as needed, to fit their environment
in the most appropriate way possible.
</p>
        <p>
If we're going to have a go at fixing the perceived current problem of complexity
in software and, by extension, further understand how to solve it through our profession,
I suggest that a somewhat radical departure from our current mode of thinking is needed,
that we need to break away from the physical building analogy, and it seems to me
that something like what I propose above has the most long-term promise for such a
solution.  What do you think?
</p>
        <p>
          <span style="font-weight: bold; text-decoration: underline">Notes</span>
          <br />
1. I should note that I recognize the artistic and ultimately social aspects physical
constructions; however, they are still fundamentally physical in nature--bridges are
physically needed to facilitate crossing of water or expanse, buildings are needed
physically for shelter.  The social aspects are adornments not inherent to the
basic problems that these constructions solve.  The same cannot be said of software;
it exists solely to serve human social advancement in one form or another. 
<br />
2. See Eric Evan's "Hands-On Modeler" in <em>Domain-Driven Design: Tackling
Complexity in the Heart of Software</em>. 
<br />
2. As an aside, I truly do wonder why we should have to try to convince businesses
of the need for the "architect" role.  If you ask me, the need, and
our value/solution, should be obvious.  If it takes a lot of talking and hand
waving, maybe we should question if the solution we're proposing is actually the right
one.  ? 
<br />
3. I have to nuance this.  Obviously, if there are governmental regulations you
have to follow, some such controls are required; however, if you think about it, this
is still adapting the solution to best fit the human problem because the human problem
likely involves some need of societal protection.  Certainly not all systems
need such controls, and even only some within an organization need them.  Keep
the controls scoped to the solutions that require them due to the human social conditions. 
On the whole, I'd say that there are vastly far more systems that don't need them,
though the ones that do loom large in our minds. 
<br />
4. By this I mean to say that, according to evolutionary theory, biological processes
have developed over many millions of years and have proven themselves as an effective
means for highly emergent, living systems to self-govern.  Businesses and human
social structures in general, especially these days, are highly emergent, dynamic,
and living and need software that reflects that mode of being.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=93662066-e506-4d73-a17a-6346fcbf2f22" />
      </body>
      <title>Creating Software is Not Like Building</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,93662066-e506-4d73-a17a-6346fcbf2f22.aspx</guid>
      <link>http://dotNetTemplar.Net/Creating+Software+Is+Not+Like+Building.aspx</link>
      <pubDate>Tue, 15 Apr 2008 08:04:01 GMT</pubDate>
      <description>&lt;p&gt;
I'm becoming more and more averse to the term architecture and architect in terms
of creating software, partially because it is such an overloaded term that seems to
cause so much continual opining about its meaning but, more importantly, because I
don't think it is like what we do, at least not to the extent that seems to be commonly
thought.
&lt;/p&gt;
&lt;p&gt;
We are not building houses (or bridges, or skyscrapers, or cities).&amp;#160; Houses,
and other physical constructions, rely on pretty much immutable laws of nature, of
physics, chemistry, etc.&amp;#160; These sciences are sciences in the established sense--you
can perform experiments repeatedly and get the same results, and others who perform
those experiments will get the same results.&amp;#160; Physical building, architecture,
and engineering is fundamentally a scientific endeavor because it is essentially serving
scientific laws.&lt;sup&gt;1&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;strong&gt;Software Serves Human Social Needs&lt;/strong&gt; 
&lt;br /&gt;
&lt;/u&gt;Software, on the other hand, is fundamentally a human and social endeavor.&amp;#160;
Above the basic electrical and magnetic level, i.e., hardware, it is purely human
constructs built on layers of human-created abstractions built to serve human social
needs--for, ultimately, business or pleasure.&amp;#160; As such, we (as a human industry)
are pretty much free to create the abstractions as we see fit.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Beyond the basic hardware translation layer, we are not bound by elemental laws, only
by our imagination.&amp;#160; The problem is, it seems to me, that early software development
was very closely tied to the electrical engineering disciplines that gave birth to
computing machinery, so the early abstractions were engineering-oriented and assumed
an unnecessary scientific and engineering bent.&amp;#160; Subsequent developments, for
the most part, have built on this engineering basis, and our educational system has
perpetuated it.&amp;#160; Even though relatively few software creators these days need
to understand the inner workings of the hardware (and even one layer of abstraction
up), such low-level engineering is at the core of many computer science curricula.
&lt;/p&gt;
&lt;p&gt;
As the power of computing machinery has grown, we've expanded the uses of software
to take advantage of the new power, but we have remained an essentially engineering-based
culture and have accrued other engineering-related words such as architecture and
architect.&amp;#160; We have engineers and developers, systems analysts, and architects.&amp;#160;
We have projects and project managers, and many try to manage software projects as
if they were building projects.&amp;#160; We have builds, and we say we're building or
developing or engineering software.
&lt;/p&gt;
&lt;p&gt;
We have, built into our very language, an implicit association with physical building,
and we have the association repeatedly reinforced by those who want to draw direct
analogies between our trades.&amp;#160; Certainly, there are similarities, but I tend
to think much of those similarities have been manufactured--they're not inherent to
the nature of software.&amp;#160; We've painted ourselves into a corner by such analogies
and borrowing of techniques and language.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;strong&gt;Perceived Crisis of Complexity and Terminology&lt;/strong&gt;&lt;/u&gt; 
&lt;br /&gt;
Now we're having this crisis, as some seem to paint it, where we need to elaborate
further and push the idea that our systems are like cities and that we need varying
levels and kinds of architects to help plan, build, maintain, and expand these software
cities.&amp;#160; We have folks struggling to define what an architect is, what architecture
is, and creating various stratifications within it to expand on this analogy.&amp;#160;
We purportedly need enterprise architects, solutions architects, infrastructure architects,
data architects, and more.
&lt;/p&gt;
&lt;p&gt;
There is I think a well-intentioned effort to fix it because we do see this corner
we've painted ourselves into, but we're reaching for the paint brush and bucket to
solve it--reaching for those same ill-fashioned analogies, techniques, mindset, and
culture.&amp;#160; We see all this accrued complexity, and our solution is to make things
even more complex, both terminologically and systematically, because we're engineers
and scientists, and scientific problems are solved with scientific methods and precision,
no?. 
&lt;/p&gt;
&lt;p&gt;
It seems the underlying problem is that we're approaching the problem all wrong.&amp;#160;
The problems we're solving are fundamentally human problems, particularly social problems.&amp;#160;
And by social, I don't mean social networking software that is now en vogue; I mean
social in the basic sense of dealing with interactions between humans, be that economic,
entertainment, education, social connection, or whatever.&amp;#160; It follows, then,
that the best solution will be fundamentally human in nature, not scientific, not
engineering.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Realigning with Our Core Problem Domain&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
Maybe we should avoid likening ourselves to engineering and scientific disciplines,
and especially, we should shun terminology that ties us to them and binds our thinking
into those molds.&amp;#160; As a man thinks, so is he, as the saying goes.&amp;#160; Surely,
we can and should learn what we can from other disciplines, but we need to be more
reticent to insinuate them into our own as we have done with building.
&lt;/p&gt;
&lt;p&gt;
I do think various solutions have been tried to better align software with its problem
domain.&amp;#160; Object-oriented design is at a generic level an attempt to urge this
sort of alignment, as is its more developed kin, domain-driven design.&amp;#160; Agile
and its like work toward human-oriented processes for creating software.&amp;#160; Natural
language systems, workflow systems, small-scale (solution-level) rule engines, and
even some higher-level languages have attempted this.&amp;#160; And in fact, as a rule,
I think they succeed better than those more closely tied to the computing and building
conceptual models, except that even these more human-oriented abstractions are chained
by the lower level abstractions we've created.
&lt;/p&gt;
&lt;p&gt;
What we need to do is continue to develop those human-oriented models of creating
software.&amp;#160; It seems that we may be at a breaking point, however, for our continued
use of the building paradigm.&amp;#160; Our repeated struggles with the terminology certainly
seem to speak to that.&amp;#160; Our terribly confused and complicated enterprise systems
landscape seems to speak to that.&amp;#160; Our control-driven, formal, gated processes
have been most well shown to be broken and inappropriate to the task of software creation.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;New Terminology&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
To make the next step, perhaps we should reexamine at a fundamental level how we think
about software, both the artifacts &lt;em&gt;and &lt;/em&gt;how we create them.&amp;#160; I think
we need to make a clean break with the engineering and building analogy.&amp;#160; Start
fresh.&amp;#160; Unshackle our minds.&amp;#160; Maybe we need to drill down the abstraction
layers and figure out where we can most effectively make the transition from hardware
control to our human, social domain.&amp;#160; I imagine it would be lower than we have
it now.&amp;#160; Or maybe it is just a matter of creating a better language, an intentional
language (or languages) and a move away from our control-oriented languages.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
At a higher level, we certainly need to rethink how we think about what we do.&amp;#160;
Some folks talk about the &amp;quot;architect&amp;quot; being the &amp;quot;bridge&amp;quot; (or translator)
between the business and the technical folks.&amp;#160; If that is a technical role, which
I tend to doubt, it seems like a more appropriate title would be Technical Bridge
or Technical Translator or Technical Business Facilitator or even just Software Facilitator.&amp;#160; &lt;em&gt;Call
it what it is&lt;/em&gt;--don't draw unnecessarily from another dubiously-related profession.
&lt;/p&gt;
&lt;p&gt;
But maybe thinking this role is best served with a technical person is not ideal.&amp;#160;
Maybe we technical folks are again trying to solve the problem with the wrong tools--&lt;em&gt;us&lt;/em&gt;.&amp;#160;&amp;#160;
Well-intentioned though many are, if we are technical in tendency, skills, talent,
and experience, we are not as well equipped to understand the squishy, human needs
that software serves or best identify how to solve such squishy human problems.
&lt;/p&gt;
&lt;p&gt;
Since software is essentially a human-oriented endeavor, perhaps we need a role more
like that which has been emerging on the UX side of things, such as [user] experience
designer or interaction designer.&amp;#160; They are better-equipped to really grok the
essentially human needs being addressed by the software, and they can provide precise
enough specification and translation to technical folks to create the experiences
they're designing, even with the tools we have today.
&lt;/p&gt;
&lt;p&gt;
Then again, some say that architects are the ones concerned with high-level, &amp;quot;important&amp;quot;
views of a solution, interactions among individual pieces, that they are those who
model these high-level concerns and even provide concrete tools and frameworks to
help effectively piece them together.&amp;#160; I say that we could call this role solution
coordinator, solution designer, or solution modeler.&amp;#160; But then, according to
folks like Eric Evans, these folks should be hands-on to be effective,&lt;sup&gt;2&lt;/sup&gt; which
I also believe to be true.&amp;#160; In that case, what they become, really, is a kind
of manager or, simply, team leader, someone who's been there and done that and can
help guide others in the best way to do it.&amp;#160; At this point, the skills needed
are essentially technical and usually just a matured version of those actually crafting
the solution.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Instead of software developers and architects, how about we just have &lt;em&gt;technical
craftsmen?&lt;/em&gt;&amp;#160; The term is appropriate--we are shaping (crafting) technology
for human use; it also scales well--you can add the usual qualifiers like &amp;quot;lead,&amp;quot;
&amp;quot;manager,&amp;quot; &amp;quot;senior,&amp;quot; whatever fits your needs.&amp;#160; There's no
unnecessary distinction between activities--whether the craftsman is working on a
higher-level design or a lower-level, it is all essentially the activity of shaping
technology for human use.&amp;#160; Depending on the scale of the team/endeavor, one craftsman
may handle all levels of the craft or only part, and in the latter case, the division
can easily be made based on experience and leadership.&amp;#160; And finally, it does
not introduce cognitive dissonance through extremely-overextended and inaccurate analogy
(like developer and architect).
&lt;/p&gt;
&lt;p&gt;
Even if you don't like the term craftsman--we could collaborate to choose another
that doesn't chain us to wrong thinking--the point remains that we should recognize
that we've introduced unnecessary and unhelpful distinction in our discipline by using
the dev and architect terminology.&amp;#160; We could begin to solve the conundrum by
abandoning these titles.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Resisting the Urge to Rationalize and Control&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
Also, by looking at each solution as a craft--an individual solution tailored to address
a particular human problem, it becomes clearer that we need not be so ready to try
to rationalize all of these solutions into some greater system.&amp;#160; As soon as we
do that, we fall back into the engineering and computing mode of thinking that will
begin to impose unnatural constraints on the solutions and inhibit their ability to
precisely and accurately solve the particular human need.&lt;sup&gt;3&lt;/sup&gt;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
As I &lt;a title="in &amp;#39;Software as a Biological Ecosystem&amp;#39;" href="http://dotnettemplar.net/Software+As+A+Biological+Ecosystem.aspx"&gt;suggested
before&lt;/a&gt;, we should rather treat these solutions more like a biological ecosystem--letting
selection and genetic mutation mechanisms prevail in a purely pragmatic way that such
systems have so well embedded in their nature.&amp;#160; I believe it is a misplaced good
intention to try to govern these systems in a rationalistic, control-driven way.&amp;#160;
We deceive ourselves into thinking that we are managing complexity and increasing
efficiency when in reality we are increasing complexity that then, recursively, also
has to be managed in such a philosophy (creating an infinite complexity management
loop).&amp;#160; We also reduce efficiency and effectiveness (well-fittedness) of solutions
by interfering with solutions with controls and imposing artificial, external constraints
on them to serve our governance schemes.&lt;sup&gt;4&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Wrapping It All Up&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
Once we stop trying to align ourselves with a fundamentally different endeavor--physical
building--we free ourselves to essentially orient what we're doing towards the right
domain--human social problems.&amp;#160; In doing so, we can re-examine our abstraction
layers to ensure they most effectively fit that domain at the lowest possible level,
and then we can start building new layers as needed to further enable effective (well-fitted)
solutions for that domain.&amp;#160; By changing our language, we solve cognitive dissonance
and illuminate where distinctions are truly needed, &lt;em&gt;or not needed&lt;/em&gt;, and may
even recognize where skills that are &lt;em&gt;not &lt;/em&gt;inherently technical would better
serve our solutions (such as UX pros).&amp;#160; And lastly, by treating the solutions
as fundamentally human, we recognize that the most efficient, effective, time-tested&lt;sup&gt;5&lt;/sup&gt; and
proven technique for managing them is more biological and less rational.&amp;#160; We
see that they can best manage themselves, adapting as needed, to fit their environment
in the most appropriate way possible.
&lt;/p&gt;
&lt;p&gt;
If we're going to have a go at fixing the perceived current problem of complexity
in software and, by extension, further understand how to solve it through our profession,
I suggest that a somewhat radical departure from our current mode of thinking is needed,
that we need to break away from the physical building analogy, and it seems to me
that something like what I propose above has the most long-term promise for such a
solution.&amp;#160; What do you think?
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-weight: bold; text-decoration: underline"&gt;Notes&lt;/span&gt; 
&lt;br /&gt;
1. I should note that I recognize the artistic and ultimately social aspects physical
constructions; however, they are still fundamentally physical in nature--bridges are
physically needed to facilitate crossing of water or expanse, buildings are needed
physically for shelter.&amp;#160; The social aspects are adornments not inherent to the
basic problems that these constructions solve.&amp;#160; The same cannot be said of software;
it exists solely to serve human social advancement in one form or another. 
&lt;br /&gt;
2. See Eric Evan's &amp;quot;Hands-On Modeler&amp;quot; in &lt;em&gt;Domain-Driven Design: Tackling
Complexity in the Heart of Software&lt;/em&gt;. 
&lt;br /&gt;
2. As an aside, I truly do wonder why we should have to try to convince businesses
of the need for the &amp;quot;architect&amp;quot; role.&amp;#160; If you ask me, the need, and
our value/solution, should be obvious.&amp;#160; If it takes a lot of talking and hand
waving, maybe we should question if the solution we're proposing is actually the right
one.&amp;#160; ? 
&lt;br /&gt;
3. I have to nuance this.&amp;#160; Obviously, if there are governmental regulations you
have to follow, some such controls are required; however, if you think about it, this
is still adapting the solution to best fit the human problem because the human problem
likely involves some need of societal protection.&amp;#160; Certainly not all systems
need such controls, and even only some within an organization need them.&amp;#160; Keep
the controls scoped to the solutions that require them due to the human social conditions.&amp;#160;
On the whole, I'd say that there are vastly far more systems that don't need them,
though the ones that do loom large in our minds. 
&lt;br /&gt;
4. By this I mean to say that, according to evolutionary theory, biological processes
have developed over many millions of years and have proven themselves as an effective
means for highly emergent, living systems to self-govern.&amp;#160; Businesses and human
social structures in general, especially these days, are highly emergent, dynamic,
and living and need software that reflects that mode of being.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=93662066-e506-4d73-a17a-6346fcbf2f22" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,93662066-e506-4d73-a17a-6346fcbf2f22.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=30fba7df-fcd0-4869-96a7-52ff40108cc4</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,30fba7df-fcd0-4869-96a7-52ff40108cc4.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,30fba7df-fcd0-4869-96a7-52ff40108cc4.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=30fba7df-fcd0-4869-96a7-52ff40108cc4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In his article, "<a title="Martin Fowler's 'Who Needs an Architect?'" href="http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf" target="_blank">Who
Needs an Architect?</a>", Martin Fowler says:
</p>
        <blockquote>
          <p>
At a fascinating talk at the XP 2002 conference<sup>1</sup>, Enrico Zaninotto, an
economist, analyzed the underlying thinking behind agile ideas in manufacturing and
software development. One aspect I found particularly interesting was his comment
that irreversibility was one of the prime drivers of complexity. He saw agile methods,
in manufacturing and software development, as a shift that seeks to contain complexity
by reducing irreversibility—as opposed to tackling other complexity drivers.
I think that one of an architect’s most important tasks is to remove architecture
by finding ways to eliminate irreversibility in software designs.
</p>
        </blockquote>
        <p>
How interestingly this melds with my recent thoughts on managing complexity.<sup>2</sup> You
see, adding processes, management systems, and "governance" in general makes
things more ossified, more difficult to change, i.e., less reversible.  According
to Zaninotto, this would mean that the more governance we put in place to, theoretically,
manage the complexity of our software systems, the more complex they are bound to
become, which I think logically means that we are increasing our complexity woes rather
than helping them through such efforts.
</p>
        <p>
I came across this in a recent thread on our (now-retired-)architect MVP email list,
where the age-old discussion of "what is an architect?" has come up again. 
I have to admit, when I first seriously confronted this question, I was drawn in and
fascinated.  I even wrote an article about it on ASPAlliance.<sup>3</sup> 
Since writing that, I've been keeping an eye on the developments at <a title="IASA - International Association of Software Architects" href="http://www.iasahome.org" target="_blank">IASA</a> and
elsewhere in this space, and developing my own thoughts.
</p>
        <p>
I've delved even more into agile approaches, particularly Scrum and domain-driven
design (DDD), and into this thing we call "user experience,"<sup>4</sup> which
at first glance seems counter to our architectural/engineering approaches to building
software.  I've gained more experience building software as an architect and
manager and observing software being built at the commercial level.  I've been
more involved in the business and marketing side of things, and I've been blessed
with the opportunity to learn from some of the leading minds in our profession.  
</p>
        <p>
At this point, I'm of the <em>get 'er done</em> school, which I suppose might map
loosely to Fowler's <em>Architectus Oryzus</em>, Eric Evans' <em>Hands On Modeler</em>,
and others along those lines.  I'm bought into User-Centered Design (or human-centered
design, for those who prefer that), though I think we need to figure out a good way
to merge DDD with UCD and a smattering of service orientation (as needed!) to make
software the best it can be.
</p>
        <p>
Software is complex enough without our making it more so with artificial taxonomic
and gubernatorial schemes.  Software should be teleological by nature. 
It exists to serve an end, a purpose, and if it isn't serving that purpose, the answer
is not to create counterproductive metastructures around it but rather to make the
software itself better.
</p>
        <p>
One of the chief complaints about IT is that we seem resistant to change or at least
that we can't change at the speed of business.  Putting more processes, formalization,
standardization, etc. in place exacerbates that problem.  The other biggie is
that software doesn't meet the need it was designed to meet.  Both of these,
at their core, have the same problem--ineffective and inefficient processes that are
put in place to manage or govern the project.
</p>
        <p>
I tend to think that projects need managing less than people need managing or, rather,
coaching.  You get the right people, you give them the equipment, the training,
and the opportunity to do the right thing, and you get out the way and <em>help</em> them
do it.  You don't manage to dates (or specs!); you manage to results.  If
you don't have a solution that meets or exceeds the need at the end of the day, you
failed.  In fact, I might go as far to say that if what you built matches the
original specs, you did something wrong.
</p>
        <p>
Any managerial involvement should have a <em>concrete and direct</em> end in mind. 
For instance, coordination with marketing and other groups requires some management,
but such management should be <em>communication</em>-oriented, not <em>control</em>-oriented. 
Start small and evolve your management over time.  Management, like other things
that are designed, is best evolved over time<sup>5</sup> to meet these concrete, <em>real</em> needs--and
you should keep an eye out for vestigial management that can be extracted.  
</p>
        <p>
Similarly, I don't think we need to tackle the software (IT) profession by trying
to define and stratify everything we do.  In fact, I feel it would be a rather
monumental waste of our collective valuable time.  One thing is certain, <em>our
profession will change</em>.  New technologies and new ideas will combine with
the rapidly changing business needs, and new roles will emerge while old roles will
become irrelevant (or at least subsumed into new roles).  Monolithic efforts
at cataloguing and defining (and by extension attempting to control) will, in the
best of all possible worlds, be useful only for a short time.
</p>
        <p>
It's clear that there are many approaches to doing software.  It's axiomatic
that there are many distinct, even unique business needs (inasmuch as there are many
unique individuals in the businesses).  What we should be doing, as a profession,
(indeed what I imagine and hope most of us <em>are</em> doing) is focusing on how
to make great, successful software, not wiling away our lives and energy talking about
ourselves.  
</p>
        <p>
If you ask me what I do (e.g., on a demographic form), I tend to put software maker,
or just software.  Obviously, that's not specific enough for hiring purposes. 
But really, in hiring, we're really looking for knowledge, experience, skills, talents,
and attributes, not a role or title.  A title is just a hook, a handy way to
get someone interested.  If the market shows that using "architect"
in a title catches the attention you want, use it (whether you're a worker or looking
for workers).  The job description and interview process will filter at a finer
level to see if there's a match.
</p>
        <p>
Outside of that, we don't really need to spend a lot time discussing it.  We're
all just <em>making software</em>.  We all have unique knowledge, experience,
talents, skills, and attributes, so there really is very little use in trying to categorize
it much beyond the basic level.  So how about we stop agonizing over defining
and stratifying "architecture" and "architect," stop worrying
about controlling and governing and taxonomifying, and instead invest all that valuable
time in just doing what we do--better!?
</p>
        <p>
          <span style="font-weight: bold; text-decoration: underline">Notes</span>
          <br />
1.  More at <a href="http://martinfowler.com/articles/xp2002.html">http://martinfowler.com/articles/xp2002.html</a>. 
<br />
2. See <a title="Read 'One System to Rule Them All - Managing Complexity with Complexity'" href="http://dotNetTemplar.Net/One+System+To+Rule+Them+All+Managing+Complexity+With+Complexity.aspx">One
System to Rule Them All - Managing Complexity with Complexity</a> and <a title="Read 'Software as a Biological Ecosystem'" href="http://dotNetTemplar.Net/Software+As+A+Biological+Ecosystem.aspx">Software
as a Biological Ecosystem</a>. 
<br />
3.  Read <a title="Read 'What is Your Quest?' - Determining the Difference Between Being an Architect and Being a Developer" href="http://aspalliance.com/777_What_is_Your_Quest__Determining_the_Difference_Between_Being_an_Architect_and_Being_a_Developer" target="_blank">"What
is Your Quest?" - Determining the Difference Between Being an Architect and Being
a Developer</a>. 
<br />
4.  Good place to start: <a title="http://en.wikipedia.org/wiki/User_experience" href="http://en.wikipedia.org/wiki/User_experience">http://en.wikipedia.org/wiki/User_experience</a><br />
5.  This principle is discussed, for example, in <a title="wikipedia on Donald Norman" href="http://en.wikipedia.org/wiki/Donald_Norman" target="_blank">Donald
Norman's</a><em>Design of Everyday Things</em>.  <a title="wikipedia on Christopher Alexander" href="http://en.wikipedia.org/wiki/Christopher_Alexander" target="_blank">Christopher
Alexander</a> also discusses a similar principle in <em>The Timeless Way of Building</em>.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=30fba7df-fcd0-4869-96a7-52ff40108cc4" />
      </body>
      <title>Just Do It! or: How I Learned to Stop Worrying and Love the Job</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,30fba7df-fcd0-4869-96a7-52ff40108cc4.aspx</guid>
      <link>http://dotNetTemplar.Net/Just+Do+It+Or+How+I+Learned+To+Stop+Worrying+And+Love+The+Job.aspx</link>
      <pubDate>Sat, 12 Apr 2008 20:06:39 GMT</pubDate>
      <description>&lt;p&gt;
In his article, &amp;quot;&lt;a title="Martin Fowler&amp;#39;s &amp;#39;Who Needs an Architect?&amp;#39;" href="http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf" target="_blank"&gt;Who
Needs an Architect?&lt;/a&gt;&amp;quot;, Martin Fowler says:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
At a fascinating talk at the XP 2002 conference&lt;sup&gt;1&lt;/sup&gt;, Enrico Zaninotto, an
economist, analyzed the underlying thinking behind agile ideas in manufacturing and
software development. One aspect I found particularly interesting was his comment
that irreversibility was one of the prime drivers of complexity. He saw agile methods,
in manufacturing and software development, as a shift that seeks to contain complexity
by reducing irreversibility&amp;#8212;as opposed to tackling other complexity drivers.
I think that one of an architect&amp;#8217;s most important tasks is to remove architecture
by finding ways to eliminate irreversibility in software designs.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How interestingly this melds with my recent thoughts on managing complexity.&lt;sup&gt;2&lt;/sup&gt; You
see, adding processes, management systems, and &amp;quot;governance&amp;quot; in general makes
things more ossified, more difficult to change, i.e., less reversible.&amp;#160; According
to Zaninotto, this would mean that the more governance we put in place to, theoretically,
manage the complexity of our software systems, the more complex they are bound to
become, which I think logically means that we are increasing our complexity woes rather
than helping them through such efforts.
&lt;/p&gt;
&lt;p&gt;
I came across this in a recent thread on our (now-retired-)architect MVP email list,
where the age-old discussion of &amp;quot;what is an architect?&amp;quot; has come up again.&amp;#160;
I have to admit, when I first seriously confronted this question, I was drawn in and
fascinated.&amp;#160; I even wrote an article about it on ASPAlliance.&lt;sup&gt;3&lt;/sup&gt;&amp;#160;
Since writing that, I've been keeping an eye on the developments at &lt;a title="IASA - International Association of Software Architects" href="http://www.iasahome.org" target="_blank"&gt;IASA&lt;/a&gt; and
elsewhere in this space, and developing my own thoughts.
&lt;/p&gt;
&lt;p&gt;
I've delved even more into agile approaches, particularly Scrum and domain-driven
design (DDD), and into this thing we call &amp;quot;user experience,&amp;quot;&lt;sup&gt;4&lt;/sup&gt; which
at first glance seems counter to our architectural/engineering approaches to building
software.&amp;#160; I've gained more experience building software as an architect and
manager and observing software being built at the commercial level.&amp;#160; I've been
more involved in the business and marketing side of things, and I've been blessed
with the opportunity to learn from some of the leading minds in our profession.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
At this point, I'm of the &lt;em&gt;get 'er done&lt;/em&gt; school, which I suppose might map
loosely to Fowler's &lt;em&gt;Architectus Oryzus&lt;/em&gt;, Eric Evans' &lt;em&gt;Hands On Modeler&lt;/em&gt;,
and others along those lines.&amp;#160; I'm bought into User-Centered Design (or human-centered
design, for those who prefer that), though I think we need to figure out a good way
to merge DDD with UCD and a smattering of service orientation (as needed!) to make
software the best it can be.
&lt;/p&gt;
&lt;p&gt;
Software is complex enough without our making it more so with artificial taxonomic
and gubernatorial schemes.&amp;#160; Software should be teleological by nature.&amp;#160;
It exists to serve an end, a purpose, and if it isn't serving that purpose, the answer
is not to create counterproductive metastructures around it but rather to make the
software itself better.
&lt;/p&gt;
&lt;p&gt;
One of the chief complaints about IT is that we seem resistant to change or at least
that we can't change at the speed of business.&amp;#160; Putting more processes, formalization,
standardization, etc. in place exacerbates that problem.&amp;#160; The other biggie is
that software doesn't meet the need it was designed to meet.&amp;#160; Both of these,
at their core, have the same problem--ineffective and inefficient processes that are
put in place to manage or govern the project.
&lt;/p&gt;
&lt;p&gt;
I tend to think that projects need managing less than people need managing or, rather,
coaching.&amp;#160; You get the right people, you give them the equipment, the training,
and the opportunity to do the right thing, and you get out the way and &lt;em&gt;help&lt;/em&gt; them
do it.&amp;#160; You don't manage to dates (or specs!); you manage to results.&amp;#160; If
you don't have a solution that meets or exceeds the need at the end of the day, you
failed.&amp;#160; In fact, I might go as far to say that if what you built matches the
original specs, you did something wrong.
&lt;/p&gt;
&lt;p&gt;
Any managerial involvement should have a &lt;em&gt;concrete and direct&lt;/em&gt; end in mind.&amp;#160;
For instance, coordination with marketing and other groups requires some management,
but such management should be &lt;em&gt;communication&lt;/em&gt;-oriented, not &lt;em&gt;control&lt;/em&gt;-oriented.&amp;#160;
Start small and evolve your management over time.&amp;#160; Management, like other things
that are designed, is best evolved over time&lt;sup&gt;5&lt;/sup&gt; to meet these concrete, &lt;em&gt;real&lt;/em&gt; needs--and
you should keep an eye out for vestigial management that can be extracted.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Similarly, I don't think we need to tackle the software (IT) profession by trying
to define and stratify everything we do.&amp;#160; In fact, I feel it would be a rather
monumental waste of our collective valuable time.&amp;#160; One thing is certain, &lt;em&gt;our
profession will change&lt;/em&gt;.&amp;#160; New technologies and new ideas will combine with
the rapidly changing business needs, and new roles will emerge while old roles will
become irrelevant (or at least subsumed into new roles).&amp;#160; Monolithic efforts
at cataloguing and defining (and by extension attempting to control) will, in the
best of all possible worlds, be useful only for a short time.
&lt;/p&gt;
&lt;p&gt;
It's clear that there are many approaches to doing software.&amp;#160; It's axiomatic
that there are many distinct, even unique business needs (inasmuch as there are many
unique individuals in the businesses).&amp;#160; What we should be doing, as a profession,
(indeed what I imagine and hope most of us &lt;em&gt;are&lt;/em&gt; doing) is focusing on how
to make great, successful software, not wiling away our lives and energy talking about
ourselves.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
If you ask me what I do (e.g., on a demographic form), I tend to put software maker,
or just software.&amp;#160; Obviously, that's not specific enough for hiring purposes.&amp;#160;
But really, in hiring, we're really looking for knowledge, experience, skills, talents,
and attributes, not a role or title.&amp;#160; A title is just a hook, a handy way to
get someone interested.&amp;#160; If the market shows that using &amp;quot;architect&amp;quot;
in a title catches the attention you want, use it (whether you're a worker or looking
for workers).&amp;#160; The job description and interview process will filter at a finer
level to see if there's a match.
&lt;/p&gt;
&lt;p&gt;
Outside of that, we don't really need to spend a lot time discussing it.&amp;#160; We're
all just &lt;em&gt;making software&lt;/em&gt;.&amp;#160; We all have unique knowledge, experience,
talents, skills, and attributes, so there really is very little use in trying to categorize
it much beyond the basic level.&amp;#160; So how about we stop agonizing over defining
and stratifying &amp;quot;architecture&amp;quot; and &amp;quot;architect,&amp;quot; stop worrying
about controlling and governing and taxonomifying, and instead invest all that valuable
time in just doing what we do--better!?
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-weight: bold; text-decoration: underline"&gt;Notes&lt;/span&gt; 
&lt;br /&gt;
1.&amp;#160; More at &lt;a href="http://martinfowler.com/articles/xp2002.html"&gt;http://martinfowler.com/articles/xp2002.html&lt;/a&gt;. 
&lt;br /&gt;
2. See &lt;a title="Read &amp;#39;One System to Rule Them All - Managing Complexity with Complexity&amp;#39;" href="http://dotNetTemplar.Net/One+System+To+Rule+Them+All+Managing+Complexity+With+Complexity.aspx"&gt;One
System to Rule Them All - Managing Complexity with Complexity&lt;/a&gt; and &lt;a title="Read &amp;#39;Software as a Biological Ecosystem&amp;#39;" href="http://dotNetTemplar.Net/Software+As+A+Biological+Ecosystem.aspx"&gt;Software
as a Biological Ecosystem&lt;/a&gt;. 
&lt;br /&gt;
3.&amp;#160; Read &lt;a title="Read &amp;#39;What is Your Quest?&amp;#39; - Determining the Difference Between Being an Architect and Being a Developer" href="http://aspalliance.com/777_What_is_Your_Quest__Determining_the_Difference_Between_Being_an_Architect_and_Being_a_Developer" target="_blank"&gt;&amp;quot;What
is Your Quest?&amp;quot; - Determining the Difference Between Being an Architect and Being
a Developer&lt;/a&gt;. 
&lt;br /&gt;
4.&amp;#160; Good place to start: &lt;a title="http://en.wikipedia.org/wiki/User_experience" href="http://en.wikipedia.org/wiki/User_experience"&gt;http://en.wikipedia.org/wiki/User_experience&lt;/a&gt; 
&lt;br /&gt;
5.&amp;#160; This principle is discussed, for example, in &lt;a title="wikipedia on Donald Norman" href="http://en.wikipedia.org/wiki/Donald_Norman" target="_blank"&gt;Donald
Norman's&lt;/a&gt; &lt;em&gt;Design of Everyday Things&lt;/em&gt;.&amp;#160; &lt;a title="wikipedia on Christopher Alexander" href="http://en.wikipedia.org/wiki/Christopher_Alexander" target="_blank"&gt;Christopher
Alexander&lt;/a&gt; also discusses a similar principle in &lt;em&gt;The Timeless Way of Building&lt;/em&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=30fba7df-fcd0-4869-96a7-52ff40108cc4" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,30fba7df-fcd0-4869-96a7-52ff40108cc4.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=eec31a22-a454-4db3-8790-888aaeab9330</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,eec31a22-a454-4db3-8790-888aaeab9330.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,eec31a22-a454-4db3-8790-888aaeab9330.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=eec31a22-a454-4db3-8790-888aaeab9330</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally gave in and bought a graphics tablet.  My budget being as huge as it
was, I opted for the <a title="Wacom Bamboo" href="http://www.wacom.com/bambootablet/bamboo.cfm" target="_blank">Wacom
Bamboo</a>, which retails at $79, but ANTOnline (<a title="Wacom Bamboo on Amazon" href="http://www.amazon.com/gp/product/B000V9T2JA" target="_blank">via
Amazon</a>) had it for $50 plus shipping ($58 total).  I haven't been this tickled
to get a new gadget in a while.
</p>
        <p>
The whole experience thus far has been grand.  I placed the order at about 10p
on Tuesday night.  I got an email Wednesday night saying it had shipped, and
when I opened it Thursday morning and clicked the tracking number, I was informed
it was out for delivery--and I paid for standard shipping.  Awesome.
</p>
        <p>
I got the box later Thursday morning, and opened it to find a sleek box wrapped in
tissue paper, as if it were a gift.  After sliding it out of the tissue paper,
here's what I saw:<br /><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="496" alt="Wacom Bamboo Box" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02029.jpg" width="604" border="0" /></p>
        <p>
Not bad styling.  Let's open 'er up:<br /><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="635" alt="Wacom Bamboo Welcome Messages" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02030.jpg" width="604" border="0" /></p>
        <p>
"This is your Bamboo.  Use it to get more out of your computer.  Let us
know how it goes..."  In many languages.  Then it is signed by, presumably,
the creators.  Very nice touch, I thought.  I felt like a proud owner already. 
Then you lift up that insert, and there's the tablet in all its beauty.  Grab
it out--there's the cord, the pen, the pen holder.  Great.  Simple. Obvious. 
Beneath that is another tissue wrapped gift, a stylish little black box that has some
simple instructions on getting going and the DVD.
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="341" alt="Wacom Bamboo Open Box" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02031.jpg" width="604" border="0" />
        </p>
        <p>
Just opening the thing was a pleasure.  Honestly, these folks know what UX is,
and this is just for an $80 graphics tablet.  
</p>
        <p>
I plugged it in, and it immediately just worked.  Having read a comment somewhere,
I just went to the Web site to download the latest drivers.  That was easy. 
Install.  I had to try twice; it got hung up for some reason, but then, I did
have 30 apps open at the time and they did suggest closing them all. :)
</p>
        <p>
I immediately opened OneNote and went to town.  I started drawing the simple
stuff as Dan Roam suggests in his new book, <em><a title="Dan Roam's The Back of the Napkin" href="http://www.thebackofthenapkin.com/" target="_blank">The
Back of the Napkin</a></em>.  (I attended his session at Mix and liked it enough
to buy the book.)  Then I really went out on a limb and drew a self-portrait:
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" alt="Ambrose Self Portrait" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/me_v1.jpg" width="168" border="0" />
        </p>
        <p>
Not bad, eh?  
</p>
        <p>
Well, it was a first shot.  I tried writing and realized just how bad my penmanship
has become over the years.  Trust me; it's bad.  Nice thing is that maybe
I'll get some of it back and improve it now that I have this (who knows?).  
</p>
        <p>
I'm now on Day 2 of using my Bamboo, and I really like it.  My wrist, which had
been hurting more as of late, has been loving me.  One of the reasons I tried
this was to see if it'd be better to avoid "repetitive strain injury," and I noticed
an immediate difference.  The other reason was because I get so tired of being
constrained by drawing programs in terms of what I want to represent visually. 
SmartArt in Office really, truly (as cool as it is) only goes so far. :)
</p>
        <p>
So my first real use was to start diving into my Agile UX Design Process diagram to
replace a particularly painful slide (Slide 19) in my Building Good UX talk. 
It (both the drawing and the process) is a work in progress; just trying to visualize
some of my thinking about it right now.
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="517" alt="Agile UX Design Process" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/agile_uxdp_thumb.jpg" width="604" border="0" />
        </p>
        <p>
If you look hard, you can see my chicken scratch compared to the nice, free <a title="Journal font" href="http://www.dafont.com/journal.font" target="_blank">Journal
font</a> I picked up.  The point of this diagram is to show how to integrate
UX pros into an Agile process.  Not saying this is all fleshed out or perfect,
but it's a start. :)  One important point is that even if you don't have the
pros, you can start doing the UX stuff yourself.
</p>
        <p>
          <strong>A Few Tips Using Bamboo (thus far)</strong>
        </p>
        <ol>
          <li>
            <strong>Use Mouse mode</strong>.  When you install the driver, it switches to
Pen mode, which tries to map your screen(s) to the tablet.  Even though Wacom
recommends this mode (even provides exercises to get use to it), I found it frustrating
when trying to draw on my right screen--I felt too close to the edge for comfort.  
</li>
          <li>
            <strong>Disable acceleration.  </strong>While it can be a nice feature when using
it literally like a mouse, it messes you up when drawing.</li>
          <li>
            <strong>Switch to the dreaded single-click mode in Explorer.  </strong>Back when
the single click mode was added (XP?), I tried it out and was disgusted.  But
double-clicking w/ the pen is just not easy, and actually, the single-click mode feels
really natural with the pen.</li>
          <li>
            <strong>Switch to scroll on touch ring. </strong> I don't feel too strongly about
this, but honestly, I don't use zoom (the default) enough to have it as a top-level
feature on the tablet.</li>
          <li>
            <strong>Upgrade to Vista?</strong>  I think that you must not get ink in Office
2007 w/o Vista?  I can't figure it out, but it's not there for me in XP. 
The Wacom site mentions Vista explicitly, and my searches haven't turned up anything
useful.  Folks talk about "Start Inking" as if it is just always there, but it
may also have something to do with Tablet PC.  I'll let you know if I figure
it out.</li>
        </ol>
        <p>
It is taking some getting used to, of course, but so far I think it's a big improvement. 
Ask me in a few weeks. :)
</p>
        <p>
And now for the gratuitous signature:
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; margin: 0px 60px 0px 0px; border-left: 0px; border-bottom: 0px" height="155" alt="J. [Ambrose] Little" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/sig.gif" width="176" align="right" border="0" />
        </p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
Nice.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=eec31a22-a454-4db3-8790-888aaeab9330" />
      </body>
      <title>This is My Bamboo</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,eec31a22-a454-4db3-8790-888aaeab9330.aspx</guid>
      <link>http://dotNetTemplar.Net/This+Is+My+Bamboo.aspx</link>
      <pubDate>Fri, 28 Mar 2008 22:32:00 GMT</pubDate>
      <description>&lt;p&gt;
I finally gave in and bought a graphics tablet.&amp;nbsp; My budget being as huge as it
was, I opted for the &lt;a title="Wacom Bamboo" href="http://www.wacom.com/bambootablet/bamboo.cfm" target="_blank"&gt;Wacom
Bamboo&lt;/a&gt;, which retails at $79, but ANTOnline (&lt;a title="Wacom Bamboo on Amazon" href="http://www.amazon.com/gp/product/B000V9T2JA" target="_blank"&gt;via
Amazon&lt;/a&gt;) had it for $50 plus shipping ($58 total).&amp;nbsp; I haven't been this tickled
to get a new gadget in a while.
&lt;/p&gt;
&lt;p&gt;
The whole experience thus far has been grand.&amp;nbsp; I placed the order at about 10p
on Tuesday night.&amp;nbsp; I got an email Wednesday night saying it had shipped, and
when I opened it Thursday morning and clicked the tracking number, I was informed
it was out for delivery--and I paid for standard shipping.&amp;nbsp; Awesome.
&lt;/p&gt;
&lt;p&gt;
I got the box later Thursday morning, and opened it to find a sleek box wrapped in
tissue paper, as if it were a gift.&amp;nbsp; After sliding it out of the tissue paper,
here's what I saw:&lt;br&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="496" alt="Wacom Bamboo Box" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02029.jpg" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Not bad styling.&amp;nbsp; Let's open 'er up:&lt;br&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="635" alt="Wacom Bamboo Welcome Messages" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02030.jpg" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
"This is your Bamboo.&amp;nbsp; Use it to get more out of your computer.&amp;nbsp; Let us
know how it goes..."&amp;nbsp; In many languages.&amp;nbsp; Then it is signed by, presumably,
the creators.&amp;nbsp; Very nice touch, I thought.&amp;nbsp; I felt like a proud owner already.&amp;nbsp;
Then you lift up that insert, and there's the tablet in all its beauty.&amp;nbsp; Grab
it out--there's the cord, the pen, the pen holder.&amp;nbsp; Great.&amp;nbsp; Simple. Obvious.&amp;nbsp;
Beneath that is another tissue wrapped gift, a stylish little black box that has some
simple instructions on getting going and the DVD.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="341" alt="Wacom Bamboo Open Box" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/DSC02031.jpg" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Just opening the thing was a pleasure.&amp;nbsp; Honestly, these folks know what UX is,
and this is just for an $80 graphics tablet.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I plugged it in, and it immediately just worked.&amp;nbsp; Having read a comment somewhere,
I just went to the Web site to download the latest drivers.&amp;nbsp; That was easy.&amp;nbsp;
Install.&amp;nbsp; I had to try twice; it got hung up for some reason, but then, I did
have 30 apps open at the time and they did suggest closing them all. :)
&lt;/p&gt;
&lt;p&gt;
I immediately opened OneNote and went to town.&amp;nbsp; I started drawing the simple
stuff as Dan Roam suggests in his new book, &lt;em&gt;&lt;a title="Dan Roam's The Back of the Napkin" href="http://www.thebackofthenapkin.com/" target="_blank"&gt;The
Back of the Napkin&lt;/a&gt;&lt;/em&gt;.&amp;nbsp; (I attended his session at Mix and liked it enough
to buy the book.)&amp;nbsp; Then I really went out on a limb and drew a self-portrait:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" alt="Ambrose Self Portrait" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/me_v1.jpg" width="168" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Not bad, eh?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Well, it was a first shot.&amp;nbsp; I tried writing and realized just how bad my penmanship
has become over the years.&amp;nbsp; Trust me; it's bad.&amp;nbsp; Nice thing is that maybe
I'll get some of it back and improve it now that I have this (who knows?).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I'm now on Day 2 of using my Bamboo, and I really like it.&amp;nbsp; My wrist, which had
been hurting more as of late, has been loving me.&amp;nbsp; One of the reasons I tried
this was to see if it'd be better to avoid "repetitive strain injury," and I noticed
an immediate difference.&amp;nbsp; The other reason was because I get so tired of being
constrained by drawing programs in terms of what I want to represent visually.&amp;nbsp;
SmartArt in Office really, truly (as cool as it is) only goes so far. :)
&lt;/p&gt;
&lt;p&gt;
So my first real use was to start diving into my Agile UX Design Process diagram to
replace a particularly painful slide (Slide 19) in my Building Good UX talk.&amp;nbsp;
It (both the drawing and the process) is a work in progress; just trying to visualize
some of my thinking about it right now.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="517" alt="Agile UX Design Process" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/agile_uxdp_thumb.jpg" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
If you look hard, you can see my chicken scratch compared to the nice, free &lt;a title="Journal font" href="http://www.dafont.com/journal.font" target="_blank"&gt;Journal
font&lt;/a&gt; I picked up.&amp;nbsp; The point of this diagram is to show how to integrate
UX pros into an Agile process.&amp;nbsp; Not saying this is all fleshed out or perfect,
but it's a start. :)&amp;nbsp; One important point is that even if you don't have the
pros, you can start doing the UX stuff yourself.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A Few Tips Using Bamboo (thus far)&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use Mouse mode&lt;/strong&gt;.&amp;nbsp; When you install the driver, it switches to
Pen mode, which tries to map your screen(s) to the tablet.&amp;nbsp; Even though Wacom
recommends this mode (even provides exercises to get use to it), I found it frustrating
when trying to draw on my right screen--I felt too close to the edge for comfort.&amp;nbsp; 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable acceleration.&amp;nbsp; &lt;/strong&gt;While it can be a nice feature when using
it literally like a mouse, it messes you up when drawing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to the dreaded single-click mode in Explorer.&amp;nbsp; &lt;/strong&gt;Back when
the single click mode was added (XP?), I tried it out and was disgusted.&amp;nbsp; But
double-clicking w/ the pen is just not easy, and actually, the single-click mode feels
really natural with the pen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to scroll on touch ring. &lt;/strong&gt; I don't feel too strongly about
this, but honestly, I don't use zoom (the default) enough to have it as a top-level
feature on the tablet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade to Vista?&lt;/strong&gt;&amp;nbsp; I think that you must not get ink in Office
2007 w/o Vista?&amp;nbsp; I can't figure it out, but it's not there for me in XP.&amp;nbsp;
The Wacom site mentions Vista explicitly, and my searches haven't turned up anything
useful.&amp;nbsp; Folks talk about "Start Inking" as if it is just always there, but it
may also have something to do with Tablet PC.&amp;nbsp; I'll let you know if I figure
it out.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
It is taking some getting used to, of course, but so far I think it's a big improvement.&amp;nbsp;
Ask me in a few weeks. :)
&lt;/p&gt;
&lt;p&gt;
And now for the gratuitous signature:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 60px 0px 0px; border-left: 0px; border-bottom: 0px" height="155" alt="J. [Ambrose] Little" src="http://dotnettemplar.net/blogfiles/ThisisMyBamboo_10366/sig.gif" width="176" align="right" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Nice.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=eec31a22-a454-4db3-8790-888aaeab9330" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,eec31a22-a454-4db3-8790-888aaeab9330.aspx</comments>
      <category>General Computing</category>
      <category>Non-Technical</category>
      <category>Review</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just wanted to let you all know that I'll be speaking at and attending the upcoming <a title="IASA New York IT Architect Regional Conference" href="http://www.iasahome.org/web/itarc/nyc" target="_blank">ITARC
in NYC</a>, May 22-23. The conference is grass roots and platform agnostic. Grady
Booch is giving the keynote from 2<sup>nd</sup> life. There are some great roundtables
and panel discussions on SOA, SOAP vs. REST, as well as others. 
</p>
        <p>
It should be a good opportunity to get involved with the local architecture community
and participate in discussions on what is currently happening. The registration price
is lower then other conferences because we are non-profit and just trying to cover
the costs. 
</p>
        <p>
There is an attendance limit and the early bird registration ends this month so we
encourage you to sign up as soon as possible.  <a href="http://www.iasahome.org/web/itarc/nyc/registration" target="_blank">Register
Now</a>!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8" />
      </body>
      <title>IT Architect Regional Conference - NYC</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8.aspx</guid>
      <link>http://dotNetTemplar.Net/IT+Architect+Regional+Conference+NYC.aspx</link>
      <pubDate>Wed, 19 Mar 2008 15:10:19 GMT</pubDate>
      <description>&lt;p&gt;
Just wanted to let you all know that I'll be speaking at and attending the upcoming &lt;a title="IASA New York IT Architect Regional Conference" href="http://www.iasahome.org/web/itarc/nyc" target="_blank"&gt;ITARC
in NYC&lt;/a&gt;, May 22-23. The conference is grass roots and platform agnostic. Grady
Booch is giving the keynote from 2&lt;sup&gt;nd&lt;/sup&gt; life. There are some great roundtables
and panel discussions on SOA, SOAP vs. REST, as well as others. 
&lt;/p&gt;
&lt;p&gt;
It should be a good opportunity to get involved with the local architecture community
and participate in discussions on what is currently happening. The registration price
is lower then other conferences because we are non-profit and just trying to cover
the costs. 
&lt;p&gt;
There is an attendance limit and the early bird registration ends this month so we
encourage you to sign up as soon as possible.&amp;nbsp; &lt;a href="http://www.iasahome.org/web/itarc/nyc/registration" target="_blank"&gt;Register
Now&lt;/a&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,1b270ec6-b6b8-4dc3-b402-ca8fc556a8e8.aspx</comments>
      <category>Presentations</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=d91de07a-56d5-449b-b5e1-f5251396876a</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,d91de07a-56d5-449b-b5e1-f5251396876a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,d91de07a-56d5-449b-b5e1-f5251396876a.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d91de07a-56d5-449b-b5e1-f5251396876a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For those of you that don't keep an eye on my work blog, my team at Infragistics just
published a new <a title="Read More, View, and Download" href="http://blogs.infragistics.com/blogs/ambrose_little/archive/2008/03/17/faceout-our-latest-silverlight-2-app-is-alive.aspx" target="_blank">Silverlight
2 sample application, faceOut</a>, using prototypes of Infragistics' Silverlight controls. 
If you're interested in Silverlight 2 and/or interested in what Infragistics is doing
with Silverlight, you should check it out.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=d91de07a-56d5-449b-b5e1-f5251396876a" />
      </body>
      <title>Silverlight 2 Sample Application - faceOut</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,d91de07a-56d5-449b-b5e1-f5251396876a.aspx</guid>
      <link>http://dotNetTemplar.Net/Silverlight+2+Sample+Application+FaceOut.aspx</link>
      <pubDate>Mon, 17 Mar 2008 13:54:27 GMT</pubDate>
      <description>&lt;p&gt;
For those of you that don't keep an eye on my work blog, my team at Infragistics just
published a new &lt;a title="Read More, View, and Download" href="http://blogs.infragistics.com/blogs/ambrose_little/archive/2008/03/17/faceout-our-latest-silverlight-2-app-is-alive.aspx" target="_blank"&gt;Silverlight
2 sample application, faceOut&lt;/a&gt;, using prototypes of Infragistics' Silverlight controls.&amp;nbsp;
If you're interested in Silverlight 2 and/or interested in what Infragistics is doing
with Silverlight, you should check it out.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=d91de07a-56d5-449b-b5e1-f5251396876a" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,d91de07a-56d5-449b-b5e1-f5251396876a.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=7bd152f5-10b6-4641-b449-de35e1e5d163</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,7bd152f5-10b6-4641-b449-de35e1e5d163.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,7bd152f5-10b6-4641-b449-de35e1e5d163.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7bd152f5-10b6-4641-b449-de35e1e5d163</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
After posting my ramblings about <a href="http://dotnettemplar.net/Software+As+A+Biological+Ecosystem.aspx">software
as a biological ecosystem</a> last night, I kept thinking a bit more about the topic
of managing complexity and what seems to be the high-end industry response to it. 
Put simply, it seems that we're trying to manage complexity with yet more complexity
(the whole adding gasoline to the fire analogy).  The more I think about it,
the more absurdly ludicrous this approach seems.
</p>
        <p>
And it suddenly came to me--we are seeking The Ring:
</p>
        <p>
One Ring to rule them all, One Ring to find them, 
<br />
One Ring to bring them all and in the darkness bind them.
</p>
        <p>
This is the solution the industry seems to propose with things like enterprise rule
management software and other centralized IT governance initiatives.  
</p>
        <p>
One Policy to rule them all, one Policy to find them, 
<br />
One Policy to bring them all and in the darkness bind them.  
<br />
[Feel free to substitute System, Architecture, or any other grandiose schemes.]
</p>
        <p>
Do we really want to be Dark Lords?  Is "the architecture group" the
land where the shadows lie?  I guess some might indeed aspire to be dark lords
ruling from a land of shadow, but it never ends well for dark lords.  As the
history of Middle Earth shows (and indeed human history), you can't oppress life,
creativity, passion, and freedom, at least not for long.  The yoke of tyranny
will always be thrown off.  Life will find a way.  Attach other pithy axiom
here.
</p>
        <p>
Create software, systems, and policies that are alive, that encourage life, that can
grow, adapt, and evolve.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=7bd152f5-10b6-4641-b449-de35e1e5d163" />
      </body>
      <title>One System to Rule Them All - Managing Complexity with Complexity</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,7bd152f5-10b6-4641-b449-de35e1e5d163.aspx</guid>
      <link>http://dotNetTemplar.Net/One+System+To+Rule+Them+All+Managing+Complexity+With+Complexity.aspx</link>
      <pubDate>Sat, 12 Jan 2008 02:19:33 GMT</pubDate>
      <description>&lt;p&gt;
After posting my ramblings about &lt;a href="http://dotnettemplar.net/Software+As+A+Biological+Ecosystem.aspx"&gt;software
as a biological ecosystem&lt;/a&gt; last night, I kept thinking a bit more about the topic
of managing complexity and what seems to be the high-end industry response to it.&amp;#160;
Put simply, it seems that we're trying to manage complexity with yet more complexity
(the whole adding gasoline to the fire analogy).&amp;#160; The more I think about it,
the more absurdly ludicrous this approach seems.
&lt;/p&gt;
&lt;p&gt;
And it suddenly came to me--we are seeking The Ring:
&lt;/p&gt;
&lt;p&gt;
One Ring to rule them all, One Ring to find them, 
&lt;br /&gt;
One Ring to bring them all and in the darkness bind them.
&lt;/p&gt;
&lt;p&gt;
This is the solution the industry seems to propose with things like enterprise rule
management software and other centralized IT governance initiatives.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
One Policy to rule them all, one Policy to find them, 
&lt;br /&gt;
One Policy to bring them all and in the darkness bind them.&amp;#160; 
&lt;br /&gt;
[Feel free to substitute System, Architecture, or any other grandiose schemes.]
&lt;/p&gt;
&lt;p&gt;
Do we really want to be Dark Lords?&amp;#160; Is &amp;quot;the architecture group&amp;quot; the
land where the shadows lie?&amp;#160; I guess some might indeed aspire to be dark lords
ruling from a land of shadow, but it never ends well for dark lords.&amp;#160; As the
history of Middle Earth shows (and indeed human history), you can't oppress life,
creativity, passion, and freedom, at least not for long.&amp;#160; The yoke of tyranny
will always be thrown off.&amp;#160; Life will find a way.&amp;#160; Attach other pithy axiom
here.
&lt;/p&gt;
&lt;p&gt;
Create software, systems, and policies that are alive, that encourage life, that can
grow, adapt, and evolve.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=7bd152f5-10b6-4641-b449-de35e1e5d163" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,7bd152f5-10b6-4641-b449-de35e1e5d163.aspx</comments>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=79f50d02-c9d6-4e65-9e6b-e45c8aecfa16</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,79f50d02-c9d6-4e65-9e6b-e45c8aecfa16.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,79f50d02-c9d6-4e65-9e6b-e45c8aecfa16.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=79f50d02-c9d6-4e65-9e6b-e45c8aecfa16</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This thought occurred to me the other day.  Maybe the right approach to managing
complexity in business software is something akin to creating a biological ecosystem. 
By this, I mean designing correcting mechanisms to address chaos as it emerges and,
ultimately, (the dream) would be designing systems that are biologically aggressive,
that is, they look for niches to fill and also take steps to preserve themselves.
</p>
        <p>
I don't know.  I'm sure I'm not the first person to think about this.  It
just hit me the other day as I was walking into work.  It seems like the more
common approach we take is to try to create a mechanical system as if the complexities
of human interactions (i.e., business) can be specified and accounted for in a closed
system.
</p>
        <p>
I attended a session on managing complexity at the ITARC in San Diego last October,
and the presenter was, if I recall correctly, advocating the usage of more precise
specification of business rules through the use of Object Role Modeling (and in fact
Dr. Terry Halpin was in attendance at that session and was a active participant). 
I had attended another session the previous day by a fellow from Fair Isaacs on business
rule management software.
</p>
        <p>
All of these folks struck me as very intelligent and knowledgeable, and yet it seems
to me that they are going in exactly the wrong direction.  In fact, I left that
conference feeling very whelmed.  I felt as if I were living in a separate universe;
at least I got the sense that there is a software multiverse, parallel software development
universes, with me living in one and a lot of those guys in another.  All this
talk of "governance" and highfalutin systems (e.g., grid SOA) leaves one
feeling so disconnected from the everyday experience of being a software professional.
</p>
        <p>
It seems to me that the solution to complexity in IT is not to create ever more complex
mechanical systems, policies, and infrastructure to "govern" the problem. 
It seems like that's throwing gasoline on the fire.  Not only that, it seems
fundamentally opposed to the reality that is business, which is essentially a human
enterprise based on humans interacting with other humans, usually trying to convince
other humans to give them money instead of giving it to some other humans that want
their money.
</p>
        <p>
Because humans are intelligent and adaptable, particularly humans driven by, dare
I say, greed (or at least self-preservation), these humans are constantly tweaking
how they convince other humans to give them money.  The point is, business is
fundamentally a human and an aggressively biological, enterprise.  It consists
of humans who are constantly on the lookout to fill new niches and aggressively defending
their territories.  So it seems to me that business software should be modeled,
at a fundamental level, on this paradigm rather than on the mechanical paradigm.  
</p>
        <p>
Of course, the problem is that the materials we're working with are not exactly conducive
to that, but therein lies the challenge.  I tend to think that the efforts and
direction being made by the agile community and approaches like domain-driven design
are headed in the right direction.  At least they're focusing on the human aspects
of software development and focusing in on the core business domains.  That's
the right perspective to take.
</p>
        <p>
Extend that to IT governance, and that means giving various IT departments within
an enterprise the freedom to function in the best way that meets the needs of their
local business units rather than trying to establish a monolithic, central architecture
that attempts to handle all needs (think local government versus federal government). 
It means developing with a focus on correction rather than anticipation, building
leaner so that when change is needed, it is less costly (in a retrospective sense
as well as in total cost of ownership).
</p>
        <p>
I'm not advocating giving ourselves over to the chaos; I'm just thinking that this
is a better way to manage the chaos.  And as we learn the best patterns to manage
complexity in this way, it seems not too far a stretch to think that we could start
automating mechanisms that help software systems be ever more agile and ultimately
even anticipate the change that is needed by the business, either automatically making
the adjustments needed or at the very least suggesting them.  That would be true
business intelligence in software.
</p>
        <p>
Maybe it's a pipe dream, but I think that without such dreams, we don't improve. 
At the very least, I think it suggests that the agile approach to software is the
right one, and that this approach should be extended and improved, not only in software
development but also in architecture and IT in general.
</p>
        <p>
What do you think?
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=79f50d02-c9d6-4e65-9e6b-e45c8aecfa16" />
      </body>
      <title>Software as a Biological Ecosystem</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,79f50d02-c9d6-4e65-9e6b-e45c8aecfa16.aspx</guid>
      <link>http://dotNetTemplar.Net/Software+As+A+Biological+Ecosystem.aspx</link>
      <pubDate>Fri, 11 Jan 2008 05:01:33 GMT</pubDate>
      <description>&lt;p&gt;
This thought occurred to me the other day.&amp;#160; Maybe the right approach to managing
complexity in business software is something akin to creating a biological ecosystem.&amp;#160;
By this, I mean designing correcting mechanisms to address chaos as it emerges and,
ultimately, (the dream) would be designing systems that are biologically aggressive,
that is, they look for niches to fill and also take steps to preserve themselves.
&lt;/p&gt;
&lt;p&gt;
I don't know.&amp;#160; I'm sure I'm not the first person to think about this.&amp;#160; It
just hit me the other day as I was walking into work.&amp;#160; It seems like the more
common approach we take is to try to create a mechanical system as if the complexities
of human interactions (i.e., business) can be specified and accounted for in a closed
system.
&lt;/p&gt;
&lt;p&gt;
I attended a session on managing complexity at the ITARC in San Diego last October,
and the presenter was, if I recall correctly, advocating the usage of more precise
specification of business rules through the use of Object Role Modeling (and in fact
Dr. Terry Halpin was in attendance at that session and was a active participant).&amp;#160;
I had attended another session the previous day by a fellow from Fair Isaacs on business
rule management software.
&lt;/p&gt;
&lt;p&gt;
All of these folks struck me as very intelligent and knowledgeable, and yet it seems
to me that they are going in exactly the wrong direction.&amp;#160; In fact, I left that
conference feeling very whelmed.&amp;#160; I felt as if I were living in a separate universe;
at least I got the sense that there is a software multiverse, parallel software development
universes, with me living in one and a lot of those guys in another.&amp;#160; All this
talk of &amp;quot;governance&amp;quot; and highfalutin systems (e.g., grid SOA) leaves one
feeling so disconnected from the everyday experience of being a software professional.
&lt;/p&gt;
&lt;p&gt;
It seems to me that the solution to complexity in IT is not to create ever more complex
mechanical systems, policies, and infrastructure to &amp;quot;govern&amp;quot; the problem.&amp;#160;
It seems like that's throwing gasoline on the fire.&amp;#160; Not only that, it seems
fundamentally opposed to the reality that is business, which is essentially a human
enterprise based on humans interacting with other humans, usually trying to convince
other humans to give them money instead of giving it to some other humans that want
their money.
&lt;/p&gt;
&lt;p&gt;
Because humans are intelligent and adaptable, particularly humans driven by, dare
I say, greed (or at least self-preservation), these humans are constantly tweaking
how they convince other humans to give them money.&amp;#160; The point is, business is
fundamentally a human and an aggressively biological, enterprise.&amp;#160; It consists
of humans who are constantly on the lookout to fill new niches and aggressively defending
their territories.&amp;#160; So it seems to me that business software should be modeled,
at a fundamental level, on this paradigm rather than on the mechanical paradigm.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Of course, the problem is that the materials we're working with are not exactly conducive
to that, but therein lies the challenge.&amp;#160; I tend to think that the efforts and
direction being made by the agile community and approaches like domain-driven design
are headed in the right direction.&amp;#160; At least they're focusing on the human aspects
of software development and focusing in on the core business domains.&amp;#160; That's
the right perspective to take.
&lt;/p&gt;
&lt;p&gt;
Extend that to IT governance, and that means giving various IT departments within
an enterprise the freedom to function in the best way that meets the needs of their
local business units rather than trying to establish a monolithic, central architecture
that attempts to handle all needs (think local government versus federal government).&amp;#160;
It means developing with a focus on correction rather than anticipation, building
leaner so that when change is needed, it is less costly (in a retrospective sense
as well as in total cost of ownership).
&lt;/p&gt;
&lt;p&gt;
I'm not advocating giving ourselves over to the chaos; I'm just thinking that this
is a better way to manage the chaos.&amp;#160; And as we learn the best patterns to manage
complexity in this way, it seems not too far a stretch to think that we could start
automating mechanisms that help software systems be ever more agile and ultimately
even anticipate the change that is needed by the business, either automatically making
the adjustments needed or at the very least suggesting them.&amp;#160; That would be true
business intelligence in software.
&lt;/p&gt;
&lt;p&gt;
Maybe it's a pipe dream, but I think that without such dreams, we don't improve.&amp;#160;
At the very least, I think it suggests that the agile approach to software is the
right one, and that this approach should be extended and improved, not only in software
development but also in architecture and IT in general.
&lt;/p&gt;
&lt;p&gt;
What do you think?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=79f50d02-c9d6-4e65-9e6b-e45c8aecfa16" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,79f50d02-c9d6-4e65-9e6b-e45c8aecfa16.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=15df44a2-0733-4bc6-b6be-1ceab58b7976</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,15df44a2-0733-4bc6-b6be-1ceab58b7976.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,15df44a2-0733-4bc6-b6be-1ceab58b7976.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=15df44a2-0733-4bc6-b6be-1ceab58b7976</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been getting friendly with Windows Live lately, and after getting terribly tired
of having to switch to HTML view in Windows Live Writer in order to insert a note
(could be a footnote or endnote depending on how you look at it), I decided to see
if I could write a plug-in to make my life easier.
</p>
        <p>
So was born the Blog Notes plug-in.  Unfortunately, there is no extensibility
for just marking up existing text (e.g., adding a superscript button to the markup
toolbar), so I had to go with the option to insert some HTML using the  interface. 
I really was trying to keep it simple and lightweight (for my own sanity), so it is
pretty basic.
</p>
        <p>
The functionality is pretty straightforward.  Thanks to <a title="Mark James' Free Silk Icons" href="http://www.famfamfam.com/lab/icons/silk/" target="_blank">Mark
James</a> for the free icons.  Once the plug-in is installed, you should see
an "Insert Blog Notes..." option in the Insert pane on the right side as
shown below.
</p>
        <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="Insert Blog Notes in Insert Pane" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/insert_pane.jpg" width="204" border="0" />
        <p>
Clicking on it brings up the Blog Notes dialog:
</p>
        <p>
          <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="183" alt="Blog Notes Dialog" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/blog_notes.jpg" width="292" align="left" border="0" />
        </p>
        <p>
Clicking "New Note" will insert a new superscript number (the next one in
the sequence).
</p>
        <p>
Clicking "Reference Note" will insert the selected number as superscript. 
You can also just double-click the number to do that.
</p>
        <p>
The "Notes Section" button will insert a notes section.<sup>1</sup></p>
        <p>
Lastly, "Write Note" simply adds the selected note plus a period and couple
spaces.
</p>
        <p>
As you can see, it's pretty basic, but it saves a few seconds for each note (assuming
you bother to switch to HTML view, find the number, and put &lt;sup&gt;&lt;/sup&gt;
tags around it like I do [did]).  You can also tweak one option/setting. 
Go to Tools -&gt; Options, and select the Plug-ins tab:
</p>
        <p>
          <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="547" alt="Live Writer Plug-ins Options" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/plugins_options.jpg" width="558" border="0" />
        </p>
        <p>
Clicking Options... on the Blog Notes plug-in brings up a tres simple dialog:
</p>
        <p>
          <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="110" alt="Blog Notes Options" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/blog_notes_options.jpg" width="215" border="0" />
        </p>
        <p>
This one option will toggle whether or not the plug-in uses in-page anchor links for
the notes so that the superscript numbers would link down to the corresponding note
in the Notes section.  I originally added this feature without realizing the
implications.  Because blog posts are often aggregated and otherwise viewed in
unexpected places, using in-page anchors is iffy at best.  Community Server seems
to strip them out, and dasBlog keeps them, but since it emits a &lt;base /&gt; tag
to the site root, all of the anchor links are relative to the site homepage instead
of the current post, which effectively renders them useless.  I looked at the
dasBlog code where this happens, and it's in the core assembly.  I was concerned
what side effects changing it to use the current URL would have, so I didn't do that. 
But if you have blog software that will let you use this feature, by all means, enjoy!
</p>
        <p>
          <strong>
            <u>Caveats</u>
          </strong>
        </p>
        <ul>
          <li>
Because of the way the plug-in framework works, I use a static/shared collection to
keep track of the notes.  This means it acts a tad goofy if you close out of
Live Writer or write multiple posts while it is open.  If you close and come
back to a post, the notes count is reset.  To "fix" this, just re-add
however many notes you had (if you want to bother).  If you write multiple posts,
you just have to deal with it.  I don't know if there is post-local storage for
plug-ins, but I didn't have time to dig into it.</li>
          <li>
Your mileage may vary.  I wrote this mainly to save myself time and get familiar
with the Live Writer extensibility model, so it ain't a finished product to be sure.</li>
        </ul>
        <p>
          <strong>
            <u>Get It! 
<br /></u>
          </strong>Since there are numerous tutorials on the Web (that I learned from) to
write Live Writer plug-ins, I won't go into those details here, but you're welcome
to download my code and learn from it directly if you want.  I think I have comments
and such in there.
</p>
        <ul>
          <li>
            <a title="Download the Blog Notes Plug-in" href="http://dotnettemplar.net/blogfiles/Infragistics.Live.Writer.Notes.zip">Download
the Plug-in Only</a> - If you just want to use this plug-in, this is what you want. 
Drop the DLL into your plug-ins directory and go (typically C:\Program Files\Windows
Live\Writer\Plugins). 
</li>
          <li>
            <a title="Download the Blog Notes Plug-In Source Code" href="http://dotnettemplar.net/blogfiles/BlogNotesPlugIn.zip">Download
the Source Code</a> - This is a VS 2008 solution for those who want to learn, enhance,
extend, whatever.  The license is more or less the MIT license.  You'll
need Live Writer installed to reference its API. 
</li>
        </ul>
        <p>
          <span style="font-weight: bold; text-decoration: underline">Notes</span>
          <br />
1. This is the "Notes Section."  The button adds the "Notes"
header and writes out any existing note numbers.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=15df44a2-0733-4bc6-b6be-1ceab58b7976" />
      </body>
      <title>Blog Notes Live Writer Plug-in</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,15df44a2-0733-4bc6-b6be-1ceab58b7976.aspx</guid>
      <link>http://dotNetTemplar.Net/Blog+Notes+Live+Writer+Plugin.aspx</link>
      <pubDate>Sat, 22 Dec 2007 19:07:12 GMT</pubDate>
      <description>&lt;p&gt;
I've been getting friendly with Windows Live lately, and after getting terribly tired
of having to switch to HTML view in Windows Live Writer in order to insert a note
(could be a footnote or endnote depending on how you look at it), I decided to see
if I could write a plug-in to make my life easier.
&lt;/p&gt;
&lt;p&gt;
So was born the Blog Notes plug-in.&amp;#160; Unfortunately, there is no extensibility
for just marking up existing text (e.g., adding a superscript button to the markup
toolbar), so I had to go with the option to insert some HTML using the&amp;#160; interface.&amp;#160;
I really was trying to keep it simple and lightweight (for my own sanity), so it is
pretty basic.
&lt;/p&gt;
&lt;p&gt;
The functionality is pretty straightforward.&amp;#160; Thanks to &lt;a title="Mark James&amp;#39; Free Silk Icons" href="http://www.famfamfam.com/lab/icons/silk/" target="_blank"&gt;Mark
James&lt;/a&gt; for the free icons.&amp;#160; Once the plug-in is installed, you should see
an &amp;quot;Insert Blog Notes...&amp;quot; option in the Insert pane on the right side as
shown below.
&lt;/p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="Insert Blog Notes in Insert Pane" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/insert_pane.jpg" width="204" border="0" /&gt; 
&lt;p&gt;
Clicking on it brings up the Blog Notes dialog:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="183" alt="Blog Notes Dialog" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/blog_notes.jpg" width="292" align="left" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Clicking &amp;quot;New Note&amp;quot; will insert a new superscript number (the next one in
the sequence).
&lt;/p&gt;
&lt;p&gt;
Clicking &amp;quot;Reference Note&amp;quot; will insert the selected number as superscript.&amp;#160;
You can also just double-click the number to do that.
&lt;/p&gt;
&lt;p&gt;
The &amp;quot;Notes Section&amp;quot; button will insert a notes section.&lt;sup&gt;1&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
Lastly, &amp;quot;Write Note&amp;quot; simply adds the selected note plus a period and couple
spaces.
&lt;/p&gt;
&lt;p&gt;
As you can see, it's pretty basic, but it saves a few seconds for each note (assuming
you bother to switch to HTML view, find the number, and put &amp;lt;sup&amp;gt;&amp;lt;/sup&amp;gt;
tags around it like I do [did]).&amp;#160; You can also tweak one option/setting.&amp;#160;
Go to Tools -&amp;gt; Options, and select the Plug-ins tab:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="547" alt="Live Writer Plug-ins Options" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/plugins_options.jpg" width="558" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Clicking Options... on the Blog Notes plug-in brings up a tres simple dialog:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 0px 0px; border-right-width: 0px" height="110" alt="Blog Notes Options" src="http://dotnettemplar.net/blogfiles/MyLiveWriterPlugin_BA1A/blog_notes_options.jpg" width="215" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
This one option will toggle whether or not the plug-in uses in-page anchor links for
the notes so that the superscript numbers would link down to the corresponding note
in the Notes section.&amp;#160; I originally added this feature without realizing the
implications.&amp;#160; Because blog posts are often aggregated and otherwise viewed in
unexpected places, using in-page anchors is iffy at best.&amp;#160; Community Server seems
to strip them out, and dasBlog keeps them, but since it emits a &amp;lt;base /&amp;gt; tag
to the site root, all of the anchor links are relative to the site homepage instead
of the current post, which effectively renders them useless.&amp;#160; I looked at the
dasBlog code where this happens, and it's in the core assembly.&amp;#160; I was concerned
what side effects changing it to use the current URL would have, so I didn't do that.&amp;#160;
But if you have blog software that will let you use this feature, by all means, enjoy!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Caveats&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Because of the way the plug-in framework works, I use a static/shared collection to
keep track of the notes.&amp;#160; This means it acts a tad goofy if you close out of
Live Writer or write multiple posts while it is open.&amp;#160; If you close and come
back to a post, the notes count is reset.&amp;#160; To &amp;quot;fix&amp;quot; this, just re-add
however many notes you had (if you want to bother).&amp;#160; If you write multiple posts,
you just have to deal with it.&amp;#160; I don't know if there is post-local storage for
plug-ins, but I didn't have time to dig into it.&lt;/li&gt;
&lt;li&gt;
Your mileage may vary.&amp;#160; I wrote this mainly to save myself time and get familiar
with the Live Writer extensibility model, so it ain't a finished product to be sure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Get It! 
&lt;br /&gt;
&lt;/u&gt;&lt;/strong&gt;Since there are numerous tutorials on the Web (that I learned from) to
write Live Writer plug-ins, I won't go into those details here, but you're welcome
to download my code and learn from it directly if you want.&amp;#160; I think I have comments
and such in there.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a title="Download the Blog Notes Plug-in" href="http://dotnettemplar.net/blogfiles/Infragistics.Live.Writer.Notes.zip"&gt;Download
the Plug-in Only&lt;/a&gt; - If you just want to use this plug-in, this is what you want.&amp;#160;
Drop the DLL into your plug-ins directory and go (typically C:\Program Files\Windows
Live\Writer\Plugins). 
&lt;/li&gt;
&lt;li&gt;
&lt;a title="Download the Blog Notes Plug-In Source Code" href="http://dotnettemplar.net/blogfiles/BlogNotesPlugIn.zip"&gt;Download
the Source Code&lt;/a&gt; - This is a VS 2008 solution for those who want to learn, enhance,
extend, whatever.&amp;#160; The license is more or less the MIT license.&amp;#160; You'll
need Live Writer installed to reference its API. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;span style="font-weight: bold; text-decoration: underline"&gt;Notes&lt;/span&gt; 
&lt;br /&gt;
1. This is the &amp;quot;Notes Section.&amp;quot;&amp;#160; The button adds the &amp;quot;Notes&amp;quot;
header and writes out any existing note numbers.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=15df44a2-0733-4bc6-b6be-1ceab58b7976" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,15df44a2-0733-4bc6-b6be-1ceab58b7976.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Technical</category>
      <category>Writing</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=0bf88862-815d-4819-a926-c38444d0bbd8</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,0bf88862-815d-4819-a926-c38444d0bbd8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,0bf88862-815d-4819-a926-c38444d0bbd8.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0bf88862-815d-4819-a926-c38444d0bbd8</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Far be it from me to put words in Phil's mouth, but I hope that folks recognize that
his post about <a title="Favor Composition over Inheritance and other Pithy Catch Phrases" href="http://haacked.com/archive/2007/12/11/favor-composition-over-inheritance-and-other-pithy-catch-phrases.aspx" target="_blank">favoring
composition over inheritance</a> is not specifically about that one best practice
(the comments seem to indicate this is being missed).  It's pretty clear to me
that the thrust of that post is around a philosophical approach that he thinks the
ALT.NET community should make.
</p>
        <p>
Two things stand out from Phil's post in this respect: 1) don't appeal to authority,
and 2) don't organize yourself around a set of technical principles (best practices),
but rather organize yourself around the non-technical values of independent thinking
and desire to improve.  I hope that everyone can agree that these latter two
values are good ones that should indeed be encouraged.
</p>
        <p>
That said, should a community like ALT.NET eschew forming a more formal consensus
on technical best practices?  I tend to think not.  While independent, critical
thinking is valuable, it is not the summit of perfection.  The summit of perfection,
in the realm of ideas at least, is conformance with truth (what actually <em>is</em> versus
what I think is), and independent thinking at odds with what is true is not only not
valuable in itself, it can be downright detrimental.  
</p>
        <p>
For instance, what if you independently and critically think that security and privacy
are not important aspects of the online banking application you are tasked with building? 
Is that kind of independent, critical thinking valuable in itself?  Or will it
potentially lead to great harm?  Independent, critical thinking is valuable only
in as much as it deepens one's understanding of and conformance to truth.
</p>
        <p>
So I think that there is value in a community such as ALT.NET expending the effort
to define principles through critical thinking and argumentation that it will hold
up as ideals, i.e., things that seemed to be most in accord with the truth as we know
it.  This is where things like patterns and best practices come into play; it
is the shared, accumulated wisdom of the technical community.
</p>
        <p>
Now what about the broader idea of eschewing appealing to authority?  Far be
it from me to claim to be an authority in logic, but it seems to me that all appeals
to authority are not invalid (the <a title="Appeal to Authority on wikipedia" href="http://en.wikipedia.org/wiki/Appeal_to_authority" target="_blank">wikipedia
article Phil links to</a> discusses this to some degree but does not go far enough,
in my estimation).  The valid reasons for appealing to authority are discussed
at the bottom of that article: 1) not enough time and 2) concern at one's ability
to make the other understand the reasoning underlying the truth being expressed.
</p>
        <p>
In terms of logic, it is not a fallacy to appeal to an authority on a topic that is
accepted by all those involved in an argument.  We're talking about presuppositions
here, and without them, we'd never get anywhere in our search for truth.  If
you always have to argue from first principles (if you even acknowledge those), you
simply get stuck in a quagmire.  In terms of the topic at hand, if folks accept
(as they generally do) that the GoF et al are authorities on the subject of OOD, then
it is valid, logically speaking, to appeal to their authority to establish the principle
that you should favor composition over inheritance.
</p>
        <p>
The thing to watch out for in appeals to authority is 1) thinking that the authority
is incapable of being wrong and 2) ensuring that the parties involved accept the authority. 
With the latter, you simply cannot argue (or at least the argument won't carry weight)
from authority if the authority is not accepted.  With the former, unless it
is a presupposition shared by those involved that the authority is indeed infallible,
you should keep in mind that even if you buy into the authority's credentials, it
is still possible that the authority can be wrong.
</p>
        <p>
So I would nuance what Phil says and say that if the ALT.NET community agrees that
GoF is an authority, it is valid to appeal to them, while remaining open to criticism
of the concepts involved (even those backed by an authority).  The authority
adds logical weight; it does not impose absolute authority.
</p>
        <p>
We just don't have time to argue everything from first principles.  Others who
are generally acknowledged to be qualified have already taken the time to research,
think about, and propose some good patterns and practices, and unless there is good
reason to object, there is no need to rehash those.  Instead, I'd suggest that
the community focus on spreading knowledge of these patterns and practices all the
while refining them, functioning essentially as a group in the way that Phil recommends
individuals function--thinking critically and always working to improve.  Doing
this will help ensure that the community does not fall into a quagmire of unnecessary
argumentation, and it will ensure that the patterns and practices that they agree
upon can be continuously refined and enhanced as new technologies emerge and greater
wisdom is gained over time.  
</p>
        <p>
Further, it gives the group a purpose that has meaning.  After all, if the group's
message is <em>only</em> "think for yourself and be all that you can be," there isn't
much of substance to say after that.  On the other hand, because it is a technical
community that espouses that philosophy, it should take that philosophy on itself
(<em>as a group</em>, not just the individuals in it).  I would suggest this
includes establishing greater consensus on best practices and patterns and then spreading
the word about them to others.  Be better together. :)
</p>
        <p>
You see, it is not about setting down an infallible manifesto and excluding those
who disagree, which is I think more than anything what Phil is concerned about. 
However, it also isn't about best practices just being true for you but not for me
(best practices relativism?).  Put another way, I suggest ALT.NET should favor
thoughtful adherence to best patterns and practices, not blind adherence.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=0bf88862-815d-4819-a926-c38444d0bbd8" />
      </body>
      <title>Favor Thoughtful Adherence Over Blind Adherence</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,0bf88862-815d-4819-a926-c38444d0bbd8.aspx</guid>
      <link>http://dotNetTemplar.Net/Favor+Thoughtful+Adherence+Over+Blind+Adherence.aspx</link>
      <pubDate>Tue, 11 Dec 2007 14:56:00 GMT</pubDate>
      <description>&lt;p&gt;
Far be it from me to put words in Phil's mouth, but I hope that folks recognize that
his post about &lt;a title="Favor Composition over Inheritance and other Pithy Catch Phrases" href="http://haacked.com/archive/2007/12/11/favor-composition-over-inheritance-and-other-pithy-catch-phrases.aspx" target="_blank"&gt;favoring
composition over inheritance&lt;/a&gt; is not specifically about that one best practice
(the comments seem to indicate this is being missed).&amp;nbsp; It's pretty clear to me
that the thrust of that post is around a philosophical approach that he thinks the
ALT.NET community should make.
&lt;/p&gt;
&lt;p&gt;
Two things stand out from Phil's post in this respect: 1) don't appeal to authority,
and 2) don't organize yourself around a set of technical principles (best practices),
but rather organize yourself around the non-technical values of independent thinking
and desire to improve.&amp;nbsp; I hope that everyone can agree that these latter two
values are good ones that should indeed be encouraged.
&lt;/p&gt;
&lt;p&gt;
That said, should a community like ALT.NET eschew forming a more formal consensus
on technical best practices?&amp;nbsp; I tend to think not.&amp;nbsp; While independent, critical
thinking is valuable, it is not the summit of perfection.&amp;nbsp; The summit of perfection,
in the realm of ideas at least, is conformance with truth (what actually &lt;em&gt;is&lt;/em&gt; versus
what I think is), and independent thinking at odds with what is true is not only not
valuable in itself, it can be downright detrimental.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
For instance, what if you independently and critically think that security and privacy
are not important aspects of the online banking application you are tasked with building?&amp;nbsp;
Is that kind of independent, critical thinking valuable in itself?&amp;nbsp; Or will it
potentially lead to great harm?&amp;nbsp; Independent, critical thinking is valuable only
in as much as it deepens one's understanding of and conformance to truth.
&lt;/p&gt;
&lt;p&gt;
So I think that there is value in a community such as ALT.NET expending the effort
to define principles through critical thinking and argumentation that it will hold
up as ideals, i.e., things that seemed to be most in accord with the truth as we know
it.&amp;nbsp; This is where things like patterns and best practices come into play; it
is the shared, accumulated wisdom of the technical community.
&lt;/p&gt;
&lt;p&gt;
Now what about the broader idea of eschewing appealing to authority?&amp;nbsp; Far be
it from me to claim to be an authority in logic, but it seems to me that all appeals
to authority are not invalid (the &lt;a title="Appeal to Authority on wikipedia" href="http://en.wikipedia.org/wiki/Appeal_to_authority" target="_blank"&gt;wikipedia
article Phil links to&lt;/a&gt; discusses this to some degree but does not go far enough,
in my estimation).&amp;nbsp; The valid reasons for appealing to authority are discussed
at the bottom of that article: 1) not enough time and 2) concern at one's ability
to make the other understand the reasoning underlying the truth being expressed.
&lt;/p&gt;
&lt;p&gt;
In terms of logic, it is not a fallacy to appeal to an authority on a topic that is
accepted by all those involved in an argument.&amp;nbsp; We're talking about presuppositions
here, and without them, we'd never get anywhere in our search for truth.&amp;nbsp; If
you always have to argue from first principles (if you even acknowledge those), you
simply get stuck in a quagmire.&amp;nbsp; In terms of the topic at hand, if folks accept
(as they generally do) that the GoF et al are authorities on the subject of OOD, then
it is valid, logically speaking, to appeal to their authority to establish the principle
that you should favor composition over inheritance.
&lt;/p&gt;
&lt;p&gt;
The thing to watch out for in appeals to authority is 1) thinking that the authority
is incapable of being wrong and 2) ensuring that the parties involved accept the authority.&amp;nbsp;
With the latter, you simply cannot argue (or at least the argument won't carry weight)
from authority if the authority is not accepted.&amp;nbsp; With the former, unless it
is a presupposition shared by those involved that the authority is indeed infallible,
you should keep in mind that even if you buy into the authority's credentials, it
is still possible that the authority can be wrong.
&lt;/p&gt;
&lt;p&gt;
So I would nuance what Phil says and say that if the ALT.NET community agrees that
GoF is an authority, it is valid to appeal to them, while remaining open to criticism
of the concepts involved (even those backed by an authority).&amp;nbsp; The authority
adds logical weight; it does not impose absolute authority.
&lt;/p&gt;
&lt;p&gt;
We just don't have time to argue everything from first principles.&amp;nbsp; Others who
are generally acknowledged to be qualified have already taken the time to research,
think about, and propose some good patterns and practices, and unless there is good
reason to object, there is no need to rehash those.&amp;nbsp; Instead, I'd suggest that
the community focus on spreading knowledge of these patterns and practices all the
while refining them, functioning essentially as a group in the way that Phil recommends
individuals function--thinking critically and always working to improve.&amp;nbsp; Doing
this will help ensure that the community does not fall into a quagmire of unnecessary
argumentation, and it will ensure that the patterns and practices that they agree
upon can be continuously refined and enhanced as new technologies emerge and greater
wisdom is gained over time.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Further, it gives the group a purpose that has meaning.&amp;nbsp; After all, if the group's
message is &lt;em&gt;only&lt;/em&gt; "think for yourself and be all that you can be," there isn't
much of substance to say after that.&amp;nbsp; On the other hand, because it is a technical
community that espouses that philosophy, it should take that philosophy on itself
(&lt;em&gt;as a group&lt;/em&gt;, not just the individuals in it).&amp;nbsp; I would suggest this
includes establishing greater consensus on best practices and patterns and then spreading
the word about them to others.&amp;nbsp; Be better together. :)
&lt;/p&gt;
&lt;p&gt;
You see, it is not about setting down an infallible manifesto and excluding those
who disagree, which is I think more than anything what Phil is concerned about.&amp;nbsp;
However, it also isn't about best practices just being true for you but not for me
(best practices relativism?).&amp;nbsp; Put another way, I suggest ALT.NET should favor
thoughtful adherence to best patterns and practices, not blind adherence.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=0bf88862-815d-4819-a926-c38444d0bbd8" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,0bf88862-815d-4819-a926-c38444d0bbd8.aspx</comments>
      <category>Best Practices</category>
      <category>dotNet</category>
      <category>Philosophy</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=6b75ace8-7456-4850-985f-2dbcc486f7e3</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,6b75ace8-7456-4850-985f-2dbcc486f7e3.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,6b75ace8-7456-4850-985f-2dbcc486f7e3.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6b75ace8-7456-4850-985f-2dbcc486f7e3</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As I read<sup>1</sup> the works of Christopher Alexander, I grew increasingly concerned
that the software industry may be missing the point of patterns.  Well, maybe
that's not the right way to put it.  I think we may be missing the real value
that patterns bring to the table.
</p>
        <p>
For whatever reason, it seems we approach them (broadly speaking) almost as loose
algorithms to be applied here and there as it seems fit.  Or maybe we just see
them as convenient ways to talk about things we already know, or maybe we even use
them to learn particular solutions to particular problems.  And then maybe we
just use them because it is en vogue.  
</p>
        <p>
It seems to me that the real value to derive from patterns (as an idea, not necessarily
as they are often proposed in the software world) is in learning to see and think
about creating software in the best way.  What Alexander proposes at the end
of <em>The Timeless Way</em> is that it isn't using patterns or pattern languages,
per se, that give our creations the quality without a name.  No, he proposes
that the value lies in helping us to recognize the quality and teaching us to build
in the timeless way.
</p>
        <p>
The timeless way is more than patterns.  The thing is, patterns help us to get
there.  I think in some ways, we do get it.  Those who are really into patterns
do seem to recognize that patterns are not the solution to everything.  The problem
is, I think, in that we are not using patterns in the most profitable way.  
</p>
        <p>
I think part of the problem is in not using patterns as a language.  We have
numerous catalogues of patterns.  To be sure, we do not lack for patterns, and
sure, there is obviously value just in having these catalogues and in using the patterns
here and there.  But I think that as long as we see patterns as individual things
in a pattern catalogue, we won't use them to their full effectiveness.
</p>
        <p>
Perhaps what we need to do is to figure out how to use them as a language.  Perhaps
we need to weave them into our thoughts so that when we approach the problem of building
software, patterns are there, guiding our thinking, helping us to best arrange a solution
to fit the problem.  When we use our natural language, it does the same thing. 
Our thoughts are constrained by our languages, but at the same time, our thoughts
are guided by our languages.  The ideas form in our heads and rapidly coalesce
into some structure that is based upon our language, and the structure works because
of the language--it tells us what works and what doesn't work to articulate our ideas.
</p>
        <p>
I think that a pattern language would have the same power.  If we get the patterns
into our heads, then when we're faced with articulating a solution to a problem, we
will think in terms of the patterns.  The patterns will give form to our solution,
and because they are patterns, the solution will work.  The pattern language
will both guide and shape our thinking towards things solutions that have the quality
without a name.
</p>
        <p>
But then, as Alexander says of "the kernel," once we master the language,
we move beyond it, so to speak.  The language is not an end in itself but a means
to an end, a means to learn the timeless way.  It shapes our thinking to the
extent that we are able to perceive the way even without a pattern.  And this
is the superlative value in patterns that I think we're missing.  
</p>
        <p>
Patterns, in themselves, have value, but as many have noted, they can be abused and
misapplied.  The reason for this is not that a pattern (or patterns in general)
are bad but that we're using them as an end in themselves.  If we simply let
patterns shape the way we think about designing software, if we let them become a
language, then we will learn to use them in ways that make sense and ultimately go
beyond them and build great software even where a pattern doesn't exist.
</p>
        <p>
So how do we do this?  Well, I think to some extent, we already do it. 
I think there are people who use the language, who know <em>the way</em>, without
necessarily being conscious of it.  And I think that there is a lot of great
guidance out there that in a roundabout way does lead to building great software,
even though it may not be conscious it is using patterns as a language.  But
I do tend to think that there is far more bad or failed software out there that has
come about because the language is not known, it is not explicit.
</p>
        <p>
I think that what we need to do is to continue identifying patterns as best we can,
but we need to start thinking about how to more firmly incorporate them into how we
create software.  In fact, I think doing this, attempting to incorporate patterns
more into development, will drive the further identification of patterns, to fill
out patterns where we are lacking.  I also think it will help us to realize how
patterns relate to each other, which is a big part of using them as a language and
not just a bunch of monads floating about in the ether.  As we see them relating,
see how they work together to form complete solutions, we'll better understand the
language as well as the value of the language, and ultimately, we'll be able to impart
that language to enable more of us to speak it.
</p>
        <p>
This calls for those who build great software, who theoretically already know the
way, to be introspective and retrospective.  It's not just a matter of looking
about in the software world for repeated, similar solutions.  It's about identifying <em>good</em> solutions,
solutions that bring software to life, not just addressing functional requirements,
and forming from those solutions a language of patterns for building such software. 
What do you think?
</p>
        <p>
          <u>
            <strong>Notes</strong>
          </u>
          <br />
1. See <a href="http://dotnettemplar.net/Notes+On+The+Notes+Of+The+Synthesis+Of+Form.aspx" target="_blank">Notes
on the Notes of the Synthesis of Form</a> and <a href="http://dotnettemplar.net/The+Timeless+Way+Is+Agile.aspx" target="_blank">The
Timeless Way is Agile</a>.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6b75ace8-7456-4850-985f-2dbcc486f7e3" />
      </body>
      <title>Are We Missing the Point of Patterns?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,6b75ace8-7456-4850-985f-2dbcc486f7e3.aspx</guid>
      <link>http://dotNetTemplar.Net/Are+We+Missing+The+Point+Of+Patterns.aspx</link>
      <pubDate>Sun, 09 Dec 2007 19:46:34 GMT</pubDate>
      <description>&lt;p&gt;
As I read&lt;sup&gt;1&lt;/sup&gt; the works of Christopher Alexander, I grew increasingly concerned
that the software industry may be missing the point of patterns.&amp;#160; Well, maybe
that's not the right way to put it.&amp;#160; I think we may be missing the real value
that patterns bring to the table.
&lt;/p&gt;
&lt;p&gt;
For whatever reason, it seems we approach them (broadly speaking) almost as loose
algorithms to be applied here and there as it seems fit.&amp;#160; Or maybe we just see
them as convenient ways to talk about things we already know, or maybe we even use
them to learn particular solutions to particular problems.&amp;#160; And then maybe we
just use them because it is en vogue.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
It seems to me that the real value to derive from patterns (as an idea, not necessarily
as they are often proposed in the software world) is in learning to see and think
about creating software in the best way.&amp;#160; What Alexander proposes at the end
of &lt;em&gt;The Timeless Way&lt;/em&gt; is that it isn't using patterns or pattern languages,
per se, that give our creations the quality without a name.&amp;#160; No, he proposes
that the value lies in helping us to recognize the quality and teaching us to build
in the timeless way.
&lt;/p&gt;
&lt;p&gt;
The timeless way is more than patterns.&amp;#160; The thing is, patterns help us to get
there.&amp;#160; I think in some ways, we do get it.&amp;#160; Those who are really into patterns
do seem to recognize that patterns are not the solution to everything.&amp;#160; The problem
is, I think, in that we are not using patterns in the most profitable way.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
I think part of the problem is in not using patterns as a language.&amp;#160; We have
numerous catalogues of patterns.&amp;#160; To be sure, we do not lack for patterns, and
sure, there is obviously value just in having these catalogues and in using the patterns
here and there.&amp;#160; But I think that as long as we see patterns as individual things
in a pattern catalogue, we won't use them to their full effectiveness.
&lt;/p&gt;
&lt;p&gt;
Perhaps what we need to do is to figure out how to use them as a language.&amp;#160; Perhaps
we need to weave them into our thoughts so that when we approach the problem of building
software, patterns are there, guiding our thinking, helping us to best arrange a solution
to fit the problem.&amp;#160; When we use our natural language, it does the same thing.&amp;#160;
Our thoughts are constrained by our languages, but at the same time, our thoughts
are guided by our languages.&amp;#160; The ideas form in our heads and rapidly coalesce
into some structure that is based upon our language, and the structure works because
of the language--it tells us what works and what doesn't work to articulate our ideas.
&lt;/p&gt;
&lt;p&gt;
I think that a pattern language would have the same power.&amp;#160; If we get the patterns
into our heads, then when we're faced with articulating a solution to a problem, we
will think in terms of the patterns.&amp;#160; The patterns will give form to our solution,
and because they are patterns, the solution will work.&amp;#160; The pattern language
will both guide and shape our thinking towards things solutions that have the quality
without a name.
&lt;/p&gt;
&lt;p&gt;
But then, as Alexander says of &amp;quot;the kernel,&amp;quot; once we master the language,
we move beyond it, so to speak.&amp;#160; The language is not an end in itself but a means
to an end, a means to learn the timeless way.&amp;#160; It shapes our thinking to the
extent that we are able to perceive the way even without a pattern.&amp;#160; And this
is the superlative value in patterns that I think we're missing.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Patterns, in themselves, have value, but as many have noted, they can be abused and
misapplied.&amp;#160; The reason for this is not that a pattern (or patterns in general)
are bad but that we're using them as an end in themselves.&amp;#160; If we simply let
patterns shape the way we think about designing software, if we let them become a
language, then we will learn to use them in ways that make sense and ultimately go
beyond them and build great software even where a pattern doesn't exist.
&lt;/p&gt;
&lt;p&gt;
So how do we do this?&amp;#160; Well, I think to some extent, we already do it.&amp;#160;
I think there are people who use the language, who know &lt;em&gt;the way&lt;/em&gt;, without
necessarily being conscious of it.&amp;#160; And I think that there is a lot of great
guidance out there that in a roundabout way does lead to building great software,
even though it may not be conscious it is using patterns as a language.&amp;#160; But
I do tend to think that there is far more bad or failed software out there that has
come about because the language is not known, it is not explicit.
&lt;/p&gt;
&lt;p&gt;
I think that what we need to do is to continue identifying patterns as best we can,
but we need to start thinking about how to more firmly incorporate them into how we
create software.&amp;#160; In fact, I think doing this, attempting to incorporate patterns
more into development, will drive the further identification of patterns, to fill
out patterns where we are lacking.&amp;#160; I also think it will help us to realize how
patterns relate to each other, which is a big part of using them as a language and
not just a bunch of monads floating about in the ether.&amp;#160; As we see them relating,
see how they work together to form complete solutions, we'll better understand the
language as well as the value of the language, and ultimately, we'll be able to impart
that language to enable more of us to speak it.
&lt;/p&gt;
&lt;p&gt;
This calls for those who build great software, who theoretically already know the
way, to be introspective and retrospective.&amp;#160; It's not just a matter of looking
about in the software world for repeated, similar solutions.&amp;#160; It's about identifying &lt;em&gt;good&lt;/em&gt; solutions,
solutions that bring software to life, not just addressing functional requirements,
and forming from those solutions a language of patterns for building such software.&amp;#160;
What do you think?
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;strong&gt;Notes&lt;/strong&gt; &lt;/u&gt; 
&lt;br /&gt;
1. See &lt;a href="http://dotnettemplar.net/Notes+On+The+Notes+Of+The+Synthesis+Of+Form.aspx" target="_blank"&gt;Notes
on the Notes of the Synthesis of Form&lt;/a&gt; and &lt;a href="http://dotnettemplar.net/The+Timeless+Way+Is+Agile.aspx" target="_blank"&gt;The
Timeless Way is Agile&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6b75ace8-7456-4850-985f-2dbcc486f7e3" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,6b75ace8-7456-4850-985f-2dbcc486f7e3.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm so pumped!  I just got my SQL Toolbelt mug from <a title="Red Gate's Site" href="http://www.red-gate.com/" target="_blank">Red
Gate</a>.  I proudly display it on my desk (below) and in meetings. :)
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="379" alt="You may look at my Red Gate mug.  You may not borrow it." src="http://dotnettemplar.net/blogfiles/SQLToolbeltMugbyRedGate_98FF/DSC09439.jpg" width="504" border="0" />
        </p>
        <p>
The mug reads (this is awesome):  "You may look at my Red Gate mug.  You
may not borrow it."  Like the mug, Red Gate's software is awesome, too. 
I've used SQL Compare and SQL Data Compare for a long time, and I love the (relatively
new) SQL Prompt.  They have a ton of other tools in their toolbelt targeted more
at DBA types than devs/architects like me.  I highly recommend them if you do
much SQL development or administration!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5" />
      </body>
      <title>SQL Toolbelt (Mug) by Red Gate</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5.aspx</guid>
      <link>http://dotNetTemplar.Net/SQL+Toolbelt+Mug+By+Red+Gate.aspx</link>
      <pubDate>Wed, 05 Dec 2007 15:49:34 GMT</pubDate>
      <description>&lt;p&gt;
I'm so pumped!&amp;nbsp; I just got my SQL Toolbelt mug from &lt;a title="Red Gate's Site" href="http://www.red-gate.com/" target="_blank"&gt;Red
Gate&lt;/a&gt;.&amp;nbsp; I proudly display it on my desk (below) and in meetings. :)
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="379" alt="You may look at my Red Gate mug.  You may not borrow it." src="http://dotnettemplar.net/blogfiles/SQLToolbeltMugbyRedGate_98FF/DSC09439.jpg" width="504" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
The mug reads (this is awesome):&amp;nbsp; "You may look at my Red Gate mug.&amp;nbsp; You
may not borrow it."&amp;nbsp; Like the mug, Red Gate's software is awesome, too.&amp;nbsp;
I've used SQL Compare and SQL Data Compare for a long time, and I love the (relatively
new) SQL Prompt.&amp;nbsp; They have a ton of other tools in their toolbelt targeted more
at DBA types than devs/architects like me.&amp;nbsp; I highly recommend them if you do
much SQL development or administration!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,fe2de269-9f4d-44a5-9b3a-a6a9ca79c6e5.aspx</comments>
      <category>Review</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=f6e6aa43-245d-4e9e-8c5d-4f037d34be34</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,f6e6aa43-245d-4e9e-8c5d-4f037d34be34.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,f6e6aa43-245d-4e9e-8c5d-4f037d34be34.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f6e6aa43-245d-4e9e-8c5d-4f037d34be34</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Previously, <a title="See last paragraph under Responsibility-Driven Design." href="http://dotnettemplar.net/Report+From+SD+Best+Practices+Day+1.aspx" target="_blank">I
mentioned</a> I was working on an example of using Visual Studio to create a
concrete <a title="What is a Domain Model? (dnt)" href="http://dotnettemplar.net/What+Is+A+Domain+Model.aspx" target="_blank">domain
model</a> using object thinking, and here it is.  The domain I ended up modeling
was that of a shared event calendar, including event registration and agenda planning. 
This is something that's been kind of rolling in and out of my mind for quite a while
now because it seems that we need a good system for this for all the code camps and
like events that occur.  Of course, lately I've come across a few solutions that
are already built<sup>1</sup>, but it seemed like a domain I knew enough about that
I could take a whack at modeling it on my own.  I also figured it was small enough
in scope for a sample.
</p>
        <p>
So without further ado, I present you with the domain model:<br /><a href="http://dotnettemplar.net/blogfiles/ObjectThinkingDomainModelExample_DD88/Objects.jpg" target="_blank" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="Click to See Full Event Calendar Domain Model" src="http://dotnettemplar.net/blogfiles/ObjectThinkingDomainModelExample_DD88/Objects_thumb.jpg" width="538" border="0" /></a></p>
        <p>
I put this together in about an hour, maybe an hour and a half, on the train up to
SD Best Practices.  When I started out modeling it, I was actually thinking more
generally in the context of a calendar (like in Outlook), but I transformed the idea
more towards the event planning calendar domain.  So you see some blending of
an attendee being invited to a meeting with the event planning objects &amp;
behaviors (agenda, speaker, etc.).  Interestingly, they seem to meld okay, though
it probably needs a bit of refactoring to, e.g., have an <em>Attendee Register(Person)</em> method
on the Event object.
</p>
        <p>
So the interesting thing to see here, contrasting it to the typical model you see
in the .NET world (if you're lucky enough to see one at all!), is that there
is pretty much no data, no simple properties or attributes, in the model. 
The model is entirely objects and their behaviors and relationships to other objects. 
You can look at this model and get a pretty darn good feel for the domain and also
how the system functions as a whole to serve this domain.  I was able to identify
and model the objects without once thinking about (and getting distracted with) particular
data attributes.<sup>2</sup></p>
        <p>
In <a title="Tangerine Story in XPS (PDF is Also Available)" href="http://community.infragistics.com/uploadedFiles/Community/Downloads/7471/Story.xps" target="_blank">the
story</a> of <a title="Infragistics Tangerine: A WPF Exemplar" href="http://infragistics.com/tangerine" target="_blank">our
Tangerine project</a>, I describe in some depth the compromise I had to make with
the .NET framework when it comes to data properties.  I think if I were to continue
with this event calendar project, after I had nailed down the objects based
on their behaviors (as begun in this example) and felt pretty good that it was
spot on, at that point, I'd think about the data and do something like I did on Tangerine,
having the open-ended property bag but also adding strongly-typed properties as needed
to support framework tooling.<sup>3</sup>  
</p>
        <p>
I hope you can imagine how you could sit with your clients or whoever your domain
experts are and quickly map out a lightweight model of the domain using the VS Class
Designer DSL.  I'll wager that if we took this diagram and showed it to a non-technical
person, with a little help (maybe adding a key/legend), they'd quickly understand
what's going on with the system.  And if you're building it with the domain expert,
you'll have that dialog done already so that everyone will be on the same page.
</p>
        <p>
Sure, there will be further refinement of both the domain model and the code; the
nice thing about using the class designer DSL is that tweaking the model tweaks the
code, so the two stay in sync.  We already mentioned the need to focus on the
data at some point, and depending on your situation, you can do this with the
domain experts or maybe you'll have an existing data model to work with. 
As the developer, you're going to want to get in there and tweak the classes and methods
to use best coding and framework practices, things that aren't best expressed in such
a model.  You will have other concerns in the system to think about
like security, performance, logging, user interface, etc., but that's all stuff
you need to do regardless of how you approach analyzing and modeling your domain.  
</p>
        <p>
In the end, you will have a fairly refined model of the domain (or part of the
domain) that is using a language that everyone gets and agrees on (Eric Evan's "ubiquitous
language"); you'll have identified the objects in the domain accurately based on their
behaviors and relationships, and you'll even have a starting point in code for the
implementation.  You also have objects that are responsible and that collaborate
to get the job done, so in that way you avoid code complexity by reducing imperative
control constructs.  All in all, it seems like a great foundation upon which
to build the software.
</p>
        <p>
          <strong>
            <u>Notes</u>
          </strong>
          <br />
1. Such as <a title="Microsoft Group Events" href="http://www.microsoftgroupevents.com" target="_blank">Microsoft
Group Events</a>, <a title="Community Megaphone" href="http://www.communitymegaphone.com/" target="_blank">Community
Megaphone</a>, and <a title="Eventbrite" href="http://www.eventbrite.com/" target="_blank">Eventbrite</a>.<br />
2. Okay, so maybe I was tempted once or twice, but I fought the urge. :) 
<br />
3. I suppose another option would be to create LINQ-based DTOs; I have to think more
about how best to meld this kind of domain modeling with LINQ.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=f6e6aa43-245d-4e9e-8c5d-4f037d34be34" />
      </body>
      <title>Object Thinking Domain Model Example</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,f6e6aa43-245d-4e9e-8c5d-4f037d34be34.aspx</guid>
      <link>http://dotNetTemplar.Net/Object+Thinking+Domain+Model+Example.aspx</link>
      <pubDate>Mon, 01 Oct 2007 20:59:37 GMT</pubDate>
      <description>&lt;p&gt;
Previously, &lt;a title="See last paragraph under Responsibility-Driven Design." href="http://dotnettemplar.net/Report+From+SD+Best+Practices+Day+1.aspx" target="_blank"&gt;I
mentioned&lt;/a&gt; I was working on&amp;nbsp;an example of using Visual Studio to create a
concrete &lt;a title="What is a Domain Model? (dnt)" href="http://dotnettemplar.net/What+Is+A+Domain+Model.aspx" target="_blank"&gt;domain
model&lt;/a&gt; using object thinking, and here it is.&amp;nbsp; The domain I ended up modeling
was that of a shared event calendar, including event registration and agenda planning.&amp;nbsp;
This is something that's been kind of rolling in and out of my mind for quite a while
now because it seems that we need a good system for this for all the code camps and
like events that occur.&amp;nbsp; Of course, lately I've come across a few solutions that
are already built&lt;sup&gt;1&lt;/sup&gt;, but it seemed like a domain I knew enough about that
I could take a whack at modeling it on my own.&amp;nbsp; I also figured it was small enough
in scope for a sample.
&lt;/p&gt;
&lt;p&gt;
So without further ado, I present you with&amp;nbsp;the domain&amp;nbsp;model:&lt;br&gt;
&lt;a href="http://dotnettemplar.net/blogfiles/ObjectThinkingDomainModelExample_DD88/Objects.jpg" target="_blank" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="Click to See Full Event Calendar Domain Model" src="http://dotnettemplar.net/blogfiles/ObjectThinkingDomainModelExample_DD88/Objects_thumb.jpg" width="538" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I put this together in about an hour, maybe an hour and a half, on the train up to
SD Best Practices.&amp;nbsp; When I started out modeling it, I was actually thinking more
generally in the context of a calendar (like in Outlook), but I transformed the idea
more towards the event planning calendar domain.&amp;nbsp; So you see some blending of
an attendee&amp;nbsp;being invited to a meeting with the event planning objects &amp;amp;
behaviors (agenda, speaker, etc.).&amp;nbsp; Interestingly, they seem to meld okay, though
it probably needs a bit of refactoring to, e.g., have an &lt;em&gt;Attendee Register(Person)&lt;/em&gt; method
on the Event object.
&lt;/p&gt;
&lt;p&gt;
So the interesting thing to see here, contrasting it to the typical model you see
in the .NET world (if you're lucky enough to&amp;nbsp;see one at all!), is that there
is pretty much no data, no simple properties or attributes,&amp;nbsp;in the model.&amp;nbsp;
The model is entirely objects and their behaviors and relationships to other objects.&amp;nbsp;
You can look at this model and get a pretty darn good feel for the domain and also
how the system functions as a whole to serve this domain.&amp;nbsp; I was able to identify
and model the objects without once thinking about (and getting distracted with)&amp;nbsp;particular
data attributes.&lt;sup&gt;2&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
In &lt;a title="Tangerine Story in XPS (PDF is Also Available)" href="http://community.infragistics.com/uploadedFiles/Community/Downloads/7471/Story.xps" target="_blank"&gt;the
story&lt;/a&gt; of &lt;a title="Infragistics Tangerine: A WPF Exemplar" href="http://infragistics.com/tangerine" target="_blank"&gt;our
Tangerine project&lt;/a&gt;, I describe in some depth the compromise I had to make with
the .NET framework when it comes to data properties.&amp;nbsp; I think if I were to continue
with this event calendar&amp;nbsp;project,&amp;nbsp;after I had nailed down the objects based
on their behaviors (as&amp;nbsp;begun in this example) and felt pretty good that it was
spot on, at that point, I'd think about the data and do something like I did on Tangerine,
having the open-ended property bag but also adding strongly-typed properties as needed
to support framework tooling.&lt;sup&gt;3&lt;/sup&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I hope you can imagine how you could sit with your clients or whoever your domain
experts are and quickly map out a lightweight model of the domain using the VS Class
Designer DSL.&amp;nbsp; I'll wager that if we took this diagram and showed it to a non-technical
person, with a little help (maybe adding a key/legend), they'd quickly understand
what's going on with the system.&amp;nbsp; And if you're building it with the domain expert,
you'll have that dialog done already so that everyone will be on the same page.
&lt;/p&gt;
&lt;p&gt;
Sure, there will be further refinement of both the domain model and the code; the
nice thing about using the class designer DSL is that tweaking the model tweaks the
code, so the two stay in sync.&amp;nbsp; We already mentioned the need to focus on the
data at some point, and&amp;nbsp;depending on your situation, you can do this with the
domain experts or maybe you'll have an existing data model to&amp;nbsp;work with.&amp;nbsp;
As the developer, you're going to want to get in there and tweak the classes and methods
to use best coding and framework practices, things that aren't best expressed in such
a model.&amp;nbsp; You will have other&amp;nbsp;concerns in&amp;nbsp;the system to think about
like security, performance, logging, user interface,&amp;nbsp;etc., but that's all stuff
you need to do regardless of how you approach analyzing and modeling your domain.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In the end, you will have a fairly refined model of the&amp;nbsp;domain (or part of the
domain) that is using a language that everyone gets and agrees on (Eric Evan's "ubiquitous
language"); you'll have identified the objects in the domain accurately based on their
behaviors and relationships, and you'll even have a starting point in code for the
implementation.&amp;nbsp; You also have objects that are responsible and that collaborate
to get the job done, so in that way you avoid code complexity by reducing imperative
control constructs.&amp;nbsp; All in all, it seems like a great foundation upon which
to build the software.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Notes&lt;/u&gt;&lt;/strong&gt;
&lt;br&gt;
1. Such as &lt;a title="Microsoft Group Events" href="http://www.microsoftgroupevents.com" target="_blank"&gt;Microsoft
Group Events&lt;/a&gt;, &lt;a title="Community Megaphone" href="http://www.communitymegaphone.com/" target="_blank"&gt;Community
Megaphone&lt;/a&gt;, and &lt;a title="Eventbrite" href="http://www.eventbrite.com/" target="_blank"&gt;Eventbrite&lt;/a&gt;.&lt;br&gt;
2. Okay, so maybe I&amp;nbsp;was tempted&amp;nbsp;once or twice, but I fought the urge. :) 
&lt;br&gt;
3. I suppose another option would be to create LINQ-based DTOs; I have to think more
about how best to meld this kind of&amp;nbsp;domain modeling with LINQ.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=f6e6aa43-245d-4e9e-8c5d-4f037d34be34" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,f6e6aa43-245d-4e9e-8c5d-4f037d34be34.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=602bd352-da15-4aee-8528-d0a1a1a7c08c</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,602bd352-da15-4aee-8528-d0a1a1a7c08c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,602bd352-da15-4aee-8528-d0a1a1a7c08c.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=602bd352-da15-4aee-8528-d0a1a1a7c08c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally got around to finishing <em>The Timeless Way of Building</em>, by Christopher
Alexander (most well known in software for being the source of the patterns movement). 
The last part of the book is called "The Way" to build things.  His
focus is physical architecture, but it is interesting how closely it resembles agile
software development.
</p>
        <p>
There are a few similarities that I see.  First, he advocates (or at least shows
in his example) working directly with the folks who are going to be using the building(s)
when designing it with the pattern language.  You design it together with them. 
Similarly, agile seems to advocate the same process of working as closely as possible
with those who will be using the system.<sup>1</sup></p>
        <p>
But Alexander goes on to say, using this real-world example of a health care complex
he helped to build, that it almost failed (in terms of having the quality without
a name) because even though it was initially designed using the pattern language,
it was in the end passed off to builders who conformed the design to "drawings"
(think UML) that ultimately caused it to lose a large amount of the <em>quality</em>.  
</p>
        <p>
The point he goes on to make is that you can't just use the language up front and
then go translate it into formal design techniques and end up with the <em>quality</em>. 
Rather, you have to build using the language, and in particular, build each part of
the structure piecemeal, to best fit its particular environment, forces, context,
and needs.  This is the only way that you can get the quality.  Here I see
another similarity with agile and its focus on iterations and regular feedback. 
You build in pieces, adapting each piece to its whole as it is built and ensuring
that it best fits the needs, context, forces,  and environment.  
</p>
        <p>
He also says that invariably our initial ideas and designs for a solution don't exactly
reflect the ways in which the solution will be used.  And this disparity between
our design and reality gets worse as the solution grows in scope.  Again, this
is true in software and why the regular feedback is important, but Alexander proposes
repair as a <em>creative</em> process in which we better adapt the solution to its
environment based on deepening understanding of needs or when the design just isn't
working or breaks.  This is akin to what we call refactoring, and like we do
in software, Alexander advocates a continual process of repair (refactoring). 
And this process doesn't stop when the initial thing is built--we keep tweaking it
ad infinitum.
</p>
        <p>
This seems somewhat intuitive, yet in software we're always talking about legacy systems
and many have and continue to suggest "rewrites" as the answer to software
woes.  While I understand that this is one area where software differs from real-world
building (in the relative ease that something can be redone), I do think that we software
folks tend to err too much on the side of rewriting, thinking that if only we can
start from scratch, our new system will be this glorious, shining zenith of elegance
that will last forever.  
</p>
        <p>
It is this thinking, too, that even causes many of these rewrites to fail because
so much time is spent trying to design a system that will last forever that the system
is never completed (or becomes so complex that no one can maintain it), providing
the next impetus for another "rewrite of the legacy system."  On the
contrary, some of the best software I've seen is that which has simply been continuously
maintained and improved, piece by piece, rather than trying to design (or redesign)
an entire system at once.  
</p>
        <p>
What is interesting to me in all this is the similarities between the process of building
physical structures and that of building software, the general applicability of Alexander's
thought to the creation of software.  I continually see this in Alexander's writing. 
In part, it is good to see a confirmation of what we've been realizing in the software
industry--that waterfall just doesn't work, that pre-built, reusable modules don't
really work well, that we need regular, repeated input from stakeholders and users,
that we shouldn't try to design it all up front, that we shouldn't use formal notations
and categories that create solutions that fit the notations and categories better
than their contexts, environments, and needs, that we should create and use pattern
languages that are intelligible by ordinary people, and more.
</p>
        <p>
There is one last observation I'd make about <em>The Timeless Way of Building</em>,
regarding the "kernel of the way."  Alexander says that when it comes
down to it, the core (the kernel) of the timeless way of building is not in the pattern
language itself (the language is there to facilitate learning the timeless way); he
says the core is in building in a way that is "egoless."  
</p>
        <p>
In some ways, I think the concern about ego is less pronounced in the software world--rarely
is a piece of software admired as a piece of art--but at the same time, the underlying
message is that you build something to fit <em>just so</em>--not imposing your own
preconceptions on how the thing should be built.  For software developers, I
think the challenge is more in learning to see the world for what it is, to really
understand the problem domain, to look at it through the eyes of the users and design
a solution to fit that rather than trying to foist the software worldview onto the
users.  To put it another way, we need to build software from the outside in,
not the inside out.  The timeless way is really about truly seeing and then building
to fit what you see.
</p>
        <p>
          <strong>
            <u>Notes</u>
          </strong>
          <br />
1. At this point, another interesting thought occurs to me about pattern languages;
I see a relation to Eric Evan's "ubiquitous language" in that the language
you use needs to be shared between the builders and those using the thing being built. 
What stands out to me is the idea of building a pattern language that is intelligible
enough by non-software experts to be incorporated into the ubiquitous language shared
by both the domain experts and the software experts.  Software patterns vary
on this point; some are intelligible and some are not so intelligible; we need to
make them intelligible.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=602bd352-da15-4aee-8528-d0a1a1a7c08c" />
      </body>
      <title>The Timeless Way is Agile</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,602bd352-da15-4aee-8528-d0a1a1a7c08c.aspx</guid>
      <link>http://dotNetTemplar.Net/The+Timeless+Way+Is+Agile.aspx</link>
      <pubDate>Sun, 30 Sep 2007 01:31:12 GMT</pubDate>
      <description>&lt;p&gt;
I finally got around to finishing &lt;em&gt;The Timeless Way of Building&lt;/em&gt;, by Christopher
Alexander (most well known in software for being the source of the patterns movement).&amp;#xA0;
The last part of the book is called &amp;quot;The Way&amp;quot; to build things.&amp;#xA0; His
focus is physical architecture, but it is interesting how closely it resembles agile
software development.
&lt;/p&gt;
&lt;p&gt;
There are a few similarities that I see.&amp;#xA0; First, he advocates (or at least shows
in his example) working directly with the folks who are going to be using the building(s)
when designing it with the pattern language.&amp;#xA0; You design it together with them.&amp;#xA0;
Similarly, agile seems to advocate the same process of working as closely as possible
with those who will be using the system.&lt;sup&gt;1&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
But Alexander goes on to say, using this real-world example of a health care complex
he helped to build, that it almost failed (in terms of having the quality without
a name) because even though it was initially designed using the pattern language,
it was in the end passed off to builders who conformed the design to &amp;quot;drawings&amp;quot;
(think UML) that ultimately caused it to lose a large amount of the &lt;em&gt;quality&lt;/em&gt;.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
The point he goes on to make is that you can't just use the language up front and
then go translate it into formal design techniques and end up with the &lt;em&gt;quality&lt;/em&gt;.&amp;#xA0;
Rather, you have to build using the language, and in particular, build each part of
the structure piecemeal, to best fit its particular environment, forces, context,
and needs.&amp;#xA0; This is the only way that you can get the quality.&amp;#xA0; Here I see
another similarity with agile and its focus on iterations and regular feedback.&amp;#xA0;
You build in pieces, adapting each piece to its whole as it is built and ensuring
that it best fits the needs, context, forces,&amp;#xA0; and environment.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
He also says that invariably our initial ideas and designs for a solution don't exactly
reflect the ways in which the solution will be used.&amp;#xA0; And this disparity between
our design and reality gets worse as the solution grows in scope.&amp;#xA0; Again, this
is true in software and why the regular feedback is important, but Alexander proposes
repair as a &lt;em&gt;creative&lt;/em&gt; process in which we better adapt the solution to its
environment based on deepening understanding of needs or when the design just isn't
working or breaks.&amp;#xA0; This is akin to what we call refactoring, and like we do
in software, Alexander advocates a continual process of repair (refactoring).&amp;#xA0;
And this process doesn't stop when the initial thing is built--we keep tweaking it
ad infinitum.
&lt;/p&gt;
&lt;p&gt;
This seems somewhat intuitive, yet in software we're always talking about legacy systems
and many have and continue to suggest &amp;quot;rewrites&amp;quot; as the answer to software
woes.&amp;#xA0; While I understand that this is one area where software differs from real-world
building (in the relative ease that something can be redone), I do think that we software
folks tend to err too much on the side of rewriting, thinking that if only we can
start from scratch, our new system will be this glorious, shining zenith of elegance
that will last forever.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
It is this thinking, too, that even causes many of these rewrites to fail because
so much time is spent trying to design a system that will last forever that the system
is never completed (or becomes so complex that no one can maintain it), providing
the next impetus for another &amp;quot;rewrite of the legacy system.&amp;quot;&amp;#xA0; On the
contrary, some of the best software I've seen is that which has simply been continuously
maintained and improved, piece by piece, rather than trying to design (or redesign)
an entire system at once.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
What is interesting to me in all this is the similarities between the process of building
physical structures and that of building software, the general applicability of Alexander's
thought to the creation of software.&amp;#xA0; I continually see this in Alexander's writing.&amp;#xA0;
In part, it is good to see a confirmation of what we've been realizing in the software
industry--that waterfall just doesn't work, that pre-built, reusable modules don't
really work well, that we need regular, repeated input from stakeholders and users,
that we shouldn't try to design it all up front, that we shouldn't use formal notations
and categories that create solutions that fit the notations and categories better
than their contexts, environments, and needs, that we should create and use pattern
languages that are intelligible by ordinary people, and more.
&lt;/p&gt;
&lt;p&gt;
There is one last observation I'd make about &lt;em&gt;The Timeless Way of Building&lt;/em&gt;,
regarding the &amp;quot;kernel of the way.&amp;quot;&amp;#xA0; Alexander says that when it comes
down to it, the core (the kernel) of the timeless way of building is not in the pattern
language itself (the language is there to facilitate learning the timeless way); he
says the core is in building in a way that is &amp;quot;egoless.&amp;quot;&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
In some ways, I think the concern about ego is less pronounced in the software world--rarely
is a piece of software admired as a piece of art--but at the same time, the underlying
message is that you build something to fit &lt;em&gt;just so&lt;/em&gt;--not imposing your own
preconceptions on how the thing should be built.&amp;#xA0; For software developers, I
think the challenge is more in learning to see the world for what it is, to really
understand the problem domain, to look at it through the eyes of the users and design
a solution to fit that rather than trying to foist the software worldview onto the
users.&amp;#xA0; To put it another way, we need to build software from the outside in,
not the inside out.&amp;#xA0; The timeless way is really about truly seeing and then building
to fit what you see.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Notes&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
1. At this point, another interesting thought occurs to me about pattern languages;
I see a relation to Eric Evan's &amp;quot;ubiquitous language&amp;quot; in that the language
you use needs to be shared between the builders and those using the thing being built.&amp;#xA0;
What stands out to me is the idea of building a pattern language that is intelligible
enough by non-software experts to be incorporated into the ubiquitous language shared
by both the domain experts and the software experts.&amp;#xA0; Software patterns vary
on this point; some are intelligible and some are not so intelligible; we need to
make them intelligible.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=602bd352-da15-4aee-8528-d0a1a1a7c08c" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,602bd352-da15-4aee-8528-d0a1a1a7c08c.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=3d8dd54a-a3e0-4799-887b-2969d823d0e2</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,3d8dd54a-a3e0-4799-887b-2969d823d0e2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,3d8dd54a-a3e0-4799-887b-2969d823d0e2.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3d8dd54a-a3e0-4799-887b-2969d823d0e2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As I sit here on the train home, I've been thinking (and writing) about a lot of stuff. 
But I figured I should put this post together for completeness and finality, even
though I only made it to one session today before I left  early.  Last night
I was shocked and somewhat dismayed to find that I had somehow managed to book the
train for return on Saturday afternoon rather than today.  I looked at my reservation
email, thinking surely the ticket was misprinted, but nope, the reservation says the
22nd clearly in black and white.
</p>
        <p>
Now, those who spend much time with me know that I tend to be sort of the absent-minded
professor type.  I often have trouble keeping track of the details of day-to-day
things (but I <em>can</em> tie my shoes!).  I like to think good reasons for
this, but whatever the reasons, that's me.  So I can totally imagine that somehow
I tricked my brain into thinking that the 22nd was the day I wanted to return when
I booked the train.
</p>
        <p>
That said, I think this is a good opportunity to observe a way in which the UX of
the reservations system could be improved.  If it had simply said somewhere that
the return trip was on SATURDAY and not just used these obscure things called numeric
dates, I'd immediately have seen and avoided my mistake.  But nowhere online
nor in the email nor on the ticket does it say Saturday.  In fact, there is SO
MUCH GARBAGE on the ticket, that the non-initiate has trouble finding anything of
value.  So think about that if you're designing some sort of booking system--show
the day of the week, please. :)
</p>
        <p>
          <strong>Lean Process Improvement 
<br /></strong>So this morning, on top of being tired because I stayed up late writing,
I was late for the class I wanted to attend, one called Agile Architecture. 
Unfortunately, it was in the smallest room in the conference (same one as the manager
meeting yesterday), and unfortunately, the planners didn't anticipate attendance to
that session correctly.  Plus, this room had this odd little old lady who felt
it was her duty to prevent anyone from attending who had to stand.  
</p>
        <p>
Yesterday, I watched her try to turn away (a few successfully) quite a few folks,
even though there was plenty of room on the far side to stand.  She kept saying
"there really is no room," but there was.  What made the whole scene kind of
comical was that she refused to go sit OUTSIDE the door, so rather than simply preventing
folks from coming in and causing a distraction, she let them come in, then animatedly
tried to convince them to leave, causing even more distraction.
</p>
        <p>
Well, when I peeked in the door this morning, saw the full room and saw her start
heading toward me, I knew I was out of luck.  I just didn't have the heart to
muscle by her and ignore her pleading to go stand on the other side, and besides,
I don't like standing still for 1.5 hours anyway.  So I was off to find an alternative.
</p>
        <p>
I knew there wasn't much else I wanted to see during that hour, but by golly I was
there and this was the only slot I could make today, so I was going to make it to
a session!  After two more failed entries into full sessions and studiously avoiding
some that sounded extremely dull by their titles, I finally found one that sounded
nominally interesting and had a lot of open space.  I really had no clue what
I was getting into...
</p>
        <p>
It ended up being somewhat interesting.  It was about applying the "lean process"
from the manufacturing space to software development.  I'm personally not really
into process and methodologies, particularly when they come from disciplines that
are only marginally like our own.  But this did sound like it could be useful
in some situations, particularly in software product (i.e., commercial) development.  
</p>
        <p>
He talked about value stream mapping, which is basically modeling the process flow
of specific activities in product development from beginning to end (so you'd do one
for new feature dev, one for enhancements, one for hot fixes, etc.).  It sounds
like it does have potential to be useful as long as you don't spend too much time
on it.  Particularly if you think you have a problem in your process, this method
can help you to both visualize and identify potential problems.  If you do product
development, it's worth a look.
</p>
        <p>
          <strong>Final Thoughts 
<br /></strong>After that session, I made off to go to the 12:05 mass at the chapel outside
the convention center.  My deacon friend had let me know about it, and I was
glad of it.  And he was there, so after mass, we went back into the conference
to grab lunch together.  Talked more about the usual, and then I had to run off
to catch my train.
</p>
        <p>
Looking back, I feel that this is definitely a conference worth attending.  Of
course, your mileage will vary.  I wouldn't come here to go to a bunch of sessions
on topics you're already an expert on.  But the nice thing about this conference
over others I've been to is that it really is focused on best practices.  It's
not really focused much on technology-specific stuff (though there was a bit of that),
so you can derive value whether you do Java, C/C++, .NET, or whatever.  
</p>
        <p>
Also, it is a good place to come to meetings of minds from other technology experts,
so you get some more exposure than you might normally to how folks are doing software
outside of your technological community.  And one interesting thing I noticed
is that there is a tangible presence of software product developers, and that's a
different and valuable perspective for those who are more used to, say, standard custom/consulting/corporate
IT software.
</p>
        <p>
Overall, if you look over the sessions and see topics that you haven't had a chance
to explore in depth or maybe you want to just get exposed to other ideas in the software
space, this seems like a good conference for that.  I really enjoyed it.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=3d8dd54a-a3e0-4799-887b-2969d823d0e2" />
      </body>
      <title>Report from SD Best Practics Day IV (Final)</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,3d8dd54a-a3e0-4799-887b-2969d823d0e2.aspx</guid>
      <link>http://dotNetTemplar.Net/Report+From+SD+Best+Practics+Day+IV+Final.aspx</link>
      <pubDate>Fri, 21 Sep 2007 20:27:11 GMT</pubDate>
      <description>&lt;p&gt;
As I sit here on the train home, I've been thinking (and writing) about a lot of stuff.&amp;nbsp;
But I figured I should put this post together for completeness and finality, even
though I only made it to one session today before I left&amp;nbsp; early.&amp;nbsp; Last night
I was shocked and somewhat dismayed to find that I had somehow managed to book the
train for return on Saturday afternoon rather than today.&amp;nbsp; I looked at my reservation
email, thinking surely the ticket was misprinted, but nope, the reservation says the
22nd clearly in black and white.
&lt;/p&gt;
&lt;p&gt;
Now, those who spend much time with me know that I tend to be sort of the absent-minded
professor type.&amp;nbsp; I often have trouble keeping track of the details of day-to-day
things (but I &lt;em&gt;can&lt;/em&gt; tie my shoes!).&amp;nbsp; I like to think good reasons for
this, but whatever the reasons, that's me.&amp;nbsp; So I can totally imagine that somehow
I tricked my brain into thinking that the 22nd was the day I wanted to return when
I booked the train.
&lt;/p&gt;
&lt;p&gt;
That said, I think this is a good opportunity to observe a way in which the UX of
the reservations system could be improved.&amp;nbsp; If it had simply said somewhere that
the return trip was on SATURDAY and not just used these obscure things called numeric
dates, I'd immediately have seen and avoided my mistake.&amp;nbsp; But nowhere online
nor in the email nor on the ticket does it say Saturday.&amp;nbsp; In fact, there is SO
MUCH GARBAGE on the ticket, that the non-initiate has trouble finding anything of
value.&amp;nbsp; So think about that if you're designing some sort of booking system--show
the day of the week, please. :)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Lean Process Improvement 
&lt;br&gt;
&lt;/strong&gt;So this morning, on top of being tired because I stayed up late writing,
I was late for the class I wanted to attend, one called Agile Architecture.&amp;nbsp;
Unfortunately, it was in the smallest room in the conference (same one as the manager
meeting yesterday), and unfortunately, the planners didn't anticipate attendance to
that session correctly.&amp;nbsp; Plus, this room had this odd little old lady who felt
it was her duty to prevent anyone from attending who had to stand.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Yesterday, I watched her try to turn away (a few successfully) quite a few folks,
even though there was plenty of room on the far side to stand.&amp;nbsp; She kept saying
"there really is no room," but there was.&amp;nbsp; What made the whole scene kind of
comical was that she refused to go sit OUTSIDE the door, so rather than simply preventing
folks from coming in and causing a distraction, she let them come in, then animatedly
tried to convince them to leave, causing even more distraction.
&lt;/p&gt;
&lt;p&gt;
Well, when I peeked in the door this morning, saw the full room and saw her start
heading toward me, I knew I was out of luck.&amp;nbsp; I just didn't have the heart to
muscle by her and ignore her pleading to go stand on the other side, and besides,
I don't like standing still for 1.5 hours anyway.&amp;nbsp; So I was off to find an alternative.
&lt;/p&gt;
&lt;p&gt;
I knew there wasn't much else I wanted to see during that hour, but by golly I was
there and this was the only slot I could make today, so I was going to make it to
a session!&amp;nbsp; After two more failed entries into full sessions and studiously avoiding
some that sounded extremely dull by their titles, I finally found one that sounded
nominally interesting and had a lot of open space.&amp;nbsp; I really had no clue what
I was getting into...
&lt;/p&gt;
&lt;p&gt;
It ended up being somewhat interesting.&amp;nbsp; It was about applying the "lean process"
from the manufacturing space to software development.&amp;nbsp; I'm personally not really
into process and methodologies, particularly when they come from disciplines that
are only marginally like our own.&amp;nbsp; But this did sound like it could be useful
in some situations, particularly in software product (i.e., commercial) development.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
He talked about value stream mapping, which is basically modeling the process flow
of specific activities in product development from beginning to end (so you'd do one
for new feature dev, one for enhancements, one for hot fixes, etc.).&amp;nbsp; It sounds
like it does have potential to be useful as long as you don't spend too much time
on it.&amp;nbsp; Particularly if you think you have a problem in your process, this method
can help you to both visualize and identify potential problems.&amp;nbsp; If you do product
development, it's worth a look.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Final Thoughts 
&lt;br&gt;
&lt;/strong&gt;After that session, I made off to go to the 12:05 mass at the chapel outside
the convention center.&amp;nbsp; My deacon friend had let me know about it, and I was
glad of it.&amp;nbsp; And he was there, so after mass, we went back into the conference
to grab lunch together.&amp;nbsp; Talked more about the usual, and then I had to run off
to catch my train.
&lt;/p&gt;
&lt;p&gt;
Looking back, I feel that this is definitely a conference worth attending.&amp;nbsp; Of
course, your mileage will vary.&amp;nbsp; I wouldn't come here to go to a bunch of sessions
on topics you're already an expert on.&amp;nbsp; But the nice thing about this conference
over others I've been to is that it really is focused on best practices.&amp;nbsp; It's
not really focused much on technology-specific stuff (though there was a bit of that),
so you can derive value whether you do Java, C/C++, .NET, or whatever.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Also, it is a good place to come to meetings of minds from other technology experts,
so you get some more exposure than you might normally to how folks are doing software
outside of your technological community.&amp;nbsp; And one interesting thing I noticed
is that there is a tangible presence of software product developers, and that's a
different and valuable perspective for those who are more used to, say, standard custom/consulting/corporate
IT software.
&lt;/p&gt;
&lt;p&gt;
Overall, if you look over the sessions and see topics that you haven't had a chance
to explore in depth or maybe you want to just get exposed to other ideas in the software
space, this seems like a good conference for that.&amp;nbsp; I really enjoyed it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=3d8dd54a-a3e0-4799-887b-2969d823d0e2" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,3d8dd54a-a3e0-4799-887b-2969d823d0e2.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=bd115a75-8faf-44d2-9593-24c6f96c3b5a</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,bd115a75-8faf-44d2-9593-24c6f96c3b5a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,bd115a75-8faf-44d2-9593-24c6f96c3b5a.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bd115a75-8faf-44d2-9593-24c6f96c3b5a</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I stumbled into Barnes &amp; Noble (because it had the nearest Starbucks), wandered
into the notebook section, and was reminded that my current Moleskine notebook was
almost full.  Silly me, I still have two <em>back at the office</em>, so I thought
it must be fate for me to go ahead and restock while I'm here.  I highly recommend
Moleskine; I like the small, book-like ones without lines because small is convenient
enough to put in pocket and I don't like to conform to lines or have even the suggestion
that I should, but they have all kinds.  Good, tough little notebooks, and supposedly
they've been used by some famous people.  This has not been a paid advertisement
for Moleskine.  Now we return you to your regular program.
</p>
        <p>
          <strong>Applying Perspectives to Software Views (Cont'd) 
<br /></strong>Yesterday I talked about Rebecca Wirfs-Brock's session on software views. 
There's a lot more to what she said than what I communicated, but I'm just propounding
what stuck with me.  Looking at my notes, I forgot to mention another key thing,
which is that you should model these views and model them in a way that effectively
communicates to the stakeholders that their needs are being addressed.  She threw
up some UML diagrams, commenting that they're probably not good for most business
folks.  (I think UML is not good for most technical folks either, but I'm a rebel
like that.)  The point she made, though, was regardless of what notation you
use, provide a key that let's people know how to unlock the meaning of the model. 
Good point for sure.
</p>
        <p>
Actually, this reminds me of <em>Beautiful Evidence</em>, by Edward Tufte.  I
recommend Tufte for his area of expertise, though I'd suggest skipping the chapter
on Powerpoint (which sadly was released as a separate booklet) because it's not his
area of expertise and it shows.  Anyways, when he is sticking to the realm of
visual communication, he is excellent, and <em>Beautiful Evidence</em> is a pretty
easy read that helps you start thinking about how to communicate "outside the
box" as it were.  I bring it up here because applying his ideas in the area
of modeling software, particularly to non-technical audiences, is something we should
explore.
</p>
        <p>
Now, back to Day III.
</p>
        <p>
          <strong>Software Managers 
<br /></strong>The first session I made it to kind of late (and it was absolutely packed--standing
room only) was a session on tips for being a good technical/software manager. 
Having become one of these this year, it is definitely a subject of interest, and
I'm always on the lookout for more tips, though I must say that I think management
books (as a rule) are really bad about regurgitating each other.  You get to
where it becomes increasingly hard to find new, good insights the more you read them.
</p>
        <p>
But I thought this session would be good since it is specifically focused on managing
technical teams.  Some of her points were standard managerial stuff, but it was
nice to have it focused in on the IT industry.  I always end up feeling a bit
guilty, though, because I know I've already made numerous faux pas (not sure how to
pluralize that).  I hope my guys know I love them even though I screw up being
a good manager at times. :)  
</p>
        <p>
One recurring theme I keep coming across is having regular 1-1s with your peeps. 
I've heard weekly and bi-weekly, but it seems like both of those would be overkill
for my group since we have daily meetings, often go out to lunch, etc., so I'm going
to try monthly first.  It'll be better than nothing!  
</p>
        <p>
I have to say that managing well is at lot harder than I expected it to be. 
For those of us who aren't natural people persons, it is definitely an effort. 
I'm sure it is tough regardless, but I gotta think that it'd be easier if I was naturally
more a people person.  Anyways, I keep tryin' for now at least.
</p>
        <p>
          <strong>Designing for User Success 
<br /></strong>Went to another Larry Constantine session around UX.  This one was really
good.  He, like Patton, affirmed that "user experience is about everything." 
Again, it's nice to know I'm not crazy, and it takes a burden off me knowing that
I won't be a lone voice crying out about that.  It seems that maybe just those
who don't know anything about UX think it is "just another term for UI." 
Of course, these "UX professionals" are naturally focused in on their areas
of expertise (usability, information architecture, human factors, human-computer interaction,
visual design, interaction design, etc.), so maybe I'm still a bit odd in my contention
that architects must be the chief experience officers on their projects.
</p>
        <p>
Anyhoo, this session focused in on "user performance" as a distinct focus,
meaning that you are providing the tools to get the best performance out of people. 
Though none of the session was spent explicitly justifying the importance of a focus
on UX, implicitly the whole session was an illustration of why it is important. 
I have a ton of good notes from this session, but I won't bore you with them (you
can probably get most of it from his slides or other presentations he's done). 
If you get nothing else, though, it's to change the way you think about designing
software--design from the outside in.  If you're a smart person, you'll realize
this has huge implications.  And also, recognize that you won't make all parts
of your system perfectly usable, so prioritize your usability efforts based first
on frequency of use and second on severity of impact (i.e., those things that will
have serious ramifications if not done correctly).
</p>
        <p>
          <strong>Human Factors in API Design 
<br /></strong>The next session I hit was one related to UX for developers.  Here are
some salient one-liners:
</p>
        <ul>
          <li>
Consistency is next to godliness.</li>
          <li>
API = Application Programm<strong>er</strong> Interface</li>
          <li>
When in doubt, leave it out. &lt;-- More specifically, unless you have at least two,
real use cases, don't stick it in your API.</li>
          <li>
Use the Iceberg Principle. &lt;-- This means what people see of your code should only
be the tip of the iceberg--keep it small, simple, and focused.</li>
        </ul>
        <p>
This session actually seemed to be a blend of general UX guidelines (yes, they apply
here, too, not just on end-user interfaces) and more general framework design principles
that only had varying degrees of pertinence to ease of use.  Some highlights:
</p>
        <ul>
          <li>
Default all members to private; only raise visibility with justification.</li>
          <li>
Prefer constructors to factory/builder pattern, and setup object fully with constructor
where possible.</li>
          <li>
Use domain-specific vocabulary.</li>
          <li>
Prefer classes to interfaces.  Amen!</li>
          <li>
Prefer finality (sealing) to inheritance--minimize potential for overriding.</li>
        </ul>
        <p>
There's a good deal more, and I'm not offering the justification he proposed (for
brevity's sake).  I agree to varying levels of vehemence with most of what he
said, but one area where I think I have to disagree is his advice to only refactor
to patterns.  I can imagine where this comes from--because patterns can be abused
(paternitis as he said).  But I think saying refactor to patterns shows a big
misunderstanding of the point and value of patterns.  This is why it's important
to pay attention to the context and rationale in a pattern--so you know when to apply
it.  But patterns should be used where they apply--they're known, established,
tried and true ways of solving particular problems in particular contexts!  If
consistency is akin to godliness, using patterns is ambrosia.
</p>
        <p>
One last interesting note from this session was the admonition to consider using or
creating a domain-specific language where it helps with the usability of the API. 
His example was around JMidi and JFugue, where JMidi is a terribly verbose API, requiring
the construction of and coordination of a host of objects to do something simple like
play a note, JFugue offers a simple string-based DSL that is based off of musical
notation to let you place a whole series of notes very compactly.  Good/interesting
advice.
</p>
        <p>
          <strong>Pair Programming 
<br /></strong>The last session I went to today was one based on practical pair programming. 
I was actually on my way to a class on Business Process Modeling Notation, which would
have been potentially more intellectually stimulating, but I walked by the room with
the Pair Programming session on it and had a sudden feeling I should attend it. 
When I thought about it, I figured that I'd put off giving the idea fair play long
enough and that I should take the time to hear it in more depth.  I figured it'd
have more immediate relevancy to my current work situation in any respect.
</p>
        <p>
I won't belabor all the points because I suspect with good reason that they're all
the standard arguments for pair programming along with a good bit of the "how"
to do it in real situations.  He actually has a number of patterns and anti-patterns
to further illustrate good/bad practices in pair programming.  It was an interesting
extension of the pattern-based approach (to people).  Suffice it to say, I think
if you can get buy in in your organization it is definitely worth a try.  There
are numerous difficulties with it, chief one being it is hard to do effectively in
a non-co-located environment, but I think I'd try it given the opportunity.  
</p>
        <p>
          <strong>Random Thoughts 
<br /></strong>One thing that I've come to the conclusion on being here is that TDD seems
to be unanimously accepted by those who have actually tried it as a best practice. 
The API guy went so far as to say that he won't hire devs who don't have TDD experience. 
(I think that's a bit short-sighted, but I take his point.)  It's something to
think about for those still hesitating to adopt TDD.
</p>
        <p>
I met up again with the same fella I met last night.  We were both in the pair
programming class at the end of the day; he's been doing pair programming on a few
teams at his company for years and is a fan, though he definitely attests to the difficulty
of dealing with prima donnas, which apparently are more tolerated in his LOB (because
they have very specialized knowledge that requires PhD level education).  So
he wasn't able to carry XP to his entire company.  He also said that pairing
(which was echoed by the presenter) is a taxing process; 4-5 hours max is good.
</p>
        <p>
We also had a good long chat about things Catholic.  It's good to know that we
Catholics will be getting another good, solid deacon in him.  I imagine tonight
won't be the last time we talk.
</p>
        <p>
All in all, another great day.  Learned a bunch.  No sessions I regret going
to thus far, which is I think a big compliment for a conference. :)
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bd115a75-8faf-44d2-9593-24c6f96c3b5a" />
      </body>
      <title>Report from SD Best Practices Day III</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,bd115a75-8faf-44d2-9593-24c6f96c3b5a.aspx</guid>
      <link>http://dotNetTemplar.Net/Report+From+SD+Best+Practices+Day+III.aspx</link>
      <pubDate>Fri, 21 Sep 2007 02:48:34 GMT</pubDate>
      <description>&lt;p&gt;
Today I stumbled into Barnes &amp;amp; Noble (because it had the nearest Starbucks), wandered
into the notebook section, and was reminded that my current Moleskine notebook was
almost full.&amp;#xA0; Silly me, I still have two &lt;em&gt;back at the office&lt;/em&gt;, so I thought
it must be fate for me to go ahead and restock while I'm here.&amp;#xA0; I highly recommend
Moleskine; I like the small, book-like ones without lines because small is convenient
enough to put in pocket and I don't like to conform to lines or have even the suggestion
that I should, but they have all kinds.&amp;#xA0; Good, tough little notebooks, and supposedly
they've been used by some famous people.&amp;#xA0; This has not been a paid advertisement
for Moleskine.&amp;#xA0; Now we return you to your regular program.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Applying Perspectives to Software Views (Cont'd) 
&lt;br /&gt;
&lt;/strong&gt;Yesterday I talked about Rebecca Wirfs-Brock's session on software views.&amp;#xA0;
There's a lot more to what she said than what I communicated, but I'm just propounding
what stuck with me.&amp;#xA0; Looking at my notes, I forgot to mention another key thing,
which is that you should model these views and model them in a way that effectively
communicates to the stakeholders that their needs are being addressed.&amp;#xA0; She threw
up some UML diagrams, commenting that they're probably not good for most business
folks.&amp;#xA0; (I think UML is not good for most technical folks either, but I'm a rebel
like that.)&amp;#xA0; The point she made, though, was regardless of what notation you
use, provide a key that let's people know how to unlock the meaning of the model.&amp;#xA0;
Good point for sure.
&lt;/p&gt;
&lt;p&gt;
Actually, this reminds me of &lt;em&gt;Beautiful Evidence&lt;/em&gt;, by Edward Tufte.&amp;#xA0; I
recommend Tufte for his area of expertise, though I'd suggest skipping the chapter
on Powerpoint (which sadly was released as a separate booklet) because it's not his
area of expertise and it shows.&amp;#xA0; Anyways, when he is sticking to the realm of
visual communication, he is excellent, and &lt;em&gt;Beautiful Evidence&lt;/em&gt; is a pretty
easy read that helps you start thinking about how to communicate &amp;quot;outside the
box&amp;quot; as it were.&amp;#xA0; I bring it up here because applying his ideas in the area
of modeling software, particularly to non-technical audiences, is something we should
explore.
&lt;/p&gt;
&lt;p&gt;
Now, back to Day III.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Software Managers 
&lt;br /&gt;
&lt;/strong&gt;The first session I made it to kind of late (and it was absolutely packed--standing
room only) was a session on tips for being a good technical/software manager.&amp;#xA0;
Having become one of these this year, it is definitely a subject of interest, and
I'm always on the lookout for more tips, though I must say that I think management
books (as a rule) are really bad about regurgitating each other.&amp;#xA0; You get to
where it becomes increasingly hard to find new, good insights the more you read them.
&lt;/p&gt;
&lt;p&gt;
But I thought this session would be good since it is specifically focused on managing
technical teams.&amp;#xA0; Some of her points were standard managerial stuff, but it was
nice to have it focused in on the IT industry.&amp;#xA0; I always end up feeling a bit
guilty, though, because I know I've already made numerous faux pas (not sure how to
pluralize that).&amp;#xA0; I hope my guys know I love them even though I screw up being
a good manager at times. :)&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
One recurring theme I keep coming across is having regular 1-1s with your peeps.&amp;#xA0;
I've heard weekly and bi-weekly, but it seems like both of those would be overkill
for my group since we have daily meetings, often go out to lunch, etc., so I'm going
to try monthly first.&amp;#xA0; It'll be better than nothing!&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
I have to say that managing well is at lot harder than I expected it to be.&amp;#xA0;
For those of us who aren't natural people persons, it is definitely an effort.&amp;#xA0;
I'm sure it is tough regardless, but I gotta think that it'd be easier if I was naturally
more a people person.&amp;#xA0; Anyways, I keep tryin' for now at least.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Designing for User Success 
&lt;br /&gt;
&lt;/strong&gt;Went to another Larry Constantine session around UX.&amp;#xA0; This one was really
good.&amp;#xA0; He, like Patton, affirmed that &amp;quot;user experience is about everything.&amp;quot;&amp;#xA0;
Again, it's nice to know I'm not crazy, and it takes a burden off me knowing that
I won't be a lone voice crying out about that.&amp;#xA0; It seems that maybe just those
who don't know anything about UX think it is &amp;quot;just another term for UI.&amp;quot;&amp;#xA0;
Of course, these &amp;quot;UX professionals&amp;quot; are naturally focused in on their areas
of expertise (usability, information architecture, human factors, human-computer interaction,
visual design, interaction design, etc.), so maybe I'm still a bit odd in my contention
that architects must be the chief experience officers on their projects.
&lt;/p&gt;
&lt;p&gt;
Anyhoo, this session focused in on &amp;quot;user performance&amp;quot; as a distinct focus,
meaning that you are providing the tools to get the best performance out of people.&amp;#xA0;
Though none of the session was spent explicitly justifying the importance of a focus
on UX, implicitly the whole session was an illustration of why it is important.&amp;#xA0;
I have a ton of good notes from this session, but I won't bore you with them (you
can probably get most of it from his slides or other presentations he's done).&amp;#xA0;
If you get nothing else, though, it's to change the way you think about designing
software--design from the outside in.&amp;#xA0; If you're a smart person, you'll realize
this has huge implications.&amp;#xA0; And also, recognize that you won't make all parts
of your system perfectly usable, so prioritize your usability efforts based first
on frequency of use and second on severity of impact (i.e., those things that will
have serious ramifications if not done correctly).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Human Factors in API Design 
&lt;br /&gt;
&lt;/strong&gt;The next session I hit was one related to UX for developers.&amp;#xA0; Here are
some salient one-liners:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Consistency is next to godliness.&lt;/li&gt;
&lt;li&gt;
API = Application Programm&lt;strong&gt;er&lt;/strong&gt; Interface&lt;/li&gt;
&lt;li&gt;
When in doubt, leave it out. &amp;lt;-- More specifically, unless you have at least two,
real use cases, don't stick it in your API.&lt;/li&gt;
&lt;li&gt;
Use the Iceberg Principle. &amp;lt;-- This means what people see of your code should only
be the tip of the iceberg--keep it small, simple, and focused.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This session actually seemed to be a blend of general UX guidelines (yes, they apply
here, too, not just on end-user interfaces) and more general framework design principles
that only had varying degrees of pertinence to ease of use.&amp;#xA0; Some highlights:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Default all members to private; only raise visibility with justification.&lt;/li&gt;
&lt;li&gt;
Prefer constructors to factory/builder pattern, and setup object fully with constructor
where possible.&lt;/li&gt;
&lt;li&gt;
Use domain-specific vocabulary.&lt;/li&gt;
&lt;li&gt;
Prefer classes to interfaces.&amp;#xA0; Amen!&lt;/li&gt;
&lt;li&gt;
Prefer finality (sealing) to inheritance--minimize potential for overriding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There's a good deal more, and I'm not offering the justification he proposed (for
brevity's sake).&amp;#xA0; I agree to varying levels of vehemence with most of what he
said, but one area where I think I have to disagree is his advice to only refactor
to patterns.&amp;#xA0; I can imagine where this comes from--because patterns can be abused
(paternitis as he said).&amp;#xA0; But I think saying refactor to patterns shows a big
misunderstanding of the point and value of patterns.&amp;#xA0; This is why it's important
to pay attention to the context and rationale in a pattern--so you know when to apply
it.&amp;#xA0; But patterns should be used where they apply--they're known, established,
tried and true ways of solving particular problems in particular contexts!&amp;#xA0; If
consistency is akin to godliness, using patterns is ambrosia.
&lt;/p&gt;
&lt;p&gt;
One last interesting note from this session was the admonition to consider using or
creating a domain-specific language where it helps with the usability of the API.&amp;#xA0;
His example was around JMidi and JFugue, where JMidi is a terribly verbose API, requiring
the construction of and coordination of a host of objects to do something simple like
play a note, JFugue offers a simple string-based DSL that is based off of musical
notation to let you place a whole series of notes very compactly.&amp;#xA0; Good/interesting
advice.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Pair Programming 
&lt;br /&gt;
&lt;/strong&gt;The last session I went to today was one based on practical pair programming.&amp;#xA0;
I was actually on my way to a class on Business Process Modeling Notation, which would
have been potentially more intellectually stimulating, but I walked by the room with
the Pair Programming session on it and had a sudden feeling I should attend it.&amp;#xA0;
When I thought about it, I figured that I'd put off giving the idea fair play long
enough and that I should take the time to hear it in more depth.&amp;#xA0; I figured it'd
have more immediate relevancy to my current work situation in any respect.
&lt;/p&gt;
&lt;p&gt;
I won't belabor all the points because I suspect with good reason that they're all
the standard arguments for pair programming along with a good bit of the &amp;quot;how&amp;quot;
to do it in real situations.&amp;#xA0; He actually has a number of patterns and anti-patterns
to further illustrate good/bad practices in pair programming.&amp;#xA0; It was an interesting
extension of the pattern-based approach (to people).&amp;#xA0; Suffice it to say, I think
if you can get buy in in your organization it is definitely worth a try.&amp;#xA0; There
are numerous difficulties with it, chief one being it is hard to do effectively in
a non-co-located environment, but I think I'd try it given the opportunity.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Random Thoughts 
&lt;br /&gt;
&lt;/strong&gt;One thing that I've come to the conclusion on being here is that TDD seems
to be unanimously accepted by those who have actually tried it as a best practice.&amp;#xA0;
The API guy went so far as to say that he won't hire devs who don't have TDD experience.&amp;#xA0;
(I think that's a bit short-sighted, but I take his point.)&amp;#xA0; It's something to
think about for those still hesitating to adopt TDD.
&lt;/p&gt;
&lt;p&gt;
I met up again with the same fella I met last night.&amp;#xA0; We were both in the pair
programming class at the end of the day; he's been doing pair programming on a few
teams at his company for years and is a fan, though he definitely attests to the difficulty
of dealing with prima donnas, which apparently are more tolerated in his LOB (because
they have very specialized knowledge that requires PhD level education).&amp;#xA0; So
he wasn't able to carry XP to his entire company.&amp;#xA0; He also said that pairing
(which was echoed by the presenter) is a taxing process; 4-5 hours max is good.
&lt;/p&gt;
&lt;p&gt;
We also had a good long chat about things Catholic.&amp;#xA0; It's good to know that we
Catholics will be getting another good, solid deacon in him.&amp;#xA0; I imagine tonight
won't be the last time we talk.
&lt;/p&gt;
&lt;p&gt;
All in all, another great day.&amp;#xA0; Learned a bunch.&amp;#xA0; No sessions I regret going
to thus far, which is I think a big compliment for a conference. :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bd115a75-8faf-44d2-9593-24c6f96c3b5a" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,bd115a75-8faf-44d2-9593-24c6f96c3b5a.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=32470308-75ea-40fd-bc8e-3d101349e0fc</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,32470308-75ea-40fd-bc8e-3d101349e0fc.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,32470308-75ea-40fd-bc8e-3d101349e0fc.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=32470308-75ea-40fd-bc8e-3d101349e0fc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hi again.  Today was another good day at the conference.  
</p>
        <p>
          <strong>User Experience Distilled</strong>
        </p>
        <p>
The first class I attended was a whirlwind tour of user experience.  I was heartened
to learn that I am not alone or crazy in recognizing that there are a number of disciplines
that go into this thing we call UX, and the presenter, <a href="http://www.thespringexperience.com/show_session_view.jsp?presentationId=187&amp;showId=45" target="_blank">Jeff
Patton</a>, also recognizes that actually virtually every role in developing software
has an effect on UX, which is also something I have come to the conclusion of (as
I hint at on <a href="http://www.infragistics.com/ux/default.aspx" target="_blank">IG's
UX area</a>).  I develop the idea more explicitly in an unpublished paper I'm
working on.  (I'm hoping the inputs I get from this conference will help me to
finish that out.)   
</p>
        <p>
I actually think that all of this UX stuff falls under the architect's purview because
(in my mind at least) he or she is primarily responsible for designing the software
as a whole.  This means that architects need to have a conversational familiarity
(at least) with the different disciplines that people traditionally think of as user-oriented
disciplines, but I'd take it a step further and say that the architect needs to be
the chief experience officer, as it were, on a software project.  The architect
needs to ensure that the appropriate expertise in user-oriented disciplines is brought
to bear on his or her project and also needs to understand how the other aspects of
software design and development impact UX and optimize them for good UX.  
</p>
        <p>
That discussion aside, Jeff had a pretty clever graph that showed how the kind of
software being developed affects the perceived ROI of expenditure on UX.  His
talk also was about as effective an introduction to UX that I can imagine.  He
dealt with what it is, why it's important, and then offered a high-level overview
of key bits of knowledge for people to make use of.  I want to steal his slides!
:)
</p>
        <p>
          <strong>Global Teams &amp; Outsourcing Agilely</strong>
        </p>
        <p>
The keynote during lunch today was done by Scott Ambler.  It was nice to finally
see/hear him in person since I've heard so much about him.  I got the feeling
(from what he even admitted) that he was presenting stuff that wasn't just his--he
was from what I could tell presenting an overview of a book that IBM publishes (<a href="http://www-306.ibm.com/software/info/sdp/gdd/en/index.jsp" target="_blank">related</a>)
on the subject.  But that didn't take away from the value of the knowledge by
any means.  I'd definitely check it out if you're going to be dealing with geographically
distributed teams.
</p>
        <p>
          <strong>Usability Peer Reviews</strong>
        </p>
        <p>
In my continuing quest to learn more about UX (part of which is usability), I attended
a class by <a href="http://www.foruse.com/" target="_blank">Larry Constantine</a> about
lightweight usability practice through peer review/inspection (<a href="http://www.foruse.com/articles/inspections2003.pdf" target="_blank">related
paper</a>).  I was actually surprised because he has a very formal methodology
for this, which means he's put a lot of thought into it but, more importantly, he's
used it a lot in consulting, so it is tested.  I personally am not a big fan
of being too formal with these things.  I understand the value in formalizing
guidance into repeatable methodology, but I've always felt that these things should
be learned for their principles and less for their strictures.  Of course, that
runs the risk of missing something important, but I guess that's a trade off. 
Regardless of if you follow it to a T or not, there's a ton of good stuff to be learned
from this technique on how to plug in usability QA into the software process.
</p>
        <p>
          <strong>Applying Perspectives to Software Views</strong>
        </p>
        <p>
After that, I slipped over to another Rebecca Wirfs-Brock presentation on applying
perspectives to software views in architecture.  (She was presenting the subject
of this <a href="http://www.amazon.com/Software-Systems-Architecture-Stakeholders-Perspectives/dp/0321112296/ref=sr_1_1/102-5836002-3971301?ie=UTF8&amp;s=books&amp;qid=1190252287&amp;sr=1-1" target="_blank">book</a>.) 
To me, the key takeaway was that we should figure out the most important aspects of
our system and focus on those.  It echoed (in my mind) core sentiments of domain-driven
design, though it used different terminology and approach.  I think the two are
complementary--using the view approach helps you to think about the different non-functional
aspects.  Using strategic DDD (in particular, distilling the domain) helps you
and stakeholders to focus in on the most important aspects of the system from a domain
strategy perspective, and that will inform which views and perspectives are the ones
that need the focus.  
</p>
        <p>
This approach also echoes the sentiment expressed by Evans yesterday that says you
can't make every part of the system well-designed (elegant/close to perfection). 
Once you accept that, you can then use these approaches to find the parts of the systems
where you need to focus most of your energies.  I really like that this practical
truth is being made explicit because I think it can help to overcome a lot of the
problems that crop up in software development that have to do with the general idealistic
nature that we geeks have.
</p>
        <p>
          <strong>Expo</strong>
        </p>
        <p>
After the classes today, they had the expo open.  In terms of professional presentation,
it was on par with TechEd's Expo, but certainly the scope (number of sponsors) was
far smaller.  That said, I popped into the embedded systems expo.  That
was a new experience for me.  It was interesting to see almost every booth with
some kind of exposed hardware on display.  As a software guy, I tend to take
all that stuff for granted.  They even had a booth with specialized networked
sensors for tanks of liquid.  This stuff stirred recollections of weird science
and all the other fun fantasies that geeky kids have about building computerized machines. 
The coolest thing there was the Intel chopper, which apparently was built by the Orange
County Chopper guys, but it had a lot of fancy embedded system stuff on it. 
I didn't stick around to hear the spiel, but it was pretty cool.
</p>
        <p>
After the expo, I bumped into a guy at Cheesecake factory.  We started chatting,
and it turns out that he's in the process of becoming a Roman Catholic deacon. 
Pretty cool coincidence for me!  We talked about two of my top passions--my faith
and software development (as exemplified here on dotNetTemplar!).  It was a good
dinner.  He works at a company that does computer aided engineering; sounds like
neat stuff with all that 3D modeling and virtual physics.  Way out of my league!
</p>
        <p>
As I said, another good day here at SD Best Practices. 
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=32470308-75ea-40fd-bc8e-3d101349e0fc" />
      </body>
      <title>Report from SD Best Practices Day II</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,32470308-75ea-40fd-bc8e-3d101349e0fc.aspx</guid>
      <link>http://dotNetTemplar.Net/Report+From+SD+Best+Practices+Day+II.aspx</link>
      <pubDate>Thu, 20 Sep 2007 01:54:31 GMT</pubDate>
      <description>&lt;p&gt;
Hi again.&amp;nbsp; Today was another good day at the conference.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;User Experience Distilled&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The first class I attended was a whirlwind tour of user experience.&amp;nbsp; I was heartened
to learn that I am not alone or crazy in recognizing that there are a number of disciplines
that go into this thing we call UX, and the presenter, &lt;a href="http://www.thespringexperience.com/show_session_view.jsp?presentationId=187&amp;amp;showId=45" target=_blank&gt;Jeff
Patton&lt;/a&gt;, also recognizes that actually virtually every role in developing software
has an effect on UX, which is also something I have come to the conclusion of (as
I hint at on &lt;a href="http://www.infragistics.com/ux/default.aspx" target=_blank&gt;IG's
UX area&lt;/a&gt;).&amp;nbsp; I develop the idea more explicitly in an unpublished paper I'm
working on.&amp;nbsp; (I'm hoping the inputs I get from this conference will help me to
finish that out.)&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I actually think that all of this UX stuff falls under the architect's purview because
(in my mind at least) he or she is primarily responsible for designing the software
as a whole.&amp;nbsp; This means that architects need to have a conversational familiarity
(at least) with the different disciplines that people traditionally think of as user-oriented
disciplines, but I'd take it a step further and say that the architect needs to be
the chief experience officer, as it were, on a software project.&amp;nbsp; The architect
needs to ensure that the appropriate expertise in user-oriented disciplines is brought
to bear on his or her project and also needs to understand how the other aspects of
software design and development impact UX and optimize them for good UX.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
That discussion aside, Jeff had a pretty clever graph that showed how the kind of
software being developed affects the perceived ROI of expenditure on UX.&amp;nbsp; His
talk also was about as effective an introduction to UX that I can imagine.&amp;nbsp; He
dealt with what it is, why it's important, and then offered a high-level overview
of key bits of knowledge for people to make use of.&amp;nbsp; I want to steal his slides!
:)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Global Teams &amp;amp; Outsourcing Agilely&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The keynote during lunch today was done by Scott Ambler.&amp;nbsp; It was nice to finally
see/hear him in person since I've heard so much about him.&amp;nbsp; I got the feeling
(from what he even admitted) that he was presenting stuff that wasn't just his--he
was from what I could tell presenting an overview of a book that IBM publishes (&lt;a href="http://www-306.ibm.com/software/info/sdp/gdd/en/index.jsp" target=_blank&gt;related&lt;/a&gt;)
on the subject.&amp;nbsp; But that didn't take away from the value of the knowledge by
any means.&amp;nbsp; I'd definitely check it out if you're going to be dealing with geographically
distributed teams.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Usability Peer Reviews&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
In my continuing quest to learn more about UX (part of which is usability), I attended
a class by &lt;a href="http://www.foruse.com/" target=_blank&gt;Larry Constantine&lt;/a&gt; about
lightweight usability practice through peer review/inspection (&lt;a href="http://www.foruse.com/articles/inspections2003.pdf" target=_blank&gt;related
paper&lt;/a&gt;).&amp;nbsp; I was actually surprised because he has a very formal methodology
for this, which means he's put a lot of thought into it but, more importantly, he's
used it a lot in consulting, so it is tested.&amp;nbsp; I personally am not a big fan
of being too formal with these things.&amp;nbsp; I understand the value in formalizing
guidance into repeatable methodology, but I've always felt that these things should
be learned for their principles and less for their strictures.&amp;nbsp; Of course, that
runs the risk of missing something important, but I guess that's a trade off.&amp;nbsp;
Regardless of if you follow it to a T or not, there's a ton of good stuff to be learned
from this technique on how to plug in usability QA into the software process.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Applying Perspectives to Software Views&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
After that, I slipped over to another Rebecca Wirfs-Brock presentation on applying
perspectives to software views in architecture.&amp;nbsp; (She was presenting the subject
of this &lt;a href="http://www.amazon.com/Software-Systems-Architecture-Stakeholders-Perspectives/dp/0321112296/ref=sr_1_1/102-5836002-3971301?ie=UTF8&amp;amp;s=books&amp;amp;qid=1190252287&amp;amp;sr=1-1" target=_blank&gt;book&lt;/a&gt;.)&amp;nbsp;
To me, the key takeaway was that we should figure out the most important aspects of
our system and focus on those.&amp;nbsp; It echoed (in my mind) core sentiments of domain-driven
design, though it used different terminology and approach.&amp;nbsp; I think the two are
complementary--using the view approach helps you to think about the different non-functional
aspects.&amp;nbsp; Using strategic DDD (in particular, distilling the domain) helps you
and stakeholders to focus in on the most important aspects of the system from a domain
strategy perspective, and that will inform which views and perspectives are the ones
that need the focus.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This approach also echoes the sentiment expressed by Evans yesterday that says you
can't make every part of the system well-designed (elegant/close to perfection).&amp;nbsp;
Once you accept that, you can then use these approaches to find the parts of the systems
where you need to focus most of your energies.&amp;nbsp; I really like that this practical
truth is being made explicit because I think it can help to overcome a lot of the
problems that crop up in software development that have to do with the general idealistic
nature that we geeks have.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Expo&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
After the classes today, they had the expo open.&amp;nbsp; In terms of professional presentation,
it was on par with TechEd's Expo, but certainly the scope (number of sponsors) was
far smaller.&amp;nbsp; That said, I popped into the embedded systems expo.&amp;nbsp; That
was a new experience for me.&amp;nbsp; It was interesting to see almost every booth with
some kind of exposed hardware on display.&amp;nbsp; As a software guy, I tend to take
all that stuff for granted.&amp;nbsp; They even had a booth with specialized networked
sensors for tanks of liquid.&amp;nbsp; This stuff stirred recollections of weird science
and all the other fun fantasies that geeky kids have about building computerized machines.&amp;nbsp;
The coolest thing there was the Intel chopper, which apparently was built by the Orange
County Chopper guys, but it had a lot of fancy embedded system stuff on it.&amp;nbsp;
I didn't stick around to hear the spiel, but it was pretty cool.
&lt;/p&gt;
&lt;p&gt;
After the expo, I bumped into a guy at Cheesecake factory.&amp;nbsp; We started chatting,
and it turns out that he's in the process of becoming a Roman Catholic deacon.&amp;nbsp;
Pretty cool coincidence for me!&amp;nbsp; We talked about two of my top passions--my faith
and software development (as exemplified here on dotNetTemplar!).&amp;nbsp; It was a good
dinner.&amp;nbsp; He works at a company that does computer aided engineering; sounds like
neat stuff with all that 3D modeling and virtual physics.&amp;nbsp; Way out of my league!
&lt;/p&gt;
&lt;p&gt;
As I said, another good day here at SD Best Practices. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=32470308-75ea-40fd-bc8e-3d101349e0fc" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,32470308-75ea-40fd-bc8e-3d101349e0fc.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=c5bb810a-3c8f-46f5-aab9-77365a9e868a</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,c5bb810a-3c8f-46f5-aab9-77365a9e868a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,c5bb810a-3c8f-46f5-aab9-77365a9e868a.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c5bb810a-3c8f-46f5-aab9-77365a9e868a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I meant to write this last night, but I didn't get back to my room till late and just
felt like crashing.  I'm at the SD Best Practices conference in Boston this week,
which is a new experience for me.  It's one of a very few non-MS-oriented conferences
I've attended, and I really wanted to come because best practices are a passion for
me (and part of my job).  Infragistics was kind enough to send me.  I thought
I'd share my experiences for anyone else considering going (and just for my own reference..
hehe)  Anyways, enough of the intro...
</p>
        <p>
          <strong>
            <u>Day 1 - Tuesday, 18 September 2007</u>
          </strong>
        </p>
        <p>
First off, let me say I like the idea of starting on a Tuesday.  It let me work
for a good part of the day on Monday and still make it out here by train on Monday
night.  I've found in the past that attending sessions non-stop for a few days
can really wear you out, so four days seems about right.
</p>
        <p>
The conference is in the Hynes convention center, and I'm at the Westin, a stone's
throw away.  Also, it's right next to the Back Bay Station, so thus far the logistics
aspect has worked out quite well for me.  I'd personally much rather take a train
over a plane anytime.  
</p>
        <p>
          <strong>Responsibility-Driven Design</strong>
        </p>
        <p>
Tuesday was a day of "tutorials," which are half-day sessions.  So
in the morning, I attended Rebecca Wirfs-Brock's tour of responsibility-driven design
(RDD?).  I actually had her book at one point because it was mentioned in a good
light by Dr. West in his Object Thinking, but somewhere along the line I seem to have
lost it.  Anyways, I was glad to get a chance to learn from the author directly
and to interact.  
</p>
        <p>
From what I can ascertain, RDD has some good insight into how to do good object design. 
It seems to me that thinking in terms of responsibilities can help you properly break
apart the domain into objects if you struggle with just thinking in terms of behavior. 
It's potentially easier than just thinking in terms of behaviors because while behaviors
will certainly be responsibilities, objects can also have the responsibility to "know"
certain things, so it is a broader way of thinking about objects that includes their
data.
</p>
        <p>
That said, it doesn't really negate the point of focusing on behaviors, particularly
for folks with a data-oriented background because I do think that focusing on the
behaviors is the right way to discover objects and assign them the appropriate responsibilities. 
I think the key difference is that with the object-thinking approach, you know that
there will be data and that it is important to deal with, but you keep it in the right
perspective--you don't let it become the focus of your object discovery.
</p>
        <p>
Another beneficial thing I think Ms Wirfs-Brock has is the idea of using stereotypes
as a way to discover objects in the domain.  This is more helpful, I think, when
dealing with objects that are more part of the software domain than those in the business
domain because the stereotypes are very software-oriented (interfacers, information
holders, etc.).  
</p>
        <p>
In terms of process, she advocates this idea of having everyone on a team write their
thoughts down about the problem being faced in a few sentences, focusing on what seems
like it'll be a challenge, what will be easy, what you've run into before, etc. 
Then have everyone bring those to the initial design meetings.  I like the idea
because it bypasses the introvert-extrovert problem you sometimes get in meetings
and you can start out with a lot of ideas to really jump sta
</p>
        <p>
rt the design.  It's a good way to ensure you don't miss out on ideas due to
personality issues.
</p>
        <p>
The other thing I like in her process is writing down a purpose statement for objects
as you discover them and thinking of them as candidates.  This is part of the
CRC card process (the first C is now "candidates").  The reason I like
it is that it helps you to focus on the point of the object and sort of justify its
existence, which can help weed out some bad ideas.  
</p>
        <p>
What I don't like about the process is the overall CRC card idea.  While it surely
is more lightweight than many ways to approach object design, you still end up with
a bunch of paper that you then have to translate into code at some point.  I
much prefer to use a tool that will literally be creating the code as I design. 
I've found the VS class designer serves this purpose quite well.  In fact, on
the way up here, I spent some time doing up a sample class diagram using the object
thinking approach to share as an example of domain modeling.  I'll be sharing
it soon, but I just mention it to say this is not just speculation.  It was actually
very lightweight and easy to discover objects and model the domain that way, and at
the end I had literal code that I can then either fill out or hand off to other devs
to work on who can then further refine it.
</p>
        <p>
          <strong>Domain-Driven Design</strong>
        </p>
        <p>
The second session I attended was one by Eric Evans on strategic domain-driven design. 
Eric wrote a book on the subject that's been well received by everyone I've encountered
who spent time with it.  I've seen a presentation on it, and I've read parts
of Jimmy Nillson's <em>Applying Domain-Driven Design and Patterns</em> book. 
So I thought I was acquainted well enough with the ideas, but as I often find to be
the case, if you rely on second-hand info, you'll inevitably get a version of the
info that has been interpreted and is biased towards that person's point of view.
</p>
        <p>
For instance, most of what I've seen on DDD is focused on what Eric calls "tactical"
DDD, i.e., figuring out the objects in the domain and ensuring you stay on track with
the domain using what he calls the "ubiquitous language."  Eric presented
parts of his ideas yesterday that he calls "strategic" because they are
more geared towards strategic level thinking in how you approach building your software. 
Two key takeaways I saw were what he calls context mapping, which seems to be a really
effective way to analyze existing software to find where the real problems lie, and
distilling the domain, which is a way to really focus in on the core part of a system
that you need to design.
</p>
        <p>
In short (very abbreviated), he claims (and I agree) that no large system will be
completely well designed, nor does it need to be.  This isn't to say you're sloppy
but it helps you to focus your energies where they need to be focused--on the core
domain.  Doing this actually can help business figure out where they should consider
buying off-the-shelf solutions and/or outsourcing as well as where to focus their
best folks.  It's a pretty concrete way to answer the buy vs. build question.
</p>
        <p>
Anyways, I'm definitely going to get his book to dig in deeper (it's already on the
way).  Please don't take my cliff's notes here as the end of your exploration
of DDD.  It definitely warrants further digging, and it is very complementary
to a good OOD approach.
</p>
        <p>
After all this, I was privileged enough to bump into Eric and have dinner, getting
to pick his brain a bit about how all his thinking on DDD came together, his perspectives
on software development, and how to encourage adoption of better design practices
(among other things).  Very interesting conversation, one that would have been
good for a podcast.  I won't share the details, but I'm sure folks will eventually
see some influence this conversation had on me.  Good stuff.
</p>
        <p>
          <strong>Software for Your Head</strong>
        </p>
        <p>
I almost forgot about Jim McCarthy's keynote.  I've only seen Jim twice (once
in person and once recorded).  He's a very interesting and dynamic speaker, which
makes up for some of the lack of coherence.  I find the best speakers tend to
come across a bit less coherent because they let speaking become an adventure that
takes them where it will.  But I do think there was definitely value in his message. 
I tend to agree that he's right in asserting that what we all do on a daily basis
has a larger impact on humanity than we realize, and I can't argue with his experience
in building teams that work.  <a title="http://www.mccarthyshow.com/" href="http://www.mccarthyshow.com/">http://www.mccarthyshow.com/</a> is
definitely worth a look.
</p>
        <p>
Overall, Tuesday was a big success from an attendee perspective.  So far so good!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c5bb810a-3c8f-46f5-aab9-77365a9e868a" />
      </body>
      <title>Report from SD Best Practices Day 1</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,c5bb810a-3c8f-46f5-aab9-77365a9e868a.aspx</guid>
      <link>http://dotNetTemplar.Net/Report+From+SD+Best+Practices+Day+1.aspx</link>
      <pubDate>Wed, 19 Sep 2007 15:17:20 GMT</pubDate>
      <description>&lt;p&gt;
I meant to write this last night, but I didn't get back to my room till late and just
felt like crashing.&amp;#xA0; I'm at the SD Best Practices conference in Boston this week,
which is a new experience for me.&amp;#xA0; It's one of a very few non-MS-oriented conferences
I've attended, and I really wanted to come because best practices are a passion for
me (and part of my job).&amp;#xA0; Infragistics was kind enough to send me.&amp;#xA0; I thought
I'd share my experiences for anyone else considering going (and just for my own reference..
hehe)&amp;#xA0; Anyways, enough of the intro...
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Day 1 - Tuesday, 18 September 2007&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
First off, let me say I like the idea of starting on a Tuesday.&amp;#xA0; It let me work
for a good part of the day on Monday and still make it out here by train on Monday
night.&amp;#xA0; I've found in the past that attending sessions non-stop for a few days
can really wear you out, so four days seems about right.
&lt;/p&gt;
&lt;p&gt;
The conference is in the Hynes convention center, and I'm at the Westin, a stone's
throw away.&amp;#xA0; Also, it's right next to the Back Bay Station, so thus far the logistics
aspect has worked out quite well for me.&amp;#xA0; I'd personally much rather take a train
over a plane anytime.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Responsibility-Driven Design&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Tuesday was a day of &amp;quot;tutorials,&amp;quot; which are half-day sessions.&amp;#xA0; So
in the morning, I attended Rebecca Wirfs-Brock's tour of responsibility-driven design
(RDD?).&amp;#xA0; I actually had her book at one point because it was mentioned in a good
light by Dr. West in his Object Thinking, but somewhere along the line I seem to have
lost it.&amp;#xA0; Anyways, I was glad to get a chance to learn from the author directly
and to interact.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
From what I can ascertain, RDD has some good insight into how to do good object design.&amp;#xA0;
It seems to me that thinking in terms of responsibilities can help you properly break
apart the domain into objects if you struggle with just thinking in terms of behavior.&amp;#xA0;
It's potentially easier than just thinking in terms of behaviors because while behaviors
will certainly be responsibilities, objects can also have the responsibility to &amp;quot;know&amp;quot;
certain things, so it is a broader way of thinking about objects that includes their
data.
&lt;/p&gt;
&lt;p&gt;
That said, it doesn't really negate the point of focusing on behaviors, particularly
for folks with a data-oriented background because I do think that focusing on the
behaviors is the right way to discover objects and assign them the appropriate responsibilities.&amp;#xA0;
I think the key difference is that with the object-thinking approach, you know that
there will be data and that it is important to deal with, but you keep it in the right
perspective--you don't let it become the focus of your object discovery.
&lt;/p&gt;
&lt;p&gt;
Another beneficial thing I think Ms Wirfs-Brock has is the idea of using stereotypes
as a way to discover objects in the domain.&amp;#xA0; This is more helpful, I think, when
dealing with objects that are more part of the software domain than those in the business
domain because the stereotypes are very software-oriented (interfacers, information
holders, etc.).&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
In terms of process, she advocates this idea of having everyone on a team write their
thoughts down about the problem being faced in a few sentences, focusing on what seems
like it'll be a challenge, what will be easy, what you've run into before, etc.&amp;#xA0;
Then have everyone bring those to the initial design meetings.&amp;#xA0; I like the idea
because it bypasses the introvert-extrovert problem you sometimes get in meetings
and you can start out with a lot of ideas to really jump sta
&lt;/p&gt;
&lt;p&gt;
rt the design.&amp;#xA0; It's a good way to ensure you don't miss out on ideas due to
personality issues.
&lt;/p&gt;
&lt;p&gt;
The other thing I like in her process is writing down a purpose statement for objects
as you discover them and thinking of them as candidates.&amp;#xA0; This is part of the
CRC card process (the first C is now &amp;quot;candidates&amp;quot;).&amp;#xA0; The reason I like
it is that it helps you to focus on the point of the object and sort of justify its
existence, which can help weed out some bad ideas.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
What I don't like about the process is the overall CRC card idea.&amp;#xA0; While it surely
is more lightweight than many ways to approach object design, you still end up with
a bunch of paper that you then have to translate into code at some point.&amp;#xA0; I
much prefer to use a tool that will literally be creating the code as I design.&amp;#xA0;
I've found the VS class designer serves this purpose quite well.&amp;#xA0; In fact, on
the way up here, I spent some time doing up a sample class diagram using the object
thinking approach to share as an example of domain modeling.&amp;#xA0; I'll be sharing
it soon, but I just mention it to say this is not just speculation.&amp;#xA0; It was actually
very lightweight and easy to discover objects and model the domain that way, and at
the end I had literal code that I can then either fill out or hand off to other devs
to work on who can then further refine it.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Domain-Driven Design&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The second session I attended was one by Eric Evans on strategic domain-driven design.&amp;#xA0;
Eric wrote a book on the subject that's been well received by everyone I've encountered
who spent time with it.&amp;#xA0; I've seen a presentation on it, and I've read parts
of Jimmy Nillson's &lt;em&gt;Applying Domain-Driven Design and Patterns&lt;/em&gt; book.&amp;#xA0;
So I thought I was acquainted well enough with the ideas, but as I often find to be
the case, if you rely on second-hand info, you'll inevitably get a version of the
info that has been interpreted and is biased towards that person's point of view.
&lt;/p&gt;
&lt;p&gt;
For instance, most of what I've seen on DDD is focused on what Eric calls &amp;quot;tactical&amp;quot;
DDD, i.e., figuring out the objects in the domain and ensuring you stay on track with
the domain using what he calls the &amp;quot;ubiquitous language.&amp;quot;&amp;#xA0; Eric presented
parts of his ideas yesterday that he calls &amp;quot;strategic&amp;quot; because they are
more geared towards strategic level thinking in how you approach building your software.&amp;#xA0;
Two key takeaways I saw were what he calls context mapping, which seems to be a really
effective way to analyze existing software to find where the real problems lie, and
distilling the domain, which is a way to really focus in on the core part of a system
that you need to design.
&lt;/p&gt;
&lt;p&gt;
In short (very abbreviated), he claims (and I agree) that no large system will be
completely well designed, nor does it need to be.&amp;#xA0; This isn't to say you're sloppy
but it helps you to focus your energies where they need to be focused--on the core
domain.&amp;#xA0; Doing this actually can help business figure out where they should consider
buying off-the-shelf solutions and/or outsourcing as well as where to focus their
best folks.&amp;#xA0; It's a pretty concrete way to answer the buy vs. build question.
&lt;/p&gt;
&lt;p&gt;
Anyways, I'm definitely going to get his book to dig in deeper (it's already on the
way).&amp;#xA0; Please don't take my cliff's notes here as the end of your exploration
of DDD.&amp;#xA0; It definitely warrants further digging, and it is very complementary
to a good OOD approach.
&lt;/p&gt;
&lt;p&gt;
After all this, I was privileged enough to bump into Eric and have dinner, getting
to pick his brain a bit about how all his thinking on DDD came together, his perspectives
on software development, and how to encourage adoption of better design practices
(among other things).&amp;#xA0; Very interesting conversation, one that would have been
good for a podcast.&amp;#xA0; I won't share the details, but I'm sure folks will eventually
see some influence this conversation had on me.&amp;#xA0; Good stuff.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Software for Your Head&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I almost forgot about Jim McCarthy's keynote.&amp;#xA0; I've only seen Jim twice (once
in person and once recorded).&amp;#xA0; He's a very interesting and dynamic speaker, which
makes up for some of the lack of coherence.&amp;#xA0; I find the best speakers tend to
come across a bit less coherent because they let speaking become an adventure that
takes them where it will.&amp;#xA0; But I do think there was definitely value in his message.&amp;#xA0;
I tend to agree that he's right in asserting that what we all do on a daily basis
has a larger impact on humanity than we realize, and I can't argue with his experience
in building teams that work.&amp;#xA0; &lt;a title="http://www.mccarthyshow.com/" href="http://www.mccarthyshow.com/"&gt;http://www.mccarthyshow.com/&lt;/a&gt; is
definitely worth a look.
&lt;/p&gt;
&lt;p&gt;
Overall, Tuesday was a big success from an attendee perspective.&amp;#xA0; So far so good!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c5bb810a-3c8f-46f5-aab9-77365a9e868a" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,c5bb810a-3c8f-46f5-aab9-77365a9e868a.aspx</comments>
      <category>Best Practices</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=6f0bffba-6c58-4823-98e1-4ea8aad1b393</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,6f0bffba-6c58-4823-98e1-4ea8aad1b393.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,6f0bffba-6c58-4823-98e1-4ea8aad1b393.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6f0bffba-6c58-4823-98e1-4ea8aad1b393</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When searching recently so as to provide further reading for "domain model"
in a <a title="Web Services Best Practices" href="http://dotnettemplar.net/Web+Services+Best+Practices.aspx" target="_blank">recent
post</a>, I was quite surprised to find that there seemed to be no good definition
readily available (at least not by Googling "domain model").  Since
I tend to use this term a lot, I figured I'd try to fill this gap and, at the very
least, provide a reference for me to use when I talk about it. 
</p>
        <p>
          <strong>So What is a Domain Model? 
<br /></strong>Put simply, a domain model is the software model of a particular domain of
knowledge (is that a tautology?).  Usually, this means a business domain, but
it could also mean a software domain (such as the UI domain, the data access and persistence
domain, the logging domain, etc.).  More specifically, this means <em>an executable
representation of the objects in a domain with a particular focus on their behaviors
and relationships</em><sup>1</sup>.
</p>
        <p>
The point of the domain model is to accurately represent these objects and their behaviors
such that there is a one-to-one mapping from the model to the domain (or at least
as close as you can get to this).  The reason this is important is that it is
the heart of software solutions.  If you accurately model the domain, your solution
will actually solve the problems by automating the domain itself, which is the point
of pretty much all business software.  It will do this with much less effort
on your part than other approaches to software solutions because the objects are doing
the work that they should be doing--the same that they do in the physical world. 
This is part and parcel of object-oriented design<sup>2</sup>.
</p>
        <p>
          <strong>Nothing New 
<br /></strong>By the way, this is not a new concept--OO theory and practice has been around
for decades.  It's just that somewhere along the line, the essence of objects
(and object-oriented design) seems to have been lost or at least distorted, and many,
if not most, Microsoft developers have probably not been exposed to it, have forgotten
it, or have been confused into designing software in terms of data.  I limit
myself to "Microsoft developers" here because it is they of whom I have
the most experience, but I'd wager, from what I've read, the same is true of Java
and other business developers.  
</p>
        <p>
I make this claim because everyone seems to think they're doing OO, but a concrete
example of OOD using Microsoft technologies is few and far between.  Those who
try seem to be more concerned with building in framework services (e.g., change tracking,
data binding, serialization, localization, and data access &amp; persistence) than
actually modeling a domain.  Not that these framework services are not important,
but it seems to me that this approach is fundamentally flawed because the focus is
on software framework services and details instead of on the problem domain--the business
domain that the solutions are being built for.  
</p>
        <p>
          <strong>The Data Divide 
<br /></strong>I seem to write about this a lot; it's on my mind a lot<sup>3</sup>. 
Those who try to do OOD with these technologies usually end up being forced into doing
it in a way that misses the point of OOD.  There is an unnatural focus on data
and data access &amp; persistence.  Okay, maybe it is natural or it seems natural
because it is ingrained, and truly a large part of business software deals with accessing
and storing data, but even so, as I said in <a title="Purporting the Potence of Process" href="http://www.code-magazine.com/article.aspx?quickid=0703021" target="_blank">Purporting
the Potence of Process</a><sup>4</sup>, "data is only important in as much as
it supports the process that we’re trying to automate."  
</p>
        <p>
In other words, it is indeed indispensable but, all the same, it should not be the
end or focus of software development (unless you're writing, say, a database or ORM). 
It may sound like I am anti-data or being unrealistic, but I'm not--I just feel the
need to correct for what seems to be an improper focus on data.  When designing
an application, think and speak in terms of the domain (and continue to think in terms
of the domain throughout the software creation process), and when designing objects,
think and speak in terms of behaviors, not data.  
</p>
        <p>
The data is there; the data will come, but your initial object models should not involve
data as a first class citizen.  You'll have to think about the data at some point,
which will inevitably lead to specifying properties on your objects so you can take
advantage of the many framework services that depend on strongly-typed properties,
but resist the temptation to focus on properties.  Force yourself to not add
any properties except for those that create a relationship between objects; use the
VS class designer and choose to show those properties as relationships (right-click
on the properties and choose the right relationship type).  Create inheritance
not based on shared properties but on shared behaviors (this in itself is <em>huge</em>). 
If you do this, you're taking one step in the right direction, and I think in time
you will find this a better way to design software solutions.
</p>
        <p>
My intent here is certainly not to make anyone feel dumb, stupid, or like they've
wasted their lives in building software using other approaches.  My intent is
to push us towards what seems to be a better way of designing software.  Having
been there myself, I know how easy it is to fall into that way of thinking and to
imagine that simply by using these things called classes, inheritance, and properties
that we're doing OOD the right way when we're really not.  It's a tough habit
to break, but the first step is acknowledging that there is (or at least might be)
a problem; the second step is to give <a title="object thinking Googled - focus on the book by Dr. West" href="http://www.google.com/search?sourceid=navclient&amp;ie=UTF-8&amp;rlz=1T4GGIH_enUS240US240&amp;q=object+thinking" target="_blank">object
thinking</a> a chance.  It seems to me that it is (still) the best way to do
software and will continue to be in perpetuity (because the philosophical underpinnings
are solid and not subject to change).
</p>
        <p>
          <strong>
            <u>Notes</u>
          </strong>
          <br />
1. An object relationship, as I see it, is a special kind of behavior--that of <em>using
or being used</em>.  This is also sometimes represented as a having, e.g., this
object <em>has</em> one or more of these objects.  It is different from data
because a datum is just a simple attribute (property) of an object; the attribute
is not an object <em>per se</em>, at least not in the domain model because it has
no behaviors of its own apart from the object it is attached to.  It is just
information about a domain object.
</p>
        <p>
2. I go into this in some depth in the <a title="Tangerine Story" href="http://community.infragistics.com/uploadedFiles/Community/Downloads/7471/Story.pdf" target="_blank">Story
paper</a> in the Infragistics <a title="Tangerine: A WPF Exemplar" href="http://community.infragistics.com/exemplars/tangerine.aspx" target="_blank">Tangerine</a> exemplar
(see the "To OOD or Not to OOD" section).  I use the <a title="What is an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank">exemplar</a> itself
to show one way of approaching domain modeling, and the Story paper describes the
approach.
</p>
        <p>
3. Most recently, I wrote about this in the Tangerine Story (see Note 2 above). 
I also wrote publicly about it back in late 2005, early 2006 in "<a title="I Object Article" href="http://www.code-magazine.com/Article.aspx?quickid=0601021" target="_blank">I
Object</a>," published by CoDe Magazine.  My thought has developed since
writing that.  Interestingly, in almost two years, we seem to have only gotten
marginally better ways to deal with OOD in .NET.  
</p>
        <p>
4. In that article, I put a lot of focus on "process."  I still think
the emphasis is valid, but I'd temper it with the caveat that however business rules
are implemented (such as in the proposed workflow-driven validation service), you
still think of that as part of your domain model.  The reason for separating
them into a separate workflowed service is a compromise between pragmatism and idealism
given the .NET platform as the implementation platform.  I've also since learned
that the WF rules engine can be used apart from an actual .NET workflow, so depending
on your application needs, just embedding the rules engine into your domain model
may be a better way to go than using the full WF engine.  If your workflow is
simple, this may be a better way to approach doing validation.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6f0bffba-6c58-4823-98e1-4ea8aad1b393" />
      </body>
      <title>What is a Domain Model?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,6f0bffba-6c58-4823-98e1-4ea8aad1b393.aspx</guid>
      <link>http://dotNetTemplar.Net/What+Is+A+Domain+Model.aspx</link>
      <pubDate>Mon, 17 Sep 2007 15:41:54 GMT</pubDate>
      <description>&lt;p&gt;
When searching recently so as to provide further reading for &amp;quot;domain model&amp;quot;
in a &lt;a title="Web Services Best Practices" href="http://dotnettemplar.net/Web+Services+Best+Practices.aspx" target="_blank"&gt;recent
post&lt;/a&gt;, I was quite surprised to find that there seemed to be no good definition
readily available (at least not by Googling &amp;quot;domain model&amp;quot;).&amp;#xA0; Since
I tend to use this term a lot, I figured I'd try to fill this gap and, at the very
least, provide a reference for me to use when I talk about it. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;So What is a Domain Model? 
&lt;br /&gt;
&lt;/strong&gt;Put simply, a domain model is the software model of a particular domain of
knowledge (is that a tautology?).&amp;#xA0; Usually, this means a business domain, but
it could also mean a software domain (such as the UI domain, the data access and persistence
domain, the logging domain, etc.).&amp;#xA0; More specifically, this means &lt;em&gt;an executable
representation of the objects in a domain with a particular focus on their behaviors
and relationships&lt;/em&gt;&lt;sup&gt;1&lt;/sup&gt;.
&lt;/p&gt;
&lt;p&gt;
The point of the domain model is to accurately represent these objects and their behaviors
such that there is a one-to-one mapping from the model to the domain (or at least
as close as you can get to this).&amp;#xA0; The reason this is important is that it is
the heart of software solutions.&amp;#xA0; If you accurately model the domain, your solution
will actually solve the problems by automating the domain itself, which is the point
of pretty much all business software.&amp;#xA0; It will do this with much less effort
on your part than other approaches to software solutions because the objects are doing
the work that they should be doing--the same that they do in the physical world.&amp;#xA0;
This is part and parcel of object-oriented design&lt;sup&gt;2&lt;/sup&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Nothing New 
&lt;br /&gt;
&lt;/strong&gt;By the way, this is not a new concept--OO theory and practice has been around
for decades.&amp;#xA0; It's just that somewhere along the line, the essence of objects
(and object-oriented design) seems to have been lost or at least distorted, and many,
if not most, Microsoft developers have probably not been exposed to it, have forgotten
it, or have been confused into designing software in terms of data.&amp;#xA0; I limit
myself to &amp;quot;Microsoft developers&amp;quot; here because it is they of whom I have
the most experience, but I'd wager, from what I've read, the same is true of Java
and other business developers.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
I make this claim because everyone seems to think they're doing OO, but a concrete
example of OOD using Microsoft technologies is few and far between.&amp;#xA0; Those who
try seem to be more concerned with building in framework services (e.g., change tracking,
data binding, serialization, localization, and data access &amp;amp; persistence) than
actually modeling a domain.&amp;#xA0; Not that these framework services are not important,
but it seems to me that this approach is fundamentally flawed because the focus is
on software framework services and details instead of on the problem domain--the business
domain that the solutions are being built for.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Data Divide 
&lt;br /&gt;
&lt;/strong&gt;I seem to write about this a lot; it's on my mind a lot&lt;sup&gt;3&lt;/sup&gt;.&amp;#xA0;
Those who try to do OOD with these technologies usually end up being forced into doing
it in a way that misses the point of OOD.&amp;#xA0; There is an unnatural focus on data
and data access &amp;amp; persistence.&amp;#xA0; Okay, maybe it is natural or it seems natural
because it is ingrained, and truly a large part of business software deals with accessing
and storing data, but even so, as I said in &lt;a title="Purporting the Potence of Process" href="http://www.code-magazine.com/article.aspx?quickid=0703021" target="_blank"&gt;Purporting
the Potence of Process&lt;/a&gt;&lt;sup&gt;4&lt;/sup&gt;, &amp;quot;data is only important in as much as
it supports the process that we&amp;#x2019;re trying to automate.&amp;quot;&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
In other words, it is indeed indispensable but, all the same, it should not be the
end or focus of software development (unless you're writing, say, a database or ORM).&amp;#xA0;
It may sound like I am anti-data or being unrealistic, but I'm not--I just feel the
need to correct for what seems to be an improper focus on data.&amp;#xA0; When designing
an application, think and speak in terms of the domain (and continue to think in terms
of the domain throughout the software creation process), and when designing objects,
think and speak in terms of behaviors, not data.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
The data is there; the data will come, but your initial object models should not involve
data as a first class citizen.&amp;#xA0; You'll have to think about the data at some point,
which will inevitably lead to specifying properties on your objects so you can take
advantage of the many framework services that depend on strongly-typed properties,
but resist the temptation to focus on properties.&amp;#xA0; Force yourself to not add
any properties except for those that create a relationship between objects; use the
VS class designer and choose to show those properties as relationships (right-click
on the properties and choose the right relationship type).&amp;#xA0; Create inheritance
not based on shared properties but on shared behaviors (this in itself is &lt;em&gt;huge&lt;/em&gt;).&amp;#xA0;
If you do this, you're taking one step in the right direction, and I think in time
you will find this a better way to design software solutions.
&lt;/p&gt;
&lt;p&gt;
My intent here is certainly not to make anyone feel dumb, stupid, or like they've
wasted their lives in building software using other approaches.&amp;#xA0; My intent is
to push us towards what seems to be a better way of designing software.&amp;#xA0; Having
been there myself, I know how easy it is to fall into that way of thinking and to
imagine that simply by using these things called classes, inheritance, and properties
that we're doing OOD the right way when we're really not.&amp;#xA0; It's a tough habit
to break, but the first step is acknowledging that there is (or at least might be)
a problem; the second step is to give &lt;a title="object thinking Googled - focus on the book by Dr. West" href="http://www.google.com/search?sourceid=navclient&amp;amp;ie=UTF-8&amp;amp;rlz=1T4GGIH_enUS240US240&amp;amp;q=object+thinking" target="_blank"&gt;object
thinking&lt;/a&gt; a chance.&amp;#xA0; It seems to me that it is (still) the best way to do
software and will continue to be in perpetuity (because the philosophical underpinnings
are solid and not subject to change).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Notes&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
1. An object relationship, as I see it, is a special kind of behavior--that of &lt;em&gt;using
or being used&lt;/em&gt;.&amp;#xA0; This is also sometimes represented as a having, e.g., this
object &lt;em&gt;has&lt;/em&gt; one or more of these objects.&amp;#xA0; It is different from data
because a datum is just a simple attribute (property) of an object; the attribute
is not an object &lt;em&gt;per se&lt;/em&gt;, at least not in the domain model because it has
no behaviors of its own apart from the object it is attached to.&amp;#xA0; It is just
information about a domain object.
&lt;/p&gt;
&lt;p&gt;
2. I go into this in some depth in the &lt;a title="Tangerine Story" href="http://community.infragistics.com/uploadedFiles/Community/Downloads/7471/Story.pdf" target="_blank"&gt;Story
paper&lt;/a&gt; in the Infragistics &lt;a title="Tangerine: A WPF Exemplar" href="http://community.infragistics.com/exemplars/tangerine.aspx" target="_blank"&gt;Tangerine&lt;/a&gt; exemplar
(see the &amp;quot;To OOD or Not to OOD&amp;quot; section).&amp;#xA0; I use the &lt;a title="What is an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank"&gt;exemplar&lt;/a&gt; itself
to show one way of approaching domain modeling, and the Story paper describes the
approach.
&lt;/p&gt;
&lt;p&gt;
3. Most recently, I wrote about this in the Tangerine Story (see Note 2 above).&amp;#xA0;
I also wrote publicly about it back in late 2005, early 2006 in &amp;quot;&lt;a title="I Object Article" href="http://www.code-magazine.com/Article.aspx?quickid=0601021" target="_blank"&gt;I
Object&lt;/a&gt;,&amp;quot; published by CoDe Magazine.&amp;#xA0; My thought has developed since
writing that.&amp;#xA0; Interestingly, in almost two years, we seem to have only gotten
marginally better ways to deal with OOD in .NET.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
4. In that article, I put a lot of focus on &amp;quot;process.&amp;quot;&amp;#xA0; I still think
the emphasis is valid, but I'd temper it with the caveat that however business rules
are implemented (such as in the proposed workflow-driven validation service), you
still think of that as part of your domain model.&amp;#xA0; The reason for separating
them into a separate workflowed service is a compromise between pragmatism and idealism
given the .NET platform as the implementation platform.&amp;#xA0; I've also since learned
that the WF rules engine can be used apart from an actual .NET workflow, so depending
on your application needs, just embedding the rules engine into your domain model
may be a better way to go than using the full WF engine.&amp;#xA0; If your workflow is
simple, this may be a better way to approach doing validation.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6f0bffba-6c58-4823-98e1-4ea8aad1b393" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,6f0bffba-6c58-4823-98e1-4ea8aad1b393.aspx</comments>
      <category>General Computing</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=9a5e1258-41e6-4785-b6a3-7333b04aa165</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,9a5e1258-41e6-4785-b6a3-7333b04aa165.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,9a5e1258-41e6-4785-b6a3-7333b04aa165.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9a5e1258-41e6-4785-b6a3-7333b04aa165</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As I sit here on my deck, enjoying the cool autumn breeze<sup>1</sup>, I thought, <em>what
better thing to write about than Web services</em>!  Well, no, actually I am
just recalling some stuff that's happened lately.  On the MSDN Architecture forums
and in some coding and design discussions we had this week, both of which involve
the question of best practices for Web services.
</p>
        <p>
Before we talk about Web services best practices, it seems to me that we need to distinguish
between two kinds of application services.  First, there are the services that
everyone has been talking about for the last several years--those that pertain to
service-oriented architecture (SOA).  These are the services that fall into the
application integration camp, so I like to call them inter-application services.  
</p>
        <p>
Second, there are services that are in place to make a complete application, such
as logging, exception handling, data access and persistence, etc.--pretty much anything
that makes an application go and is not a behavior of a particular domain object. 
Maybe thinking of them as domain object services would work, but I fear I may already
be losing some, so let's get back to it.  The main concern within this post are
those services using within an application, so I call them intra-application services.
</p>
        <p>
It seems like these latter services, the intra-application ones, are being often confused
with the former--the inter-application services.  It's certainly understandable
because there has been so much hype around SOA in recent years that the term "service"
has been taken over and has lost its more generic meaning.  What's worse is that
there has been a lot of confusion around the interaction of the terms <em>Web service</em> and
just plain <em>service</em> (in the context of SOA).  The result is that you
have folks thinking that all Web services are SO services and sometimes that SO services
are always Web services.
</p>
        <p>
My hope here is to make some clarification as to the way I think we should be thinking
about all this.  First off, Web services are, in my book at least, simply a way
of saying HTTP-protocol-based services, usually involving XML as the message format. 
There is no, nor should there be, any implicit connection between the term Web service
and service-oriented service.  So when you think <em>Web service</em>, don't
assume anything more than that you're dealing with a software service that uses HTTP
and XML.  
</p>
        <p>
The more important distinction comes in the intent of the service--the purpose the
service is designed for.  Before you even start worrying about whether a service
is a Web service or not, you need to figure out what the purpose of the service is. 
This is where I get pragmatic (and those who know me know that I tend to be an idealist
at heart).  You simply need to determine if the service in question will be consumed
by a client that you do not control.  
</p>
        <p>
The reason this question is important is that it dramatically affects how you design
the service.  If the answer is yes, you automatically take on the burden of treating
the service as an integration (inter-application) service, and you must concern yourself
with following best practices for those kinds of services.  The core guideline
is that you cannot assume anything about the way your service will be used. 
These services are the SO-type services that are much harder to design correctly,
and there is tons of guidance available on how to do them<sup>2</sup>.  I won't
go in further depth on those here.
</p>
        <p>
I do think, though, that the other kind of services--intra-application services--have
been broadly overlooked or just lost amidst all the discussion of the other kind. 
Intra-application services do not have the external burdens that inter-application
services have.  They can and should be designed to serve the needs of your application
or, in the case of cross-cutting services (concerns) to serve the needs of the applications
within your enterprise.  The wonderful thing about this is that you do have influence
over your consumers, so you can safely make assumptions about them to enable you to
make compromises in favor of other architectural concerns like performance, ease of
use, maintainability, etc.
</p>
        <p>
Now let's bring this back to the concrete question of best practices for intra-application
Web services.  For those who are using object-oriented design, designing a strong
domain model, you may run into quite a bit of trouble when you need to distribute
your application across physical (or at least process) tiers.  Often this is
the case for smart client applications--you have a rich front end client that uses
Web services to communicate (usually for data access and persistence).  The problem
is that when you cross process boundaries, you end up needing to serialize, and with
Web services, you usually serialize to XML.  That in itself can pose some challenges,
mainly around identity of objects, but with .NET, you also have to deal with the quirks
of the serialization mechanisms.
</p>
        <p>
For example, the default XML serialization is such that you have to have properties
be public and  read-write, and you must have a default constructor.  These
can break encapsulation and make it harder to design an object model that you can
count on to act the way you expect it to.  WCF makes this better by letting you
use attributes to have better control over serialization.  The other commonly
faced challenge is on the client.  By default, if you use the VS Add Web Reference,
it takes care of the trouble of generating your service proxies, but it introduces
a separate set of proxy objects that are of different types than your domain objects.
</p>
        <p>
So you're left with the option of either using the proxy as-is and doing a conversion
routine to convert the proxy objects to your domain objects, or you can modify the
proxy to use your actual domain objects.  The first solution introduces both
a performance (creating more objects and transferring more data) and a complexity
(having conversion routines to maintain) hit; the second solution introduces just
a complexity hit (you have to modify the generated proxy a bit).  Neither solution
is perfectly elegant--we'd need the framework to change to support this scenario elegantly;
as it is now, the Web services stuff is designed more with inter-application services
in mind (hence the dumb proxies that encourage an <a title="Martin Fowler's Anemic Domain Model Antipattern" href="http://www.martinfowler.com/bliki/AnemicDomainModel.html" target="_blank">anemic
domain model</a>) than the intra-application scenario we have where we intend to use
the domain model itself on the client side.
</p>
        <p>
If you take nothing else away from this discussion, I'd suggest the key take away
is that when designing Web services, it is perfectly valid to do so within the scope
of your application (or enterprise framework).  There is a class of services
for which it is safe to make assumptions about the clients, and you shouldn't let
all of the high-falutin talk about SOA, WS-*, interoperability, etc. concern you if
your scenario does not involve integration with other systems that are out of your
control.  If you find the need for such integration at a later point, you can
design services (in a <a title="Fowler's Description of the Service Layer" href="http://martinfowler.com/eaaCatalog/serviceLayer.html" target="_blank">service
layer</a>) then to meet those needs, and you won't be shooting yourself in the foot
trying to design one-size-fits-all services now that make so many compromises so as
to make the app either impossible to use or very poorly performing.
</p>
        <p>
My own preference that I'd recommend is to use the command-line tools that will generate
proxies for you (you can even include a batch file in your project to do this) but
then modify them to work with your domain model--you don't even need your clients
to use the service proxies directly.  If you use a provider model (<a title="Fowler's Plugin Pattern" href="http://martinfowler.com/eaaCatalog/plugin.html" target="_blank">plugin
pattern</a>) for these services, you can design a set of providers that use the Web
services and a set that talk directly to your database.  This enables you to
use your domain model easily in both scenarios (both in a Web application that talks
directly to the db as well as a smart client that uses Web services).  
</p>
        <p>
It requires a little extra effort, but it means you can design and use a real domain
model and make it easier easier to use by hiding the complexity of dealing with these
framework deficiencies for consumers of the domain model.  This is especially
helpful in situations where you have different sets of developers working on different
layers of the application, but it is also ideal for use and reuse by future developers
as well.
</p>
        <p>
One of these days, I'll write some sample code to exemplify this approach, maybe as
part of a future <a title="What is an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank">exemplar</a>.
</p>
        <p>
          <strong>
            <u>Notes</u>
          </strong>
          <br />
1. The weatherthing says it's 65 degrees Fahrenheit right now--at 1pm! 
<br />
2. My observation is that it is safe to assume that when other people talk about services
and Web services, these are the kind they're thinking of, even if they don't make
the distinction I do in this post.  
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=9a5e1258-41e6-4785-b6a3-7333b04aa165" />
      </body>
      <title>Web Services Best Practices</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,9a5e1258-41e6-4785-b6a3-7333b04aa165.aspx</guid>
      <link>http://dotNetTemplar.Net/Web+Services+Best+Practices.aspx</link>
      <pubDate>Sat, 15 Sep 2007 22:00:03 GMT</pubDate>
      <description>&lt;p&gt;
As I sit here on my deck, enjoying the cool autumn breeze&lt;sup&gt;1&lt;/sup&gt;, I thought, &lt;em&gt;what
better thing to write about than Web services&lt;/em&gt;!&amp;#xA0; Well, no, actually I am
just recalling some stuff that's happened lately.&amp;#xA0; On the MSDN Architecture forums
and in some coding and design discussions we had this week, both of which involve
the question of best practices for Web services.
&lt;/p&gt;
&lt;p&gt;
Before we talk about Web services best practices, it seems to me that we need to distinguish
between two kinds of application services.&amp;#xA0; First, there are the services that
everyone has been talking about for the last several years--those that pertain to
service-oriented architecture (SOA).&amp;#xA0; These are the services that fall into the
application integration camp, so I like to call them inter-application services.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
Second, there are services that are in place to make a complete application, such
as logging, exception handling, data access and persistence, etc.--pretty much anything
that makes an application go and is not a behavior of a particular domain object.&amp;#xA0;
Maybe thinking of them as domain object services would work, but I fear I may already
be losing some, so let's get back to it.&amp;#xA0; The main concern within this post are
those services using within an application, so I call them intra-application services.
&lt;/p&gt;
&lt;p&gt;
It seems like these latter services, the intra-application ones, are being often confused
with the former--the inter-application services.&amp;#xA0; It's certainly understandable
because there has been so much hype around SOA in recent years that the term &amp;quot;service&amp;quot;
has been taken over and has lost its more generic meaning.&amp;#xA0; What's worse is that
there has been a lot of confusion around the interaction of the terms &lt;em&gt;Web service&lt;/em&gt; and
just plain &lt;em&gt;service&lt;/em&gt; (in the context of SOA).&amp;#xA0; The result is that you
have folks thinking that all Web services are SO services and sometimes that SO services
are always Web services.
&lt;/p&gt;
&lt;p&gt;
My hope here is to make some clarification as to the way I think we should be thinking
about all this.&amp;#xA0; First off, Web services are, in my book at least, simply a way
of saying HTTP-protocol-based services, usually involving XML as the message format.&amp;#xA0;
There is no, nor should there be, any implicit connection between the term Web service
and service-oriented service.&amp;#xA0; So when you think &lt;em&gt;Web service&lt;/em&gt;, don't
assume anything more than that you're dealing with a software service that uses HTTP
and XML.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
The more important distinction comes in the intent of the service--the purpose the
service is designed for.&amp;#xA0; Before you even start worrying about whether a service
is a Web service or not, you need to figure out what the purpose of the service is.&amp;#xA0;
This is where I get pragmatic (and those who know me know that I tend to be an idealist
at heart).&amp;#xA0; You simply need to determine if the service in question will be consumed
by a client that you do not control.&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
The reason this question is important is that it dramatically affects how you design
the service.&amp;#xA0; If the answer is yes, you automatically take on the burden of treating
the service as an integration (inter-application) service, and you must concern yourself
with following best practices for those kinds of services.&amp;#xA0; The core guideline
is that you cannot assume anything about the way your service will be used.&amp;#xA0;
These services are the SO-type services that are much harder to design correctly,
and there is tons of guidance available on how to do them&lt;sup&gt;2&lt;/sup&gt;.&amp;#xA0; I won't
go in further depth on those here.
&lt;/p&gt;
&lt;p&gt;
I do think, though, that the other kind of services--intra-application services--have
been broadly overlooked or just lost amidst all the discussion of the other kind.&amp;#xA0;
Intra-application services do not have the external burdens that inter-application
services have.&amp;#xA0; They can and should be designed to serve the needs of your application
or, in the case of cross-cutting services (concerns) to serve the needs of the applications
within your enterprise.&amp;#xA0; The wonderful thing about this is that you do have influence
over your consumers, so you can safely make assumptions about them to enable you to
make compromises in favor of other architectural concerns like performance, ease of
use, maintainability, etc.
&lt;/p&gt;
&lt;p&gt;
Now let's bring this back to the concrete question of best practices for intra-application
Web services.&amp;#xA0; For those who are using object-oriented design, designing a strong
domain model, you may run into quite a bit of trouble when you need to distribute
your application across physical (or at least process) tiers.&amp;#xA0; Often this is
the case for smart client applications--you have a rich front end client that uses
Web services to communicate (usually for data access and persistence).&amp;#xA0; The problem
is that when you cross process boundaries, you end up needing to serialize, and with
Web services, you usually serialize to XML.&amp;#xA0; That in itself can pose some challenges,
mainly around identity of objects, but with .NET, you also have to deal with the quirks
of the serialization mechanisms.
&lt;/p&gt;
&lt;p&gt;
For example, the default XML serialization is such that you have to have properties
be public and&amp;#xA0; read-write, and you must have a default constructor.&amp;#xA0; These
can break encapsulation and make it harder to design an object model that you can
count on to act the way you expect it to.&amp;#xA0; WCF makes this better by letting you
use attributes to have better control over serialization.&amp;#xA0; The other commonly
faced challenge is on the client.&amp;#xA0; By default, if you use the VS Add Web Reference,
it takes care of the trouble of generating your service proxies, but it introduces
a separate set of proxy objects that are of different types than your domain objects.
&lt;/p&gt;
&lt;p&gt;
So you're left with the option of either using the proxy as-is and doing a conversion
routine to convert the proxy objects to your domain objects, or you can modify the
proxy to use your actual domain objects.&amp;#xA0; The first solution introduces both
a performance (creating more objects and transferring more data) and a complexity
(having conversion routines to maintain) hit; the second solution introduces just
a complexity hit (you have to modify the generated proxy a bit).&amp;#xA0; Neither solution
is perfectly elegant--we'd need the framework to change to support this scenario elegantly;
as it is now, the Web services stuff is designed more with inter-application services
in mind (hence the dumb proxies that encourage an &lt;a title="Martin Fowler&amp;#x27;s Anemic Domain Model Antipattern" href="http://www.martinfowler.com/bliki/AnemicDomainModel.html" target="_blank"&gt;anemic
domain model&lt;/a&gt;) than the intra-application scenario we have where we intend to use
the domain model itself on the client side.
&lt;/p&gt;
&lt;p&gt;
If you take nothing else away from this discussion, I'd suggest the key take away
is that when designing Web services, it is perfectly valid to do so within the scope
of your application (or enterprise framework).&amp;#xA0; There is a class of services
for which it is safe to make assumptions about the clients, and you shouldn't let
all of the high-falutin talk about SOA, WS-*, interoperability, etc. concern you if
your scenario does not involve integration with other systems that are out of your
control.&amp;#xA0; If you find the need for such integration at a later point, you can
design services (in a &lt;a title="Fowler&amp;#x27;s Description of the Service Layer" href="http://martinfowler.com/eaaCatalog/serviceLayer.html" target="_blank"&gt;service
layer&lt;/a&gt;) then to meet those needs, and you won't be shooting yourself in the foot
trying to design one-size-fits-all services now that make so many compromises so as
to make the app either impossible to use or very poorly performing.
&lt;/p&gt;
&lt;p&gt;
My own preference that I'd recommend is to use the command-line tools that will generate
proxies for you (you can even include a batch file in your project to do this) but
then modify them to work with your domain model--you don't even need your clients
to use the service proxies directly.&amp;#xA0; If you use a provider model (&lt;a title="Fowler&amp;#x27;s Plugin Pattern" href="http://martinfowler.com/eaaCatalog/plugin.html" target="_blank"&gt;plugin
pattern&lt;/a&gt;) for these services, you can design a set of providers that use the Web
services and a set that talk directly to your database.&amp;#xA0; This enables you to
use your domain model easily in both scenarios (both in a Web application that talks
directly to the db as well as a smart client that uses Web services).&amp;#xA0; 
&lt;/p&gt;
&lt;p&gt;
It requires a little extra effort, but it means you can design and use a real domain
model and make it easier easier to use by hiding the complexity of dealing with these
framework deficiencies for consumers of the domain model.&amp;#xA0; This is especially
helpful in situations where you have different sets of developers working on different
layers of the application, but it is also ideal for use and reuse by future developers
as well.
&lt;/p&gt;
&lt;p&gt;
One of these days, I'll write some sample code to exemplify this approach, maybe as
part of a future &lt;a title="What is an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank"&gt;exemplar&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Notes&lt;/u&gt;&lt;/strong&gt; 
&lt;br /&gt;
1. The weatherthing says it's 65 degrees Fahrenheit right now--at 1pm! 
&lt;br /&gt;
2. My observation is that it is safe to assume that when other people talk about services
and Web services, these are the kind they're thinking of, even if they don't make
the distinction I do in this post.&amp;#xA0; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=9a5e1258-41e6-4785-b6a3-7333b04aa165" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,9a5e1258-41e6-4785-b6a3-7333b04aa165.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=55b8379a-0409-40c1-be7b-57a8d88b7fe0</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,55b8379a-0409-40c1-be7b-57a8d88b7fe0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,55b8379a-0409-40c1-be7b-57a8d88b7fe0.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=55b8379a-0409-40c1-be7b-57a8d88b7fe0</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wasn't going to post about it, but after reading <a href="http://donxml.com/allthingstechie/archive/2007/09/06/Three-More-New-Jersey-Locals-Added-To-The-INETA-Speakers-Bureau.aspx" target="_blank">Don's
post</a>, I realized that I should so that I can thank those involved in presenting
me with this honor.  I was surprised when I was contacted about being nominated
to be an <a title="INETA Speaker List" href="http://www.ineta.org/DesktopDefault.aspx?tabindex=2&amp;tabid=14" target="_blank">INETA
speaker</a>, and I was even more surprised when I heard that I'd been voted in. 
Looking over the folks on the list, I feel hardly qualified to be named among them.
</p>
        <p>
So without further ado, let me thank <a href="http://twitter.com/DavidWalker" target="_blank">David
Walker</a> (who's an all around great guy and VP of the Speakers Bureau), Nancy Mesquita
(who I've not had the pleasure to meet personally but has been very helpful in her
role as Administrative Director), as well as everyone else involved on the Speaker
Committee and others (whom I know not of specifically) in welcoming me into the
INETA speaker fold.  It's a great honor--thank you.  
</p>
        <p>
Now, I have to get back to work!  My group, <a title="Infragistics User Experience Group" href="http://www.infragistics.com/ux/" target="_blank">UXG</a>,
just released <a title="An Infragistics WPF Exemplar" href="http://www.infragistics.com/tangerine" target="_blank">Tangerine</a>,
the first of our <a title="What's an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank">exemplars</a>, and
now we're on to the next great thing!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=55b8379a-0409-40c1-be7b-57a8d88b7fe0" />
      </body>
      <title>Me?  An INETA Speaker?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,55b8379a-0409-40c1-be7b-57a8d88b7fe0.aspx</guid>
      <link>http://dotNetTemplar.Net/Me+An+INETA+Speaker.aspx</link>
      <pubDate>Mon, 10 Sep 2007 14:19:19 GMT</pubDate>
      <description>&lt;p&gt;
I wasn't going to post about it, but after reading &lt;a href="http://donxml.com/allthingstechie/archive/2007/09/06/Three-More-New-Jersey-Locals-Added-To-The-INETA-Speakers-Bureau.aspx" target="_blank"&gt;Don's
post&lt;/a&gt;, I realized that I should so that I can&amp;nbsp;thank those involved in presenting
me with this honor.&amp;nbsp; I was surprised when I was contacted about being nominated
to be an &lt;a title="INETA Speaker List" href="http://www.ineta.org/DesktopDefault.aspx?tabindex=2&amp;amp;tabid=14" target="_blank"&gt;INETA
speaker&lt;/a&gt;, and I was even more surprised when&amp;nbsp;I heard that I'd been voted in.&amp;nbsp;
Looking over the folks on the list, I feel hardly qualified to be named among them.
&lt;/p&gt;
&lt;p&gt;
So without further ado, let me thank &lt;a href="http://twitter.com/DavidWalker" target="_blank"&gt;David
Walker&lt;/a&gt; (who's an all around great guy and VP of the Speakers Bureau), Nancy Mesquita
(who I've not had the pleasure to meet personally but has been very helpful in her
role as Administrative Director), as well as everyone else involved on the Speaker
Committee and others (whom I know not of specifically)&amp;nbsp;in welcoming me into the
INETA speaker fold.&amp;nbsp; It's a great honor--thank you.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Now, I have to get back to work!&amp;nbsp;&amp;nbsp;My group, &lt;a title="Infragistics User Experience Group" href="http://www.infragistics.com/ux/" target="_blank"&gt;UXG&lt;/a&gt;,
just released &lt;a title="An Infragistics WPF Exemplar" href="http://www.infragistics.com/tangerine" target="_blank"&gt;Tangerine&lt;/a&gt;,
the first of our &lt;a title="What's an Exemplar?" href="http://community.infragistics.com/exemplars.aspx" target="_blank"&gt;exemplars&lt;/a&gt;,&amp;nbsp;and
now we're on to the next great thing!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=55b8379a-0409-40c1-be7b-57a8d88b7fe0" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,55b8379a-0409-40c1-be7b-57a8d88b7fe0.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Presentations</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=5f48f9ed-8721-465e-9170-df67906bfde1</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,5f48f9ed-8721-465e-9170-df67906bfde1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,5f48f9ed-8721-465e-9170-df67906bfde1.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5f48f9ed-8721-465e-9170-df67906bfde1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks to <a title="Read Andres Aguiar's Weblog" href="http://weblogs.asp.net/aaguiar" target="_blank">a
sharp co-worker of mine</a>, I was recently introduced to "<a title="Read It" href="http://worrydream.com/MagicInk/" target="_blank">Magic
Ink: Information Software and the Graphical Interface</a>," by Bret Victor. 
It was quite an interesting read; Victor makes a lot of good points.  For instance,
he suggests that we should view information software as graphic design, i.e., taking
the concerns of traditional graphic design as paramount and then taking it to the
next level by availing ourselves of context-sensitivity, which he defines as inferring
the context from the environment, history, and, as a last resort, interaction.
</p>
        <p>
          <strong>Minimizing Interaction</strong>
        </p>
        <p>
The thrust of the argument is around reducing interaction and making software smarter,
i.e., more context aware and, eventually, able to learn through abstractions over
learning algorithms.  I think we can all agree with this emphasis, but I do think
he unnecessarily latches onto the term "interaction" as a bad thing, or rather, I
think he presents "interaction design" in an overly-negative light.  
</p>
        <p>
True, the smarter we can make computers (and consequently require less interaction
from users) the better, but that doesn't negate the usefulness of interaction
design, human factors, information architecture, and usability.  There are many,
valuable things to be learned and used in all of these interaction-oriented fields,
and we shouldn't deride or dismiss them because they focus on interaction.  I
felt that Victor's negative emphasis on this and his speculating that why software
sucks in relation to this took away from the value of his overall message.
</p>
        <p>
          <strong>The Problem of Privacy</strong>
        </p>
        <p>
There is one problem that I don't think he addressed in terms of increasing environmental
context awareness, and that is security, specifically, privacy.  It is tempting
to think about how wonderful it would be for a computer to know more about our environment
than us and thus be able to anticipate our needs and desires, but in order to do this,
we, as humans, will have to sacrifice some level of privacy.  Do we really want
a totally connected computer to know precisely where we are all the time?  Do
we really want it to be "reporting" this all the time by querying location aware services? 
Do we really want a computer to remember everything that we've done--where we've been,
who we've interacted with, when we did things?
</p>
        <p>
I think the trickier issues with context awareness have to do with questions like
these.  How do we enable applications to interact with each other on our behalf,
requiring minimal interaction from us, while maintaining our privacy?  How does
an application know when it is okay to share X data about us with another application? 
Do we risk actually increasing the level of interaction (or at least just changing
what we're interacting about) in order to enable this context sensitivity?  
</p>
        <p>
If we're not careful, we could end up with a Minority Report world.  People complain
about cookies and wire taps, the world of computer context-sensitivity will increase
privacy concerns by orders of magnitudes.  This is not to negate the importance
of striving towards greater context sensitivity.  It is a good goal;
we just need to be careful how we get there.
</p>
        <p>
          <strong>Towards Graphic Design</strong>
        </p>
        <p>
One of the most effective points he made was in illustrating the difference between
search results as an index and search results as a tool for evaluation itself, i.e.,
thinking about lists of information in terms of providing sufficient information for
a comparative level of decision making.    It is a shift in how developers
can (and should) think about search results (and lists in general).
</p>
        <p>
Similarly, his example of the subway schedule and comparing it to other scheduling
applications is a critical point.  It illustrates the value of thinking in terms
of what the user wants and needs instead of in terms of what the application needs,
and it ties in the value of creating contextually meaningful visualizations. 
He references and recommends Edward Tufte, and you can see a lot of Tufte in his message
(both in the importance of good visualizations and the bemoaning of the current state
of software).  I agree that too often we developers are so focused on "reuse"
that we fail miserably in truly understanding the problems we are trying to solve,
particularly in the UI.
</p>
        <p>
That's one interesting observation I've had the chance to make in working a lot with
graphic/visual designers.  They want to design each screen in an application
as if it were a static canvas so that they can make everything look and feel just
right.  It makes sense from a design and visual perspective, but developers are
basically the opposite--they want to find the one solution that fits all of their
UI problems.  If you give a developer a nicely styled screen, he'll reuse that
same style in the entire application.  In doing so, developers accidentally stumble
on an important design and usability concept (that of consistency), but developers
do it because they are reusing the design for maximum efficiency, not because they're
consciously concerned about UI consistency!  It is a kind of impedance mismatch
between the way a designer views an application UI and the way a developer does.
</p>
        <p>
          <strong>The Timeless Way</strong>
        </p>
        <p>
I'm currently reading Christopher Alexander's <em>The Timeless Way of Building</em>,
which I hope to comment on in more depth when done.  But this discussion brings
me back to it.  In fact, it brings me back to <em>Notes on the Synthesis of Form</em> as
well, which is an earlier work by him.  One of the underlying currents in both
is designing a form (solution, if you will) that best fits the problem and environment
(context).  The timeless way (and patterns and pattern language, especially)
is all about building things that are alive, that flow and thrive and fit their context,
and the way you do that is not by slapping together one-size-fits-all solutions (i.e.,
reusing implementations) but in discovering the patterns in the problem space and
applying patterns from the solution space that fit the problem space <em>just so</em>. 
The reuse is in the patterns, at the conceptual level, but the implementation of the
pattern must always be customized to fit snugly the problem.  
</p>
        <p>
This applies in the UI as well as other areas of design, and that's the underlying
current behind both Tufte's and Victor's arguments for the intelligent use of graphic
design and visualization to convey information.  You must start by
considering each problem in its context, learn as much as you can about the problem
and context, then find patterns that fit and implement them for the problem in
the way that makes the most sense for the problem.  But more on the timeless
way later.
</p>
        <p>
          <strong>A Good Read</strong>
        </p>
        <p>
Overall, the paper is a good, thought-provoking read.  I'd recommend it to pretty
much any software artisan as a starting point for thinking about these issues. 
It's more valuable knowledge that you can put in your hat and use when designing
your next software project.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=5f48f9ed-8721-465e-9170-df67906bfde1" />
      </body>
      <title>From Interaction Design to Context Awareness</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,5f48f9ed-8721-465e-9170-df67906bfde1.aspx</guid>
      <link>http://dotNetTemplar.Net/From+Interaction+Design+To+Context+Awareness.aspx</link>
      <pubDate>Tue, 14 Aug 2007 14:41:14 GMT</pubDate>
      <description>&lt;p&gt;
Thanks to &lt;a title="Read Andres Aguiar's Weblog" href="http://weblogs.asp.net/aaguiar" target="_blank"&gt;a
sharp co-worker of mine&lt;/a&gt;, I was recently introduced to "&lt;a title="Read It" href="http://worrydream.com/MagicInk/" target="_blank"&gt;Magic
Ink: Information Software and the Graphical Interface&lt;/a&gt;," by Bret Victor.&amp;nbsp;
It was quite an interesting read; Victor makes a lot of good points.&amp;nbsp; For instance,
he suggests that we should view information software as graphic design, i.e., taking
the concerns of traditional graphic design as paramount and then taking it to the
next level by availing ourselves of context-sensitivity, which he defines as inferring
the context from the environment, history, and, as a last resort, interaction.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Minimizing Interaction&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The thrust of the argument is around reducing interaction and making software smarter,
i.e., more context aware and, eventually, able to learn through abstractions over
learning algorithms.&amp;nbsp; I think we can all agree with this emphasis, but I do think
he unnecessarily latches onto the term "interaction" as a bad thing, or rather, I
think he presents "interaction design" in an overly-negative light.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
True, the smarter we can make computers (and consequently require less interaction
from users) the better, but that doesn't negate the&amp;nbsp;usefulness of interaction
design, human factors, information architecture, and usability.&amp;nbsp; There are many,
valuable things to be learned and used in all of these interaction-oriented fields,
and we shouldn't deride or dismiss them because they focus on interaction.&amp;nbsp; I
felt that Victor's negative emphasis on this and his speculating that why software
sucks in relation to this took away from the value of his overall message.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Problem of Privacy&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
There is one problem that I don't think he addressed in terms of increasing environmental
context awareness, and that is security, specifically, privacy.&amp;nbsp; It is tempting
to think about how wonderful it would be for a computer to know more about our environment
than us and thus be able to anticipate our needs and desires, but in order to do this,
we, as humans, will have to sacrifice some level of privacy.&amp;nbsp; Do we really want
a totally connected computer to know precisely where we are all the time?&amp;nbsp; Do
we really want it to be "reporting" this all the time by querying location aware services?&amp;nbsp;
Do we really want a computer to remember everything that we've done--where we've been,
who we've interacted with, when we did things?
&lt;/p&gt;
&lt;p&gt;
I think the trickier issues with context awareness have to do with questions like
these.&amp;nbsp; How do we enable applications to interact with each other on our behalf,
requiring minimal interaction from us, while maintaining our privacy?&amp;nbsp; How does
an application know when it is okay to share X data about us with another application?&amp;nbsp;
Do we risk actually increasing the level of interaction (or at least just changing
what we're interacting about) in order to enable this context sensitivity?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
If we're not careful, we could end up with a Minority Report world.&amp;nbsp; People complain
about cookies and wire taps, the world of computer context-sensitivity will increase
privacy concerns by orders of magnitudes.&amp;nbsp; This is not to negate the importance
of striving towards greater context sensitivity.&amp;nbsp;&amp;nbsp;It is a&amp;nbsp;good goal;
we just need to be careful how we get there.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Towards Graphic Design&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
One of the most effective points he made was in illustrating the difference between
search results as an index and search results as a tool for evaluation itself, i.e.,
thinking about lists of information in terms of providing sufficient information for
a comparative level of decision making.&amp;nbsp;&amp;nbsp;&amp;nbsp; It is a shift in how developers
can (and should) think about search results (and lists in general).
&lt;/p&gt;
&lt;p&gt;
Similarly, his example of the subway schedule and comparing it to other&amp;nbsp;scheduling
applications is a critical point.&amp;nbsp; It illustrates the value of thinking in terms
of what the user wants and needs instead of in terms of what the application needs,
and it ties in the value of creating contextually meaningful visualizations.&amp;nbsp;
He references and recommends Edward Tufte, and you can see a lot of Tufte in his message
(both in the importance of good visualizations and the bemoaning of the current state
of software).&amp;nbsp; I agree that too often we developers are so focused on "reuse"
that we fail miserably in truly understanding the problems we are trying to solve,
particularly in the UI.
&lt;/p&gt;
&lt;p&gt;
That's one interesting observation I've had the chance to make in working a lot with
graphic/visual designers.&amp;nbsp; They want to design each screen in an application
as if it were a static canvas so that they can make everything look and feel just
right.&amp;nbsp; It makes sense from a design and visual perspective, but developers are
basically the opposite--they want to find the one solution that fits all of their
UI problems.&amp;nbsp; If you give a developer a nicely styled screen, he'll reuse that
same style in the entire application.&amp;nbsp; In doing so, developers accidentally stumble
on&amp;nbsp;an important design and usability concept (that of consistency), but developers
do it because they are reusing the design for maximum efficiency, not because they're
consciously concerned about UI consistency!&amp;nbsp; It is a kind of impedance mismatch
between the way a designer views an application UI and the way a developer does.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Timeless Way&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I'm currently reading Christopher Alexander's &lt;em&gt;The Timeless Way of Building&lt;/em&gt;,
which I hope to comment on in more depth when done.&amp;nbsp; But this discussion brings
me back to it.&amp;nbsp; In fact, it brings me back to &lt;em&gt;Notes on the Synthesis of Form&lt;/em&gt; as
well, which is an earlier work by him.&amp;nbsp; One of the underlying currents in both
is designing a form (solution, if you will) that best fits the problem and environment
(context).&amp;nbsp; The timeless way (and patterns and pattern language, especially)
is all about building things that are alive, that flow and thrive and fit their context,
and the way you do that is not by slapping together one-size-fits-all solutions (i.e.,
reusing implementations) but in discovering the patterns in the problem space and
applying patterns from the solution space that fit the problem space &lt;em&gt;just so&lt;/em&gt;.&amp;nbsp;
The reuse is in the patterns, at the conceptual level, but the implementation of the
pattern must always be customized to fit snugly the problem.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This applies in the UI as well as other areas of design, and that's the underlying
current behind both Tufte's and Victor's arguments for the intelligent use of graphic
design&amp;nbsp;and visualization&amp;nbsp;to convey information.&amp;nbsp; You must start by
considering each problem in its context, learn as much as you can about the problem
and context, then find patterns that fit and&amp;nbsp;implement them for the problem in
the way that makes the most sense for the problem.&amp;nbsp; But more on the timeless
way later.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A Good Read&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Overall, the paper is a good, thought-provoking read.&amp;nbsp; I'd recommend it to pretty
much any software artisan as a starting point for thinking about these issues.&amp;nbsp;
It's more valuable&amp;nbsp;knowledge that you can put in your hat and use when designing
your next software project.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=5f48f9ed-8721-465e-9170-df67906bfde1" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,5f48f9ed-8721-465e-9170-df67906bfde1.aspx</comments>
      <category>General Computing</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=12046076-9edc-40e8-8f4b-3655b6bafa52</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,12046076-9edc-40e8-8f4b-3655b6bafa52.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,12046076-9edc-40e8-8f4b-3655b6bafa52.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=12046076-9edc-40e8-8f4b-3655b6bafa52</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Are you passionate about software development?  Do you love to share your knowledge
with others?  Do you like working in a vibrant, fun culture working on the latest
and greatest technologies with other smart and passionate people?  If so, I think
I may have your dream job right here.
</p>
        <p>
We're looking for another guidisan to help craft guidance using best practices for
.NET development.  The word guidisan ('gId-&amp;-z&amp;n) comes from a blending
of "guidance" and "artisan," which really speaks to the heart of the matter. 
We're looking for software artisans who have the experience, know-how, and gumption
to explore strange new technologies, to seek out new applications and new user scenarios,
to boldly go where other developers only dream of going in order to provide deep,
technical guidance for their colleagues and peers.
</p>
        <p>
          <b>What do guidisans do? </b>
        </p>
        <ul>
          <li>
Help gather, specify, and document application vision, scope, and requirements. 
</li>
          <li>
Take application requirements and create an application design that meets the requirements
and follows best known practices for both Microsoft .NET and Infragistics products. 
</li>
          <li>
Implement applications following requirements, best practices, and design specifications. 
</li>
          <li>
Create supplemental content such as articles, white papers, screencasts, podcasts,
etc. that help elucidate example code and applications. 
</li>
          <li>
Research emerging technologies and create prototypes based on emerging technologies. 
</li>
          <li>
Contribute to joint design sessions as well as coding and design discussions. 
</li>
        </ul>
        <p>
          <b>What do I need to qualify?</b>
        </p>
        <ul>
          <li>
Bachelor’s Degree. 
</li>
          <li>
4+ years of full-time, professional experience designing and developing business applications. 
</li>
          <li>
2+ years designing and developing.NET applications (UI development in particular). 
</li>
          <li>
Be able to create vision, scope, and requirements documents based on usage scenarios. 
</li>
          <li>
Demonstrated experience with object-oriented design; familiarity with behavior-driven
design, domain-driven design, and test-driven development a plus. 
</li>
          <li>
Demonstrated knowledge of best practices for .NET application development. 
</li>
          <li>
Accept and provide constructive criticism in group situations. 
</li>
          <li>
Follow design and coding guidelines. 
</li>
          <li>
Clearly communicate technical concepts in writing and speaking. 
</li>
        </ul>
        <p>
If you think this is your dream job, <a href="http://blogs.infragistics.com/blogs/ambrose_little/contact.aspx">contact
me</a>.  Tell me why it's your dream job and why you think you'd be the next
great guidisan.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=12046076-9edc-40e8-8f4b-3655b6bafa52" />
      </body>
      <title>Are You Passionate?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,12046076-9edc-40e8-8f4b-3655b6bafa52.aspx</guid>
      <link>http://dotNetTemplar.Net/Are+You+Passionate.aspx</link>
      <pubDate>Mon, 30 Jul 2007 19:01:27 GMT</pubDate>
      <description>&lt;p&gt;
Are you passionate about software development?&amp;nbsp; Do you love to share your knowledge
with others?&amp;nbsp; Do you like working in a vibrant, fun culture working on the latest
and greatest technologies with other smart and passionate people?&amp;nbsp; If so, I think
I may have your dream job right here.
&lt;/p&gt;
&lt;p&gt;
We're looking for another guidisan to help craft guidance using best practices for
.NET development.&amp;nbsp; The word guidisan ('gId-&amp;amp;-z&amp;amp;n)&amp;nbsp;comes from a blending
of "guidance" and "artisan," which really speaks to the heart of the matter.&amp;nbsp;
We're looking for software artisans who have the experience, know-how, and&amp;nbsp;gumption
to explore strange new technologies, to seek out new applications and new user scenarios,
to boldly go where other developers only dream of going in order to provide deep,
technical guidance for their colleagues and peers.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;What do guidisans do?&amp;nbsp;&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Help gather, specify, and document application vision, scope, and requirements. 
&lt;li&gt;
Take application requirements and create an application design that meets the requirements
and follows best known practices for both Microsoft .NET and Infragistics products. 
&lt;li&gt;
Implement applications following requirements, best practices, and design specifications. 
&lt;li&gt;
Create supplemental content such as articles, white papers, screencasts, podcasts,
etc. that help elucidate example code and applications. 
&lt;li&gt;
Research emerging technologies and create prototypes based on emerging technologies. 
&lt;li&gt;
Contribute to joint design sessions as well as coding and design discussions. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;What do I need to qualify?&lt;/b&gt; 
&lt;ul&gt;
&lt;li&gt;
Bachelor’s Degree. 
&lt;li&gt;
4+ years of full-time, professional experience designing and developing business applications. 
&lt;li&gt;
2+ years designing and developing.NET applications (UI development in particular). 
&lt;li&gt;
Be able to create vision, scope, and requirements documents based on usage scenarios. 
&lt;li&gt;
Demonstrated experience with object-oriented design; familiarity with behavior-driven
design, domain-driven design, and test-driven development a plus. 
&lt;li&gt;
Demonstrated knowledge of best practices for .NET application development. 
&lt;li&gt;
Accept and provide constructive criticism in group situations. 
&lt;li&gt;
Follow design and coding guidelines. 
&lt;li&gt;
Clearly communicate technical concepts in writing and speaking. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you think this is your dream job, &lt;a href="http://blogs.infragistics.com/blogs/ambrose_little/contact.aspx"&gt;contact
me&lt;/a&gt;.&amp;nbsp; Tell me why it's your dream job and why you think you'd be the next
great guidisan.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=12046076-9edc-40e8-8f4b-3655b6bafa52" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,12046076-9edc-40e8-8f4b-3655b6bafa52.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Javascript</category>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=3e617b36-b2d9-4fd9-88ca-055556fbaffd</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,3e617b36-b2d9-4fd9-88ca-055556fbaffd.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,3e617b36-b2d9-4fd9-88ca-055556fbaffd.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3e617b36-b2d9-4fd9-88ca-055556fbaffd</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks to all who came to my "suave sessions" session yesterday at Tampa Code Camp. 
Now you're all "it getters," and you get some free code, too. 
</p>
        <p>
          <a href="http://dotnettemplar.net/downloads/SessionTimeoutManagement.zip">Download
the Session Management Code</a>
        </p>
        <p>
Enjoy!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=3e617b36-b2d9-4fd9-88ca-055556fbaffd" />
      </body>
      <title>Tampa Code Camp 2007 [Download]</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,3e617b36-b2d9-4fd9-88ca-055556fbaffd.aspx</guid>
      <link>http://dotNetTemplar.Net/Tampa+Code+Camp+2007+Download.aspx</link>
      <pubDate>Sun, 15 Jul 2007 11:50:42 GMT</pubDate>
      <description>&lt;p&gt;
Thanks to all who came to my "suave sessions" session yesterday at Tampa Code Camp.&amp;nbsp;
Now you're all "it getters," and&amp;nbsp;you get some free code, too. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://dotnettemplar.net/downloads/SessionTimeoutManagement.zip"&gt;Download
the Session Management Code&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=3e617b36-b2d9-4fd9-88ca-055556fbaffd" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,3e617b36-b2d9-4fd9-88ca-055556fbaffd.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=c679723c-593d-4723-9f8b-e1008523cde0</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,c679723c-593d-4723-9f8b-e1008523cde0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,c679723c-593d-4723-9f8b-e1008523cde0.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c679723c-593d-4723-9f8b-e1008523cde0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.amazon.com/Essential-Presentation-Foundation-Microsoft-Development/dp/0321374479">
            <img alt="Essential Windows Presentation Foundation" hspace="0" src="http://ec1.images-amazon.com/images/I/517RKCmg2lL._AA240_.jpg" align="left" border="0" />
          </a> Essential
Windows Presentation Foundation is precisely what the title says it is.  What
more can you ask for in a book?  There are already several books on the RTM of
WPF, and there are bound to be more.  The unique value this one has is that it
is written by Chris Anderson, who as most know, was an instrumental architect in designing
WPF, and this (along with his direct connection to the others who worked on it) gives
him insight that you just otherwise can't get.  
</p>
        <p>
In particular, I like that he often provides the thinking that went into particular
design decisions.  He readily admits in several places that the design of this
or that was hotly debated, and one can only imagine that they would be.  Having
worked at a few commercial software vendors myself, I know how difficult it can be
to know the best way to design a thing, and it can only be more challenging as your
audience widens.  
</p>
        <p>
After this, the main thing that makes the book valuable is that it is deeply
conceptual.  The point of the book is not to be a reference, a recipie book,
or a smattering of tutorials.  Rather, the book provides, in a coherent form,
the key principles underlying the different aspects of WPF.  And by elaborating
these principles, Chris establishes a strong sense that the Foundation was designed
in a similarly coherent manner.
</p>
        <p>
My favorite chapters were the one on Data, the one on Actions, and the Appendix. 
For a solutions architect and developer, these I think provide the most interesting
meat.  Of course, these types will likely want to delve into the first three
chapters as well.  In fact, the only one that I'd suggest you can probably get
away with skipping is the one on Visuals; I found this one pretty dry and hard to
push through.  Designers and those more interested in graphics per se will likely
enjoy these.
</p>
        <p>
The chapter on Styles took me by surprise, but then, that's because the concept of
styles in WPF is a tad surprising.  Being the language-oriented person that I
am, I am a bit bothered by the choice of Style to encompass everything that you can
do with styles in WPF.  Needless to say, it's not just UI goodness--devs will
need to be pretty familiar with this stuff.
</p>
        <p>
Other than that, my only contention is with the assertion that apps today are all
about data.  This won't come as a surprise to those who've read my articles or
talked to me about architecture much, but despite my philosophical objection, when
it comes to UI, I'll admit that LOB apps are in fact largely about the data, i.e.,
largely about displaying and manipulating data since thus far, we seem to have mainly
used computers to help with data storage and retrieval.  In any case, it is certainly
important to have good data binding mechanisms in the UI, and I have to say, WPF nails
this better than any UI tech I've bumped into thus far.
</p>
        <p>
But I digress.  The book is good; I recommend it as a starting point or to complement
other WPF learning resources.  It is the essentials with which you
can start effectively creating WPF applications.  You'll need the docs and/or
other more comprehensive books to really figure it all out, but you should read this
one regardless.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c679723c-593d-4723-9f8b-e1008523cde0" />
      </body>
      <title>Review: Essential Windows Presentation Foundation</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,c679723c-593d-4723-9f8b-e1008523cde0.aspx</guid>
      <link>http://dotNetTemplar.Net/Review+Essential+Windows+Presentation+Foundation.aspx</link>
      <pubDate>Mon, 30 Apr 2007 00:12:40 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.amazon.com/Essential-Presentation-Foundation-Microsoft-Development/dp/0321374479"&gt;&lt;img alt="Essential Windows Presentation Foundation" hspace=0 src="http://ec1.images-amazon.com/images/I/517RKCmg2lL._AA240_.jpg" align=left border=0&gt;&lt;/a&gt;&amp;nbsp;Essential
Windows Presentation Foundation is precisely what the title says it is.&amp;nbsp; What
more can you ask for in a book?&amp;nbsp; There are already several books on the RTM of
WPF, and there are bound to be more.&amp;nbsp; The unique value this one has is that it
is written by Chris Anderson, who as most know, was an instrumental architect in designing
WPF, and this (along with his direct connection to the others who worked on it) gives
him insight that you just otherwise can't get.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In particular, I like that he often provides the thinking that went into particular
design decisions.&amp;nbsp; He readily admits in several places that the design of this
or that was hotly debated, and one can only imagine that they would be.&amp;nbsp; Having
worked at a few commercial software vendors myself, I know how difficult it can be
to know the best way to design a thing, and it can only be more challenging as your
audience widens.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
After&amp;nbsp;this, the main thing that makes the book valuable is that it is deeply
conceptual.&amp;nbsp; The point of the book is not to be a reference, a recipie book,
or a smattering of tutorials.&amp;nbsp; Rather, the book provides, in a coherent form,
the key principles underlying the different aspects of WPF.&amp;nbsp; And by elaborating
these principles, Chris establishes a strong sense that the Foundation was designed
in a similarly coherent manner.
&lt;/p&gt;
&lt;p&gt;
My favorite chapters were the one on Data, the one on Actions, and the Appendix.&amp;nbsp;
For a solutions architect and developer, these I think provide the most interesting
meat.&amp;nbsp; Of course, these types will likely want to delve into the first three
chapters as well.&amp;nbsp; In fact, the only one that I'd suggest you can probably get
away with skipping is the one on Visuals; I found this one pretty dry and hard to
push through.&amp;nbsp; Designers and those more interested in graphics per se will likely
enjoy these.
&lt;/p&gt;
&lt;p&gt;
The chapter on Styles took me by surprise, but then, that's because the concept of
styles in WPF is a tad surprising.&amp;nbsp; Being the language-oriented person that I
am, I am a bit bothered by the choice of Style to encompass everything that you can
do with styles in WPF.&amp;nbsp; Needless to say, it's not just UI goodness--devs will
need to be pretty familiar with this stuff.
&lt;/p&gt;
&lt;p&gt;
Other than that, my only contention is with the assertion that apps today are all
about data.&amp;nbsp; This won't come as a surprise to those who've read my articles or
talked to me about architecture much, but despite my philosophical objection, when
it comes to UI, I'll admit that LOB apps are in fact largely about the data, i.e.,
largely about displaying and manipulating data since thus far, we seem to have mainly
used computers to help with data storage and retrieval.&amp;nbsp; In any case, it is certainly
important to have good data binding mechanisms in the UI, and I have to say, WPF nails
this better than any UI tech I've bumped into thus far.
&lt;/p&gt;
&lt;p&gt;
But I digress.&amp;nbsp; The book is good; I recommend it as a starting point or to complement
other WPF learning resources.&amp;nbsp; It is the essentials&amp;nbsp;with which&amp;nbsp;you
can start effectively creating WPF applications.&amp;nbsp; You'll need the docs and/or
other more comprehensive books to really figure it all out, but you should read this
one regardless.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=c679723c-593d-4723-9f8b-e1008523cde0" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,c679723c-593d-4723-9f8b-e1008523cde0.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=796e3791-5748-4388-b4c7-d0c99b7cd74f</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,796e3791-5748-4388-b4c7-d0c99b7cd74f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,796e3791-5748-4388-b4c7-d0c99b7cd74f.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=796e3791-5748-4388-b4c7-d0c99b7cd74f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div>Just a one question survey.  
</div>
        <div> 
</div>
        <div>If you are evaluating a software product, what do you prefer to do:
</div>
        <div>A) Download everything, including help, samples, SDK, etc. at once, even if it
may be half a gig.
</div>
        <div>B) Just download the product bits first and then either download the help, samples,
SDK, etc. separately as you need them (or never download those and just use online
help/samples).
</div>
        <div>C) Download a shell installer that lets you pick what you want and only downloads/installs
what you pick?
</div>
        <div>D) Try out the bits in an online VM environment.
</div>
        <div>E) Other, please specify.
</div>
        <div> 
</div>
        <div>You can either just pick one or put them in order of preference.
</div>
        <div> 
</div>
        <div>Thanks in advance for any opinions!
</div>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=796e3791-5748-4388-b4c7-d0c99b7cd74f" />
      </body>
      <title>How Would You Like Your Bits?</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,796e3791-5748-4388-b4c7-d0c99b7cd74f.aspx</guid>
      <link>http://dotNetTemplar.Net/How+Would+You+Like+Your+Bits.aspx</link>
      <pubDate>Fri, 27 Apr 2007 18:31:06 GMT</pubDate>
      <description>&lt;div&gt;Just a&amp;nbsp;one question&amp;nbsp;survey.&amp;nbsp; 
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;If you are evaluating a software product, what do you prefer to do:
&lt;/div&gt;
&lt;div&gt;A) Download everything, including help, samples, SDK, etc. at once, even if it
may be half a gig.
&lt;/div&gt;
&lt;div&gt;B) Just download the product bits first and then either download the help, samples,
SDK, etc. separately as you need them (or never download those and just use online
help/samples).
&lt;/div&gt;
&lt;div&gt;C) Download a shell installer that lets you pick what you want and only downloads/installs
what you pick?
&lt;/div&gt;
&lt;div&gt;D) Try out the bits in an online VM environment.
&lt;/div&gt;
&lt;div&gt;E) Other, please specify.
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;You can either just pick one or put them in order of preference.
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;Thanks in advance for any opinions!
&lt;/div&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=796e3791-5748-4388-b4c7-d0c99b7cd74f" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,796e3791-5748-4388-b4c7-d0c99b7cd74f.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=6f3350a3-f492-4e28-befd-68d6960b0b09</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,6f3350a3-f492-4e28-befd-68d6960b0b09.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,6f3350a3-f492-4e28-befd-68d6960b0b09.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6f3350a3-f492-4e28-befd-68d6960b0b09</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.patternlanguage.com/leveltwo/ca.htm">Christopher Alexander</a> is
a noted traditional (i.e., not software) architect who's been writing about design
since well before I was born.  Some of his books, most notably <a href="http://www.amazon.com/Pattern-Language-Buildings-Construction-Environmental/dp/0195019199/ref=pd_bbs_sr_1/102-0532102-9051352?ie=UTF8&amp;s=books&amp;qid=1176342000&amp;sr=8-1">A
Pattern Language</a>, are the basis of the patterns movement (for lack of a better
word) in the software industry.  Anyone who writes on software patterns
includes his works in their bibliographies, so I figured there must be something to
it.
</p>
        <p>
Not being one to trust others' reductions and paraphrasing any more than I have to,
I've been wanting to dig into his work myself for some time.  I finally got around
to it in early March.  I've started with <a href="http://www.amazon.com/Notes-Synthesis-Form-Harvard-Paperbacks/dp/0674627512/ref=pd_bbs_sr_1/102-0532102-9051352?ie=UTF8&amp;s=books&amp;qid=1176342048&amp;sr=1-1">Notes
on the Synthesis of Form</a>, which seems to be the first book in the series on patterns.
</p>
        <p>
Apart from loving the plain black cover and white block lettering and of course the
obscure sounding title, I also enjoyed the innards.  It really is interesting
how similar the problems and processes of three-dimensional design and architecture
are with those of software design and architecture.
</p>
        <p>
I dare not reduce this work or ask you to depend upon my fuzzy recollections for
a precise summary, but what follows is what I recall of the book, those things which
made enough of an impression to stick with me at least these few weeks since my reading.
</p>
        <p>
First, I recall the observation that we often only really know the proper form (solution)
by recognizing things that are out of place (misfits).  What's interesting about
this is how utterly incompatible this is with the idea of waterfall design, i.e.,
trying to imagine and gather all the requirements of a solution up front.  We
simply lack the imagination to create solutions that fit perfectly using the
waterfall approach, and the more complex the problem, the more likely this approach
is  to fail.
</p>
        <p>
This is in part why agile, iterative development and prototyping works better. 
It enables us to create a form (a solution) and see how well it fits against the actual
problem.  We can easily recognize the misfits then by comparing the prototype
or iteration to the problem and make small adjustments to eliminate the
misfits, ultimately synthesizing a much better-fitting form than we could
ever imagine up front.
</p>
        <p>
Second, I found the approach to the composition of the individual problems into the
most autonomous groups (problem sets) possible to be insightful.  But the
key observation here is that this composition should be based in the realities of
the problems, not in the preconceived groupings that our profession has set out for
us.  
</p>
        <p>
For instance, rather than starting with the buckets of security, logging, exception
handling, etc., you identify the actual individual problems that are in the problem
domain, group them by their relative interconnectedness, and then attempt to design
solutions for those groupings.  The value in this observation lies in keeping
us focused on the specifics of the problem at hand rather than attempting to use a
sort of one-size-fits-all approach to solving design problems.  
</p>
        <p>
Further, if we take this approach, we will have more success in creating a form that
fits because the groupings are along natural boundaries (i.e., areas of minimal
connectedness) in the problem domain.  Thus when we create a solution for
a set of problems, the chance that the solution will cause misfits in other sets is
diminished.
</p>
        <p>
Finally, as we identify these natural sets in the problem domains, we see recurring,
like solutions (patterns) emerge that can be generalized to create
a sort of rough blueprint for solving those sets of problems.  The patterns
are not rote algorithms with no variation or creativity but rather are like an
outline from which the author can craft the message using his or her particular genius.  
</p>
        <p>
This avoids the pitfall of the one-size-fits-all solution, provides for competition
and creativity, and ultimately has the best chance of enabling designers to create
a system of forms that integrate harmoniously and address the actual problems at hand.
</p>
        <p>
And the idea is that these sets are also hierarchical in nature such that one can
create sets of sets of problems (and corresponding patterns) to create higher and
higher level coherent views of extremely complex problem domains.  This, of course,
fits nicely with the way we deal with problems in the software world as well (or in
managing people, for that matter), dealing with problem sets and patterns all
the way from enterprise application integration down to patterns governing individual
instructions to a CPU (or from the C-level management team down to the team supervisors). 
What can we say, hierarchies are convenient ways for us to handle complex problems
in coherent ways.
</p>
        <p>
So what does it all mean?  Well, I think it in large part validates recent developments
in the industry.  From agile development (including test-driven design) to
domain-driven design to, of course, the patterns movement itself.  We're seeing
the gradual popular realization of the principles discussed in this book.  
</p>
        <p>
It means that if we continue to explore other, more mature professions, we might just
save ourselves a lot of trouble and money by learning from their mistakes and their
contributions to human knowledge.  It's like avoiding a higher-level Not Invented
Here Syndrome, which has long-plagued our industry.  We're a bunch of smart people,
but that doesn't mean we have to solve every problem, again!  Why not focus on
the problems that have yet to be solved?  It makes no more sense for a developer
to create his own custom grid control than it does for our industry to try to rediscover
the nature of designing solutions to complex problems.
</p>
        <p>
It also means that we have a lot of work to do yet in terms of discovering, cataloguing,
and actually using patterns at all levels of software design, not for the sake of
using patterns but, again, for the sake of focusing on problems that have yet to be
solved.  I look forward to continuing reading The Timeless Way of Building and
to the continued improvements of our profession.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6f3350a3-f492-4e28-befd-68d6960b0b09" />
      </body>
      <title>Notes on the Notes of the Synthesis of Form</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,6f3350a3-f492-4e28-befd-68d6960b0b09.aspx</guid>
      <link>http://dotNetTemplar.Net/Notes+On+The+Notes+Of+The+Synthesis+Of+Form.aspx</link>
      <pubDate>Thu, 12 Apr 2007 03:27:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.patternlanguage.com/leveltwo/ca.htm"&gt;Christopher Alexander&lt;/a&gt; is
a noted traditional (i.e., not software)&amp;nbsp;architect who's been writing about design
since well before I was born.&amp;nbsp; Some of his books, most notably &lt;a href="http://www.amazon.com/Pattern-Language-Buildings-Construction-Environmental/dp/0195019199/ref=pd_bbs_sr_1/102-0532102-9051352?ie=UTF8&amp;amp;s=books&amp;amp;qid=1176342000&amp;amp;sr=8-1"&gt;A
Pattern Language&lt;/a&gt;, are the basis of the patterns movement (for lack of a better
word) in the software industry.&amp;nbsp; Anyone who writes on software&amp;nbsp;patterns
includes his works in their bibliographies, so I figured there must be something to
it.
&lt;/p&gt;
&lt;p&gt;
Not being one to trust others' reductions and paraphrasing any more than I have to,
I've been wanting to dig into his work myself for some time.&amp;nbsp; I finally got around
to it in early March.&amp;nbsp; I've started with &lt;a href="http://www.amazon.com/Notes-Synthesis-Form-Harvard-Paperbacks/dp/0674627512/ref=pd_bbs_sr_1/102-0532102-9051352?ie=UTF8&amp;amp;s=books&amp;amp;qid=1176342048&amp;amp;sr=1-1"&gt;Notes
on the Synthesis of Form&lt;/a&gt;, which seems to be the first book in the series on patterns.
&lt;/p&gt;
&lt;p&gt;
Apart from loving the plain black cover and white block lettering and of course the
obscure sounding title, I also enjoyed the innards.&amp;nbsp; It really is interesting
how similar the problems and processes of three-dimensional design and architecture
are with those of software design and architecture.
&lt;/p&gt;
&lt;p&gt;
I dare not reduce this work or ask you to depend upon my fuzzy recollections&amp;nbsp;for
a precise summary, but what follows is what I recall of the book, those things which
made enough of an impression to stick with me at least these few weeks since my reading.
&lt;/p&gt;
&lt;p&gt;
First, I recall the observation that we often only really know the proper form (solution)
by recognizing things that are out of place (misfits).&amp;nbsp; What's interesting about
this is how utterly incompatible this is with the idea of waterfall design, i.e.,
trying to imagine and gather all the requirements of a solution up front.&amp;nbsp; We
simply lack the imagination to create solutions that fit perfectly using&amp;nbsp;the
waterfall&amp;nbsp;approach, and the more complex the problem, the more likely this approach
is&amp;nbsp; to fail.
&lt;/p&gt;
&lt;p&gt;
This is in part why agile, iterative development and prototyping works better.&amp;nbsp;
It enables us to create a form (a solution) and see how well it fits against the actual
problem.&amp;nbsp; We can easily recognize the misfits then by comparing the prototype
or iteration to the problem&amp;nbsp;and&amp;nbsp;make small adjustments to eliminate the
misfits, ultimately&amp;nbsp;synthesizing&amp;nbsp;a much better-fitting form than we could
ever imagine up front.
&lt;/p&gt;
&lt;p&gt;
Second, I found the approach to the composition of the individual problems into the
most autonomous groups (problem sets)&amp;nbsp;possible to be insightful.&amp;nbsp; But the
key observation here is that this composition should be based in the realities of
the problems, not in the preconceived groupings that our profession has set out for
us.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
For instance, rather than starting with the buckets of security, logging, exception
handling, etc., you identify the actual individual problems that are in the problem
domain, group them by their relative interconnectedness, and then attempt to design
solutions for those groupings.&amp;nbsp; The value in this observation lies in keeping
us focused on the specifics of the problem at hand rather than attempting to use a
sort of one-size-fits-all approach to solving design problems.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Further, if we take this approach, we will have more success in creating a form that
fits because the groupings are along natural boundaries (i.e.,&amp;nbsp;areas of minimal
connectedness)&amp;nbsp;in the problem domain.&amp;nbsp; Thus when we create a solution for
a set of problems, the chance that the solution will cause misfits in other sets is
diminished.
&lt;/p&gt;
&lt;p&gt;
Finally, as we identify these natural sets in the problem domains, we see recurring,
like solutions (patterns) emerge that&amp;nbsp;can&amp;nbsp;be generalized to&amp;nbsp;create
a&amp;nbsp;sort of rough blueprint for solving those sets of problems.&amp;nbsp; The patterns
are not rote&amp;nbsp;algorithms with no variation or creativity but rather are like an
outline from which the author can craft the message using his or her particular genius.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This avoids the pitfall of the one-size-fits-all solution, provides for competition
and creativity, and ultimately has the best chance of enabling designers to create
a system of forms that integrate harmoniously and address the actual problems at hand.
&lt;/p&gt;
&lt;p&gt;
And the idea is that these sets are also hierarchical in nature such that one can
create sets of sets of problems (and corresponding patterns) to create higher and
higher level coherent views of extremely complex problem domains.&amp;nbsp; This, of course,
fits nicely with the way we deal with problems in the software world as well (or in
managing people, for that matter),&amp;nbsp;dealing with problem sets and patterns all
the way from enterprise application integration down to patterns governing individual
instructions to a CPU (or from the C-level&amp;nbsp;management team down to the team supervisors).&amp;nbsp;
What can we say, hierarchies are convenient ways for us to handle complex problems
in coherent ways.
&lt;/p&gt;
&lt;p&gt;
So what does it all mean?&amp;nbsp; Well, I think it in large part validates recent developments
in the industry.&amp;nbsp; From agile development (including&amp;nbsp;test-driven design)&amp;nbsp;to
domain-driven design to, of course, the patterns movement itself.&amp;nbsp; We're seeing
the gradual popular realization of the principles discussed in this book.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
It means that if we continue to explore other, more mature professions, we might just
save ourselves a lot of trouble and money by learning from their mistakes and their
contributions to human knowledge.&amp;nbsp; It's like avoiding a higher-level Not Invented
Here Syndrome, which has long-plagued our industry.&amp;nbsp; We're a bunch of smart people,
but that doesn't mean we have to solve every problem, again!&amp;nbsp; Why not focus on
the problems that have yet to be solved?&amp;nbsp; It makes no more sense for a developer
to create his own custom grid control than it does for our industry to try to rediscover
the nature of designing solutions to complex problems.
&lt;/p&gt;
&lt;p&gt;
It also means that we have a lot of work to do yet in terms of discovering, cataloguing,
and actually using patterns at all levels of software design, not for the sake of
using patterns but, again, for the sake of focusing on problems that have yet to be
solved.&amp;nbsp; I look forward to continuing reading The Timeless Way of Building and
to the continued improvements of our profession.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=6f3350a3-f492-4e28-befd-68d6960b0b09" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,6f3350a3-f492-4e28-befd-68d6960b0b09.aspx</comments>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=e2656c5a-5018-412d-a244-0594d332fd56</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,e2656c5a-5018-412d-a244-0594d332fd56.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,e2656c5a-5018-412d-a244-0594d332fd56.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e2656c5a-5018-412d-a244-0594d332fd56</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Don't forget!  This Saturday is <a href="http://nyc.codecamp.us/">NYC Code Camp
III</a>!  Unfortunately, I won't be able to make it as I'm helping to prepare
for our upcoming 2007 Volume 1 launch next week.  We've got some great
stuff in the works from the User Experience Group, so keep an eye out for it. :) 
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=e2656c5a-5018-412d-a244-0594d332fd56" />
      </body>
      <title>Reminder - NYC Code Camp!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,e2656c5a-5018-412d-a244-0594d332fd56.aspx</guid>
      <link>http://dotNetTemplar.Net/Reminder+NYC+Code+Camp.aspx</link>
      <pubDate>Thu, 01 Mar 2007 16:39:10 GMT</pubDate>
      <description>&lt;p&gt;
Don't forget!&amp;nbsp; This Saturday is &lt;a href="http://nyc.codecamp.us/"&gt;NYC Code Camp
III&lt;/a&gt;!&amp;nbsp; Unfortunately, I won't be able to make it as I'm helping to prepare
for our upcoming&amp;nbsp;2007 Volume 1&amp;nbsp;launch next week.&amp;nbsp; We've got some great
stuff in the works from the User Experience Group, so keep an eye out for it. :) 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=e2656c5a-5018-412d-a244-0594d332fd56" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,e2656c5a-5018-412d-a244-0594d332fd56.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=0a980b67-bc8f-45f9-9892-9dd7611fb8a9</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,0a980b67-bc8f-45f9-9892-9dd7611fb8a9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,0a980b67-bc8f-45f9-9892-9dd7611fb8a9.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0a980b67-bc8f-45f9-9892-9dd7611fb8a9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally got a chance to start looking at the blog posts that have been piling up
in my Newsgator for a few months now, and I was pleasantly surprised by probably the <a href="http://www.lhotka.net/weblog/SemanticCouplingTheElephantInTheSOARoom.aspx">best
thoughts on SOA I've seen in a long time</a>.  I'm really glad that <a href="http://www.lhotka.net/">Rocky's</a> fighting
the good fight on this one, and he's been consistent, too.  Another, more thorough
commentary on the subject is provided by a good friend of mine, <a href="http://www.soapitstop.com/">Tom
Fuller</a>, in his article last year on <a href="http://aspalliance.com/707">The Good,
the Bad, and the Ugly of Service-Oriented Architecture</a>.
</p>
        <p>
The bottom line, IMO, is that working towards SOA is a good thing, but we have to
be very cautious and extremely deliberate in how we get there.  I think most
good architects know this, but we have to get the message out there and overcome the
hype to minimize the trough of despair.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=0a980b67-bc8f-45f9-9892-9dd7611fb8a9" />
      </body>
      <title>Best Thoughts on SOA</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,0a980b67-bc8f-45f9-9892-9dd7611fb8a9.aspx</guid>
      <link>http://dotNetTemplar.Net/Best+Thoughts+On+SOA.aspx</link>
      <pubDate>Tue, 14 Nov 2006 23:47:42 GMT</pubDate>
      <description>&lt;p&gt;
I finally got a chance to start looking at the blog posts that have been piling up
in my Newsgator for a few months now, and I was pleasantly surprised by probably the &lt;a href="http://www.lhotka.net/weblog/SemanticCouplingTheElephantInTheSOARoom.aspx"&gt;best
thoughts on SOA I've seen in a long time&lt;/a&gt;.&amp;nbsp; I'm really glad that &lt;a href="http://www.lhotka.net/"&gt;Rocky's&lt;/a&gt; fighting
the good fight on this one, and he's been consistent, too.&amp;nbsp; Another, more thorough
commentary on the subject is provided by a good friend of mine, &lt;a href="http://www.soapitstop.com/"&gt;Tom
Fuller&lt;/a&gt;, in his article last year on &lt;a href="http://aspalliance.com/707"&gt;The Good,
the Bad, and the Ugly of Service-Oriented Architecture&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The bottom line, IMO, is that working towards SOA is a good thing, but we have to
be very cautious and extremely deliberate in how we get there.&amp;nbsp; I think most
good architects know this, but we have to get the message out there and overcome the
hype to minimize the trough of despair.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=0a980b67-bc8f-45f9-9892-9dd7611fb8a9" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,0a980b67-bc8f-45f9-9892-9dd7611fb8a9.aspx</comments>
      <category>Software Architecture</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=f6b8acca-d7b2-4b17-9f08-6e03fef6905f</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,f6b8acca-d7b2-4b17-9f08-6e03fef6905f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,f6b8acca-d7b2-4b17-9f08-6e03fef6905f.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f6b8acca-d7b2-4b17-9f08-6e03fef6905f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <style>
        </style>
        <div class="Section1">
          <p class="MsoNormal">
          </p>
          <p class="MsoNormal">
Last week, the <a href="http://weblogs.asp.net/rhoward/">head geek</a> at <a href="http://telligent.com/">Telligent</a> told
me about this new service they’re offering called <a href="http://www.blogmailr.com/">blogmailr</a>. 
It’s a pretty cool concept; it allows folks to post to their blogs using email. 
So I thought I’d try it out.  If this works or not, it went through blogmailr. 
It’s worth a look.
</p>
        </div>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=f6b8acca-d7b2-4b17-9f08-6e03fef6905f" />
      </body>
      <title>blogmailr Beta</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,f6b8acca-d7b2-4b17-9f08-6e03fef6905f.aspx</guid>
      <link>http://dotNetTemplar.Net/blogmailr+Beta.aspx</link>
      <pubDate>Mon, 13 Nov 2006 16:28:40 GMT</pubDate>
      <description>     &lt;style&gt;  &lt;/style&gt;
&lt;div class=Section1&gt;
&lt;p class=MsoNormal&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
Last week, the &lt;a href="http://weblogs.asp.net/rhoward/"&gt;head geek&lt;/a&gt; at &lt;a href="http://telligent.com/"&gt;Telligent&lt;/a&gt; told
me about this new service they&amp;#8217;re offering called &lt;a href="http://www.blogmailr.com/"&gt;blogmailr&lt;/a&gt;.&amp;nbsp;
It&amp;#8217;s a pretty cool concept; it allows folks to post to their blogs using email.&amp;nbsp;
So I thought I&amp;#8217;d try it out.&amp;nbsp; If this works or not, it went through blogmailr.&amp;nbsp;
It&amp;#8217;s worth a look.
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=f6b8acca-d7b2-4b17-9f08-6e03fef6905f" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,f6b8acca-d7b2-4b17-9f08-6e03fef6905f.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=830a2c1d-c309-43b9-90bc-06a428654509</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,830a2c1d-c309-43b9-90bc-06a428654509.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,830a2c1d-c309-43b9-90bc-06a428654509.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=830a2c1d-c309-43b9-90bc-06a428654509</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was just reminded by our local Dev Evangelist, <a title="Peter's Blog" href="http://blogs.msdn.com/peterlau" target="_blank">Peter
Laudati</a>, that we've got our <a title="For More Info" href="http://blogs.msdn.com/peterlau/archive/2006/11/10/nj-code-camp-iii-registration-now-open.aspx" target="_blank">third
NJ CodeCamp</a> coming up this weekend.  Code camps are a fun way to get to know
other local devs, learn some cool stuff, and generally get at least a free lunch! 
So you should <a title="Go Register!" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032314832&amp;Culture=en-US" target="_blank">go</a>!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=830a2c1d-c309-43b9-90bc-06a428654509" />
      </body>
      <title>New Jersey CodeCamp III - This Weekend!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,830a2c1d-c309-43b9-90bc-06a428654509.aspx</guid>
      <link>http://dotNetTemplar.Net/New+Jersey+CodeCamp+III+This+Weekend.aspx</link>
      <pubDate>Mon, 13 Nov 2006 14:55:40 GMT</pubDate>
      <description>&lt;p&gt;
I was just reminded by our local Dev Evangelist, &lt;a title="Peter's Blog" href="http://blogs.msdn.com/peterlau" target="_blank"&gt;Peter
Laudati&lt;/a&gt;, that we've got our &lt;a title="For More Info" href="http://blogs.msdn.com/peterlau/archive/2006/11/10/nj-code-camp-iii-registration-now-open.aspx" target="_blank"&gt;third
NJ CodeCamp&lt;/a&gt; coming up this weekend.&amp;nbsp; Code camps are a fun way to get to know
other local devs, learn some cool stuff, and generally get at least a free lunch!&amp;nbsp;
So you should &lt;a title="Go Register!" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032314832&amp;amp;Culture=en-US" target="_blank"&gt;go&lt;/a&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=830a2c1d-c309-43b9-90bc-06a428654509" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,830a2c1d-c309-43b9-90bc-06a428654509.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=292ac470-47ca-4d9c-ab9c-e342bedc299d</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,292ac470-47ca-4d9c-ab9c-e342bedc299d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,292ac470-47ca-4d9c-ab9c-e342bedc299d.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=292ac470-47ca-4d9c-ab9c-e342bedc299d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
So Infragistics had a pretty cool release today, if I do say so myself.  We've
released a <a href="http://www.infragistics.com/hot/aspnet-ajax-support.aspx">beta
patch</a> for our <a href="http://www.infragistics.com/dotnet/netadvantage/aspnet.aspx">NetAdvantage
for ASP.NET</a> product that supports Microsoft's <a href="http://ajax.asp.net/">ASP.NET
AJAX</a> Beta 1 and Beta 2.  
</p>
        <p>
          <strong>Support Details</strong>
        </p>
        <ul>
          <li>
            <div>Our controls will register themselves with the UpdatePanel to ensure proper operation
within it.
</div>
          </li>
          <li>
            <div>Our Javascript Client-Side Object Model (CSOM) continues to work alongside the
Microsoft AJAX Library.
</div>
          </li>
          <li>
            <div>Infragistics controls will not interfere with the Microsoft AJAX Library.
</div>
          </li>
          <li>
            <div>Infragistics controls can be embedded in and work with ASP.NET AJAX Control
Toolkit controls.
</div>
          </li>
        </ul>
        <p>
I'm pretty pumped about ASP.NET AJAX, especially the Microsoft AJAX Library. 
It should make client-side development across browsers much easier, and with the AJAX
Extensions, it helps make adding AJAX to your apps in ASP.NET considerably easier,
and the UpdatePanel is an indisputable help in that respect.
</p>
        <p>
Infragistics is committed to the ASP.NET AJAX platform.  We'll be supporting
it throughout the beta, the release, and beyond.  We've been adding <a href="http://www.infragistics.com/hot/ajax.aspx">AJAX-powered
features since 2004</a>, and it is only going to get better for us and everyone
else thanks to the new platform and tool enhancements that are coming down the line.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=292ac470-47ca-4d9c-ab9c-e342bedc299d" />
      </body>
      <title>Got ASP.NET AJAX?  Get ASP.NET AJAX for NetAdvantage!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,292ac470-47ca-4d9c-ab9c-e342bedc299d.aspx</guid>
      <link>http://dotNetTemplar.Net/Got+ASPNET+AJAX+Get+ASPNET+AJAX+For+NetAdvantage.aspx</link>
      <pubDate>Sat, 11 Nov 2006 00:39:04 GMT</pubDate>
      <description>&lt;p&gt;
So Infragistics had a pretty cool release today, if I do say so myself.&amp;nbsp; We've
released a &lt;a href="http://www.infragistics.com/hot/aspnet-ajax-support.aspx"&gt;beta
patch&lt;/a&gt; for our &lt;a href="http://www.infragistics.com/dotnet/netadvantage/aspnet.aspx"&gt;NetAdvantage
for ASP.NET&lt;/a&gt; product that&amp;nbsp;supports Microsoft's &lt;a href="http://ajax.asp.net/"&gt;ASP.NET
AJAX&lt;/a&gt; Beta 1 and Beta 2.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Support Details&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Our controls will register themselves with the UpdatePanel to ensure proper operation
within it.
&lt;/div&gt;
&lt;li&gt;
&lt;div&gt;Our Javascript Client-Side Object Model (CSOM) continues to work alongside the
Microsoft AJAX Library.
&lt;/div&gt;
&lt;li&gt;
&lt;div&gt;Infragistics controls&amp;nbsp;will not interfere with the Microsoft AJAX Library.
&lt;/div&gt;
&lt;li&gt;
&lt;div&gt;Infragistics controls can be embedded in and work with&amp;nbsp;ASP.NET AJAX Control
Toolkit&amp;nbsp;controls.
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I'm pretty pumped about ASP.NET AJAX, especially the Microsoft AJAX Library.&amp;nbsp;
It should make client-side development across browsers much easier, and with the AJAX
Extensions, it helps make adding AJAX to your apps in ASP.NET considerably easier,
and the UpdatePanel is an indisputable help in that respect.
&lt;/p&gt;
&lt;p&gt;
Infragistics is committed to the ASP.NET AJAX platform.&amp;nbsp; We'll be supporting
it throughout the beta, the release, and beyond.&amp;nbsp; We've&amp;nbsp;been adding&amp;nbsp;&lt;a href="http://www.infragistics.com/hot/ajax.aspx"&gt;AJAX-powered
features&amp;nbsp;since 2004&lt;/a&gt;, and it is only going to get better for us and everyone
else thanks to the new platform and tool enhancements that are coming down the line.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=292ac470-47ca-4d9c-ab9c-e342bedc299d" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,292ac470-47ca-4d9c-ab9c-e342bedc299d.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=bce1e233-304b-4344-a208-53f05f8d367b</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,bce1e233-304b-4344-a208-53f05f8d367b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,bce1e233-304b-4344-a208-53f05f8d367b.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bce1e233-304b-4344-a208-53f05f8d367b</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today we launched our <a href="http://www.infragistics.com/">new web site</a>. 
It was not just a simple update; we revamped the whole deal and made it Web 2.0 compliant
&lt;grin&gt;.  If you remember our old site, I trust you'll immediately see the
improvement.  Please take a minute to check it out and let me know what you think. 
Also, if you run into any problems with it, please feel free to <a href="mailto:Webmaster@Infragistics.com">let
us know</a>.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bce1e233-304b-4344-a208-53f05f8d367b" />
      </body>
      <title>New Web Site Released for Infragistics!</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,bce1e233-304b-4344-a208-53f05f8d367b.aspx</guid>
      <link>http://dotNetTemplar.Net/New+Web+Site+Released+For+Infragistics.aspx</link>
      <pubDate>Thu, 26 Oct 2006 23:24:38 GMT</pubDate>
      <description>&lt;p&gt;
Today we launched our &lt;a href="http://www.infragistics.com/"&gt;new web site&lt;/a&gt;.&amp;nbsp;
It was not just a simple update; we revamped the whole deal and made it Web 2.0 compliant
&amp;lt;grin&amp;gt;.&amp;nbsp; If you remember our old site, I trust you'll immediately see the
improvement.&amp;nbsp; Please take a minute to check it out and let me know what you think.&amp;nbsp;
Also, if you run into any problems with it, please feel free to &lt;a href="mailto:Webmaster@Infragistics.com"&gt;let
us know&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bce1e233-304b-4344-a208-53f05f8d367b" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,bce1e233-304b-4344-a208-53f05f8d367b.aspx</comments>
      <category>dotNet</category>
      <category>General Computing</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=aa2b0415-5a32-4932-a8bf-00fa6f7221cc</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,aa2b0415-5a32-4932-a8bf-00fa6f7221cc.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,aa2b0415-5a32-4932-a8bf-00fa6f7221cc.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=aa2b0415-5a32-4932-a8bf-00fa6f7221cc</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just spent an hour or more that I DON'T HAVE debugging a mysterious caching issue. 
I suppose in some cases it might be obvious, but in this one, it was not.  To
sum up, we're using an XmlDataSource control generically and setting its Data property programmatically
(and using an XSL--don't know if that matters).  
</p>
        <p>
Anyways, apparently the dang control defaults to "cache indefinitely" and won't refresh
until the file it depends on changes.  I guess the thing is that it doesn't look
for changes when you set the Data property, so it caches indefinitely to be sure. 
Set EnableCaching to false, and voila, the problem is solved.
</p>
        <p>
This just highlights a rule that all general APIs should follow--don't do
any automatic caching.  You can't account for all the ways your customers will
use your stuff, so just don't do it.  It's not hard to make them flip a bit to
turn it on.  
</p>
        <p>
Argh!
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=aa2b0415-5a32-4932-a8bf-00fa6f7221cc" />
      </body>
      <title>BEWARE the EnableCaching of XmlDataSource</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,aa2b0415-5a32-4932-a8bf-00fa6f7221cc.aspx</guid>
      <link>http://dotNetTemplar.Net/BEWARE+The+EnableCaching+Of+XmlDataSource.aspx</link>
      <pubDate>Tue, 24 Oct 2006 02:39:43 GMT</pubDate>
      <description>&lt;p&gt;
I just spent an hour or more that I DON'T HAVE debugging a mysterious caching issue.&amp;nbsp;
I suppose in some cases it might be obvious, but in this one, it was not.&amp;nbsp; To
sum up, we're using an XmlDataSource control generically and setting its Data property&amp;nbsp;programmatically
(and using an XSL--don't know&amp;nbsp;if that matters).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Anyways, apparently the dang control defaults to "cache indefinitely" and won't refresh
until the file it depends on changes.&amp;nbsp; I guess the thing is that it doesn't look
for changes when you set the Data property, so it caches indefinitely to be sure.&amp;nbsp;
Set EnableCaching to false, and voila, the problem is solved.
&lt;/p&gt;
&lt;p&gt;
This just highlights a rule that&amp;nbsp;all general&amp;nbsp;APIs should follow--don't do
any automatic caching.&amp;nbsp; You can't account for all the ways your customers will
use your stuff, so just don't do it.&amp;nbsp; It's not hard to make them flip a bit to
turn it on.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Argh!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=aa2b0415-5a32-4932-a8bf-00fa6f7221cc" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,aa2b0415-5a32-4932-a8bf-00fa6f7221cc.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=b89525fa-16f6-4af9-86f5-b3cdc3111c5e</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,b89525fa-16f6-4af9-86f5-b3cdc3111c5e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,b89525fa-16f6-4af9-86f5-b3cdc3111c5e.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b89525fa-16f6-4af9-86f5-b3cdc3111c5e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
And overall I think it went quite well.  My Suave Sessions session was attended
by a whopping ONE PERSON!  I seem to recall his name is Mark, and he runs the
Ft. Worth DNUG, so kudos to him for picking a great session!  I know it wasn't
sexy, but good session handling is something we should all be concerned about, certainly
more so than getting an intro to DNN by the great Shaun Walker (who was presenting
at the same time and whom I blame for stealing all my potential attendees). 
The good news is that it's recorded and Wrox will be hosting it on their web site,
so all of you folks who made the unfortunate decision not to attend can still get
the session.  :)
</p>
        <p>
          <a href="http://dotnettemplar.net/downloads/SessionTimeoutManagement.zip">Download
the dotNetTemplar Session Management Module (for the Suave Sessions
Session)</a> - Even if you didn't see the session, you can start adding good
session handling to your pages right away.  There's demo web project there to
show how to use it.  If you want the demos from the presentation, let me know.
</p>
        <p>
The EntLib session didn't go quite so well.  <em>Apparently, I should really
check to ensure my old demos work before the day of when I give a repeat session</em>,
he thought, embarrassed.  So I apologize again to all the troopers who toughed
out the session with no running demos.  Thankfully, the core concepts could still
be expressed; it just wasn't as fun as it could be. 
</p>
        <p>
          <a href="http://dotnettemplar.net/downloads/EntLib.GotDotNet.ELMAH2.zip">Download the
ELMAH EntLib Exception Handler/Logger</a> - This can be used to both specify <a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=f18bab11-162c-4267-a46e-72438c38df6f">ELMAH</a> as
a custom EntLib exception handler and use EntLib for your db access in ELMAH.
</p>
        <p>
To use it, configure ELMAH as usual.  If you want to use the EntLib logger, use
GotDotNet.Elmah.EntLibErrorLog as the error log type instead of the standard SQL one.  
</p>
        <p>
To use the custom exception handler in EntLib, you just need to choose it in the EntLib
GUI by loading the ELMAH DLL and picking the GotDotNet.Elmah.ElmahEntLibExceptionHandler
as the handler type.  It should look something like this in the standard config:
</p>
        <font color="#0000ff" size="4">
          <p>
            <font size="2">&lt;</font>
          </p>
        </font>
        <font color="#800000">add</font>
        <font color="#0000ff">
        </font>
        <font color="#ff0000">type</font>
        <font color="#0000ff">=</font>"<font color="#0000ff">System.Exception,
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</font>"<br />
  <font color="#ff0000">postHandlingAction</font><font color="#0000ff">=</font>"<font color="#0000ff">None</font>"<font color="#0000ff"></font><font color="#ff0000">name</font><font color="#0000ff">=</font>"<font color="#0000ff">Exception</font>"<font color="#0000ff">&gt;<br />
  &lt;</font><font color="#800000">exceptionHandlers</font><font color="#0000ff">&gt;<br />
    &lt;</font><font color="#800000">add</font><font color="#0000ff"></font><font color="#ff0000">type</font><font color="#0000ff">=</font>"<font color="#0000ff">GotDotNet.Elmah.ElmahEntLibExceptionHandler,
GotDotNet.Elmah, Version=2.0.50727.42, Culture=neutral, PublicKeyToken=58d6fbf09c89f721</font>" <font color="#ff0000">name</font><font color="#0000ff">=</font>"<font color="#0000ff">Elmah
EntLib Exception Handler</font>"<font color="#0000ff"> /&gt;<br />
  &lt;/</font><font color="#800000">exceptionHandlers</font><font color="#0000ff">&gt;<br />
&lt;/</font><font size="3"><font size="2"><font color="#800000">add</font><font color="#0000ff" size="4"><font size="2">&gt;</font></font></font></font><p>
The public key token will differ, though.  I just reconditioned this for public
use real quick like, so let me know if you have any issues.
</p><p><a href="http://dotnettemplar.net/downloads/TulsaTechFestSlides.zip">Download the
Slides From Both Presentations</a> - In case you didn't get the DVD.
</p><p>
Other than that, I have to give some big kudos to David Walker and his team for putting
the conference together.  I've spoken at a number of code camp activities, and
this was definitely one of the best organized and professionally done.  I can't
help but think that their not shunning sponsors (like Infragistics) helped in making
it better.  While I appreciate the academic ideal of trying to keep the code
camp focused on devs sharing with devs, I think it is perhaps not in the best interests
of anyone to shun sponsorship.  The vendors who sponsor conferences like that
have tools that are supposed to make devs lives better, so in my opinion, it only
makes sense to welcome them in as long as it is done tastefully. 
</p><p>
And no, I didn't just start thinking this now that I'm working for a vendor; you can
ask Joe Healy--I was pushing for sponsors when I was helping organize the Tampa code
camp.  After all, it's not like Microsoft's stuff is free, and if the conference
is about using Microsoft's technologies, why limit the vendor sponsors and topics to
Microsoft?  Microsoft does a lot to make software development better, and we
all welcome that.  I'm just suggesting the same thinking be extended to other
companies who do the same thing. 
</p><p>
Anyways, I didn't intend to rant about that really; I mainly wanted to say that <strong>David
et al did a great job</strong>.  It was good to visit my hometown again, and
while I didn't make it out to Ron's Chli &amp; Hamburgers Too for that sausage chili
cheeseburger I've been missing, I still thoroughly enjoyed the visit.  Tulsa
certainly has been growing its dev community, and I hope they continue to do so. 
</p><p>
That's it.  Hope everyone's having a great day!  Sorry bout the delay in
getting this up.
</p><img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=b89525fa-16f6-4af9-86f5-b3cdc3111c5e" /></body>
      <title>Tulsa Tech Fest Results Are In</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,b89525fa-16f6-4af9-86f5-b3cdc3111c5e.aspx</guid>
      <link>http://dotNetTemplar.Net/Tulsa+Tech+Fest+Results+Are+In.aspx</link>
      <pubDate>Tue, 17 Oct 2006 19:55:26 GMT</pubDate>
      <description>&lt;p&gt;
And overall I think it went quite well.&amp;nbsp; My Suave Sessions session was attended
by a whopping ONE PERSON!&amp;nbsp; I seem to recall his name is Mark, and he runs the
Ft. Worth DNUG, so kudos to him for picking a great session!&amp;nbsp; I know it wasn't
sexy, but good session handling is something we should all be concerned about, certainly
more so than getting an intro to DNN by the great Shaun Walker (who was presenting
at the same time and whom I blame for stealing all my potential attendees).&amp;nbsp;
The good news is that it's recorded and Wrox will be hosting it on their web site,
so all of you folks who made the unfortunate decision not to attend can still get
the session.&amp;nbsp; :)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://dotnettemplar.net/downloads/SessionTimeoutManagement.zip"&gt;Download
the&amp;nbsp;dotNetTemplar Session&amp;nbsp;Management Module&amp;nbsp;(for the Suave Sessions
Session)&lt;/a&gt;&amp;nbsp;- Even if you didn't see the session, you can start adding good
session handling to your pages right away.&amp;nbsp; There's demo web project there to
show how to use it.&amp;nbsp; If you want the demos from the presentation, let me know.
&lt;/p&gt;
&lt;p&gt;
The EntLib session didn't go quite so well.&amp;nbsp; &lt;em&gt;Apparently, I should really
check to ensure my old demos work before the day of when I give a repeat session&lt;/em&gt;,
he thought, embarrassed.&amp;nbsp; So I apologize again to all the troopers who toughed
out the session with no running demos.&amp;nbsp; Thankfully, the core concepts could still
be expressed; it just wasn't as fun as it could be. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://dotnettemplar.net/downloads/EntLib.GotDotNet.ELMAH2.zip"&gt;Download&amp;nbsp;the
ELMAH EntLib Exception Handler/Logger&lt;/a&gt; - This can be used to both specify &lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=f18bab11-162c-4267-a46e-72438c38df6f"&gt;ELMAH&lt;/a&gt; as
a custom EntLib exception handler and use EntLib for your db access in ELMAH.
&lt;/p&gt;
&lt;p&gt;
To use it, configure ELMAH as usual.&amp;nbsp; If you want to use the EntLib logger, use
GotDotNet.Elmah.EntLibErrorLog as the error log type instead of the standard SQL one.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
To use the custom exception handler in EntLib, you just need to choose it in the EntLib
GUI by loading the ELMAH DLL and picking the GotDotNet.Elmah.ElmahEntLibExceptionHandler
as the handler type.&amp;nbsp; It should look something like this in the standard config:
&lt;/p&gt;
&lt;font color=#0000ff size=4&gt; 
&lt;p&gt;
&lt;font size=2&gt;&amp;lt;&lt;/font&gt;
&lt;/font&gt;&lt;font color=#800000&gt;add&lt;/font&gt;&lt;font color=#0000ff&gt; &lt;/font&gt;&lt;font color=#ff0000&gt;type&lt;/font&gt;&lt;font color=#0000ff&gt;=&lt;/font&gt;"&lt;font color=#0000ff&gt;System.Exception,
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/font&gt;"&lt;br&gt;
&amp;nbsp; &lt;font color=#ff0000&gt;postHandlingAction&lt;/font&gt;&lt;font color=#0000ff&gt;=&lt;/font&gt;"&lt;font color=#0000ff&gt;None&lt;/font&gt;"&lt;font color=#0000ff&gt; &lt;/font&gt;&lt;font color=#ff0000&gt;name&lt;/font&gt;&lt;font color=#0000ff&gt;=&lt;/font&gt;"&lt;font color=#0000ff&gt;Exception&lt;/font&gt;"&lt;font color=#0000ff&gt;&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color=#800000&gt;exceptionHandlers&lt;/font&gt;&lt;font color=#0000ff&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color=#800000&gt;add&lt;/font&gt;&lt;font color=#0000ff&gt; &lt;/font&gt;&lt;font color=#ff0000&gt;type&lt;/font&gt;&lt;font color=#0000ff&gt;=&lt;/font&gt;"&lt;font color=#0000ff&gt;GotDotNet.Elmah.ElmahEntLibExceptionHandler,
GotDotNet.Elmah, Version=2.0.50727.42, Culture=neutral, PublicKeyToken=58d6fbf09c89f721&lt;/font&gt;" &lt;font color=#ff0000&gt;name&lt;/font&gt;&lt;font color=#0000ff&gt;=&lt;/font&gt;"&lt;font color=#0000ff&gt;Elmah
EntLib Exception Handler&lt;/font&gt;"&lt;font color=#0000ff&gt; /&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/&lt;/font&gt;&lt;font color=#800000&gt;exceptionHandlers&lt;/font&gt;&lt;font color=#0000ff&gt;&amp;gt;&lt;br&gt;
&amp;lt;/&lt;/font&gt;&lt;font size=3&gt;&lt;font size=2&gt;&lt;font color=#800000&gt;add&lt;/font&gt;&lt;font color=#0000ff size=4&gt;&lt;font size=2&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &gt;
&lt;p&gt;
The public key token will differ, though.&amp;nbsp; I just reconditioned this for public
use real quick like, so let me know if you have any issues.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://dotnettemplar.net/downloads/TulsaTechFestSlides.zip"&gt;Download the
Slides From Both Presentations&lt;/a&gt; - In case you didn't get the DVD.
&lt;/p&gt;
&lt;p&gt;
Other than that, I have to give some big kudos to David Walker and his team for putting
the conference together.&amp;nbsp; I've spoken at a number of code camp activities, and
this was definitely one of the best organized and professionally done.&amp;nbsp; I can't
help but think that their not shunning sponsors (like Infragistics) helped in making
it better.&amp;nbsp; While I appreciate the academic ideal of trying to keep the code
camp focused on devs sharing with devs, I think it is perhaps not in the best interests
of anyone to shun sponsorship.&amp;nbsp; The vendors who sponsor conferences like that
have tools that are supposed to make devs lives better, so in my opinion, it only
makes sense to welcome them in&amp;nbsp;as long as it is done tastefully. 
&lt;/p&gt;
&lt;p&gt;
And no, I didn't just start thinking this now that I'm working for a vendor; you can
ask Joe Healy--I was pushing for sponsors when I was helping organize the Tampa code
camp.&amp;nbsp; After all, it's not like Microsoft's stuff is free, and if the conference
is about using Microsoft's technologies, why limit the vendor sponsors and topics&amp;nbsp;to
Microsoft?&amp;nbsp; Microsoft does a lot to make software development better, and we
all welcome that.&amp;nbsp; I'm just suggesting the same thinking be extended to other
companies who do the same thing. 
&lt;/p&gt;
&lt;p&gt;
Anyways, I didn't intend to rant about that really; I mainly wanted to say that &lt;strong&gt;David
et al did a great job&lt;/strong&gt;.&amp;nbsp; It was good to visit my hometown again, and
while I didn't make it out to Ron's Chli &amp;amp; Hamburgers Too for that sausage chili
cheeseburger I've been missing, I still thoroughly enjoyed the visit.&amp;nbsp; Tulsa
certainly has been growing its dev community, and I hope they continue to do so. 
&lt;/p&gt;
&lt;p&gt;
That's it.&amp;nbsp; Hope everyone's having a great day!&amp;nbsp; Sorry bout the delay in
getting this up.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=b89525fa-16f6-4af9-86f5-b3cdc3111c5e" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,b89525fa-16f6-4af9-86f5-b3cdc3111c5e.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=bab01e2f-57e0-4338-b1d0-6bad81584452</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,bab01e2f-57e0-4338-b1d0-6bad81584452.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,bab01e2f-57e0-4338-b1d0-6bad81584452.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bab01e2f-57e0-4338-b1d0-6bad81584452</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A while back, I decided I needed to add browser-specific capabilities to my web application. 
While there are those who advocate using capability testing rather than browser sniffing,
there is at least one good reason to prefer sniffing.  That is that
you want to be sure your site works as well as possible in all browsers but you want
to take advantage of capabilities only available in some.  
</p>
        <p>
In itself, this is not a reason to prefer sniffing; the key, however, is that you
"want to be sure," which means testing; otherwise, your stuff may or may not work,
which isn't very reassuring.  If you don't have the resources to do testing in
all target browsers or the time to develop Javascript workarounds based strictly on
specific capability detection, then sniffing is a good alternative because it allows
you to only use "advanced" functionality in the browsers that you have tested and
fall back to standard functionality for the rest.  This of course assumes you
have architected your stuff in such a way as to make downgrading possible and still
offer fairly equivalent services in a less rich presentation.  That in itself
can be challenging and is far too involved and a bit off topic for this post.
</p>
        <p>
So let's just assume you can fall back.  The next question is where you do the
downgrading.  You can do it in Javascript, which if you only want to alter some
functionality on the client side is fine, but if you want to, say, avoid Javascript
altogether or emit significantly different script based on browser, the choice is
to detect on the server and act appropriately.
</p>
        <p>
Thankfully, most web server technologies support browser sniffing, and ASP.NET
has expanded on and improved on this with their control adapters in 2.0.  But
you can still use the old browser capabilities approach.  To do this in 2.0,
you simply add the special App_Browsers folder to your web site or project (if you're
using WAP).  In there you just add a file with the .browser extension, and you
can put in your own custom browser capabilities there.  Here's an example:
</p>
        <font color="#0000ff" size="2">
          <p>
&lt;
</p>
        </font>
        <font color="#800000" size="2">browsers</font>
        <font color="#0000ff" size="2">&gt;<br />
  &lt;</font>
        <font color="#800000" size="2">browser</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">refID</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">MozillaFirefox</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">&gt;<br />
    &lt;</font>
        <font color="#800000" size="2">capabilities</font>
        <font color="#0000ff" size="2">&gt;<br />
      &lt;</font>
        <font color="#800000" size="2">capability</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">name</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">supportBubblePopup</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">value</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">true</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2"> /&gt;<br />
      &lt;</font>
        <font color="#800000" size="2">capability</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">name</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">supportAjaxNavigation</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">value</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">true</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2"> /&gt;<br />
    &lt;/</font>
        <font color="#800000" size="2">capabilities</font>
        <font color="#0000ff" size="2">&gt;<br />
  &lt;/</font>
        <font color="#800000" size="2">browser</font>
        <font color="#0000ff" size="2">&gt;<br />
  &lt;</font>
        <font color="#800000" size="2">browser</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">refID</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">IE6to9</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">&gt;<br />
    &lt;</font>
        <font color="#800000" size="2">capabilities</font>
        <font color="#0000ff" size="2">&gt;<br />
      &lt;</font>
        <font color="#800000" size="2">capability</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">name</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">supportBubblePopup</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">value</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">true</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2"> /&gt;<br />
      &lt;</font>
        <font color="#800000" size="2">capability</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">name</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">supportAjaxNavigation</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">
        </font>
        <font color="#ff0000" size="2">value</font>
        <font color="#0000ff" size="2">=</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2">true</font>
        <font size="2">"</font>
        <font color="#0000ff" size="2"> /&gt;<br />
    &lt;/</font>
        <font color="#800000" size="2">capabilities</font>
        <font color="#0000ff" size="2">&gt;<br />
  &lt;/</font>
        <font color="#800000" size="2">browser</font>
        <font color="#0000ff" size="2">&gt;<br />
&lt;/</font>
        <font color="#800000" size="2">browsers</font>
        <font color="#0000ff" size="2">&gt;</font>
        <p>
That's it, if all you want to do is extend the existing browser definitions. 
If you want to define new ones or to find out more about the browser schema, you can
consult <a href="http://windowssdk.msdn.microsoft.com/en-us/library/ms228122.aspx">the
MSDN docs</a>.  Using refID just lets you reference an existing definition and
extend it.  You can view existing definitions that ship with .NET in the Framework
CONFIG\Browsers directory (e.g., C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers),
but be sure not to modify those directly to avoid your customizations being overwritten
with later patches.
</p>
        <p>
          <strong>Note</strong>: You might be tempted to set a default value using refID="Default"
as the docs suggest, but I've confirmed that there is a bug that causes the default
to actually overwrite the more specific settings.  Microsoft tells me that they
have scheduled a fix for this bug and that it will be released with the next Service
Pack, but if you need it sooner, you can create a support incident and get a hotfix. 
So the workaround is to not use Default and have your code check against null to determine
default.  It's not the nicest approach, especially when you're using a Boolean
value that would be better to just parse to bool, but it's not a travesty either.
</p>
        <p>
You can then test for the capability in your code like so:
</p>
        <font color="#0000ff" size="2">
          <p>
this
</p>
        </font>
        <font size="2">.Page.Request.Browser[</font>
        <font color="#800000" size="2">"supportAjaxNavigation"</font>
        <font size="2">]
== </font>
        <font color="#800000" size="2">"true"</font>
        <p>
and do your downgrading if need be.  Of course, if you have some serious
alternative rendering that needs to occur, you should consider using <a href="http://weblogs.asp.net/scottgu/archive/2005/12/21/433692.aspx">control
adapters</a> (especially the PageAdapter) to avoid complicating code with
lots of conditional statements.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bab01e2f-57e0-4338-b1d0-6bad81584452" />
      </body>
      <title>Adding Custom Browser Capabilities in ASP.NET</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,bab01e2f-57e0-4338-b1d0-6bad81584452.aspx</guid>
      <link>http://dotNetTemplar.Net/Adding+Custom+Browser+Capabilities+In+ASPNET.aspx</link>
      <pubDate>Sat, 30 Sep 2006 18:30:26 GMT</pubDate>
      <description>&lt;p&gt;
A while back, I decided I needed to add browser-specific capabilities to my web application.&amp;#160;
While there are those who advocate using capability testing rather than browser sniffing,
there&amp;#160;is at least one good reason to prefer sniffing.&amp;#160;&amp;#160;That is that
you want to be sure your site works as well as possible in all browsers but you want
to take advantage of capabilities only available in some.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
In itself, this is not a reason to prefer sniffing; the key, however, is that you
"want to be sure," which means testing; otherwise, your stuff may or may not work,
which isn't very reassuring.&amp;#160; If you don't have the resources to do testing in
all target browsers or the time to develop Javascript workarounds based strictly on
specific capability detection, then sniffing is a good alternative because it allows
you to only use "advanced" functionality in the browsers that you have tested and
fall back to standard functionality for the rest.&amp;#160; This of course assumes you
have architected your stuff in such a way as to make downgrading possible and still
offer fairly equivalent services in a less rich presentation.&amp;#160; That in itself
can be challenging and is far too involved and a bit off topic for this post.
&lt;/p&gt;
&lt;p&gt;
So let's just assume you can fall back.&amp;#160; The next question is where you do the
downgrading.&amp;#160; You can do it in Javascript, which if you only want to alter some
functionality on the client side is fine, but if you want to, say, avoid Javascript
altogether or emit significantly different script based on browser, the choice is
to detect on the server and act appropriately.
&lt;/p&gt;
&lt;p&gt;
Thankfully, most&amp;#160;web server technologies support browser sniffing, and&amp;#160;ASP.NET
has expanded on and improved on this with their control adapters in 2.0.&amp;#160; But
you can still use the old browser capabilities approach.&amp;#160; To do this in 2.0,
you simply add the special App_Browsers folder to your web site or project (if you're
using WAP).&amp;#160; In there you just add a file with the .browser extension, and you
can put in your own custom browser capabilities there.&amp;#160; Here's an example:
&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt; 
&lt;p&gt;
&amp;lt;
&lt;/p&gt;
&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browsers&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browser&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;refID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;MozillaFirefox&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capabilities&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capability&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;supportBubblePopup&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;value&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capability&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;supportAjaxNavigation&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;value&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capabilities&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browser&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browser&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;refID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;IE6to9&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capabilities&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capability&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;supportBubblePopup&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;value&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capability&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;supportAjaxNavigation&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;value&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000" size="2"&gt;capabilities&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browser&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;
&amp;lt;/&lt;/font&gt;&lt;font color="#800000" size="2"&gt;browsers&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt; 
&lt;p&gt;
That's it, if all you want to do is extend the existing browser definitions.&amp;#160;
If you want to define new ones or to find out more about the browser schema, you can
consult &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/ms228122.aspx"&gt;the
MSDN docs&lt;/a&gt;.&amp;#160; Using refID just lets you reference an existing definition and
extend it.&amp;#160; You can view existing definitions that ship with .NET in the Framework
CONFIG\Browsers directory (e.g., C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers),
but be sure not to modify those directly to avoid your customizations being overwritten
with later patches.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Note&lt;/strong&gt;: You might be tempted to set a default value using refID="Default"
as the docs suggest, but I've confirmed that there is a bug that causes the default
to actually overwrite the more specific settings.&amp;#160; Microsoft tells me that they
have scheduled a fix for this bug and that it will be released with the next Service
Pack, but if you need it sooner, you can create a support incident and get a hotfix.&amp;#160;
So the workaround is to not use Default and have your code check against null to determine
default.&amp;#160; It's not the nicest approach, especially when you're using a Boolean
value that would be better to just parse to bool, but it's not a travesty either.
&lt;/p&gt;
&lt;p&gt;
You can then test for the capability in your code like so:
&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt; 
&lt;p&gt;
this
&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;.Page.Request.Browser[&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"supportAjaxNavigation"&lt;/font&gt;&lt;font size="2"&gt;]
== &lt;/font&gt;&lt;font color="#800000" size="2"&gt;"true"&lt;/font&gt;
&lt;p&gt;
and&amp;#160;do your downgrading if need be.&amp;#160; Of course, if you have some serious
alternative rendering that needs to occur, you should consider using &lt;a href="http://weblogs.asp.net/scottgu/archive/2005/12/21/433692.aspx"&gt;control
adapters&lt;/a&gt;&amp;#160;(especially the PageAdapter)&amp;#160;to avoid complicating code with
lots of conditional statements.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=bab01e2f-57e0-4338-b1d0-6bad81584452" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,bab01e2f-57e0-4338-b1d0-6bad81584452.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=319a5e9a-8a39-44ba-a316-329eaa7ea32e</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,319a5e9a-8a39-44ba-a316-329eaa7ea32e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,319a5e9a-8a39-44ba-a316-329eaa7ea32e.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=319a5e9a-8a39-44ba-a316-329eaa7ea32e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hi all, I just wanted to spread the word about the <a href="http://www.tulsatechfest.com/">Tulsa
TechFest</a> next month.  As some of you know, I originally hail from Tulsa,
OK, and I'm glad to be going back to my home town for this conference.  I'll
be doing one session on EntLib for ASP.NET (modified version of my TechEd talk) and
one on professional session handling (talking about things like HTTP modules, handlers,
custom controls, etc. to gracefully handle sessions in ASP.NET).  
</p>
        <p>
Of course, I'm just one of many speakers who'll be presenting on a large variety of
topics, not just .NET.  They'll also have vendors with lots of goodies--I know
Infragistics has some neat giveaways planned.  So if you're in the region, you
should definitely check it out.  It looks like it'll be the best tech event
that the heartland has seen.  Kudos to David Walker and the other organizers.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=319a5e9a-8a39-44ba-a316-329eaa7ea32e" />
      </body>
      <title>Tulsa TechFest 2006</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,319a5e9a-8a39-44ba-a316-329eaa7ea32e.aspx</guid>
      <link>http://dotNetTemplar.Net/Tulsa+TechFest+2006.aspx</link>
      <pubDate>Fri, 15 Sep 2006 16:09:19 GMT</pubDate>
      <description>&lt;p&gt;
Hi all, I just wanted to spread the word about the &lt;a href="http://www.tulsatechfest.com/"&gt;Tulsa
TechFest&lt;/a&gt; next&amp;nbsp;month.&amp;nbsp; As some of you know, I originally hail from Tulsa,
OK, and I'm glad to be going back to my home town for this conference.&amp;nbsp; I'll
be doing one session on EntLib for ASP.NET (modified version of my TechEd talk) and
one on professional session handling (talking about things like HTTP modules, handlers,
custom controls, etc. to gracefully handle sessions in ASP.NET).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Of course, I'm just one of many speakers who'll be presenting on a large variety of
topics, not just .NET.&amp;nbsp; They'll also have vendors with lots of goodies--I know
Infragistics has some neat giveaways planned.&amp;nbsp; So if you're in the region, you
should definitely check it out.&amp;nbsp; It looks like it'll be the best&amp;nbsp;tech event
that the heartland has seen.&amp;nbsp; Kudos to David Walker and the other organizers.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=319a5e9a-8a39-44ba-a316-329eaa7ea32e" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,319a5e9a-8a39-44ba-a316-329eaa7ea32e.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=1193407d-659e-4900-816c-5ae0c09d5bd4</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,1193407d-659e-4900-816c-5ae0c09d5bd4.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,1193407d-659e-4900-816c-5ae0c09d5bd4.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1193407d-659e-4900-816c-5ae0c09d5bd4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just ran across what appears to be a nasty bug in Firefox today.  Without explaining
why I'm doing it, suffice it to say that I just wanted to call a script in a parent
frame (from an IFrame) that ultimately results in an XMLHttpRequest.  It works
in IE 6 and 7, but in FF 1.5, it just doesn't.  In fact, the result of the request
seemed to be the result of the previous request that was executed, and to make it
more interesting, the responseXML returned null while the text showed the results
of the previous call.
</p>
        <p>
Oddly enough, no errors were thrown--it acts like a regular call with an error free
response; it just doesn't actually seem to perform the request and in the meantime
loses its XML document.
</p>
        <p>
Anyways, I was starting to despair when I ran across <a href="http://the-stickman.com/web-development/javascript/iframes-xmlhttprequest-bug-in-firefox/">this
blog post</a>.  It seems I'm not the only one who's bumped into this one (or
some variation), yet I must say it was hard to find that blog entry based on my searching. 
So I want to raise its visibility with this post.  
</p>
        <p>
For me, the solution was simply to use window.top.setTimeout(myfun, 50).  That
appears to give FF the context it needs to properly execute the request.  But
of course, that breaks it for IE, so you gotta do a check for Firefox (e.g., if (navigator.userAgent.indexOf('Firefox')
!= -1)) do the timeout if so; otherwise, make the call directly.
</p>
        <p>
Phwew!  Thanks to those who've gone before me!  
</p>
               <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=1193407d-659e-4900-816c-5ae0c09d5bd4" /></body>
      <title>Cross-Frame Scripting in Firefox Using XMLHttpRequest</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,1193407d-659e-4900-816c-5ae0c09d5bd4.aspx</guid>
      <link>http://dotNetTemplar.Net/CrossFrame+Scripting+In+Firefox+Using+XMLHttpRequest.aspx</link>
      <pubDate>Tue, 12 Sep 2006 02:06:32 GMT</pubDate>
      <description>&lt;p&gt;
I just ran across what appears to be a nasty bug in Firefox today.&amp;nbsp; Without explaining
why I'm doing it, suffice it to say that I just wanted to call a script in a parent
frame (from an IFrame) that ultimately results in an XMLHttpRequest.&amp;nbsp; It works
in IE 6 and 7, but in FF 1.5, it just doesn't.&amp;nbsp; In fact, the result of the request
seemed to be the result of the previous request that was executed, and to make it
more interesting, the responseXML returned null while the text showed the results
of the previous call.
&lt;/p&gt;
&lt;p&gt;
Oddly enough, no errors were thrown--it acts like a regular call with an error free
response; it just doesn't actually seem to perform the request and in the meantime
loses its XML document.
&lt;/p&gt;
&lt;p&gt;
Anyways, I was starting to despair when I ran across &lt;a href="http://the-stickman.com/web-development/javascript/iframes-xmlhttprequest-bug-in-firefox/"&gt;this
blog post&lt;/a&gt;.&amp;nbsp; It seems I'm not the only one who's bumped into this one (or
some variation), yet I must say it was hard to find that blog entry based on my searching.&amp;nbsp;
So I want to raise its visibility with this post.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
For me, the solution was simply to use window.top.setTimeout(myfun, 50).&amp;nbsp; That
appears to give FF the context it needs to properly execute the request.&amp;nbsp; But
of course, that breaks it for IE, so you gotta do a check for Firefox (e.g., if (navigator.userAgent.indexOf('Firefox')
!= -1))&amp;nbsp;do the timeout if so; otherwise, make the call directly.
&lt;/p&gt;
&lt;p&gt;
Phwew!&amp;nbsp; Thanks to those who've gone before me!&amp;nbsp; 
&lt;/p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=1193407d-659e-4900-816c-5ae0c09d5bd4" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,1193407d-659e-4900-816c-5ae0c09d5bd4.aspx</comments>
      <category>Technical</category>
      <category>Javascript</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=81dba391-555e-4103-8e03-ea832a19a48a</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,81dba391-555e-4103-8e03-ea832a19a48a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,81dba391-555e-4103-8e03-ea832a19a48a.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=81dba391-555e-4103-8e03-ea832a19a48a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just want to spread the word about a little utiltiy on gotdotnet that generates
a strongly-typed profile for WAPs.  It's not the easiest thing to come across:
</p>
        <p>
          <a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=406eefba-2dd9-4d80-a48c-b4f135df4127">http://www.gotdotnet.com/workspaces/workspace.aspx?id=406eefba-2dd9-4d80-a48c-b4f135df4127</a>
        </p>
        <p>
Note that the profile goo in 2.0 should just work, even with WAPs.  This just
gives you a better design-time experience.
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=81dba391-555e-4103-8e03-ea832a19a48a" />
      </body>
      <title>Strongly-Typed Profiles in Web Application Projects (WAP)</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,81dba391-555e-4103-8e03-ea832a19a48a.aspx</guid>
      <link>http://dotNetTemplar.Net/StronglyTyped+Profiles+In+Web+Application+Projects+WAP.aspx</link>
      <pubDate>Wed, 06 Sep 2006 15:04:03 GMT</pubDate>
      <description>&lt;p&gt;
I just want to spread the word about a little utiltiy on gotdotnet that generates
a strongly-typed profile for WAPs.&amp;nbsp; It's not the easiest thing to come across:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=406eefba-2dd9-4d80-a48c-b4f135df4127"&gt;http://www.gotdotnet.com/workspaces/workspace.aspx?id=406eefba-2dd9-4d80-a48c-b4f135df4127&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Note that the profile goo in 2.0 should just work, even with WAPs.&amp;nbsp; This just
gives you a better design-time experience.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=81dba391-555e-4103-8e03-ea832a19a48a" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,81dba391-555e-4103-8e03-ea832a19a48a.aspx</comments>
      <category>dotNet</category>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://dotnettemplar.net/Trackback.aspx?guid=96dd258e-1165-45e9-b4f8-671eb1622c5a</trackback:ping>
      <pingback:server>http://dotnettemplar.net/pingback.aspx</pingback:server>
      <pingback:target>http://dotnettemplar.net/PermaLink,guid,96dd258e-1165-45e9-b4f8-671eb1622c5a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://dotnettemplar.net/CommentView,guid,96dd258e-1165-45e9-b4f8-671eb1622c5a.aspx</wfw:comment>
      <wfw:commentRss>http://dotnettemplar.net/SyndicationService.asmx/GetEntryCommentsRss?guid=96dd258e-1165-45e9-b4f8-671eb1622c5a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I know the job market for .NET devs right now is really hot, and those with experience
typically have a lot of choices.  So let me add another choice to the list.  Yes,
I'm talking about Infragistics.  No, they're not paying me to say this. 
Well, yeah, they're paying me, but not to say this. Rather than just stick a job description
out, I hope you'll let me tell you why I like working for Infragistics.  I've
been here nigh on four months, and I'm still liking it, so that's something.
</p>
        <p>
          <strong>Why I Like Infragistics</strong>
        </p>
        <p>
I've worked at more than my fair share of companies in my career, sometimes consulting,
more often as an employee, and this is the best company I've worked at.  Sure,
at other companies there are good people; I've worked with many.  But Infragistics
not only has good people, it is a good company--it has good culture and actively works
to improve it. 
</p>
        <p>
It's not just that it is a software company, though I think that helps. 
I've worked at more than one commercial software company, and the cultures between
them are as starkly contrasted as light is from darkness, happiness from sorrow. 
It's not just its size because I've worked at others about our size, larger and smaller. 
It's not just that the dress code is as relaxed as it gets, though that's nice.  
</p>
        <p>
Other companies talk about passion, but here it is ingrained in the culture. 
People care about what they are doing and strive to do their best, and it starts at
the top.  Probably no one here is more passionate about the company than our
CEO and the rest of <a href="http://www.infragistics.com/corporate/bios/default.aspx">our
management team</a>.  And the enthusiasm spreads into every department,
even to folks like me, in case that wasn't obvious.  For me, that makes all the
difference--working with positive, enthusiastic, and creative individuals at
a company that fosters that kind of an environment.
</p>
        <p>
For those who are still new enough in their career to think that stuff like this isn't
important, that salary is all that matters, I hope you can take it to heart from me
that probably more than anything--more than salary, more than benefits, more than
location--the culture of your company is what makes or breaks whether or not you are
happy in your job.  Now I'm not naive enough to think that our culture fits everyone;
it won't.  But if you are a motivated and talented individual who likes to be
challenged, likes to make a difference, and wants to get experience working with,
learning from, and sharing your knowledge with other similar individuals,
Infragistics just may be the place for you. 
</p>
        <p>
Being a community guy, I also like that Infragistics has done and is doing a lot of
community support.  We host the local .NET and Java user groups at our HQ. 
We often sponsor and send speakers to code camps and tech fests.  We sponsor
user groups worldwide, and if you like being involved in the community, Infragistics
goes out of its way to help you in that.  And we're always looking for new ways
that we can support our communities, so if you have ideas, shoot them over to me.
</p>
        <p>
Of course, being a geek, I like that Infragistics gives me the opportunity to work
on the latest and greatest technologies.  If you're stuck in a job where they're
taking the "safe" course of not upgrading, you won't face that problem here. 
In fact, we're challenged to be and stay on the edge of the technological spectrum.
</p>
        <p>
And as an aesthetically sensitive person, I appreciate that Infragistics provides
a good working environment.  The building is nice; the work area is nice; the
equipment is nice, and there is a degree of freedom to make your space your own. 
If you want to have medieval action figures along the tops of your cube (like I do),
you can do that.  Or if you are into feng shui, so be it.  
</p>
        <p>
In terms of location, I think it's great.  I've <a href="http://dotnettemplar.net/AllSettledIn.aspx">already
blogged about that</a>.  We're now rounding into fall (already!) and our hottest
temps this summer were a few days of maybe a hundredish.  Coming from Tampa,
I can now avow that it in fact does not get (or at least seem) as hot and humid here--it
was stickier when I left Tampa in early May than it got here the entire
summer.  And you don't have to worry about <a href="http://devfish.net/fullblogitemview.aspx?blogid=287">hurricanes</a> really. 
Of course, <a href="http://weblogs.asp.net/wallym/">Wally</a> recently counseled me
that I might want to wait until I've lived through a winter before I sing the praises
of the weather, but I'll take a livable summer and cold winter any day over unbearable,
six-month-long summers and mild winters (that don't really even qualify as winters). 
I've always said, you can bundle up as much as you need to, but you can only take
so much off!  
</p>
        <p>
But again, like company culture, I know there are different strokes for different
folks (<a href="http://devfish.net/">Joe</a>!). :)  The only reason I mention
this is to counteract the common misconception about New Jersey being an undesirable
place to live.  If you're into culture, plays, or clubbing, New York City and
Philadelphia are just a stone's throw away by car or train.  If you like small
town family feel, we've got that, too; I just went to a butterfly festival with
my family a couple weeks ago, and they've had others (like insect, peach, etc. festivals
all over the place).  If you like history, you can't go far without running into some
monument commemorating where Washington did something or where, e.g., some
of our founding fathers went to college.  Shopping?  Route 1 is the place
to be (or, again, NYC).  Like to travel?  The Newark airport is one of the
largest in the US.  Compared to the other places I've lived, it fares quite well
on the pros v. cons.  So if the "armpit of the US"/Sopranos stereotype is all that's
stopping you from joining us here in central Jersey, don't let it! 
</p>
        <p>
          <strong>What's Available</strong>
        </p>
        <p>
Now that I know you're chomping at the bit to work for Infragistics, I guess it wouldn't
hurt to mention the positions we're hiring for.  You can see a full list of open
positions on <a href="http://www.infragistics.com/Corporate/Careers/Default.aspx">our
careers pages</a>.  You'll need to use the quick links to see the list by location. 
Yes, we do have more spots open than at our HQ here in NJ, and if those appeal
to you, the more the merrier.  But looking specifically at <a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx">our
HQ openings</a> (and since this is a developer-oriented blog), I'll highlight
the <a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx#RD">Sr. R&amp;D
Engineer position</a> for our .NET web controls.  We need someone who is very
strong with web UI development and, of course, .NET.  It's a tall order, but
I'm sure you're out there.  If you think you're an ASP.NET web UI expert, you
should definitely consider it.  That position has challenges that most of us
devs never have to face.
</p>
        <p>
We also have some other dev positions in the <a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx#IS">internal
systems</a> department, so if the R&amp;D position doesn't seem like it would fit
you, you might check those out.  There is a lot of mobility possible
in this company, so you might start in internal systems and then move to other areas
that you later find more interesting, e.g., evangelism, R&amp;D, etc., as positions
become available.  
</p>
        <p>
It's certainly a fun, interesting, agile, and challenging place to work. 
All of these positions involve cutting edge technologies, working with great people,
in a great culture.  Maybe you see some other position that's open and interests
you, or even if there isn't a perfect fit on the web site but you think you have something
to offer a company like I've been describing, you can just <a href="mailto:ambrose@infragistics.com">send
me your resume</a>, and I'll ensure it gets into the right hands.  Yes, we do
have a referral program, and yes, I will take you out to lunch if you get hired on
as my referral.  I had to mention that because, hey, you wouldn't believe me
if I said I'm just doing it to help my company (no matter how true it is). :-p
No more waiting.  Do it! 
</p>
        <img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=96dd258e-1165-45e9-b4f8-671eb1622c5a" />
      </body>
      <title>Totally Awesome Software Company Wants You</title>
      <guid isPermaLink="false">http://dotnettemplar.net/PermaLink,guid,96dd258e-1165-45e9-b4f8-671eb1622c5a.aspx</guid>
      <link>http://dotNetTemplar.Net/Totally+Awesome+Software+Company+Wants+You.aspx</link>
      <pubDate>Wed, 30 Aug 2006 23:36:22 GMT</pubDate>
      <description>&lt;p&gt;
I know the job market for .NET devs right now is really hot, and those with experience
typically have a lot of choices.&amp;nbsp; So let me add another choice to the list.&amp;nbsp;&amp;nbsp;Yes,
I'm talking about Infragistics.&amp;nbsp; No, they're not paying me to say this.&amp;nbsp;
Well, yeah, they're paying me, but not to say this. Rather than just stick a job description
out, I hope you'll let me tell you why I like working for Infragistics.&amp;nbsp; I've
been here nigh on four months, and I'm still liking it, so that's something.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Why I Like Infragistics&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I've worked at more than my fair share of companies in my career, sometimes consulting,
more often as an employee, and this is the best company I've worked at.&amp;nbsp; Sure,
at other companies there are good people; I've worked with many.&amp;nbsp; But Infragistics
not only has good people, it is a good company--it has good culture and actively works
to improve it. 
&lt;/p&gt;
&lt;p&gt;
It's not just that it is a software company, though I think&amp;nbsp;that helps.&amp;nbsp;
I've worked at more than one&amp;nbsp;commercial software company, and the cultures&amp;nbsp;between
them&amp;nbsp;are as starkly contrasted as light is from darkness, happiness from sorrow.&amp;nbsp;
It's not just its size because I've worked at others about our size, larger and smaller.&amp;nbsp;
It's not just that the dress code is&amp;nbsp;as relaxed as it gets, though that's nice.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Other companies talk about passion, but here it is ingrained in the culture.&amp;nbsp;
People care about what they are doing and strive to do their best, and it starts at
the top.&amp;nbsp; Probably no one here is more passionate about the company than our
CEO and the rest of &lt;a href="http://www.infragistics.com/corporate/bios/default.aspx"&gt;our
management team&lt;/a&gt;.&amp;nbsp; And the enthusiasm spreads&amp;nbsp;into&amp;nbsp;every department,
even to folks like me, in case that wasn't obvious.&amp;nbsp; For me, that makes all the
difference--working with positive, enthusiastic, and creative&amp;nbsp;individuals at
a company that fosters that kind of an environment.
&lt;/p&gt;
&lt;p&gt;
For those who are still new enough in their career to think that stuff like this isn't
important, that salary is all that matters, I hope you can take it to heart from me
that probably more than anything--more than salary, more than benefits, more than
location--the culture of your company is what makes or breaks whether or not you are
happy in your job.&amp;nbsp; Now I'm not naive enough to think that our culture fits everyone;
it won't.&amp;nbsp; But if you are a motivated and talented individual who likes to be
challenged, likes to make a difference, and wants to get experience working with,
learning from, and&amp;nbsp;sharing your knowledge with&amp;nbsp;other similar individuals,
Infragistics just may be the place for you. 
&lt;/p&gt;
&lt;p&gt;
Being a community guy, I also like that Infragistics has done and is doing a lot of
community support.&amp;nbsp; We host the local .NET and Java user groups at our HQ.&amp;nbsp;
We often sponsor and send speakers to code camps and tech fests.&amp;nbsp; We sponsor
user groups worldwide, and if you like being involved in the community, Infragistics
goes out of its way to help you in that.&amp;nbsp; And we're always looking for new ways
that we can support our communities, so if you have ideas, shoot them over to me.
&lt;/p&gt;
&lt;p&gt;
Of course, being a geek, I like that Infragistics gives me the opportunity to work
on the latest and greatest technologies.&amp;nbsp; If you're stuck in a job where they're
taking the "safe" course of not upgrading, you&amp;nbsp;won't face&amp;nbsp;that problem here.&amp;nbsp;
In fact, we're challenged to be and stay on the edge of the technological spectrum.
&lt;/p&gt;
&lt;p&gt;
And as an aesthetically sensitive&amp;nbsp;person, I appreciate that Infragistics provides
a good working environment.&amp;nbsp; The building is nice; the work area is nice; the
equipment is nice, and there is a degree of freedom to make your space your own.&amp;nbsp;
If you want to have medieval action figures along the tops of your cube (like I do),
you can do that.&amp;nbsp; Or if you are into feng shui, so be it.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In terms of location, I think it's great.&amp;nbsp; I've &lt;a href="http://dotnettemplar.net/AllSettledIn.aspx"&gt;already
blogged about that&lt;/a&gt;.&amp;nbsp; We're now rounding into fall (already!) and our hottest
temps this summer were a few days of maybe a hundredish.&amp;nbsp; Coming from Tampa,
I can now avow that it in fact does not get (or at least seem) as hot and humid here--it
was stickier when I left Tampa&amp;nbsp;in early&amp;nbsp;May than it got here the entire
summer.&amp;nbsp; And you don't have to worry about &lt;a href="http://devfish.net/fullblogitemview.aspx?blogid=287"&gt;hurricanes&lt;/a&gt;&amp;nbsp;really.&amp;nbsp;
Of course, &lt;a href="http://weblogs.asp.net/wallym/"&gt;Wally&lt;/a&gt; recently counseled me
that I might want to wait until I've lived through a winter before I sing the praises
of the weather, but I'll take a livable summer and cold winter any day over unbearable,
six-month-long&amp;nbsp;summers and mild winters (that don't really even qualify as winters).&amp;nbsp;
I've always said, you can bundle up as much as you need to, but you can only take
so much off!&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
But again, like company culture, I&amp;nbsp;know there are different strokes for different
folks (&lt;a href="http://devfish.net/"&gt;Joe&lt;/a&gt;!). :)&amp;nbsp;&amp;nbsp;The only reason I mention
this is to counteract the common misconception about New Jersey being an undesirable
place to live.&amp;nbsp; If you're into culture, plays, or clubbing, New York City and
Philadelphia are just a stone's throw away by car or train.&amp;nbsp; If you like small
town family feel,&amp;nbsp;we've got that, too; I just went to a butterfly festival with
my family a couple weeks ago, and they've had others (like insect, peach, etc. festivals
all over the place).&amp;nbsp; If you like history, you can't go far without running into&amp;nbsp;some
monument commemorating where Washington&amp;nbsp;did something&amp;nbsp;or where, e.g.,&amp;nbsp;some
of our founding fathers went to college.&amp;nbsp; Shopping?&amp;nbsp; Route 1 is the place
to be (or, again, NYC).&amp;nbsp; Like to travel?&amp;nbsp; The Newark airport is one of the
largest in the US.&amp;nbsp; Compared to the other places I've lived, it fares quite well
on the pros v. cons.&amp;nbsp; So if the "armpit of the US"/Sopranos stereotype is all&amp;nbsp;that's
stopping you from joining us here in central Jersey, don't let it! 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's Available&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Now that I know you're chomping at the bit to work for Infragistics, I guess it wouldn't
hurt to mention the positions we're hiring for. &amp;nbsp;You can see a full list of open
positions&amp;nbsp;on &lt;a href="http://www.infragistics.com/Corporate/Careers/Default.aspx"&gt;our
careers pages&lt;/a&gt;.&amp;nbsp; You'll need to use the quick links to see the list by location.&amp;nbsp;
Yes, we do have more spots open than&amp;nbsp;at our HQ here in NJ, and if those appeal
to you, the more the merrier.&amp;nbsp; But looking specifically at &lt;a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx"&gt;our
HQ openings&lt;/a&gt;&amp;nbsp;(and since this is a developer-oriented blog), I'll highlight
the &lt;a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx#RD"&gt;Sr. R&amp;amp;D
Engineer position&lt;/a&gt; for our .NET web controls.&amp;nbsp; We need someone who is very
strong with web UI development and, of course, .NET.&amp;nbsp; It's a tall order, but
I'm sure you're out there.&amp;nbsp; If you think you're an ASP.NET web UI expert, you
should definitely consider it.&amp;nbsp; That position has challenges that most of us
devs never have to face.
&lt;/p&gt;
&lt;p&gt;
We also have some other dev positions in the &lt;a href="http://www.infragistics.com/corporate/Careers/usnjew.aspx#IS"&gt;internal
systems&lt;/a&gt; department, so if the R&amp;amp;D position doesn't seem like it would fit
you, you might check those out.&amp;nbsp; There is&amp;nbsp;a lot of&amp;nbsp;mobility possible
in this company, so you might start in internal systems and then move to other areas
that you later find more interesting, e.g., evangelism, R&amp;amp;D, etc., as positions
become available.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
It's certainly a fun, interesting, agile, and&amp;nbsp;challenging place to work.&amp;nbsp;
All of these positions involve cutting edge technologies, working with great people,
in a great culture.&amp;nbsp; Maybe you see some other position that's open and interests
you, or even if there isn't a perfect fit on the web site but you think you have something
to offer a company like I've been describing,&amp;nbsp;you can just &lt;a href="mailto:ambrose@infragistics.com"&gt;send
me your resume&lt;/a&gt;, and I'll ensure it gets into the right hands.&amp;nbsp; Yes, we do
have a referral program, and yes, I will take you out to lunch if you get hired on
as my referral.&amp;nbsp; I had to mention that because, hey, you wouldn't believe me
if I said I'm just doing it to help my company (no matter how true it is).&amp;nbsp;:-p
No more waiting.&amp;nbsp; Do it! 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dotnettemplar.net/aggbug.ashx?id=96dd258e-1165-45e9-b4f8-671eb1622c5a" /&gt;</description>
      <comments>http://dotnettemplar.net/CommentView,guid,96dd258e-1165-45e9-b4f8-671eb1622c5a.aspx</comments>
      <category>Miscellaneous</category>
      <category>Technical</category>
    </item>
  </channel>
</rss>