My first client in the consulting world at my current gig was a big company. They welcomed me spending all kinds of time, including overtime, to get their product built faster. They were also using somewhat older technologies – VS2008, VB.Net, WCF/SoA, a hand written DAL, no BOL – to get the work done, and as a result, I knew pretty much what I was going to do. There was no “play” time needed.
My second client, is a small company. Every hour counts. The less hours, the better. Its also entirely up to me how to build it – so, how new do I go?
- I could use all the cutting edge stuff that I don’t know fluently, charge the client for me learning the hard way.
- This seems unethical.
- I could stick to older stuff that I do know. Only sell the client the skills I’m awesome at, and spend time to bring some skills up to awesome.
- It takes a lot of extra time to become awesome at things.
- As I have a family i like.. this is impractical.
- A mix of the above.
I have partitioned my list into three sections:
- BUCKET A: The stuff I know how to do fairly well
- Architecture decisions
- Project management
- Console app, Parsing command line options
- Setting up diagnostics in various places to make the utilities easier to use
- Database design
- Setting up local test data environment
- Research into options available
- BUCKET B: The stuff I don’t know how to do yet, that I will definitelyhave to learn. I do charge for this, and try to get it working as fast as I can.
- Fluent NHibernate + NHibernate
- MVC3. I am NOT going webforms, sorry.
- Dealing with ENUM’s in PostgreSQL and mapping those to enum’s in C#.
- BUCKET C: The stuff I need to play with to figure out & use, but if I don’t figure it out immediately, I can get by without it.
- SpecFlow / BDD
- fastest way to setup- and teardown data in the database for functional/integration testing
Then, its not that I stay away from Bucket C, its more that I focus most of my time on Bucket A… till I feel i’ve been productive.. then B, and then maybe C.
I also timebox bucket C. For example, i researched Specflow today, figured out that yes, i want to use that.. and then I cut that off at 0.5 hours. The rest of my specflow “play” time will be “on my own” – until I get it working enough that I can move it down into Bucket A.
This gives me a clear conscience – I’m not charging the customer for playing/learning stuff that was not required – instead, i realize that with any new technology, there’s going to be some “settling” of it into my toolbelt, and that does take time. I cannot “rush” that time – so I’ll do myself a favor, and not pressure myself into learning it quickly.
For that matter, I timebox bucket B as well. For example, I could not get C# enums to save as PostgreSQL ENUM’s in about an hour of trying. I had a workaround – save as TEXT. I went for it – can revisit this at another time.
How this works at home
Hanging out with my wife is one of the joys of my life, and I do not shelve that easily. Luckily, synergistically, My wife had dinner with friends today, so I was able to make tonight into “tech playtime”. I combined playtime with bringing my VMWare work image home on an external hard drive – and that worked beautifully as well.
My next chance for evening tech playtime, unfortunately, may not be till next week. But, if I can get ahead of my required hours at work, i might convert some work time into play time. Getting in to work early means I can do playtime starting at 3 or 4 pm!