It’s our job to learn new things. We’re constantly studying, practicing, refining, etc. But I’m not sure that I’ve ever learned so much about the different ways people work than I have by writing commercial software. Now, my free Minion modules (Minion Reindex and Minion Backup) don’t cost anything, but that doesn’t mean they’re not commercial software. They’re released to the public and are becoming quite popular, so they’re commercial in the distribution sense.
And there are things that I’ve learned about SQL and DBAs in general while building these tools. Here’s a list of some of the things I’ve learned while writing the Minion maintenance modules. Not all of these were new to me. Some of them I’ve known for years, but were shoved in my face during this process. Others I’ve kind of known, and still others never even crossed my mind because I’ve never had to deal with them before. So come with me on the very rewarding, yet sometimes often quite frustrating journey of commercial software design.
1. The customer isn’t always right
That may work in the food service industry, but it definitely doesn’t fly in IT. I’ve found that giving people what they want is a dicey thing because not only do a lot of them not really know what they want, but sometimes they don’t have enough experience to know that what they want isn’t what they need.
2. Service is key
At MinionWare we pride ourselves on answering support tickets immediately. We consider it poor service to even let a ticket sit for an hour and in fact most of the time we answer the ticket within 10mins. I think this is essential because people have to know that their issues are going to be addressed in a timely manner.
3. Nobody will love your baby as much as you do
You’re proud of your product. You’ve written something that you think everyone will just love. So you package it up and send it out to the masses. And as much as you love what your code does for the world, cut that love in half for the public. Nobody will love your baby as much as you do; at least not in the beginning they won’t. However, there’ll be some who really get what you do and who love it right away. Others will take some convincing. While yet others never get excited about anything. It’s only DB maintnance dude, how exciting can it be?
4. People have all kinds of reasons for not adopting your solution.
Sometimes it’s warranted, and sometimes it’s just laziness, or not wanting to change. This is neither good nor bad, it just exists. Get ready to hear ‘no thanks’ a lot more than you’re used to.
5. There are SO many different configurations
There are so many different configurations and situations people run SQL in that it’s exceptionally difficult to write software to cover all the bases. Minion Backup was more difficult in this respect than Minion Reindex, but there was still some of that for MR. But there are so many ways people want to add backups to their processes and so many things they need to be able to do that it’s really hard to get it right. So the question is, have we gotten it right with MB? Honestly, only time will tell, but I think we objectively did a really good job. We’ve had some bugs but no major config flaws that I can see. I think we’re setup well enough for the future of the product.
6. It has to be as easy to configure as possible.
Users don’t like to jump through hoops to make simple changes to software.
7. You’re going to forget SOMETHING
No matter what you put in the product, you’ll have forgotten something that someone wants. I forgot to allow NUL backups in MB and a user requested it.
8. User requests and bug reports are a good thing.
It doesn’t necessarily make you a bad coder to have bugs. You could just have a complicated app with many different complicated situations and you can’t code for everything out of the gate. But feature requests and bug reports mean that people are using your software and like it well enough to want to see it improved.
9. “Good enough” doesn’t fly
That BS you pulled at your last company where the code you wrote was “good enough” simply won’t fly here. Your name is on this code and how embarrassing would it be for someone to comment on a poor portion of your code only for you to have to say that you didn’t feel like doing it right. Laziness is no excuse for poor coding or design. Take the time to do it right, even if you have to recode portions several times.
10. Don’t be afraid to try really outlandish things
IT gets mired in the mundane sometimes. Turn your product on its ear. If there’s something that you really want to be able to do, but it seems too hard, or even impossible, then that’s a place for you to shine. Try sample code for even the most outlandish ideas to accomplish it. You never know when it’s really not going to be as bad as it seemed. It may not always work out, but at least you’re trying to tackle the issues people are faced with. I had a few of these moments in MB. There are problems we face every day with different backup situations and I wanted to solve. And I didn’t want to be bound by what’s considered tradition to solve them.
11. You can’t control who downloads your software
You may have a primarily American market in mind, but you’ll get downloads from all around the world. Why is this important? Well, that instantly throws you into different collations, time zone issues, etc. I got caught in MB by foreign decimals. I hadn’t counted on that and when I started getting downloads from other countries, backups stopped running because Powershell and SQL handle these decimals differently. I didn’t know that before I started this.
12. Test Test Test… then test again
Keep a list of all your edge cases and test every new version against every one of them. The more you test the better your product. And formalize it. Don’t just run it a few times on your laptop and release it to the world. If you support different versions of SQL then you have to test every feature not only on every one of those versions, but also on all versions of windows they can be installed on. And if you can, test it against every major service pack. Microsoft added 3 columns to RESTORE HEADERONLY in a service pack and it broke MB. It didn’t even cross my mind to test for individual service packs before I started this.
13. You can’t test for everything
Sometimes there are some ridiculous things that keep your software from being successful and sometimes they’re not anything you could’ve foreseen. Again, MB has a perfect example. As it turns out when you’re loading the Powershell SQL module, if you have SSAS installed on the server it has no effect on backups. However, if you have SSAS installed and the service isn’t started, then it shoots up a warning when you load the provider. So we found that the warning was taking the place of the data we were expecting and backups were halted. If you’d have asked me a year ago if having SSAS turned off would affect your backup routine, I would’ve said ‘Hell No’. Leave it to me to write software that finds this kind of issue.
14. Every feature request doesn’t have the same weight
I don’t really believe in up-voting feature reqs. I think if a feature is a good idea then it should go into the product no matter how many people requested it. Maybe I’ll change my mind when there are 2 million people using my stuff and I’ve got feature reqs coming out my ears, but for now, I look at everything on its merits. That doesn’t mean though that every request is equal. I’ve had some pretty ridiculous feature reqs from people who clearly weren’t DBAs and really don’t know the proper way to manage their backups. These are the requests you don’t give much weight to. However, this is your opportunity to teach, so help your product shine by showing them the proper way to do things using your product to do it.
15. Documentation is key
The more you can tell people about your product the more successful you’ll be. There are people who just won’t read it, but there are others who will comb out every last nugget. And if you have a particularly sensitive feature, or something that is a little more difficult to configure, then give your reasoning behind designing it the way you did. Give the use cases for the feature. This will help people know when to use it and when not to. And it’ll help them know what’s going on behind the scenes. The more they know the better everyone is.
16. You can’t add every feature request
You just can’t.
17. Use your own software
If you don’t use it, then who will? And there’s no better way to flesh out bugs, and usability issues. You should always put yourself in the shoes of your users coming in for the first time. You’d be really surprised how quirky something you wrote for yourself is. MB was my private backup utility for years and I had a set of steps I went through to set it up. I knew them. I was used to them. So it didn’t bother me having to do it. But expecting everyone to go through those steps is ridiculous. Sometimes you can only make something so easy, but don’t go out of your way to make it hard. Step out of your own head.
18. Get plenty of people to test it out for you
This can be hard because you’ve not only got to find someone willing to put beta software on their box, but they’ve got to be the right person. Building up a group of reliable beta testers can be the difference between life and death. I’ve had beta testers find some pretty glaring bugs in my software and I’m grateful for each and every one of them.
19. Seriously ask yourself if you’re actually adding anything to the market
Are you really solving a problem, or putting a really good spin on something? Or just throwing a slightly different version of the same thing out there? So if you’re not an expert in the field you’re writing the software in, then do some research and find out what already exists and what the biggest issues are.
20. The internet is a cold, dark place
Writing software is one thing, and getting the word out is another. You quickly find that coming up with different ways to get the word out isn’t as easy as you’d think. It takes persistence too. You can’t just send out a couple tweets and a blog and call it a day. It takes dedication and a lot of thought to find the avenues that’ll actually tell people about your stuff. Keep with it though.
21. Write software with support in mind
Chances are you’ll have to support what you write, and not leaving yourself in a good position will be the death of you. So make sure you try to anticipate any issues someone could have and write in some debugging mechanisms. Your customers will love you for it, and so will you. And don’t make the debug info too hard to get at. Remember, you’re the one who’s going to use it, so give yourself what you need. Sometimes your customers will use it and bypass you altogether. These are the guys we like.
22. Writing software is one thing, but learning to support it is another
Sure, you may be the genius behind your code, but that doesn’t mean you have experience troubleshooting it. Sure, you’ve debugged your code many times on your test box, but what about through email with a customer who won’t just let you on his system? Do you know the right questions to ask? Do you know the right things to have them to do repro the more complicated issues? I’ve had to learn how to support my own products and it’s shown me that even my debug mechanisms weren’t what I thought they were. So I’ve had to improve my debugging scenario and going forward it’ll be first on my mind with every feature.
23. There’s a fine line between hardcoding things, and having parameters
You can’t hardcode everything, but you can’t have 500 params passed in either. It’s just too clunky. So good luck with finding that balance.
24. Never rest on your laurels
Always be thinking ahead to the next release. I’ve very happy with the current version of MB and MR, but before the code was released I was already listing enhancements for the next couple releases.
25. Be honest about your shortcomings
People hate it when you BS them, so don’t even try. Be honest about how the product works and why. Not only will people respect you more for it, but you may convert them to your way of thinking. People who don’t love you won’t love you anyway so you can’t convert everyone, but being honest about your bugs, and your features can go a very long way. Show them you’re making an honest good-faith effort to write something good.