What ready-for-production means?
During the past two weeks I built a system that is estimated at roughly 2 man months. No, I am not a coding monster, and I go lightly on the caffeinated beverages. I did that by explicitly stating that the code will have all the required features, but it will not be ready for production.
It is important to understand the difference between such an effort and demo driven or spike driven code. In both later cases, the main goal is to get something that works, without regard to maintainability or long term survivability of the code / effort. This means that you can take some very rough shortcuts along the way, to get there as fast as possible.
In this case, we have every intention of taking the same code base and getting it ready for production, but the overall structure and features must have been completed by that time. (This is a hard deadline constrained by yours truly availability, and cannot be budged.)
As such, I had to make the make compromises. They mostly dealt with error handling, validation and edge cases. That is, the thing works, and it has a solid foundation, but you are going to get... weird results if you try to do some things. Like trying to end before start, or generate a roster for the next 100 years.
This exercise got me thinking, do I really think that error handling, validation and edge case coverage are going to take 80% of the time?
That really depends of what you need for those, as a matter of fact, but that has consistently been my experience. Getting something to work tends to be fairly easy. Getting it to work right under attack is the hard bit. Getting it to fail correctly is ever harder.
In this case, I couldn't do any of those, so I made sure that when it failed, it would fail safely. That is a start, and we can build from there.
Another aspect that I have not touched is logging and auditing, which is critically important. If I need to debug to figure out what went wrong then I am in the wrong place without a map or a compass.
Comments
In my experience the problem with this approach is trying to convince people who see and use it that it really isn't ready for prime-time.
Personally I help address that by intentionally keeping the UI unpolished until it's almost ready but the temptation is always there to make it look good.
[)amien
Yes. Proper error handling and logging ALL functions will account for the remaining 80% of the time.
One these are done, when things blow up you spend 0% of your time wondering what went wrong.
Thinking that your boss/client/yourself is going to go back and do a proper retrofit is well, wishful thinking.
Your boss already thinks the app is done since - well it's in PRODUCTION!
Finally, it seems that I'm not the only one having this 'problem'. Building the database and core functionality to get this working becomes unfortunately a common practice. Mostly, because managers start thinking what they want when development is ready... So I'm using pre-production environments. Don't call them a test or beta environment, because managers don't want to test. They only want to see it work..
The main problem is that managers stop think after the specified the GUI. The visible part of the application. They often forget that the application requires a backend application dealing to make it work.
Comment preview