<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10441002</id><updated>2011-12-07T15:59:42.767-05:00</updated><category term='versioning'/><category term='mvc'/><category term='regex'/><category term='Twitter'/><category term='software architecture'/><category term='tech'/><category term='iPhone'/><category term='jQuery'/><category term='DNS'/><category term='javascript'/><category term='email spam'/><category term='agile'/><category term='sql'/><category term='web'/><category term='REST'/><category term='microsoft'/><category term='asp.net'/><category term='career'/><category term='demo'/><category term='Google'/><category term='management'/><category term='.NET'/><category term='database'/><title type='text'>Dave Juth's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10441002.post-5469578091429719705</id><published>2009-11-20T07:33:00.002-05:00</published><updated>2009-11-20T07:56:36.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>ASP.NET MVC Error Handling</title><content type='html'>I wrote a short how-to article about &lt;a target="_blank" href="http://www.davidjuth.com/asp-net-mvc-error-handler.aspx"&gt;trapping unhandled errors in ASP.NET MVC web applications&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5469578091429719705?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5469578091429719705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5469578091429719705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5469578091429719705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5469578091429719705'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/11/aspnet-mvc-error-handling.html' title='ASP.NET MVC Error Handling'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2309377117768225756</id><published>2009-07-15T12:40:00.004-04:00</published><updated>2009-07-15T12:42:54.911-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Website is Back Up</title><content type='html'>Oh. My. Goodness. My website has been down for a couple weeks and I have been away and busy and just not on it. It's back up now. It was down due to a bug in a browsers settings file and the error message and "[No relevant source lines]" made it a little difficult to figure out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2309377117768225756?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com' title='Website is Back Up'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2309377117768225756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2309377117768225756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2309377117768225756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2309377117768225756'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/07/website-is-back-up.html' title='Website is Back Up'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4985094070067685542</id><published>2009-06-19T11:45:00.003-04:00</published><updated>2009-06-19T11:54:30.038-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Google Calendar Sync in iPhone 3.0</title><content type='html'>This is good! It wasn't very straightforward until I found the URL specified on &lt;a href="http://www.google.com/support/calendar/bin/answer.py?answer=99358#ical"&gt;Google's Getting Started with CalDAV&lt;/a&gt; page (see the "&lt;span style="font-style:italic;"&gt;Enable Google Calendar in Apple's iCal&lt;/span&gt;" link). &lt;br /&gt;&lt;br /&gt;Here's how to set up your Google Calendar on your iPhone:&lt;br /&gt;&lt;br /&gt;* On your iPhone, tap on Settings&lt;br /&gt;* Open Mail, Contacts and Calendar&lt;br /&gt;* Tap on Add Account...&lt;br /&gt;* Select Other&lt;br /&gt;* For Server, enter this URL and replace YOUREMAIL@DOMAIN.COM with your Google login/email address:  www.google.com/calendar/dav/YOUREMAIL@DOMAIN.COM/user &lt;br /&gt;* Enter your Google user name and password&lt;br /&gt;* Click the Next button and it will attempt to connect to your Google Calendar and verify that your iPhone is set up correctly.&lt;br /&gt;&lt;br /&gt;Now when you open your iPhone's calendar, you'll see all of your Google Calendar events. Very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4985094070067685542?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.google.com/support/calendar/bin/answer.py?answer=99358#ical' title='Google Calendar Sync in iPhone 3.0'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4985094070067685542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4985094070067685542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4985094070067685542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4985094070067685542'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/google-calendar-sync-in-iphone-30.html' title='Google Calendar Sync in iPhone 3.0'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-9130923121881562106</id><published>2009-06-10T22:06:00.005-04:00</published><updated>2009-06-10T22:19:47.506-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>ZIP Code Lookup with the Google Geocoder</title><content type='html'>I have a client who has ended up (due to a misunderstanding by me) with a list of user registrations having some addresses without ZIP codes. So I decided I could probably fix all of them by using a ZIP code lookup service. The U.S. Postal Service has a web service for this, but after signing up and trying it I decided it was a real pain. The sign up process was a little heavy handed, but worse was the test server they restricted you to using until your "application" was "ready," and then you would need to contact them for access to the real site. &lt;br /&gt;&lt;br /&gt;I figured there must be a better way, so after some searching (including &lt;a href="http://www.programmableweb.com/"&gt;programmableweb.com&lt;/a&gt; and &lt;a href="http://www.data.gov/"&gt;data.gov&lt;/a&gt;), I found that &lt;a href="http://code.google.com/apis/maps/documentation/geocoding/"&gt;Google's Geocoder&lt;/a&gt; can do this.&lt;br /&gt;&lt;br /&gt;So my simple, kind of raw &lt;a href="http://www.davidjuth.com/rest-demo-google-geocoder-zipcode-lookup.aspx"&gt;REST demo of using the Google Geocoder for ZIP code lookup&lt;/a&gt; is working. Useful and simple, take a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-9130923121881562106?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/rest-demo-google-geocoder-zipcode-lookup.aspx' title='ZIP Code Lookup with the Google Geocoder'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/9130923121881562106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=9130923121881562106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9130923121881562106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9130923121881562106'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/zip-code-lookup-with-google-geocoder.html' title='ZIP Code Lookup with the Google Geocoder'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6678355856834647238</id><published>2009-06-10T21:17:00.007-04:00</published><updated>2009-06-10T22:15:54.648-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Make Your Own Twitter Badge with jQuery</title><content type='html'>For the geekily inclined, you can easily &lt;a href="http://www.davidjuth.com/make-your-own-twitter-badge-with-jquery.aspx"&gt;make your own Twitter badge using jQuery and the Twitter API&lt;/a&gt; and display your latest tweets on your website. Step-by-step instructions. Do it now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6678355856834647238?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/make-your-own-twitter-badge-with-jquery.aspx' title='Make Your Own Twitter Badge with jQuery'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6678355856834647238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6678355856834647238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6678355856834647238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6678355856834647238'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/make-your-own-twitter-badge-with-jquery.html' title='Make Your Own Twitter Badge with jQuery'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6223691419557879501</id><published>2009-06-10T17:01:00.006-04:00</published><updated>2009-06-10T21:16:27.810-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Performance of jQuery Selectors in ASP.NET</title><content type='html'>My &lt;a href="http://jutherman.blogspot.com/2007/12/aspnet-control-ids-and-jquery.html"&gt;old post&lt;/a&gt; about the problems with control ids in ASP.NET and using them with jQuery did not describe the small performance hit of using the "ends with selector," e.g., $("input[id$='txtDateStart']"). &lt;a href="http://encosia.com/2009/06/09/11-keystrokes-that-made-my-jquery-selector-run-10x-faster/"&gt;This post at encosia.com&lt;/a&gt; has some good tips for optimizing this a bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6223691419557879501?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6223691419557879501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6223691419557879501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6223691419557879501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6223691419557879501'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/performance-of-jquery-selectors-in.html' title='Performance of jQuery Selectors in ASP.NET'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4823576904385211327</id><published>2009-06-03T22:04:00.006-04:00</published><updated>2009-06-03T22:15:38.975-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery and REST and Flickr and Google Maps Demos</title><content type='html'>My demo page has been updated, massively, over the past few weeks with REST demos using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/djuth/"&gt;Flickr&lt;/a&gt;, the &lt;a href="http://code.google.com/apis/maps/"&gt;Google Maps API&lt;/a&gt; and some other stuff. It's fun but I also want to build up to something more novel and powerful using these techniques. No promises, but fingers crossed that I find time to keep moving forward.&lt;br /&gt;&lt;br /&gt;As far as blogging goes, well, it's been over two years since I've updated this. Doesn't bother me right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4823576904385211327?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/home.aspx' title='jQuery and REST and Flickr and Google Maps Demos'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4823576904385211327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4823576904385211327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4823576904385211327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4823576904385211327'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/jquery-and-rest-and-flickr-and-google.html' title='jQuery and REST and Flickr and Google Maps Demos'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6261954598237874087</id><published>2007-12-12T07:30:00.002-05:00</published><updated>2009-06-03T22:15:13.506-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>ASP.NET Control IDs and jQuery</title><content type='html'>I'm using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt; a lot more for DOM manipulation, UI sugar and general lessening of javascript drudgery. In an aspx page, referencing a control using js is a pain because of how ASP.NET munges the control name. For example, "ddlDate" becomes something like "ctl00_ddlDate." I found lots of articles about this and various approaches, but they all seemed a little too involved or fragile. &lt;br /&gt;&lt;br /&gt;The good news is that the original control name always seems to be preserved at the end of the control id ("always" -- I hope that's correct and so far it's been working). So by using jQuery's &lt;span style="font-family:Courier New;font-weight:700;"&gt;&amp;nbsp;select[id$=&amp;nbsp;&lt;/span&gt; syntax, here is a really simple way to handle this:&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;javascript&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Images/jquery-1.2.1.pack.js&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;javascript&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;  $(document).ready(function(){&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var ddlDate = $("select[id$='ddDateName']");&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var txtStart = $("input[id$='txtDateStart']");&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var txtEnd = $("input[id$='txtDateEnd']")&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt; etc...&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6261954598237874087?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6261954598237874087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6261954598237874087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6261954598237874087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6261954598237874087'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/12/aspnet-control-ids-and-jquery.html' title='ASP.NET Control IDs and jQuery'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3166920101022937049</id><published>2007-10-18T09:07:00.001-04:00</published><updated>2009-06-03T22:14:32.580-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>SQL Server 2005 Management Studio RANT #1</title><content type='html'>Number one of many rants about Management Studio, not #1 as in this is the worst thing about MS, because it's not the worst thing:&lt;br /&gt;&lt;br /&gt;Scripting a database to SQL Server 2000 (i.e. 8.0) format using the Tasks | Generate Scripts feature gives me a nice .sql script file. But when I run it in SQL 2000's Query Analyzer, it fails with syntax errors! Specifically, it's missing open parentheses on multiple lines. You've got to be kidding! &lt;br /&gt;&lt;br /&gt;I know I can fix all of these errors, and I know there are products that do a better job of scripting database schema than Microsoft's own tools. But, this should work.&lt;br /&gt;&lt;br /&gt;If I have time and continue with the many complaints I have about Management Studio, the conclusion is obvious: we need a much better IDE for SQL Server 2005.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3166920101022937049?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3166920101022937049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3166920101022937049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3166920101022937049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3166920101022937049'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/10/sql-server-2005-management-studio-rant.html' title='SQL Server 2005 Management Studio RANT #1'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8319593251030981887</id><published>2007-07-26T14:15:00.001-04:00</published><updated>2009-06-03T22:16:53.440-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft Open Source Website</title><content type='html'>At first I thought &lt;a href="http://www.microsoft.com/opensource/default.mspx"&gt;this&lt;/a&gt; was an April Fool's joke. In July. Just not really sure what to think now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8319593251030981887?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/opensource/default.mspx' title='Microsoft Open Source Website'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8319593251030981887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8319593251030981887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8319593251030981887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8319593251030981887'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/07/microsoft-open-source-website.html' title='Microsoft Open Source Website'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-9175894787142854686</id><published>2007-07-20T09:45:00.000-04:00</published><updated>2007-07-20T09:57:13.135-04:00</updated><title type='text'>Collaborative Editing</title><content type='html'>I like reading &lt;a href="http://www.25hoursaday.com/weblog/default.aspx"&gt;Dare Obasanjo's&lt;/a&gt; blog. Though he is frequently too pro-Microsoft and, as one would expect, anti most-of-the-rest, he raises interesting issues and his counter arguments to much of the web zeitgeist is insightful. But I'm not sure why &lt;a href="http://www.25hoursaday.com/weblog/2007/07/17/NoteToSoftwareVendorsTheWorldIsCollaborativeAndLooselyCoupled.aspx"&gt;he  can't use something besides MS Word&lt;/a&gt; to edit a document with his coworkers.&lt;br /&gt;&lt;br /&gt;One of his usual targets, Google, offers &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt;, which is a great way to collaborate with a small team. I have used this to collaboratively edit documents, and I like it a lot for small group collaboration. And it's only one of maybe a hundred or more different web-based solutions for collaborative editing. &lt;br /&gt;&lt;br /&gt;The irony, of course, is that Dare is pointing out a key shortcoming of the traditional and still present Microsoft way. That is, fat-client, file-based solutions to things. Maybe that is still the problem with many of the Microsofties (and I certainly see this from time to time with people I know well who have a strong Microsoft background) and with the company in the larger sense -- that the web is still this thing that they don't feel too comfortable embracing to solve typical problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-9175894787142854686?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/9175894787142854686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=9175894787142854686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9175894787142854686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9175894787142854686'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/07/collaborative-editing.html' title='Collaborative Editing'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8172869148600013715</id><published>2007-05-02T09:11:00.000-04:00</published><updated>2007-05-02T09:20:32.835-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email spam'/><title type='text'>Guerrilla Spam Filtering</title><content type='html'>We use Exchange and Outlook at the office for email, like too many organizations in the world. However, we have (I am embarrassed to say) not been using any spam filtering service or appliance. The result is that junk mail rolls in heavily each day. &lt;br /&gt;&lt;br /&gt;In Outlook, you can create rules and I have a billion of them to filter out keywords and known sources of spam (to the extent that that is effective). It is an OK 80% solution. But when I'm away and using Outlook Web Access, none of my desktop Outlook rules are applied. &lt;br /&gt;&lt;br /&gt;So my solution has been to leave Outlook running on my desktop at work. Then, when I run OWA my inbox is cleaned to the 80% level that my Outlook rules accomplish. This is not recommended and is not a good spam filtering strategy, but it actually works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8172869148600013715?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8172869148600013715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8172869148600013715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8172869148600013715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8172869148600013715'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/05/guerrilla-spam-filtering.html' title='Guerrilla Spam Filtering'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5655711081655671074</id><published>2007-04-03T08:18:00.001-04:00</published><updated>2009-06-03T22:16:11.666-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>ASP.NET Master Page Title</title><content type='html'>There are a lot of articles about how to programmatically set the title for pages on a web site, such as &lt;a href="http://www.odetocode.com/Articles/419.aspx"&gt;this one&lt;/a&gt; at &lt;a href="http://www.odetocode.com/"&gt;odetocode.com&lt;/a&gt;. But I need to do something much more mundane -- set the title for ALL pages on my website to be the same but optionally, to be able to programmatically override the title for any web page.&lt;br /&gt;&lt;br /&gt;The straightforward way to use the same title for all pages if you are using master pages is to 1) set the &amp;lt;title&amp;gt; in the master page's HTML and 2) remove it from every content page's page directive. That works great. But I want to make this a little easier to maintain, so I hooked this into my site's base page and use web.config to maintain the site's title.&lt;br /&gt;&lt;br /&gt;My site's base page (BasePage), from which all of my site's pages are derived, is declared like this:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;BasePage&lt;/span&gt; : System.Web.UI.&lt;span style="color: teal;"&gt;Page&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the BasePage constructor, I get the site's title from web.config and trap for any exception:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; BasePage()&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Title = &lt;span style="color: teal;"&gt;WebConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style="color: maroon;"&gt;"SiteTitle"&lt;/span&gt;];&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: teal;"&gt;Exception&lt;/span&gt; ex)&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.&lt;span style="color: teal;"&gt;Trace&lt;/span&gt;.WriteLine(ex.Message);&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Title = &lt;span style="color: maroon;"&gt;"My Site"&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This also allows me to forget about manually removing "Untitled Page" from the page directive in every content page. To programmatically set the title, should I need to, I expose a property that prevents setting it to blank (or to the default Visual Studio .NET setting):&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Title&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Title;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt;.Trim().Length &amp;gt; 0 &amp;amp;&amp;amp; &lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: maroon;"&gt;"Untitled Page"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Title = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, to maintain my site's title, I just set it in web.config:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;key&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;SiteTitle&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;My Site&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So this gives me a fairly clean way to maintain my site's title and also to override it per content page should I need to. For example, my contact page can append " - Contact Us" to the existing title by modifying the base page's Title property in Page_Load. &lt;br /&gt;&lt;br /&gt;Seems like a lot of work for something so simple. I'm sure there may be a cleaner way, but for now this seems fairly good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5655711081655671074?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5655711081655671074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5655711081655671074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5655711081655671074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5655711081655671074'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/04/aspnet-master-pages-and-titles.html' title='ASP.NET Master Page Title'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2508288652349555988</id><published>2007-03-21T13:49:00.001-04:00</published><updated>2009-06-03T22:16:33.664-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>Visual Studio Find using RegEx</title><content type='html'>Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargh!&lt;br /&gt;&lt;br /&gt;Why couldn't Microsoft make the regex search use some existing regex dialect? Maybe they did (randomly!) pick one, but &lt;span style="font-weight: bold;"&gt;it's not the regex dialect they use in the .NET Framework&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I admit to always finding another way when faced with searching for something like the following lines (which happens to be a task for me today), but I'm keen to do it more easily:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;PROCEDURE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PROCEDURE &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So using Microsoft's VS.NET syntax, it's this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     ^create:Zs+procedure&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's good to know: &lt;span style="font-weight:bold;"&gt;:Zs is a SPACE&lt;/span&gt;, and &lt;span style="font-weight:bold;"&gt;:Zs+ is ONE OR MORE SPACES&lt;/span&gt;. And if I want to find these:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;TABLE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FUNCTION&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;VIEW&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     ^create:Zs+:w&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So &lt;span style="font-weight:bold;"&gt;:Zs+:w is ONE OR MORE SPACES FOLLOWED BY A WORD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And I'm going to refer back to this post because I won't remember this two months from now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2508288652349555988?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2508288652349555988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2508288652349555988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2508288652349555988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2508288652349555988'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/visual-studio-find-using-regex.html' title='Visual Studio Find using RegEx'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4730127365588731683</id><published>2007-03-14T14:38:00.000-04:00</published><updated>2007-03-14T15:03:39.318-04:00</updated><title type='text'>Durable Information</title><content type='html'>Email is a wonderful way to communicate. I keep in touch with people I would have long ago neglected because of it. It's almost free. It's fast. It's super convenient. It's flexible, and allows me to send not just my words, but pictures, files, links and even viruses if I'm irresponsible. It's fairly private, and can be totally secure if I choose the right provider and tools. OK, spam is a nightmare, but more or less, email is a great thing for communicating.&lt;br /&gt;&lt;br /&gt;Unfortunately, email doesn't cut it for storing &lt;span style="font-weight: bold; font-style: italic;"&gt;information that is durable&lt;/span&gt;, a phrase that I'm sort of adopting or making up for the context of this post. By durable I mean the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It needs to be found later by someone other than the email sender or recipient&lt;/li&gt;&lt;li&gt;It constitutes a record of a decision or other important information that is of interest to a group outside of the email sender or recipient&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is "owned" by someone other than the email sender or recipient.&lt;/li&gt;&lt;/ul&gt;So rather than elaborating on these cryptic bullet points, here's an example...&lt;br /&gt;&lt;br /&gt;I work on a small software project (I am the sole developer) for a client of my employer. The client and I communicate frequently about the state of project tasks, why certain things aren't meeting his needs, etc. This goes on over the course of one "release" of the project, or about six weeks. He emails me, I respond, he responds, etc. Then I find a problem, I fire off a message, he ignores it, we revisit it a month later without remembering much about it... and on and on.&lt;br /&gt;&lt;br /&gt;This is typical small company project management, which is to say, it's not being managed. The only way to get a complete picture of what was decided, how it was interpreted, what is left to do, how to login to the FTP server -- whatever -- is to sift through and piece together artifacts from the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My inbox&lt;/li&gt;&lt;li&gt;My sent items&lt;/li&gt;&lt;li&gt;The client's inbox&lt;/li&gt;&lt;li&gt;The client's sent items&lt;/li&gt;&lt;li&gt;Our IM logs&lt;/li&gt;&lt;li&gt;Some documents squirreled away on my company's network&lt;/li&gt;&lt;li&gt;His [My Documents] folder&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;The basic question when people default to blasting emails to think they are communicating effectively is this: &lt;span style="font-weight: bold;"&gt;Who OWNS THE INFORMATION? &lt;/span&gt;I would say the client and my company own the information, not me. So why would I think just leaving it in my inbox is appropriate?&lt;br /&gt;&lt;br /&gt;Yes, my company owns my inbox, but that is not the point. The issue is how to reduce the friction created by my laziness. That my company owns the information that I am mismanaging means I am obligated to store these bits of decisions and communications in such a way that it can be found. Found by my managers, auditors, the next developer who takes on this project after I'm on another, the client, QA people so they can tweak a test plan et. al.&lt;br /&gt;&lt;br /&gt;At the very least, emails should be saved off to a public folder. This is a pain, however. A good project management tool (such as &lt;a href="http://www.basecamphq.com/"&gt;basecamp&lt;/a&gt;) is much preferred for aggregating this type of communication and preserving it. Email should be used for notification or quick comments. Anything more long-lived than spur-of-the-moment has to be put somewhere else. Then it can be searched, prioritized, validated, transferred and generally managed. Durable information, not fleeing bits of conversation scattered across multiple inboxes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4730127365588731683?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4730127365588731683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4730127365588731683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4730127365588731683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4730127365588731683'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/durable-information.html' title='Durable Information'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5377931228930701338</id><published>2007-03-13T13:16:00.000-04:00</published><updated>2007-03-13T20:57:14.433-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Harder to Type, Easier to Maintain</title><content type='html'>One of my favorite software books, &lt;a href="http://www.construx.com/Page.aspx?hid=535"&gt;Steve McConnell&lt;/a&gt;&lt;a href="http://www.construx.com/Page.aspx?hid=535"&gt;'s&lt;/a&gt; &lt;a href="http://www.amazon.com/Complete-Microsoft-Programming-Steve-McConnell/dp/1556154844"&gt;Code Complete&lt;/a&gt;, rails against hard-coded strings because they make an application difficult to maintain. At "typing time," it's the easiest and quickest way to do things. Thereafter, though, you've created a debt that you will pay down for the life of a project.&lt;br /&gt;&lt;br /&gt;When we work with DataSets, DataTables and other means of packaging data, it is hard to avoid littering code with literal strings that represent column names. This is not helped by our tools -- how hard would it have been for Microsoft to expose an &lt;a href="http://en.wikipedia.org/wiki/Enumerated_type"&gt;enum&lt;/a&gt; for column names from a &lt;a href="http://msdn2.microsoft.com/en-us/system.data.datatable.aspx"&gt;DataTable&lt;/a&gt; object in a generated typed &lt;a href="http://msdn2.microsoft.com/en-us/system.data.dataset.aspx"&gt;DataSet&lt;/a&gt;? (And why is "&lt;span style="font-style: italic;"&gt;strongly-typed DataSet&lt;/span&gt;" preferred over &lt;span style="font-style: italic;"&gt;"typed DataSet&lt;/span&gt;"?)&lt;br /&gt;&lt;br /&gt;Several years ago, when I first started using .NET, I created an database column enum and constants generator. Point it to a database and let it generate enums or constants (in C# or VB.NET) for every table and view, or pick the ones you want. It's part of the suite of tools I use to create the data layer and business layer in my applications.&lt;br /&gt;&lt;br /&gt;It's a simple thing. So instead of writing code like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[\cf13 "LastName"\cf0 ] = \cf13 "Smith"\cf0 ;\par ??        dRow[\cf13 "FirstName"\cf0 ] = \cf13 "Bob"\cf0 ;} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   30&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[&lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"LastName"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Smith"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   31&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[&lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"FirstName"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Bob"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;br /&gt;I can write it like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[\cf13 "LastName"\cf0 ] = \cf13 "Smith"\cf0 ;\par ??        dRow[\cf13 "FirstName"\cf0 ] = \cf13 "Bob"\cf0 ;} --&gt; &lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[CustomerColumn.LastName] = \cf13 "Smith"\cf0 ;\par ??        dRow[CustomerColumn.FirstName] = \cf13 "Bob"\cf0 ;\par ??} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   30&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[CustomerColumn.LastName] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Smith"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   31&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[CustomerColumn.FirstName] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Bob"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;br /&gt;A typical application is going to have references to columns in many places:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Assigning values to columns&lt;/li&gt;&lt;li&gt;Persisting data&lt;/li&gt;&lt;li&gt;Filtering (using the DataTable's &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.Select&lt;/span&gt;&lt;/span&gt; method or a DataView's &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.RowFilter&lt;/span&gt;&lt;/span&gt; property)&lt;/li&gt;&lt;li&gt;Sorting&lt;/li&gt;&lt;li&gt;Ad-hoc querying&lt;/li&gt;&lt;li&gt;Data binding and other tasks above in the designer for a form or web control&lt;/li&gt;&lt;/ul&gt;Aside from the visual designer code, giving up hard-coded strings for enums or constants is a very small change to make. &lt;del&gt;If&lt;/del&gt; When your database schema changes, just regenerate the source file for the enums/constants and fix up your code. &lt;span style="font-weight: bold; font-style: italic;"&gt;Most changes will now break the application at compile time&lt;/span&gt;,&lt;span style="font-weight: bold; font-style: italic;"&gt; not run time&lt;/span&gt;. This makes it trivial to identify and fix these issues. A large application with thousands of references and many developers just cannot be maintained with hard-coded strings for column names. &lt;span style="font-weight: bold; font-style: italic;"&gt;Catching these errors at run time requires 100% code coverage, and happens way too far downstream to NOT lose you money&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;GridViews and other designer-based code may still be a chore, but you're not making things worse because that's how they are whether or not the rest of your source code has hard-coded values.&lt;br /&gt;&lt;br /&gt;Does "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;LastName&lt;/span&gt;&lt;/span&gt;" look nicer than &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;CustomerColumn.LastName&lt;/span&gt;&lt;/span&gt;? Probably. Is "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;LastName&lt;/span&gt;&lt;/span&gt;" easier to type? I'd say so. But it creates a mess, one that too many developers are keen to accept, unfortunately. Keep in mind, what I'm talking about here is for developers who haven't adopted &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;object relational mapping&lt;/a&gt; or other means of encapsulating and abstracting object data. If you're still using DataSets and DataTables, you need to consider the &lt;span style="font-weight: bold;"&gt;friction &lt;/span&gt;your are accepting by hard-coding string column names, primary keys, default values, filters and so forth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5377931228930701338?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5377931228930701338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5377931228930701338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5377931228930701338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5377931228930701338'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/harder-to-type-easier-to-maintain.html' title='Harder to Type, Easier to Maintain'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8650768580340798337</id><published>2007-03-12T07:37:00.000-04:00</published><updated>2007-03-13T09:13:49.843-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Agile FUD</title><content type='html'>Why do some people argue as though "agile" is some grand methodology, a prescribed process, comes with a big book and a two week training course and has a rigid set of mantras? It doesn't as best I can tell. I have adopted some agile practices in my daily routine, such as unit testing (though not TDD as of now), intensive refactoring, simple and frequent communication and continuous integration. There are a lot of agile practices that I do not have the expertise to try right now, or the right projects to try them on or the right team to try them with. I am basically fitting what I can into my current environment, reading all I can and reexamining every month or so to identify what else I can apply or do differently.&lt;br /&gt;&lt;br /&gt;I think this is the whole point of agile. That is, there is no one prescribed way. Rather, there are principles or fundamentals, and the practices reflect these in a sort of toolbox approach. And above all, the personnel involved are intelligent and experienced enough to use these things to improve how they create software and in turn improve the software they create.&lt;br /&gt;&lt;br /&gt;For example, sometimes we have projects that are remediation types of engagements. In other words, we are hired to fix something and it may last for a month. Can I do TDD? Should I set up a continuous integration server? It depends. I have enough experience to know which tools to apply to solve this problem.&lt;br /&gt;&lt;br /&gt;So when I read &lt;a href="http://www.secretgeek.net/agile_v_tdd.asp"&gt;something like this&lt;/a&gt; that portrays agile as some all-or-nothing "methodology," it makes me wonder first, if people like this are using some prescribed methodology already or instead have none whatsoever, and second, if they aren't just looking for a way to bash these ideas by portraying them as something they are not. That post at &lt;a href="http://www.secretgeek.com/"&gt;secretgeek&lt;/a&gt; makes it sound as though agile is loaded with ideas that contradict each other. I don't think this is the gist at all.&lt;br /&gt;&lt;br /&gt;One tool from the toolbox that has had a huge impact on how I write code is designing for testability. This is one of the first things I consider when creating any code. It forces me to think about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to structure the solution in Visual Studio .NET&lt;/span&gt;. I always create a "&lt;namespace&gt;.Tests" project in addition to the main project (it used to be ".Test" until one of the versions of the &lt;/namespace&gt;Test Driven .NET add-in for VS.NET &lt;namespace&gt;caused problems in projects named this way). Instead of creating some goofy form to drive my tests and therefore requiring me to manually test each time I make changes, all of my public methods can be launched through my unit tests. Right-click, Run Tests. Low stress. This is pretty standard stuff.&lt;br /&gt;&lt;/namespace&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to design a class&lt;/span&gt;. When thinking about how to test it, you must immediately consider what the constructor does, how to initialize state, whether a static class is a good idea for the scenario, etc. Having to change these things later puts you into a much more defensive mentality, where you feel like you are constantly catching up and rethinking very basic design decisions. Again, pretty standard. Thinking about testing forces better design decisions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to design its interface&lt;/span&gt;. When you know how your class can be used (i.e., because you thought about "exercising" it with unit tests at the outset), your &lt;a href="http://en.wikipedia.org/wiki/Interface_%28computer_science%29"&gt;interfaces&lt;/a&gt; are much cleaner and more consistent throughout a project.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How and where to initialize and destroy resources&lt;/span&gt;. Basic stuff, but again, having to tweak things later can be annoying, and being inconsistent has subtle implications for &lt;a href="http://en.wikipedia.org/wiki/Robustness"&gt;robustness&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Where to stash configuration information so that it is accessible in a very flexible way&lt;/span&gt;. Does the class need a SqlConnection? How do you provide it? Do you have different databases for development, testing, staging, performance testing and production? Instead of cluttering the class with code that accepts these, is it better to make it config-based? If you do, your ".Tests" project needs to be defined a certain way with its own config file, etc...&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How NUnit can automatically run my unit tests to help me control regression&lt;/span&gt;. Now that you've thought through these other things, everything is set up to do this. You can make changes and perform major refactoring at will and know what the health of your application is.&lt;/li&gt;&lt;/ul&gt;The principle here is that these things enable me to set up my project to accommodate change and ensure quality is built in from the start of the project. That's the fundamental requirement to doing these things.&lt;br /&gt;&lt;br /&gt;Pretty standard stuff. I am amazed that it's still not universal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8650768580340798337?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8650768580340798337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8650768580340798337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8650768580340798337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8650768580340798337'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/agile-fud.html' title='Agile FUD'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3269447060578126198</id><published>2007-03-09T11:20:00.001-05:00</published><updated>2009-06-03T22:17:16.771-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>ASP.NET 2.0 DataBinding Redux</title><content type='html'>In a &lt;a href="http://jutherman.blogspot.com/2007/02/aspnet-objectdatasource-and-business.html"&gt;previous post&lt;/a&gt; I mentioned my skepticism about using ObjectDataSource to bind business objects in ASP.NET 2.0. My desire to "implement some well-defined interfaces in our business objects and just have this stuff work" is touched on by the &lt;a href="http://www.entityspaces.net/blog/MicrosoftRuinedDataBindingInASPNET20WhenTheyDroppedComponentSupportFromTheDesignSurface.aspx"&gt;EntitySpaces&lt;/a&gt; guys, but it's more than just what I mentioned and it's touched a nerve.&lt;br /&gt;&lt;br /&gt;I think the musings that Microsoft may have yanked what support there was for design-time data binding in 2.0 in order to develop their own ORM functionality in ADO.NET v.next is likely correct. Just like Sandcastle-NDoc, Team System-NUnit-NAnt and the other things &lt;a href="http://jutherman.blogspot.com/2006/12/open-source-vs-microsoft.html"&gt;I mentioned previously&lt;/a&gt;, it seems Microsoft is going to go their own way and quash a good portion of the open source efforts to build on their tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3269447060578126198?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3269447060578126198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3269447060578126198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3269447060578126198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3269447060578126198'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/aspnet-20-databinding-redux.html' title='ASP.NET 2.0 DataBinding Redux'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-7375947805697284891</id><published>2007-03-09T10:03:00.000-05:00</published><updated>2007-03-09T10:21:38.942-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='versioning'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>SQL 2005 Script Files and VSS</title><content type='html'>Using Microsoft Visual SourceSafe 6.x and Microsoft SQL Server Management Studio (for SQL Server 2005) is a bit of a pain for scripting database changes. One problem is if you don't save the script file as ANSI, VSS cannot use its diff feature to show you the results. It will simply say, "Binary files differ." You need to save it as ANSI, since that's all VSS 6.x supports for visual diffs.&lt;br /&gt;&lt;br /&gt;To save your .sql files as ANSI:&lt;ul&gt;&lt;li&gt;Instead of just clicking the Save button, select File | Save As...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s1600-h/sql05_saveas.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s320/sql05_saveas.JPG" alt="" id="BLOGGER_PHOTO_ID_5039941497299916738" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Click the little arrow on the Save button and choose Save with Encoding...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_U8FDkosc-vc/RfF6IMtP2BI/AAAAAAAAAA0/ajGIzKPX2SU/s1600-h/sql05_saveencoding.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_U8FDkosc-vc/RfF6IMtP2BI/AAAAAAAAAA0/ajGIzKPX2SU/s400/sql05_saveencoding.JPG" alt="" id="BLOGGER_PHOTO_ID_5039943739272845330" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Select the encoding and the line options, then click OK.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_U8FDkosc-vc/RfF5BctP1-I/AAAAAAAAAAc/SS8Jgj0lu44/s1600-h/sql05_saveasfinal.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_U8FDkosc-vc/RfF5BctP1-I/AAAAAAAAAAc/SS8Jgj0lu44/s320/sql05_saveasfinal.JPG" alt="" id="BLOGGER_PHOTO_ID_5039942523797100514" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Then you can check the .sql file into VSS. Subsequent edits will &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;require you to go through all of these dialogs to properly save the file. Management Studio will use the file's current encoding and line break settings thereafter, so you can just (thankfully) click Save.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-7375947805697284891?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/7375947805697284891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=7375947805697284891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7375947805697284891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7375947805697284891'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/sql-2005-script-files-and-vss.html' title='SQL 2005 Script Files and VSS'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s72-c/sql05_saveas.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-1406202752102897138</id><published>2007-03-08T22:06:00.000-05:00</published><updated>2007-03-08T22:20:27.832-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>RFPs</title><content type='html'>Interesting take on RFPs at &lt;a href="http://www.airbagindustries.com/archives/airbag/scope.php"&gt;airbag&lt;/a&gt;. We have been occupied with some proposals recently, and I have to agree this is rarely a very fruitful way to land new business. So many of these RFPs are really for one or more of the following purposes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The company sending it out can satisfy some requirement that they found a consultant in a competitive manner&lt;/li&gt;&lt;li&gt;They've already found a consultant and need to appear that they did it in a competitive manner&lt;/li&gt;&lt;li&gt;They are looking for the lowest cost bidder and that is their top priority&lt;/li&gt;&lt;li&gt;They are not clear about what they want and are soliciting ideas through the RFP process.&lt;/li&gt;&lt;/ul&gt; The last point is actually positive, in my opinion. If you work for a consulting firm who has the capability that they are seeking, at least generally, the RFP can open the door for a dialog. If you are sharp and experienced, you can put some good ideas on their table. Responding to an RFP without having that dialog is rarely productive.&lt;br /&gt;&lt;br /&gt;Some of the comments to the airbag post really hit home:&lt;br /&gt;&lt;blockquote&gt;"The problem is rarely defined and the client usually has a vendor and solution already in mind."&lt;br /&gt;&lt;br /&gt;"They take a lot of time, you only have a marginal chance of winning the work. It really just drives your overhead up with a lot of non-billable work, making the clients that didn't send you a RFP essentially pay more."&lt;br /&gt;&lt;br /&gt;"The traditional RFP process is damn near a no-win situation for us. We ran the numbers and we've got a horrible track record when it comes to winning work of an RFP. Given the time it takes to address them (much more than other ways of bringing work in) we've realized that RFPs aren't really something we should be spending a whole lot of time on."&lt;br /&gt;&lt;br /&gt;"Submitting a "proposal" of any sorts before there's been any communication is akin to ordering a bride online. It may work for some people but it's unlikely they'll have a relationship that'll last. Too much room for misunderstandings and miscommunications."&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-1406202752102897138?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/1406202752102897138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=1406202752102897138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1406202752102897138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1406202752102897138'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/rfps.html' title='RFPs'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8267553317158810960</id><published>2007-03-06T12:40:00.000-05:00</published><updated>2007-03-06T13:01:56.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Software Design's Dirty Little Secret</title><content type='html'>We spend a lot of time wringing our hands about how to do a better job gathering requirements. I think &lt;a href="http://www.designobserver.com/archives/017485.html"&gt;this bit&lt;/a&gt; reflects a very common scenario in how we convince clients that we're experts, and how things really end up going. We put forth some process or methodology that sounds impressive, like it's really going to squeeze every bit of uncertainty out of the project as early as possible and lead us down a clean, straight trail to the solution. Utter crap, yet we continue to push it because &lt;span style="font-style: italic;"&gt;that is what clients demand we tell them&lt;/span&gt;. So the &lt;a href="http://www.designobserver.com/"&gt;Design Observer&lt;/a&gt; lets us in on a version of the dirty little secret, one that applies in good part to software design as well:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;When I do a design project, I begin by listening carefully to you as you talk about your problem and read whatever background material I can find that relates to the issues you face. If you’re lucky, I have also accidentally acquired some firsthand experience with your situation. Somewhere along the way an idea for the design pops into my head from out of the blue. I can’t really explain that part; it’s like magic. Sometimes it even happens before you have a chance to tell me that much about your problem! Now, if it’s a good idea, I try to figure out some strategic justification for the solution so I can explain it to you without relying on good taste you may or may not have. Along the way, I may add some other ideas, either because you made me agree to do so at the outset, or because I’m not sure of the first idea. At any rate, in the earlier phases hopefully I will have gained your trust so that by this point you’re inclined to take my advice. I don’t have any clue how you’d go about proving that my advice is any good except that other people — at least the ones I’ve told you about — have taken my advice in the past and prospered. In other words, could you just sort of, you know...trust me?&lt;/span&gt;&lt;/blockquote&gt;So, is that how it really goes? Well, most of the time, it sort of goes that way. It has to. If custom software development were not so nebulous and prone to reexamination and modification at every step, it wouldn't be custom software. In other words, you would instead solve your well-defined problem by going to CompUSA and buying a solution for $79.99. The next alternative would be to modify your problem so it could be solved by the $79.99 solution. Some people do just that, and successfully. Using Microsoft Excel is a good example. It's probably the most widely used database application on the planet, though it was never intended to be a database.&lt;br /&gt;&lt;br /&gt;If you want truly custom software to help manage a truly unique problem (and lots of people have such a need), you should know what it takes. &lt;span style="font-weight: bold; font-style: italic;"&gt;Creativity&lt;/span&gt;. A &lt;span style="font-style: italic;"&gt;prescribed process&lt;/span&gt; can't get you 100% of the way there. You must be willing to accept at least a good portion of the process to be &lt;a href="http://en.wikipedia.org/wiki/Empirical"&gt;&lt;span style="font-style: italic;"&gt;empirical&lt;/span&gt;&lt;/a&gt;. That means it's not clean, it's not predictable and it's not going to make you comfortable.&lt;br /&gt;&lt;br /&gt;When a prospective consulting firm approaches you and claims they have a neat, linear, sequential process that they have proven over countless years, they are setting your expectations in such a way that you are likely to be frustrated. In other words, they are partially to completely full of crap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8267553317158810960?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8267553317158810960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8267553317158810960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8267553317158810960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8267553317158810960'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/software-designs-dirty-little-secret.html' title='Software Design&apos;s Dirty Little Secret'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4639252083559177203</id><published>2007-02-27T07:09:00.000-05:00</published><updated>2007-02-27T07:53:16.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><title type='text'>Software Architecture - Why it Matters</title><content type='html'>I have worked with a few people over the years whom I would describe as the "just get it done and soon" type. These guys (these few have all been men) eschew putting much thought into the software they build, or thinking about &lt;a href="http://en.wikipedia.org/wiki/Kaizen"&gt;kaizen&lt;/a&gt; or continuous improvement. Working with them is frustrating because they tend to create systems that are better torn down than modified. In other words, thanks to their myopia and/or hubris (to the sales manager: "sure, we can do that in two weeks!"), the software they build has massive design debt and huge costs to maintain. (I am not going to get into the other extreme right now -- the guys who suffer from analysis paralysis -- but that, too, can be a big yet much different problem...)&lt;br /&gt;&lt;br /&gt;The well known benefits of good design are written about throughout the software development world. But the one benefit that may be most important is this: &lt;span style="font-weight: bold;"&gt;good software architecture is&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;motivational&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Working for a company that supports thoughtful software design ignites pride. Having people at all levels of a company that understand what good architecture is makes this possible. For me personally, it is a rush knowing that everyone from developers on my team to the CEO understands that this philosophy contributes to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A positive perception of our product&lt;/li&gt;&lt;li&gt;Motivation among the team, and&lt;/li&gt;&lt;li&gt;Increased profitability.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Motivation and internal pride glue together the customer satisfaction and financial sides of the business. &lt;span style="font-weight: bold;"&gt;Good software architecture is necessary to have a successful software business&lt;/span&gt;. Customer satisfaction and long term financial health are keys to "success," in my opinion. That's not all that defines success, but for me those two things are required.&lt;br /&gt;&lt;br /&gt;I have seen the architecture weenies that get so bogged down in design issues that they make slow and pained progress. However, that is usually when they are in an organization that is unbalanced and indulges them because it lacks good business people. It is more often, in my experience, that the siren song of "just get it done now, it's good enough" can influence people in almost any organization, and is therefore more dangerous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4639252083559177203?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4639252083559177203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4639252083559177203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4639252083559177203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4639252083559177203'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/software-architecture-why-it-matters.html' title='Software Architecture - Why it Matters'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5869139599185742349</id><published>2007-02-26T07:49:00.000-05:00</published><updated>2007-02-26T07:50:31.123-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Adding Google Maps to your Site</title><content type='html'>Good &lt;a href="http://www.hanselman.com/blog/GoogleGuestMap2007AndAddingGoogleMapsToYourSite.aspx"&gt;post&lt;/a&gt; (yet another) from Scott Hanselman.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5869139599185742349?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.hanselman.com/blog/GoogleGuestMap2007AndAddingGoogleMapsToYourSite.aspx' title='Adding Google Maps to your Site'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5869139599185742349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5869139599185742349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5869139599185742349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5869139599185742349'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/adding-google-maps-to-your-site.html' title='Adding Google Maps to your Site'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-7191715653784847580</id><published>2007-02-23T13:14:00.001-05:00</published><updated>2009-06-03T22:14:52.670-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>OpenDNS</title><content type='html'>Scott Hanselman has a great &lt;a href="http://www.hanselman.com/blog/OpenDNS.aspx"&gt;post&lt;/a&gt; about &lt;a href="http://www.opendns.com/"&gt;OpenDNS&lt;/a&gt; which goes beyond what I know about it. However, a couple weeks ago I began using it due to frustrating issues with my ISP, and I think it's a good alternative to know about.&lt;br /&gt;&lt;br /&gt;I live in an area that technological time has largely ignored. I like it that way except for needing seriously fast internet access. For the first year and a half, I used (and will not put a hyperlink to) Direcway, or HughesNet as they are now called. A satellite ISP. It was better than dial-up, and that is all I can say about it without bashing it.&lt;br /&gt;&lt;br /&gt;Last summer I found out some of my neighbors used a local wireless ISP, which has several towers around the northern Shenandoah valley and will install an antenna for you to connect to its 802.11b access points. I am thirteen miles away from the nearest tower, but since I am 500 feet above the Shenandoah valley floor, I have a line of site to it. They hooked it up and it worked. It worked really well. The speed varies between 1mbs and 11mbs. A lot of the issues with satellite went away, such as weird timeouts with MS Outlook Web Access and the unholy bandwidth throttling (aka "Fair Access Policy"). Good riddance, satellite!&lt;br /&gt;&lt;br /&gt;All seemed good for a while, but then I started having occasional trouble connecting. My calls to their tech support would usually end up with them saying, "we can ping your antenna, why don't you power it off and back up." Often that fixed the problem, but not always. Usually after some time things would work again. But I was getting really peeved with the lack of reliability.&lt;br /&gt;&lt;br /&gt;I noticed one day that when opening a new tab in &lt;a href="http://www.mozilla.com/firefox"&gt;Firefox&lt;/a&gt; and experiencing the connection problems, some of my other tabs would still connect to their respective URLs. That made me think that this must be a DNS problem on my ISP's end.&lt;br /&gt;&lt;br /&gt;I stumbled across OpenDNS in a podcast I was listening to (something from &lt;a href="http://www.itconversations.com/"&gt;ITConversations&lt;/a&gt;, can't remember which podcast right now though). I modified my router's DNS configuration to use OpenDNS's servers instead of my ISP's. That was almost a month ago and my "connectivity" problems have not occurred since. So +1 for OpenDNS, and thanks to Scott for a lot more helpful info about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-7191715653784847580?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/7191715653784847580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=7191715653784847580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7191715653784847580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7191715653784847580'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/opendns.html' title='OpenDNS'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6811974974791196397</id><published>2007-02-18T06:20:00.001-05:00</published><updated>2009-06-03T22:21:33.769-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>ASP.NET ObjectDataSource and Business Objects</title><content type='html'>This past Friday's &lt;a href="http://msdn.microsoft.com/chats/"&gt;ASP.NET MVP Chat&lt;/a&gt; was very good, a lot of participation by well known experts. I learned a lot just sticking around reading both the experts' answers and the side banter.&lt;br /&gt;&lt;br /&gt;Anyway, one issue that has been bugging me is whether to use declarative data binding in ASP.NET 2.0. So I asked &lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott Guthrie&lt;/a&gt; if it was really a prime time thing or just something to "give good demo." He and &lt;a href="http://www.4guysfromrolla.com/"&gt;Scott Mitchell&lt;/a&gt; both suggested it's the way to go, so I poked around and found the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asp.net/learn/dataaccess/default.aspx?t%20abid=63"&gt;ASP.NET 2.0 Data Tutorials&lt;/a&gt;&lt;br /&gt;&lt;a href="http://peterkellner.net/2006/09/18/expressionbuilderidentity/"&gt;Peter Kellner's SQLDataSource Comments&lt;/a&gt;&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/brendan.tompkins/archive/2006/05/11/144539.aspx"&gt;Brendan Tompkins ObjectDataSource/GridView Experience&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/aspnet/DataTableAdapter.asp"&gt;DataTableAdapter Article at CodeProject&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lhotka.net/WeBlog/PermaLink.aspx?guid=c3293240-88c8-4f03-b4e3-01cef6ed1304"&gt;Rocky Lhotka's ObjectDataSource Frustration&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am not liking what I see.&lt;br /&gt;&lt;br /&gt;The gist of all this seems to be that the ASP.NET 2.0 data binding controls are fine for ADO.NET data objects, but when you have custom business objects, a lot of coding jujitsu may be required. In other words, not only are you &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;saving time because you have to code a fair bit to make things like sorting and filtering work, but you are taking a leap of faith that the magic stuff being done for you behind the scenes is going to just work. The posts on the ASP.NET forums indicate a lot of issues that may consume quite a bit of time to debug. Again, it seems like for ADO.NET data objects, it works mostly, but for custom business objects, the jury is out.&lt;br /&gt;&lt;br /&gt;Peter Kellner's experience (above) is another twist. To use SqlDataSource when a query requires filtering based on the current user id (a pretty common requirement), he documents a somewhat arcane technique to get this to work declaratively. That's cool, but now we're creating more "maintenance debt," and I'm left wondering what else is lurking to trip me up if I go down this recommended path.&lt;br /&gt;&lt;br /&gt;We really should be able to implement some well-defined interfaces in our business objects and just have this stuff work. That has to be the best approach, and I have to think this is very close to being possible right now. I am going to check this out a bit more before I give up and go back to "DataSource = " and "DataBind()" and other trusted but monotonous ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6811974974791196397?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6811974974791196397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6811974974791196397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6811974974791196397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6811974974791196397'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/aspnet-objectdatasource-and-business.html' title='ASP.NET ObjectDataSource and Business Objects'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3658077626537208371</id><published>2007-02-18T04:46:00.000-05:00</published><updated>2007-02-18T06:49:39.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Microsoft Help Needs a Laxative</title><content type='html'>Help in Microsoft tools used to be great. Of course, that was ten years ago. In Access 97 or VB (was it VB 6 back then?), I could hit F1 and within two or three seconds the topic would pop up and show me concise information in a well-structured help file. It doesn't take over my screen. Searching is fast. Freaking brilliant!&lt;br /&gt;&lt;br /&gt;That was the pinnacle of Microsoft Help, &lt;span style="font-style: italic;"&gt;at least for software developers&lt;/span&gt;, before .chm files and whatever this new crap is in Vista.&lt;br /&gt;&lt;br /&gt;Fast forward to 2007. I'm in the venerable Visual Studio 2005. I have a dual core processor, big ass hard drive and more RAM than I ever thought I would need. I land on a .NET Framework object instantiation in my code and hit F1. I wait 30 seconds. I finally end up in the Microsoft Visual Studio 2005 Documentation application, which by the way looks similar to the thing launched from SQL Server 2005 Management Studio (and THAT THERE is a constipated beast of a tool, my comments coming soon...). The index tool window is unfiltered, and the contents text box is not synchronized with the topic I'm viewing. Neither is the contents window.&lt;br /&gt;&lt;br /&gt;I click Search from the command bar, enter something interesting and click the Search button. It looks all over various Microsoft sanctioned web sites (MSDN, Codezone and some forums). I click Cancel after it has found some things and a big red X with "Search failed" is displayed.&lt;br /&gt;&lt;br /&gt;Anyway... if the thing were just fast and lean, that would be great. I can use Google to search everything else much faster. Microsoft, you have made this help tool bloated and slow, it's not really helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3658077626537208371?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3658077626537208371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3658077626537208371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3658077626537208371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3658077626537208371'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/microsoft-help-needs-laxative.html' title='Microsoft Help Needs a Laxative'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5833393511090536673</id><published>2007-01-26T13:43:00.000-05:00</published><updated>2007-01-26T13:49:36.754-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Assess That Position</title><content type='html'>&lt;a href="http://www.monster.com/"&gt;Monster&lt;/a&gt; has some good stuff sometimes. Their emails arrive in my inbox regularly and every now and then something good pops up. Here are some excerpts from "&lt;span class="title"&gt;Know When to Take the Assignment," which is officially about considering temporary assignments:&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-style: italic;"&gt;It's critical to your professional identity and your career that you not allow yourself to fall for mediocre clients and mediocre projects.&lt;/blockquote&gt;&lt;blockquote style="font-style: italic;"&gt;You have to strive for impact.&lt;/blockquote&gt;&lt;blockquote style="font-style: italic;"&gt;Assignments should either give you experience with new skills, help solidify your expertise and focus on a particular discipline or fill in gaps where you know you don't have enough experience.&lt;br /&gt;&lt;br /&gt;Ask questions such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What qualities do the most successful employees in your company possess?&lt;/li&gt;&lt;li&gt;How does the team I'll be working with handle conflict or differing opinions?&lt;/li&gt;&lt;li&gt;How does the company recognize employee accomplishments?&lt;/li&gt;&lt;li&gt;What is the management style of the person I'll be reporting to?&lt;/li&gt;&lt;li&gt;Describe the personalities and styles of the company leaders.&lt;/li&gt;&lt;li&gt;What are the company's values?&lt;/li&gt;&lt;li&gt;Which philanthropic charities does the company support?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/blockquote&gt;Good advice for any position, not just a temp or contracting assignment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5833393511090536673?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5833393511090536673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5833393511090536673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5833393511090536673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5833393511090536673'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/assess-that-position.html' title='Assess That Position'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5519065858944026212</id><published>2007-01-24T09:16:00.000-05:00</published><updated>2007-01-24T09:54:58.036-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>How to Hire an IT Sales Professional</title><content type='html'>How to Hire an IT Sales Professional? I wish I knew the answer to this. Most sales people, good and bad, are usually very good at talking and selling &lt;span style="font-style: italic;"&gt;themselves&lt;/span&gt;.  That means you could be their meat and end up getting snowed. So what can you believe?&lt;br /&gt;&lt;br /&gt;They need a book of contacts to harvest leads, certainly. You need to know it's real. They need to show you good references, a whole bunch, and you need to follow up on those and sniff out the candidate's track record. You've already been assured by him that it's stellar, you need to verify that.&lt;br /&gt;&lt;br /&gt;Does she listen? Sales people are great at talking. The bad ones do that much better than anything else. The good ones hear. Does she understand the nuances when you explain things? Does she get the details, not just the concept?&lt;br /&gt;&lt;br /&gt;Has he been there and done that? Are you looking at a guy who has been in a completely different industry and assures you, by analogy and example, how his experience transfers to your industry? Be wary. It can work, but it's another hurdle, another red flag.&lt;br /&gt;&lt;br /&gt;What is the candidate's personality? I hear about these archetypes for sales people, the &lt;span style="font-weight: bold;"&gt;hunter &lt;/span&gt;and the &lt;span style="font-weight: bold;"&gt;farmer&lt;/span&gt;. The former is aggressive, the hard sell type. The other is nurturing, establishes consensus and build relationships. I don't know why there is this idea of mutual exclusivity. You really don't need a hunter or a farmer after all. You need a skilled business rep who can communicate and close deals, knows when to push and knows when to wait, knows when to step up and knows when to turn it over to others in your organization. He can drive a hard bargain as well as cooperate. He is respected, not disdained.&lt;br /&gt;&lt;br /&gt;What is the candidate expecting? Is he sitting in his chair all day? Is he out and about? Commission, tools to help him do his job (company car?), periodic review of his goals... and you? What are you expecting? Getting the wrong person is a big setback and can take a long time to recover from. Hire him on a trial basis, set the goals, and make the decision to retain or terminate at the close.&lt;br /&gt;&lt;br /&gt;Here is an example of a job description for a sales rep at &lt;a href="http://www.mwi.com/"&gt;MWI&lt;/a&gt;. It's pretty clear:&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;What We're Not Interested In&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;       &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Somebody to watch the phones. We've already got someone doing that for minimum wage.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;What We Are Interested In&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Somebody who is out of the office 90% of the time meeting with people.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;A lead generator and closer. Find new business, get them interested, and close the deal. We'll take care of the rest.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;What We're Offering&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;20% commission on project-based sales. You sell a $20K website, you get $4K.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;On SEO there is an initial commission plus a six-month residual. You close a $5K per month SEO deal and you get a commission equal to the monthly fee, plus 20% of the monthly fees for the next six months. That means if you closed one $5K/month deal per month you'd be bringing in $132K per year in commissions. A salesperson with the right experience, connections, and skills should be able to do double or triple that.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Health benefits. Candidates who prove themselves during a two-month trial period will be offered full-time employment which includes health benefits.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;And of course, the soft stuff. A nice work environment, a growing, exciting industry, cool co-workers without egos, and almost complete autonomy.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;If you'd like to get a better idea of how we sell our search engine marketing services, download our &lt;a href="http://www.mwi.com/files/mwi_seo.ppt"&gt;search engine marketing sales presentation&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;That's good. Get someone who will do that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5519065858944026212?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5519065858944026212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5519065858944026212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5519065858944026212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5519065858944026212'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/how-to-hire-it-sales-professional.html' title='How to Hire an IT Sales Professional'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3231659219553510073</id><published>2007-01-19T07:11:00.000-05:00</published><updated>2007-01-19T07:18:37.127-05:00</updated><title type='text'>Kick the Oil Habit?</title><content type='html'>&lt;a href="http://www.pnl.gov/news/release.asp?id=204"&gt;This study&lt;/a&gt; by the Pacific Northwest Laboratory, a "research organization" (I guess you'd call it) that is jointly run by the &lt;a href="http://www.doe.gov/"&gt;DOE&lt;/a&gt; and &lt;a href="http://www.battelle.com/"&gt;Battelle&lt;/a&gt;, finds that the U.S. could power 84% of its vehicles if they were "plug-in hybrids." This is one of a number of promising ideas. I'd still want at least a back up gas tank for those times the power goes out around here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3231659219553510073?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3231659219553510073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3231659219553510073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3231659219553510073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3231659219553510073'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/kick-oil-habit.html' title='Kick the Oil Habit?'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8690717836500440986</id><published>2007-01-18T10:59:00.000-05:00</published><updated>2007-08-02T16:30:57.365-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Management Getaway</title><content type='html'>&lt;blockquote&gt;Let us, then, be up and doing,&lt;br /&gt;With a heart for any fate;&lt;br /&gt;Still achieving, still pursuing,&lt;br /&gt;Learn to labour and to wait.&lt;/blockquote&gt; &lt;span style="font-style: italic;"&gt;A Psalm of Life&lt;br /&gt;William Wadsworth Longfellow&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Longfellow could have been writing about the antithesis of the move into management that knowledge workers typically feel is their inevitable career path. Away from the daily problem solving and coding, and the "just get it done" mentality that is often unfortunately imposed. An "escape" to a world where they can have meetings, interface with suits, say the word "verticals" a lot and pretend their documents and MS Project files are part of the vision that drives the organization's success. Woefully misguided are these aspiring managers.&lt;br /&gt;&lt;br /&gt;The trouble is, &lt;span style="font-style: italic;"&gt;completely &lt;/span&gt;flocking from the daily doing and the gusto attitude of the alpha geek can often turn one into the "just-get-it-done-according-to-my-'plan' " managerial type. These managers may, due to their deteriorating expertise, gradually help prevent an organization from integrating its skills and internal knowledge that it needs to compete in the tech industry. In other words, the manager fleeing from his inner geek may help his company &lt;span style="font-style: italic;"&gt;disintegrate&lt;/span&gt;, in many senses of the word. Like minded managers will coach him along that path, blissfully thinking they are right. People who are now becoming gradually less informed are making key decisions.&lt;br /&gt;&lt;br /&gt;Good tech companies do not let managers get themselves completely out of the tech side of the business. They make an effort to keep them in the game at some level. Take &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/12/30/i-ve-been-tagged-five-things-you-might-not-know-about-me.aspx"&gt;Scott Guthrie&lt;/a&gt; at Microsoft. Scott is in charge of the teams that build the .NET CLR, ASP.NET, IIS, WPF and more. That's a lot of responsibility. Yet he spends significant time every week writing code, to stay sharp and help make better decisions. Good managers understand that the business dictates some of the skills they must maintain. A tech business dictates that you have to maintain quite a bit of tech knowledge if you are going to make good decisions and therefore be a good manager.&lt;br /&gt;&lt;br /&gt;The trouble for organizations is that good managers are hard to come by. "Good" means many things. It includes realizing independently what will make you effective. It also includes delegating things that are not completely part of your expertise and granting autonomy to those implementing these pesky details. Good managers know that this means helping those who will make their team look good, and sharing in that success. Bad managers think they have to appear to think of, know, say and direct everything.&lt;br /&gt;&lt;br /&gt;The result is that the fine knowledge plebes often have to communicate with managers that really don't understand their jobs anymore, and sometimes with managers who are just ineffective and blissfully unaware. They have checked out, and they mistakenly think that is a logical progression for their managerial career track. The temptation to "graduate" into management often begets a lackadaisical outlook.  Things change rapidly. The luxury of checking out of the process of keeping up is a siren song of organizational ruin.&lt;br /&gt;&lt;br /&gt;If you are going to be an effective manager in the tech field, you need to keep your chops sharp. Not daily nuts and bolts sharp, but the more you understand the more effective you will be.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8690717836500440986?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8690717836500440986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8690717836500440986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8690717836500440986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8690717836500440986'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/management-getaway.html' title='Management Getaway'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4825878350991942805</id><published>2007-01-16T09:14:00.000-05:00</published><updated>2007-01-16T09:17:05.203-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Consensus</title><content type='html'>Brad Abrams at Microsoft has a great post about how to build support for an idea on his &lt;a href="http://blogs.msdn.com/brada/archive/2006/12/23/building-consensus.aspx"&gt;blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4825878350991942805?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4825878350991942805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4825878350991942805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4825878350991942805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4825878350991942805'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/consensus.html' title='Consensus'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2311834650279188269</id><published>2007-01-16T09:00:00.000-05:00</published><updated>2007-01-26T13:51:44.728-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Exception and ApplicationException</title><content type='html'>I had this straight in .Net 1.x: &lt;span style="font-style: italic; font-weight: bold;"&gt;Derive custom exceptions from System.Exception, not from ApplicationException&lt;/span&gt;. The reasoning: you want your exception hierarchies to be wide and shallow, not deep, and that ApplicationException didn't add anything to Exception anyway. &lt;a href="http://www.wintellect.com/"&gt;Jeffrey Richter&lt;/a&gt; notes that the difference between the two types of exceptions were originally to signal a CLR exception vs. one thrown from an application, but that this distinction was not followed consistently. Therefore, stick with System.Exception.&lt;br /&gt;&lt;br /&gt;In .Net 2.0 we seem to have conflicting directives from Microsoft, which I am assuming is an error. The MTS 70-536 exam study materials point out (on p.24 of the training kit book) that we should derive from ApplicationException. Seems to fly in the face of the previous recommendation and based on the original .Net 1.x recommendations which were revised. The &lt;a href="http://msdn2.microsoft.com/en-us/library/z4c5tckx.aspx"&gt;latest MSDN docs&lt;/a&gt; appear to recommend deriving custom exceptions from System.Exception.&lt;br /&gt;&lt;br /&gt;I'm going to stick with System.Exception as the base class for custom exceptions. Don't know why I ended up bothered by this today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2311834650279188269?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2311834650279188269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2311834650279188269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2311834650279188269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2311834650279188269'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/exception-and-applicationexception.html' title='Exception and ApplicationException'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8871565190385767030</id><published>2007-01-10T10:47:00.000-05:00</published><updated>2007-01-10T10:49:59.164-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>Apple Rocks but What is Missing?</title><content type='html'>More concerns about the iPhone, which I otherwise love as already stated:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Battery à la the iPod, or can we replace it when it's old and tired?&lt;/li&gt;&lt;li&gt;Support for Office docs?&lt;/li&gt;&lt;li&gt;Support for Exchange Server?&lt;/li&gt;&lt;li&gt;Can we expand it by installing our own software (like Palm, Symbian, and Microsoft phones all allow)?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8871565190385767030?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8871565190385767030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8871565190385767030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8871565190385767030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8871565190385767030'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/apple-rocks-but-what-is-missing.html' title='Apple Rocks but What is Missing?'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2144904334060357148</id><published>2007-01-10T10:02:00.001-05:00</published><updated>2007-01-26T13:52:44.672-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Fools and Fanatics</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;blockquote style="font-style: italic;"&gt; The whole problem with the world is that fools and fanatics are always so certain of themselves, but wiser people so full of doubts.&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p&gt;- Bertrand Russell&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2144904334060357148?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2144904334060357148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2144904334060357148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2144904334060357148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2144904334060357148'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/fools-and-fanatics.html' title='Fools and Fanatics'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4537223329671478279</id><published>2007-01-10T08:35:00.000-05:00</published><updated>2007-01-10T09:22:17.282-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>C# and VB.Net</title><content type='html'>Though this is now a barely simmering debate, my thoughts about which great .Net language to choose is pretty simple -- choose the better one.&lt;br /&gt;&lt;br /&gt;For almost a decade I wrote applications using nothing but VB 3, 4, 5, and 6, or VBA (in Access), or VBScript (in old ASP), along with HTML a smattering of javascript, and quite a bit of SQL (T-SQL and Access SQL) for every application. But it was largely some form of VB, all day long, that I used to create my bread and butter apps. Before that was Paradox (PAL), Basic, and some macro languages for business apps. VB, though, became my career.&lt;br /&gt;&lt;br /&gt;When .Net came out of beta in late 2001, I began a project writing a source code repository with content in both VB.Net and C#. I had to not only learn the .Net framework but also a fair bit that I was able to avoid in VB about object oriented design and programming (two different but very related things). For me, the new framework and OOD/P paradigm were the most effort, but learning two new languages thrown on top added to the effort.&lt;br /&gt;&lt;br /&gt;Yes, two new languages. VB and VB.Net, while similar in syntax, are very different beasts.&lt;br /&gt;&lt;br /&gt;So, as a long time VB/VBA/VBScript programmer learning both VB.NET and C#, it seems a no-brainer which one I took up and looked to as the better language...&lt;br /&gt;&lt;br /&gt;It is C#.  Why?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is more concise, I would even say more elegant than VB.Net. The verbosity of VB.Net becomes stressful. The scannability of well-contructed C# is very good in comparison. I can, in short, read well-done C# code much more easily than well-done VB.Net.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The amount of crappy VB.Net code due to VB developers diving into .Net is astounding, and VB.Net unfortunately lets you get away with a lot of sloppiness. I may get to explaining that in another post, I have a lot to say about it...&lt;/li&gt;&lt;li&gt;Developer tools tend to be done for C# more than VB.Net. In fact, many only support C#. Though that is changing, VB.Net support is often an afterthought.&lt;/li&gt;&lt;li&gt;The background compiler in VB.Net can sometimes be nice when you're making quick changes, but it is more often intrusive and stressful while coding. For example, if I want move off an incomplete line to copy and paste something else, I don't need the squiggles or the closing parens added when VB.Net doesn't know what I mean; tools like &lt;a href="http://www.devexpress.com/coderush/"&gt;CodeRush&lt;/a&gt; are interfered with by the background VB.Net compile thread, especially in Visual Studio 2003; moreover, try VB.Net on a large solution (I have) and you will run into serious frustration and the need to restart Visual Studio regularly during your day to clear the futzed state the IDE gets in.&lt;/li&gt;&lt;li&gt;C# has always caught things like unused variables, unreachable code, and non-void methods that don't return a value as warnings or errors. VB.Net may have solved one or two of these in the 2005 release, though.&lt;/li&gt;&lt;li&gt;Option Strict and Option Explicit. These legacy VB-isms should have been thrown out. Other than the need for this in some Office Automation code, I can't see why you would ever want to not have these both ON. And way too many classic VB developers who come to .Net don't turn them on at both the project and source file level.&lt;/li&gt;&lt;li&gt;I hate the line continuation character, and you think I would have gotten used to it from VB, but I just never have liked it. Especially in .Net when you're working with attributes, the C# syntax is much less confusing, more writable and just easy to do.&lt;/li&gt;&lt;li&gt;Array syntax in VB and VB.Net, they just should never have used parens instead of square brackets when VB.Net came along. The thing that ticks me off most is when I go back to a C# project after working on a VB.Net project and keep smacking myself when I use parens for an array and hit compile errors. I hate that.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What do I like better about VB.Net than C#?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sometimes I actually like the background compile! But not usually, and I wish it could be simply turned off.&lt;/li&gt;&lt;li&gt;Delegates and using WithEvents to simplify event handling. In VB.Net, that is a real boon to developer efficiency.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Is this a useful, informative post? Probably not, unless you're currently (and temporarily) a VB.Net programmer, though. Then, you should read it!&lt;br /&gt;&lt;br /&gt;A more important point is that if you work with .Net, you need to know BOTH of these languages, no excuses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4537223329671478279?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4537223329671478279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4537223329671478279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4537223329671478279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4537223329671478279'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/c-and-vbnet.html' title='C# and VB.Net'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3853375090498616824</id><published>2007-01-10T07:22:00.000-05:00</published><updated>2007-01-10T08:02:37.377-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>Apple Rocks the World</title><content type='html'>Steve Jobs' announcement at yesterday's &lt;a href="http://www.macworld.com/"&gt;Macworld&lt;/a&gt; conference about the &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; is big. I have been reading a variety of opinions about how this impacts the world of cell phones, including &lt;a href="http://www.nokia.com/"&gt;Nokia&lt;/a&gt;, &lt;a href="http://www.researchinmotion.com/"&gt;RIM&lt;/a&gt; and the like. I think as this news is digested, there is still more upside from this announcement if you're an investor or a potential investor in apple, as I believe people will realize the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;So called "smartphones" today are generally awful. Usability is poor, too many compromises (some have touch screens, some don't; some have good keyboards, some are lousy; some are actually decent phones and are mediocre at their other functions, most are not so good; some function as music players, others can but not well, or have incompatible headphone jacks, on and on...), just too much to not like in any example. I have looked at the &lt;a href="http://www.samsung.com/blackjack/"&gt;Blackjack&lt;/a&gt;, &lt;a href="http://www.cingular.com/cell-phone-service/cell-phone-details/?q_list=true&amp;q_phoneName=Cingular+8525&amp;amp;q_sku=sku310005"&gt;Cingular 8525&lt;/a&gt;, the &lt;a href="http://direct.motorola.com/ENS/q-home.asp?Country=USA&amp;language=ENS&amp;amp;productid=30419"&gt;Motorola Q&lt;/a&gt;, various Blackberries and Treos. They all have some compelling features (keyboard, push mail, WiFi on the 8525) and some infuriating omissions (no touch screen on the Blackjack, the Windows OS is problematic, the Palm OS is showing its age, the Blackberry is great for mail but mediocre for everything else). The iPhone has it all, and the non-phone features are finally all there and appear to be done right.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Standard form factor. Look around, these things are anywhere from really thin, too thick, too heavy, unable to fit into a jeans pocket -- there is no standard. Apple is going to become the de facto form factor and design standard. Its simple design looks to make "gadget use tension" evaporate. I am not going to have to concentrate so hard and make five clicks with a crappy scroll wheel/button to record a voice memo to myself, for example.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We are sick of carrying around all these specialized gadgets. A smartphone with tons of unused memory sits in my bag next to my iRiver 40gb mp3 player, my Garmin GPS, and my laptop which is with me even on occasions where I just may use it but only need to read email and surf. I don't have a PDA, but many people throw that into the mix, too. Here is where Apple is really separating itself from the lackluster crowd. This device looks to make the need for separate devices to handle these features largely obsolete right when it is launched in June, and eventually, completely obsolete.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Connectivity. Every smartphone these days should have Bluetooth 2.0, WiFi b and g, as well as its carrier's 3G access built in. They usually have one and a half or two out of three. WiFi is the iPhone's coup de grace. The Blackjack should have this. The Nokia E62 should have this. Most smartphones have gorgeous screens and close to enough real estate to let you surf using whatever connection your home, office or coffee shop infrastructure offers. Most carriers cripple the WiFi so that you are forced to use their expensive 3G plans for internet access. Unless you travel a lot or are otherwise forced, you simply pull out another device to surf and check email. A device with a beautiful screen like the iPhone, and usable in landscape mode makes a great hand-held browser.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In short, this is the holy grail. One device that does phone, email, messaging, web browsing, and photo and video viewing.&lt;br /&gt;&lt;br /&gt;Open questions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Will the on-screen keyboard be usable?&lt;/li&gt;&lt;li&gt;Is the case going to be durable (see how an old iPod wears, not too well)&lt;/li&gt;&lt;li&gt;Will 3G access be available soon? (It won't be for the June release)&lt;/li&gt;&lt;li&gt;Is it as easy to use as all those iPhone videos on the web make it seem?&lt;/li&gt;&lt;li&gt;Is the call quality great?&lt;/li&gt;&lt;li&gt;Does it "boot up" or just turn on?&lt;/li&gt;&lt;li&gt;I'm still lukewarm about iTunes, will that improve? It seems integral to this device.&lt;/li&gt;&lt;li&gt;Does it come with a charger, a decent case, and hopefully a car charger?&lt;/li&gt;&lt;li&gt;Does bluetooth work as well as it should?&lt;/li&gt;&lt;li&gt;Will a competitor emerge that gets the design just as right?&lt;/li&gt;&lt;li&gt;Is the memory expandable?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3853375090498616824?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3853375090498616824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3853375090498616824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3853375090498616824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3853375090498616824'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/apple-rocks-world.html' title='Apple Rocks the World'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-9040655283381744953</id><published>2007-01-04T06:47:00.000-05:00</published><updated>2007-01-04T08:00:15.818-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>The Construction Analogy</title><content type='html'>This is a common way for people with little experience to analyze or (gasp) explain the process of creating software. The problem is, building a house and creating a custom software application have little in common. Not nothing, but very, very little.&lt;br /&gt;&lt;br /&gt;Here is a classic situation. Joe the sales guy is explaining his company's software development process to a potential client. The client questions why a &lt;a href="http://www.agilemodeling.com/essays/examiningBRUF.htm"&gt;large requirements document&lt;/a&gt; is necessary. Joe gets animated (apparently, he's really experienced) and says, "Well, it's like you're building a house. You need a blueprint. Your builder needs to know how many rooms, where the plumbing, electrical and HVAC goes, where the bathrooms are... heck, it's not like you can get half way through building a 2500 square foot colonial and then decide that you really need a 4000 square foot ranch."&lt;br /&gt;&lt;br /&gt;Actually, the "2500 square foot colonial --&gt; 4000 square foot ranch" is exactly what you frequently do on a software project. In fact, if you can't do that for your clients you're likely locked into a very poor development process. But there is much more to why this analogy has little merit.&lt;br /&gt;&lt;br /&gt;How about some more Joe-isms about software development:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"You can't just rip apart the foundation while you're finishing the attic." Yes, you can.&lt;/li&gt;&lt;li&gt;"You can't finish a brick house and then decide the windows are too narrow and change them." Yes, you can.&lt;/li&gt;&lt;li&gt;"It would be like taking a single family house and turning it into an apartment." What's the big deal about that?&lt;/li&gt;&lt;/ul&gt;Construction workers are not typing code. They can't copy and paste. They have to deal with gravity, building codes, materials suppliers, the weather. We don't have these issues in Windows, .Net, or the web.&lt;br /&gt;&lt;br /&gt;When you build a house, you have to follow the &lt;a href="http://en.wikipedia.org/wiki/Waterfall_process"&gt;waterfall methodology&lt;/a&gt;. That is, you need a plan that is complete, then you begin construction, starting with excavating a hole in the ground for the foundation, then you pour the concrete, then you frame the ground floor, then you frame the walls, then the roof, etc. After that, the building inspector can look things over and approve it. Only then can the electrician come in and run the wiring. Et cetera.&lt;br /&gt;&lt;br /&gt;The waterfall process, which is so core to the construction industry, is a very poor approach for most (but not all) software development. Why is it poor? Because it locks you into a fixed course in a process that requires constant discovery, revision and reaction to changing business requirements, stakeholder feedback, and competitive pressures. Your building just needs to get finished so the family can move in, or so the software company can set up its servers and start writing some code! Waterfall may be a good process (I'm not 100% convinced, but it may be) if the software you are creating is similar to many other projects you've done. Of course, if that's the case, you might be better off just finishing it one last time, boxing it up, and selling it at CompUSA for $49.99. You don't need a process for that ever again.&lt;br /&gt;&lt;br /&gt;In what I feel is a more sinister result of this construction analogy, we have people known as project managers who have been trained to bless this waterfall approach to software development. I recently had a conversation on a flight to visit a client with a woman who works for &lt;a href="http://www.eds.com/"&gt;EDS&lt;/a&gt;. She was a project manager and was complaining about how her clients are constantly changing their minds about software that was "under construction." I tried to think of a project I have worked on where that did not happen. I can't recall a single project.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.pmi.org/"&gt;PMI&lt;/a&gt; (and I am not an expert at their certification but have worked with people who are PMI certified) seems to endorse these staid methodologies. I may be very wrong about their focus, but when I read an overview of the &lt;a href="http://www.pmi.org/prod/groups/public/documents/info/pdc_pmp.asp"&gt;PMP credential&lt;/a&gt;, I see that it includes the following: "&lt;span class="contentBody"&gt;initiating the project, planning the project, executing the project, monitoring and controlling the project, closing the project..." This smacks of a construction project in my book, not software development. The few people I have experience working with who are PMP certified seem to endorse this. Again, in some projects this may be a valid approach (and again, I'm not convinced it is, but it could be sometimes).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So does all this mean I feel that planning and project management and some structure is bad for software development? No. You need to plan, manage, and rely on some structure. But it is different for a construction project than it is for a software project. And thankfully, the software industry is responding very well. The problems of estimating, collaborating, managing and creating software have been studied by a lot of very smart people. &lt;a href="http://www.martinfowler.com"&gt;Martin Fowler&lt;/a&gt;, &lt;a href="http://ambysoft.com/"&gt;Scott Ambler&lt;/a&gt;, &lt;a href="http://alistair.cockburn.us"&gt;Alistair Cockburn&lt;/a&gt;, &lt;a href="http://www-03.ibm.com/developerworks/blogs/page/gradybooch"&gt;Grady Booch&lt;/a&gt;, &lt;a href="http://www.threeriversinstitute.org/"&gt;Kent Beck&lt;/a&gt;, &lt;a href="http://www.controlchaos.com/"&gt;Ken Schwaber&lt;/a&gt;, and heck, a lot of mere mortals, even me.&lt;br /&gt;&lt;br /&gt;The construction analogy is way off for most software projects. Sometimes it is good for explaining to a client the challenges in estimating costs, for example, or to illustrate the complexity (at a very high level) of developing software. I think any other use of this analogy stretches its validity, and I think people have to stop raising it as justification for almost everything. &lt;br /&gt;&lt;br /&gt;The construction analogy is not valid. In fact, software development is mostly a unique activity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-9040655283381744953?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/9040655283381744953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=9040655283381744953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9040655283381744953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9040655283381744953'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/construction-analogy.html' title='The Construction Analogy'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2235092723632513516</id><published>2007-01-01T22:23:00.000-05:00</published><updated>2007-02-27T07:56:22.647-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Meetings and Goals</title><content type='html'>Warren Buffet on CNBC tonight tells Liz Clayman that he doesn't have meetings with the managers of the businesses he owns, he just tells them what he expects. The woman who runs Borsheim's jewelry, which Warren Buffet owns, says at the start of each year, he sends her a single sheet of paper with the business goals for the year.&lt;br /&gt;&lt;br /&gt;From my own experience, the amount of meetings tends to run inversely to the focus on goals. Meetings are often where poor managers assert their control, or stoke their egos. Very few things get resolved at planned meetings, fewer still when they are lengthy.&lt;br /&gt;&lt;br /&gt;The less formal a meeting, the more effective it is. Short, frequent chats with team members can replace a lengthy weekly meeting with much better effect.&lt;br /&gt;&lt;br /&gt;Meetings are good for brainstorming, mediocre for motivating, and poor for communicating in a level, focused, ego-free manner.&lt;br /&gt;&lt;br /&gt;If you have to have a meeting, it needs to have a goal. Send out an agenda, keep it short and focused, and end it with a summary of the action items agreed upon to meet the goal. Follow up, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2235092723632513516?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2235092723632513516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2235092723632513516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2235092723632513516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2235092723632513516'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/01/meetings-and-goals.html' title='Meetings and Goals'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6112782819621479706</id><published>2006-12-21T12:34:00.000-05:00</published><updated>2006-12-21T13:15:55.371-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Open Source vs. Microsoft</title><content type='html'>The success of the &lt;a href="http://msdn2.microsoft.com/en-us/netframework/default.aspx"&gt;.Net&lt;/a&gt; platform has coincided with the rise of open source development, and spawned quite the variety of open source .Net tools. Microsoft, however, has decided not just to &lt;span style="font-weight: bold;"&gt;not &lt;/span&gt;embrace this (&lt;a href="http://codeplex.com/"&gt;Codeplex&lt;/a&gt; aside), but to contribute to the death of these tools. And hey -- this post is not about Linux!&lt;br /&gt;&lt;br /&gt;We have &lt;a href="http://nunit.org/"&gt;NUnit&lt;/a&gt;, and now Visual Studio Team System includes Team System Test, in many ways inferior. Integration of NUnit into the VSTS development environment via &lt;a href="http://testdriven.net/"&gt;Test Driven .Net&lt;/a&gt;, along with &lt;a href="http://ncover.org/"&gt;NCover&lt;/a&gt; made a powerful unit testing toolkit.&lt;br /&gt;&lt;br /&gt;We have &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; and &lt;a href="http://cruisecontrol.sourceforge.net"&gt;Cruise Control&lt;/a&gt; and &lt;a href="http://draconet.sourceforge.net"&gt;Draco&lt;/a&gt; for build management and continuous integration. VSTS now has MS Build which is, again, not quite there.&lt;br /&gt;&lt;br /&gt;We &lt;span style="font-weight: bold; font-style: italic;"&gt;had &lt;/span&gt;&lt;a href="http://ndoc.sourceforge.net/"&gt;NDoc&lt;/a&gt;, which has now been abandoned by the original developer because of the upcoming Sandcastle.&lt;br /&gt;&lt;br /&gt;I'm not sure where the advantage is for Microsoft. The open source .Net community is thriving and has created a rabid group of developers that loves .Net. That's a group that is going to support Microsoft and not run away to use Linux, Apache, Java, &lt;a href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29"&gt;LAMP&lt;/a&gt;, Ruby or other very capable and competing platforms. Had Microsoft included the full capabilities of these open source projects in its own tool set early on, everyone would have been happy. But now, the appearance is that the company wants to kill these things. There are so many options they could have pursued to integrate these tools by being inclusive and fostering goodwill toward the community... damn, I sound like a pansy... and to top it off, they haven't even done the analogous tools &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;as well as the open source versions&lt;/span&gt;&lt;/span&gt;. Not only is the message clear ("we'll do it and you'll like it") but this creates a chilling effect on future open source projects.&lt;br /&gt;&lt;br /&gt;It seems that many big companies sometimes just have their proverbial heads up their butts. When I see what Microsoft now offers (which is fantastic, no doubt) and consider the alternatives (Ubuntu, Java, Ruby on Rails, MySQL, on and on...), I'm not feeling so insecure about not choosing Microsoft for every project. The argument can no longer be confidently made about Microsoft, that "you know their tools are going to be the standard." That Microsoft has been in the cross hairs of many a competitor and come out on top nearly every time is, like the investment mavens say, "no guarantee of future performance."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6112782819621479706?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6112782819621479706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6112782819621479706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6112782819621479706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6112782819621479706'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/12/open-source-vs-microsoft.html' title='Open Source vs. Microsoft'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-1092942291924865452</id><published>2006-12-14T13:16:00.000-05:00</published><updated>2006-12-14T13:17:25.325-05:00</updated><title type='text'>Lorem Ipsum</title><content type='html'>&lt;a href="http://www.lipsum.com/"&gt;Lorem ipsum&lt;/a&gt; generator and brief history. I always wondered, now I know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-1092942291924865452?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/1092942291924865452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=1092942291924865452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1092942291924865452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1092942291924865452'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/12/lorem-ipsum.html' title='Lorem Ipsum'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6406842287102815078</id><published>2006-12-13T08:08:00.000-05:00</published><updated>2006-12-13T08:17:36.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>More Podcasts</title><content type='html'>&lt;a href="http://twit.tv/"&gt;TWIT&lt;/a&gt; has some very good podcasts. Leo Laporte's KFI program (soon to be called something else, I think, because he is leaving the radio station on which the podcast is based) showcases his knowledge about almost everything tech. He fields calls from the confused masses on topics ranging from HDTV to Linux, Mac and Windows. Steve Gibson's Security Now (hosted by Leo) is extremely interesting. Steve is the man behind SpinRite and &lt;a href="http://www.grc.com/"&gt;his website&lt;/a&gt; is a good source of utilities and security information. The production quality on TWIT is top notch. Leo has that classic deep radio tenor, this marriage of radio and podcast works well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6406842287102815078?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6406842287102815078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6406842287102815078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6406842287102815078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6406842287102815078'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/12/more-podcasts.html' title='More Podcasts'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-1970633151852494171</id><published>2006-12-08T08:41:00.000-05:00</published><updated>2006-12-08T13:51:03.640-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>Encrypt your Thumb Drive</title><content type='html'>&lt;a href="http://www.truecrypt.org/"&gt;TrueCrypt&lt;/a&gt; is a great, open source, free encryption tool for thumb drives. I have been using this for several months now on my 2gb thumb drive, using AES encryption, and it has been working flawlessly. I created mount.bat and unmount.bat batch files to hook it up and take it down. I couldn't get autorun.inf to do this automatically when I connect the drive on Windows XP, maybe I will come back to that when I have time. Highly recommended.&lt;br /&gt;&lt;br /&gt;Some good links for how to set it up and configure a mountable thumb drive:&lt;br /&gt;&lt;a href="http://glosoli.blogspot.com/2005/09/encrypted-thumb-drive-and-autoplay.html"&gt;http://glosoli.blogspot.com/2005/09/encrypted-thumb-drive-and-autoplay.html&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://lifehacker.com/software/portable-applications/hack-attack-quicklaunch-your-usb-workspace-182792.php"&gt;http://lifehacker.com/software/portable-applications/hack-attack-quicklaunch-your-usb-workspace-182792.php&lt;/a&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-1970633151852494171?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/1970633151852494171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=1970633151852494171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1970633151852494171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1970633151852494171'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/12/encrypt-your-thumb-drive.html' title='Encrypt your Thumb Drive'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8444808774609319836</id><published>2006-12-08T08:11:00.000-05:00</published><updated>2006-12-08T08:41:25.561-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Microsoft IE, Proxies and Sandboxing</title><content type='html'>I switched from using &lt;a href="http://www.microsoft.com/ie"&gt;Internet Explorer&lt;/a&gt; to &lt;a href="http://www.mozilla.com/firefox" &gt;Firefox&lt;/a&gt; about a year and a half ago, with no regrets. The only downside has been using sites that require ActiveX controls, such as Windows Update, Sharepoint intranet administration and sites that distribute software using Microsoft .Net "click-once" deployment. And damn these sites for forcing me to use IE! The reason to avoid IE (widely known) is poor security. Despite this, I know people who are still using it and think nothing of it. It makes increasing sense that open source solutions such as Firefox help with security. The source code is reviewed widely by people both inside and outside the organization, and vulnerabilities are identified and corrected regularly as a result.&lt;br /&gt;&lt;br /&gt;Since I made the switch, my anti-spyware has shown a remarkable drop in my acquisition of spyware/malware while surfing. In fact, the only things I regularly see are the odd tracking cookie. Between good habits like not opening email attachments, setting mail readers (Windows-based and web-based) to not display graphics in HTML email, running a software as well as a hardware firewall, keeping my systems updated and fully patched and running anti-virus software (AVG free edition currently), I have happily avoided infection. And not just obvious infection, but any infection. People who may not know this should be aware that increasingly, malware can run without obvious symptoms while intercepting information you are entering in various places.&lt;br /&gt;&lt;br /&gt;You can further lessen your exposure to bad things by installing your own proxy server, such as &lt;a href="http://www.proxomitron.info"&gt;Proxomitron&lt;/a&gt;, which is installed and configured on your machine. By piping all web requests through this local HTTP filtering program and configuring it in various ways, you have another useful means of blocking bad content. The details of this would require an entire article, but their website is a good place to start.&lt;br /&gt;&lt;br /&gt;And speaking of proxy servers, IE has or had (it may have been patched) another issue with using the auto-detect proxy settings option. Steve Gibson described this on a recent &lt;a href="http://www.twit.tv/"&gt;TWIT&lt;/a&gt; security podcast. Even without the vulnerability, you want to uncheck this option to avoid the performance hit it causes.&lt;br /&gt;&lt;br /&gt;The other issue that concerns me is web surfing on machines that other people have access to. I would like to be able to buy something online and do things like log into my work email without leaving cached information on the machine's browser. The solution may be sandboxing, which Steve Gibson also recently discussed. Using a tool like &lt;a href="http://www.sandboxie.com"&gt;Sandboxie&lt;/a&gt;, you can avoid leaving typical artifacts of browsing on the machine you're using. Sandboxie basically creates a virtual sandbox in which it runs any application (such as IE), and all caching is done in the sandbox. When you're finished, these files are deleted when the sandbox is shut down. That is brilliant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8444808774609319836?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8444808774609319836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8444808774609319836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8444808774609319836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8444808774609319836'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/12/microsoft-ie-proxies-and-sandboxing.html' title='Microsoft IE, Proxies and Sandboxing'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-116240550546381170</id><published>2006-11-01T07:59:00.000-05:00</published><updated>2006-11-01T13:25:05.543-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Null</title><content type='html'>I have adopted the practice of not allowing nulls in lookup tables and foreign keys to those lookups. The reasons for this are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Application logic is simplified for drop downs and the like that allow a blank value. For example, drop downs used on search screens to select from a finite and known list should allow a user to reset the selection by picking the blank row. Data access and business layer code also benefits greatly as anyone who has implemented typical "if (dRow("colName") != DBNull.Value) ..." knows.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Query logic is simplified. Outer joins are not required.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Query performance and indexing is faster because nulls are not allowed.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;So in a typical lookup, I create a "zero" row where the ID is 0 and the value is an empty string. Life is so much better this way.&lt;br /&gt;&lt;br /&gt;In fact, if it were not for a couple specific issues, I would extend my reasoning to say that nulls in any database table are bad.  The DateTime issue is unfortunate, because there may be times when you legitimately do not have a date value and "1/1/1753" won't cut it as an indicator for that. Also, calculations on columns when data is legitimately not known really needs to allow nulls so that null data is excluded from the calculation. I can't readily think of other exceptions though. Something to ponder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-116240550546381170?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/116240550546381170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=116240550546381170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/116240550546381170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/116240550546381170'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/11/null.html' title='Null'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115992405234423764</id><published>2006-10-03T20:54:00.001-04:00</published><updated>2008-04-17T08:06:06.428-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Why You Should Script your Application's Database Changes</title><content type='html'>It's easier to &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;do this, so why do it? This argument seems to be alive, for some reason, more frequently than I thought. What if you &lt;span style="font-weight: bold; font-style: italic;"&gt;don't&lt;/span&gt; script your database schema as well as data, each in separate scripts? What can you &lt;span style="font-style: italic; font-weight: bold;"&gt;not &lt;/span&gt;do if you just keep one database that everyone mucks with, and then try to capture its changes when you deploy v.next? Here are some of the things you will &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;be able to do:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Version control - your database structure, system data, and stored procedure and function logic constitute a bona fide layer of your application. You will not be able to track changes or easily roll back to a previous database version if you don't use version control of some sort.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Associate a schema version with an application version - if you can version-stamp your schema and therefore identify it, then your application has a known-state it can check and know if it needs to degrade certain functionality, or upgrade itself, or terminate with a warning. The alternative (and unfortunately more common) approach is to just crash once a breaking schema change is encountered at runtime.&lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Cleanly maintain separate copies of development, unit test, performance test, QA and actual data. Each of these are for completely different purposes. Yes, schema changes require changes to these scripts and so are a pain in the ass, but if you can't purpose your data to serve specific testing scenarios, you are not testing very thoroughly. And if you're not testing thoroughly and in an automated fashion, &lt;span style="font-weight: bold; font-style: italic;"&gt;that &lt;/span&gt;is a bigger pain in the ass.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Automate your build process completely - you can automate almost all of it, but if creating database change scripts is a manual, time-consuming process, you are defeating many of the benefits of continuous integration.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Deploy the latest database changes to your local "sandbox" database server - why send emails to your team saying, "I'm about to make a breaking change to the database, so go get lunch or something and try back in an hour." Much better to allow anyone at any time to grab a database to-go and install it locally. You can test changes there, not crash everyone else if you screw something up, and still be able to go back to a known good state if needed.&lt;/li&gt;&lt;li&gt;Deploy the latest database changes to the real world - the latest database is defined by your change scripts, and upgrading a client's database is relatively simple and can be tested in-house to iron out the small problems. Better this than waiting for Bob to come in and spend three hours scripting things manually and wondering if it's really good to go.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Compare the effects of historical changes on performance - did that index really speed up your queries? Slow down your inserts? And who created that table and forgot to index that column?&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Search and replace column names - not always so easy, but if you have some standards, it can be pretty simple and is a powerful capability.&lt;/li&gt;&lt;/ul&gt;So what is easier &lt;span style="font-weight: bold; font-style: italic;"&gt;right now&lt;/span&gt;? Piling it all into one database that all developers and testers bang on, and figure out change and deployment scenarios later. What is easier &lt;span style="font-weight: bold; font-style: italic;"&gt;in the long run&lt;/span&gt;? Not being lazy and investing some effort into configuration management today so tomorrow is much less painful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115992405234423764?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115992405234423764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115992405234423764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115992405234423764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115992405234423764'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/10/why-you-should-script-your.html' title='Why You Should Script your Application&apos;s Database Changes'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115992324253526297</id><published>2006-10-03T20:49:00.000-04:00</published><updated>2006-10-03T20:54:02.543-04:00</updated><title type='text'>Recycle Old Cell Phones</title><content type='html'>&lt;a href="http://www.racetorecycle.com"&gt;This&lt;/a&gt; is a great idea from Motorola. You can send old cell phones and accessories, postage is free (print from their website), and schools can set up a fundraising thing with them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115992324253526297?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115992324253526297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115992324253526297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115992324253526297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115992324253526297'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/10/recycle-old-cell-phones.html' title='Recycle Old Cell Phones'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115990857401389713</id><published>2006-10-03T16:41:00.000-04:00</published><updated>2006-10-03T16:50:34.630-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>How to Explain This II</title><content type='html'>Someone asked my opinion today, "how would you find duplicates in this table?" I asked him to clarify because that seemed straightforward. He ammended his question, "how would you find items here that are not in this list?" I was confused.&lt;br /&gt;&lt;br /&gt;Draw a picture, I asked.&lt;br /&gt;&lt;br /&gt;He drew a sample of the two sets of data and explained "For this entity, there are items 1, 2, and 4. For another entity, there are 2, 3, and 5. I want to find the missing items." He wanted to find the GAPS in SEQUENTIALLY NUMBERED sets. I wasn't getting that until he drew the picture.&lt;br /&gt;&lt;br /&gt;This is (as I &lt;a href="http://jutherman.blogspot.com/2005/11/how-to-explain-this.html"&gt;posted months ago&lt;/a&gt;) a frustration I have often. Sometimes it is due to my own confusion, just as often though it is because English doesn't cut it. Draw a picture instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115990857401389713?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115990857401389713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115990857401389713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115990857401389713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115990857401389713'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/10/how-to-explain-this-ii.html' title='How to Explain This II'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115317694315474966</id><published>2006-07-17T18:51:00.000-04:00</published><updated>2006-07-17T18:57:51.786-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Scope Change -- Worth It?</title><content type='html'>I recently heard an interview with &lt;a href="http://www.mcwtech.com/consultants.aspx#Kent"&gt;Kent Alstad&lt;/a&gt; in which he commented something to this effect: "If a change in scope is proposed for a project, ask yourself this: will the project succeed if we do NOT do this? If the answer is yes, don't do it."&lt;br /&gt;&lt;br /&gt;That's about as clean a way to judge whether to give in when scope begins to creep (as it always does) as I've ever heard. The fixed price guys need to mind this. The agile guys will have a nice counter to the whole premise of scope, I'm sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115317694315474966?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115317694315474966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115317694315474966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115317694315474966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115317694315474966'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/07/scope-change-worth-it.html' title='Scope Change -- Worth It?'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115211941924436998</id><published>2006-07-05T12:58:00.000-04:00</published><updated>2006-07-05T13:10:19.710-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Design Debt</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/0321213351/103-2445672-6702254?v=glance&amp;n=283155"&gt;This book&lt;/a&gt; describes this concept. You create design debt when you crank out a solution without regard to its design simply to meet a deadline. It works and is "done," but at some point in the future if the system lives on, you're going to be compelled to clean it up, i.e., pay the debt down. And it may not be on your terms when that time comes.&lt;br /&gt;&lt;br /&gt;If the overall benefit is greater than the cost, you're winning. If not, what are you thinking?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115211941924436998?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115211941924436998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115211941924436998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115211941924436998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115211941924436998'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/07/design-debt.html' title='Design Debt'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115106677380373405</id><published>2006-06-23T08:30:00.000-04:00</published><updated>2006-06-23T08:46:13.826-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Glossary</title><content type='html'>I have been big on the idea of creating a glossary of the terms and jargon that are embedded in a specific client's problem domain, and doing this very early in the project lifecycle. The justification is that these terms are often thrown around early and throughout a project, but their meanings are not all grasped by everyone until much later. Also, the people on the client's side often disagree among themselves about particular terms' definitions. This lack of clarity often results in subtle bugs in the system, or simply in expensive rework downstream. A quick search shows that some requirements methodologies (such as &lt;a href="http://www.steeltrace.com/"&gt;Steeltrace&lt;/a&gt; and maybe others) already encourage this. Putting it into practice seems like a lesser priority to some, but I think this is one of those little things with a big payoff that's hard to measure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115106677380373405?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115106677380373405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115106677380373405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115106677380373405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115106677380373405'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/06/glossary.html' title='Glossary'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-115081977861597494</id><published>2006-06-20T12:01:00.000-04:00</published><updated>2006-06-20T12:09:38.640-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>I Run Free Software</title><content type='html'>Listening to my favorite podcast, &lt;a href="http://www.lugradio.org"&gt;lugradio&lt;/a&gt;, makes me feel like I've sold out to the evil empire. Then I realized, hey, I run free software! It's called &lt;a href="http://www.microsoft.com/windows"&gt;Windows&lt;/a&gt;. I have never paid penny #1 for it in seventeen years. OK, maybe its cost is embedded in the price of the hardware I buy. Well, most of those in the rabid Linux community have paid that same price. They just took the extra step of not using it after paying for it, then installing something that is often unsupported by major hardware vendors and makes their lives much more difficult. Their goals are more noble than mine. Mine largely entail getting my job finished every day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-115081977861597494?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/115081977861597494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=115081977861597494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115081977861597494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/115081977861597494'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/06/i-run-free-software.html' title='I Run Free Software'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-114493064857062886</id><published>2006-04-13T07:57:00.000-04:00</published><updated>2006-11-01T13:26:43.240-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Software Dev Future</title><content type='html'>The age of just writing custom code for most solutions is coming to a close. The companies who create the new standards and "platforms" (Google, Microsoft, open source groups, et. al.) will still need developers to cook applications from new code, but the bulk of the rest of us will be increasingly involved in 1) picking and choosing among the components we need that these standards makers offer, and 2) wiring together the services exposed by these platforms.&lt;br /&gt;&lt;br /&gt;There seems to be a lot of resistance among the developers I talk to about this shift. I hope you're ready for this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-114493064857062886?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/114493064857062886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=114493064857062886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/114493064857062886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/114493064857062886'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2006/04/software-dev-future.html' title='Software Dev Future'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-113504329821804001</id><published>2005-12-19T20:48:00.000-05:00</published><updated>2005-12-19T20:48:18.240-05:00</updated><title type='text'>Snow Tires</title><content type='html'>Get some. Got me some &lt;a href="http://www.nokiantyres.com/"&gt;Hakkapeliittas&lt;/a&gt; for the VW oil burner. Wow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-113504329821804001?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/113504329821804001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=113504329821804001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/113504329821804001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/113504329821804001'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/12/snow-tires.html' title='Snow Tires'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-113277030313400384</id><published>2005-11-23T09:14:00.000-05:00</published><updated>2005-11-23T13:25:03.156-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>How to Explain This</title><content type='html'>Draw a picture.&lt;br /&gt;If you think you're too smart to need to, you're wrong.&lt;br /&gt;If you think Joe over there understands what you're saying, you're wrong. You should draw a picture.&lt;br /&gt;If you think you understand Bob, you're wrong. He should draw a picture, write it down, look at you and ask, "you know what I'm saying?"&lt;br /&gt;My basic rule is if a design requires me to stash things in little cubby holes in my brain while someone is explaining it, words alone won't cut it. Example: "a queue is going to hold 50 items, and it's implemented as a table, so we need a stored procedure to update the date if it's already there, otherwise we'll insert --" STOP. Draw a picture, man, PLEASE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-113277030313400384?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/113277030313400384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=113277030313400384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/113277030313400384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/113277030313400384'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/11/how-to-explain-this.html' title='How to Explain This'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112991277254560767</id><published>2005-10-22T00:10:00.000-04:00</published><updated>2006-07-17T19:06:40.823-04:00</updated><title type='text'>If God Raced a Motorcycle</title><content type='html'>He'd be &lt;a href="http://en.wikipedia.org/wiki/Valentino_Rossi"&gt;Valentino Rossi&lt;/a&gt;. He wouldn't have to create the &lt;a href="http://www.forza46.com/"&gt;supreme motorcycle racing being&lt;/a&gt;, He already has. Rossi wraps up yet another consecutive world title when it seems the machine doesn't even matter (his Yamaha was and may still be inferior). The competition can't keep up.  He passes people at will. What can you say? Sure, God probably wouldn't have dumped it by colliding with Melandri at &lt;a href="http://www.crash.net/uk/en/feature_view.asp?cid=6&amp;fid=8247"&gt;Motegi&lt;/a&gt; (OK, definitely would not have), and God would have won at &lt;a href="http://www.crash.net/uk/en/feature_view.asp?cid=6&amp;fid=7823"&gt;Laguna Seca&lt;/a&gt; and &lt;a href="http://www.crash.net/uk/en/feature_view.asp?cid=6&amp;fid=8280"&gt;Malaysia&lt;/a&gt; somehow. BUT, do you think He could have pulled off that win in the pouring rain at &lt;a href="http://www.crash.net/uk/en/feature_view.asp?cid=6&amp;fid=7905"&gt;Donnington&lt;/a&gt;? No, at least not any better, probably. Maybe.&lt;br /&gt;&lt;br /&gt;I try to keep things focused on software development and related biz stuff, but &lt;a href="http://www.rossifiles.com/"&gt;Rossi is The Man&lt;/a&gt;. Surely there's a way to relate this to this blog's purpose, but since it's mystifying how he does it, it may forever be disconnected from any reality.&lt;br /&gt;&lt;br /&gt;Forza Rossi!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112991277254560767?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112991277254560767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112991277254560767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112991277254560767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112991277254560767'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/if-god-raced-motorcycle.html' title='If God Raced a Motorcycle'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112959901042300802</id><published>2005-10-17T21:08:00.000-04:00</published><updated>2005-10-22T11:13:22.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>The Tuna Speaks Management</title><content type='html'>Bill Parcels last week, commenting on Drew Bledsoe and Keyshawn Johnson having a sideline spat vs. Philadelphia after a dropped pass:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;No, that was nothing. I mean that's nothing. Really, it's nothing. Those two high strung guys -- Actually I had told the team the week before or two weeks before: Hey listen if you don't trust each other enough to air out your differences, you are never going to have a team. If you are afraid of conflict within the team and afraid of confrontation within the team, you are never going to have a team. That's not a team. That's a bunch of guys soaking around wondering what the other guy is thinking. So, I am not saying that I encourage that, I tell them that you have to trust your teammates enough to be able to say what you want to say. If you don't do that, then you are never going to have a team. I have always believed that. You guys know from the teams I had. They weren't exactly uninhibited.&lt;/span&gt;&lt;/blockquote&gt; Why would I care about what Parcells has to say?  His career has all been downhill since his greatest gig as coach of the &lt;a href="http://www.giants.com/"&gt;Giants&lt;/a&gt;. Well, he does makes sense. So much sense:&lt;br /&gt;&lt;blockquote&gt;Say what you think -- really, SAY it&lt;br /&gt;Be in an environment where that is accepted&lt;br /&gt;Hear it, digest it, move on&lt;br /&gt;Use it to get better&lt;/blockquote&gt; How many places are out there where &lt;span style="font-weight:bold;font-style:italic;"&gt;being professional&lt;/span&gt; means keeping your mouth shut? Or couching your point in well-laundered language? Or softening a meaning when it's said about the boss? Or working at a place where everyone wants things placid and coated in a smooth, white gloss? Where dissension is an evil thing?&lt;br /&gt;&lt;br /&gt;I don't mean we should all be loose cannons. I just believe there is more to be gained by being frank at critical moments rather than holding back. The people will smooth it out between and among themselves, the organization will benefit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112959901042300802?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112959901042300802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112959901042300802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112959901042300802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112959901042300802'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/tuna-speaks-management.html' title='The Tuna Speaks Management'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112959757403488429</id><published>2005-10-17T21:03:00.000-04:00</published><updated>2005-10-17T21:06:14.920-04:00</updated><title type='text'>My my my, This is Cool</title><content type='html'>&lt;a href="http://www.placeopedia.com/"&gt;Placeopedia.com&lt;/a&gt; is worth a look, &lt;a href="http://www.wikipedia.com/"&gt;Wikipedia&lt;/a&gt; with a map.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112959757403488429?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.placeopedia.com/' title='My my my, This is Cool'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112959757403488429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112959757403488429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112959757403488429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112959757403488429'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/my-my-my-this-is-cool.html' title='My my my, This is Cool'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112915672401105259</id><published>2005-10-12T23:21:00.000-04:00</published><updated>2005-10-22T11:18:14.176-04:00</updated><title type='text'>Joel</title><content type='html'>Love him or loathe him, &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt; makes software-development-sense. I wish more people would read things like &lt;a href="http://www.joelonsoftware.com/articles/PickingShipDate.html"&gt;Picking a Ship Date&lt;/a&gt; or &lt;a href="http://www.joelonsoftware.com/articles/SetYourPriorities.html"&gt;Set your Priorities&lt;/a&gt;. I'm sure Joel is a pragmatic guy, and though I have no idea if he chows on his own dogfood, I find that I sit here and nod and go "uh-huh" when I read him. He's right on.&lt;br /&gt;&lt;br /&gt;Software needs to get done. It &lt;span style="font-style:italic;"&gt;has to&lt;/span&gt; do things that are critical to the purpose, and it &lt;span style="font-style:italic;"&gt;should&lt;/span&gt; do things that are helpful. It probably should not try to do much else unless it never needs to ship. And make sure it's what the people want&amp;#8212;if that's possible. Amen, bruh-thuh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112915672401105259?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112915672401105259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112915672401105259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112915672401105259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112915672401105259'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/joel.html' title='Joel'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112907004103403172</id><published>2005-10-11T22:23:00.000-04:00</published><updated>2005-10-22T11:24:04.143-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Rant: Process Schmocess</title><content type='html'>In the art of software development with teams larger than one, a process for repeating results is about people. It's about getting them to cooperate and produce something great. That's really it.&lt;br /&gt;&lt;br /&gt;I hear groups talk about processes and "resources" (meaning people) and action items and critical paths and all this stuff, and they're full of crap. Their eyes are not on the ball. Management of the process has become the game. &lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;"A perfection of means, and confusion of aims, seems to be our main problem." -- Albert Einstein.&lt;/span&gt;&lt;/blockquote&gt; Groups get together and do things in order to produce software. It has to be useful. It's the result of solving a problem, sometimes a whole bunch of problems. If you have an elaborate "process" and spend all your time in that realm, you are &lt;span style="text-decoration:line-through;"&gt;possibly&lt;/span&gt; probably losing sight of the goal -- great software.&lt;br /&gt;&lt;br /&gt;A small group that cranks out great software (meaning it's actually used, it sells, it's profitable, innovative, loved&amp;#8212;whatever the criteria for "great" are) and has no process &lt;span style="font-style:italic;"&gt;has a good process&lt;/span&gt;. If you're a project manager on a team of, say, five people, there is a chance you already have too much "process" smothering your team.&lt;br /&gt;&lt;br /&gt;I used to work with a project manager who was the epitome of ineffective. He would try to explain to us something, but it sounded like, "Yeah, we, um, need to review these milestones so we can firm up our deliverables and line up resources so that we can review this with the client at the weekly status meeting and satisfy the action items from last time, too. Alright, see ya." I'd turn to my coworker and ask if he knew what we were supposed to do. "Nope." Me neither.&lt;br /&gt;&lt;br /&gt;How about, "Grab Chris, and the two of you get that piece working well enough for us to review it WEDNESDAY A.M. If you have any problems, let me know TUESDAY a.m. and we'll figure out what to do. The client wants an update on THURSDAY. Capiche?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112907004103403172?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112907004103403172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112907004103403172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112907004103403172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112907004103403172'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/rant-process-schmocess.html' title='Rant: Process Schmocess'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112862446144826468</id><published>2005-10-06T09:30:00.000-04:00</published><updated>2005-10-06T14:49:57.400-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><title type='text'>IT Conversations</title><content type='html'>&lt;a href="http://www.itconversations.com"&gt;This site&lt;/a&gt; is a great place to get webcasts or podcasts (or what you will call them) to learn something on your long commute. Download some of these to your music player, start with the highest rated ones. Good stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112862446144826468?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.itconversations.com' title='IT Conversations'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112862446144826468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112862446144826468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112862446144826468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112862446144826468'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/it-conversations.html' title='IT Conversations'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112847842985297218</id><published>2005-10-04T21:55:00.000-04:00</published><updated>2005-10-22T11:33:52.810-04:00</updated><title type='text'>AJAX is the Word</title><content type='html'>I'm late to this. AJAX (courtesy of &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;, and see those guys at &lt;a href="http://www.adaptivepath.com/"&gt;Adaptive Path&lt;/a&gt;) might be the thing that finally kills off desktop applications once and for all. The time we spend building setup programs, planning updates that don't do unplanned carnage, and duplicating things when we need both a Windows and web app is astounding.&lt;br /&gt;&lt;br /&gt;It's interesting to see how Microsoft, the inventor of &lt;a href="http://developer.apple.com/internet/webcontent/xmlhttpreq.html"&gt;XmlHttpRequest&lt;/a&gt;, made this possible and then left it out there for others to run with. Now, because of the bewildering flavors of and platforms for AJAX&amp;#8212;that is, a lack of a standardized approach&amp;#8212;Microsoft may yet wrest control of this from the masses with ASP.NET 2.0 and Atlas. And &lt;a href="http://www.ajaxian.com/archives/2005/09/rails_ajaxians.html"&gt;criticism like this&lt;/a&gt; is going to help Microsoft take some of these people by surprise, because they don't get what they think they get. Again.&lt;br /&gt;&lt;br /&gt;We can dink with Javascript calls to the server and sew together script.aculo.us and AJAX.NET or DOJO or, man, you name your cobbled together toolset. But this is like version 0.53871 of Web 2.0. We're soon going to look back on this as we do on Windows API programming. A standard way of coding this on the server side is needed. Maybe Microsoft will have the answer, but I shudder to think of how horrid the Javascript generated by Atlas is going to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112847842985297218?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://del.icio.us/djuth/Ajax' title='AJAX is the Word'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112847842985297218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112847842985297218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112847842985297218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112847842985297218'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/10/ajax-is-word.html' title='AJAX is the Word'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-112319213660498977</id><published>2005-08-04T21:45:00.000-04:00</published><updated>2005-10-04T21:41:30.560-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>A Good Test</title><content type='html'>Need a good test for your database application? Take your database server offline. While it's off, write some unit tests and then see how your application is doing. There are a lot of things you may not have realized but thought were OK. For example, does it really need to throw an exception? Does your application's last line of defense (e.g. OnThreadException in .NET) really need to kick in to handle these problems? Shouldn't your program let people work disconnected anyway? Of course I'm raising this issue because our database server is down right now :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-112319213660498977?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/112319213660498977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=112319213660498977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112319213660498977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/112319213660498977'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/08/good-test.html' title='A Good Test'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-111698473150992976</id><published>2005-05-24T21:31:00.000-04:00</published><updated>2005-11-05T07:44:32.463-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Test before you Guess</title><content type='html'>Test First, Test Driven Development, TDD, et. al. that represent this now not so new, agile way of developing software... we haven’t jumped into it yet. There is a hurdle and much has been said about this barrier. It can be a hard sell if your audience isn't ready to hear it.&lt;br /&gt;&lt;br /&gt;Really, how do you make the case to the people writing the paychecks and putting their necks on the project profitability line that this isn’t some techie geek indulgence? Well:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Look, it’s a lot of effort up front, and we would rather be writing code and smoking with the time saved not doing it (up front, that is), rather than devising, cataloging, and coding these tests and associated harnesses and refactoring classes into testable units.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When you suits want to get a handle on the state of the project, or its quality (i.e., do we have a handle on WHEN it’s going to be FINISHED and ACCEPTED), we can almost tell you.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When (not IF) a change request is accepted and implemented, re-running the tests will tell us if it's broken the rest of the system, without guessing or losing sleep.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;The rejection of the myth that we go from requirements-&gt; design-&gt; implementation-&gt; testing-&gt; delivery, in exactly that sequence, is the difference between being effective and failing. TDD sets up your processes to cope with this. Yes, after two weeks using TDD, you may appear way behind, but once the software is feature complete, you won’t be called to the carpet as much for blowing estimates, requirements, QA time, and client &lt;a href="http://www.word-detective.com/121800.html"&gt;agita&lt;/a&gt;. That's time well spent, and saved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-111698473150992976?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/111698473150992976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=111698473150992976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111698473150992976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111698473150992976'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/05/test-before-you-guess.html' title='Test before you Guess'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-111693819252779457</id><published>2005-05-24T08:24:00.000-04:00</published><updated>2005-10-17T21:38:37.236-04:00</updated><title type='text'>The Network is...</title><content type='html'>Not long ago there was publicity about the computer, the network, and a slick way to glue all this together seamlessly. "The network is the computer" was the mantra, and Java was going to enable our toasters to talk to our iceboxes and stuff like that. Well, this kind of infrastructure, which is dependent on fast and reliable bandwidth, is slowly becoming real, and the snapshot of where we are now shows some value.&lt;br /&gt;&lt;br /&gt;For example, storage. I need to store stuff and get to it from anywhere, when I want. Email, passwords, financial records, my favorite bookmarks, whatever. Some of this works pretty well.&lt;br /&gt;&lt;br /&gt;But it's chaos. &lt;br /&gt;&lt;br /&gt;My email address is... let me think, because I have at least ten of them available to me, and three or four that I use for various things. One for work, one for friends, one for my son's soccer stuff, one to back up my files, one for spammers.&lt;br /&gt;&lt;br /&gt;I store things I need at... hmmm, have to catalog all those places where I have megabytes and in a couple cases gigabytes of storage available to me, using ftp, http, vpn, or even CD burner, usb flash drive, or "mp3" hard-disk player.&lt;br /&gt;&lt;br /&gt;My latest thoughts are collected in... a notebook, my blog, random documents on hard drives, emails. &lt;br /&gt;&lt;br /&gt;No wonder I'm confused.&lt;br /&gt;&lt;br /&gt;We are all still learning how to do this. It's a point in the history of our connected world that will be seen as an amusing transition to something much better down the road. We're experimenting, and we're learning and making it better every day. There isn't going to be an end point, but you can fix your own at any time. Just stop learning and trying new things, settle on that set of technologies you're comfortable with, plant your feet and put your hands on your hips and exhale. Frown at how this all seems to be spinning out of control and leaving you bewildered. Good thing the rest of us aren't doing that...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-111693819252779457?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/111693819252779457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=111693819252779457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111693819252779457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111693819252779457'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/05/network-is.html' title='The Network is...'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-111638149756996245</id><published>2005-05-17T21:54:00.000-04:00</published><updated>2005-05-17T22:22:15.046-04:00</updated><title type='text'>A Friend's Passing</title><content type='html'>An old friend with whom I lost touch long ago passed away on Sunday. He was 39, taken by a brain tumor. I can't travel to the funeral tomorrow, but I wanted to let his family know I remember him, so I signed the funeral home guestbook online:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;My memories of him are mostly from our childhood days in Martinsville, and they are happy memories. He helped me learn how to do things like ride a motorcycle (and I think of him every time I ride mine), laugh like it was all that mattered, and have the courage to face things I’d rather back away from. I lost touch with him years ago, but I am glad to have known him. My thoughts and prayers are with him and all of you.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Life, I'm reminded yet again (and I really didn't need to be, honest), is way, way too short and not predictable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-111638149756996245?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/111638149756996245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=111638149756996245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111638149756996245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/111638149756996245'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/05/friends-passing.html' title='A Friend&apos;s Passing'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-110713082056285883</id><published>2005-01-30T21:12:00.000-05:00</published><updated>2005-11-05T07:46:27.266-05:00</updated><title type='text'>Rant: Direcway</title><content type='html'>The city or the country? Broadband web access or something else? I weighed these choices before I moved to the boonies. Satellite internet access is the only choice aside from dial-up. It’s a big step down. It’s a big letdown. Fair access policy (&lt;a href="http://www.copperhead.cc/fap_nn4.html"&gt;FAP&lt;/a&gt;) and bandwidth throttling, no VPN, a system that has its own locked-down &lt;a href="http://computer.howstuffworks.com/nat.htm"&gt;NAT&lt;/a&gt; and &lt;a href="http://www.webopedia.com/TERM/D/DHCP.html"&gt;DHCP&lt;/a&gt;, no &lt;a href="http://www.giganews.com"&gt;newsgroups&lt;/a&gt;… what more can you not want?&lt;br /&gt;&lt;br /&gt;I found a nifty utility to monitor bandwidth used before the FAP kicks in, but since it costs $25, I hesitate to endorse it in any way. I’ve already spent enough just to get mediocre internet access: $500 for the equipment and installation, a $60 monthly fee; now I have to pay more just to manage this service?&lt;br /&gt;&lt;br /&gt;Almost make me want to go back to civilization. Almost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-110713082056285883?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/110713082056285883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=110713082056285883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110713082056285883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110713082056285883'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/01/rant-direcway.html' title='Rant: Direcway'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-110686810528750472</id><published>2005-01-27T21:18:00.000-05:00</published><updated>2005-05-24T23:09:22.203-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Software Requirements -- Communication</title><content type='html'>Reams have been written, but before you jump into it again, remember three critical things:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Define how your team will communicate first.&lt;/li&gt;   &lt;li&gt;Communicate clearly, concisely, and constantly.&lt;/li&gt;&lt;li&gt;Be conversant in the problem domain, and use terms precisely.&lt;br /&gt;  &lt;/li&gt;  &lt;/ol&gt; No matter how you slice methodologies and approaches to the discovery process, poor communication will kill you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-110686810528750472?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/110686810528750472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=110686810528750472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110686810528750472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110686810528750472'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/01/software-requirements-communication.html' title='Software Requirements -- Communication'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-110684915432919066</id><published>2005-01-27T09:05:00.000-05:00</published><updated>2005-11-05T07:43:30.210-05:00</updated><title type='text'>A New Post</title><content type='html'>All done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-110684915432919066?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/110684915432919066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=110684915432919066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110684915432919066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/110684915432919066'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2005/01/new-post.html' title='A New Post'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
