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

Jeffrey Palermo [MVP]

Software management consultant and CTO, Headspring Systems

In software consulting, low cost consulting can be real. . .

. . .or it can be a lie.  In my last post, Evan commented that low cost only goes so far.  I see where he is coming from.  Let me illustrate.  If a consultant puts together a system very quickly and doesn't pay attention to the quality and structure of the system, he can deliver quickly in the short term.  The client initially pays less money, and he is happy.  What actually happened was that the client received a lemon.  The software meets the initial requirements, but it has a handicap with intolerance to change (which is inevitable).  There are probably cobwebs lurking in every corner.  The same consultant will probably be asked to add features at a later time "because of the great job he did", but the second revision will cost significantly more because he will be faced with the poor decisions made in the past.  The second project is unlikely to be as inexpensive as the first, and it is very likely to be bug-riden and unstable.  The initial software delivered was a pig with lipstick on it.  I compare it to a bridge that works great at first but starts to crack and shake as the years go by.

The above is not providing the lowest cost to the client.  It is front-loading cost savings only to defer the actual bill to a later time.  Credit.  Technical debt.  The first release incurred technical debt the client will ultimately have to pay back.

This is not my model for consulting, and in this post, I hope to educate you on real low cost consulting.

What is real low-cost consulting, and how do we maximize ROI for the client?.

First, we want consistent clients.  We want to serve the client so well that they come back for the next project.  That doesn't happen if all we deliver is technical debt.  Here is the plan.  First, we start the project with very high standards.  No bugs.  We don't plan for bugs.  We don't allocate time in the project for bug fixes at the end. In fact, we give a warranty for the software.  If there is a bug found later, it's covered under warranty.  We keep the software bug-free at all times.  When a bug is found (because, yes, it happens), it becomes the highest priority.  We fix bugs right away.  If a requirement/use case/story is found to be flawed or lacking analysis, then that is a separate issue that's taken up with the client to find an acceptable course of action.  We are able to achieve this by building quality in.  All the fundamental principles come in to play: separation of concerns, cohesion, depending on abstractions, etc.  We use extensive automated testing throughout the project along with continuous integration to provide rapid feedback that everything that works continues to work.  After all, after the first feature is added, that feature is in maintenance mode from then on.  By concentrating on maintainability, the software serves the client well, both now and in the future.

But doesn't that end up costing MORE?

No.  On the surface, it might seem so since our standards are so much higher, but the end result is a lower cost and, consequently, a higher ROI for the client.  Let's examine how that works:  First, we ensure we are building the right thing.  That eliminates the waste of building the wrong thing.  Next, we start testing immediately, not at the end of the project.  That means that bugs are found immediately, not right before release.  When bugs are found/fixed immediately, there are never more than a handful of outstanding bugs, and many days there are none.  The software always works as expected.  Next, the architecture is of the highest quality, and it evolves over time.  With refactoring, the software is always well-suited to the problem. The code depends on abstractions and is therefore resilient to change.  New types can be added to the system for new features, and working code doesn't need to be modified (open/closed principle).  There are so many interlocking practices that go into achieving this that it is hard to list them all.  We keep the build fast and clean so it provides valuable feedback quickly.  With quick feedback, we can course-correct to ensure we are always on the right track.

End result

The end result is a system delivered at the lowest cost possible, not just for the first release, but when the client asks us back for a follow-on release (which they do), we are able to repeat the process and deliver a 2nd, 3rd revision with the same results as the first.

But why doesn't everyone do it that way?

It's hard.  Very hard.  It hard to get the quality people that can make it happen, and it's hard to find management that has the experience to make it happen.  

I don't claim to have all the answers (because I don't), and we are constantly improving over time, but I can say that delivering the highest in quality also ends up costing the least. 


Published Nov 04 2007, 02:47 PM by Jeffrey Palermo
Filed under:

Comments

Evan said:

Good post and I agree 100%.  It sounds like maybe 'Lowest Total Cost of Ownership' might be a bit more accurate than 'Lowest Cost', but I digg it.

# November 4, 2007 5:52 PM

jdn said:

I don't want you to take this the wrong way, but do you have any studies or other empirical whatnot to support what you are saying?

I realize you set up the contrast for effect, but the 'sure it is done quickly but it is full of technical debt and costs more to extend' is a red herring.  Lots of software is written once and never needs to be maintained or extended.

I mean, one can hardly argue against setting high standards, but 'delivering the highest in quality also ends up costing the least' seems to be hard to define and defend.

# November 4, 2007 7:53 PM

ScottBellware said:

> In fact, we give a warranty for the software.  If there is a bug

> found later, it's covered under warranty

I look forward to the estate sale.  Please stock your group with Mac laptops.

Ever read into software liability lawsuits?  You should... as a certification holder, you're more liable than others.  Software liability and malpractice is a brutal bloodbath.  The chances of you getting into a liability lawsuit have more to do with the predispositions of the customer when the customer gets into a situation that puts him under extreme duress than with the quality of your delivery.

Nonetheless, if you provide a warranty, you're going to have to force a strict definition of what that liability is, which inevitably leads to an enforceable codex of definitions of a bug.  This is a fast-track, slippery-slope back to waterfall, and very much an anathema for the kinds of business relations you might want to establish over an agile development consultancy.

# November 4, 2007 8:49 PM

Jeffrey Palermo said:

@jdn,

I can cite McConnell's "Code Complete".  That book cites many, many studies that support what I have experienced and related anecdotally.

You certainly can pull apart the points I've made and analyze them independently and dismiss them all.  I didn't intend this post to be an empirical study in itself, but the alternative is not posting at all if I don't have loads of data to back it up.

Definitely, customer requirements are always very unique, so one approach cannot be mindlessly applied to every situation.   I agree that "highest in quality" is hard to define.  Software quality is a tough term to define, I'll give you that.

# November 4, 2007 8:54 PM

jdn said:

@Jeffrey

Oh, certainly, if you had to footnote every blog post, no one would ever blog.  Certainly don't want you to think I was suggesting that.  I'll be interested to read the McConnell book and see how solid it is.

I've written about 'maintainability' many times, and it is used in multiple senses.  There are times when designing off of typed datasets and wizards is *massively* more maintainable than using e.g., DI, separation of concerns, etc.  

And there is a large amount of software that doesn't need to be maintained.  ETL processes are often like this.  The only time you would ever change is if a vendor changed a file format, or if there was some overall change in underlying architecture, in which case you are rewriting in general anyways.  Otherwise, you write it once and you are done.  And so if you can do it quickly, it trumps other concerns.

But, I definitely agree, you have to be judicious in how you apply approaches to software development.

Cheers.

# November 4, 2007 9:37 PM

Eric Wise said:

To add to jdn's comment... You always have to be mindful on the job that adding DI, 3rd party unit testing controls, 3rd party build controls, etc that you are vastly increasing the maintainability learning curve.  If you have a client with a relatively straightforward application and you know they're going to have a lesser experienced/skilled coder someday take it over, you're actually doing them harm by adding superfluous code and patterns.

1. Make it work in the simplest way possible.

2. Clean it up, improve readability/re-use.

3. Refactor to patterns... when necessary.

# November 5, 2007 8:20 AM

Jeffrey Palermo said:

@Eric,

I don't have anything to disagree with you there.

I haven't mentioned DI, 3rd party unit testing controls/3rd party build controls, so I'm a bit confused about "you are vastly increasing the maintainability learning curve."  Keeping software maintainable is the goal, so I don't understand what you are arguing for/against.

# November 5, 2007 8:40 AM

My approach to consulting. . . - Jeffrey Palermo [MVP] said:

Pingback from  My approach to consulting. . . - Jeffrey Palermo [MVP]

# November 5, 2007 9:10 AM

Craig Bowes said:

You what i think a lot of software quality can be defined as?  Empathy.  Empathy for the next developer that will need to read your code, fix a bug or add a new feature.

# November 5, 2007 2:17 PM

andrew said:

I've worked for people in the past who maintain that 'reuseability' is a myth, and one should always write software bespoke and to-purpose. Needless to say every project those companies tackled ended up being mostly complete disasters, and cost the company months in maintenance. I agree with your argument here and I'm really excited about learning the practises.

# November 5, 2007 3:37 PM

Jason said:

You would assuredly provide world class consulting services following this method.

However, whether it's "right" or not, the reason people don't do low cost consulting is because they can do high cost consulting.

Keep in mind that firms like Accenture are charging $600/hour+ for their "lead architects".  Why charge less when you're providing more?  

# November 5, 2007 6:03 PM

Jeffrey Palermo said:

@Jason,

As a businessman, I'm not arguing for low rates.  After all, value and profit go hand in hand, but I think there is so much that can be done to give the customer what they are paying for.  Software is expensive no matter how you spin it, but I try to provide the most for the client's software dollar.

# November 5, 2007 11:05 PM

Jason said:

I 100% agree with that and I'm beyond convinced that you would provide world class consulting services with this methodology.

Need any investors?

# November 6, 2007 11:11 AM

Leeor said:

Jeffrey, you are 100% correct in this post.  My question, though, lies with the state of technology.  Yes, you can create extremely best practices for tackling a software project, from freezing requirements, to creating change-aware programs, but how do you deal with the constant barrage of new technology?  So right now you might be programming for Windows, or for the web, but what about when Silverlight comes out, and WPF, workflows, ssis, sql, linq... vs2005, 2008, masterpages, xml...  Surely .Net 2.0 has been quickly replaced by 3.0 and now 3.5.  This by itself poses challenges in development.  A client that wanted a Windows app 7 years ago, 5 years ago wanted a web app.  That same client 3 years ago wanted/needed the app to run on their cell phone.  Today they want it to have 3D multi touch, surface like visualization.  Tomorrow?  So yes, you can have great practices and great people, but you also have to somehow be ready to tackle new platforms and coding schemes in order not to be left in the dust.  How do you do this?  Devote 50%+ of your time to learning?  you must in my opinion.  The only reason why I haven't started a software firm is because it's just mind boggling.  It's almost impossible to estimate deliverables, and the cost is almost always high.  I'm not saying it's impossible, but at the end of the day it's a mess.  It must be structured and predictable.  

# November 8, 2007 4:17 PM

Rinat Abdullin said:

Jeffrey,

By saying "delivering the highest in quality" do you really mean the "highest" extreme here (complete unit test coverage, full compliance with all proper development guidelines, complete comments (spellchecked), extensive reference implementations, absolutely uniform coding style, completely clean runs by all code analysis tools etc) no matter what?))

2 ScottBellware,

Warranty gives confidence and builds up reputation. It gotta be worth risk of bumping into wrong customer. And the solution could be quite simple - de juro do not imply any warranty. De facto - fix all issues that are really your issues (and a bit more).

# November 14, 2007 3:57 AM

Jeffrey Palermo said:

@Rinat,

I do mean the "highest" in quality, but I do recognize that the term is highly subjective because there is not an agree-upon definition of quality in software.  I correlate quality with correctness first and maintainability second.  Both are required, however.  I don't believe that, for instance, uniform coding style is a requirement for correctness or maintainability.  It helps if the style isn't all over the place, but not absolutely necessary.  Code analysis tools is an example of another I wouldn't consider for high quality.  There are better measures, and, again, it's highly subjective.

As the codebase increases, adding features should not slow to a crawl.  Invasive changes shouldn't be a "big deal".  Quality, maintainable software will continue to be correct even in the face of changes because the structure will make the changes not so invasive.

# November 14, 2007 8:33 AM

Rinat Abdullin said:

Jeffrey,

Would you agree then that "highest in quality" definitely implies that there are absolutely no bugs discovered by the customer? ))

I absolutely agree with the value of the flexibility in structure followed by the quality and maintainable code. And this value is even bigger if this flexibility was specifically created for this customer and designed to solve his problems even long term (or simplify solving them), considering all the primary future paths the customer might take in that period. This way the majority of changes coming down the road will not be something unexpected and would be already introduced to the structure (even if this introduction involves just slight bending of the in-structure interaction one way instead of the other or hard-coding some subtle coding restriction in). And then instead of just “no big deal” customers would get “Well, that’s trivial, low risk, low cost feature, since we’ve already considered it”.

# November 15, 2007 1:38 AM

Jeffrey Palermo said:

@Rinat,

That's exactly what that means.  If the software was supposed to behave a certain way, and it doesn't, then the customer didn't get what they paid for.  UI perfection is a separate issue, but functionality has to be correct.  It's  a very slippery slope if the software doesn't meet the customers' expectations because that points to a lack of understanding of the problem, and that's no way to run a project.  You have to build the right thing.  After that, the thing as to be right.

I disagree with the notion that for future things to be easy they have to be considered up front.  Good architecture and design is resilient to change, especially unforeseen change.  We can't predict every change, so we have to design for easy change, no matter what the change (almost).  I doubt we would change Java -> .Net or vice versa as a v2 change.  Might, but doubt it.

# November 15, 2007 11:32 AM

Rinat Abdullin said:

Jeffrey,

Gotcha)) Ok, then there is purely logical contradiction. You say

1. The highest quality means no bugs.

2. You provide the highest quality software project deliverables

3. "When a bug is found (because, yes, it happens), it becomes the highest priority. "

How could a bug be found in the highest quality software if the "highest quality" means no bugs?)

Why can’t you predict every change? You are working with the customer after all. He is the one who calls for changes. If you know your customer, his problems and view the project from his standpoint, not only you would have scope of what's going to happen in the long-term, but you would also have much less problems with functionality correctness (and much less paperwork needed to verify the requirements).

I agree that the architecture has to be resilient to almost all changes. But according to the normal distribution there always would be 20% of changes that cannot be implemented easily. And some of those changes could be important since the customer would ask for them in a couple of milestones. Making these important for the customer changes happen easily (although you are not being paid for that explicitly) - that's, I believe, one of the points of the "highest quality software". Would you agree?)

Basically here we are aiming not at "easy development" for the developer, but rather at "most efficient development" from the customer's standpoint. As if he had complete development expertise combined with the resources and his present knowledge of the business domain (or even a bit more). Could there be a mark of higher quality for the customer?)

And speaking of the bugs... well they happen. And I think it is more efficient to put the resources the customer pays for into the actual development, rather than spent workdays making sure that the software will not contain any deviations, no matter what people/hackers do to it. Microsoft & Novell do it this way, and I guess they know something about the software development.

# November 16, 2007 2:37 AM

Jeffrey Palermo said:

>>How could a bug be found in the highest quality software if the "highest quality" means no bugs?)

During delivery, if a bug is found, it should be handled right away, not cataloged in a bug tracker and brought up later.  Software built with testing right from the beginning will be much higher quality right from the start, so the few bugs that are found won't derail the project.  After delivery, bugs should be handled under a warranty of some kind.  

>> Why can't you predict every change?

I don't know, but I've never met anyone who could.  Often a customer will discover something about his business that is completely new to him.  The software should be able to adapt in this case as well.  I've never been good at predicting the future, so we try to build software that is resilient to unexpected changes, not just open to anticipated changes.

# November 16, 2007 7:18 AM

Rinat Abdullin said:

Jeffrey,

How do you deal with your warranty if some portion of the codebase that you've been responsible for gets altered by some other party? Do you keep it, cancel it completely, or something in between?

BTW, do you do only unit-testing, or additionally some kind of self-validation? For example, if the solution being delivered includes server of some sort, then the validation tests would verify that all linked services and resources are configured properly, database checks pass and all internal exception/warning logs are empty or processed. These tests can be either component-based (check just inter-component boundaries) or solution-wide. And then the server could run these tests on a regular basis and inform the maintenance about issue before it even affected the production. Do you do that?

Re: predicting changes.

Well, it is actually not completely about predicting changes, but rather about estimating and managing risks and probabilities. That's a common practice in the project management world or complex projects (like those that are run by NASA). There is already an established (and proven) statement saying that managing any project is mostly about managing risks of this project. Unfortunately for some reason (probably because of the urban myth that the software development is more "state-of-the-art" thing rather something that could be consistently measured, planned, controlled and executed) teams rarely explicitly evaluate and manage risks and modify current architecture and development procedures according to those changing estimates.

# November 16, 2007 3:36 PM

Adam Cox said:

I agree with the article. Proper design should be used while developing a system or it will be a mess. It will be nearly impossible to update later on unless if proper design techniques are applied.

# March 19, 2008 1:55 AM

About Jeffrey Palermo

Jeffrey Palermo is a software management consultant and the CTO of Headspring Systems in Austin, TX. Jeffrey specializes in Agile coaching and helps companies double the productivity of software teams. Jeffrey is an MCSD.Net , Microsoft MVP, Certified Scrummaster, Austin .Net User Group leader, AgileAustin board member, INETA speaker, INETA Membership Mentor, Christian, husband, father, motorcyclist, Eagle Scout, U.S. Army Veteran, and Texas A&M University graduate. Check out Devlicio.us!

This Blog

Syndication