Taxes

For the first time in a number of years, I had a professional do my taxes.  I’d been a TurboTax Online user for the past 6 years, but got a referral from a friend and figured I’d try them out.  The parking situation wasn’t ideal, and the wait to be seen was long (over 3 hours for me), but the size of the refund I got back made it worthwhile.  If you don’t mind a wait (or the fact that they’re cash-only), visit Newby Tax Service at 6315 Windsor Mill Rd, Gwynn Oak, MD 21207.

Rates are $150 for single filers, $300 for businesses.  The charge for e-filing is an additional $80.


Null Coalescing Operator

I didn’t know about this C# 2.0 operator (??) until ReSharper suggested it as a replacement for a particular use of arithmetic if (?:) that I’d added to some code recently.  I already prefer C# to VB.NET because of its terse syntax and stricter compiler, so this discovery tipped the scales just that much more.

The most recent blog post Google coughed up for this operator is this one, from Aaron Zupancic.  Aaron links to another post that demonstrate its use for viewstate.


Fixing Computer Science

I’ve been reading a lot of complaints about the current state of computer science education lately.  This post makes a reasonable attempt at summarizing the different ideas around what sort of graduates these programs should produce.  I’ve been in industry long enough that my CS program hadn’t switched to using Java as the initial language when I started.  I agree with Brian Hurt and Chris Cummer about the value of a computer science degree.

The right courses in a CS degree amount to a toolbox of concepts that you can use to solve whatever real-world problem you’re facing.  The most recent example of this happened on the job.  We had an issue where some text files being downloaded for storage in a database kept causing failures in a process.  Because of how the process was implemented, there was no way to pin the cause of a failure on a particular line of the file.  The files in question are regularly more than a gigabyte in size, so manual inspection wasn’t an option.  The minimal understanding I have of how compilers work enabled me to direct my staff to build a parser, so we could validate the input file before running the process against it.  Without a CS background, it’s highly likely that I don’t come up with a solution at all (or a really bad implementation of a parser).

If I had it to do over again, I would have spent more time in my CS program getting better depth in compilers, operating systems, and other areas.

Computer science isn’t perfect, but it’s relatively young as a field compared to disciplines like law or medicine.  There are probably things that should be changed, but I think the fundamentals are good.


TeamCity 3.0

Now there’s a freeware version of it that supports up to 20 users and build configurations.  We were looking at setting up CruiseControl.NET again for continuous integration at work, but this will be much easier.


Apple Stuff

iPod nano

The iPod I mentioned yesterday is the 4th (!) one I’ve owned. Each of the previous ones was sold to help fund the upgrade to the next one. I love this one even more than all the previous ones because it handles video.  The video is watchable, even at that size.  The nano makes great use of the screen when it isn’t playing video too.  The earbuds that came with this one are better than the previous ones, but I’m still going to buy a better set.

Thoughts on MacWorld

The most important product announced there isn’t MacBook Air–it’s Time Capsule.  I think far more people will find a use for wireless drive backup than they will for a really thin laptop.  Because Time Capsule also works as a router and can share a USB device (or devices if you plug in USB hub), you could conceivably share even more hard drive space and a printer to every machine on your wireless network.  As far as I can tell, Time Capsule provides more capabilities than Mirra Personal Server (a comparable backup/Internet access product) at a lower price ($300 for the 500GB version) in a much smaller form factor.  After a copy of Leopard, I think a Time Capsule will be my next purchase from Apple.


Birthday

I turned 34 today. I suppose I’m officially in my “mid-30s” instead of my early 30s now. Other than that, it doesn’t seem different at all from any of my other post-30 birthdays.

I did pick up a new toy for my birthday–an 8GB iPod nano.


The trouble with using strongly-typed datasets

Apparently, if your database-driven website is under heavy concurrent user load, the  Adapter.Fill method in the .NET Framework (called by code generated by the XSD in Visual Studio) begins to fail because it doesn’t close connections properly.

The next time I need a data access layer for anything of substance, strongly-typed datasets are off the list.


Welcome to 2008

If a single word could define my 2007, it would be “travel”.  I suspect it’s the biggest reason I enjoyed the year.  The places I had the chance to visit include:

  • San Jose, CA
  • San Francisco, CA
  • Portland, OR
  • Seattle, WA
  • Vancouver, BC (Canada)
  • Orlando, FL
  • Dallas, TX
There were a couple of short road trips to Pennsylvania as well.

Looking back at the five things I wanted to accomplish this year, I finished two: taking two full weeks off, and forming an LLC.  The latter should play a large part in what 2008 will be like for me.  The three things I didn’t accomplish last year go back on the list for this year:

  • Learn a new programming language/product. I ended doing nothing at all with Eiffel last year.  This year, particularly with the LLC, I've been thinking about specializing in a product.  When I worked for Lockheed-Martin, I specialized in the customization of Community Server.  I'll either go back to that, or look at a technology from Microsoft (BizTalk, SharePoint, etc).  If I learn another programming language, it will probably be something like Python.
  • Re-learn the piano. I hardly played at all last year.  I'm glad my ability to read music hasn't disappeared.  I'm not sure what it will take to get me practicing regularly again, but I'll figure something out.
  • Study the Bible more regularly. I've started using online devotionals and religious podcasts to jump-start this.
One brand-new goal for this year is to increase my involvement in software development training.  Last year, I started an informal learning lunch program at work.  My original intent was to give the consultants that work for us multiple opportunities to transfer their knowledge to our permanent staff.  I ended up preparing and presenting on a wide variety of topics myself.  The program has been very well-received by the staff, and I've enjoyed assembling and giving presentations on best practices and technologies.  At the suggestion of friends & family, I've decided to pursue part-time openings as a technology instructor.  I'm scheduled to interview with a local community college for an adjunct position this month.  It will be the first work I do for my LLC if I'm accepted.

Digital Cameras, and another Adobe Lightroom Plug

This time, from a much higher-profile blogger than me–Tim Bray.  The bulk of the post is actually about digital SLRs (DSLRs), more specifically, Bray’s follow-on commentary to this post by Dave Sifry.   The starter kit looks decent, but the estimate of how many RAW files a 4GB Compact Flash (CF) card will hold makes me wonder if Canon’s RAW files are bigger than Nikon’s.  I have a D70s I’ve been shooting with for about two years, and a 2 GB CF holds over 350 RAW files.

The only place where I might differ with Bray’s additional points is the first one on camera brands.  Canon and Nikon between them own the vast majority of the film and digital camera markets.  This is important because it means you’re far more likely to find used equipment of good quality in those brands than with Pentax, Sony, etc.  In my own case, the reason I got the D70s was that my friend Sandro found a refurbished one for $600 at Penn Camera.  Maybe 6 months before that, the same camera cost $1200 new.  New lenses get pretty expensive once you get faster than about f/4, so good used ones also keep things affordable.


Happy Holidays

I wish all my readers a happy holiday season!


Lightroom: Day 24

My earlier plan of a longer series of posts on the ins-and-outs of Lightroom was devoured by work, holiday stuff, etc. In this post, I’ll talk briefly about Navigator, collections, and the Slideshow portion of the workflow.

Navigator

This feature, available in the Library and Develop portions of the workflow lets you look at various areas of a selected photo. You can zoom in as far as an 11:1 ratio. It’s quite useful in Develop, since at least some of the edits you can make (red eye reduction, spot removal) are most successful when you get in really close. I haven’t used this feature a ton, but I certainly haven’t found anything like it in iPhoto.

Collections

Collections are the mechanism for organizing groups of photos in Lightroom. They appear to be equivalent to iPhoto albums. In Lightroom, photos have to be in a collection before they can be sorted. Unlike iPhoto, Lightroom allows you to sort photos both in the filmstrip and the grid view. The number of photos displayed per row in the grid view also adjusts automatically based on how large you make the application window (it’s a manual adjustment in iPhoto).

Slideshow

In this amount of time using Lightroom, I only have one complaint: when you play a slideshow directly from the software, it starts reverting to earlier slides after you’ve displayed around 50. At least, that was my experience when I used to help a friend present photos from his trips to various Seventh-day Adventist churches. I’m hoping it’s some sort of trialware restriction, because that would be a pretty major bug otherwise.

Slideshows export as PDFs, with one slide per page. There are five default templates, and the software lets you create your own. You can change slide backdrops, text overlays, and layouts in a number of interesting ways. If I get some time before the trial runs out, I’ll make some sample outputs available in a subsequent post.

In retrospect, I should have used the Preview app in slideshow mode to present the slides, since there weren’t transitions, music, or anything else requiring Lightroom to run it.

Import

If Lightroom is on when you connect a camera or memory card to your Mac, a dialog pops up that lets you decide how to import the pictures. It didn’t interfere with iPhoto when I used it.


Sight and Sound Theatre

My sister and I spent the weekend with my parents and an aunt to watch the Christmas shows at Sight and Sound Theatre, in Strasburg, Pennsylvania.  We were fortunate enough to see both Miracle of Christmas and Voices of Christmas.  Both shows are Christian-themed musicals with live animals and very impressive set design.  The Millenium Theatre, where Miracle of Christmas was staged, is large enough to have front and side stages.  There was plenty of action to both sides, and the show also used the center aisles to move people and animals in and out.  They even had the actors playing angels on wires, flying them around at heights of what must have been at least 30 feet for some scenes.  I really enjoyed both shows.


Are Exceptions Always Errors?

It would be easy enough to assume so–but surprisingly, that’s not always the case. So the following quote from this post:

"If there's an exception, it should be assumed that something is terribly wrong; otherwise, it wouldn't be called an exception."
isn't true in all cases. In chapter 18 of Applied Microsoft .NET Framework Programming (page 402), Jeffrey Richter writes the following:
"Another common misconception is that an 'exception' identifies an 'error'."

“An exception is the violation of a programmatic interface’s implicit assumptions."

He goes on to use a number of different examples where an thrown exception is not because of an error. Before reading Richter, I certainly believed that exceptions were errors–and implemented application logging on the basis of that belief. The exception that showed me this didn’t always apply was ThreadAbortException. This exception gets thrown if you call Response.Redirect(url). The redirect happens just fine, but an exception is still thrown. The reason? When that overload of Response.Redirect is called, execution of the page where it’s called is stopped immediately by default. This violates the assumption that a page will execute fully, but is not an error. Calling Response.Redirect(url,false) prevents ThreadAbortException from being thrown, but it also means you have to write your logic slightly differently.

The other place I’d differ with the original author (Billy McCafferty) is in his description of “swallow and forget”, which is:

} catch (Exception ex) { AuditLogger.LogError(ex); }

The fact that it’s logged means there’s somewhere to look to find out what exception was thrown.  I would define “swallow and forget” this way:

}catch(Exception ex){

}

Of course, if you actually catch the generic exception, FxCop would flag that as a user violation.  I’m sure McCafferty was using this as an example.


SourceForge to the Rescue

I’d been hunting around for awhile trying to find a tool to automatically convert some .resx files into Excel so the translation company we’re using for one of our applications would have something convenient to work with.  It wasn’t until today that I found RESX2WORD.  It’s actually 2 utilities: one executable to convert .resx files into Word documents, and another to do the reverse.

The resulting Word from the resx2word executable has a paragraph of instructions to the translator and automatically duplicates the lines that need translating.


Google Webmaster Tools

I just started playing with Google Webmaster Tools yesterday.  I was very interested to find out where this blog has been showing up in search results.  According to the “top search queries” stats, the queries my site appeared most for were “ndbunit” and “failed mergers”.  Considering that I only wrote one post about NDbUnit, and one about the Daimler-Chrysler split, I found that surprising.

Webmaster Tools includes a lot more statistics that look as if they’d be very informative.  I’ll explore them later, as well as trying out the sitemap functionality.


Aftermath: The Failure of Virtual Case File

The FBI awarded Lockheed-Martin (my former employer)  the lead role in implementing Sentinel, a follow-up effort to the failed VCF project, in March 2006.  Nearly two years later, it will be interesting to see what lessons (if any) the FBI learned.


Lessons Learned: The Failure of Virtual Case File

I came across this article about the failure of the Virtual Case File project about a week ago. I read things like this in the hope of learning from the mistakes of others (instead of having to make them myself). What follows are some of the conclusions I drew from reading the article, and how they might apply to other projects.

Have the Right People in the Right Roles

The author of the article (Harry Goldstein) calls the appointment of Larry Depew to manage the VCF project “an auspicious start”. Since Depew had no IT project management experience, putting him in charge of a project so large with such high stakes struck me as a mistake. This error was compounded by having him play the role of customer advocate as well. In order to play of the role of project manager effectively, you can’t be on a particular side. Building consensus that serves the needs of all stakeholders as well as possible simply couldn’t happen with one person playing both roles.

Balance Ambition and Resources

The FBI wanted the VCF to be a one-stop shop for all things investigative. But they lacked both the necessary infrastructure and the people to make this a realistic goal. A better approach would have prioritized the most challenging of the individual existing systems to replace (or the one with the greatest potential to boost productivity of FBI agents), and focused the efforts there. The terrorist attacks of 9/11/2001 exposed how far behind the FBI was from a technology perspective, added a ton of political pressure to hit a home run with the new system, and probably created unrealistically high expectations as well.

Enterprise Architecture is Vital

This part of Goldstein’s article provided an excellent definition of enterprise architecture, which I’ve included in full below:

This blueprint describes at a high level an organization's mission and operations, how it organizes and uses technology to accomplish its tasks, and how the IT system is structured and designed to achieve those objectives. Besides describing how an organization operates currently, the enterprise architecture also states how it wants to operate in the future, and includes a road map--a transition plan--for getting there.
Unfortunately, the FBI didn't have an enterprise architecture. This meant there was nothing guiding the decisions on what hardware and software to buy.

Delivering Earlier Means Dropping Features

When you combine ambition beyond available resources with shorter deadlines, disaster is virtual certainty. When SAIC agreed to deliver six months earlier than initially agreed, that should have been contingent on dropping certain features. Instead, they tried to deliver everything by having eight teams work in parallel. This meant integration of the individual components would have to be nearly flawless–a dubious proposition at best.

Projects Fail in the Requirements Phase

When a project fails, execution is usually blamed. The truth is that failed projects fail much earlier than that–in requirements. Requirements failures can take many forms, including:

  • No written requirements
  • Constantly changing requirements
  • Requirements that specify "how" instead of "what"
The last two items describes the VCF's requirements failure. The 800+ page document described web pages, form button captions, and logos instead of what the system needed to do.

In addition, it appears that there wasn’t a requirements traceability matrix as part of the planning documents.  The VCF as delivered in December 2003 (and rejected by the FBI), did things that there weren’t requirements for.  Building what wasn’t specified certainly wasted money and man-hours that could have been better spent.  I also inferred from the article that comprehensive test scenarios weren’t created until after the completed system had been delivered.  That could have (and should have) happened earlier than it did.

Buy or Borrow Before You Build

Particularly in the face of deadline pressure, it is vital that development buy existing components (or use open source) and integrate them wherever practical instead of building everything from scratch.  While we may believe that the problem we’re trying to solve is so unique that no software exists to address it, the truth is that viable software solutions exist to subsets of many of the problems we face.  SAIC building an “an e-mail-like system” when the FBI was already using GroupWise for e-mail was a failure in two respects.  From an opportunity cost perspective, the time this team spent re-inventing the wheel couldn’t be spent working on other functionality that actually needed to be custom built.  They missed an opportunity to leverage existing functionality.

Prototype for Usability Before You Build

Teams that build successful web applications come up with usability prototypes before code gets written.  At previous employers (marchFIRST and Lockheed-Martin in particular), after “comps” of key pages in the site were done, usability testing would take place to make sure that using the system would be intuitive for the user.  Particularly in e-commerce, if a user can’t understand your site, they’ll go somewhere else to buy what they want.  I attribute much of Amazon’s success to just how easy they make it to buy things.

In the case of the VCF, the system was 25% complete before the FBI decided they wanted “bread crumbs”.  A usability prototype would have caught this.  What really surprises me is that this functionality was left out of the design in the first place.  I can’t think of any website, whether it’s one I’ve built or one I’ve used, that didn’t have bread crumbs.  That seemed like a gigantic oversight to me.


.NET Developers Search

The latest podcast of Hanselminutes mentioned a custom search engine focused on .NET topics. It’s using Google Custom Search, and at least for a search term like MSMQ, the searchdotnet.com results look a bit different than regular Google results. The creator of the site, Dan Appleman, has authored a number of books on Microsoft technologies (primarily .NET and VB). He seems to be going for a “quality vs. quantity” approach with the sites he includes as sources (which makes sense for this sort of niche search engine).


Lightroom: Day 1

If you love iPhoto, I warn you–stop reading now. Once you read even a little about what Adobe Lightroom can do, you’ll want to try it. Once you’ve tried Lightroom, you simply won’t be content with going back to iPhoto. I’m only 1 day into the 30-day trial of Lightroom, and I’m done with iPhoto. I haven’t even tried Apple’s Aperture yet. If you’re still reading, it’s already too late. I can’t be held responsible for the money you will almost certainly spend.

Metadata Browser

After importing around 200 photos into Lightroom, this was the first feature I played with. It lets you filter which pictures you see by any one of a number of variables, including lens (if you use more than one), aperture, shutter speed, and ISO speed rating. So two clicks let me see how all the photos I shot at a shutter speed of 1/500th second looked. Two more clicks, and I could see how everything I shot with my 50 f/1.4 looked, or how what I took with my zoom lens looked.

Quick Develop

This feature enables you to apply changes to crop ratio, white balance, and tone (including exposure) across multiple photos. So when I needed to change the white balance in a group of my shots, it was as simple as selecting the group, changing white balance to “Flash” from “As Shot”. The same is true of underexposed shots. My friend Sandro pointed out four photos that were underexposed. I simply selected the four he pointed out, and pressed the button for +1/3 of a stop until they were bright enough for my taste. In retrospect, a single click of the +1 stop button would have been even faster.

Develop

This is the step in Lightroom’s workflow where you make more detailed changes to individual photos. Each change you make to a photo shows up in a “History” widget to the left, so you can rollback individual changes with ease. I only cropped photos here, but I could have changed any number of things about them.

Web

While this feature isn’t so much about the photos themselves as it is about how you can share them, this part of the workflow is where Lightroom really shines. Generating this page took a few clicks, and a couple of slider moves.  On top of that, I didn’t even have to use another application to upload it to the web–I did it directly from Lightroom.  There are quite a few different page templates to choose from.

The features I’ve described so far barely scratch the surface of what Lightroom can do.  One of the things that impresses me about Lightroom is not just the amount of things it does that iPhoto can’t (or does badly, cough iWeb cough) but how much less time it takes to handle hundreds of photos by comparison.


URL aliasing

After dealing with a few of the gigantic URLs to SharePoint documents in e-mail, a custom version of TinyURL seems like a good idea.  It looks like this guy thought so too.  A bit later,  Mike Marusin did as well.  I do wonder if the latest version of SharePoint provides that functionality out of the box though.