Thursday, January 7, 2016

The best 2015

A new language

IT book
High Performance Browser Networking by Ilya Grigorik

IT teaser
RESTful considered harmful


Piece of code
defmodule Stack do
  use GenServer

  def handle_call(:pop, _from, [h|t]) do
    {:reply, h, t}

  def handle_cast({:push, item}, state) do
    {:noreply, [item|state]}

False start
Linux From Scratch

Waste of time
Algorithms, Part I - Princeton University | Coursera

Well, Ruby on Rails is a technical debt web framework. And it works really good.

PHP Berkshire

Functional Geekery

Podcast episode
Рунетология (257): Партия еды

Long documentary video
Cartel Land

Short documentary video
A high speed camera can capture light in motion

The future is here
DNA-testing dog …

The Great Gatsby (2013) - Soundtracks

Royal Air Force Museum London

Quality of life
Getting your child to go to bed at 8:30 pm

Relocation to the United Kingdom

Undoubtedly, the main change in my life is that my family and I live in England now. We were pleasantly surprised to find that the British people are so wise and kind. Traveling in space has become a journey in time for us. I am immensely grateful to those who made it possible.

Sunday, January 11, 2015

The best 2014

IT book
Compilers: Principles, Techniques, and Tools by Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman
Finally I found a book that I can recommend to every software engineer. The book is just gorgeous.

IT teaser
Spreadsheet-oriented programming
Nominees: Cloud Operating Systems, Viewpoints project

Scientific paper
BOOM Analytics: Exploring Data-Centric, Declarative Programming for the Cloud

Piece of code
list([ ]).
list([X|Xs]) ← list(Xs).
Yes, it’s Prolog :)

The Haskell Cast

Conference videos
Strange Loop

My talk
PageObject for Coffee’n’Code Dnepr


Nominees: 2ГИС

SF book
The Quantum Thief by Hannu Rajaniemi
I'm still reading the book. But so far it is good enough to be in the list

Another look
Nineteen Eighty-Four

Nominees: Dnipropetrovsk

Our great Italian wedding

Thursday, January 16, 2014

Tracking my reading

  1. How Linux Works by Brian Ward (2nd Edition)
  2. The Rust Programming Language
  3. The little book about OS development by Erik Helin and Adam Renberg
  4. High Performance Browser Networking by Ilya Grigorik
  5. Compilers: Principles, Techniques, and Tools (2nd Edition) by Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman
  6. Elasticsearch: The Definitive Guide (early release) by Clinton Gormley and Zachary Tong
  7. Practical Object-Oriented Design in Ruby by Sandi Metz
  8. Programming in Go: Creating Applications for the 21st Century by Mark Summerfield
  9. Learn You a Haskell for Great Good! by Miran Lipovača
  10. Hadoop: The Definitive Guide by Tom White
  11. [POSTPONED] Functional Programming in Scala by Paul Chiusano and Rúnar Bjarnason
  12. Совершенный код Стив Макконнелл [en]
  13. Exceptional Ruby by Avdi Grimm
  14. Programming in Scala: A Comprehensive Step-by-Step Guide by Martin Odersky
  15. Пользовательские истории. Гибкая разработка программного обеспечения Майк Кон [en]
  16. REST in Practice: Hypermedia and Systems Architecture by Jim Webber
  17. The Joy of Clojure by Michael Fogus and Chris Houser
  18. Building Hypermedia APIs with HTML5 and Node by Mike Amundsen
  19. Распределенные системы. Принципы и парадигмы Таненбаум, Эндрю [en]
  20. ERLANG Programming by Francesco Cesarini and Simon Thompson
  21. Erlang and OTP in Action by Martin Logan, Eric Merritt and Richard Carlsson
  22. What Every Programmer Should Know About Memory by Ulrich Drepper
  23. [POSTPONED] Linux Kernel Development by Robert Love
  24. Архитектура операционной системы Unix Морис Дж. Бах [en]
  25. Ruby Hacking Guide
  26. Objects on Rails by Avdi Grimm
  27. 97 этюдов для архитекторов программных систем Нил Форд, Майкл Найгард, Билл де Ора [en]
  28. Язык программирования Си Брайан Керниган, Деннис Ритчи [en]
  29. MySQL. Оптимизация производительности, 2-е издание Заводны Д., Шварц Б., Зайцев П., Ткаченко В., Ленц А. [en]
  30. Предметно-ориентированные языки программирования Мартин Фаулер [en]
  31. Программирование для Linux. Профессиональный подход Митчелл Марк, Оулдем Джеффри, Самьюэл Алекс [en]
  32. MongoDB: The Definitive Guide by Kristina Chodorow and Michael Dirolf
  33. Психбольница в руках пациентов Алан Купер [en]
  34. Event Processing in Action by Opher Etzion and Peter Niblett
  35. Мифический человеко-месяц Фредерик Брукс [en]
  36. Professional XMPP Programming with JavaScript and jQuery by Jack Moffitt
  37. Экстремальное программирование Кент Бек
  38. Nginx HTTP Server by Clément Nedelcu
  39. Rework Бизнес без предрассудков Джейсон Фрайд и Дэвид Хайнемайер Хенссон [en]
  40. Анализ алгоритмов. Вводный курс Дж. Макконелл [en]
  41. Экстремальное программирование: разработка через тестирование Кент Бек [en]
  42. Применение DDD и шаблонов проектирования: проблемно-ориентированное проектирование приложений с примерами на C# и .NET Джимми Нильссон [en]
  43. SQL Antipatterns: Avoiding the Pitfalls of Database Programming by Bill Karwin
  44. Чистый код. Создание, анализ и рефакторинг Роберт Мартин [en]
  45. Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine by Venkat Subramaniam
  46. Beginning Scala by David Pollak
  47. Growing Object-Oriented Software, Guided by Tests by Steve Freeman and Nat Pryce
  48. Введение в системы баз данных К. Дж. Дейт [en]
  49. Analysis Patterns: Reusable Object Models by Martin Fowler
  50. Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans
  51. Ruby Best Practices by Gregory Brown
  52. Эффективная работа с унаследованным кодом Майкл К. Физерс [en]
  53. Structure and Interpretation of Computer Programs by Harold Abelson

Tuesday, January 7, 2014

The best 2013

Infrastructure tool

Nominees: Guard

Management tool

GitHub pull request workflow
Nominees: Trello

UX/UI tool


A new language

The winner is not determined :/
Nominees: Clojure, Go

Another look


Distributed computing

Akka cluster

Software architecture / Programming paradigm

Functional reactive programming
Nominees: The Lambda architecture

Beautiful monster

Nominees: Scala


Russian-speaking community of LiveJournal

The future is here


Scientific paper

In Search of an Understandable Consensus Algorithm

IT book

Learn You a Haskell for Great Good! by Miran Lipovača

Popular science book

The Selfish Gene by Richard Dawkins

SF book

Anathem by Neal Stephenson
Nominees: The Windup Girl by Paolo Bacigalupi


Christmas in Budapest

Quality of life

35-hour workweek

Tuesday, July 9, 2013

What I don't like about LISP

This post is not about parenthesis. It would be too easy.

I really miss literals in Lisp. Ruby has tons of literals: numerics, strings, heredocs, symbols, regular expressions, arrays, hashes, ranges, classes, eigenclasses, modules... Special syntax for everything :) Everything has their own unique appearance. And such diversity allows to grasp landscape nearly instantly. It's expressive.

In contrast, Lisp is poor in that respect. Lisp code is a garden overgrown with trees. Identical trees. With numbers, strings and symbols hanging on them. Compared to that, ruby code is full of variety: wagons, houses, kennels, containers and plastic bags.

Don't get me wrong. I am not against s-expressions. I am against the fact, what s-expressions consist of a limited set of literals. And even if you write a custom internal DSL, you just cut and fertilize your monotone trees.

By the way, Clojure knows about the problem.

Monday, January 14, 2013

Hypermedia API is about DRY

The hype around Hypermedia API (HATEOAS) just got too much recently. Opponents and advocates cross swords. But critics overlook one main point: Hypermedia API allows you to not repeat youself.

I could describe the topic in terms of "Hypermedia as the Engine of Application State". The "State Engine" directly relates to the issue. But I prefer to use more familiar dictionary.

Consider yet another project tracker. There is a domain rule: only Project Owner is able to delete a user story AND only stories in "initial" state can be deleted. With the "traditional" REST approach the rule gets duplicated several times: on the server side and for each client app. Without such duplication a client cannot reason about visibility of the "delete story" control. Even worse, the rule is implemented in several languages, increasing the likelihood of errors.
# Server side
def deletable_by?(user)
  user.owner? @project && initial?
// Android client
private boolean isDeletableBy(User user, Story story) {
  return user.isOwner(story.getProject()) && story.isInitial();
if (isDeletableByUser(user, story)) {
} else ...

// JavaScript client
function isDeletableBy (user, story) {
  return user.isOwner(story.project) && story.isInInitialState()
<% if (isDeletableBy(user, story) { %>
  <%= renderDeleteWidgetFor(story) %>
<% } %>
With HATEOAS the rule is implemented once and only once. It doesn't spread domain logic across clients. They become fairly "silly".
# JSON generation on the server side
if story.deletable_by? current_user
  json_builder.delete_link_for story
// Android client
if (story.hasDeleteLink()) {
} else ...
// Javascript client
<% if (story.hasLink('delete') { %>
  <%= renderDeleteWidgetFor(story) %>
<% } %>
See, clients don't "figure out" or "calculate" button visibility. They render the button only if the "delete" link is present. That's all. It simplifies the iterative development process: changes in domain logic require only server code to be rewritten.
# Changed rule
def deletable_by?(user)
  user.owner? @project
JavaScript, Android, iOS clients remain untouched. They still rely on absence/presence of the "delete" link. The "traditional" REST approach requires to rewrite/recompile/redestribute ALL client applications!

Summing up: Hypermedia API keeps domain logic on the server side. It reduces cost and encourages improvements.