Dimitris Giannitsaros (that's an awesome greek name if I've ever read one. Too bad I can't pronounce it! :) ), is trying to do what a lot of us are trying to do. Start his own microISV. His first product will be a CRM system.
He recently posted about how he gotten some coding done. I left a comment that pointed him to a recent post of mine titled, "
Taking a Step Back, Defining Users, Uses, and Building a Wireframe". (Which is me admitting that I got started with coding too soon and now I'm stopping until my spec is in order.)
Mr. Giannisaros says he is leaning more towards what 37 signals wrote about in their, "
Getting Real, Step 1: No Functional Spec", article than what I'm advocating in my blog post, mentioned above. One line from his reply said something very revealing.
"I need to see things on screen, test them and often go back to the drawing board."
I agree with this statement 100%. But let us investigate the process of doing just that and think about the fastest way to get to a finished product.
Keep in mind the end goal is a finished product. For your own sanity, you'll want to work as efficiently as possible. You and I are trying to start a microISV. I'm sure the last thing you want to do is write code for 4 weeks (nights and weekends for us wanna-be microISV's, no less), only to throw it out the window when it's done and "go back to the drawing board".
I've been there.I remember back to one of the first web applications I built for my current employer. It was a seemingly simple photo album web site. I'll spare you the details of the requirements, but this is how our development process went.
We got an understanding of what the site was supposed to do, and wrote it down. Ok, so it's storing pictures, displaying pictures, and it had a few other features (again, I'll spare you the details). That's flipp'n easy, right? WRONG! The first version of the site was completed in 3 months. We then spent the next 5 months going around in circles because each time we'd show the business client what we had built they would say, "Ok, but what about this." We'd scurry off and build what they requested. Come back and say, "Here! We've built what we asked for." They would say, "Ok, but can we do this instead? We want it to operate like this...."
Every time we showed them our working web application (which was built to the SPEC!!!) they would realize it didn't have some feature or operate in some fashion that THEY JUST HAD TO HAVE TO LAUNCH.
It damn near drove me insane. Here is what I learned.
A human being can not tell if an application does what they want it to until they see it. No one can read a text document or have a conversation with someone and once finished say, "That's it! That's the app I want!"
I'm trying to build my own microISV and I'll tell you right now. I thought I knew what I wanted. But it wasn't until I saw the result of my code did I realize how little I knew about what I NEEDED to build. Project Management software, right? I'm a Project Manager. I know what to build. WRONG!
So how do you combat the I-need-to-see-it problem?
It sure as heck isn't ignoring the functional spec aspect of system development. It's making a prototype.
I define prototyping as creating mock-ups of every screen and screen state of the application you are building. (You can cheat like I do, and not make the form-error screens. So sue me! ;) )
You heard me right, every screen gets a mock-up. But here's the kicker. How do you know you've created them all?
I'll let you take 1 guess from the following:
- When it's dawn and your eyes are bloodshot from working for 24 hours straight.
- When you get bored of this "prototyping" thing.
- Whey you're just itching to write some REAL programming code.
- When someone yells at you, "You need to get started."
- You've identified all the potential Users of your system and have verified that they can now accomplish something useful with your application.
I once gathered the requirements for a charity-related web application (not a "web site", an actual "web application"). Each time we met I would go through the prototype with the client, trying to see if he could actually accomplish something useful with it. It took 3 or 4 iterations of the prototype before we finally had the screens in place for a system that would aid him in his work. In one of the later iterations we literally "discovered" a needed entity in the system. If we had missed that entity most of the original design of the system would have been scrapped. It was that drastic. In conversation the client thought we were taking it into account. But walking through the mock-ups of every single screen the User realized that he couldn't of done his job.
The first iteration of the prototype took a couple of weeks. Each iteration after that took a few of days to complete.
Contrast this with the photo-album web site, which is LESS sophisticated. Every time the Client saw the site, they wanted to move it in a drastic new direction. Each iteration of the system took weeks or months to complete.
Prototypes are quick, dirty, non-functioning, mock-ups of the system. They are as if you went into the future and took a bunch of screen shots of the finished product. Returned to the present and then wrote the system. How sweet would that be!
I can't stress enough the need for defining your users and creating a full and complete prototype. In my last blog post I mentioned wireframes as a stepping stone to prototyping. You are not required by law to make a wireframe. While you develop the app for your microISV no one is going to show up at your door and demand to see a diagram with a bunch of boxes and lines on it. But wireframing really helps you move from the user-definition point to the prototype point. (
More details on wireframing from me. The first article I ever saw on the topic.)
Just in case anyone is curious, that photo album project didn't turn out with the world's greatest code base. Mid-project direction changes really hurt the quality of the code base. I'm actually working on re-doing the site from the ground up - 3 years later. And guess what I (along with the "new guy" I'm training) have spent the last 2 weeks doing. (Not every day, but a total of about 16 man-hours.)
We're writing out EXACTLY who the users of the system are and writing out EXACTLY what the users are going to be doing. We're currently working through a wireframe for each user type.
MicroISV's, don't fool your self into thinking that the whole app is "in your head". Force yourself to really spec everything out. I'm doing it for my Project Management application, and I already feel relieved. I won't be making functional decisions while I'm trying to write code!
You can make drastic changes to your prototype in a matter of hours. Changing code can take significantly longer. Your time is valuable. Do yourself a favor, work efficiently.
(Update 6/21: There is one more step before you're ready to do the technical work. Actually assembling the "spec". I'll write about it as soon as I've got the time!)