As a consultant who develops small- to medium-sized software solutions, Timothy is pretty used to seeing jaw drops when he quotes prices. Then again, most of the people that come to Timothy really don't need the fully-custom system they ask for, and he helps set them up with third-party software with some add-ons. Sometimes, the only thing that will do the trick is a complete information system built from scratch.
One of Timothy's recent prospects was not only shocked, but insulted that he would have the audacity to quote "six figures for a few servers and some programs." Instead, they decided to buy their own hardware and hire a team of overseas programmers for "less than a tenth of the cost."
As Timothy found out ten months later though a frantic call from the prospect, that didn't quite work out so well. Already months behind schedule and 300% over budget, the programmers were only able to deliver a few semi-working screens. These, as it turns out, were entirely HTML/Javascript mockups. The "enterprise framework" programming they did manage deliver provided a very interesting interpretation of the word "enterprise" ...
public abstract class Utility { public static string CLASS_NAME = CONSTANTS.CLASS_NAMES.HELPER_CLASS_NAME; public static string FormatPhoneNumber(string phNbr) { string METHOD_NAME = CONSTANTS.METHOD_NAMES.HELPER_CLASS.FORMAT_PHONE_NUMBER_METHOD_NAME; try { return phNbr.Substring(0,3) + "-" + phNbr.Substring(3,3) + phNbr.Substring(6,4); } catch { throw new EnterpriseException(CLASS_NAME, METHOD_NAME, e.ToString()); } } ... }
... and the "enterprise constants" class ...
public abstract class CONSTANTS { public abstract class CLASS_NAMES { public const string HELPER_CLASS_NAME = "Utility"; public const string WEBAGENT_CLASS_NAME = "WebAgent"; public const string WEBMESSAGE_CLASS_NAME = "WebMessage"; ... } public abstract class METHOD_NAMES { public abstract class HELPER_CLASS { public const string FORMAT_PHONE_NUMBER_METHOD_NAME = "FormatPhoneNumber"; public const string TRANSLATE_USER_ID_METHOD_NAME = "TraslateUserID"; ... } public abstract class WEBAGENT_CLASS { public const string TEST_CONNECTION_METHOD_NAME = "TestConnection"; ... } ... } }
After spending a few days going through the requirements and the code, Timothy was able to provide a quote on how much it would take to finish. He was able to only leverage about ten percent of the previous team's work to finish. Of course, his client was not only shocked, but insulted that he would have the audacity to ask "six figures just to fix up some programs." I think we can all guess where it went from there ...