# Tuesday, October 07, 2008

I know things have been a bit on the content-free side here lately, so I’m going to try and remedy that with some (you guessed it) content.

When I hear people talking about Continuous Integration (CI) lately one thing that seems to cause a fair amount of misunderstanding is that people talk about CI like it’s a product, not a process.  On the day they set up their CI server (usually CruiseControl) the “have” CI.  I would argue that exactly the opposite is true.  CI is a process, not a product.  More than that, it’s one of those nasty curves that I blocked out of my mind back when I didn’t do very well in Calculus.  You can be forever approaching CI but you never quite get there.  Huh?  Well, if the goal of CI is to (you guessed it again) Integrate Continuously, we can’t ever quite get there because none of us would ever get any real work done.

So rather than “having” CI, we “do” CI, or better yet, we strive for it. 

If that’s the case, what are we really striving for?  We are striving to reduce the amount of time it takes us to do each (micro) integration, and maximize the amount of time that we as developers can spend adding business value to our software products by writing code.  If we can’t add value because we’re busy integrating, we aren’t fulfilling are primary job function.

So: the closer we come to integrating continuously, the less time we should be spending on non-value-adding programming tasks.

Practically speaking, we can’t spend all of our time worrying about integration.  We all have real work to do.  What we can do is work on making the process smoother for everyone.  That means not breaking the build.  Let me back up a second… In order for everyone to be able to maximize their productive work, and maximize that of everyone else on the team, we need to able to commit changes without fear of breaking the build, or causing other people to have to do integration work needlessly.  What that means in practice is that before committing any changes to our source code repository, we should get all the latest changes, run a full build and test cycle, and make sure we haven’t broken anything.  If we have, we need to fix those problems, and go through the process again, getting source, running build and test, etc. until we get a clean cycle.  If that process if followed by everyone on the team, then it should be very very difficult to break the build.  The only way the build should break if everyone follows that process is if changes are being made to the tip of your source control system faster than the get/build/test cycle.  Sometimes that really happens, and I’ll write some other time about how to deal with that. 

So why do builds break?  Because people don’t follow the processes.  Why not?  Usually for one of two reasons:  1) they don’t understand the process, or 2) the get/build/test cycle takes too long.  #2 is the most likely cause, and happens much too frequently.  In the initial literature on CI, Martin Fowler argued that any build/test cycle that takes longer than 10 minutes is likely to cause people not to follow the process.  In practice, I’ve seen that to be the case as well.  As soon as you get the cycle time down, people will start doing what they are supposed to be doing and the build will break less often. 

If you currently have a build that takes too long, then reducing the build/test cycle time becomes part of your CI process.  We’re always working toward the goal, remember.  Make shaving a few seconds here and there off your build process part of the CI process goals.  Every little bit improves your process, and will start paying dividends.

Tuesday, October 07, 2008 1:27:55 PM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, October 06, 2008
In the spirit of constantly embracing change, as of last week I am now the Director of Education at SoftSource.  What that means in the near term is that I'm going to be spending a bit of time in the classroom.  What that means in the middle term is that I'll be working on expanding our course offerings to encompass a wider range of topics. 

Right now we offer several classes for open enrollment at OHSU's Professional Development Center in Hillsboro (formerly OGI).  This Fall we'll be teaching C# and the .NET Framework (3.5), WPF, WCF and Debugging.  For details see our open enrollment page.  We also do custom training designed specifically around customer's needs, or we can do our standard courseware at your site and time of your choice. 

Now here comes the important part...  All of our instructors are also Software Engineers and Architects that spend the time they aren't in the classroom on customer projects.  That means that they have real-world experience developing real software on a day to day basis, with the latest technology in the field. 

What I'd love to hear back from y'all is what kind of topics you'd be interested in.  Agile development?  Continuous Integration?  Using MS Team Foudation Server?  How to do real-world estimation and planning?  Of course we hope to continue offering technical subjects like advanced .NET development, WPF, Silverlight, and whatever else tickles your collective fancy. 

If you or your organization needs off-the-shelf of custom-design training, or if you have ideas for training you'd like to see us offer please let me know.

Monday, October 06, 2008 11:19:57 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, July 28, 2008
I spent quite a while working with ADAM (Active Directory Application Mode) in Windows 2003 Server / XP on a previous project.  It's a great way to incorporate an LDAP directory into your application without requiring a full-blown AD installation, or domain memberships.  The Windows 2008 Server version has been renamed AD LDS (Lightweight Directory Services), which is a much better name.  LDS incorporates several improvements that make it even more attractive, including some very nice performance increases.   Bart De Smet has a very nice guide to installing LDS on 2008 Server and setting up a useful configuration.  Check it out if you've used ADAM and/or have any interested in LDAP. 

Monday, July 28, 2008 12:54:31 PM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  | 
# Friday, July 25, 2008
I noticed today that my book Code Leader: Using People, Tools, and Processes to Build Successful Software (Programmer to Programmer) is now available for Amazon's eBook reader, the Kindle. Cool.
Friday, July 25, 2008 1:46:27 PM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  | 
I'll be speaking on Continuous Integration at the Software Association of Oregon's Developer SIG meeting in September.  We'll look at how to implement CI across different parts of your organization, using techniques and tools for both .NET and Java.

Friday, July 25, 2008 1:37:41 PM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, May 14, 2008
Looks like I'll be speaking on Continuous Integration in theory and practice at next month's meeting of the Software Process Improvement Network.  Details are here.  If you are interested in CI, come on down.

Wednesday, May 14, 2008 10:18:08 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, April 25, 2008
My new book Code Leader: Using People, Tools, and Processes to Build Successful Software is now available and in stock at Amazon and hopefully soon at stores near you.  The initial outline for the book came from a post I did a while back, This I Believe, the developer edition.  Writing up that post got me thinking about a lot of things, and I've continued to expand on them both in the book and in presentations since then. 

There is a lot of content in the book about working with tools like SCC, static analysis, and unit test frameworks to build better software more efficiently.  I think if I were to sum up the focus, it is that we as developers owe it to our project sponsors to work efficiently and effectively, and there are lots of incremental changes that can be made to the way we work, both in terms of tools and processes to make that happen. 

The reality of modern software development (mostly) is that since the physical constraints like CPU time and memory/disk space have largely fallen away, the goal of any development project (from a technical standpoint) should be optimized for developer productivity.  That includes a wide array of factors from readability of design, how clear developer intent is to future readers, and how resillient our software is to future change to reducing barriers to developer productivity like implementing a good CI process.  Working together as a team across disciplinary and physical boundaries is at least as big a challenge as writing good code. 

I agree very much with Scott that the why and how of software development are often just as important (and harder to get right) than just the what.  I hope that I have something to contribute to the discussion as we all figure it out together...

Friday, April 25, 2008 11:31:59 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [2]  | 
# Monday, April 21, 2008

Several people asked me for my slides from my presentation last week, so here they are.  I'm trying to get them posted on the InnoTech site as well.

Monday, April 21, 2008 11:10:56 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, April 10, 2008
If you are doing anything even remotely involving Ajax or client side script, and you like Firefox like I like Firefox, go and get a copy of Firebug.  I quite literally don't know what I would do without it.  Firebug provides very comprehensive script debugging, allowing you to set breakpoints in your JavaScript, step through it, etc.  It also shows you all the requests and responses for all your post-backs, and lets you examine HTML, CSS, and script as well as the client side DOM at "run-time".  It's been invaluable in helping me figure out how ASP.NET Ajax is supposed to work and what's wrong with the JavaScript I'm writing (it's been a while). 

Good stuff.

Ajax | ASP.NET | Work
Thursday, April 10, 2008 10:56:03 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  | 

First, there was a few ideas rattling around in my head, then there was a blog post, and now you can buy the book. :-)

The most difficult challenges facing most of us these days are not about making code work.  That's relatively easy, compared to making code that you can work on and maintain with other people.  I've tried to bring together a bunch of issues and practical solutions for writing code with a team, including defining contracts, creating good tracing and error handling, and building a set of automatic tests that you can rely on.  In addition, there's a bunch in here about how to work with other developers using source control, continuous integration, etc. to make everyone's lives easier and more productive.
Thursday, April 10, 2008 10:41:33 AM (Pacific Daylight Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  |