Looking for Software Architect / Team Lead


Front-end Lead Needed!

We have a long-term contract gig here in Frankfurt for 12+ months. Essentially we need Software Architect slash Team lead who knows how to improvise with hands-on experience in React, Redux, Functional Programming and great documentation communication skills.

You will be responsible for support and delivery of multiple client-side applications built using the same framework and more importantly - You will be able to steer the way customer experience implement in one of the oldest banks in Germany.


  • Amazing teams.
  • Potential to grow and wear different hats.
  • Extremely friendly for contractors environment.

Ping me on me@davidsergey.com in case you are interested :)


The further I go down my life and career the more I start to think that one of the most important parts of my job - is to tell stories. And I'm a software engineer slash architect.

Whether I'm writing presentation to explain why we should use Amazon instead of building our solution, updating my resume or writing documentation - these things should convey some sort of meaning and storytelling is the best and simplest tool known to me to get the point across.

And this is why I recommend:

Because people communicate with each other through stories. Enjoy.

Arrival and Use of Weapons

It's highly unlikely that I'm first to notice allusions to Ian M Banks novel Use of Weapons in Villeneuve's Arrival - but there are quite a lot of them, protagonist name, and "Use Weapons" are just the obvious ones.

In any case - I strongly recommend to read Use of Weapons to anyone who enjoyed watching Arrival.

Morning Rituals - December 2015

Hello Future Me! It was a long time since we've talked about productivity and time is a precious commodity this days, don't worry I'm not proud of how busy I am lately but it's a sacrifice I'm willing to pay if I see returns, speaking of returns - How did we do in future?

In any case, here is how I spend most of my mornings on a weekedays:

  • 4:40 - 6:30 - Wake up. Quality sleep is precious, so I'm not willing to sacrifice it every day and that's why I have nearly 2 hour window. And you should too!
  • Coffee and Strategy time - Spend some time reviewing today's tasks, see if anything can be accomplished immediately, delegated or has to be added to list of to-dos.
  • Gym - 4 out of 5 times a week I go to gym, alternating between HIIT/Cardio or weights.
  • At least one morning I skip gym and experiment with code for couple of hours.
  • Before work I spend another 20 minutes setting work-specific items in order.

That's it. As you see I'm experimenting with loose morning rituals this time. Ironically I found it harder to regiment my day in Frankfurt and I have to say I miss London because of it.

Another part is that I don't get to code at work any more. This days I have 22 people who report to me in one way or another and I have to interact with another ten people in adjacent teams. So I decided to skip a day of gym in favor of having a chance to program.

My energy is mostly positive this days, but I can't help to enter neurotic bursts from time to time.

P.S. On the days when I go to gym, I also try to attend finish sauna, and then use bucket of cold water :) It's fucking amazing. If we stopped doing it, consider reinstating this part of routine!

Post-RESTful. Call for simpler GraphQL, Falcor, Firebase

In post-RESTful world we will use HTTP to get our files, and then establish socket connection to talk to our services, clients, servers and middleware. And that's where we've got first generation of frameworks and solutions like GraphQL, Falcor, Firebase and alike.

What we need to actually profit in post-RESTful world is something simple and standardized. GraphQL - just a pinch not dumb enough. Firebase is tied to their database solution.

After all HTTP was invented for good old days when keeping a socket connection open was expensive and taxing on hardware. RESTful and later Hypermedia tried to leverage existing infrastructure, but we don't need it any longer. We can keep sockets open, we just need someone smart with some spare time to get us dumb pipes.

About Context

Back in the 2000s I used to be an avid user of first Trillian (Windows) and then Adium (2006 onward) to be my single IM app. IM, Microsoft Messagener, ICQ*, Google Talk - They were all in my Adium and I didn't care.

Then 2010s came, and sometime after we've lost technology of message aggregators, and entered era of walled gardens. Whatapp can't talk to Allo, Allo can't talk to Hangouts*, Telegram, Snap, Line, Wire etc.

I complained** first year, but soon I realized that it's a feature! I can use multiple messenger systems to wall off different types of activities, at this very moment I have:

  • Whatapp - Boring. Home errands, work chat.
  • Telegram - Friends and Gifs.
  • Allo - I'm sort of trying this out, integration with Assistant could make it viable solution for home errands and other stuff actually.
  • Signal - Using this one for emergencies. It's installed on all of my devices but only limited amount of people can text me on it. 3 to be exact.

So I created all those walled gardens and decided that while it's a hack it's a workable solution that actually brings calm into my life. But how do we move this from the "hack" to a proper solution?

What I really want from messenger apps is two things:

  • Have an ability to intercommunicate.
  • Have an ability to install multiple versions of same app in different contexts/profiles.

What is a context?


Context is a combination of Time, Activity, and Location.

  • Monday - Thursday from 10:00 to 19:00 - It's work time, I want work related messages to be shown up in my notifications center I want to know that I have messages that I might have to triage.
  • Everyday from 5:00 - 9:00 when I'm at Gym - I want only emergency images to pop up.
  • Everyday from 5:00 - 9:00 when I'm not at Gym - I want all non work messages to popup.

We could also add device to this algorithm - When it's morning, I'm not at gym and I'm on tablet - That means I'm working want to focus on task. If I'm on my phone - then please disturb.


[] Microsoft rebranded their messenger every weekend so I don't remember it's original name ny more. [] Anyone remembers this one? Outside of Russia :)? [] Google SRLY? You supporting 2 messengers and they can't talk to each other? :) [**] I complain a lot about things, and then I realize that I complain and I enter meta complaining loop - when I start to complain about me complaining about stuff.

Paper, Plastic and Blockchain

Blcokchain is connected to Finance as much as paper or plastic is. Blockchain is resource that can be very efficient, but it's applications are far far wider than FinTech.

Thinking in Components - My talk at Frankfurt - Rrrr

I decided to try myself at organising events, and created Frankfurt - Rrrr (Frankfurt React, Redux, Router, Relay), and the first presentation I decided to present was - Thinking in Components.

Event had a presentation and a workshop, if I may say so myself it went good, but I have a lot of room to improve, I need to simplify presentations in future, I was a little bit too excited with React Native lately, and I used it a lot in my talks. Future talks will have to be more focused, streamlined and less complex.

At same time I need to make people code on workshops, and give them clear tasks, instead of coding on a big screen by myself. As I said, I do have a lot of room to improve!

Huge thanks to SYZYGY for hosting event and providing magnificent German Beer!


This article assumes that reader is familiar with the way Promises (or Futures as they are called in other languages) work.

It was long time since I wrote an article about code, but after playing with ES7 I decided to document some of the parts, namely Async/Await. In few words: It's a syntax sugar to turn Promise chains into more or less procedural code that might look as if it's synchronised. In future when browsers and node support it natively it might even be optimised.

Let's look at this code assume that function integer returns an integer, double doubles it and increment increments it, and of course all of them are asynchronous:

const doubleAndIncrement = () => integer()

This is how it's done now with promises, with async/await same function will look like this:

const doubleAndIncrement = (async function () {
  const someInt = await integer();
  const doubled = await double(someInt);
  const incremented = await increment(doubled);
  return incremented;

Mainly Async/Await enabled us to flatten the code, and avoid creation of anonymous functions all over the place:

// With promises
const userLogin = (payload) => {
   remoteCall(loginEndpointUrl, payload)
    .then((userData) => {
        storeCookies(userData.id, userData.token);
        return userData;
    .then((userData) => {
        return userData;

// With Async/Await
const userLogin = (payload) => {
    const userData = await remoteCall(loginEndpointUrl, payload);
    storeCookies(userData.id, userData.token);
    return userData;

Here is a code for simple example of same code with promises and async/await:

// promises.js
const DELAY = 20;

// I studied advanced mathematics in university,
// so trust me I know what I'm doing.
const one = () => 1;
// It was a long time since I used `a` and `b` as variable names.
const multiply = (a, b) => a * b;
const add = (a, b) => a + b;

// If you are unfamiliar with Promise api refer to
// http://bit.ly/mdn_promise
const promisify = (value) => new Promise((resolve, reject) => {
      setTimeout(() => resolve(value), DELAY);

// And let's define our services. That return random integer.
const integer = () => promisify(one());
// Double the integer.
const double = (value) => promisify(multiply(value, 2));
// And increments an integer.
const increment = (value) => promisify(add(value, 1));
// And outputs value, and passes result onward.
const output = (prefix) => (result) => {
  console.info(prefix, result);
  return result;

const doubleAndIncrement = () => integer()

// And more complex example:
const combineTwoAndDouble = () => integer()
  .then((firstInteger) => integer()
  .then((secondInteger) => firstInteger + secondInteger)

const run = () => {
        .then(output('Result of doubleAndIncrement:'));

    .then(output('Result of combineTwoAndDouble:'));


And with Async/Await

const DELAY = 20;

// I studied advanced mathematics in university,
// so trust me I know what I'm doing.
const one = () => 1;
// It was a long time since I used `a` and `b` as variable names.
const multiply = (a, b) => a * b;
const add = (a, b) => a + b;

// If you are unfamiliar with Promise api refer to
// http://bit.ly/mdn_promise
const promisify = (value) => new Promise((resolve, reject) => {
  setTimeout(() => resolve(value), DELAY);

// And let's define our services. That return random integer.
const integer = () => promisify(one());
// Double the integer.
const double = (value) => promisify(multiply(value, 2));
// And increments an integer.
const increment = (value) => promisify(add(value, 1));
// And outputs value, and passes result onward.
const output = (prefix) => (result) => {
  return result;

const doubleAndIncrement = (async function () {
  const someInt = await integer();
  const doubled = await double(someInt);
  const incremented = await increment(doubled);
  return incremented;

const combineTwoAndDouble = (async function () {
  const firstInteger = await integer();
  const secondInteger = await integer();
  const sum = firstInteger + secondInteger;
  const doubled = await double(sum);
  return doubled;

const run = (async function () {
  const doubleAndIncrementResult = await doubleAndIncrement();
  console.info('Result of doubleAndIncrement:', doubleAndIncrementResult);

  const combineTwoAndDoubleResult = await combineTwoAndDouble();
  console.info('Result of combineTwoAndDouble:', combineTwoAndDoubleResult);


Working examples for Node 5.x can be found in this repo

I also recommend checking out following articles:

Travellers privacy of cloud services

Travellers privacy of cloud services

Today I‘m wearing my tinfoil paranoid hat!

I think a lot about privacy, and I think a lot about privacy while traveling, in particular what happens to our data when we are traveling and using cloud services such as Dropbox, Google Drive, iCloud or Facebook. I'm also going to make two assumptions, that are questionable:

  • Everything can be decrypted, and as time goes on cost of decryption is cheaper.
  • Product should think about security and privacy, and not rely on people using add-on features i.e. customers don't have to install Virtual Private Network on their own, if VPN is needed, it should be bundled with app.

Now let's imagine Alice, she is business development consultant, she uses Dropbox to sync her files between her work computer, laptop and tablet and she is about to go to Berlin and later to Hong Kong from London.

When Alice opens her laptop in Berlin, her Dropbox will start syncing and German government will have an eye into some bits and pieces of her information, later in Hong Kong same will happen again. Generally Alice will be sharing bits and pieces of her information with various governments every time her laptop is connected to internet and active because all popular and affordable cloud file storage systems to my knowlege will do it.

Let‘s take Robert, who is in a process of traveling around North America and Europe to fund raise. He‘s using Wunderlist cloud based to-do app, and LastPass - password messanger, iCloud and Evernote.

As he travels from United States to Canada, from Canada to United Kingdom and then to France and Russia he constantly updates his Wunderlist, sometimes updates passwords in LastPass and journals in Evernote and updates contacts on his iPhone. All his data whie encrypted will fall out in all the countries he has visited.

Here is what happens to data as we use our apps and websites:


  • Data leaves your app, and goes to Device‘s OS.
  • From OS it goes to local network, such as home, office, cafe or hotel WiFi.
  • It goes to Internet Provider, and we can assume that various government agencies have ways of obtaining this information.
  • It goes from government to government as data travels from country you are now, to the country data center located.

I mean it's not that bad, thanks to global efforts among information secuirty community over past dozen years all respected services are encrypted. But encryption is not panacea, and as time goes on decryption (i.e. breaking encryption) will be easier and easier.


Unfortunately I don't have a good solution. There are few ideas I would like to throw around though, I'm going to use LastPass as an example, because leakage of passwords can be catastrophic.

  • If LastPass detects that it's on insecure network such as free cafe wifi or hotel it should pause syncing, and notify customer.
  • If LastPass detects that it's in other country, it should attempt to use local wifi syncing. Ideally it would create wifi from Mobile phone or laptop and sync between them without connecting to third party.
  • Software should be able to work in offline mode for extended period of time, and reconcile differences once in safe harbour.

This topic is near and dear to me, because side project of mine is cloud based GTD app, and I think one can learn a lot about my potential customers if they learn their detailed planned actions for next few months.

Dual wearables

Few months ago I wrote an article about dual wearables. Point is, that while Apple and Google (Alphabet?) go for fashion markets with their wearable technologies, and for very good reason fitness trackers like Fitbit, Basis, Withings et al. can go for precision.

How to get precision? Well, one of the options is to have more than one device. Have one on each wrist, or one on a wrist and one on ankle. My small scale tests with Arduino based "wearables" showed that majority of erroneous data about overall activity, body temperature and heart rate can be eliminated and cleaned up if there is more than one source of data. Which is pretty obvious, but being an engineer in mind decision to order few sensors, soldering kit and Arduino came easy.

So yeah. While Apple and Google go for fashion. Fitness tracking companies can go for precision that Apple Watch and Android Wear are not ready to commit to.

Goodbye Angular. Praise Este

Goodbye Angular. Praise Este

Short Story

Time box yourself to give 4 pomodoros (2 hours, in normal people talk) to Este and Ember and see which you like better. Angular days are over, Angular 2 will be re-engineered and re-written, and it’s not even properly announced. Polymer and Web Components were a favourite of mine in 2014, but I had to face the hard truth, they are far from being ready.


Slightly Longer Story

Angular as we know it is dead. Vojta Jina and Miso Hevery will be my programming heroes, and they reinvented front end industry as we know it, they capitalised on best what Backbone stacks brought us, and reintroduced testing and proper tooling into it, but Angular 2 is beyond horizon. I can’t recommend Angular to my clients. I can’t recommend it to entrepreneurs.

Most important thing in a technology

I love to code. I love to design too, but this post is about code. I love to write libraries, I love to play with new technologies, I love to read about Cycle and Redux and think on how can I use them. I love to work on my own libraries, that I don’t publish, because let’s be honest. Lodash was pretty awesome, and Ramda is impressive in it’s functional awesomeness. But this is when I wear my hoppy-engineer hat. When I wear professional hat different set of criteria enters the room. And the new set of criteria waters down to the few metrics:

  1. When first prototype will be ready to test?

  2. When can we ship Minimum Loveable Product? (or Minimum Viable Product if you have no soul).


And this is why choice is not between millions of frameworks but between to modern stacks: Este and Ember, because I can start write application logic pretty much immediately, and I don’t even need to even bother with configuration.

Sidenote on Este

Este created by Daniel Steigerwald is actually quite interesting stack, this days it’s React+Flux but in always shift, I like to think of it as a heartbeat of newest yet stable in JavaScript world. I just browsed code for it’s version 3.2, which used CoffeeScript, Soy and Google Closure. If you want to reminiscent old days and old popular technologies I recommend traveling through commits. And thanks to Polyhex Labs for reminding me about Este, I almost went the Ember.

2015 State of Productivity

2015 State of Productivity

Hello future David from 2016! I’m you from 2015 and I decided that it’s nice to start logging productivity strategies we use over time and how they evolve (or revolutionise!). Unfortunately for everybody else this article will have a lot of GTD, business and productivity lingo that they would have to research on their own.

Before we start: Axioms and Rules of Thumb

  • Three is two, two is one and one is none. C.G.P. Grey talked about it on Episode 12 of Cortex podcast, the idea is: if you have one pen, if it breaks you have none. If you have two pens and one runs out of ink you have only one and risking having none. When possible have three. Three backup solutions, at least three rolls of toilet paper and so on.
  • If task takes less than 2 minutes - do it now.
  • If task takes longer than 90 minutes - It’s not a task it’s a small project. Split it up into tasks.
  • When possible use spreadsheet instead of sketches, json files, notes, mind maps, word documents. Spreadsheets are far superior and versatile and transformable.
  • Notifications on mobiles and computers should be disabled by default and whitelisted later.

Apps, Technieuqe, Devices and Stimulants

Pomodoro Technique and Timeboxing

I hope you still using Pomodoro Technique, it’s great, it’s great for tracking time, estimating how long similar work will take and time-boxing. I call each segment of work 25 minute work chunk and ten of them a cycle. Are you still big believer in timeboxing btw? I tend to timebox problems in 2–3 chunks and if I realise I’m no where close to finding solution I will try and “crowd source” it either with a team or StackOverflow.

Inspiration on Demand and Time-boxing

Are you any closer to realising which activity tends to boost your background thinking? You know when you trying to solve a problem whole day and fail only to have a clear idea next morning. Long walks without interruption help but they are boring and listening to music, audiobook or podcast doesn’t boost that effect. To this day sleeping, showering or cooking are the ony ways to achieve this effect.

Cleaning works too, maybe I should open a side-business, solve few problems and then clean and apartment or two and then come back and continue on! But in any case time-boxing help a lot in it.

Coffee and Tea

Still rotating between coffee and tea? Still love coffee, did you start to roast your own beans? Or maybe you switched to teas? Currently I usually drink between 2–6 espressos a day (equivalent 1–3 flat whites or 1–2 filter coffees) and then switch to green tea and mate from time to time. Though coffee is still my favourite beverage.

Mobile and Wearables

So last year David from 2014 switched to iPhone 6 for a while, but then I (or he?) went back to Android, mainly because we have this wierd believe that Google Now is somehow helpful, Moto 360 is round and Android has widgets. Now widgets are actually useful, let me show you my home screen:

  • It has Wunderlist widget with tasks for today visible without opening app or checking notifications.
  • It has IFTTT widgets to log time against my current projects.
  • It has widget Drive scan shortcut, it takes a photo and sends it to “Inbox” folder in my Google Drive.
  • Google Keep widget to memo in free text, list, voice or photo format.

How about yours? Btw is there round Apple Watch? Widgets on iOS? 6.5 inch iPhone? My 6 inch Nexus is not enough for me!


iPad and Laptop

Did you buy yourself iPad Pro? Is it cool? It looks rad. I really like my iPad Air2, it’s my dedicated productivity device. I bring it with me, to write, journal, email and it’s used to be my main OmniFocus client, but I use my laptop to organise tasks more lately, maybe because I have 2.5 jobs at the moment and spend a lot of time in front of laptop.

Google Inbox

Is it stll amazing? Is better? Can it respond to your email for you? I’m using it a lot, it filters all my spam, and puts all non-urgent email in corresponding folders only notifying me when something important arrives. Well not always, but in 8 our of 10 occurrences, which is pretty good.


Remainder of the tools are superfluous, and don’t really matter, so let’s continue on to processing.


In Getting Things Done term “Inbox” means place where one puts all their incoming tasks, reference and information or items of any kind, it has to be then processed into project.

Did you find a single app to accumulate all the actionable and non-actionable information? I’m in transition at the moment, I used to use Evernote for my reference but currently I’m migrating to Google Drive, mainly because A) I like it search better, B) I will be using it anyways, so eliminating extra app is helpful.

I’m still using Evernote though, but mainly as my Inbox, it still has best plugins to grab entire pages and unlike Instapaper or Pocket it allows to edit them before processing them further. [IFTT Do Note] is very helpful for loggin time on diffrent projects, four widgets add a line with a date-time and a note about to specific spreadsheets. I’m actually worse at the moment than usually at weekly processing, I have quite a lot of things stuck in my inbox but they can wait, or maybe you are cursing over there in 2016, and screaming at me because they were urgent? Hehe.

Getting Things Done

I’ve added a lot of small customisations into classical Getting Things Done strategy outlined by David Allen, mostly I added some new terms to distinguish between different types of actionable items.


Did you find a better name? I used to call them repeating tasks, routines and now rituals but none of the term meet. This is semi-actionable items, in fact they are “Make sure that” tasks. Let’s take brewing coffee as a project, every morning I like to have freshly brewed coffee in V60, in order for that to happen I need to have coffee beans, grind coffee beans and have filters, the tasks will look like this:

  • Bought coffee.
  • Grinded coffee beans.
  • Bought V60 filters.

I don’t have to buy coffee every day, but I need to make sure that I have fresh coffee every four-seven days, so first task can sound like: “Made sure that still has coffee and it’s fresh”, second task is trivial if I’m at home, I can use my electric grinder in the morning but when I’m traveling I either have already ground coffee, or hand grind them previous evening, depending on situation. I will tick all of those items as I go down the list every evening to make sure that I’m ready for next day, my bags packed, clothes selected, everything ready for breakfast.


In GTD everything is a project, every task is a project with only one task in it, and that’s was an eye opening concept for me, I used to think that Projects are finite, and until I’m sure about something it’s just a jumble of tasks. This days everything somehow related gets into projects. That said, it’s still useful for me to outline Products. Product is a tangible result of series of tasks and projects.


Things that I do occasionally or constantly such as writing (journaling or blogging), reading (books, tutorials) go into activities. Writing activity will have projects for each article I’m working on for example this very article!


David Allen talked a lot about contexts but I find them less and less useful in our age of mobile technology. There used to be a time when I could all the work only in front of my computer, but lately I can do more and more things on my phone. I still need laptop to program and to draw, but I don’t need computer to type a draft any more. So instead of #work context I have multiple device oriented contexts:

  • Computer: Keyboard - Any task that I can do on device with hardware keyboard. Laptop or Tablet.
  • Computer: Mobile - Any task that I can do on mobile while on the move. Including writing emails while on the train on my mobile for example.
  • Computer: Screen - Any tasks that I can do on a device with screen only, usually it implies reading or researching.
  • Computer: Crafting - Short for Crafting Table. This is only laptop. Essentially it means I need my development or design environment. Run Sketch, Photoshop, Atom, Terminal, XCode and so on.

What about you? Can you guys write code on your mobile phones in a future? Did anyone tried designing landing page on their watch? Maybe there are no need for contexts, and we can do anything anywhere!


Well future me! I can’t wait to discover tools you find and strategies and techniques you’ll apply! Don’t forget to tell David–2017 all about them!

Programming Languages are Products

Photoshop is a tool to create products, and it's a product. AutoCAD is a tool and a product. Frying pan and chef's knife are tools and products. Yet when we talk about programming languages and platforms we avoid acknowledging that they are products, and subject to product lifecycle. Thoughts about  experience and product development of a programming languages were bouncing in my mind for couple of months now but I wanted to wait for Apple and Google to do their talk and see if any of them will announce their languages (Swift, Go, Dart) as products. Apple was close, but not there.

Before we get to article proper I need to clarify few things:

  • Language and platform in this article can be used interchangeably. Language without compiler, standard library, documentation and runtime is just a specification, and while Lambda Calculus is cool, I care about things that run on my devices for the scope of this article.
  • Aspects of a languages that everyone already highlights, such as syntax, code editors etc will be glossed over.
  • Data and information in this article is subjective and anecdotal. Collected by me from my experiences and my memories of conversations with self selected group of people I call my friends. So if you know of actual research, or objective data feel free to ping me at davidsergey.com. I'll owe you cup of coffee, tea, beer or small bag of organic salt!


Onboarding one of the first stages of product interaction with person. Onboarding is ability of a product to turn person into customer.

Back in 2001 I was in Moscow University of Management studying Management in Banking and Marketing, being Russian university we had only couple of hours of actual marketing a week, but we had 4 hours of advanced mathematics and linear algebra, I suspect in Soviet times someone would just try to smuggle nuclear physics into curriculum too but we've covered that in school. But I digress. Since most of us were sold on "Marketing" part of our curriculum we paid a lot of attention to those couple of hours a week and being a huge show off I wanted to make best presentations ever, so I ditched Microsoft Powerpoint in favour of Macromedia Flash 5. It was stupid decision, but life changing nevertheless.

I couldn't code. I didn't know what "function" was, In fact I didn't know about Arrays until summer of 2003, but none of that stopped me from using Flash and ActionScript to make my bulleted lists jump around with simulated physics in my overly engineered presentations. I've spent weeks designing presentations that my peers were doing in hours. Without any knowledge of design principles or interaction I was able to create offensive to usability menus and lists. You see flash allowed people like me to keep doing things. If we didn't know how to do something with code, we could simply animate it by hand on the stage. 

This is how Flash turned me into their "customer", though I couldn't afford to actually pay for it until 2005, but I did earned money to buy Adobe Flex using somehow acquired version of Flash. And while we at this let me reiterate the fact that you should never use HTML or Flash to design presentations, you will spend days or if you happen to work for medical company weeks to make something that should be done in few hours with PowerPoint, Google Slides or Keynote.

Flash was unique, it literally had a stage and timeline, and I'm not advocating for presence of drawing tools in Erlang, what I'm talking about is experience for a beginner to be able to keep doing stuff, without feeling of being stuck. It's like airport design. It takes about the same time in Singapore airport to get luggage, as in any other airport, but airport designed in a way to make people think that stuff happens, and they don't have time to get bored.

Ruby on Rails and jQuery also have great onboarding. I know a lot of e-commerce and visual designers who started to use RoR or jQ and achieved acceptable results by means of evolution – trying various gems and plugins until they got the effect close to specification provided by client. In fact there are quite a few e-shops selling all organic natural salt, hand made jewelry and temporary tattoos written by people who frankensteined web sites from soup of gems and plugins until it worked. I'm talking about presentation layer, database, payment and fulfilment. I'm not going to even attempt to share any links because I suspect that those sites are hackable in one afternoon.

But quality of results is not the point, eventually people learn how to create high quality ones or learn to delegate. In the beginning it's very important for platform to get results done. Great artists Ship said Steve Jobs, maybe any one who wants to be an artist should be able to ship. No one should be required to understand how to configure build system, interact with versioning system and setup deployment to create farting app for their phone or publish a business card website.

Interaction Design

Platforms are very interesting from the point of view of interaction design and information architecture. They are cohesion of multiple things: language specification, language reference and documentation, literature about language and frameworks and of course actual libraries, compilers and code editors. It's almost design of ecosystem instead of single entity, but let's focus on few ones that are my pet peeves.


There are two kinds of people. Those who like to read, and those who don't, and then there are a lot of different kinds of people I didn't mention. But I believe that any language reference or api docs for library should try to be like Xcode, .NET or ActionScript. Every single entity (class, property, method, whatever) should have it's own page. And every single page should contain description and compilable source code, that people can literally copy and paste into empty project, compile and fiddle with it.

Yes it's very expensive, I wrote few frameworks and never did it. It takes a lot of time and will power to accomplish this, but I promised myself that if I'm ever going to create yet another JavaScript MV* framework then I must write thorough documentation before releasing it to the public. Feel free to blame me and spike my coffee with milk and watch my lactose intolerant body crumple if I betray the promise.

The lack of clear examples is the reason why every single developer uses Angularjs just slightly differently. And in fact I saw five or six different ways to organise code and use numerous types of Factories on very similar Angular projects. People spend hours or days, explaining or arguing about things that could be covered by documentation. We are programmers, we can argue for hours about whether we should call model of users UsersState, UsersModel, or Users, let's be honest it helps if someone just creates convention. And I love Angular, and Angular is actually one of the least offensive frameworks in this regard. Worst among the popular ones is Backbone, I never saw two remotely similar Backbone projects in my life. Phrase "Backbone Experience" in job specification has zero value.


Apple's Playground in Xcode is awesome. Yes it won't work on big chunks of code, yes it had security issues and wiped somebodies system, yes yes yes. But nevertheless it's awesome. Person can write a line of code, and play around with it until they understand it. Whether it's language feature, or animation equation. It's especially important because Swift is a paradigm change from Objective C, it's hybrid Functional and Object Oriented language and Objective C gurus will need some time and help to shift their minds and rewire their brains. Not to mention it will help bringing entrepreneurs, designers and other non-programmers into the fold – because they will spend less time being stuck while developing their prototype.

Before modern browsers had developer consoles, Firebug allowed people to play around with their code. It was officially a debugger, but it allowed execution of random JavaScript, and it helped me by allowing me to play with CSS right in place. In ATP podcast Marco Arment (creator of Instapaper, Overcast etc) said that he chose Go programming language because it had "Try Go" feature on their website, it allows people to write som Go code, that will be compiled for them on back-end without need of installing anything on their system. It allowed people to play around with language without committing to it.

One of the most popular languages that compile to JavaScript - CoffeeScript has similar feature. I'm not trying to say that this is must have feature. And I probably will have to create a program that would extract all programming languages from some Wikipedia article, then search their websites, and find if their websites or tools have a playground like feature, and then compare it's metrics with languages that don't have this feature and find if this actually does anything. But not today.

Can I sell it?

If you still reading this article that means you either agree with my notion that languages and platforms are products or I have some dirt on you and blackmailed into reading this far. But apart from being a product it's also a tool to create other products. So it's important for a platform to be sellable, it's important for a platform to be understandable and appealing to design and marketing agencies, hipster and tech startups, corporations and non-for profit organisations.

I have a relatively free reign in choice of platforms I use, as long as I can justify technology to myself, my team and my client. Dart was a bad example of that it's next to impossible to sell, and I'm (used to be) very enthusiastic about it.  Tech people love it because it supported by Google and has testing in mind. Business people love it because it has testing in mind, and while they might not know about importance of unit, ui and integration tests, the fact that it comes with it saves dozens of person-hours. Swift is easy to sell, because it’s soft-monopoly, if development of an iOS app is about to begin in few months, Swift is obvious choice, because Apple said so. 


So in conclusion I would like to present you first draft of 8 things that every language, platform, runtime, library or API needs to have to be.

  1. Product should be properly versioned.
  2. Source code of a product should be 90% covered with integration and unit tests.
  3. API of a product should be fully covered by documentation.
  4. More than 80% of entities in API should provide usable examples.
  5. Unstable and subject to change features should be marked appropriately, to avoid arguments in team whether something is intended for public use or not.
  6. Product should have playground, to allow people to quickly experiment.
  7. Product description should be appealing to direct customers (software engineers) and their clients.
  8. Product needs a killer app. Language needs a comprehensive framework, framework needs a good example of it's product and so on.

So maybe we can use 8 pointed star as our symbol, unless someone comes in and ruins symetry.

Image of the 8 pointed star is taken from Flickr, photo by Francisco Caboblanco 




Thoughts on Dart

If I had to describe Dart in one word I would use – mediocre. I've listed some points that I liked and disliked over year and a half of using it below.


Every Class is also an Interface

One of my favourite parts of Dart is that every class is an interface, it's a very powerful mechanic which saves a lot of effort.


Dart was developed by people from Google, and like Angular, Karma, Go and other projects made by Google it has a well implemented testing framework and tools.


Generics and Typing

By standards of the 2015 Dart's syntax can be thought as conservative, it has some advances in comparison to JavaScript and Java, but Scala or Ruby circa 2010 will blow it to pieces. My main concern is typing thought:

LinkedList<LinkedList<Future<File>>> gridTiles;
LinkedList<LinkedList<int>> gridWeights;

If Dart would declare types after field name like in Scala, ActionScript or Go situation would improve:

val gridTiles:List[List[Future[File]]];
val gridWeights:List[List[Int]];

While it has an extra word ```val``` all field names are at same column, and it's easy to find field names simply by moving eyes vertically. When using Dart, eyes have to move both horizontally and vertically to find fields with specific name. It's a minor complaint, I hear people live with this shit in Java world, but in year and a half of using it started to annoy the hell out of me lately.

Second problem is that we don't have algebraic types, I won't go into computer science, but it would help with cumbersome generics. Actually after using Scala, I something wonder if designers of Go made a correct decision to abandon generics, they seem to be good tool on paper, but once implemented they<tend<to<make<your<code<hard<to<read>>>>>>>>.

Another thing that I actively dislike in Dart is library definition and import syntax. When defining libraries both main library file has to list all files that it uses, and then each file has to specify which library does it belongs too. I find it to be an example of unnecessary defensive programming, I don't remember ever having a problem that this syntax would prevent. Imports break into three categories too, local, packages and core dart, even Java manages to have single import syntax for everything.


Programming language discussions can be tricky, some people talk about compilers as if they are part of language, while other think that everything outside of language specification document is off-topic. But in case of Dart, standard library is an important part of it, and there is a big problem with it. Few months ago Jesse Warden asked if people were happy with event streams in Dart, and I mentioned that I wouldn't let junior developer touch them, they are complex sons of a bitch, and that's a big problem when it comes to something as integral to development as event model.

Futures are better, in fact their implementation is much simpler and better than JavaScript's promises, I still think that whoever implemented Promises in JavaScript be punched in the face.

And So So


I have mixed feelings about collections. Python, Erlang, Lisp-likes and Prolog live and perform well with basic list types. But then having low-level implementations of Lists and Maps can help performance. But god dammit, what happened with perfectly good word "Immutable", why do my eyes have to look at UnmodifiableListView and UnmodifiableMapView.

Package Manager - Pub

Good, not great, was developed from scratch after NPM and not as good as NPM, I expected more from it.


Documentation lacks examples in a lot of cases. It's on par with a lot of other languages but inexperienced programmers would need additional literature to make sense of how to actually use language.

Syntax Sugar

It's not impressive, as I mentioned above it looks quite conservative when compared to modern languages, but it's there and it helps. It could've been better though.


If you know and like ActionScript, Scala and alikes and miss static typing in JavaScript, then Dart is good. But nothing about it is great and it's not friendly for anyone who doesn't have "Senior" in their job title.

Review of the Seven Languages in Seven Weeks

There were quite a few eye opening books in my life, Dune by Frank Herbert, Jump 255 Trilogy by David Edelman, Generation "P" by Pelevin. But this book showed me a meaning and reason to enrich my horizons, to read more and look into different disciplines for ideas and inspirations. I'm talking about "Seven Languages in Seven Weeks", that's seven programming languages.

My guess is that book is supposed to be read over seven weekends but I was a freelancer at the time and I simply blasted through book in couple of weeks. Prolog and Clojure were my favourite parts. Thing is, I was pretty sure I knew a lot of languages, I was front-end freelancer and was working with ActionScript and JavaScript, sometimes venturing into Java, PHP, Ruby and Python, they were all different languages right? 

Before SLiSW I never thought about different paradigms, and how they can make hard problems easy simply by framing them differently. My entrire career and to some degree life can be looked as life before I read SLiSW and after. I started to read more books about languages I didn't need, just to try them, I started to read prose in genres I didn't enjoy before, to get ideas. I started to make plans to travel to South East Asia that were postponed indefenetely (until now). So you get the point, this book gave me an interesting outlook on my life, and I think improved me emensly, so thank you Bruce Tate! I think what happens here is akin to theory of Linguistic Relativity[1] which states that languages could influence the way we think:

"The principle of linguistic relativity language affects the ways in which its respective speakers conceptualize their world, i.e. their world view, or otherwise influences their cognitive processes"

This actually was a push to start learning Italian and Mandarin, thought I was never interested in perfecting them, though I had a master plan to learn Italian accent to speak in English with Italian accent! But what I actually wanted is to learn grammar, structures, they ways word relate to each other. Most courses however either try to slowly grind foundation of a language for serious learning or focus on spoken go to phrases, but it was an interesting experience. This all was a part of the idea that was brewing in my mind ever since I read SLiSW. This book was good to me, but I can only share it to limited subset of friends, friends who happen to have academic or industry experience closely related to programming. I can't recommend this to my mom, girlfriend or most of my friends. 

So, I was wondering can we create a course that will go through 3 or 4 languages over the course of couple of month, with a goal of inspiring people and helping them think clearly, approach problems from different angles? Starting with some roman language, such as Spanish or Portugese, moving to slavic, probably Russian, which is still very similar yet have quirkiness to it, especially with absence of word ordering. Then Chinese and moving to Thai or Indonesian? If you are a linguist write me a mail: me@davidsergey.com

In any case I strongly recommend reading this book. It made turn gears in my mind turn for years, for five years to be exact, and I feel guilty for the fact that I didn't recommend it to everybody I know.


  1. http://en.m.wikipedia.org/wiki/Linguistic_relativity