CodeBetter.Com
CodeBetter.Com
RSS 2.0 via Feedburner
           Do you Twitter? Follow us @CodeBetter

Eric Wise

Business & .NET

Looking Back: Keys To Project Success Part 1

For the last few months, I've been rather scarce while we put the finishing touches on the new enterprise software that runs the company I work for.  I've been meaning to kick off a series of blog posts on what worked, what didn't, and why the team was able to finish a critical and complex project like this on time and under budget.  Given the abysmal project success rates in software, it's vital that we recognize contributors to success and repeat them.

Project Background

I work in the insurance industry, more specifically (and still general enough) the property and casualty niche.  On top of your normal software challenges, those of us who work in the insurance industry also get the trials and tribulations of dealing with a large amount of government regulations in addition to keeping not only your internal users happy and paying customers happy, but also keeping underwriters, auditors, and departments of insurance happy.

The company was a pretty small company when I started there, with a pretty small customer base.  Since I started, they've launched new partnerships and marketing initiatives, and their growth exploded (good thing).  However, the system that was running their business was not equipped to handle the growth well, was designed during an early phase of the company and as such didn't reflect how the business should operate, and was completely unmaintainable (long story, just take it at face value, this blog is not the daily wtf).

So the goal of the project was a complete replacement of the system that ran the enterprise.  This means enrollment/sales, underwriting, customer satisfaction, claims processing, invoicing/billing, and marketing.  A huge undertaking of critical value to the business, which is just the way I like it *puts on his superhero cape*.  The project team consisted of myself, 1 junior programmer fresh of out college, 1 midlevel developer, several SQL/.NET consultants, and 2 Web/Graphic Designers.

So let's get started, shall we?

Key 1: Know the Business

One of the things I've always enjoyed about my job is getting out in front of the other departments in a company and learning the big picture about how a company works.  Many people tend to sit in a void where only their department and their direct customers matter.  They don't understand or care how data and processes cross boundaries and flow through the business.  Not only do I care, but I make a point of being a student of business as much as I am a student of technology.  To me, IT is a service that holds up the rest of the business, and justifies its existance by ensuring that the rest of the business has the tools it needs to succeed in its tasks.  In order to provide service, you must become an expert not only in technology, but in the processes of your customers.

When I first arrived at the company, I spent the better part of several months just interviewing and sitting with people in the various departments of the company.  From the management all the way down to the employees taking the phone calls I examined how everyone was doing their job, what tasks they did most frequently, what tasks were frustrating, and what tasks were nearly impossible.  Many architects rely on the findings of business analysts or meetings with management, but I prefer to go straight to the source.  You'd be amazed what you can learn about interface design and what screens should look like by sitting with the line workers at a company.  I challenge those of you who are in control of page layout to take a layout request from a manager and another from the line workers and compare the two.  In my experience, 9 times out of 10 they look almost nothing alike.

Don't just take verbal cues either!  Look around people's workstations.  Do they have post-it notes in their workspaces?  Are they keeping data outside the application (usually Excel) because the application doesn't provide them with data in a format they need?  Ask lots of questions, really interview the end users!

Also, again I can't understate the importance (for internal IT architects) to have formal business education.  Having formal business education allows you to better serve your business customers by providing a common ground of language and knowledge of how a business works.  I can't imagine someone trying to architect a financial module for their company without knowing what "double entry accounting" was any more than you could imagine a piano repair man who couldn't play a note.

 Key 2: Know (and grow) Your Staff

The human aspect of a software project is probably the most challenging one for IT people to take on.  The challenge has two faces: The first is to get to know the abilities, limits, and aptitudes of your development team so that you can assign tasks to the people most likely able to complete them.  The second is to ensure that your developers are growing and feel challenged and appreciated. One of the most deadly things that can happen to a project is key contributors leaving before the project is complete.  Replacing or adding developers mid stream nearly always causes schedule slip because the new developers have to learn the architecture, business processes, and adapt to the environment.  Thus, ensuring that your performant developers are content is a key task to hitting your deadlines.  Also, because the later it gets in the project the harder it is to replace people, it is important that you identify dead wood developers and get them out the door and productive workers in the door as early as possible.

Key 3: Get out of the ivory tower

One tendancy I notice among architects and developers is the tendancy to live in the Ivory Tower.  Jay recently posted his thoughts on "Git R Done" coding and I'm pleased to throw my hat into that arena.  While it is great if you can follow all the latest fads like SOA, IOC, TDD, etc, at the end of the day/project, the business only cares that what you built works, and works to spec.  This is why when I gather a team of developers I give them the following instructions.

  1. Be clear and consistent in naming conventions
  2. Make it work
  3. Clean it up
  4. Refactor to patterns if necessary
  5. Never, ever add gold plating

I tend to code the way the natural world works.  You never, ever see a creature in nature doing something that has no purpose.  Nor do I believe that developers should abstract, tdd, or ioc code that does not need it.  If a developer comes to me and wants a pat on the back for writing 50 tests for a class that does a few simple database lookups, they are more likely to get a pink slip than a reward for wasting time and energy on tasks that add little or no value to the project.  Developers are passionate about their craft, and this is a good thing, but it can be taken too far and turn into gold plating and abstracting for the sake of abstraction, which is a very very bad thing since it wastes their time, your money, and a future maintainer's time and money since the learning curve for the maintainer goes up when the developer does this.

This is not to say that IOC, TDD, etc are to be avoided!  Quite the contrary, they make a whole lot of sense and add a whole lot of value in the appropriate situations.  The difference between an architect and a great architect is knowing when and why to use patterns and techniques.  Additionally, in my opinion the refactoring tools (I personally use resharper) are becoming so good and powerful that my step #2 "make it work" just seems natural too me.  Back in the day, if you coded something just to make it work, refactoring was a manual process and a royal pain in the ass.  It was better to spend as much time as you needed up front to designing elegant code.  In today's world with today's tool, you can take that code that just "makes it work" and refactor it into just about any pattern you want in less than an hour.

Another reason why I push the "get r done" method is that oftentimes I find that in the process of just making it work, you learn a lot more about the process at hand.  This means that since you save your cleanup and refactoring to a later stage in the process when you are more sure about what you want the code to do.  This is one of the things that TDD does bring to the table.  It makes you think about how you want the code to look before you actually write the code, but it's not a requirement to do TDD to achieve the mentality.  This also allows you to rapid prototype the application and handle scope changes in parts of the project where the scope is plagued with uncertainty.

One of the complaints you see repeated over time in development is that schedules slip or get compressed.  By embracing a "Get R Done" mentality, at least when the schedule does slip or get compressed, you have working code, even if it isn't pretty by the ivory tower standards.  And admittedly, it's downright frustrating being preached to from the ivory tower, as most of us in the real world know.  We don't start with a clean slate, enough time, enough developers, and a free hand to make all the process and architecture decisions.  We have to make do with what we have an deliver value to the business nonetheless!



Comments

cmyers said:

I can see where you're coming from, but I think you really completely miss the point when you say things like 'TDD is a fad', etc.

It's about ENGINEERING and not just slapping code on the table that works TODAY.

To me, some of the stuff you refer to as 'ivory tower' in this post are really the drop-dead essentials to long-term ENGINEERING of software.

To do less, is really a disservice to the customer (your employer, your contract customer, etc) and we have failed as professionals.

Just Gitting R Done and shipping software may be great and get you promoted, but in 5 years when some contractor loser like me has to maintain your code and the company has to shell out bucoo bucks to fix or rewrite it because it's incomprehensible, there's no change assurity, no reliability, etc, the Git R Done mentality and any immediate cost savings are lost and actualy cost quadruple.

If you couldn't tell, a lot of what I do and what I used to do is maintenance programming and supporting existing systems (usually by rewriting them because the original investment is long gone).

TDD is all about maintainability and not 'ivory tower' or doing things perfect. It's about keeping your mind on the entire game -- looking beyond the current set of features and ensuring that, 6 months from now when you have to revisit this code and have forgotten everything about it, you can be confident that you can jump in and start changing things and rely on the tests to catch you when you screw something up.

I've been doing dev for about 10 years now and never in my career have I ever been able to reduce maintenance costs and increase the longevity of a system like I have using TDD-style practices.

# June 25, 2007 1:36 AM

cmyers said:

One more thing (follow-up), to summarize:  What most people today consider 'success' I consider abject failure.

They consider 'success' by rushing to the finish line and dropping a bundle of code that solves the immediate business need.

What I usually see is the 12-18 months after that system has been deployed and is in use by the user and the original developers and project managers have all moved on after patting themselves on the back.

What I see is the system falling apart, no tests, tons of bugs, a money pit sinkhole that usually needs rewritten.

We need to redefine success to include long-term stability through increased maintainability and change assurity.  If these things are part of the requirements, than any system 'success' will be terribly short lived.

# June 25, 2007 1:42 AM

tkaszuba said:

I agree with point 1 and 2 but disagree with 3. I work in the financial industry and I see time and time again software that gets the job done but does it in such a horrible fashion that it's basically useless after go live. If a developer came to me and told me they wrote 50 tests for even minor functionality then I would pat them on the back for getting the code coverage of the tests higher. Software needs to live and grow and that means it needs to be constandly changed, when you start thinking about software as something static then you are lost.

# June 25, 2007 6:50 AM

Eric Wise said:

public DataSet GetOutstandingPayments()

{

 return mydbobject.ExecuteDataset("sprocname");

}

Explain to me how a bunch of unit tests add a benefit to the code of equal value to the $100/hr development time you spend?

1. This will probably only break if the database goes down, which unit tests do nothing to mitigate.

2. On the sql side this is a select statement that can be quickly and easily modified.

I'm not going to get into a semantics argument about why or why not you should use TDD in every single case, but TDD like every other code technique, is a fad by nature and will likely be replaced by some new thing within the next decade.  Such is the nature of our business.

Personally, I use unit tests to cover sensitive code (financials, critical data changing operations, etc).  I never really saw the point in creating unit tests for read only, display type functions which is the vast majority of the workload in a lot of systems.  The value to me simply isn't there since I would spend more time writing tests than actually getting that code (which being read only, display type code) is unlikely to break and can be very easily fixed if it isn't right.

And if you're in the real world, where the business is actively losing 5 figures a month in business because of a poor existing system, and your schedule slips and your manager finds out you slipped because you were writing 50 unit tests for trivial code, I would wager you would be fired as well.  :)

The world of business is not an ivory tower.  It's about opportunity costs and benefits.  If the opportunity cost of doing complete code coverage is delaying a system 2-3 months at tens of thousands of dollars in loss then I say you are doing your business a diservice by clinging to any architecture/pattern that isn't delivering that value now.  If the company says "Gee bob, we want the highest quality system money can buy and we don't mind waiting" then by all means glut yourself on whatever you want to do.  The Gee Bob statement is pretty rare though...

# June 25, 2007 7:04 AM

Eric Wise said:

Additionally, I do take some offense at the suggestion that if you code to get things done, automatically the code quality is poor.  I often see this from the more vocal advocates of anything:

"Once I had to maintain a system that was garbage, it didn't use <insert my pattern of choice here> therefore any system that doesn't use said pattern must be garbage"

# June 25, 2007 7:18 AM

cmyers said:

1.) See, you don't even understand the basic tennants of TDD. I would suggest you start reading, because you're missing out... A LOT. This isn't a fad, this is about professionalism and high quality, maintainable and flexible software.  In that particular case, you wouldn't UNIT test that, that's an integration point (with the DB) but you better have some test somewhere that validates that that code path works correctly and that the "sprocname" works correctly also. 100% code coverage, unfortunately, is a dream, but you should have "Lots" where "Lots" is relative to the size, scope, and severity of the project.

2.) I am in the real world and I do see those kinds of numbers, but what good is shipping a short term solution that gets your customer tripping and stumbling by for 5 months and then ends up costing them MORE than if you just engineered it RIGHT with tests and guarantees the first time?

3.) I don't live in an ivory tower, unfortunately, and I'm NOT ALLOWED to use TDD and such on many of the projects I have to work on due to management edicts and such. The projects where I AM allowed to do it are always more successful, last longer, and require less maintenance. When changes DO come along, the changes take about 50% less time than non-tested projects due to change assurity through tests.

4.) "automatically the code quality is poor" -- Oh, that's not what I said, or at least that's not what I meant.   It's not about the quality of the code, it's about the quality of the system. In any given system, there will be good points and weak points. The problem is, it's the weak points that will get you every time.  How do you guard against this? It sounds like you don't. And I bet your maintenance costs are sky high because of it. Changes are more difficult instead of drop-in, you must spend weeks and weeks of testing and regression testing because you can't trust that your change worked properly, etc, etc, etc.

This is real world: Most of these problems are alleviated, if not completely eliminated by this so-called Ivory Tower stuff you're talking about.

Can it be overused to the point of diminishing returns? Of course! And I admit that sometimes I went over overboard on it and wasted time, and I'm sure most of the evangelists preaching Agile/TDD/ALT.NET have done so also -- but I would argue that any time I waste writing superfluous tests do bring some value in that it adds to the overall self-describing nature of the project and, since we all usually end up writing worthless, dead code (gold plating as you called it, I love that term!), I'd rather have it be doing something (i.e. ensuring someone doesn't change this component the wrong way in the future) than doing nothing (some untested extra feature that no one will use).

- "One I had to maintain a system that was garbage..."  

Yeah, I hear that sometimes too. We all miss opportunities. One developer will ALWAYS rip another developer's design choices, that's just a fact. It's true with anyone in our type of profession (technical, engineering-like, etc). Sometimes they're valid criticisms (i.e. man, if that guy only did this, this system would be MUCH more flexible and I wouldn't have had to write 200% more code to code around his flaw).

What's more concerning is when you hear someone say "I can't figure out what's going on in this system and the developer is long gone and I'm terrified that if I make one change here that the entire system will collapse."

I'm constantly striving to ensure that any of my successors will never have to say that.

Summary: When you start thinking like a maintenance programmer, your whole view on design and testing changes completely.  I think that's where our disagreement lay.

# June 25, 2007 9:09 AM

Christopher Steen said:

Hack Week: Moonlight Desklets. [Via: Miguel de Icaza ] Ajax UpdateProgress That Works [Via: Greg Pasquariello...

# July 1, 2007 10:54 PM

Todd Johnson said:

Eric -

Looks like you've switched from VB to C# these days? Have we lost another VB'er to C#? :-(

# July 3, 2007 12:00 PM

Todd Johnson said:

Eric -

Nice article by way. I agree 110%. What costs more? Lost business opportunities due to project slip or code rework?? I would confidentally argue lost business opportunities. Things can always be reworked once out there (within reason). One thing I see in this field is techies tend to be geeky for geek's sake and often times don't have any or little respect for the biz side of things....

# July 3, 2007 12:04 PM

Eric Wise said:

No, I'm still a VB guy at heart.  It's just the current position I'm in I started with some C# only people and I didn't want to rock the boat.

Real .NET professionals are multilingual.  ;)

I'm going to do some xml manipulation in VB .net though, they're going to have to learn.  VB in .net 3.5 has much nicer look and feel for xml.

# July 3, 2007 12:37 PM

Todd Johnson said:

Funny; seems that "real" C#'ers have such a hard time reading VB. It's like they'll have an anaphylactic reaction or something! But VB'ers are just expected to be able to read C# and if we don't, well... we're just VB guys.

It does seem though that there is a large migration to C#, even from VB, or is that just my misguided perception caused by reading too many blogs? ;-) Blogitis?

# July 3, 2007 1:01 PM

Eric Wise said:

If we're going to speculate let's just pretend that VB coders are too busy pushing out working code and don't have time to debate the finer points of language flame wars etc like c#ers do.

*chuckle*

# July 4, 2007 7:50 PM

Todd Johnson said:

I also think they just don't have the same inclination, ego, whatever you want to coin it, to argue and/or obsess over the minutia that sometimes permeates and fuels the blogoshere. I think you're speculation has some truth; they are more concerned as a culture with getting a solution working, than getting mired down in the beauty of the process if you will. Different priorities. I think theres much to be learned from both sides (C# & VB), but I really do have a concern about the Java mentality leaking into the .NET community via C#. There certainly are many good things to learn, but lets not forget why many left Java for .NET. I just hope the .NET Java wannabees don't repeat and advocate for the same things that made devs want to leave the Java platform for .NET. .NET was supposed to be a simpler alternative. Let's keep it that way!

# July 4, 2007 10:13 PM

Christopher Steen said:

Link Listing - July 1, 2007

# July 20, 2007 1:53 AM

Leave a Comment

(required)  
(optional)
(required)  

Enter the numbers above:
Add
Check out Devlicio.us!