<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Code</title>
        <link>http://www.dsokol.com/category/2.aspx</link>
        <description>Code, programming, Visual Studio stuff, and software engineering junk.</description>
        <language>en-US</language>
        <copyright>David J. Sokol</copyright>
        <managingEditor>david.sokol@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>So Now I'm a Contractor / 16 Tips for Being a Contract Programmer</title>
            <link>http://dsokol.com/archive/2007/11/19/so-now-im-a-contractor--16-tips-for-being.aspx</link>
            <description>&lt;p&gt;&lt;a href="#the-list"&gt;Skip my personal experience and go right to the list.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I realized, last week, that I am a contract coder.  I never intended to be one; I wanted a job with a regular boss and a 401k and a health insurance plan.  Sure, contractors earn more, but they also deal with a lot more instability in their daily lives.  As of right now, I'm not sure if I'll be employed next week.  I have a job lined up, but it's only a temp deal for around $1500 total.  That covers about a month of my living, if I stretch it thin.&lt;/p&gt;
&lt;p&gt;Right now I have a desk and a job and an employer.  My employer doesn't seem to exist sometimes; I have very spotty (once-twice a week) contact with my boss, and I deal mainly with the customer over the phone.  My paychecks are irregular; I work 40ish hours a week and get my pay at intervals ranging from 6 to 42 days.  Right now my paycheck for the 1st was received on the 16th.  Over the past few months I've accrued over $600 in late fees due to instable pay.  This has all been on the same job with the same contract.  Well, contract is a funny word; I didn't sign anything.  Right now I go to work and do some stuff and then get paid an agreed-upon amount.  If myself or my employer ducks out at anytime, I've got no legal reprisal.  I doubt I'll even get 1099ed.&lt;/p&gt;
&lt;p&gt;This life sucks.  Sure, my friends are making around $7-10/hour, and I'm getting ~$30, but I lose &lt;em&gt;tons&lt;/em&gt; of my money to extras.  I have to buy my own computers, &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx"&gt;my own IDE&lt;/a&gt; (and &lt;a href="http://www.jetbrains.com/resharper/"&gt;add-ons&lt;/a&gt;), I have no automatic tax withdrawal, I have to get health insurance through a third expensive party.  I'm not guaranteed pay at all.  This is, by far, the worst possible career choice right out of college.  If I was at a startup, that'd be something different.  That'd be a common goal with the allure of hitting it big.  No, the best thing I have to look forward to is a slightly bigger paycheck that might on time and not getting nailed by the IRS.&lt;/p&gt;
&lt;p&gt;I repeat: do not start contracting for yourself right out of college.  Unless you like the adventure and the unknowns or you just have a lot of extra money lying around (Like, taking out loans instead of paying them back, like I start next month), I would not recommend it at all.  If you do it on the side to get some extra cash?  That's fine; that's extra.  But when you first get on the scene and are trying to make some money to eat more then hot-pockets and beer, get a stable job.&lt;/p&gt;
&lt;p&gt;If you decide to ignore my above advice, I have some other, possibly more helpful advice that I've learned (and wished I'd followed) as a contractor.  I've only been doing this about half a year, but I think it's worth it's salt.  It's born out of sweat and tears (well, not tears, but a nervous breakdown or two.  Well, the salt that would have been in the metaphorical tears, so lets go back to tears).  &lt;/p&gt;
&lt;p&gt;Enough with the intro shit, lets get right to it&lt;a href="#id-this-quote"&gt;*&lt;/a&gt;.&lt;/p&gt;
&lt;a id="the-list"&gt;&lt;/a&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Get your taxes done professionally&lt;/strong&gt;.  There is a &lt;em&gt;ton&lt;/em&gt; of stuff you (and I) don't know about that you can get money back on.  Well worth it. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Sign contracts with your employers&lt;/strong&gt;.  Starting out it's easy to use the line &lt;em&gt;"Oh, sure, I'll write up that program for $15/hour."&lt;/em&gt;  Don't do it.  Nothing sucks more then bugging somebody for money when you don't have a written agreement. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Don't write code without signed specifications&lt;/strong&gt;.  Write your specifications jointly with your clients and agree what the program will and will not do.  &lt;a href="http://www.amazon.com/Software-Requirements-Second-Karl-Wiegers/dp/0735618798"&gt;Software Requirements from Microsoft Press&lt;/a&gt; is a great book, and a must read for any independent contractor.  Even if it's a simple list of 'This software will/this software won't', it's better then nothing. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Make sure your employers give you the right tax forms.&lt;/strong&gt;  In GA, if you do over $700 of business with somebody, they need to send you form 1099.  This may be a bigger issue with some people, but I find it pretty important.  I don't like living in fear of huge fines. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Understand how software licensing works.&lt;/strong&gt;  When I first got out of school, I had my wonderful MSDNAA academic licenses of Visual Studio, SQL Server, Visio, Windows Server, Access... well... every Microsoft product but Office.  &lt;a href="http://msdn.microsoft.com/academic/program/usageguide/default.aspx"&gt;Pretty much everything you do now will be under the 'unacceptable' category&lt;/a&gt;.  There's probably a few good resources on the web, but actually going through and reading the EULA before clicking &lt;em&gt;Next&lt;/em&gt; does wonders too. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Don't spend money until you actually have it&lt;/strong&gt;.  If you send out an invoice for $1000, don't spend the money until it's back in your hands or in your bank account.  Don't assume all clients will pay prompt; calling them on the phone and telling them how you have to pay rent is remarkably unprofessional. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Know when to say 'no' to new features and additional work&lt;/strong&gt;.  Most customers do this unintentionally, but think critically about every little 'change' made to the software.  Even something as trivial sounding as upper-casing everything in the application can turn into a hassle; make sure they know it's billable. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Keep track of your miles&lt;/strong&gt;.  Start writing down all of your odometer readings when you drive to and from customer sites.  This is tax deductible/See #1. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Track your finances and save all of your receipts&lt;/strong&gt;.  For everything.  Get a filing cabinet.  Get some financial software.  I use MS Money (it's... decent.)  Another guy I know uses Quicken.  &lt;a href="http://a-simian-mind.blogspot.com/2007/08/microsoft-money-plus-vs-quicken-2008.html"&gt;Apparently they both kind of suck&lt;/a&gt;, but you need to keep track of everything.  Hell, use ledger paper if you have to. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;If possible, use a separate email address for work purposes&lt;/strong&gt;.  This makes categorizing everything when it sinks into your inbox.  Don't get client emails intermixed with forwards of forwards from relatives who just got the Internet. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Keep business and friendship as separate as possible&lt;/strong&gt;.  When you start out, chances are a lot of your customers will be friends, or friends of friends.  Remember, this is a business and your livelihood.  If they can't make pay that's acceptable to you (or want something for a ridiculously low price), don't do.  Friendship be damned, you have to eat. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Know when a project is too big&lt;/strong&gt;.  Don't agree to do something unless you're sure you can do it.  Right out of college, everything seemed easy to me.  I estimated a 6 month job at about 1 month.  Whoops.  Chances are, when you agree to do a &lt;em&gt;small website for a local business&lt;/em&gt; over lunch one day, you're biting off a huge project.  The line 'I'll have to know about the project more in depth before I commit to anything.' has served me well. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Make sure you have some sort of health insurance&lt;/strong&gt;.  Car problems suck, health problems suck more.  One ambulance ride can set you back a few thousand.  Nothing will cut your profits faster then a trip to the hospital.  It is well worth the $100-$200/month.  (Monthly rates may vary, mine are much higher.  Damn accident-prone-ness.) &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Never ever ever ever ever stop learning&lt;/strong&gt;.  I know this goes for programmers and IT guys and computer people double, but it goes quadruple for the self-employed.  Not only do you have to keep up with technology, but you have to keep up with running your own business and everything about your life.  You have no handy HR rep to go to.  Always be on the lookout for information. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Keep your clients costs in mind.&lt;/strong&gt;  All of the clients I've worked with are fond of fixed-price contracts.  Fixed price contracts are hell on developers.  We like hourly, in case unknown stuff pops up or your client keeps making changes over time.  If your client has a set budget, keep it in mind.  Bill hourly, but only work hours that will meet your clients budget.  If they have $2000 to spend on the program, and you bill at $10/hour, work 200 hours.  Cut the extra stuff, like input validation, and any other crap that doesn't fall into the primary use cases.  Yes, there is a matter of personal pride, but presenting a large bill to your customer with excellent software is probably worse then presenting the expected bill with some average software. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Make sure to discuss long term client support options.&lt;/strong&gt;  You might not be contracting forever; who is going to take care of the application after you move off across the country?  Not saying that anything needs to be decided, just make sure that all parties know how support is going to work. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;&lt;a id="id-this-quote"&gt;&lt;/a&gt;* Bonus points for identifying the quote.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Edit:  A few days later, some guy on reddit posts this: &lt;a href="http://www.wakeuplater.com/freelance-lessons/10-absolute-nos-for-freelancers.aspx"&gt;10 Absolute "No's!" for Freelancers&lt;/a&gt;&lt;/p&gt;.  Poor apostrophe-ing aside, it's a good read.&lt;img src="http://dsokol.com/aggbug/23.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/11/19/so-now-im-a-contractor--16-tips-for-being.aspx</guid>
            <pubDate>Mon, 19 Nov 2007 07:23:44 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/23.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/11/19/so-now-im-a-contractor--16-tips-for-being.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/23.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Magic Usually Falls Short</title>
            <link>http://dsokol.com/archive/2007/09/05/magic-usually-falls-short.aspx</link>
            <description>&lt;p&gt;Last Thursday I was given the okay to write a company bug tracker.  It was pretty clear that we needed a tracker, but I never got the okay to do it.   I've been playing with the idea of using &lt;a href="http://www.subsonicproject.com/"&gt;SubSonic&lt;/a&gt;, but my other project is sitting at 85% completion and I didn't want to introduce new technology until it was delivered.  Now was the perfect opportunity to use a rapid development tool to build a new bug tracker.  As of today, it's functional.  Users can file bugs, read bugs, upload files, assign bugs, etc.  All in the span of about 14 hours of development.&lt;/p&gt;
&lt;p&gt;SubSonic accounts for a lot of the speed in development.  Since I wasn't worried about SQL or SPROCs or database side stuff, I could focus solely on the business logic and HTML.  (I must admit that about two hours were spent tweaking stylesheets; I'm a horrid designer.)  The project got up fast and I only used the &lt;font face="Courier New"&gt;generate&lt;/font&gt; command of SubSonic.  No &lt;font face="Courier New"&gt;Scaffolds&lt;/font&gt; or &lt;font face="Courier New"&gt;ManyMany&lt;/font&gt; lists or &lt;font face="Courier New"&gt;Sugar&lt;/font&gt; module.  To be honest, I didn't deal with the scaffolds until the last hour.  &lt;a href="http://geekswithblogs.net/scottkuhl/archive/2006/12/08/100701.aspx"&gt;I was simply amazed by what they could accomplish in such little code.&lt;/a&gt;  I had been writing the CRUD pages for my tables, but after I learned of this super-easy method and how well it worked, I deleted my pages and replace them all with Scaffolds.&lt;/p&gt;
&lt;p&gt;Huge mistake.  (Like, revert huge.)  One of the pages I was deleting was one for editing a basic Users table.  You know, name, email, address, social security number; the usual.  The scaffold worked beautifully for everything in the database.  The problem was that the DB table was synced with the ASP.NET SqlMembershipProvider to do security.  Whenever a user is added to the system, they get added to the &lt;font face="Courier New"&gt;aspnet_Users&lt;/font&gt; table by calling &lt;font face="Courier New"&gt;Membership.CreateUser(user, password)&lt;/font&gt;.  Right after that, a row is created in the &lt;font face="Courier New"&gt;SiteUser&lt;/font&gt; table that stores all of the extra user information that we need.  They are joined on the user's username.  The scaffold doesn't know this, nor does it care.  I was screwed.&lt;/p&gt;
&lt;p&gt;By using the scaffold in this situation, I was eliminating some necessary behavior in my application.  Sure I dropped the code size by more then 150 lines.  But the new stuff didn't include the one line I really needed.  &lt;strong&gt;Whenever you use RAD tools, you usually lose the ability to fine tune.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The same holds true for using a DataGrid vs. a Repeater.  The DataGrid does a lot of things magically.  I was amazed that it could just auto-generate columns and throw the entire table up onto the web page.  After the initial "whooosh" of the magic hitting my eyes at 80mph, I realized that the table wasn't easily customized and wasn't that flexible.  I ended up using &amp;lt;asp:TemplateColumn/&amp;gt; for almost every column.  Since I was essentially the code inside each table cell, the only thing I gained was not having to deal with the &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; elements.  This is still an advantage, kind of.  But having all of my data was buried under &amp;lt;td&amp;gt;s and &amp;lt;div&amp;gt;s, it was incredibly hard to style via CSS.  I lost a an hour just trying to figure out how to make the &amp;lt;td&amp;gt; elements have a border.&lt;/p&gt;
&lt;p&gt;I know it's naive to expect a new tool or technology to magically fix your problems.  No silver bullets and all that jazz.  When C# and Java came out, it was fantastic because we no longer had to deal with memory management.  I think this is a good thing; programmers shouldn't be messing around with memory.  With things like Rails and certain aspects of SubSonic, it prevents the programmers from overriding certain methods and styles.  &lt;strong&gt;When you move up the ladder of abstraction, make sure you don't abstract away control you might need.&lt;/strong&gt;  If you do, you will only solve some problems to create new ones.&lt;/p&gt;
&lt;p&gt;10 September 2007: Grammar and style edits.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/22.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/09/05/magic-usually-falls-short.aspx</guid>
            <pubDate>Wed, 05 Sep 2007 04:15:08 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/22.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/09/05/magic-usually-falls-short.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/22.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Developing on Windows Vista</title>
            <link>http://dsokol.com/archive/2007/07/22/developing-on-windows-vista.aspx</link>
            <description>&lt;p&gt;Developing on Vista can be annoying.  Mostly because of the security enhancements and compatibility issues.  Well, only because of the security enhancements and compatibility issues.  I, personally, am used to running around on my development machine with full administrator privileges dropping database tables and debugging on IIS.  Sadly, in Vista, this isn't possible.  Even installing the standard development tools is annoying and requires special steps and patches.  A few months ago, I set up a development machine at my house.  It took about a day, plus more troubleshooting time.  I was about to uninstall Vista entirely, but that would have been the waste of a day.&lt;/p&gt;
&lt;p&gt;I recently got a new laptop, a Dell D630, dedicated solely to code/other.  It came with a Vista license, and I stuck with it.  This is my experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Timeline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;2:19PM&lt;/strong&gt; - Put in the install disks.  I'll skip the non-developer related steps. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;2:38PM&lt;/strong&gt; - Vista installed, started installing patches (23 updates) and missing device drivers. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;3:18PM&lt;/strong&gt; - Started installing helper programs, such as &lt;a href="http://insentient.net/"&gt;Switcher&lt;/a&gt;, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=winrar"&gt;WinRAR&lt;/a&gt;, and setting up WMP11. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;3:29PM&lt;/strong&gt; - Installed the core development utilities: &lt;a href="http://www.google.com/search?source=ig&amp;amp;hl=en&amp;amp;q=tortoisesvn"&gt;TortoiseSVN&lt;/a&gt;, &lt;a href="http://www.google.com/search?source=ig&amp;amp;hl=en&amp;amp;q=gvim"&gt;gVim&lt;/a&gt;, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=firefox"&gt;FireFox&lt;/a&gt;, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=FireBug"&gt;FireBug&lt;/a&gt;, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=ie+developer+toolbar"&gt;IE Developer Toolbar&lt;/a&gt;, changing folder options to show hidden files &amp;amp; extensions. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;3:48PM&lt;/strong&gt; - Received "A device attached to the system is not functioning." error.  Restarted.  Was pretty sure my install was already hosed. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;3:58PM&lt;/strong&gt; - Started installing Visual Studio.NET. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;4:17PM&lt;/strong&gt; - Started downloading &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/bb265237.aspx"&gt;Visual Studio 2005.NET Service Pack 1&lt;/a&gt;.  Averaged 320kbps. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;4:43PM&lt;/strong&gt; - Started installing VS.NET Service Pack 1. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;4:57PM&lt;/strong&gt; - Finished inspecting configuration, actually gave me the prompt to install Service Pack 1. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:14PM&lt;/strong&gt; - Received "Error: 1331.  Failed to correctly copy MFC80UD.dll file: CRC error."   Twice.  Doesn't &lt;em&gt;seem&lt;/em&gt; to have caused a problem.  2nd error so far. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:20PM&lt;/strong&gt; - Downloaded and installed the Visual Studio Service Pack 1 Update for Windows Vista. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:29PM&lt;/strong&gt; - Started SQL Server Management Studio Express install. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:36PM&lt;/strong&gt; - Realized I didn't have my Office and Visio CDs readily available.  Started tearing apart my room. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:40PM&lt;/strong&gt; - Started installing Office 2007. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:49PM&lt;/strong&gt; - Setup error, had to roll back the office 2007 install.  3rd error.  A cryptic one at that. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;5:54PM&lt;/strong&gt; - Started Visio Install. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;6:19PM&lt;/strong&gt; - Initial checkout of the current code-base.  (Delayed, &lt;a href="http://programming.reddit.com/"&gt;I got distracted by Internet :(&lt;/a&gt; ) &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;6:23PM&lt;/strong&gt; - Started Visual Studio.NET &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;6:26PM&lt;/strong&gt; - Realized I needed the ASP.NET AJAX extensions installed.  Made it happen. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;6:32PM&lt;/strong&gt; - DEVELOP ON!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4 hours 13 minutes.  Half a day and a smoke break.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tips and Common Problems&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Run the Visual Studio.NET installer as Administrator. &lt;/li&gt;
    &lt;li&gt;Run the Service Pack 1 installer as Administrator. &lt;/li&gt;
    &lt;li&gt;Run the Service Pack 1 Update for Vista as Administrator. &lt;/li&gt;
    &lt;li&gt;Run the SQL Server Management Studio Express installer as Administrator. &lt;/li&gt;
    &lt;li&gt;Whenever you run Visual Studio.NET, run it as administrator.  If not, things fail in odd ways.  Mainly related to IIS debugging. &lt;/li&gt;
    &lt;li&gt;Whenever you run SSMSE, run it as administrator.  If not, you won't have god rights to the database.  (This might be desirable, you can just set up mixed-mode authentication and connect with that.  I'm lazy.) &lt;/li&gt;
    &lt;li&gt;If you're having trouble with Internet Information Services 7, &lt;a href="http://a-simian-mind.blogspot.com/2007/06/hotfix-for-debugging-aspnet-on-vista.html"&gt;read this post&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;Yeah, pretty much run anything that deals with memory as Administrator.  It gets annoying, but necessary.  It's better then having applications silently fail.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Overall Experience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once you know the exact steps you need to do for Vista development, it's not all that bad.  Yes, you have to install a lot of applications, but it's pretty quick.  I think a much faster machine helped.  (I was using a 5 year old HP ZE5300.)  The most annoying thing, by far, is UAC.   It pops up constantly.  It blacks out my screen whenever I need to start Visual Studio.  And whenever I start SSMSE.  And I can't directly open .sln or .proj files anymore.  But damnit, I'm running this OS as Microsoft intended, though I think it's going to end up pissing me off.  UAC problems aside, I've done 16 hours of development on Vista with no other major setbacks.  Just don't mess with the Program Files folder with your app or through explorer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But wait, you're only doing Windows Development!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is very true.  If I used Eclipse, or Java, or Ruby, or Python, or some god-awful Lisp descendent, I wouldn't do it.  There are too many potential problems.  Vista ain't `zactly shiny.  If you're using a desktop, don't bother.  Most of the benefits of Vista (that I appreciate) are based on notebooks, tablets, and networking.  Otherwise, stick with XP (or OSX or whatever the hell &lt;a href="http://www.google.com/search?hl=en&amp;amp;sa=X&amp;amp;oi=spell&amp;amp;resnum=0&amp;amp;ct=result&amp;amp;cd=1&amp;amp;q=flavor+of+the+month+linux+distribution&amp;amp;spell=1"&gt;Linux Distro is hot&lt;/a&gt;.)  If it comes prepacked with a new PC, I wouldn't recommend reverting.  You're gonna hafta get with with the future at some point.  Or you could just run Windows 2000 for two years after XP's release, like I did.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/21.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/07/22/developing-on-windows-vista.aspx</guid>
            <pubDate>Mon, 23 Jul 2007 03:02:20 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/21.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/07/22/developing-on-windows-vista.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/21.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Learning to Estimate Development Time</title>
            <link>http://dsokol.com/archive/2007/06/11/learning-to-estimate-development-time.aspx</link>
            <description>&lt;p&gt;When you're taking a class in computer science, the schedule is fixed.  The semester &lt;em&gt;will&lt;/em&gt; be over on this date, end of story.  Your project &lt;em&gt;will&lt;/em&gt; be due before the end of the semester.  Individual projects may be pushed back, but that's a rare case.  This is somewhat similar to what I'm seeing in professional programming.  Your project &lt;em&gt;will&lt;/em&gt; be done by this date.  The difference is how the dates get set.&lt;/p&gt;
&lt;p&gt;In class, professors set due dates for assignments.  Of all my courses, not a single professor has come in and said "Okay, you need to program a R/B tree.  When do you think you'll have it done?"  I guess I always thought that I'd be given target dates to work towards.  Until I moved into management, anyway.  Actual programming in the real world has taught me differently.  My boss is constantly asking &lt;em&gt;me&lt;/em&gt; for schedule updates.  "When do you think you'll have component &lt;em&gt;x&lt;/em&gt; done?  What about component &lt;em&gt;y&lt;/em&gt;?  Can you ditch feature &lt;em&gt;j&lt;/em&gt; and finish feature &lt;em&gt;i&lt;/em&gt; for the demo next Tuesday?"  I've never estimated my own dates, ever.  And I must say, I'm pretty horrible at it.&lt;/p&gt;
&lt;p&gt;I've missed every single estimate so far.  At minimum by three days.  And I'm not even working in an extended timeframe, I'm doing three week estimates max.  Thankfully, the books I've been reading (mostly McConnell and general-development MS Press books) have all stated the same thing:  software estimation ability gets better with practice.  So I don't feel too bad about it.  I've been making a bunch of neophyte mistakes.  I'm still excited about the project, and &lt;a href="http://www.randsinrepose.com/archives/2006/01/23/subtlety_subterfuge_and_silence.html"&gt;I haven't been tripling my estimates&lt;/a&gt;.  Learning through practice, and all that jazz.&lt;/p&gt;
&lt;p&gt;But experience alone isn't fast enough.  I needed to take action!  What I &lt;em&gt;have&lt;/em&gt; done is to make a table of whenever create/commit to an estimate.  If I say I'm going to have component &lt;em&gt;y&lt;/em&gt; by day 15, I write that down.  Then I record how long it took me to finish component &lt;em&gt;y&lt;/em&gt;.  Sadly, only one of my components is actually complete; I need to start estimating in less broad terms.  Here's a look:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="510" align="center" border="1" unselectable="on"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" align="center" width="138"&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/td&gt;
            &lt;td align="center" width="104"&gt;&lt;strong&gt;Estimate&lt;/strong&gt;&lt;/td&gt;
            &lt;td align="center" width="84"&gt;&lt;strong&gt;Actual&lt;/strong&gt;&lt;/td&gt;
            &lt;td align="center" width="182"&gt;&lt;strong&gt;Comment&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="137"&gt;Data Access Objects&lt;/td&gt;
            &lt;td align="center" width="104"&gt;10 days&lt;/td&gt;
            &lt;td align="center" width="85"&gt;16 days&lt;/td&gt;
            &lt;td align="center" width="182"&gt;Underestimated data model complexity.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="138"&gt;Contract Component&lt;/td&gt;
            &lt;td align="center" width="104"&gt;7 days&lt;/td&gt;
            &lt;td align="center" width="86"&gt;:(&lt;/td&gt;
            &lt;td align="center" width="180"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="137"&gt;Claim Component&lt;/td&gt;
            &lt;td align="center" width="104"&gt;7 days&lt;/td&gt;
            &lt;td align="center" width="87"&gt;:(&lt;/td&gt;
            &lt;td align="center" width="180"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="137"&gt;Finance Component&lt;/td&gt;
            &lt;td align="center" width="104"&gt;10 days&lt;/td&gt;
            &lt;td align="center" width="88"&gt;:( 2x&lt;/td&gt;
            &lt;td align="center" width="179"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="137"&gt;Graphical Prettying&lt;/td&gt;
            &lt;td align="center" width="104"&gt;5 days&lt;/td&gt;
            &lt;td align="center" width="88"&gt;:|&lt;/td&gt;
            &lt;td align="center" width="179"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="136"&gt;QA Phase I&lt;/td&gt;
            &lt;td align="center" width="105"&gt;5 days&lt;/td&gt;
            &lt;td align="center" width="89"&gt;:(&lt;/td&gt;
            &lt;td align="center" width="178"&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The smiley faces are optional.  I find them cute and humanizing.  &lt;/p&gt;
&lt;p&gt;Keeping track of your estimates gives you data to look back on, to make your future estimates better.  My scheme fits nicely into an excel or &lt;strong&gt;*erk*&lt;/strong&gt; Google Spreadsheet.  Whenever my boss comes into my office and asks me when a component will be done, I just fire up excel and add a row.  A quick easy way to record your estimate history.  Since I'm doing it using a simple spreadsheet without using a super-complicated CASE tools, it might even be considered Agile.  I'll see how it works out.  I think by the end I'll end up being off by a factor of two in most components.  Especially considering my soft (self set) deadline for project feature-completion was last Friday.  Here's to hoping to more accuracy in the future.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/18.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/06/11/learning-to-estimate-development-time.aspx</guid>
            <pubDate>Tue, 12 Jun 2007 02:43:31 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/18.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/06/11/learning-to-estimate-development-time.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/18.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dev Log - Week 04 Day 01</title>
            <link>http://dsokol.com/archive/2007/05/30/dev-log---week-04-day-01.aspx</link>
            <description>&lt;p&gt;My programming is in full &lt;em&gt;getting it done&lt;/em&gt; swing.  Comments are being neglected, horrible things are being done with try {} catch {} blocks, and variable names are becoming less useful.  Writing high quality code on a schedule is harder then I originally estimated.  A lot of my scheduling problems are tied to my work environment.  Well, the part of my work environment: my paycheck.  Essentially, I don't get paid until I finish the application.  And my paycheck is dependent on delivering a working program; not a maintainable one. &lt;/p&gt;
&lt;p&gt;I guess it's the plight of most software developers.  Debates about &lt;a href="http://groups.google.com/group/comp.lang.scheme/browse_thread/thread/abb11379c7da6908/efd57bedee4e701b"&gt;languages&lt;/a&gt; and closures and whatever the hell else is good for academia, but it &lt;em&gt;really&lt;/em&gt; gets in the way of getting things done.  I'm not an academic, but I believe in good code.  It's a tradeoff.  Do I spend a few extra minutes here commenting code?  Do I write down my thought process and reasoning for a tricky bit of functionality when my power bill is going unpaid?  What exactly is my &lt;em&gt;motivation&lt;/em&gt; to write good code when my paycheck is the same?  I certainly won't be maintaining this code; I'm out as of August 2007.  It'll be a guaranteed revenue stream (to the tune of $3k/month) for my employer, not me. &lt;/p&gt;
&lt;p&gt;Professional dedication can only go so far.  As much as I hate it, I go to work developing enterprise applications and come home and dream about developing other applications.  Not shrink wrap or games or anything, but just doing development work that's &lt;em&gt;not&lt;/em&gt; my job.  Yeh, I'm that much of a geek.  Point is, I'm supposed to be living the life!  I'm a professional developer now!  My systems are going to be making an impact on the people who use them; I'm drawing a paycheck for making them awesome!  External deadlines and milestone markers really dampen the whole programming experience.  As does reality, but that's more philosophical then I'd like at 4:49AM. &lt;/p&gt;
&lt;p&gt;Bottom line:  my code quality is suffering.  I've been developing for this company since March, but I've seen one (yes one) paycheck.  There is a large amount of money outstanding.  It feels like I'm working for a bootstrapped startup (something I swore I would never do) except I'm not doing anything new and exciting.  I'm banging out data access objects and business rules for an insurance underwriter.  Dreams of my enterprise career definitely included a steady paycheck, and this just isn't cutting it. &lt;/p&gt;
&lt;p&gt;On the plus side, Gin and Tonic is still as tasty as ever.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/11.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/05/30/dev-log---week-04-day-01.aspx</guid>
            <pubDate>Wed, 30 May 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/11.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/05/30/dev-log---week-04-day-01.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/11.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dev Log - Week 03 Day 05</title>
            <link>http://dsokol.com/archive/2007/05/26/dev-log---week-03-day-05.aspx</link>
            <description>&lt;p&gt;The past few days have been horribly boring, development wise.  New project excitement has faded; new technology excitement has been benched.  I’m just sitting behind the keyboard and and making it happen.  Bread and butter time, and my morale is &lt;em&gt;soaring&lt;/em&gt;.  Boring repetitive work is the enemy of the automation programmer.  &lt;/p&gt;
&lt;p&gt;I’ve been doing all of my development without the aid of outside 3rd party software, such as &lt;a href="http://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://nunit.com/index.php"&gt;NUnit&lt;/a&gt;, or whatever other plug-ins you can Google for.    All of the SPROCs, database maintenance, testing, and other tasks are done by hand.  The primary reason is future maintainability.  My term at the company comes to an end in early August; other programmers are going to be stuck managing my handiwork.  I don’t want to drop new programs on them as well as new code. &lt;/p&gt;
&lt;p&gt;Programming without basic automation utilities is rough.  I spent a few hours today writing SELECT/INSERT procedures for the database, one at a time.  I’m at twenty-seven tables and rising; the numbers are killing me.  Not to mention what happens when I need to make a database change.  Despite my massive one week planning period, there are still data model changes to be made.  It’s annoying.  If I add a single column, I end up changing code in four places: two in SQL Server Management Studio, and two in the C# Data Access Object.  And then any calls I’ve made to the INSERT or UPDATE functions.  It’s a total timewaster, compounded by the fact that I only compile/run when absolutely necessary. &lt;/p&gt;
&lt;p&gt;Ah, absolute necessity.  My development machine is a 2.4ghz P4 with 768MB DDR.  It’s a laptop, complete with 5400RPM drive.  Once I get the basics up and running (Visual Studio 2005.NET, SQL Server Management Studio Express &amp;amp; related instance, explorer, iexplorer x 2, and WMP11) I’m out of RAM.  It takes more than thirty seconds after hitting F5 (Run with Debugging Enabled) for the browser to load.  It truly is development hell.  Thankfully, I’ve learned not to hit CTRL+SHIFT+B (Build Solution) every few lines. &lt;/p&gt;
&lt;p&gt;Having such a crap machine limits my multitasking.  If I work in Visual Studio for more than a few minutes, SSMSE gets paged to disk.  If a database change is necessary, I’m looking at two or three minutes wasted just waiting for programs to page back and forth.  It’s maddening.  There are points where my processor is so laden &lt;a href="http://www.gmail.com/"&gt;GMail&lt;/a&gt; won’t stay connected.  Not being able to automate the boring stuff and doing it by hand blows hardcore.  If I ever start &lt;s&gt;developing professionally&lt;/s&gt; start a development company, every workstation is going to be riced out, save video card.  I just can’t stand working on a machine where I can type faster than Intellisense. &lt;/p&gt;
&lt;p&gt;It’s just been boring, repetitive, slow work.  Thankfully, I’m probably going to finish up most (ha!) of the boring parts this weekend.  Come Monday, I’ll be working in new exciting territory again.  No wonder &lt;a href="http://programming.reddit.com/"&gt;people get all excited about Haskell and Ruby and whatever other language of the month is&lt;/a&gt;.  Anything that auto-magics this tedious part of programming is worth raving about, no matter what constraints are put on style/syntax/format.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/9.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/05/26/dev-log---week-03-day-05.aspx</guid>
            <pubDate>Sat, 26 May 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/9.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/05/26/dev-log---week-03-day-05.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/9.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dev Log - Week 03 Day 02</title>
            <link>http://dsokol.com/archive/2007/05/24/dev-log---week-03-day-02.aspx</link>
            <description>&lt;p&gt;Development time was short today due to a migraine.  Missing a few hours (say, six) really reduces the amount of work you can get done.  That being said, I sat in front of the TV with my laptop in the evening and tried to catch up. &lt;/p&gt;
&lt;p&gt;After yesterdays near disaster, I decided to switch into XHTML mode and work on user controls.  I created a few user controls in my prototype, and I was planning on translating them into production code.  The particular component I’m working on is a modified DataGrid.  It contains one or two extra search boxes and some custom pagers.  Now, when I say custom pagers, I don’t mean the Custom Pagers that the DataGrid natively supports.  These are full-on DataGrid-unaware pagers that I’ve written ground up.  Some background is in order. &lt;/p&gt;
&lt;p&gt;Most of the projects our company works on are business intelligence applications; we grab tons of data from the database, run some reports and calculations on it, and present it in an executive dashboard.  The DataGrid pagers don’t actually paginate the data itself; just the display of the data.  We page our data because NOT paging it would cause a few thousand extra rows of database traffic.  Our users tend to prefer short load times to long ones. &lt;/p&gt;
&lt;p&gt;The pager I’m writing contains the standard data-pagination buttons: &lt;em&gt;First&lt;/em&gt;, &lt;em&gt;Previous&lt;/em&gt;, &lt;em&gt;Next&lt;/em&gt;, &lt;em&gt;Last&lt;/em&gt;, and a number-of-items drop down list.  We plan to place these buttons on the top and bottom of every DataGrid contained in our application.  This paging bar is going to be used multiple times in the application.  The object-oriented designer in me is currently screaming that I package this tiny piece of functionality up into a nice reusable component.  Since it’s graphical, a user component (or custom component, for that matter) would be ideal. &lt;/p&gt;
&lt;p&gt;However, making it object oriented would add complexity.  The events for the links contained within the pager would have to be subscribed too externally. I’d also have to deal with all of the visibility and possible rendering problems caused by the AJAX controls I’m using.  And, frankly, I don’t care for the idea of nesting user controls.  My gut feeling is that Visual Studio would throw a fit during compilation; I’ve experienced this before, and have lost days of dev time to it. &lt;/p&gt;
&lt;p&gt;It’s a sticky design situation.  So I decided to program around in for about an hour, tidying up other code, creating the helper classes, and so forth.  Right before I had to make the decision, I got up off the couch and walked to my friend’s room.  My friend is also a programmer, a recent computer science graduate.  He works for a different company on the third floor of the building I work in.  Without any context, I posed him a question: &lt;em&gt;Quick! Proper design or getting it done?&lt;/em&gt;  He turned away from &lt;a href="http://www.worldofwarcraft.com/"&gt;WoW&lt;/a&gt;, glanced around nervously, drank some Coke he had sitting on his desk, and, very slowly, replied &lt;em&gt;getting it done&lt;/em&gt;.  You have to love making software design choices on exchanges like that. &lt;/p&gt;
&lt;p&gt;Getting it done was what happened.  I started copying and pasting code (&lt;a href="http://stevemcconnell.com/ieeesoftware/bp16.htm"&gt;screw design error!&lt;/a&gt;) and finished up the first component pretty quickly.  I can’t estimate how long it would have taken to make it reusable, but c/p was a couple of minutes per occurrence.  For me, in this situation, reusable design would have cost more.  What’s even nicer is that Visual Studio changed the IDs of the ASP components for me when I copy and pasted, so there would be any ID conflicts.  It’s as if Microsoft anticipated my shoddy programming technique. &lt;/p&gt;
&lt;p&gt;Now lets see what happens when I have this particular pager code copy and pasted into ten or twelve different places on the project and the customer requests an &lt;em&gt;All&lt;/em&gt; button.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/8.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/05/24/dev-log---week-03-day-02.aspx</guid>
            <pubDate>Thu, 24 May 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/8.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/05/24/dev-log---week-03-day-02.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/8.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dev Log - Week 03 Day 01</title>
            <link>http://dsokol.com/archive/2007/05/23/dev-log---week-03-day-01.aspx</link>
            <description>&lt;p&gt;I’m in the middle of the implementation phase of my project.  The last week or so was mostly planning out the scope of the application, which ended up being a lot of waiting.  Do they want to be able to X in the application?  Hmm, not sure, lets ask them.  An hour or two later, I’d have my answer and I could move on to the next design question.  A few religious debates later (including one where I was arguing against &lt;a href="http://www.codinghorror.com/blog/archives/000117.html"&gt;CodingHorror&lt;/a&gt;) we were settled on the design and implementation strategy.  The application is nothing fancy; a simple insurance underwriter system, Web based, written in ASP.NET 2.0.  The biggest cool factor to the whole thing is that we’re using the ASP.NET AJAX extensions.  UpdatePanels are pretty rock. &lt;/p&gt;
&lt;p&gt;The specification process wasn’t anything special.  Whoever wrote &lt;a href="http://www.amazon.com/Software-Requirements-Second-Karl-Wiegers/dp/0735618798"&gt;Software Requirements from Microsoft Press&lt;/a&gt; (which Google later reveled to be Karl E. Weigers), would be appalled.  I’ve never met the customer, and my only method of contact is through my manager.  Not exactly joint application development.  The spec is penned out in pseudo-use-case-UML and stickypadded to the cabinets in my office.  We have an ER diagram, but that’s by my own hand alone.  I’m essentially developing a program off what’s in my head, a single ERD, and two &lt;a href="http://www.3m.com/us/office/postit/products/prod_ew.html"&gt;Self-Stick Easel Pads&lt;/a&gt;.  Ah, this is my welcome to enterprise development. &lt;/p&gt;
&lt;p&gt;Either way, the program is getting written.  Today I started slogging through my Data Access Objects now, which ain’t `zactly fun.  I like to imagine LINQ. just sitting on my shoulder, taunting it’s super-cool in-lining abilities I can’t use.  Over the course of forty plus table attributes, my wrists started hurting.  The wonderful advice I’ve received about taking breaks while working is finally making sense.  At 2:02PM, I decided it was break time. &lt;/p&gt;
&lt;p&gt;After waiting for the Coke machine to timeout on my credit card authorization, I took a walk around the building.  You know, just to wring out my fingers and to hope the Coke would work next time I tried.  Then it hit me.  There was a problem in our software design that would cause the customer to do horrendous amounts of data entry, along the line of 6,600 records.  I stopped in the hallway and thought about it for a second.  One of the reasons we were developing this software in the first place was to automate this kind of thing.  Surely we (read: I, in this case) couldn’t have overlooked this fact?  I jogged back to my office, checked the ERD, and went into an instantaneous depression. &lt;/p&gt;
&lt;p&gt;Yep, it was flawed.  The customer would have to enter 6,600 records (granted, with one column each) upon delivery of our product.  My development efforts ceased and all my energy refocused on eliminating this problem.  Two hours later, I had nothing to show for it but a lot of failed ideas.  Somewhere during that time the someone-just-broke-up-with-me feeling hit.  The product wouldn’t work as promised.  It wasn't time for the &lt;a href="http://www.randsinrepose.com/archives/2004/03/14/were_doomed.html"&gt;We're Doomed&lt;/a&gt; speech yet, but I was planning it.  I started discussing it with a co-worker, who had just come back after house-shopping. &lt;/p&gt;
&lt;p&gt;Bottom line: it’s the customer’s problem to do data entry, not ours.  After an hour long discussion, we decided that the problem was domain specific and, sadly, irresolvable using our techniques.  I would continue to develop as plan, and just try not to think about the poor administrative assistant that was going to have to do data entry.  The problem was solved, but I was still fairly shook from the ‘oh ***’ moment earlier that day.  I typed up a few more methods then headed home.  Apparently software can’t solve all of our business problems.  Maybe I was just being naïve about it, but I was hoping that this product would really reduce all the tediousness of the customer’s current tasks.  It will, but there will be a high initial time investment.  Today I learned that design is about compromise.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/6.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/05/23/dev-log---week-03-day-01.aspx</guid>
            <pubDate>Wed, 23 May 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/6.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/05/23/dev-log---week-03-day-01.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/6.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Adventures Into Unit Testing</title>
            <link>http://dsokol.com/archive/2007/05/01/adventures-into-unit-testing.aspx</link>
            <description>&lt;p&gt;The software engineering course at my university covers a lot of material.  So much material, actually, that much gets glossed over or exempted.  One hour on a Tuesday afternoon we talked about unit testing.  Yep, one whole hour to discuss this great, fantastic, oft-blogged about technique.  My professor didn't care for unit testing, and didn't see the purpose.  His viewpoint was made clear through his rather sarcastic slides and comments.  &lt;em&gt;It's a waste of time:  If your code runs, you don't need to programmatically test it!  Just get it done&lt;/em&gt;.  I'm paraphrasing a bit here, but there's the gist of it.  In his use of the word &lt;em&gt;it&lt;/em&gt;, he was referring to our semester long projects.  Giant, massive ordeals that were to be completely working, tested, and documented in sixteen weeks; by groups of four or less people.  Ours was an amazing adventure, but that's another topic.  Needless to say, unit testing was wasn't even attempted on any of our projects. &lt;/p&gt;
&lt;p&gt;So, despite my Computer Science degree, I have no real training on unit testing.  During my software engineering class, I decided to do some outside research.  I downloaded &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; and gave it a shot.  Wow!  It was cool!  All that green lighting up everywhere, boosting my confidence in my 500-600 line projects.  Despite it's crazysexycool appeal, I quickly determined that it was unnecessary.  Throwaway code for grades doesn't need unit testing, no matter how you slice it.  I tried introducing it into another group project I was working on later and almost suffered a programmer revolt.  Unit testing apparently has no appeal for academia.  Then again, most programming for classes is built on pizza and beer fueled 48-hour no-source-control code-a-thons. &lt;/p&gt;
&lt;p&gt;Now I'm at a real job.  Well, not exactly real, but real enough.  I'm re-writing a superhuge, &lt;s&gt;43,000&lt;/s&gt; 59,766 line PHP application.  (Shut it, I'm new to this.)  After two weeks of deciphering both poor naming conventions and rampant use of REGISTER_GLOBALS, I was finally ready to start writing code.  One week after the initial repository creation, I realized I hadn't even &lt;em&gt;touched&lt;/em&gt; the run button in Visual Studio.  This was somewhat alarming; I had 1500 lines of untested C# and 2000 lines of slightly-tested SQL, just staring at me from version control.  It compiled, sure, but I've learned that doesn't mean much.  Ignoring my insecurities, I continued writing code for the rest of the week.  Insecurities don't go away though, they just build.  The following week, I couldn't take it anymore.  The longer I wrote code without checking it, the larger a chance of a major design flaw appearing later.  My work had to be validated.  I re-downloaded NUnit (The prior copy being gone, oh, 4 OS installs ago), added some assembly references, and began writing tests. &lt;/p&gt;
&lt;p&gt;Unit testing a project that wasn't meant for unit tests causes problems.  Google found some best practices and started re-writing my base code.  Hours of refactoring later, I had about 10 working unit tests.  My code had actually worked pretty well the first time around.  I was (and still am) pleased with myself.  From that point I decided to use the &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test Driven Development&lt;/a&gt; (TDD) methodology.  Stub your code out, write the tests, watch them fail, then fill in the code and watch them pass.  Thirty public void SomeTest()s later, I gave that up.  Wait, what?  Yes, I gave it up. &lt;/p&gt;
&lt;p&gt;I work for a small company that does contract programming.  I found, through measuring the time it took me to write classes of comparable complexity, unit testing was doubling to tripling the time it took me to write code.  &lt;em&gt;So what!?&lt;/em&gt; you cry.  &lt;em&gt;You'll get better code in the end, with less time debugging and more confidence!&lt;/em&gt;  Yep, understandable.  Right now, though, I live check to check.  If I don't get this code into production, my power bill goes unpaid.  I'm willing to take the risk of finding more bugs in the QA stage (which is conducted by the company) by saving time &lt;strong&gt;now&lt;/strong&gt;.  Following all the other good development practices should be enough to keep my bug count down, but unit testing just isn't worth the time investment.  This is a single company website, custom tailored to their needs.  Chances are the only people that will ever see the code are my co-workers. &lt;/p&gt;
&lt;p&gt;The fundamental concept of unit testing is sound.  I think, given the right time and training, it would greatly improve anyone's code quality.  Sometimes that extra quality just isn't necessary.  I'll liken this to food, since most people eat.  Unit Testing should be used when you want top of the line food, say, Heinz Ketchup.  However, if you just need to get the job done (e.g., making something taste like ketchup), get the Great Value brand.  Great Value ketchup makes things taste better, but it's not as high quality.  Unit testing is the Heinz quality control process.  If you have the time or the desire for high quality, use it.  If you have a deadline and you can get away with a few bugs, don't bother.  Your time is better spent adding new features.  Business customers like features, and they're mainly focused on getting the job done. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Don't bother saying Great Value is just some repackaged brand.  I'm aware.  Just use the damn analogy.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update 01 May 2007: Fixed linecount due to brand-spankin-new find | cat | wc knowledge.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/5.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/05/01/adventures-into-unit-testing.aspx</guid>
            <pubDate>Tue, 01 May 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/5.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/05/01/adventures-into-unit-testing.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/5.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Yay! More/Less Student Competition!</title>
            <link>http://dsokol.com/archive/2007/04/28/yay-moreless-student-competition.aspx</link>
            <description>&lt;p&gt;Computer science enrollments at my liberal-arts university are up.  It had been dropping recently, but a few new faculty members and some higher profile advertising changed that.  The CS department usually grabs people who are drop outs from the GaTech Regional Engineering Program (GTREP) or students from other majors who require a computer course.  The department is still growing very slowly; I'd estimate 2-5% growth on a program that graduates about 20 people per year.  That's not being echoed by other Universities.  Computer science enrollments are down, despite efforts to boost them.  According to an article I read in Network World (which I cannot find online, but it was the last-page editorial column), the total amount of computer scientists enrolled is about to drop.  I disagree, but I have to explain my perception of the dot com era first. &lt;/p&gt;
&lt;p&gt;Dot com started in 1996.  The internet held huge amounts of untapped wealth, just waiting to be grabbed by the next geek with a P2 250Mhz and a weekend supply of Diet Shasta.  Computer science enrollments exploded, along with the web.  The stock crashed in 2001.  Those students who enrolled in university during the height of the bubble (from 1999 to 2000) stuck with it, finished out their program, and went into the industry a few years ago.  The students that followed behind it, who were in high school at the time, are graduating now.  Soon the students who were choosing their major as the major financial backlash hit the technology community will be graduating.  Most of the people in my classes have no fear of not being able to find a job, regardless of outsourcing.  Current graduating CS students love computers enough that the .com burst didn't scare them away.  These are the dedicated programmers; screw financial problems, screw india, screw liberal arts.  And they're all going straight into web development. &lt;/p&gt;
&lt;p&gt;These the-bubble-didn't-scare-me programmers are the ones behind Web 2.0.  They take risks that older seasoned programmers won't.  They never experienced the harsh realities of losing their job or being unable to find work.  (Note: I graduate college in two weeks.)  They do, however, remember the stories of internet millionaires, and they're thinking they can be one.  With all of this new Web technology, it's certainly possible.  The mistakes made in 2000 are going to be repeated because the Web 2.0 crowd wasn't around to benefit from them.  It's kind of hard to care about the state of the industry when you're sitting in Data Structures learning about linked lists. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000843.html"&gt;Jeff Atwood thinks we're in another bubble&lt;/a&gt;.  I agree, to an extent.  It's going to burst sooner or later, heralded by a sharp drop in Google's stock price.  Then the entire economic situation will repeat itself.  It's just not going to be as bad, because it's only being perpetrated by the industry neophytes.  The people who have been programming for the past five to thirty-five years will keep the industry on target, but it'll involve some wrangling.  Right now, the web is hot hot hot: look at Facebook and MySpace.  People are turning &lt;em&gt;down&lt;/em&gt; huge sums of money for their startups because they want more.  If cash keeps flowing into the Web, more people are going to enroll in CS courses (yeah, pretty basic logic, I know).  The next few years should have a huge &lt;em&gt;increase&lt;/em&gt; in computer sciences enrollment.  Then current market will crash, there'll be devaluation, then in another few years, Web 3.0 will come from the kids entering the CS a few years from now.  Every industry cycles to some extent, the IT sector just does it faster.  Same thing happens to university computer science enrollment.  A few years of more CS students, a few years of dropping numbers.&lt;/p&gt;&lt;img src="http://dsokol.com/aggbug/4.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David J. Sokol</dc:creator>
            <guid>http://dsokol.com/archive/2007/04/28/yay-moreless-student-competition.aspx</guid>
            <pubDate>Sat, 28 Apr 2007 04:58:18 GMT</pubDate>
            <wfw:comment>http://dsokol.com/comments/4.aspx</wfw:comment>
            <comments>http://dsokol.com/archive/2007/04/28/yay-moreless-student-competition.aspx#feedback</comments>
            <wfw:commentRss>http://dsokol.com/comments/commentRss/4.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>