Primary keys don’t always have to be auto generated. Use ISO codes when possible

I spent quite a lot of time writing audits in April and May of 2018 mostly for security, but sometimes for data models, and I saw one behavior repeat over and over again:

Id(PK)   | IsoCode    | DisplayName      
0        | AUD        | OZ Dollar
1        | USD        | Freedom Dollar
2        | GBP        | Simply Pound

The table above has both auto-generated id, and IsoCode field, that references to the ISO code that team of Swiss standard writers already created. In every single case, I advised dumping the Id column and using IsoCode as a primary key - nice people in Swiss already work day and night to make sure that all those codes for countries, currencies, screw sizes, connectors, patterns, cup sizes have its unique id.

IsoCode(PK)    | DisplayName
AUD            | OZ Dollar
USD            | Freedom Dollar
GBP            | Simply Pound

See, beautiful, and now when you need to link to the currency - you don't need to look up for a meaningless id - instead you use meaningful ISO code. When you need to store entities with ISO code, or similar in concept unique identifiers in your industry (IEC, IEEE) for example types of connectors - please don’t use auto-generated ids, just use the unique code as the primary key.

Apple declares war on Facebook, Microsoft buys another Social Network

A couple of interesting developments happened this week. Apple announced on WWDC that they are going to block third-party trackers, such as Facebook like buttons, and will only re-enable them after user clicks.

This reminds me of the "good old times" when Steve Jobs announced that they are going to kill Flash. If memory serves me right - soon after that we had to manually click on any instance of Flash Player on the page to actually activate it. - I wonder if Apple of today has enough social power to kill Like buttons like they killed Flash.

On the other hand - Microsoft announced it plans to acquire GitHub. Officially GitHub is a development platform, but I always thought of it as a social network, or a Guild if you like - the social network for people in the specific industry. I find it interesting that Microsoft now has LinkedIn and GitHub.

While Facebook and Twitter might be much more popular social networks - LinkedIn and GitHub seem to have more actions. LinkedIn has recommendations, endorsement and work history, while GitHub actually has "time commitment". Both LinkedIn and GitHub give me a vibe of quality over quantity when compared to Facebook or Twitter. Is social new "secret" strategy?

Collection of talks - How Monzo built a bank with AWS, Kubernetes, and Linkerd

I've spent my Saturday evening watching few talks on how Monzo is built with Kubernetes and AWS, here is a playlist:

I do recommend watching at least a couple, there is quite a lot of duplication between the talks, but it only helps it sink in. Also glad to see Linkerd and Finagle, it was a long time since I had a chance to work with it.

Yak Shaving

I decided to do a quicky! Just add a simple example of a game provisionally called - Spaceship. The idea was for a text adventure style game played in node console.

Then I realised, that eventMap and initialState have a lot of duplication, so I decided to add a functionality to the matejs:

toEventMapAndInitialState = (instructions: StoreInstructions) => {eventMap: EventMap, initialState: State}

Alright, so I started working on the functionality, but I have to go to work soon, so I decided to add a note in MD. And then I realized that default word wrap logic in Visual Studio Code annoyed the hell out of me. And I spent next five minutes configuring it.

Good news - I have a basic spec/test for the toEventMapAndInitialState so I should remember what I wanted to do tonight/tomorrow.

Morale of the story: Write tests first kids. Even unfinished specs contain more information than finished code.

P.S. I need to explore grammarly plugins for VS Code.

UX Review of Next Generation of UK Banks

UX Review of Next Generation of UK Banks

I chose my bank in the UK, how most of us chose their country of birth or favourite football team - by location. When I moved to the UK back in 2011 - Barclays was the closest branch that would accept me, and I was their loyal customer ever since. Because of convenience, I used them for my personal accounts, business accounts, credit cards, and ISAs (Investment).

So, in 2017, I decided to shop around and see what new financial institutions can offer us. I'm going to compare Tide, Starling, Metro Bank to my good old Barclays. But before I start I need to outline basic rules of this review - I'm going into numbers, I'm not going to cover interest rates and service charges. This article is about Customer Experience, with capital C and Capital E. Just like @StartupLJackson said:

This article is about how much fun do these companies bring me while saving my money. Yes, you heard it here first, in 21 century, I don't just want my bank to optimize my liquidity, I want it to make me happy and excited!

Metro Bank - Old-school, new bank

Main Points

  • Open on Saturdays and Sundays - Amazing for freelancers and consultants.
  • Walk-in services. They can open your personal account in under an hour, and business account in a couple of hours.
  • The mobile app is functional but somewhat mediocre. Android version is sometimes clunky and slow (Google Nexus 6P, 2007).
  • One of the ugliest logotypes I ever saw.

Metro Bank is the old school new bank. My first experience with Metro Bank was in 2016 when friend and colleague of mine pulled out one of the ugliest debit cards I ever saw in my life - Metro Bank. That peaked my interest, and I googled them later same day. Opened in 2011 it represents evolution, not the revolution. It has branches, and managers in suits, and surprisingly enough I haven't seen their CTO giving a speech yet. So if you want a bank, that operates like a bank, with physical offices - they are great.

Another great feature is that they offer walk-in service. No need for appointments, you just walk in, with your documents and open yourself personal or business accounts. They don't offer you coffee though when I asked the nice gentleman if they could bring me a coffee he gave me a look, but they allowed me to pop out to get my own coffee. Another thing to note is their atrocious logotype, that was designed by 7-year-old, who just read the blog post about reading the book about typography. Also their business and personal debit cards look exactly the same.

Aesthetics aside, Metro Bank works 7 days a week, and they are old school bank. They will give you a credit card, they will open an ISA account for you, and probably rest of the stuff. One of my big gripes about Metro Bank - is that they don't allow you to give custom names to bank accounts.

Starling Bank - Personal Only

Main Points

  • Fully online bank. No branches and everything can be done with an app.
  • No savings accounts, no credit cards, no ISA.
  • Business accounts are in early access. (Beta?)
  • Really nice app.
  • You can set your pin before you receive your card!


So far Starling is actually my favourite in this bunch. The moment they polish their business accounts I can start using them more seriously, the only problem at the moment - no savings accounts, and because I'm somewhat paranoid - I don't like keeping all my money on current accounts with cards.

Paranoia aside, they have really great service, they help you via the app, or via twitter. On the downside - they don't have credit cards or investment options, but they do have "Goals" section in their app, which makes me think that they will introduce some kind of savings or investment options in future.

Tide - Business Only

Main Points

  • No personal accounts, only business current accounts.
  • Fully online bank. No branches and everything can be done with an app.
  • Should be good for freelancers and consultants, no need for appointments, you dear reader can upload your documents, and wait for approval.
  • Additional features to help you manage business account, like invoice generation,
  • Invoice generation from within App.
  • Really nice ways to categorize transactions, and write rules.
  • For some reason, they allow you to take screenshots. Other applications prohibit it.
  • Will need something like Transferwise for outgoing international transfers. No support for international banking at the moment. According to support - coming in few months.



If they had had credit cards and international support - I would have ditched Barclays for Tide tomorrow, their support actually recommends using Transferwise for international payments, which is actually alright, and cheap, and to be frank I'm using Transferwise to do my international payments anyways.

With their app, you can create and delete bank accounts, rename them, which is my favourite feature. I prefer to bank account per major income source (i.e. client) and separate one for online transactions and HMRC (taxes).

You can sort incoming and outgoing transactions by categories (see screenshot), and even send invoices to your clients.

All in all, I'm very happy with Tide, and I'm going to go forward with them, and I already decided to close my business Metro Bank account did I tell you that their debit cards are ugly?

Nationwide - Control Check

Nationwide is obviously is not a new kid on a block, but I decided that I should have a control check, and try and open a bank account with existing old-school organization. And they are old-school. You will need an appointment, that said there is a chance to get served over teleconference if you are walk-in and they will offer you coffee (I'm looking at you Metro!). 

They will also send you tons of post, that you have to collect until you collect the critical mass of magic words, passcodes, pins, and numbers that will let you finally use your accounts. 

So yeah. Control test, Nationwide is a good old bank-ish-banky-bank.


This abundance of new banks and their APIs reminded me of API mashups of 2005-2009 when every new startup would publish their API for everyone to use for free. Until they realised that they don't make any money, spend a lot of money on servers and dilute the market. That said these APIs are for actual financial institutions, and PSD2 regulation will force these banks to keep at least some portion of their APIs open.

But real revolution is not in banky-banks. Banks like Tide, Monzo and Starling will be profitable, and some of the new banks will start making billions, they are amazing fintechs and startups. But I think real future in more abstract ways. Future is automated Financial Advisors and Accountants. Set of services that will handle receiving and sending money. If you think about it - a lot of things we do, like paying out subcontractors, filing documents to tax authorities, and even basic investment into low-risk portfolios should be fully automated.

There are a lot of mundane tasks that should be automated.



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 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.token);
        return userData;
    .then((userData) => {
        return userData;

// With Async/Await
const userLogin = (payload) => {
    const userData = await remoteCall(loginEndpointUrl, payload);
    storeCookies(, 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
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) => {, 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
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();'Result of doubleAndIncrement:', doubleAndIncrementResult);

  const combineTwoAndDoubleResult = await combineTwoAndDouble();'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 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.