business, software, zen
A Few Lessons Learned
Running a business is nothing if not a learning experience. Every day presents a situation that you haven’t encountered before, and you have to be ready to shift your perspective and learn quickly in order to adapt. Here are a few tidbits of information that I’ve learned (sometimes the hard way) so far as we’ve been running Zen.
Save more information than you think you’ll need.
Disk space is cheap, and it’s much more difficult to migrate (or generate) missing data after-the-fact than it is to collect it when something happens. At a minimum, you should have a transaction table that captures everything that happens in your system. That way, you can always use this table as a last resort to create new data if you need to in the future. Be sure to listen when your conscience says YAGNI, but never trade off knowledge for extra disk space.
Soft-delete everything.
Instead of actually deleting information from your database, just flag it with a “tombstone” and leave the record there. Not only does that allow you to recover data if a user accidentally deletes it, but maintaining the relationships between entities makes managing the data much simpler. Sure, you end up with stale data in your database, but you can always prune it after a certain period of time to clean things up – and since this pruning operation takes place out-of-band, if it doesn’t work perfectly your users aren’t bothered by it.
Don’t underestimate the cost of meta-work.
Not everything that is necessary is customer-facing, or even directly related to the product. I refer to work that’s important, but not quite value-adding, as meta-work. For example, one of the most complex parts of the Zen codebase is actually the billing system – customers don’t interact with it directly, but they would definitely be upset if Zen randomly billed their credit card! The most important parts of your product are usually the parts that no one knows exist – that is, until they don’t work the way they should.
Don’t skimp on administrative software.
Information is power, so make sure your system tells you when things happen. Write reporting and management screens. Make your software send you emails when things happen. Balance this against the previous point, but just because something isn’t customer-facing doesn’t make it wasteful – if an administrative screen or report helps you to serve your customers better, it adds real value. Don’t do too much up front; instead, wait until you recognize opportunities to improve your operations, and pick the low-hanging fruit.
Just a few random thoughts.
From → Uncategorized
Leave a Reply Cancel reply
Fill in your details below or click an icon to log in:
You are commenting using your WordPress.com account. ( Log Out / Change )
You are commenting using your Twitter account. ( Log Out / Change )
You are commenting using your Facebook account. ( Log Out / Change )
Connecting to %s
Here here on the soft-delete! I’ve done a couple projects now where I wish I soft deleted everything. Sometimes having ON DELETE CASCADE on every foreign key relation is quite scary.
Great post Nate!
I’ve had the same issues on my current project regarding meta-work and administration. I couldn’t agree with you more, and whilst I thought I could get away with building all the client facing bits first to impress potential beta testers, I’ve been bitten more than once by not having proper diagnotics and admin stuff setup in time to catch the problems those beta testers inadvertently ran into… the terms ‘egg’ and ‘face’ come to mind
Great work on Agile Zen – keep it up!
Cheers,
Rob G
Agreed on meta-work. Sometimes it is worthwhile to spend some time on things that are necessary, but not really part of the user experience.
I’m curious though what you mean when you say that your billing system is one of the most complex in the system. I’d have thought it would be fairly straightforward service that looks at your customer records, and once per month triggers the billing process.
Trackbacks & Pingbacks