Sunday, July 26, 2009

3 words, 2 years

Hello HN community,

Right now my head is full of questions and options, and I definitely seek an advice. That's why I've decided to tell our story here, on HN, where one can find very thoughtful and experienced community.

Well, our project is named Integrity, an online web database. Online web database. Just 3 words, and it took us 2 years to figure them out.

It all started winter 2007, when I was thinking about my own software company. I've met with my friends, Dmitry & Dmitry and we've started thinking, talking and planning.

Here goes my first mistake. Dmitry K is a talented economist, Dmitry G spent all the time learning marketing at that moment. So, I was the single developer within our brand new company, what is not the best start, as I understand at the moment. This sort of disproportion became really frustrating for all of us as the time passed by. I spent all my free time, all the evenings and weekends coding, and guys could not do so much, they were just forced to wait.

We've started discussing, and it was late spring when we decided to develop a CRM. I had some basic experience with Sugar and Vtiger when working as a freelancer and guys were familiar with the term and the overall concept.

We started learning CRM's, created trial accounts of SalesForce and Sugar and started playing with the systems, discussing our future. Our plan was to complete the system similar to free Sugar + reports till the autumn and start the sales.

You should cry now: What??? Sugar is more than 100K lines of code, SalesForce is even bigger, what was I thinking about? Yes, I was overly optimistic, just like that guy. I should have estimated all the man years, but my self confidence just blocked all questions. If I had a chance, I would send myself this post and this link, Software Estimation: Demystifying the Black Art. But you know what, I doubt it would be helpful at that moment. This understanding is tightly coupled with the efforts and this experience is so vivid in my mind because of all the efforts - the price that was payed for the knowledge.

The second and less obvious mistake is hiding in the fact that we did not understand the real value of CRM systems, we were not even standing near to the real vision, we looked at the mechanics and thought that feature parity and thoughtful copying is enough. We also did not notice the obvious things - all the marketing, press coverage and community, huge extensions market and infrastructure, these big monsters guarding elegant and shiny demos.

We've spent weeks digging Sugar's and SalesForce's demos, and I've noticed the obvious thing: all leads, companies and other blocks in the system were so identical, and actually consisted of forms and lists, linked to each other. We've created a big schema describing all the basic relations between objects in the system. Here came the next idea, what if we created the constructor, WYSISYG editor, that is able to implement all these relations? We will get the business application engine, even more valuable than CRM.

What a disastrous decision. Building a constructor is much more complicated than creating the end product, you need to count all the combinations, implement them, create complex visual setup interface, new technology and tons of other things. Even more efforts, more man-years. Now I understand that it is so common for software developers, I was a perfect example of an architecture astrounaut and of course did not know that. What is even more, I ignored "small" features in the CRM systems, like lead convertation, duplicates search, prices for products, activity logs, all these easy-to-implement but really important features, features that actually create the product shape, face and value. At that time I was thinking that all these things were not so important, all my thoughts were devoted to the editor and flexible architecture.

Well, guys were excited with the "application constructor" idea, it seemed brilliant, and I was really inspiring at that moment. I've started coding. Guys started learning the market and making first steps in the application design.

One more mistake. I had little experience with web and interfaces at that moment, my job and main experience was related to media servers and C++, so I've chosen PHP as the most friendly and easy-to-start language. If I only spent more time learning the technologies and solutions, I could find out that PHP is hardly the best language for this task, involving complex queries, relation constructors, schemes and so on. I am not saying that PHP itself is bad or good, I am just saying that the technologies stack should be chosen more wisely.

One year passed by. You can imagine that the project was far from being completed. We had a solid prototype, application visual editor, but there were still lot's of work to be done. Guys were patient, they were waiting and helping me as they could. We were still spending evenings discussing our future, we were full of plans.

A very important event happened when I've decided to evolve and started reading 6.001 SICP course on the OpenCourseWare, and read "A Story about using Lisp in a Startup Company". I did not really know who was this guy, but the article had an effect of a nuclear bomb, inspiring and thoughtful, it was changing the landscapes in my mind. And imagine what, one month later I read about Y Combinator, founded by Paul Graham, the guy who wrote that article, and they were opening their funding round. I definitely wanted to attend. I ignored my job, spent all days coding and guys were preparing the demo, demo & app should have been perfect, you know. We've submitted on the last day and we were satisfied and very, very confident that they would call us for the second round, the meeting. Why should not they? After all, we had a solid demo, video presentation and lot's of code written.

Of course you understand that we had no real chances to be invited. What would you think of a team with a single developer and 2 non techies wanting to create business application constructor, and thinking about SalesForce and NetSuite as their competitors? We were crazy and incompetent, detached from the reality, you would say.

We were not invited.

That was extremely disappointing. What went wrong? Why? And we got no answers, just the standard form, "Sorry... Let us know if you launch". We started thinking about our mistakes, thinking that we should change something, but decided to proceed and implement the initial vision of the product.

That was obvious that we should change, change the product, go to something concrete, "make something people want". We had pretty large code base (~30K lines of code), spent so much the time and efforts, these were the main reasons why we decided to proceed. Now I understand that the code itself does not matter so much, our courage to change would be the most important part of our company if only we evolved at that moment.

We got no funding and it was obvious that things went very slow, so we have decided to create our own company. We have borrowed some money that would be enough for 3-4 months for me to code on my own and I left my employer.
We were full of plans, concentrated and excited. A couple of months and we would complete the product, start the sales!

One more thing to mention, working lonely is hard, I really needed to talk to another programmer, to discuss tech things, and I could not, that's why I've started loosing focus. First months I was coding like a crazy, 10 - 11 hours of concentrated work every day, after that the progress started slowing down.

Well, there was a little thing that should be done before we would proceed. I spent all my time coding and it became obvious that PHP was not enough, and the code was ugly, using some strange mix of my own half-baked ORM and XML DOM API calls, full of stupid classes and routines, how could I write that?

I was looking at the code, it really frustrated me, more and more, and I've decided to make a complete rewrite in Python, powerful and beautiful language, use SQLAlchemy and all the libraries to create a total perfection, taking us to the ultimate success.

Now I understand that end users don't care about your technology and architecture, they care about the product value, real features making their life easier and happier. I thought that PHP was ugly, bad language, in fact it was my code that was bad and ugly. I've coded a lot, and started to evolve as a programmer, so I could not but refactor the code that was obviously incompetent, and could not stop. Refactoring itself was a good idea, changing everything at once was not so smart decision.

That was a real pleasure. Python was great, the code base became smaller and prettier, client side became more sharpened as well. I was coding, guys were digging the internet and found that there were 20 or something business application constructors, and a RollBase among them. I saw the RollBase and it hit me exactly in my head. I was crushed, I saw my project implemented by competitors! These guys implemented business application constructor with all the features, shiny and clean, the product was scalable and ready. It took me some time to recover and we decided that we still could compete, we knew how to make the product better, prettier and cheaper. Even more, we had an advantage, we know about them and they really did not.

Actually this knowledge should have changed our direction, we should have adopted our strategy, make something smaller, but prettier or just do something with our concept, but we did not. Learning to change was the hardest part.

Three months and the platform rewrite was almost completed, and we were getting our first customer! The guy wanted to automate his business. Of course we needed to customize the system, develop some extensions, but that was a perfect chance to test the system and earn some money. So, the customization project started.

One more thing to mention, making consulting was hard and it raised certain risks, but it turned out to be really useful, since it connected us to real customers and changed the way we thought about our product and priorities, seems that we finally got what customers want.

Three more months and the custom development was completed, and here started the demo day. The guy was totally disappointed. He expected to get system that simplified the things, and got a strange SalesForce-like monster that made things even more complicated.

One more mistake, I approached the project, thinking that specs were unnecessary and would just waste my time. Right now I would draw every screen and button, since drawing is cheaper. We were really different people with my customer, we were talking the same words, but imagining really different things. Sketches, screenshots would have really simplified the process and would have helped us to avoid the first failure.

Of course I could not afford the failure, and started a rewrite. Two months after brainstorms full of sketching and hard work we got a different project, making our customer happy. The product was full of wizards and icons, almost every task could be solved within 2 clicks.

That was the first time we've really understood that architecture and constructor are less important than these small features, because this small "send invoice" button is what really simplifies users life, makes him smile. In fact, now I think that business app should be highly customized for each role, each object, lead or contact, deal or opportunity should be represented in their own way, because they are really different things and serve very different purposes.

We started to change, we felt powerful and inspired, we've learned the design basics, learned what customers want, what do they expect, learned our competitors, were ready to evolve. We changed our vision to make not a constructor, but an online database, that can be edited and created on the fly, is really simple and user friendly, database that focuses on data processing, helps solving everyday tasks, gives features like easy querying, sorting and grouping, group editing, import and export, features that customers really want. We had lots of ideas, coming from our customer experience and we could execute at a high level of quality. Our team has changed too, one of Dmitry's has left, he just could not wait any more, and I've invited one of my fellow programmers to try to play with the project.

In fact, this is the state where we are right now. We have implemented and learned a lot, we have an application with smooth Ajax interfaces, 50k lines of quite good code, and what is more important, now we understand what is important for customers, what they really need.

I still believe that there is a need for such a database, Dabble DB is cool, guys done a fantastic job, but it's hardly the last word in the tools like that. I understand that there is a big road ahead, lot's of code and efforts and it can be hardly one or even 2 coders project. Big application is a dangerous thing when you are alone, it eats your time with a frightening speed.
It's clear that we need to change. And here is the big question, how?

There are many options to do, and I understand that one can hardly answer this question, but I would really appreciate your advices.

Thanks for reading this, I hope that the post was worth your time.

P.S.

One of the options I am thinking about is to join some team working on the similar task, some startup or small company, that can benefit from our ideas, experience and code, and us who can join the team, learn and discuss, code and innovate; and hoping that this post can help us to find new connections and ideas.