Posts categorized “Productivity”.

CaseDetective 1.3 Post Development Lessons Learned: Part 1

CaseDetective 1.3 took a little longer than I hoped to develop, partly because I took some time off to recharge my batteries after CaseDetective 1.2, but also because of some painful obstacles I had to overcome during it’s development.

This is the first post in a short series of “Lessons Learned” from development of CaseDetective 1.3 for FogBugz.

The first, and most asked for feature that I needed to develop for CaseDetective 1.3 wasn’t even a real feature; Universal Binary for the Mac OS X version.

A Universal Binary version was long overdue, I would have loved to have got one out for v1.2, but REALbasic hadn’t got that functionality stable by the time I started development, and more to the point, the eSellerate Universal Binary REALbasic plugin wasn’t anywhere near ready. As I rely on this plugin for validating serial numbers and for in-app purchases, this “feature” had to slip to v1.3.

Unfortunately the Universal Binary eSellerate plugin for REALbasic caused me a lot of headaches, which considering the Mac OS X users of CaseDetective are vastly outnumbered by Windows users, is very frustrating.

The first, and most annoying problem with the eSellerate UB plugin was that it wasn’t cross-platform, meaning I couldn’t compile CaseDetective for both Windows and Mac using the same eSellerate related code; I had to continue to use the old Integrated eSeller plugin for compiling the Windows version. And to add insult to injury, the old plugin would not work with the latest REALbasic IDE without being converted to the latest plugin format (a tool for this is provided with REALbasic), and even so, seemed to clash with the new plugin so that you had to compile for Windows and Mac as two separate steps (even when using #if to target the OS specific code). I resorted to making everything I could an external item and creating a copy of the project so that I had one project for Windows and one for Mac OS X. Each project referenced pretty much the same external items except for one module that included Windows or Mac specific eSellerate code, and ran each against a different version of the IDE so that the plugins didn’t clash. It worked, but wasn’t ideal for productivity.

The new eSellerate UB plugin for REALbasic was also different in operation to the old plugin, it used their “Embedded Web Store” framework, which used an embedded web browser in a window, and required setting up of a web store in the eSellerate admin panel. Now, I wouldn’t have had any problems with this change except that it required different handling of Stock Control Units (SKUs, don’t ask me why they use a “K”, I have no idea), which totally broke the way you setup the check for update functionality. Now I needed to update two areas of my eSellerate setup to cope with the Integrated eSeller used by the Windows version, and the Embedded Web Store (EWS) used in the Mac version. This is a recipe for disaster (although I think I’ve avoided disaster so far).

Also, unlike the old Integrated eSeller, the Mac EWS plugin needed a file to be copied into the app bundle after it was created, the old version didn’t require any extra files, it was compiled in and self installing.

Oh, and in the end I had to disable the in-app purchasing from the Mac version anyway because I found that if you tried to print the invoice shown after completing a purchase it totally hung the app and required a force-quit. Now, this may have been something that I did, but I’m stumped as to what that might be, seeing as printing the invoice had nothing to do with closing the window and returning to my app, so I’m pretty sure it’s a bug in the eSellerate plugin or EWS framework. When I found this bug I was about ready to explode, there was no way I was going to waste any more time in trying to find a workaround, so I just disabled in-app purchasing in the Mac version. Mac users will have to buy through the web store and copy their license details into the “Enter License” window, not a huge problem as most people seem to buy that way anyway, but still, it’s a shame I couldn’t use this convenient in-app purchasing mechanism which sets the user’s license details automatically on purchase completion.

I think version 2.0 of CaseDetective may just be using a custom serial number scheme rather than eSellerate’s own scheme, and then I won’t need to use any eSellerate plugins at all.

Don’t get me wrong, in general I like eSellerate, in all my dealings with them I have had superb support and have had zero problems reported to me by customers about their buying experience through them. It’s just that their REALbasic support has taken a serious nose-dive, which is unacceptable to me.

Lesson Learned: Develop your own license code scheme, regardless of purchasing mechanism.

Slow Progress / Big News / Time Out

Last month was very slow, development wise. I guess I’ve just been a bit burnt out from the frenetic pace I maintained when developing CaseDetective 1.2.

There have also been quite a few outside influences on my time, and some things have tended to play on my mind about the future, which held me back as I wondered how I’m going to have the time to fit everything in, and generally procrastinated.

The biggest thing in my life just now, and that is very much changing the way I see the future, is that Mandy and I have some fantastic news to share, we are going to have a baby, “due” April 4th.

As you might imagine, even though this has been planned and looked forward to for quite a while, and we’ve know about it for a couple of months now, when you sit down and start to think about how to fit everything in when you already don’t have enough hours in the day, it’s kind of over-whelming.

Some very good friends of ours have recently had a gorgeous bundle of joy (called Karis) drop into their lives (about 8 weeks early), it’s been a right eye-opener on just how much work a newborn can be. They are totally smitten and love her to bits, but I’m sure the sleepless nights and general constant attention that a newborn requires is very hard on the body and mind, and may just affect how much development I can get in on an evening come next spring! :-)

I’ve decided to just “go with the flow” at present, I feel like time spent catching up with friends and family, getting ready for the new arrival, acting on those self improvement ideas, getting a bit fitter, learning a few new skills and generally having a bit more fun is very much called for. I’m not going to beat myself up about not getting much development done just now.

I’m sure my brain will switch back into “work like crazy” mode at some point, when it’s ready, hopefully before I have no time to act on it!

Never Check Your Email First Or Last

Never Check Your Email First Or Last at LifeDev

I’m really bad for this, and have been for a very long time. Even though I once announced my new regime would include not checking email first thing so that I could concentrate on getting stuff done, it wasn’t long until I slipped back into the habit.

At the time I was working for only myself, at home, and so had the flexibility to manage my own schedule throughout the day, but these days I don’t have that luxury any more, now that most of my day is spent on someone else’s budget.

So I don’t see anyway that I can keep things responsive for my customers unless I check my email and forums first thing in the morning while eating breakfast, as otherwise I can’t check until lunch time. I’ll have to keep the habit of checking email first thing for now.

Checking email last thing at night is also a habit I’ve acquired over the years, and it affects me just as described by Glen, it tends to take much longer than “just a couple of minutes”, drastically eating into my much needed slumber time.

This one I can and should tackle, from now on I’m going to close down my email client, news-reader (another bad habit along the same lines), and web browser long before finishing up on any work I might be doing in the evening. I will not be opening said offending apps until morning.

No more “I’m just going to check my email” before going to bed, it can wait until I’m fresh and rested from a good night’s sleep.

Plants are your friends

Merlin of 43 Folders has a nice post where he promotes solving problems by writing a note to yourself.

He discusses a lot of ways to progressively get to the root of your problem without bothering other people.

However, I think he’s missed the first and most important step, get a plant.

Eh? Get a plant? What do you mean Mr. Jones?

Get a plant, any plant will do (I have a cactus), and put it on your desk. Now, when you have a problem that you just can’t see around, talk to your plant about it.

As you explain your problem to your plant (in simple terms so that it can understand, they’re not that intelligent you know) you may find the solution just jumps out of thin air, it happens to me all the time.

Go on, give it a try!

Automating web page screen captures (Ian Landsman's dream app)

Ian Landsman’s comment of wanting the spawn of SnapZ Pro X and Selenium to automate capture of web page screen shots got me thinking. Sounded like a challenge to me.

So I ran the first really simple demo from http://www.openqa.org/selenium/demos.html and captured a full run with SnapZ (just the frame area containing the actual application).

Then I saved the resultant movie and opened it in QuickTime Pro 7. Lo and behold there’s an export format of “Movie to Image Sequence”, did that (setting appropriately low frame rate and other options) and I now have a run of pictures to pick from of the demo app at different stages. Cool.

I’m not sure how easy Selenium is to use, but it’s given me some ideas on how to quicken production of my screenshots for the next version of CaseDetective, hopefully Ian will see this and have a play with SnapZ and QuickTime to see how that fairs.

Here’s a sample of them (OK, not pretty, the demo app really is simple, but you get the gist)…

SafariScreenSnapz0011.jpgSafariScreenSnapz0012.jpgSafariScreenSnapz0013.jpgSafariScreenSnapz0014.jpgSafariScreenSnapz0015.jpgSafariScreenSnapz0016.jpgSafariScreenSnapz0017.jpgSafariScreenSnapz0018.jpgSafariScreenSnapz0019.jpg

Oh yeah, it took less than 3 minutes for me to work it all out and get these results, but a lot longer to actually write this little blog post!

New Year, New Regime.

Previously I’ve talked about how I’ve not accomplished as much as I’d liked in the first couple of weeks of working on my own, and also that I need to change the structure of my day to allow for “spiking”.

Before Christmas I had finally found what amounts to a daily rhythm, but it wasn’t perfect, and I certainly didn’t follow it perfectly. This is what I wanted to do…

  • 07:30 – Get up, shower, shave, breakfast etc.
  • 08:30 – Review email, forums and feeds. Deal with paper work such as VAT etc.
  • 09:30 – Development.
  • 13:00 – Lunch / Go out for an hour / run errands etc.
  • 14:00 – Review email and forums.
  • 14:15 – Development.
  • 17:30 – Review email, forums and feeds, maybe write a blog post and generally wind-down until it’s time for dinner.

This regime was supposed to give me plenty of time to leisurely wake up, deal with the “urgent” stuff and then get in a good few hours development before lunch. After lunch just a few minutes to check email etc and then back to development until it was time to wind-down ready for the evening.

Well, I generally managed to get up between 07:30 and 08:00, not always, but mostly, without using an alarm clock, which I was pretty happy with.

However, if I’d been up late for whatever reason then I allowed myself a little extra time in bed to compensate. Which occasionally lapsed into a whole lot of extra time, which ain’t so good.

Lesson #1: No matter what, set an alarm and get up at a constant time.

Because I wasn’t always getting up dead on 07:30 sometimes breakfast was a little rushed and not as leisurely as I’d hoped, sometimes I’d have breakfast at my desk while ready email etc. This isn’t what I wanted at all.

I thought the hour I gave myself for reading and responding to email, checking the forums and stats and then scanning the news feeds was quite generous, turns out it wasn’t, I’ve been spending way too much time reading feeds and certain other forums I frequent. This has got to change, my priority is development not reading news feeds.

Lesson #2: Do not check email, forums and feeds or deal with paper work first thing. Development must come first.

This is going to be very hard, I have this in-built need to check for any support email or forum posts often, I hate the thought of not responding as soon as I can. However, I recognise that I’m totally incapable of controlling my click finger, once I’ve checked my email for support emails I naturally check out the mailing lists I subscribe to, even though they filter into separate folders. Similarly when I check my forums I find myself clicking on the bookmarks for a couple of others too, I just can’t help it. So I’m not going to do anything but development in the mornings while at my computer.

A lot of my recent re-thinking on how to structure my day has been influenced by Steve Pavlina’s recent The 50-30-20 Rule post. In it he explains how he’s trying to follow a rule whereby at least half of his day will be taken up with actions that contribute to his long term goals, he calls them Class A actions. So in an 8 hour day he’ll spend 4 hours or more on those Class A actions. He will spend no more than 20% of his day on short term actions, those actions that have no real effect beyond 90 days, things like paper work and email (Class C). This 20% is an upper limit, if he doesn’t get everything done from Class C then so be it, they’ll keep until the next day. The remaining time, approximately 30% of the day, will be spent on Class B actions, actions that contribute to mid-term goals that are typically realized within 2 years. Class B actions use up all the time left after Class A and C.

Steve doesn’t quite make it clear as to how he structures his day, whether he gets the Class C stuff out of the way first and then spends the rest of the day on Class A then B actions, but I know how I’m going to attempt it.

I don’t trust myself to stick to only spending 1:30 on Class C stuff and then moving onto the rest, so I’m going to do at least 4 hours on Class A (primarily development at the moment) before then doing the Class C stuff. Once I’ve done 1:30 on Class C I’ll move onto Class B and maybe back to Class A if I have the time.

Before I detail what my new regime is to look like, there is one more item I need to address, health.

Last year (2005) I was going to lose one pound of weight every week until I reached my goal of 12 stone. I started the year at just over 14 stone, so expected to be fighting fit by the end of July. Suffice it to say that didn’t happen, I’m now a good 5 pounds heavier than I was this time last year, and not feeling the better for it! I didn’t have any real plan on how to lose the weight, certainly no exercise plan.

Lesson #3: Plan exercise into the week.

So, it’s back on the bike. I love cycling and am determined to be in good shape for the summer so that I can take advantage of all these free weekends I now have to take nice long rides out into the Scottish countryside.

I’ve ordered a set of cheap rollers, a cheap heart rate monitor and a couple of extra pairs of cheap cycling shorts (anyone getting the idea I’m looking after the pennies just now? :-) ). The rollers are so that I can get a good start now, while the roads are as dangerous as hell with darkness, frost and usual half asleep or drunk drivers. I’m going to start off with a daily 30 minute spin and then ramp up from there.

So, with no further ado, here’s the new daily regime:

  • 07:30 – Alarm goes off, get up, pee, get on bike.
  • 08:00 – Shower, shave, breakfast etc.
  • 09:00 – Development – super fueled by oxygen from exercise and breakfast.
  • 13:00 – Lunch.
  • 14:00 – Email, forums, paper work, feeds etc.
  • 15:30 – Class B items such as planning, marketing and organisational stuff, blogging and spiking.
  • 17:30 – Wind-down with reading and listening to podcasts etc (or more development if in the mood).

The 08:00 timing isn’t going to be hit, ever, as it’ll be a few minutes after 08:00 before I finish my 30 min session in the bike, it’s just a rough placeholder. But the 09:00 start should be easily achievable, that’s the most important timing of the whole day.

Everything after 13:00 is approximate, I may find I’m right in the middle of some development that I don’t want to stop so lunch may be delayed, which will have the effect of reducing the time spent on Class B stuff, but so be it.

OK, I realise I’m no robot, so those timings may be flexed a little, but it’ll be interesting to see how much more I can accomplish by trying to follow this regime.

When the lighter evenings come in I intend to use the 17:30 wind-down slot to go out on my bike for an hour or two. I may even just start my day a little earlier so that I can get out on the bike even earlier, we’ll see, that’s a couple of months away yet.

I’ll be sure to report back on how the new regime is holding up in due course, and whether I needed to alter it at all.

First week working on my own

Well, I’ve just finished my first week working on my own for myself as “IMiJ Software“, and it’s been kind of strange, and not as productive as I hoped.

The first couple of days were wasted with setting up my desktop computer, moving stuff across from my PowerBook to my PowerMac and installing all the software I use on a regular basis.

Moving my data was a breeze as I use “Portable Home Directories” on my Mac OS X Server, but installing software took forever, partly hampered by a dodgy external firewire drive that held all my install files. I dragged a lot of stuff across from my PowerBook, a lot of other stuff off of the ‘net, but some stuff had to be installed from scratch from CDs etc (e.g. Virtual PC).

Of course I didn’t spend two full days installing software, I did catch up with email and feeds, and did even manage to develop a little bit of stuff in CaseDetective, but the first two days did feel like a bit of a waste.

After that though things started to get moving, although I still haven’t found a rhythm yet. I thought I’d spend the first hour each day checking mail, answering support questions that came in via mail or my forums, and then scan my news feeds before getting down to work. But it never really worked out that way, there always seemed to be things I needed to do or that took my interest before I finally got going with development.

Having said that, I have managed to get some solid development in during the week, much more than I would normally, but very little of it would be visible to CaseDetective users, most has been restructuring for some features planned for the next couple of releases. Important work, but hasn’t given me the satisfaction that I’d get from seeing new features.

What has been noticeable about the time I’ve spent developing is that I’ve been able and willing to do the tricky stuff that I would normally be putting off due to the lateness of the evening. Now that I’m developing during the day I feel a lot more alert and have a lot more energy to put into development. I can juggle more code in my head and the “big picture” isn’t getting lost. I’ve also found myself entering a lot more feature ideas into FogBugz for future development.

It’s been very nice not having to commute into work every day that’s for sure, and having much more time with Mandy has been fantastic. However, I can see why some people find working from home so hard, come today (Friday) I’m definitely feeling a little cut-off from the rest of the World, even though I’ve been visiting my regular forums and such regularly. I’m missing the guys I used to work with, even though I was never very chatty I enjoyed being with them.

I need to start getting out more during the day, something I said I would do from day one but haven’t managed yet. I’m just too wrapped up in getting on with things and so haven’t torn myself away from my desk much at all this week. That’s going to change, come next week I intend to set myself some tasks that mean I have to leave the house, simple things like finish off the Christmas shopping (just need a few cards etc) and get out on my bike for a gentle spin every other lunch.

All in all it’s been a great week, but I’m looking forward to a more productive time from now on now that all my systems are sorted and I have some plans for getting away from the desk occasionally to recharge.

I've Quit My Job

Call me brave or call me stupid, but I’ve just told my current client that I’ll not be taking any further extensions to my contract with them.

Come December 2nd 2005 I’ll be free to work on my own software, all day every day, and boy am I excited!

Since I started thinking about and then developing CaseDetective well over a year ago now, I’ve always had to struggle with finding the time to actually get any work done on the project. When I look back upon the year, I think I’ve managed on average to maybe get 4 or 5 hours of development in per week, and that would be a good week.

Then along come people like Ian Landsman and countless others who give up there full time jobs and concentrate on their dreams, and the difference in their development speed is plain to see. Ian has been able to produce a very feature packed product and fire out betas one after the other within a week of each other, while I’ve struggled to get one release out per month, and I’m way behind where I want to be in releasing v1.0.

With time to work on my software during the day I expect to see a huge improvement in the quality and speed of design, development and marketing. I’ll have time to focus on my project(s) during the day while I’m awake, not while half asleep at 11pm after having got up at 6am, sat in traffic for an hour or so, done a long days work for someone else and then sat in traffic for another hour to get home, completely shattered before sitting down to work on CaseDetective late into the night.

Maybe now I can have a life. Maybe I’ll be a little (read as a lot) lighter in the pocket, I’m sure going to miss a contractor’s wage. But just maybe I’ll be better off mentally and physically now that I can spend my most productive hours working on something I love, and more importantly also spend much more time with the people I love with the time freed up in the evenings and weekends.

We’ve got enough money in the bank to see us through about a year of normal spending, as long as nothing major comes along to upset the balance. Hopefully by the end of next year I’ll have some income from the software I write, especially as I have a few ideas for other applications that may help bring in a little money. But if things start to get a little sticky money-wise towards the end of next year then I’ll look at a few short-term contracts, or maybe custom apps for small businesses in the area, but the plan is to concentrate solely on CaseDetective and its stable mates for the foreseeable future.

Finally, I’m going to be following my dream to be an ISV, wish me luck!

The joy of desktop apps

Having linked to DrunkenBlog’s interview with Brent and Sheila Simmons last night, I’ve just downloaded MarsEdit and given it a whirl. Wow, I love desktop applications, what a difference it makes to be able to post to my blog without going to my website.

This is why I think CaseDetective for FogBugz will be useful for a number of people, desktop apps just have so much of a nicer feel to them, you can do so much more, and quicker too. For example, I’ve got spell checking as I write this, no more copying to Word (yes I use MS Word on my Mac, so what of it?) just to check my atrocious spelling.

So, what’s CaseDetecive I hear you ask? CaseDetective for FogBugz is the application I’m working on, a desktop companion to FogBugz by Fog Creek.

My intentions are that CaseDetecive allow me (and anyone else who may be interested) to extract data from FogBugz and generally dig a little deeper than you can with the current release (4.0). I want to be able to extract to Excel or similar apps various fields that meet various criteria (filters), and I think there are quite a few others who would like to be able to do the same too.

I’ve got a lot of ideas for what I want CaseDetective to allow me to do beyond just extracting data, but I’ll talk about that a little further down the line. If anyone reading this is a FogBugz user, and has any ideas on what they would like to be able to do from a desktop companion app, please add a comment to this post. All suggestions are very welcome!

Brent Simmons gave me a sleepless night.

I had a really sleepless night last night, and it’s all down to Brent Simmons’ Black Box Parsing post on his weblog.

Why am I blaming him? Because it finally brought to the fore that I really need to clean up my code and make it far more object orientated (OO), something that has been nagging me for quite some time.

I’m afraid I’m a bit of a perfectionist, and this is probably one of my biggest sources of procrastination, something I realised just recently when listening to The Procrastinator’s Handbook: Mastering the Art of Doing It Now. Wanting to do something perfectly, is most definitely the reason I procrastinate the most, the idea of not getting something done to a high standard creates a lot of fear in me, and can stop me in my tracks.

However, I’ve already developed some of my application in a way which is congruous with OO development, and each time I add a new feature or need to modify a bit of code, I improve it a little and usually move it towards better using the OO features of RealBasic, probably because I’m learning so much more each time I sit down and start developing. I’m now at a point though that I really need to clean up a core part of my project, there are some new features I want to implement and can not do cleanly and efficiently with the current layout and communication between the data model, gui objects and controlling functions (see what I did there, Model-View-Controller :-) ).

What’s really bad is that I’ve been fully aware of the benefits of the Model-View-Controller (MVC) pattern for a year or two, since I first started looking at development on my Mac. Objective-C is a great OO development platform, and I’ve played with it and run through a number of tutorials and created a few play apps using the great free IDE called XCode on OS X, usually using the MVC pattern. So, why is it I didn’t use MVC properly from the outset when I started doing some serious development? Who knows, maybe I’m just lazy, or maybe I’m not lazy enough to use the productivity gains when OO is used to its full potential. Or maybe, I just got carried away and fell into the trap of whipping up a quick prototype, but not enforcing the fact that it really was a prototype and that it should be thrown away and developed afresh correctly with longevity in mind. Mind you, there are some people that believe a prototype should never be thrown away, that it should simply be improved upon and brought up to scratch rather than writing off the investment in it. I think I may go down the hybrid route; I can easily save elements of my project as classes, and even enforce this in my mind by making them external classes that can be picked up by other projects if I wish. This will help me get started in shifting the code around to get rid of some of the dependencies I built in between the model and view, and allow me to work on parts individually and swap in improved objects as necessary. That’s where the Black Box approach really comes in handy.

So, I’ve decided that next week will be an architecture design week, I will sit down and design the architecture of my app properly, making sure to keep the model, view and controllers separate, and to ensure that I allow the application to use different models without changing anything in the view, and only adding one hook in one of the controllers. I want to make my app able to switch between different database schemas with so much ease that I can quickly and easily add new models as new databases come to market in the area I’m targeting.

Should be fun, and once I’m happy with my design I may start sleeping properly again, until the next big idea hits that is!