Just recently I took up a simple freelance project, which involves interfacing with a USB camera. Considering the fact this is my first programming related project and having no prior work to base on, I took the naïve approach by using a rough mental estimate on effort and difficulty and then picking a number that sounds just about right based on that mental exercise.
As soon I started this virgin project of mine, I realize one critical thing that I had overlooked: The work involved is not just the programming, but also making the initial setup to my development and testing environment. The mistake of my oversight is made more pronounced by the need to interface with a specific piece of hardware – I’m nastily surprised when Windows 7 crashes spectacularly due to the driver that came with it. That eventually led me to having to bring up another computer and have Windows XP set up as my testing environment.
What I failed to take into account is the “initial setup cost” – the fixed amount of time, money and effort needed to set the project up in the first place. This is one of the key variables that the manufacturing or product-based businesses needed to know as a matter of survival: failure to factor this cost in correctly could prove to be fatal.
Maybe it’s due to the fact that we programmers doesn’t deal with physical atoms, we may naïvely believe that our work involves us bringing up our text editors or IDEs, start banging on the code and expect that we can come up with our software after a couple of builds. But in fact we may overlook some setup costs until we hit into our first brick wall: things from finding SDKs, to checking dependencies; from doing page-fault learning, to setting up the testing environment, etc.
I consider myself lucky that my guesstimate of the price is about right. Considering the fiery hoops that I have to jump through though, I’m starting to keep a journal to keep track what effort I had put into any projects that I attempted. I couldn’t think of a better reference than that to get a handle of things in the future.