Software developer. Functional programming enthusiast.

Hello stranger, nice to meet you! Sit down, relax and have a cup of functional programming. My name is Ilja Tkachuk (also known as timCF). I'm software developer, live in Tallinn, Estonia.

I have been programming since 2012. At the beginning I had some experience of development in imperative languages like C++ and JavaScript, but I did well only when I switched to functional languages like Erlang, Elixir and Haskell.

Today my main skill is functional programming and I'm strong expert in BEAM/Erlang VM platform, Erlang and Elixir languages. I have strong understanding of multithreading and interaction between Erlang processes. Of course in commercial development I'm using mainstream frameworks like OTP, Phoenix and Ecto.

Future plans - to become more familiar with static-typed functional languages. If static-typed languages for BEAM/Erlang VM like Elchemy or Alpaca will be successful - I will be happy to switch. Also I have a huge interest in Haskell programming language and I'm doing my own personal project using Yesod Web Framework.

  • Things I do like

  • Functional code
  • I like functional languages. The concept of immutable data greatly improves code readability and simplifies the development of multithreaded applications.
  • Strong static types
  • For most of my career, I've worked with dynamically typed languages like Erlang and Elixir. BEAM Erlang VM, Erlang and Elixir languages, OTP and Phoenix frameworks are great tools to solve any kind of problem in telecommunications area. And I like to work with this toolset. But in my opinion this toolset is not perfect because of dynamic type system. Of course, static analysis tools like Dialyzer improve the situation, but not enough. Some time ago I began to study Haskell language and I really liked it. Safe, readable, predictable, simple source code and the most powerful type system ever. I'm not very experienced in the Haskell language, but I like Haskell and I'm very interested to use it more.
  • Apple & MacOS
  • Mac computer is superior and stylish hardware with modern enterprise UNIX software. Just works from the box. Perfect tool.
  • Responsibility
  • Personal responsibility distinguishes a professional from a beginner in any field of activity, including software development. If a developer positions himself as a professional - only he is responsible for the code written by him. A professional can work alone on high-level tasks without a layer of managers between him and business side. A professional knows how to solve the problem properly without blurring the responsibilities between team members, management and business. If a professional needs something to solve a problem - he just gets it directly from the right people. The professional does not need external motivation because he always knows what he is doing and why.
  • Individual
  • As a rule, I prefer an individual working principle to the command. It's not about sociofobia - it's about personal preferences and life principles. As experience shows when working individually, I show much higher results and get more pleasure from things I do. Of course I like to communicate and share experiences, I like teach people, but at a separate time. I really do not like being distracted while writing my code.
  • Automated tests
  • I never commit uncovered / untested code. 100% test coverage is standard for my commercial projects. Automated tests greatly simplify future refactoring and other code changes. And of course it's nice to be sure that every line of code was called at least once and worked as expected.
  • Documentation
  • I always write documentation of my projects. It is very important to formulate thoughts in the form of text starting from a technical task. I write technical documentation manually in markdown language and I deal with auto-generated (from source code) documentation as well.
  • Nordic countries
  • I like the northern nature. And I like the sea. I definitely like the northern European countries Norway, Sweden, Finland, Estonia and I dream about Iceland and Faroe Islands. Canada and the northern border of the United States also look good.
  • Things I do not like

  • Imperative code
  • I understand the great importance of imperative languages. I just do not like them. Mutable data and imperative constructions make high-level code more confusing and unobvious (especially in case of multithreading).
  • Weak dynamic types
  • I'm absolutely against the weak dynamic type system in programming languages. It is usually assumed that such languages accelerate the development process, but in reality the quality of the code falls disproportionately. Weak dynamic type system is the world of stupid runtime errors like "undefined is not a function" and unobvious implicit type conversions (like in JavaScript).
  • JavaScript & NodeJS
  • JavaScript is my most unloved language. Type system is weak and dynamic. Runtime system is single-threaded (concurrency in JS is not real multithreading). JS does not have a unified system of modules. JS does not have a unified structure of project. JS does not have a "normal" classes and OOP. JS does not have any types inference. JS does not have unified technology for working with asynchronous code. JS has absolutely mad NPM with very low-quality packages. And finally this language is very popular, and this is the only language that works in web browsers so sooner or later you have to deal with it even if you do not want to. In spite of all of the above I'm pretty experienced in JS ecosystem - I have production experience in JavaScript, CoffeeScript, LiveScript, PureScript, Sass, Jade (Pug), React, React Native and many other libraries, languages and frameworks... And my experience suggests that it is better not to use these tools if there is another working alternative.
  • Microsoft Windows
  • Most GNU utilities do not work properly in Windows. Windows does not have normal package manager like apt-get or homebrew. UNIX operating systems are just much better suited for work.
  • Scrum & bureaucracy
  • I think it's possible that for some people scrum is working pretty well. But not for me. Scrum process and useless regular meetings make boredom and greatly slow me down. It seems that the scrum is working well when everything is going according to plan and the team is working with high rank professionals, but in reality this never happens.
  • Hot countries
  • I just do not like the hot climate, it's physically hard for me.
Haskell (ML family)
Yesod Web Framework
BEAM/Erlang VM
Elixir metaprogrmming
Elixir
Erlang
Bash
GIT
SQL
noSQL
Scala
Clojure
Livescript
Twitter Bootstrap
CI
Phantomjs Engine
Brunch builder
React
React-Native
Jekyll
Rentier (not open-source)

Modern solution for rental business

Happeteer

Puppeteer client library (web-scraping oriented)

haskell-tools

Utilities for builds and deploys of Haskell programs

Ps-gol demo

Cellular automaton

Defnamed

Compile-time named arguments

GenEnum

Compile-time enumerations

Meme

Memoization of function calls

ExCraft

Type-safe constructors for Elixir structures

Aspire

100% safe types conversions

Constantine

Type-safe constants for Elixir

Boilex

Project configuration focused on code safety

ExList

Funny (and inefficient) singly linked lists

jsfunky

Crazy functional stuff for JS

Elixir-Test

I am the author of this test task

Studio demo

CRM system for rehearsal studio

Studio-Mobile

Native android/ios client for Studio

Yamlex

NIF-based YAML parser

Xmlex

Wrapper around xmerl

Methex

Library for Elixir metrics

Exroul

Macro-based roulettes

Fps

Proxy servers grabber

Erlng

Simple cryptographically strong RNG

Sysex

Simple runtime utils for BEAM VM

Sqlx

Wrapper around emysql

Cqlx

Wrapper around cqerl

Megaclicker

Clicker for web applications

Pmclj

Pipe matching for Clojure

timCF.github.io demo

This static website

Erlang-Universe demo

Slides about Erlang/OTP/Elixir

Other

Other open-source projects on my github

Location
Tallinn, Estonia
Email
tim4CF@gmail.com
Skype
tkachuk.i.m.
Telegram
+7977 815 5221
Phone
+372 5811 4271