Read my book

I wrote books about Webpack and React. Check them out!

Saturday, December 29, 2012

Reflecting on '12 + Blog Highlights

So the year of the Mayan apocalypse is nearing its end and it's time to see what happened this year on this blog. I started this tradition last year and I think I'll stick to it. It's fun to see what has been said and done.

This was my first year out of university. I'm not sure if I'm going back anytime soon. The year taught me a lot. I also know I have plenty to learn. I've realized it's a good idea to know more about what you don't know so you when the time comes you know which resources to tap into.

Besides getting somewhat stronger technically I learned quite a bit on startups. I will start out by rambling a bit about those and get back to tech later on this post.

Startups - Lessons Learned

The year started very technically whereas the latter half was spent in the world of startups. I now have a better idea of what the whole buzz is about and what it takes to turn your startup into a success. I was particularly influenced by the whole Lean Startup movement, Steve Blank's concept of Customer Development and a Launch Pad course I had a chance to participate in.

All of these gave me thinking tools. Particularly Launch Pad made me appreciate the importance of a good business strategy. Unless you define what victory is there is no simple way to reach it. If you have some numbers on the paper and understand what it takes to get you to your goal, you'll have much better chances at succeeding in your mission.

Tools Are Best Used Together

Tools by Robert S. Donovan (CC BY)
It has been nice to see how it all comes together. It is possible to start with a holistic approach these days and fit these partially separate theories into it based on your business needs. Concepts such as Lean Startup, Lean UX and Kanban are compatible. I think one of the key points here is that gradually the boundaries between various groups of experts will start to melt. In a small organization that is a must.

Rather than separating development from user experience (UX) and customer development there are many common points. Customer development provides the ingredients you need to reach the right kind of UX and you will have a better idea of what is actually valuable to the customer and what is not. This way you will avoid waste in the development which in turn can organize its way of working using a simple Kanban table.

This is just a small part of the whole equation. Even though you might implement the right features for your target group, how do you know they are right? This is where testing comes in. You will want to design your product so that it is possible to get meaningful data out of it. In case of web based services this is actually quite easy to do and there are multiple techniques and tools available already. AB testing is a good starting point. You will also want to look into cohort analysis.

Market Trumps Idea

Fancy a Cuppa? by National Library of Ireland on The Commons
One of the very basic things it is important to understand about Lean Startup is the whole cycle from a simple idea to a working business model. Steve Blank defines a startup as an apparatus that searches for one. I think that's the whole essence of it. This search can be split into separate stages that search two particular fits: problem/solution and solution/market fit.

Once these stages have been completed it is time to scale your business. This is usually the stage in which it can be helpful to inject some funding into the business to make it grow faster. I picked this way of thinking about startup growth from Ash Maurya's excellent book "Running Lean". It complements Eric Ries' "Lean Startup" (the seminal work) very well.

I think the primary indicator that you've achieved the fits in your product is that you have traction and growing demand. You cannot move fast enough to serve the demand. The market literally pulls the product out of you.

This is the reason why I find it very antithetical to start out with an idea. I have seen too many people in love with their ideas. It's not about the ideas, it's about the market. I see business as a process of removing inefficiencies and waste from the system. You have a business in case you have managed to displace something or provide something entirely novel and different (new market).

Notable Blogposts

You can find my startup related posts under the tag. I actually wrote two longer posts on the whole market vs. idea thing: "Your Baby Is Ugly" and "Idea vs. Market-Driven Startups".

There is actually a third driver that is known as sales. If you are big and well-known enough you can actually generate demand for your product yourself. So rather than filling some existing needs you create new ones. Apple is an excellent example of a company that excels at this. Somehow they make people purchase the same devices over and over again.

I named one post of mine as "If CLV > CAC then business else hobby". You should understand at least these two numbers about your business. If it is too expensive for you to acquire new clients and the value they provide is not good enough, you are in trouble. You will likely want to make sure your CLV (Customer Lifetime Value) is at least three times larger than CAC (Customer Acquisition Cost) to stay in business.

You can decrease your CAC by being a good salesperson. There are some tips how to get better at it in my post titled as "Sales is All About Understanding". In that post I reiterate some points I learned from a truly great salesman. Thanks Teemu!

At one point I was feeling particularly angsty for some reason. That might have had something to do with the Winter and darkness. Anyhow I ended up writing "Eleven Easiest Ways to Screw Up Your Startup". Try to avoid those mistakes in your startup, m'kay?

I took part in various startup related events. I wrote more about two of those: "Presentation Notes - Case Samcom, Crowd-funding, Commercializing an Idea", "Visits at New Factory and Startup Sauna". Read those if you want to know how we roll here in Finland.

Oh, and if you are really serious about this startup thing, check out my Lean Canvas and Kanban templates. Those should at least help you get started. These kind of tools give you a nice way to discuss about your business with other people. And it is easier for you to keep track of what you know and what you think you know (assumptions).

Remember, startup business is all about reducing the risks involved and validating your business model!

Technology - Lessons Learned

I did quite a bit of development during this year. Besides various customer projects I participated in a certain volunteer project and developed a variety of my own. There are still a few I want to get into a decent shape and release to a wider public but overall I think this year was alright.

I developed various utilities during the year. As there were quite a few I've tried to split them up a bit.

JavaScript UI Widgets

  • caro.js - I developed yet another carousel as I could not find one that had a nice syntax and that supported responsive layouts. It might not be the prettiest but it gets the job done alright.
  • yabox.js - Yet another lightbox! I cannot recall why I wrote this. It must have been a boring day or something. Anyway, as usual, simple and works fine.
  • ellipsis.js - This one is actually semi-interesting and original. Nothing is more annoying than having too much content on your site. In this particular case I had long lists that needed some tidying up. I ended up implementing a simple plugin to do this for me. It simply hides the offending elements based on given rule and provides means to show them if needed.
  • Colorjoe - Colorjoe is yet another color picker. Why I felt I had to develop yet another one? Because the existing alternatives didn't feel like something I would feel comfortable using. Colorjoe doesn't depend on images like most and provides a nice pluggable API. This allows me to customize on demand without losing too many hairs in the process.
  • drag.js - This little widget grew out of Colorjoe. drag.js makes it easy to implement various sliders. In this way it's actually a meta one. It would be fun to extend this with drop semantics to make it even more useful.

JavaScript Utilities

  • ghw - ghw converts GitHub wiki to a form suitable for gh-pages. I implemented this tool by suggestion of Guillermo Rauch and used it subsequently to skin jswiki.
  • readme2gh - Maintaining gh-pages index and README.md for a project can get messy at times. This is the reason why readme2gh was born. I don't use it a lot these days but it was something fun to hack together.

Node Utilities

  • suite.js - For some reason I just couldn't find a testing tool for Node that fit my tastes. So as usual I wrote my own. The tool has evolved a little bit since writing that post but I think I'll expand on the new features on another post later. Now the generative test syntax is a lot neater!
  • annotate - This is the tool I just hinted about. annotate.js implements multiple dispatch semantics in JavaScript. It attaches certain metadata to annotated functions that makes several tasks such as test and example generation possible.
  • generators.js - As you need generators for generative testing (also known as fuzzing), I needed to develop those myself.
  • funkit - funkit it a collection of utilities I developed while implementing aforementioned libraries. I just decided to put it all into single place I can then reuse elsewhere. I'm close to finishing a rewrite on the library so the next version will have nice things like documentation and better tests.
  • mongoose-sugar - As I felt Mongoose was missing some sugar I decided to add some on top of that. This project works really well with rest-sugar.
  • rest-sugar - rest-sugar simply generates a nice and tidy REST API based on a model. This makes it super easy and fast to develop those in case this library fits your use case. I have written a specification for a library that implements revisioning semantics making it possible to build more versatile applications on top of that (think wikis, trackers and such).
  • rest-sugar-client - rest-sugar-client uses the metadata provided by rest-sugar and makes it dead easy to communicate with the API via command line. I recall writing this just for kicks. This might be handy for testing and building actual utilities, though. There is more information about these three tools in an associated blog post.
  • ioscript.js - The idea of ioscript.js is simple. It just executes the given logic on some input and then outputs that somewhere. In essence this makes it dead easy to write utilities such as readme2gh. I use this in various other libraries as well since it gives me a single extension point.

Node Scrapers

  • sonaatti-scraper - sonaatti-scraper scrapes certain food related data from the site of a local restaurant. More of a proof of concept really. Comes with a REST server.
  • jkl-event-scraper - jkl-event-scraper scrapes event information from a local site and makes the data machine readable. This is the more serious of the two and it does some pretty heavy crunching.

Python Applications

  • website-poller - It is really nasty that your site or service happens to be down just when your client wants to use it. website-poller is one of those little utilities that makes this less likely. It simply uses the notification services provided by OS and gives you a nasty little message to let you know something is wrong.
  • bongaus.fi - bongaus.fi is a little QR code based service I developed with a friend of mine. I wrote most of the Python code. The source isn't open but I gave a presentation about the subject at a local DjangoCon around May. The slides and conference report are available fortunately.

Embedded Development

  • Elovalo - Elovalo is a combination of a LED cube (512 voxels) and a pedestal (3x) built as a volunteer work for a local lighting event, "City of Light". With a miniscule budget we managed to achieve quite stunning results. I wrote a Blender based 3D simulator and helped with the effect API design and implementation. I also contributed to the design of the pedestal and did some miscellaneous tasks here and there. The simulator allowed us to previsualize effects and develop the API before actual hardware was ready for testing.

Other Development

One thing that motivated the implementation of various tools above (esp. REST related ones) had to do with JSter. It is a service developed by me and a couple of Ukrainian friends of mine. As far as I know jster.net is the largest JavaScript frontend library out there. It is based on jswiki data and has grown quite a bit since the launch at October just within two months. We will keep on improving the service.

I'm sure I left out some development work I've done. And as I said there's still some in the pipeline. Besides working with JavaScript, Python and C I had exposure to some other technologies as well. These include C# (MVC3...) and Ruby on Rails. I am not a particularly good at either yet but at least I understand how they work on a basic level and am able to contribute to projects implemented in those.

Development Insights

As usual you tend to optimize the way you work. I think the biggest gains for me can be summarized in four points: LiveReload, Vim, Dropbox and Autojump. Besides learning new tools I managed to get quite a bit better at using Vim. I am still very far from a guru level but hey there's time to learn.

I also picked up various tricks and figured out a few things. The posts below should give you a better idea:
I know I skipped a few posts there. If you are into traveling, you might want to check out my travel reports on Madeira and Lake Garda for instance. There are still various topics I would like to write about. If there is anything particular you have in mind, let me know and I will look into it.

If you made it this far and like my content, consider subscribing into my Twitter feed. I aggregate the information every once in a while but if you want it fresh you know where to go now.

Have a great 2013! See you next year.