Martin Fowler is a Regular Guy

I didn’t think that before I met him, as brief of an encounter as it was. After all, he’s the author of Refactoring, Patterns of Enterprise Application Architecture and UML Distilled. He’s helped set the course of XP/Agile and regularly refers to my personal software hero, Kent Beck, as just “Kent”. Martin Fowler is respected, experienced and his name is dropped in regular software parlance to justify, or condemn, a given practice.

But – he’s still a regular guy. A software engineer. A developer. A coder. Here is why.

I attended a “Friends and Family” ThoughtWorks event at their headquarters in Chicago. The ThoughtWorks office is on the 25th floor of the ever imposing Aon Center building, which as some know, is a twin to the now gone World Trade Center buildings in New York City.

Their office space is designed to do two things: 1) induce violent jealousy of cube workers, and 2) show that they are hip coders and like Ruby. Since ThoughtWorks is a consultancy no one is ever there though. And if they are, you wonder what is wrong with them. However, they get to wear Puma’s, hoodies and generally expensive (a.k.a. designer) jeans. I wear “slacks”.

I attended a TW event before, so I had a general idea of the flow. For instance, I knew they would have some pizza so I didn’t cram my lunch in before I left. I also knew there would be mingling which I was ready for this time. I expected to schmooze with some developers at the CME or some random interactive shop.  Instead, there he was – Martin Fowler – just walking along. So I engaged him and it went something like this:

Me: “I love your books. I live by Refactoring.” (I’m a fanboy.)
Fowler: “Thank you.” (What else could he say?)
Me: “What are you thinking about nowadays? Like today? What’s on your mind?”
Fowler: “Well, really, I have a problem with my website and I need to fix it. But I have to be here as well. It’s small, but it’s bothering me.”
Me: “Your website?”
Fowler: “Yes, there is a style issue.”
Me: “On your site?”
Fowler: “It’s minor, probably just CSS really.”
Me: “But annoying?”
Fowler: “Frustrating, yes.”
Me: “So, let me get this right, Martin Fowler is concerned about CSS on his website. So, in that way you’re like all the other software engineers here leaving some problem behind at their desk to be here…”
Fowler: “Very much, except, I don’t do any real work besides writing and talking.”

And so it came and went.  I didn’t occupy him much longer with additional inane questions and politely excused myself so he could do his expected mingling with the crowd.  After all, even though there was a panel, most people were probably there for him.  Like me.  I paid 8 bucks to take a cab across the Loop to see him and I hoped that shaking his hand would impart some type of wisdom via osmosis to my software skills.

So, he’s just a regular guy.  I’m probably not that different in circumstances than him when he really started rolling in the 90’s.  He has great ideas and the ability to make complex problems simple.  But, at the end of the day, little things like CSS still weigh on him; a web page not displaying correctly or a function not being optimum.  Stuff that software engineers are concerned about.  Like me and like him.

Warning! Career Cancer!

I too got mixed up in the comments on StackOverflow that Joel and Jeff made about Robert Martin’s S.O.L.I.D. principles – to the point I was reading Coding Horror threads. (I leave out links and backstory to Joel and Jeff to spare you the wasted hours of reading.)

While on CodingHorror I was reminded of the vulgarity that anonymity creates and the attitude of so many people in our industry. They just don’t give a crap. They don’t care that they don’t know how to code, that there is a difference between awful design and good design. That objects actually help refactoring and they aren’t blob classes. They couldn’t care less. Here is an example:

From codinghorror comments
http://www.codinghorror.com/blog/archives/000856.html

There’s one thing you can do trying to keep up with progress or code like you always did. If you started in maybe Fortran, Basic, VB, ASP or maybe PHP – you continue to script your code in good old plain procedural programming. Too much OO slows you down…
New shiny thing,,, i don’t give a damn – I code it like I used to, get the machine obey my will, not the other way around…
And you don’t get more paid if you code spaghetti or nice code when your boss asks for results, time is money!!!
Ideals are good in a perfect world – I could say the search for programming utopia or something…

Would anyone want this guy on their team? He purports that he speaks for management…that they don’t care…well, they just don’t know he is sinking their software deeper and deeper into the mud.

So, I feel it’s my responsibility to warn you in Jeff Atwood fashion of this pariah. BEWARE!

They will leach onto your project, or you, and pull you down. They will undermine your work, the progress you make or anything you do in the name of progress, or heaven forbid, process. And it will all be stated in a backwards apologetic standard: “one design isn’t better than the other” or “200 line methods are fine, it can’t be done any other way”. And, one of my personal favorites “no time for TDD. No time, no time”.

It’s all stated in a pedestrian manner until you begin to peal away at the onion. “Hey, can’t we all get along. There is no black or white – just gray”. Unfortunately, as in real life, there is black and there is white. Billy is white and Sam is black. Deal with it. In software these folks will seriously suck the ever loving life out of you and then move on with their indecision, ignorance of the industry and belief that all things are equal.

Beware.

Refactoring Quickly with TDD

The situation. I have a class, Edc, that has an interface:

IEdcFinder

It needs to be composed with one of a few data lookup methods. Like a method connecting to SQL or a method connecting to XML.  I don’t want the caller to have to configure this finder object with the data method.  I’d like to make it easier.  Especially since this finder object is already being injected into another class as a pluggable object.

So, logically, move the construction of the finder to a factory method and compose the data method with it then.  I created a Factory class:

class EdcFinderFactory

But then, we have another class doing work.  So, with TDD, I switched the interface to an abstract class thinking I could use inheritance to mark all subclasses with a private constructor as well – and made the tests pass.  Good.

I was feeling OK about how things were going, but not thrilled.  I had working code but something smelled.  I realized something: there is only one class implementing IEdcFinder and that is EdcFinder.  Let’s remove duplication.

Remove: EdcFinderFactory
Remove: IEdc

(There were actually many small steps in here making sure the system still passed.)

Left with:

EdcFinder
public EdcFinder(){..}
public Create(){…inside here we create an EdcFinder composed with IReadSomeData}

So, EdcFinder became a simple concrete class with it’s public constructor and the factory method.  And, as always, I ran the tests: Pass.  Then the constructor was marked private. Pass.  Remove the old abstract class (which was an interface to start with).

Now there was less code, less interfaces and easier to read code.  I was able to implement the “Replace Constructor with Factory Method” refactoring in just minutes and I know everything still works.

With TDD and my test suites I could change with out fear.

And two days later, I looked again  and removed this entire class realizing it was unnecessary and the data method could be simplified with Func<T>.  I switched everything in about an hour. Green, Red, Refactor.

Bon.

On Positive Affect and Software

A brief tale of software developer burnout:
Brandon sits down at his two year old HP workstation and scribbles his mouse across the plastic-laminate desktop.  The twin monitors snap to attention and he logs in without thinking about it; finger memory taking over long ago.  Visual Studio is already open, it’s been for the last month, because the project continues onward like warships of a 1984 Orwellian nightmare.

He’s worked at the same project for the last 11 months and management tells him the end is in sight.  His inbox describes an alternate view:
Defect #234 -New- Wrong font color in IE 6
Defect #188 – Reopened- Pricing is incorrect

Brandon’s usually up beat, but he has seen nothing but build reports and defects for months. His stake-holders haven’t even been reviewing key features – they’re waiting for the magic release where all feature are included and everything works according to a document that some managers have signed.

Starting QA after 10 moths didn’t feel like a success.  Nor does closing 30 defects in two weeks.  And now, as the winter starts, he can only look forward to shipping the 50,000 line project on a cold weekend.  It will feel good. Right? To be done with it.  Right? Wash his hands.  Move on.  To the next…project…

This isn’t an unusual case.  Even with supposed agile practices catching on, organizations like to hold scrums for the development team but the stake-holders choose to wait until it’s complete.  Even with the idea of software being complete an oddity and undefinable end point.  Yet, they’ll wait.

This outlook on software development has caused the most pain for the Brandon’s of the industry because there is a lack of incremental satisfaction.

Nassim Nicholas Taleb sites the idea of hedonic happiness in his book, the Black Swan, to examine the idea of hope in light of big singular rewards.  Meaning, many small rewards have a much greater effect on our overall happiness then one or two big ones very far apart.  This is called positive affect.  Taleb’s example is financially driven, but excellent.  Simply, a person will be happier making $100,000 a year as opposed to making $1,000,000 every ten years.  The amount of tension and angst for those ten long years can not be recouped with the big payout – especially if it might be another ten years until it happens again.  As humans, we’re simply not wired up like that.

This fits perfectly into the not so modern realm of software development that 90% of organizations participate in.  Remember Brandon waited 11 months before a release.  He waited 10 months until someone would even begin verifying his work.  Therefore, there were 10 months of effort without any reward.  If positive affect is indeed a true nature of humanity, then long development cycles are like a 30 story ledge that developers stand on crying week to week while looking at the cars below.

The Orwellian similitude’s carry on.  The ruling “Party” of 1984 used doublespeek as a way to control the masses;  simultaneously accepting as true two mutually contradictory beliefs.  I’ve see this in places I’ve worked – and I’m sure I’m not alone.  For example, the requirement is to be agile and to release all features at once.  To do incremental work, but not test until all increments are complete.  To look at iteration plans but not really care unless a feature might not make it at release day.

Are these contradictory? Indeed.  Are they agile.  Of course not.  We don’t have to wait for a solution.  It’s already been invented and bigger organizations can take advantage of it – if they will invest in a mindset change that iterations of the product and each one should be complete.  It’s going to take more training and experience for a stakeholder to really understand that an iteration is planned to be a deployable piece of work and not the subgrouping of tasks on a Gantt chart.

I won’t belabor the incremental, agile, continuous integration points.  The amount of literature and case studies is staggering. However, I’ll continue to make a case for the Brandon’s of the world.  Give Brandon some wins.  Schedule QA of the first iteration (even two iterations) of the project so that it’s in a deployable state. Then, and this is acrimonious to some, release it.  Actually, physically release it.  Then start the next set of features.  Help our Brandon’s feel the little frequent successes that nature makes us crave and then watch the productivity of a motivated software team soar.  Use positive affect to the advantage.

George Orwell’s 1984:
“To tell deliberate lies while genuinely believing in them, to forget any fact that has become inconvenient, and then, when it becomes necessary again, to draw it back from oblivion for just so long as it is needed, to deny the existence of objective reality and all the while to take account of the reality which one denies”

Speaking of ALM

Last week I spoke on our experiences with Application Lifecycle Management at a Microsoft Partner event (Centare) at the Harley Davidson Museum in Milwaukee. It was an early morning event, starting at 7:30, which was a challenge for me to get to – but I enjoy ALM so much I made the trip from Chicago.

0e99c6db6bec

My talk was an expanded and more implementation specific version of my article that published in DDJ this summer. I try to make it fun – not everyone finds managing application lifecycles exciting. In the end I hope the attendees left with a better understanding of what managing an applications life from idea to maintenance means for an organization – and how it doesn’t have to be a yawner.

98f177c28151

Wrong About TDD

Admitting you’re wrong is anything but easy.   It’s a shot in the arm of the pride that we all hold dear – in our personal or professional lives – and often, for better or worse, in both.  Five years of marriage taught me to admit fault or error when it’s valid.  And lately, this humility, has spilled into my career as a software developer.

One can be wrong in myriad of ways.   There is fault in attitude, fault in actions, and fault in opinion – with Test Driven Development I was wrong on all three.  Gentle reader, following are the ways I wronged TDD and myself:

Ways I was wrong:
1. The way I write software is fine.
2.  I write complicated software – this won’t work here.  Object composition and encapsulation precludes TDD’s success.
3.  This will slow me down.
4.  It’s a fad.

Let’s dissect these.  My attitude was prideful (1); my abilities do not need improvement I told myself.  This is the sweet trap of stagnation we knowledge workers lay for ourselves.  Spending so much time creating models in our heads and expressing ideas in a language for machines ripens the opportunity to see our reflection as Turing, Beck or Fowler.

The applications I build are anything but trivial (2).  Is this a true statement?  Sure.  Not yes – aren’t most applications complicated?  And how would one consistently define one system as being more complex than another?  I could do it via lines of codes or cyclometric complexity – but that isn’t really what I told myself.  In fact, I belittled TDD as too small for the job because of my boastfulness stemming from fault number one (1).

Asking the question “will this slow me down?” is a trivial scapegoat for avoiding doing any task better (3).  This one is endemic of human nature because it’s difficult to argue the counterpoint – of course doing something new will be slower at first.  So does drying the dishes before putting them away, but the average domesticate prefers their cabinets not moonlighting as mold spore factories, so they will wipe that Crate and Barrel flower pattern down.

A couple months before I noted to write an essay on the benefits of TDD I planned a counter thesis – TDD is a fad (and it sucks)(4).  Yes, gentle reader, as egregious as it sounds I was quite comfortable in my anti-TDD stand; after all I was deluding myself with points one, two and three.  In fact, I reacted from cognitive dissonance; if I don’t write software well then TDD can not possibly be of benefit. Stated inversely: if TDD works there is something wrong with the way I write software. That kind of conclusion is demoralizing and my brain rejected it before I could even fully consider the implications.  I rejected TDD  to keep my ego in place for the job I spend my days contributing to.  This of course, led to confirmation bias (Nicholas Taleb terms this platonic confirmation in his book the Black Swan, http://www.fooledbyrandomness.com/) as I sought out evidence – again, the first three points – on how I was right and the TDD crowd was wrong.

If you can’t teach an old dog new tricks, like your author, it’s like pulling water from a rock to help a developer change a habit.  Now, tell them to not write cod and then test, but to write tests that write the code.  My struggle persisted.  So, I looked at the advantages – which are numerous.

Advantages

Advantage #1 – Consumer Friendly
Aesthetics are more a part of coding than the secretly vain development community would like to admit.  What is the class named?  Does it take the correct parameters?  Is it a subclass of something else?  All these things are figured out iteratively because the test is the code.  In order to write the test “GetAccountNumber” you write what you would like to see in your code.

public void Test_GetAccountNumber()
{
IAccount account = new Account(44444);  //this class does not exist yet!
int a = account.GetAccountNumber();  //this method does not exist yet!
}

This idiom of works produces more readable code because it’s already been thought out and used before it ever hits the application.This is synonymous to building UI first for a UI app.

Start with the consumer.

Advantage #2 – Interface Based Development
Entire books are written on interface based development.  Composition is preferred to inheritance and interfaces are the way to compose your objects, therefore interfaced based development is preferred.  Writing your tests first give you the opportunity early on to program to an interface, saving much grief later on.

Advantage #3 – Prove it works the first time
As humans we look for ways to avoid pain and injury.  Which hurts less:  a) writing a method called GetAccountNumber and testing it to fill a drop down on a web page and watching the drop down render as empty, or b) run the unit test for the method and watch it pass or fail.  It is infinitely easier to debug the unit test.  The only parameters for the method GetAccountNumber in the unit test are what actually gets passed to the method; like the primitive number 413.  The parameters for testing the method in the web page are the entire context of the web page – possibly the entire site – as any number of run time errors can occur while manipulating other elements.

With TDD, the chances of success the first time a method or class is used in an application greatly increase and application debugging goes down.  They are inversely proportional.

Advantage #4 – Proof it works after changes.
No matter if the program is a flight simulator, a line of business app or a huge e-commerce platform, all programers struggle with using their classes after they’re written.  Even with some up front class modeling, the first time a class is used is almost always a disastrous event.

For instance, let’s say the class built is called Mortgage. It looks like this:
class Mortgage
{
public Mortgage(datetime startYear, dateTime endYear, double loan)
{
….
public datetime GetStartYear()
{

….

This is all simple enough.  The Mortgage class is plugged into an existing web app and the methods that it exposes are used by this application. Again, this is the normal course of events for software development the world over for the past, say, 30 years.

Just a week later  a new application feature is needed to calculate the amount of interest paid for the length of the loan – which requires knowing the interest rate.  Notice though, interest rate was not past in though the constructor.  There are now two options – 1) overload the constructor with a new version that accepts the interest rate or 2) expose a public property to set the interest rate.

Option 2 does not sound very elegant and can lead to object state issues as the object is not created atomically with all the data it needs to perform it’s behaviors.  So, the new GetInterest method could be called and throw an exception because it does not have the data it needs.  (I’ve done this…it was a really, really bad idea.)

Option 1 sounds like a golden parachute over the later option.  So, the constructor is overloaded with a new version:

public Mortgage(datetime startYear, dateTime endYear, double loan, double interest)
{

There are now two constructors for this object, and they need to stay this way for the time being because the Mortgage class is already used in 5 different places in the application.  In fact, Joe Developer is using the Mortgage class with the first constructor and adding new methods to the class.  Looking at that fact, it’s thought best not to change that first constructor because who knows what may break, or worse: misbehave at runtime.

The new Interest feature is now coded and approved by whomever approves these kinds of things and everyone is happy – until iteration 3.  A routine that Joe Developer coded needs to slide that Interest number into a grid.  Joey D thinks “no problem” and calls the GetInterest method: bang, dead.  It blew up.  There isn’t an interest value in the object because he constructed his object with the original constructor.

This could have been avoided by simply eliminating that first constructor which was leaving the object in an invalid state when the GetInterest method was added.  But that was scary.  Since there weren’t any tests on the methods of the Mortgage class it was deemed to risky to change the places where the first constructor was used and now every developer from this point on will run into the same problem.  Of course they can now decide to alter all the instances of the first constructor in the application – but the damage was already done; defects.

Advantage #5 – Make the Brownfield easier to navigate.
As a professional we usually work in environments we did not bootstrap ourselves.  The environments are preexisting and have characteristics of their own.  Often, the code isn’t even legacy – it’s just there.  Any environment like this is referred to as a Brownfield and means integration work.  Integration is difficult because analyzing what may break with new or upgraded features can’t be seen until functional testing.  Writing tests first in a Brownfield will make your life easier – and the guy who comes next.

Advantage #6 – Be a professional – take responsibility for your product
Simple economics dictate the likelihood of having a tester for every coder is the same as successfully writing software using a pencil.  Writing tests that prove code works before testers touch it ups the quality dramatically.  It’s a way to take responsibility for the product being created.

Advantage #7 – Have fun.  Red, Green, Refactor.
Remember when writing software was fun.  When you referred to it as “coding” or “hacking out some code”?  Replace your TPS reports with TDD and bring a little fun back into the development cycle.

Doing Test Driven Development means that one small piece of functionality is being written and tested at a time.  It’s written. It breaks.  The code that the test is trying to run is written.  It breaks again: Red.  Tweak.  It passes: Green.  Now that it passes go and make it better.  Improving the code is no longer a fantasy.  It’s easily doable because it’s all covered by tests.  Refactor those primitives into an object or replace conditionals with polymorphism.  Or – this is fun- replace some meddlesome constructors with factory methods.  It’s not a dream with TDD – changes can be made as long as the test go Green.

Advantage #8 -  Sleep better at night
Turn off the monitor(s), grab the keys and go home assured that things are working.  Pretend that it’s Monday and you cranked out the following code; four new classes and ten new methods.  That’s a good amount of new code introduced into an application in one day.  The build succeeded, good, but you’re still not sure that when your teammates get latest things will functionally work.  Now, pretend you had tests over all that new code and they all were Green when you left.  No worries. Better sleep.

Advantage #9 -  End up with better software.
This is really what it’s all about.  Test Driven Development makes your code refactorable, which means it’s easier to change, which means it’s easer to optimize, which means it runs better which is correlated to less defects, less QA and easier releases.  And all that adds up to better software.

The Myth of Enterprise Development

The term enterprise is consistently shot across conference tables  inside corporate IT and technology marketing departments. The term is most often ascribed to software and hardware systems running the core business; a reservation system for a hotel franchise, or a software package for payroll.  However, this attribution excludes all the software that runs at smaller companies.  So, what makes a system enterprise ready and which products are left looking in at the glowing warmth of Fortune 1000 server rooms while they desiccate.

Sadly, there isn’t much empirical evidence separating an enterprise ready app from any other piece of software.  A development manager requiring an enterprise developer doesn’t make the role anymore real than an engineer claiming to be a “people person”.  An HP blade server is no more enterprise ready being racked in a enormous corporate data center than in a startup’s cage at RackSpace.  Let’s dissect this hypothesis by looking at two very popular web frameworks: ASP.NET and Ruby on Rails.

Microsoft sits in the interesting position of selling the same software that runs small businesses and large enterprises.  This of itself should be enough to prove the term enterprise a loaded marking term – but let’s keep going: ASP.NET is Microsoft’s enterprise web platform.  It, coupled with IIS, provide everything needed to build dynamic multitiered web applications.  It has optimizations for Microsoft SQL Server, session and cache providers, error reporting, performance tuning, remote configuration, etc.  It can do just about anything a web application in 2008 would require.  Again, Microsoft, pundits and analysts say it is enterprise capable.

On the other extreme is Ruby on Rails.  Note, not just Ruby the programming language, but the Rails web framework as well.  What I’m embarking on is dangerous:  I am not a Rails expert and provide this caveat up front.  Rails is considered by popular opinion to not be enterprise ready.  What does it lack?  As far as I can tell, the only thing it really lacks is a support package, IDE and hordes of corporate programmers.

On it’s own, ROR is terribly productive.  The Active Record design pattern is built right in as a OR Mapper with the friendly and obvious name of “Active Record”.  So, it provides a concise model of objects over data right out of the box (if anything had a box these days).  The framework is based off the of tried and true MVC, model-view-controller, design pattern to provide distinction between data, middle tier and presentation.  This is a simple programming idiom used with GUI development, web applications or the myriad of systems that actually make’s power arrive to substations to power my MacBook (Pro, thank you very much).

I  provide these contrasts between the frameworks to illustrate the futility of using the term enterprise for one group of software products but not for another.  Because it gets better.  Bigotry of platforms like ROR grows as corporate IT software developers feel more threatened.  Hence their managers feel threatened and when Forester Research shows up all they hear is how platforms like ROR are not enterprise ready.  But it’s not a technology stack that is not ready for development in these corporations.  It’s the people.

In the end it’s that simple.  When people are not ready they will search for whatever means to prove their disaffection, dissatisfaction or ignorance about a product to be real when it’s empirically false.  This is why the enterprise is difficult to define: because it’s a constantly moving target through the emotions and minds of corporate software developers.

In DDJ

There is something about paper.  In lieu of that, we have blogs.  Summary: I was recently published in Dr. Dobbs and now the online version has appeared.  It was a fun experience writing the article – it helps when you’re passionate about the topic of course.  Have a read.

Favorite Quotes from this Years Dr. Dobbs Architecture and Design World

I had the opportunity to attend a panel discussion with Scott Ambler (Mr. Agile), Neal Ford (all around guru) and Robert C. Martin (Clean Code). The topic: Dynamic vs Static languages!!

The following is a terse summary of the panel. Use dynamic languages where possible and where appropriate. Where is appropriate? Depends. Most places. Do not fall down the trap that static languages, like C# or Java, will save the world. It’s been over 10 years; end of story. There isn’t a single general purpose to solve everything. Java and C# are “ceremonious”. Studies show that dynamic languages make developers 5x more productive. Dynamic languages will not work without TDD and unit testing. Statically typed run times like the JVM and CLR are ripe playgrounds for deploying dynamic languages on existing infrastructure. Framework libraries are important, but with bloat like .NET, it does not mean a developer will be more productive; what is the one way to read a file in .NET?

A lot of the questions thrown at the panel were similar to “why should I use dynamic languages” or “better than C++? Outrageous!” In my opinion, it’s not the responsibility of those in the know to defend dynamic languages to the rest of the software world. It’s that big, slow, unchanging side of software development that needs to do their own research and understand the benefits of the dynamic language conversation.

Now, a few of my favorite quotes:

Martin: “Is COBOL statically typed?”
Amber: “Sure.”

Ford: “If you only learned Java in school and are put on a C++ project you will blow up the universe.”

Ford or Martin: “Bad developers will move heaven and earth to write bad code.”

Ambler: “IT people screw around all the time. That’s what we do. We don’t act like professionals and aren’t respected.”

And, finally, my favorite quote is from Scott Ambler:

“There is some fantastic research from the 70’s that shows testing at the end [of the project] works really well.”

On the Failure to Build Tools

There is a misconception in non-product software development around getting things done; where accomplishing a given task only once is acceptable. The developers who fall prey to this most often are the ones who have never seen a unit test and whom “mocking” is akin to Daily Show jokes. I’m neither an expert at unit testing and couldn’t explain how to use a library like RhinoMocks properly if my feet were to the fire…it’s just an observation. However, getting things done for that one release, for that one build, for that one functional test is common in far too many shops. Mine is no different.

The failure to build tools isn’t just around software testing. It pervades other areas of the application life cycle; early research into a project, or, say, data transformation – reproducing a database is a big one. Other failures to build tools are build scripts, configuration repositories, post-build events, cache validators, deploy validators, version checking… and the list goes on. I won’t harp on the build process – I’ve done a lot of that in the past. However, the actual release process – that is another ball of wax, or, more like the soft underbelly of the software life cycle.

All but the simplest of applications require some level of configuration management. So, if you click and drag your way to better software the rest of this essay might bore the pants of you. Or if you write Visual Basic. That’s just a straight jab.

Applications are more than their code since any significant application written for business in the last 20+ years uses to some kind of data source. And that data source, usually, is not the same for the developers or testers as it is for the end user. Hence, this variable data needs to be stored somewhere. Simple enough then. Put it on disk. Somewhere. Modify it….at some point? The question is when and how – which leads to the the primary paradox of building or not building tools I’ll address.

As software developers, we are often faced with the situation to write a script to parse 20 odd lines of some odd piece of data. Additionally we often just need the data once, loaded up, or put into a CSV file. The angel on our right shoulder tells us to write a Python script to automate it so we can do it again tomorrow if necessary. The little red guy with horns on our left shoulder tells us to do it by hand; just crank it out, as we’ll be done in 30 minutes and can go home and play World of Warcraft or watch American Idol. Mr. Red doesn’t remind us that the last thousand times we cranked it out by hand it didn’t work out and we had to do it by hand a dozen more times. Hence, with limited cognitive abilities at our disposal, as we just write software not make cheese, we go with the choice of leisure: do it by hand.

If professional software developers, being us, often make the choice not to build the simplest of scripts for tooling, what do you think occurs with the folks in IT/QA/Systems? If you’re first answer is they find a big expensive software package that will do this for twice the hassle of everyone involved, you are right! However, as this is universally accepted and widely documented let us examine the second most obvious choice. Yes, they will hack out whatever it is that needs doing by hand.

Spending time with someone in IT working in a Windows environment is like must see TV. I consider it a cross of Lost and reruns of Friends. There is constant, really constant, clicking around. Click this OPEN, click that CLOSE! Drag files. Stop. Reset service. Click, click, click, click – ad infinity. If you are fortunate to watch these activities in the wild, like Lost, you’ll wonder what the heck is going on, and like the Friends reruns, feel like so much time is being wasted.

A software release process can get rather complicated; especially on the web. On the web, inevitably you’ll end up deploying, at the minimum, hundreds of files. In lots of cases it’s actually thousands of files. This is simply the nature of the web. Along with these application files, and their resources (html, images, video, pdfs) are their configuration files. And the configuration files required for the production release is not the same as the configuration files in your QA environment – still sound so simple?

Ok, probably in theory. But in practice it’s different, and when someone walks through the process and arrives at this point they understand the complexity, timing, and work required to pull off a release. But, sadly, the reason they see this is because there isn’t a tool built to abstract this away. A nice GUI tool for IT to use. And, when that doesn’t happen, it’s time for software developers to step up and take over. Because the failure to build tools isn’t with IT – it’s with us.

Next Page »