The dilemma of an engineer's heart and entrepreneurial mind
August 2014, I was in the process of evaluating the tech stack for my next project. In the last few projects, I have been using the MEAN stack, the most recent being Resumite, and I loved working on Express and Angular, but now it was time to move on, as the future of both is uncertain especially for Angular.
5:00 am, and I was exploring the newly discovered world of Isomorphic JS with React, flux, and whatnot. Being a JS lover, I am fascinated with the future of the web's isomorphic/universal era.
Web apps started with full server-side rendering to SPA(Single page application); the next logical choice is obvious. Better SEO, performance, and fully functional UX, what more you can ask from a browser where things are not much in your control.
Two straight days and I went through analyzing Express, Kraken, Sails, Loopback, HapiJS, ReactJS, React-engine, Flux, Dustjs, Hybrid apps, full isomorphic apps, and things I don’t even bother to remember. After this mind-blowing exercise, I had my winners.
HapiJS over Kraken, express, SailsJS, and loopback because of security and configuration over code.
ReactJS over Dust, Angular, Handlebar— Performance was amazing, and server-side rendering made it a clear winner.
Architecture: Fully Isomorphic apps over hybrid — It's a new and challenging concept, and people are just experimenting on it for now.
Finally, I have it. It was simple yet complicated as no best practices were available for Isomorphic apps at that time.
Techie in me was happy; dude, this is awesome to work on. Hipster of hipsters Stack. But wait…, You run a startup and have deadlines for shipping the product in the next 30 days, and if you haven’t noticed, you are the full stack designer here.
That’s a bummer. I closed the lid of mac and started walking around with nothing but a curious why in my mind.
Why do I have to pick between cool tech to work on and hustling to launch beta? Why this tradeoff? Why walk of “savvy tech stack” to “just ship it” was so rapid?
I had two options.
Go with my usual stack and be ready to re-write it once I have big bucks from investors or customers, which at the end of the day will cost my customers, not to mention slow growth and shitty product flow (You hustled, didn’t you?)
Do something innovative. I had no idea what!
There is a saying, “If you are not embarrassed with the first version of your product, you are late to the party,” but coming late to the party is a better choice than showing up naked and making a show out of yourself.
I don’t believe in rushing to launch the product and ship junk to users. But that also doesn’t mean you need to wait for perfection. MVP is important, and so is the sequence of prototypes. If you are planning to build a car, building a motorcycle is not a minimal viable prototype. It is a disaster and a waste of resources.
The goal should be to build something that works and is the right step towards your final goal.
In the world of tech, things move with the speed of light. Your best bet is to stay as independent as you can of the frameworks you are using. This will help you stay flexible towards your choices and more robust about your product in the longer run.
At the end of the day, I chose to do this and am happy with it to date.
React as view framework, I wrote all components independently and all interactions as pure functions that would take react powers as parameters and be replaced by any other framework if I choose to do so.
React for server and back-end rendering. I started with server-side rendering to make sure I get things right and don’t have to repeat myself when I jump to transfer state to client-side and provide SPA experience to my users. Fortunately, React made it really easy. Another choice could be Handlebars.
BEM and SASS, the way I wrote CSS was amazing in itself and would deserve another post.
I chose to stay lean, independent, which I believe always helps in the long run.