Project Vee continues to make me remember what it was like to have a full time job. Summer (the season, not the school break) is nearly half over, and I’m no where near halfway to testing.
But I could still get there. All I gotta do is drop a few of the more difficult planned features …
Back in early 2001, after I had already clocked 6 months on The Journal 3, I realized that I didn’t like open-ended, experimental development. Which is to say, I realized that I enjoyed it too much. (What I didn’t like was all the work I wasn’t getting *paid* for yet.) And that if I was ever going to get the project finished (so I could get paid) I would have to stop all my experimenting and focus on implementing the features necessary to a completed product (of which quite a few were still missing in March of that year).
Ever since then I’ve been wary of spending too much time “twiddling”. Experimenting with data structures and UI layouts and code optimizing. It’s all so much fun. But it will all suck up so much time if I don’t keep it checked.
So far, I don’t think I’ve lost any (too much) time of Project Vee to excessive exploratory design and development. But maybe I did create a target features list that is outside the limits of what I can hope to achieve, a lone developer, in an efficient timeframe.
And so I find myself eyeing my planned implementation phases, considering once again strategic features vs tactical features, with an eye towards putting the project on a diet. The entire phase 4, for example, is likely to *poof*. But I haven’t completely decided yet.
Project management is still required. Even for a team of 1. Who knew?
I mentioned some of this in my comments to last week’s post, but I wanted to provide more details. Maybe my experience will help other software developers make the most of being featured on Bits du Jour.
First, my results from The Journal being featured on Bits du Jour:
Sales volume - ~8X normal
Revenue volume - ~5X normal
I have only very limited information to compare against, so I’m not sure how typical those results are. So I don’t know if the results are high or low or even average. Regardless, I was pleased. And I figure that’s what matters.
Obviously, the whole point of a sale is to increase sales volume and (hopefully) make up the discount in total revenue.
At first, when I was preparing for the sale, I was somewhat unenthusiastic. My only other experience with a sale had taught me a Very Valuable Lesson:
Never offer a discount to someone who is willing to pay full price.
So I hadn’t run a sale on The Journal since 2003. Over 5 years.
But then I realized: Bits du Jour’s readers aren’t my customers.
OK, sure. Some of them are. But the vast majority had never heard of The Journal.
And that’s when I realized the Big Opportunity Bits du Jour offers: Exposure. Lots of exposure.
So here’s what I did to maximize that exposure to new users, while simultaneously reducing the risk of offering a deep discount to people who weren’t price sensitive in the first place:
I decided that I would offer (as Bits du Jour recommends) a 50% discount. Due to the vagaries of decimal mathematics and my love of prices ending in .95, it was actually a 51% discount, but let’s not be too fussy. The idea was offer enough of a discount to draw attention and to push the price down to “impulse item” range.
I decided that the discount would be cash off the base edition of The Journal (normally $39.95) instead of a percentage off. I seem to recall that BdJ might have recommended that, but I went with it for my own reasons. Specifically, I would still be offering the various add-ons for The Journal (like Hamumu’sProse Challenges). Those are $10 a pop, which puts them into the “impulse item” range already. I saw no need to reduce their price. (On the other hand, I didn’t sell a lot of add-ons that day. Maybe I should’ve done an all-over sale, after all.)
The first place I promoted the sale was on The Journal’s “Discounts Available” page. I posted word of the sale there 4 days before the sale. My reasoning was that people who are interested in a discount should be told. (This was the only place on The Journal’s actual Web page that I posted any information about the sale.)
Then I realized that besides the opportunity to promote The Journal to people who might not otherwise be interested in personal journal software, I had another big opportunity: Current users of The Journal might want to buy cheap copies for their friends and family. So 2 days before the sale I posted information to The Journal’s user discussion email list.
On the same day, I posted information about the sale to this blog and to Guns & Magic, my writing blog. I usually don’t explicitly promote The Journal to either place (I prefer to keep my ads passive), but this was a special occasion. And maybe some of my readers, who I don’t usually think of as my customers, might be interested because of the sale price.
My wife got in on the act too, and posted information about the sale to a local homeschooler’s emailing list she is part of. Again, not something we would normally do. But this was special.
Finally, I sent out The Journal’s newsletter the day before the sale, with the necessary links (and encouragement).
Maybe not a “marketing blitzkrieg”, but not slacking off either.
If I had it to do over, there is one other thing I would do: I would have posted the sale information on The Journal’s front page the day of the sale.
One last word: A lot of my ideas were sparked by BdJ’s own tips. So definitely read their suggestions, as well.
Bits du Jour will be offering The Journal on Friday 11 July 2008 at the dramatically reduced price of $19.95. The normal purchase price for The Journal is $39.95! (This $20 off applies to any bundle of The Journal and add-ons so long as they are purchased through Bits du Jour.)
If you have any friends or family members who might be interested in The Journal please let them know about this sale. I can’t afford to offer this kind of discount often, and it will only be available on Bits du Jour for a single day. Just tell them to visit http://www.bitsdujour.com on Friday 11 July, 2008 to get The Journal for $19.95. If you visit Bits du Jour right now you can click the ‘Notify Me’ button and you’ll be sure not to miss the deal.
PS Marketing Insight for the Day (or Why I Posted This Here): While promoting a sale to people already willing to buy your product at full price is a great way to lose money, using that same sale to promote to people who might not otherwise be interested in the product seems like a good idea.
When I say “backwards compatibility”, I’m thinking of:
New versions of the software supporting (including properly displaying) data and processes (but mostly data) created or built with or for previous versions.
And, to a lesser extent, having the new version output data in a format that can be read by older versions.
(Is that the generally accepted definition of backwards compatibility? I should look, I guess.)
A tertiary goal of mine for backwards compatibility is to make that support (and proper display) of old data as invisible to the user as possible. In other words, the new version “just works” with the old data. No complicated upgrade processes.
Those have been my goals with every new version of The Journal since 1996. I’ve been mostly successful at it, if I do say so myself, with only a few hiccups along the way. And I’d like to think I’m getting better at it.
I get irked when the developers of software I use don’t seem to have the same priorities. (Just like I tend to get pissed off when the customer support I receive isn’t up to my own standards.)
Yes, supporting old data is a pain in the ass.
Tough.
As an aside: What I find kind of funny is that since EXE sizes no longer have much of an impact on users, each new version can effectively include the old version in its entirety. (I think Windows does this.)
The Journal v1’s EXE was about 750K. Each major update has, so far, doubled the EXE of the previous version. I trim everything I can, of course, but I’d rather have a few extra MB’s of EXE than “cut off” a user. (I’m pretty sure, though, that GUI code and database code and similar library code make up the bulk of the EXE. Which is to say: It ain’t my code swelling things up. )
Anyway, I know some “programmer putzes purists” and “design morons purists” think of backwards compatibility as the Root of All Evil. They want each new version to totally replace the previous versions–wiping out the mistakes and missteps that plagued those previous versions–all of which are gone now, of course, totally fixed in the new version. They are stupid idealists and only want to look forward. Not backward. They believe that sissy users should suck it up and upgrade and fix all their own mistakes–even those mistakes made in good faith, properly using the old software.
There is only One True Way to these idiots dreamers–and it doesn’t include backwards compatibility.
Yeah, those people bug me. Can you tell?
In summary: Backwards Compatibility == Good Thing.
The first implementation phase of Project Vee was getting the original application to compile in a sparkling new development environment. That took a week or so (because being 6 years behind in your dev tools is a long time to be behind).
In the second implementation phase I replaced the database backend. And wrote the routines for properly upgrading data from earlier versions. And, while I was at it, totally redesigned how the internal data structures communicated with the database. All of that took a couple months (because when you change the database, you change the backup/restore process and all maintenance functions, the new installation detection and similar very low-level functionality).
Now, in the current implementation phase (which is called IP2, because I’m a geek), I’m re-designing Project Vee from the inside out. Which is to say, I’m streamlining (and/or replacing) certain core data structures in anticipation of extending those streamlined (and/or replaced) core data structures in anticipation of totally overhauling the UI.
I start by describing (in The Journal, of course) where I want to end up. Then I figure out which existing data structures need to be changed or extended to get me there. And then I make small, isolated change after small, isolated change, doing full builds and testing against legacy data as I go, because I don’t want to lose anything on the way.
Because backwards compatibility must be maintained. (Anyone who tells you differently is an idiot. But that’s another topic.)
What I need is an intern. [*] Which is to say: “Someone I can dump this really shitty grind of a task on.”
Gawd. What the hell was I thinking?
Tedium following tedium. First, reviewing a quarter-million lines of code to convert the project to Unicode. And now, going through the same damn quarter-million lines of code again to separate out the UI display text for localization (and–maybe fortunately–finding a few missed parts of the Unicode conversion).
12 years of “mostly adequate” coding practices coming home to roost. At least Delphi 2007 has automated some of the really tedious parts. But I still have to review and approve. And the RSI’s are beginning to loom.
Even better: after I’m finished with the current bullet point … the hard work begins.
Back to the grind…
-David
[*] No, not really. If you’re cute and female, my wife will exercise her veto. If you’re neither-nor … well … the pay is total crap (AKA, “nothing”). And I can be very demanding for a guy paying total crap.
I’m in the process of converting a 12-year-old code base to Unicode (Windows UCS2). That’s one of the strategic goals of Project Vee.
Oh, the joy of it all.
Delphi makes it pretty easy. For the most part, WideStrings are handled the same as what are now called AnsiStrings. My chief gripes/concerns are:
I have to write my own versions of some tools I’ve grown accustomed to.
I have to switch to special WideString-enabled UI components (at least they’re free).
I have to go through every source code file and make sure that I have properly changed the type of string and functions called with those strings–except where I shouldn’t.
Because some parts of the program are going to continue using 8-bit character strings. For the very compelling reason that if they don’t, I kill 12 years of backwards compatibility. Fortunately, there are few places where this is necessary, and none of them involve user input.
I cringe at the thought of the nifty new, hard-to-find bugs that I’m introducing to a stable product.
Still, I look forward to how much this could/will broaden the scope of the final project.
And it’s good practice for the next strategic goal of Project Vee that will probably cause lingering headaches: localization.
In the beginning … I mostly sat on my ass all day and coded, with brief periods of providing customer support via email. Some days I even saw my family, who were in the next room [1]. I’ve talked some about this before.
Last year, most of my physical exercise came in 2 forms. First, walking around ridiculously large furniture stores, time after time, trying to find furniture we liked and could afford. [2] Second, moving from one house to another. And then moving stuff around in the new house.
Came my birthday in December–my last “approaching 40″ birthday–I realized (a) that I no longer lived in a skate-friendly neighborhood [3]; and (b) that I was probably too old–and would be embarrassing my family–if I tried to resuscitate that particular form of exercise. Oh, and (c) that I didn’t want to look so … chubby. The rest of me is too thin for the middle be so … not thin.
So I claimed a 6′ x 8′ section of the new game room and bought a weight bench to fill it with. Serendipitously, and almost simultaneously, I found a workout plan that seemed both simple and effective. I rearranged the workout (as Mark suggested) to reflect my own priorities [4] and called it mine.
Just an FYI: I didn’t buy all of that equipment at once. That would’ve been damn expensive. And likely premature.
I started following my “personalized” workout plan in January with just the bench, the barbell (borrowed), and a few cast iron dumbbells. I added some free vinyl weights and a curl bar that someone had left at my folks’s house years ago (when teenagers still lived there). Those are gone now, replaced (because they just didn’t match the rest of the equipment; and were ugly). And I’ve added dumbbells that take free weights (much cheaper than individual cast iron dumbbells once you get to the 20-25 lb mark).
I’m finishing my fifth month of following the plan and working out 5 times a week. I lost a couple weeks back in late January due to illness, but that’s it. Even when on vacation I missed only a couple days because the hotel where we stayed had a gym.
I call this my new hobby. Because:
I work on it almost every day.
I spend money on it almost every month.
I read up on topics of exercise and (especially) proper form on my own time. [5]
So, after 5 months, what results have I seen? First, I’ve lost almost no weight at all. Possibly none. But that’s OK. I wasn’t trying to lose weight (my weight isn’t the problem, it’s my shape). My waist has shrunk a couple inches, though, and I’ve put on muscle weight in my shoulders, chest, back and arms. I’m stronger.
It may not seem like much after 5 months, but I have no complaints. And I look forward to the next 5 months, and further. I don’t plan to be entering bodybuilding contests, but I have to admit I’m curious: What will I look like with shoulders?
Here’s why this works for me:
I don’t have to leave my house. (It’s convenient.)
The workouts usually take only 25-35 minutes. The longest day is less than 45 minutes. (It’s fast.)
The workouts are different every day. (It’s varied.)
I see progress. (It’s working.)
And it’s cheap. (As hobbies go.)
In a sense, this is just like everything else I do: Highly (maybe overly) organized, with slow and steady progress toward a (possibly vague) goal. And it happens at home. I’m such a homebody these days.
I do miss skating, though. Some.
-David
[1] It was a really small house.
[2] I lost about 5 lbs doing that throughout the spring and summer. My wife and I started calling it our “retail walk”.
[3] Great house, great neighborhood, rather shitty, potholed asphalt streets. Some parts of the neighborhood are being repaved, though, so I have hope that mine will one day be as well.
[4] Abs, shoulders, chest, arms, and legs, in that order. Back gets lumped in with abs to fill out my Mondays.
[5] But mostly because I spend money on it. That’s what hobbies are for. They’re money sinks.
Been working (a lot) on Project Vee since I got back from New Orleans. Almost obsessively.
I’ve spent hours researching the Windows side-by-side (SxS) API. I probably won’t use it. I’ve diligently hunted (and serendipitously found) bugs caused by a legacy of code that dates back to the previous century. I’ve profiled code that I thought was performing quite snappily, and discovered I was wrong (there is a limit to how much you can do between keystrokes; who knew?) In making the new version properly upgrade data from the old, I’ve bumped into database artifacts of an obscure bug that was fixed over five years ago (and discovered information in my own data that I thought I had lost to that bug). I’ve streamlined the complexity of internal data structures–which took guts, since most of the original data structure design decisions were made just after the turn of the current century. And more.
May sound boring to you. But I love programming. That’s why I’m here.
Circumstances created by the catastrophic hard drive crash in March, though, have caused me to review–and revise–the project plan for Vee. Most of the revision is in the form of moving bullet points from implementation phases and lodging them under “Future Development”. Because I need this project out the door much faster now.
Strategic features are being retained, of course, but tactical features are being pruned to the minimum. “Minimum” being mostly defined as “will the users notice the lack?” With a few shades of “what have I promised most loudly?” So long as I get the strategic features implemented, I figure I can roll out minor updates (after Vee’s initial release) that build tactical features on top of the foundation created by the new strategic features.
It’s a plan, anyway. And I’m checking off bullet points (or moving them to the future) one by one.