Morning Musing – Budgets

This past week Lori and I started focusing and working against a budget for the month, to make sure we save where we want to save and take care of items around the house that need to be done.

This morning I was thinking about how excellent a process this is for anyone in the software development world that has to work on projects with budgets and schedules, which is everyone I know. Roles, such as Project Managers, live in this space already and are quite familiar with it. Others in user experience, design, development, testing, etc. don’t necessarily do this for software projects. We know that it’s happening, that we have to factor into the project budgets, and we speak to it with phrases like “obviously, if you take from one part of the budget you have to make up for it somewhere else.” More commonly we talk this way about requirements for a project, which are just another form of budget: “obviously, if you add in these new requirements you have to make up for it somewhere else by removing requirements” (or change you goals; i.e. the launch date).

If you don’t actively work with budgets as part of your job, then you should try out managing a personal budget of your own and experience how hard it can really be.

Only one week in, we’ve experienced unplanned expenses slipping into the budge, and planned expenses that then weren’t necessary (A dental visit that cost less than we estimated). In these situations we had to either take money from somewhere else in the budget, or reallocate the money for the expense that we were no longer going to incur. If you don’t keep working with the budget throughout the month, it will lose value in your mind and you may just give up on it figuring “I’m OK, the budget said we were fine this month!” I’ve made this mistake and what happens in the end is that you spend in places you didn’t intend to spend and you end up moving further and further from your real goals.

The budgeting method I like to use for personal finance is the zero-based budget, where you account for every dollar of income and spend it on “paper” in advance. This is the only way I have ever thought budgeting was done, I’ve never really tried another method and I don’t seen any reason to do so.

Here’s some linkage for your personal edification:

Google: zero based budget

How to create a zero-based budget

Dave Ramsey’s budget tools

Finally, here’s a template I use for budgeting via Google Docs (something I nabbed a long time ago from an Excel spreadsheet):

Jordan’s Public Budget Template

Unit testing ASP.NET Web Forms without a Web Server

Here’s a great utility class, written by Phil Haack, to aide in unit testing ASP.NET Web Form solutions. It’s been around for more than a year, but somehow I’ve missed it. Throwing a link out for my later usage.

For 2009 I’m hoping to work more with the new ASP.NET MVC framework to build websites which will negate the need for a class like this, but I know there will be projects where I’ll still need to use Web Forms.

Batch script to undo TFS pending changes

Here’s a batch script I use frequently to undo pending changes in TFS. I use this when the Undo Changes option in Visual Studio won’t suffice, usually for one of these two reasons:

  1. TFS can’t undo files due to a bug
  2. Someone has left the company, but files still appear checked-out to them


REM Usage: undoPendingChanges.bat “WORKSPACE” “DOMAIN\” “http://sourcecontrolserver:8080” “$/ProjectName/Path/*”
REM PATH: C:\Program Files\Microsoft Visual Studio 8\VC\tf
tf undo /workspace:%1;%2 /server:%3 %4 /recursive

I don’t remember where online I got the info to build this, but at least I can catalog it here for my future use! Just now saved me a ton of frustration…

Being a generalist and finding focus

I’m a fan of being a generalist developer, someone who knows a bit about a lot of different things in software. I like to work on front-end code (e.g. Silverlight, HTML/CSS/JS, WPF), back-end code (e.g. object models, services, CSCI stuff), data storage (e.g. DBs, custom search tools, other containers), development processes and practices (e.g. TDD, CI, Scrum) and solution architecture (e.g. planning for site load and performance, systems architecture, deployment processes).

Being a generalist can be great for your career, there are a lot of opportunities for you to work on different types of projects. However, you don’t want to fall victim to having shallow knowledge about a lot of things and no deep knowledge. If your knowledge is too shallow you may find it hard to see any project through to completion or your projects will all be “average” without any real complexity. I think the nature of software development is that you will end up developing deep knowledge and becoming a subject matter expert (SME) in something. You’ll specialize in Silverlight,or web applications or Windows applications or databases, etc. because you find something about them that you really like.

Starting out in a dev career I’d recommending exposing yourself to a lot of technology and developing your generalist skills. You probably should focus on a single platform/language/framework at the start, just to be somewhat sane. Both .NET and Java support the development of many different types of solutions and becoming a generalist on one of those platforms should give you more than enough to research. Eventually something will stand out as a focal point for you and you’ll naturally develop that deeper knowledge. When times are tough, though, you should be able to fall back on some generalist knowledge to help out a little on any project.

For me, I’m choosing to focus on project and team leadership. I’ve found that I really like to work on the planning of projects and helping the team through the technical implementation. Probably my career path is that of becoming an agile architect, someone involved in the planning and involved in the development. I’m not a fan of ivory tower architecture, creating a software architecture in advance and then expecting a team to just implement it. For the work I do in the consulting space now, an ivory tower architect would not cut it. Besides that, I always want to be in the code at least a little, to satisfy my generalist cravings…

Back at it again

It’s been a little more than a year since I was last out here. It wasn’t an intentional timeout, just one of those things that happens. :) Since last I posted I’ve changed to working for Ascentium and have a daughter. Those two changes alone have kept me very busy.

I figure getting at least one post out here may help me get back in the groove, so I’m going to leave this brief instead of overdoing it. More to come!

NHibernate – Turn off debug logging in a production environment

I’d heard it recommended before, but forgot to do it myself…turn off NHibernate debug logging when you push to your production environment! It really does help the performance. On my local box I was seeing some code taking 7 seconds to run and I didn’t know why. Using ANTS profiler I traced down through the code and realized there was a lot of debug logging from NHibernate.
I changed my logging config. settings from:
<logger name="NHibernate" additivity="false">
 <level value="ALL"/>
 <appender-ref ref="NHibernateFileLog"/>
<logger name="NHibernate" additivity="false">
 <level value="ERROR"/>
 <appender-ref ref="NHibernateFileLog"/>
and the code then took 0.3 seconds. Surprised Needless to say, we rolled that change out to production immediately and were very happy.

Project guidelines

Here are a couple of articles that I really like for project guidelines:

C# coding standards document
Every project should have coding guidelines agreed upon by the team for style, naming, and other conventions. This document can either be used as is or just pick out the stuff you want to adopt for your own guidelines. Following the practices in this document, you’ll end up with a code base that feels consistent with the rest of the .NET framework.

Patrick Cauldwell’s This I believe…the developer edition
More best practices and I couldn’t agree more with these principles. They really make for an agile development process, ensuring that you can move quickly, yet maintain quality of the application. I really believe that developers should have automated tests covering their backs as much as possible. It’s a practice I really love, but have to continually refine to make it effective.