The None-Off Imperative
When I first started doing custom software development for clients, I thought the worst word I could hear from them was “No.” As in, “No, we don’t want your open-source CMS. What is a web service, anyway?” Or, “No, we won’t pay you such an obscene amount of money.” I was wrong, though.
The worst word you can hear from a client is “But.”
It’s very deceptive. They string you in with kind words. They love your system. The user interface is beautiful. Web services are the cat’s meow and have revolutionized their business. Then the hammer falls.
But we need it to process forms a little differently. But we also want to specify five more fields per item. But we want the search results to look this way.
These things are absolute killers. They erode your profit margins, increase your implementation headaches, and generate more code that you need to keep track of and maintain. This just in! The custom credit card processing module you (or more likely, one of your long-departed coworkers) built for a customer 5 years ago started intermittently barfing when their customers tried to subscribe to their magazine. What happened? Nobody knows, and it will cost you money and time to figure it out.
Many people refer to these types of situations as “one-offs,” since the modifications made are only applicable to one particular client or situation. I like to think of the opposite as a “none-off,” implying that the software is fully-formed and without custom holes drilled in it.
Once I worked with a company that had a PHP-based CMS system. It was slick, to the point that you could copy the files to a new directory, alter a couple lines in a config file, and run the setup script and viola! a new database and backend is set up for the customer.
Unfortunately the company had a hard time finding customers that just wanted a CMS. They wanted a CMS, but also a fancy role-based application for their constituency to submit reports to them. Or they wanted their content to be managed in several different languages, or they wanted it to manage picture submissions for a contest that they ran once a year.
In a short time, the elegant CMS became a mish-mash of modules, often with overlapping functionality as developers stuck new classes and functions in different places. The little tweaks each customer wanted to the UI made the idea of having a common interface silly. Since the company didn’t revisit older production apps to make sure their versions of the CMS were kept in sync, the developers were totally at a loss when the old customers needed new things added.
The developers needed to expend so much effort staying on top of all the one-offs that they didn’t have any time to refine the core. Even worse, the company had no idea how long a new project would take when quoting customers for new business. They ended up needing to do a lot of unbillable work when the projects continually went over time and budget.
So what can be done to help this problem? That depends a lot on your situation. Here are a few tips.
- Be Selective: When taking on new work, make sure it is something that fits into your company or team’s strengths. If you have a library that does X, taking a project that requires X + Y - Z * L might not be cost effective. In cases where you need to do custom work…
- Be Honest: Both with yourself and your customer. Tell them that it isn’t something you have built already, and factor that in to your estimates. Internally, don’t waste time trying to reconceptualize the customer’s desired product in terms of your current capabilities if it doesn’t make sense. If they have their heart set on something specific, it may be easier to just give them that than modify your current system to match.
- Integrate Constantly: If you can find a way to make a one-off into a product enhancement, go for it. Chances are other customers will need a solution to the problem at some point. This is much more challenging than it seems at first blush because of time constraints and the difficulty in determining how future customers might use the functionality; it’s still worth considering.
- Be Disciplined: If you have older versions of your application floating around, get them up to date. Better yet, think about your upgrade procedures before you release Version 1 and work out your methods then. This requires a lot of work in the planning stages and discipline as you make extensions, since you don’t want to break something that is already working on an old customer’s site.
- Take a Product Orientation: Many software companies get their start doing consulting, including those of well known bloggers like Joel. They gradually shift their offerings from consulting services to product implementations to just straight boxed products. Boxed products (or turnkey websites) are where you want to be in the software world since each incremental customer costs you almost $0 to service once the product has been released. So while you may have to take on the obnoxious customers now, make sure you keep your eye on the prize and continue taking steps towards a take-it-or-leave-it product.
With a little work you can improve your margins and your product offerings.
Say “NO!” to One-offs and “YES!” to None-offs!
Til next time.
Posted: October 2nd, 2006 under Business, Technology.
Comments: 7
Comments
Comment from Mr Angry
Time: October 2, 2006, 8:19 am
You hit the nail on the head with point one: be selective. It’s one of the hardest lessons for vendors to learn - some business is BAD business. Too many people think signing up a customer is the end of the story, that it will all be good from then on. Sometimes it’s just the start of the nightmare.
Comment from Ryan Elisei
Time: October 2, 2006, 9:52 am
That is so true. Sometimes less is more. I’m not at all against adding features, but you have to know where to partition your product lines.
Pingback from Labnotes » Rounded Corners - 35
Time: October 2, 2006, 3:19 pm
[…] But … but … Mike Arace: “The worse word you can hear form a client is “But””. Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages. […]
Comment from 8020
Time: October 2, 2006, 5:10 pm
The reverse 80-20 rule is also a very good approach…..20% of the functionality that 80% of the people will want. Then spend the extra time architecting it in a very reusable way. You can then build new things quite quickly by rearranging the parts (mashups anyone?)
Comment from fabiob
Time: October 3, 2006, 11:48 am
i hope one day i will be able to choose customer.
But today having a bad customer it’s better then don’t having it.
Pingback from Mike-O-Matic » Say What You’re NOT Going to Do
Time: October 25, 2006, 10:16 pm
[…] The conversations with this customer were complicated by the fact that their current “system” was very malleable; their processes existed mostly in theory. Often the software team’s questions were met with the fatal words “sometimes,” “usually,” and “but.” We would ask “What information do you get to verify that the caller is a valid system user?” Usually we get their association ID number, but sometimes if the question is easy enough we just answer it and hang up. “How does escalation work when a customer’s problem needs a more complicated solution?” Well, sometimes the admin just knows it will be a hard problem, so they send it directly to the manager. But usually the phone tech escalates it when they can’t figure it out. […]

















Write a comment