Whenever you are changing your system, whether it is a new system, an upgrade to your existing system, or custom programming for your unique needs, you need to carefully define the target.
Take some time, and clearly define what you want to achieve. A clearly defined, and carefully thought out, target is necessary for efficient, successful results to be achieved.
Your needs must be clearly defined, as this is what the specifications are based on. These specifications are what your system is built to, or your programming changes are made to. If you have left anything out, or have incorrect information in the specifications, correcting them may be costly, and will surely cause a delay in implementation.
One programming example that comes to mind, is having a custom pricing calculation setup to be based off of cost. This seems like a simple enough request. Originally the change was based off of last cost, then it was changed to standard cost, finally changed to the vendor unit cost. You can see that this caused the development cost to increase, and the time line to slide. Not a good result for all involved.
With a little more time spent on the original specifications, this could have been avoided. It is always a good idea to fully involve the customer at all the necessary levels in the review and finalization of the specification. This means the user community in the specific departments not just management. In our example, this would include the Inventory and Purchasing Departments as well as IT and Operations Management. A group of 5 or less people is desirable. Enough meetings and a mock-up or sketch of the final changes should be prepared before the coding starts.
Perhaps a rule of thumb is: "If you can’t define it, you can’t have it built either".