Uncle Bob on Clojure

2019-08-23

Uncle Bob on Clojure:

The language has almost no syntax or grammar.

I’ve seen engineers being excited about languages with a plethora of syntax constructs, and engineers that don’t like them. I tend to think that the abundance of grammar comes from a need, most likely the need of speed (haha, should have said “performance” but couldn’t hold it), module organization and access rights. Some languages require a daily interaction with these intricacies. The litmus test is the following: when reviewing code of your peers, how many times do you think about these concerns vs what the author tries to achieve?

It’s sad if the language has a bloated syntax for composition. None of the widespread languages have yet beaten shell: cat users.txt | grep “John” | wc -l. Clojure is close: (->> “users.txt” slurp (filter #(clojure.string/includes? % “John”)) count). I can write a one liner for it in JavaScript too. The problem there is not that I can chain the functions and method calls easily. The problem is that there are functions and method calls, and that they return various types of things. In case of shell it’s just text in, text out. In case of Clojure it’s always a function call, returning either values or sequences. I tend to think that it’s the data structures that make systems composable. If we have only a handful of them, then there’s little chance for glue code.

Syntax variation inhibits reuse.

I want a language where I spend 90% of my time not even thinking about performance, modules or access rights. And then 10% of my time I can spend on writing bloated, optimized, low level, unreadable code. I‘m happy to pay the bloatedness tax when there’s a reason.

Quote on tinkering

2019-08-22

To keep every cog and wheel is the first precaution of intelligent tinkering.

That’s how I can describe my day to day work, in a very sophisticated way. More pragmatically: change as little code as possible while keeping the system running.

Mirror for vices

2019-08-21

This week I’ve faced my vices several times. Kids are excellent mirrors. Not even that, they are magnifiers of their parents’ imperfections.

That said, it is my goal to be open about my imperfections with my kid. I make dents in his worldview one push at a time, so that his worldview doesn’t crash and crumble when he is in his teenage years.

When a child does something wrong, the contrast makes you pay attention. A swearing adult attracts less attention compared to the same action performed by a child.

Hate and care

2019-08-20

During my teenage years, my friends didn’t hesitate to argue. If I say something weird, I would always end up in a long conversation about it. Kids just don’t give up.

Then you grow up, you get more commitments and there are more TV shows to watch, so time becomes scarce. If I say something weird in my 30s, most people would silently think something and won’t argue. It might them being too polite. It might be they thinking that arguing is pointless. It might be that they simply don’t care.

Only the person who cares or hates you will tell you about your mistakes.

Inspiration is bad

2019-08-19

I’m sitting here watching some YouTube TV where a very talented chef makes an awesome vegan dinner. So I go an order everything they’ve used to cook it, both the ingredients and the tools. A few days later everything gets delivered. I dedicate a whole evening to cooking. I begin my attempt to replicate the glorious masterpiece of this vegan cooking…

Y’all know that expectation usually feels better than the event.

So this cooking thing turns out meh. I’ll eat it just to acknowledge the attempt. I don’t really want to cook it anymore cause it didn’t pay off.

See, the higher you fly the more it hurts when you fall. So stop building unhealthy expectations. Stop getting inpired. One video is enough.

August 2019 music stuff

2019-08-18

One of my favorite bands, He is Legend, has released a new album called “White Bat.” Check out the first song. I love how they mix melody, technique, catchy singalongs and punk rock beats. There’s a bit of blues and southern rock feeling to it too, though I have no idea about any of it.

I’m going to see Alyona Alyona live next week. Very excited about this. Her music and personality are awesome. I like that her lyrics are not about money and birches. Pun intended.

Re Community with Heart

2019-08-17

Saskia Lindner about Clojure Community:

Over the last couple of years, the Clojure community has become an invaluable part of my life. It’s a space where all of me has been welcomed and accepted, since day one. The kindness, support and inspiration I have received from people in the community is boundless.

Yeap, that’s pretty much it. What she didn’t say is that she is one of those amazing people from the community that is just a pleasure to be around.

Thank you, Saskia, for the post. It reminded me how amazing our community is.

Blockers for good

2019-08-16

We had another iteration of Clojure Berlin this week, and I took part in the discussion about the state of frontend. It reminded me how horrible and difficult it was to start using ClojureScript. There are so many things one’s expected to know and learn.

But then the puzzles connected, or at least became familiar, so I don’t notice them anymore. And now productivity is objectively better.

Blockers on the way of starting to use ClojureScript act as natural filters. People don’t end up in it by accident. Teams won’t adopt it because it requires a buy-in on many tools.

So if you’re lucky enough to use ClojureScript, you can run circles around competing teams, implementing same features in a fraction of time.

Accumulate

2019-08-15

We, humans, grow up and become adults. We accumulate possessions. Because we have room, we can’t give a definite answer how much we own.

The best test is to move places. Then you either appreciate the stuff you own, or you end up in an existential crisis.

Best furniture is the one that’s light, functional, stylish, and that folds into nothing. Maybe inflatable chairs are actually chairs. I don’t know.

Throw or give something away.

Pasting links in Notion

2019-08-14

New addition to the Favorite Products page.

In Notion, you can select some text and hit cmd+V to paste a link. The text will become a link. If the copy buffer contains text, then the selection will be overwritten. Brilliant.

Clothing for running

2019-08-13

When running outside, I have two modes of clothing: long sleeve shirt and pants for temperatures below 8°C, or shorts and a T-shirt for temperatures above 8°C.

When it’s lower than zero, or rainy, then a fleece also works well.

All running clothing needs to meet one main criteria: when I run, I shouldn’t think of how annoyed I’m at this particular piece.

I did 10k today, felt awesome.

Can be done simpler

2019-08-13

What surprises me every time is that when somebody asks a question “Can it be done simpler and faster?”, the answer is almost always “yes.” And then the brain goes into solving a puzzle of managing the tradeoffs. How does one ship the best user value for the least amount of effort? That’s like the mantra for all modern product developers.

On building tools

2019-08-12

When building automation tooling in an engineering team, you know you did your job well when new tool solves a business problem and nobody has noticed it. The least amount of attention, the better.

When going into a job that will be mostly about building tools, brace yourself for being unnoticed.

If you manage a team that takes care of tooling, remind them that they succeed if their job stays unnoticed. “We’ve been extending our system for the last six months and there were no issues” is a very appropriate way to praise such work. Remember all the incidents from your past where work on tooling brought blockers and outage, and mention how great it is not to have any issues.

New revelation about bicycles

2019-08-11

I love when things make sense. Some ideas are better than the others, and it takes me years to progress in the understanding of great ideas. One of such ideas is Lisp, and the more I discover about it the more it makes sense. The other one is the bicycle.

Here’s my recent revelation: a complete repair kit to fix most of the issues with my bicycle on the go weights only about a kilogram and takes a small part of my pannier. Two spare tyres for my and my kid’s bicycles (can be replaced with patches), a multitool, a small wrench, tyre levers, several replacement chain links, a small pump, handgloves, chain lubricant, replacement brake and gear shifting cables. Some spare spokes and a spoke key would be nice too.

You can’t fix everything on the go, but most problems can be fixed easily and with very little experience.

When we’re talking about commuting to work or navigating through the city, I think it’s totally fair to compare cycling with driving a car. And then if we compare the aspect of on the go repairs, how much weight and space would the repair kit take, and how much knowledge would one need to replace a tyre?

Blaming previous generations

2019-08-10

I don’t understand why some people of my age blame previous generations for bad economical, political or environmental consequences we’re inheriting today. I do understand that these consequences are bad. What I don’t get is why people of my age think that previous generations had a clue.

Most of the things we’re concerned today are because we have access to this information, and even more importantly the abundance of it. My Twitter feed is full of information about climate change, for example. Surely I’m aware about it and thus worried.

I’ve met with some of my friends from Ukraine. They read totally different news, and their minds are occupied by totally different problems. When I mentioned climate change, they were almost surprised and couldn’t relate to it. Can I blame them for contributing to the problem without them being aware of it? Surely they have no bad intentions.

I think same applies to blaming the previous generations. Saying that it’s their fault is like having a hindsight bias but on the scale of the society.

Watching others work

2019-08-09

I’ve been listening to The REPL podcast episode with Eric Normand (link). Daniel asked Eric about his new course on the REPL-driven development. Eric mentioned that there’s little to no explicit guidance towards using REPL in every day work. As I understand, people somehow learn it because of curiosity. Everybody talks about REPL all the time, so there might be some fear of missing out that’s involved.

What helped me to use REPL more at work is watching my colleagues using it. Instead of theorizing about an outcome of an operation, or reading docs, they would always try running it in the REPL. I watched them work. I saw how productive their workflow was, and so it became clear to me why REPL is useful.

When I saw others being excited about REPL for the first time, I didn’t get it at all. “So what? It’s just another tool.” They often say that it’s impossible to explain why it changes everything. But when the point of understanding is reached, there’s no turning back. And then you wonder how you worked before and why others are not as excited as you are.

ClojureScript nREPL Diary — 9

2019-08-08

Ok, here’s how I managed to determine a ClojureScript session in an nREPL middleware:

(defn my-middleware [handler]
  (fn [{:keys [session] :as msg}]
    (when (and session
               (not (string? session))
               (@session #'piggieback/*cljs-repl-env*))
      (println "Bingo! I'm in a ClojureScript session"))
    (handler msg)))

(set-descriptor! #'my-middleware
                 {:requires #{"session"}
                  :expects #{#'piggieback/wrap-cljs-repl}})

I was banging my head against the wall because every open source middleware I saw seemed to receive an atom as a session parameter. I was getting a stringified ID at all times. The solution was to write a proper descriptor for the middleware that would depend on the session and that would line after wrap-cljs-repl. After that I started to get an atom as well, and then everything worked.

Mozilla’s Localization content best practices

2019-08-07

Key takeaways from Mozilla’s Localization content best practices:

When preparation is harmful

2019-08-06

I notice after myself that preparing a bunch of my daily posts beforehand is as detrimental as skipping writing for several days.

The key to daily blogging is having it as a habit. When I don’t skip a day, it feels like a small chore on my mental todo list. When I write several posts in advance, I let my brain relax on this habit.

It doesn’t matter how you skip a habit. If you skip it, it’s weakened.

Putin on wind turbines

2019-08-05

One of the most interesting things I’ve seen lately was Putin’s comment on wind turbines. Check out this video.

They jolt so much that worms get out of the soil.

Easy to recover

2019-08-04

I’ve been slacking on blogging every day for the last two weeks. See, I lied to everyone saying that I’m blogging daily.

The thoughts are brewing every day, and I still enjoy the process of writing things down.

Because the posts are tiny and there’s an established process, it took me 20 minutes to recover to the status of having a post for each day of this year. That was easy.

Something to chew on regarding shipping your software, fitness goals or taking care of the small guinea pig family.

On solving problems

2019-08-03

There are many issues. Anything you take is bursting with problems. The right thing to do is to think about the goal at all times. Then pick the most pressing issues and solve them well. Distraction is the enemy. There are too many things to do in a lifetime.

60k in Ukraine

2019-08-02

I know a software engineer from Ukraine that started to work five years ago, and already earns 60,000$ a year. Personally, I’m very happy for them. But knowing how much taxes people pay (close to nothing, especially when compared to Germany), and how much money software engineers get in Germany and the US, I think the fact that a remote engineer from Ukraine can get much higher salary than a more experienced engineer onsite, is weird.

How is it competitive when compared to Europe or the US? The outsourcing model, as I saw it from the inside, usually has the following downsides: indirection in the communication; low organizational knowledge due to high employee turnover; low commitment due to limited organizational growth. These downsides lead to monetary penalties to the client, and these downsides would be much less present if an employee was on the team. For sure, outsourcing has many upsides.

When thinking about it, I’m afraid that similar cases in Ukrainian software market will lead to a burst bubble.

I’ve heard that some people switch jobs every year just for another salary raise, without being interested in the rest of the package. Such cynicism makes me feel sad and ashamed. This also makes me sad as a potential employer. Say I would like to hire an excellent engineer in Ukraine, but even if they are morally better than the status quo, if they are looking for a worthwhile project, for gaining valuable experience, for working with smart people, I’ll be still competing on these inadequate rates.

Excited about Ukraine

2019-08-01

I’ve been skipping blogging for 3 days, and I feel very guilty of it. Breaking promises to myself is the number one thing that makes me feel miserable.

A friend today asked me what I’m feeling excited about. “Ukraine!” came out from my mouth after a very short pause. I probably watched too much TV over the last weeks, and my romantic hope is on the rise again. I’ve been disappointed on the subject a few times by now. I still hope that this time we’ll see a change for the better.

Repeating failures

2019-07-31

Repeating failures lead to disappointment. Take any type of personal improvement: sports, fat loss, diets, studies, relationships. Repeating disappointments, if one’s lucky, lead to not treating oneself as important. Thus one’s failures become insignificant, and they don’t get upset anymore.

It’s indeed very difficult to not give up and keep going after one more failure. Hope is endless if there’s enough cause in one’s life. If there’s no cause, no mission, no villain to defeat, then why bother anyway?

Proud of hybrid apps

2019-07-30

I can’t explain why but I have a burning desire to show the mobile community that creating high quality hybrid mobile applications is not only possible but should be celebrated and welcomed. I want to make a hybrid mobile application that will impress. That I can take good healthy pride in.

There were many times I felt lied and betrayed by the mobile community and the vendors. They said they had improved things for developers but in retrospect I understand that they have followed their hidden agendas.

Sometimes I meet people on the internet that do their job as a labor of love. They do it because they think it’s right. They have experienced the falsehoods and disappointments of these hidden agendas, and they are on a mission to solve real problems. There are no silver bullets. But there are ideas better than others.

I want to support these people. They are artists in its purest definition. They are true innovators.

I just thought that hybrid is all about tradeoffs. Electric cars are better for the environment, but if at the moment there’s not enough capacity to produce batteries or electric chargers, it’s better to manufacture hybrids. What does this mean in the context of mobile apps, I don’t know yet. Something to chew on.

Contexts

2019-07-29

It’s always about the context. What’s good in one scenario turns out to be a disaster in another one.

Burning fuel is bad for the environment. But I won’t even think about it if I need to save a human life.

Nationalism is generally scary except when a nation needs to push back an aggressor.

Eating fruits is generally healthy except when you’re fructose intolerant and eating two oranges cause a rash over the whole body.

Don’t be shy about the tradeoffs you had to make. Except when it’s against your belief system. Dignity and being true to yourself is vital.

Apple and web apps

2019-07-28

I really wish Apple would invest more into web apps: advanced integrations, performance optimisations, improved UX (touch handling, drag-n-drop etc.) They already do a phenomenal job on this front, as I’ve seen web apps running smoother on the latest iPads compared to latest MacBooks. Oh, and removal of the touch delay in iOS 13 is a biggie. My wish is not a complain, I’m just asking for more.

When it comes to Apple, marketing is much more important than any tech advancement. If only Apple starts promoting web applications from the pulpit, the community will wildly embrace them, and finding smart and excited people would become easier.

Trust and transparency

2019-07-27

Modern tech empowers instantaneous Information transfer. Everyone can get to know any public information in seconds.

People loose trust once. It takes very long time and large effort to recover from a loss of trust.

The most effective way to build trust these days is to live in a transparent way. Reveal secrets, explain motives, share thoughts.

You don’t need to be transparent to everyone. Just to those who you want to trust you.

That’s why public people have rich social media presence.

If everything is transparent about your life and your decisions, people see that you live by what you say, and they can verify it.

… there is nothing hidden that will not be disclosed

Argument train

2019-07-26

To deliver an idea, one has to find a seemingly related idea that is ingrained in their audience’s brain. “You reap what you’ve sown” is exactly that: a call to a desired behavior is connected to a farming action through a proverb. When this bridge has been built, one can put anything they want on the train of thought and it is perceived as proper reasoning and truth. There’s probably a term for it, which I don’t know because this note is nothing more than my observation.

“You’ll reap what you sow. Respect your parents.”

“You’ll reap what you sow. Don’t spit chewing gum on the pavement.”

These statements are right and probably good.

A great parenting trick: for a toddler to agree with you, you have to make them say “yes” three times.

— But daaaaaad, I don’t want to eat this broccoli stew! It stinks! — I know, I know. Listen, do you know I love you? — Yes. — Do you know I want the best for you? — Yes. — And of course, you know that I prepare only the best meals that are good for you, right? — Ugh, yes dad. — Now, finish the stew. We’ll go for pizza next week. — M’kay.

Don’t let yourself be manipulated. Remember there’s math (absolute truth). Note to self.

Usage latency

2019-07-25

I’m thinking more about software performance. Mostly about user-facing client applications.

Here’s something to chew on: it’s better for an app to achieve user’s goal in 3 steps that are 100ms each than in 10 steps that are 10ms each. While the second app is ten times faster in every interaction, it requires more cognitive load from a user, and user themselves will introduce more latency than a computation will.

Ukrainian culture

2019-07-24

Ukrainian traditional culture is so awesome I barely hold my tears when experiencing it. The fresh take on it, when artists and craftsmen take traditional ornaments, songs and language and apply it in a more modern fashion, is breathtaking. The key values resonate with something inside me: freedom, ownership, courage, motherhood, children, fields full of harvest, vast land.

The most difficult thing in daily blogging

2019-07-23

No doubt it’s deciding on a title. I often write a post quickly, and then spend several minutes trying to find a name for it. It needs to summarize a dozen sentences in one to two words.

Self vs others

2019-07-22

Every time I find myself thinking a lot about my self-fulfillment needs, I become mostly sad. It’s a dark egoistic corner. Every time I find myself thinking about basic needs of someone else, I become very excited and full of ideas. Both are necessary, I think. It’s a good reminder to spend more time thinking about unsolved problems of poor and underprivileged people.

Following the leader

2019-07-21

I’m drawn with a great force to follow good leaders. Good leadership means dreaming with seemingly unachievable dreams, taking the risk, radiating optimism, answering tough why? questions, having strong action bias, not talking bullshit, trusting by default, letting go the counterproductive people, praising publicly. That’ll do for now.

Shipping often

2019-07-20

I write to this blog every day. I’ve made a few well known observations.

I’m not afraid to make a mistake. I can always correct it on the next day.

I’m not afraid to write down some nonsense. I can always do more substantial writing on the next day.

I don’t feel the burden of writing every day, because I can write as little as I want. Even one sentence will do.

I don’t bother too much with publishing. Automatic posts to Twitter make the process seamless.

All of these are applicable for shipping software. Build a pipeline, add some verification steps, automate the delivery of the builds, focus on the valuable work. I love automation.

Hope

2019-07-19

I find that feeling of hope correlates with having an ambitious vision. One that has a mission on their life looks eagerly for the future to come. It’s an art to find a mission in a world where the best answer for “Why do we exist?” is “Because.”

Child’s questions

2019-07-18

It’s very cool to get your childhood’s questions answered when you get older. I doubt these are absolute answers, but at least the narrative becomes more plausible. Now I can give it to my kid, and I hope he will be going further to carve the narrative that fits him better and crosses off a few more points on the completeness checklist.

Why am I scared of people? Why two plus two is four? Why people feel like they need to go to the cemetery to visit graves of their relatives? How does the vacuum cleaner roll up its cord when the cord is attached on one of its ends?

My personal favorite was actually “Why two plus two is four?” My narrative is that decimal counting system is the winning abstraction about what humans have observed around nature.

On performance

2019-07-17

My rule of thumb is the following: measure, find the hot spots that are clogged, optimize them. There’s little value in optimizing a one-off screen to open in 100ms instead of 500ms. It’s a great improvement, but it’s likely that users will see this screen only once. It’s much more important to optimize their daily interactions. Not all code is equal.

In my opinion, a great programming platform should have the following qualities: allow you to run fast and full of joy 99% of the time, and allow you to dive deep into the guts of the memory allocation and bit wrangling in 1% of the cases. There’s little value in imposing a constant tax of lower abstraction across the whole system.

Building a software product is difficult. You have to make something that people will gladly pay for. Performance is just a part of the equation. You have to make tradeoffs all the time. Many people love using Slack despite what some power users say about its power consumption or frame rate or bundle size, because it solves users’ needs. Yes, some may complain that their computer works only 4 hours when unplugged, and that it gets hot while performing seemingly simple tasks. Engineers have to fix it, no doubt. But you know what else a user might complain about? How about reliability, real-time sync, multiuser collaboration, beautiful UI and animations, plethora of integrations with other services, ability to resume work on any device they have, offline and poor network handling, quick bug fixes and security updates, great customer support and many, many other things? Everybody expects pretty much everything that Apple and Google have built over the last 20 years on their devices and services. And you, a young company, have to match these titans.

Westerners about food

2019-07-16

I’ve made this observation a few years ago, and I can’t disprove it to this day. Most of my EU and US friends are very specific about food. One of the phrases that blew my freshly immigrated post-USSR mind was “I don’t feel like eating pizza/pasta/hummus/anything else today”. First, is “hummus” some sort of food or a restaurant? But then I wondered: what does this phrase even mean? Does this sentence make sense at all?

Now I know it does. I often say this phrase myself. I think being picky is the way to go in an environment of abundance. But a few years back I was very surprised of people being so picky. And I’ve never heard such a phrase. As far as I can tell, the closest alternative in Ukrainian culture is “uh, I ate pizza/pasta/anything else already three times this week and I’m sick of it.”

Anyway, the point I wanted to make when I thought about writing this post is the following: I observe westerners being specific about complex foods. People might appreciate a specific kind of salami, wine, cheese. They crave going out to their favorite restaurant.

And what still blows my mind is that plain tasty vegetables and fruits are close to impossible to find in Berlin. It’s weird, but I don’t think people even understand or want it. Yes, there are organic shops and markets. Believe me, I tried hard to find tasty tomatoes and cucumbers. By now I’m pretty sure they don’t exist in Berlin. And yet in Ukraine, during the season, almost at every corner you can get these veggies so tasty they can send your tastebuds off to the moon.

I guess I’m nostalgic about my home country. Berlin is awesome. I won’t forgive it with the tomatoes though.

New page — All Posts

2019-07-15

Someone I know asked if I could make a single page with all of the posts on it so that they can read them on a Kindle. Hopefully this works: All Posts.

On project rewrites

2019-07-14

I’ve been part of several complete rewrites of software projects. I’ve seen it succeed in all cases. Most of the times they were significantly late. Complete rewrites are rare. Smaller ones (refactoring, optimization, architectural change) are more common.

My main advice is to do rewrites gradually. The best way to think about it: keep the ultimate goal in mind at all times, but come up with a gradual strategy. The smaller the steps, the less pervasive they are, the better.

Gradual rewrites are difficult and time consuming. It’s tempting to declare some sort of bankruptcy (performance, outdated UI, buggyness, cost of change), and start from scratch. We tend to be optimistic that complete overhaul will take several days/months/weeks.

Here’s how to make you immune to this false optimism: implant in your mind that rewrites always take three (or more) times longer than you predict, and you won’t be shipping anything during this time. Think of how tired you’ll be after pushing the deadline for two times, and for your code not seeing any usage during this time.

Gradual rewrite is the path for quicker results, and gratification. It will take the same amount of time. You will learn about the system much more than you know now. You will start appreciating good test coverage and architecture.

Architecture is the most important part of the project. Pieces may be replaced, but mechanisms by how they are connected will stay as long as the last piece of the old system is alive.

10x tech debt

2019-07-13

So Twitter is outraged with some investor describing qualities of engineers that are much more productive than others. From my experience, I both enjoyed and didn’t like working with such people.

I don’t consider myself as one. First, I really enjoy doing UI work. Then, I think I’m most of the times slower than others, because I approach problems with iteration which takes me some time.

Most of the people outraged with the definition of a 10x engineer mentioned two downsides: creating toxic environment and producing tech debt.

I have to admit that I produce tech debt often knowingly and intentionally. I have a vision of an optimal solution. I also have a working codebase at hand, which has grown layers of bug fixes. Eliminating tech debt often means replacing existing code, and that will surely introduce new bugs (“new” because they are not caught by existing tests or type checks). So I’m very careful with rewriting code. It has to be done with a lot of thought and care. I also have deadlines and never ending backlogs. Introducing more tech debt often means that my team is going to ship on time. I don’t want anyone working long hours and fixing P0 issues because of rewrites. It’s all about trade offs. I schedule some hammock time and tech debt elimination in an ongoing, background work kind of fashion.

Also remember that tech debt is not an absolute evil. Rarely software systems survive more than a few years of usage. Not only they may disappear from the market (couldn’t find a market fit, not enough funding, competition), developers themselves are subjects to fads and fashion and constant learning and we want to rewrite our systems because they use old libraries and languages and techniques.

Piping JSON

2019-07-12

A really handy trick is to always return JSON from your CLI tools. This works very well when piping multiple commands. Every subsequent command augments the output from the previous command. Obviously you can add as many keys as you’d like. This means you can put in any logs and intermediate debugging information. After the very last command, you’ll have structured output, which is easy to parse and query. And this output will contain all of the information explaining how the result was formed. As it’s still text, it’s easily grep-pable.

How to increment the app version on CI

2019-07-11

When working on CI/CD tooling, I often want for a machine to make changes to the git repo.

I’ll run with one example. Let’s say you would like for a CD machine to bump a version number when your app is being deployed, commit it and push upstream. It might be tricky to do so when you have branch protection enabled. Automatically opening a pull request to bump a version seems like an overkill.

Instead of making changes to the repo, consider generating a manifest file with the version number in it, and deploy it together with your application. With the next deployment, fetch that file, bump the version, and upload a new manifest. The key is to make sure manifest file is always reachable at the same URL.

In case you manually bumped the version in the repo, your tooling can pick the highest version number between the manifest file and the committed one.

I found this trick to work very reliably, without any complains from the team.

ClojureScript nREPL Diary — 8

2019-07-10

I finally found a way to properly determine if a ClojureScript session is active within an nREPL handler. I’ll be publishing it soon. It’s not a know-how, it’s just me learning.

I’ve also tried to set up Canva for VSCode for my preferred ClojureScript nREPL session. It’s probably the most user-friendly nREPL client out there, but it doesn’t work with my setup just yet.

Till the next digging time.

Jewelry, screwdrivers

2019-07-09

A few years ago I treated apps a bit like jewelry. I would spend time looking at them, studying the details, animations and interactions. I would meditate on how I feel about using them. Every pixel and frame rate would matter a lot to me.

These days I treat apps a bit like a screwdriver or a wrench. I open them and they should perform what is expected. It’s a bonus if the app looks good. Most importantly it should do its job quickly. And quickly doesn’t necessarily mean being performant. If I’m using an email client, and I want to find a recent email from a friend, it should let me do it without me thinking about it. It should deliver the result quickly, whatever it means. It should be designed around results.

I guess it’s because apps became a commodity. I’m looking forward to the next text convolution where I’ll marvel at a product, not simply treat it as a utility.

Is MVP still a thing?

2019-07-08

They say that you have to be very efficient (lean) and launch a product whenever it brings a minimal user value. Except that nowadays users expect every text field behave like Slack. Except that if your visual design is subpar then it will look poor on users’ phones. Except that users expect for every piece of software to be synced in real-time, run on every platform, have integrations with the biggest players etc etc etc.

See, all of these things became a commodity. That’s one of the reasons Amazon can have poor UI in their app — it doesn’t matter as long as their delivery times and return policy are unbeatable.

Proud friend

2019-07-07

I’ve been talking to a friend the other day, and after they told me their latest news and achievements, I couldn’t hold myself for saying that I’m simply proud of them. I did nothing for all of these good things to happen, but I watched my friend grow over the years, and I’m proud to know such a person.

In other news, I’m again on a wave of wanting to get a new bicycle, and I’m loving my kettlebells. I’m training to do a single arm overhead press with the kettlebell being upside down — it’s a lot of fun because it feels almost like I’m in a circus, and balancing is very difficult.

Political discussions

2019-07-06

I’m reminding myself that to stay calm and content it’s better to omit discussions that are political or indirectly political.

Politics are magnets for polarizing endless conversations. It’s hard to digest even a single argument, and there will be plenty in a single discussion. I become very sad when someone reminds me of a big threat (climate change, pollution) or of injustice and violence (wars, diseases). I can control my life to an extent, but I can’t change everyone. When I get into a political discussion, after every argument I spend more time in it, and become sadder and sadder.

It’s very easy to be drawn into these discussions on Twitter. Within 15 minutes of scrolling I see pretty much every problem of the society.

In case I want to have a discussion, I need to arm myself with the best arguments; think about them for a long time; arrange a time boxed debate with a good opponent, someone that I don’t have plans to be friends with. As it requires so much effort, I decided not to respond to political statements online or in person.

I do have opinions though, and I live by them. I will listen carefully to debates of other people. Observing from a side is much easier — you can turn it off.

Great but dismissed

2019-07-05

I sometimes show to my friends how hot code reloading works when using ClojureScript and Figwheel. Those people who have experienced pains of complex UI development, are all blown away. Being able to apply changes in a fraction of a second, with unlimited access to app’s runtime, gives you superpowers. But none of these people have played with ClojureScript afterwards, as far as I know. Which probably means it’s either not interesting or not practical for them.

And there you go, another reminder that it’s not necessary for something to be the best to win the market.

I’m also thinking it’s a big advantage if you can practically apply a revelation while everyone else ignores it — you have a great tool that everybody have dismissed as useless. Yes, I’m calming down my doubting self.

Everything has its time and place. I’ve dismissed many other great ideas as useless too.

Bug or misuse

2019-07-04

One of the most mysterious types of bugs are the one where you’re not sure whether it was a bug or not. Right now I’m typing this post, and I wanted to copy some text from another document. I selected the text, hit “Copy”, moved to another document, hit “Paste”, and nothing happened. Zero feedback. I repeated the sequence again, and then one more time. Still nothing.

At this point I don’t know what to think: was it me misusing the app, or is it a legit bug?

Python for scripting

2019-07-03

I’m exploring how viable Python is for my scripting needs. I want to have a concise and readable language, with synchronous by default execution, write once run everywhere type of thing. Another requirement is to have easy to use command line interoperability: piping data in and out, CLI arguments, spawning processes etc.

Python seems like a good fit for all of these requirements. I initially was opposed to this idea because, well, I never worked with it. But after writing scripts with NodeJS for a while, I’m pretty motivated to learn anything.

Prototyping with HTML

2019-07-02

I’ve played today with prototyping of some iOS-inspired UI using HTML and CSS. I loved how quickly I could recreate a great looking heavy header and a colorful button à la iOS 12-13 welcome screens. I’ve used an npm module called live-server which refreshed the page after every time I would save a file. Reloading worked even on a phone via WiFi. I kept wondering: why can’t this be an app?

App Configuration 5

2019-07-01

I’m thinking on how to organize the overrides of the configuration. Currently I’m thinking of the following options:

Various combinations of these should be supported, for example:

Hummus Improvements 3

2019-06-30

I’ve tried to improve my hummus skills again this weekend. I thought I’d do better this time because I finally bought enough lemons, but I did a mistake of not cooking the chickpeas long enough and also boiling them in too little soda. The result turned out to be ok, but a bit too crumby and sour.

Till next try.

App Configuration 4

2019-06-29

I’m experimenting now with a following data structure for app configuration. Using JSON for simplicity:

{
  "exception_reporting": {
    "value": false,
    "overrides": {
      "dev": false,
      "prod": true
    },
    "env_var_override": "MY_EXCEPTION_REPORTING"
  },
  ...
}

I like that it’s self-contained:

Previously I’ve considered spreading default value, overrides and environment variable overrides into separate hashmaps, but that’s a disaster for extensibility because a maintainer needs to remember to check three places.

Critical Mass

2019-06-28

I’ve been to my first Critical Mass bicycle event today. It was glorious: hundreds (thousands?) of cyclist, riding the most weird machines, constantly going over the red light, arguing and sometimes even fighting with rightfully annoyed car owners — all with a tasty bottle of lemonade, a cool breeze and a colorful sunset. I loved it from the very start till the Bratwurst I had around midnight because I forgot to grab dinner beforehand.

Blogging is contagious

2019-06-27

I know that at least two of my friends mentioned that my daily blogging inspired them to start blogging on their own. I think it’s really cool — keep going, peeps! There’s really not much to it. Don’t forget to write down the thoughts while you still remember them.

I know some people will say that there’s already too much useless information on the internet, and frequent publishing of personal thoughts doesn’t improve the situation. It’s true. So I think of personal blogging as a process to improve one’s thinking and writing skills. I don’t expect anyone to read it.

App Configuration 3

2019-06-26

It’s very tempting to use a generic isDev (or isProd) flag in the configuration. For example, when isDev is true, enable a hidden developer feature, add more verbose debug logging etc.

Lately I started to consider these isDev andisProd flags as antipatterns. They are magnets for use cases. Everything goes well, until you hit an exception: for example, there are three production stages (alpha, beta, stable), and some developer tooling needs to be enabled in the dev builds and then only in the alpha build. Effectively pieces of the configuration start to spread into the app code, and checks like isDev OR isAlpha start to appear. For the next engineer who’s going to work on this code it’s impossible to inspect the configuration without inspecting the code.

I think looking at the configuration should be enough for an engineer to understand what are the differences between the deployments.

Here’s a tip: instead of IF isDev OR isAlpha THEN enableDebugLogging, add a specific field called debugLoggingEnabled to the configuration, and set it to true for dev and alpha configurations.

App Configuration 2

2019-06-25

I’m looking for a data structure that would allow easy querying of configuration. The queries I would like to ask:

App Configuration 1

2019-06-24

I’ll be posting some thoughts on how to configure a client side application. In a series of posts, I’ll be repeating myself, rewriting same things over and over, as this is a work in progress as I try to distill it to a widely understandable form.

Here are some requirements that a versatile configuration system should support:

  1. Several release tiers should be supported:
    • Development
    • Automated testing (unit, UI tests)
    • CI builds for peer review (super helpful, changed my life)
    • Early-adopter testing (internal/canary/alpha/nightly/prerelease)
    • Pre-production testing (beta/preview)
    • Production release (stable)
  2. With any of these tiers/channels, it should be possible and predictable to inspect what configuration the build has without starting the build. For example, which backend endpoint will the current build talk to?

  3. With any of these tiers/channels, it should be possible to dynamically override cherry-picked configuration options with some type of environment variables (actual environment vars, CLI options, cookies, different domain names loading the same codebase, HTTP query parameters etc.) Key factor here is that the configuration should be overridden before the app code is loaded. For example, I want to see if my previous production release will work with the development backend database after I performed some migrations on it.

  4. It should be ideally possible to have the same codebase shipped to different tiers/channels, platforms (browser, Electron, macOS, Windows, Linux etc.) and for it to act differently based on the configuration.

  5. It should be possible to inspect all of the possible configuration options in a single place. For example, I want to see how many variations of backend endpoints (dev, staging, production) an app can possibly talk to. This is a horizontal slice over the configuration.

  6. It should be possible, with a single command, to generate a config for a certain tier/channel and platform combination, and to inspect it in close to real-time fashion. For example, I want to see which backend endpoint the app within the beta tier will use. Real-time feedback is very important because it allows experimentation, extensibility, REPL-inspired workflow. This is a vertical slice over the configuration.

  7. It should be possible to verify the configuration’s critical settings in an automated way. In other words — unit testing for configuration. For example, analytics tracking should be turned off for UI testing on CI/CD systems because it will pollute the tracking data. Production configuration should always point to a stable backend endpoint.

  8. The file format of the configuration should be non-proprietary, widespread, human readable. JSON is perhaps ideal.

  9. The configuration should be nestable in a declarative fashion. For example, beta apps should have the same options as the production apps, except a few deviations (feature flags, a different icon etc.)

  10. Developers should be able to work (extend, verify) with the configuration on any OS.

  11. Configuration should be widely accessible in the app codebase, without any glue code.

  12. Configuration shouldn’t be parsed per-key in application code. For example, instead of MyConfigModule.backendEndpoint it should be MyConfigModule.valueForOption(“backendEndpoint”). This allows to have less glue code and simplifies extensibility.

  13. If a key is missing in the previous example, the app should crash early and fast during the development stage.

  14. All of the variations need to be moved to the configuration. This is so called configuration polymorphism. For example, instead of if MyConfig.isDev then devEndpoint else prodEndpoint, use MyConfig.endpoint and have two separate configs a for Dev and Prod environments. This encourages reuse, removes duplication, allows to inspect config without starting the app.

  15. Configuration should be inspectable in the running application.

  16. It should be easy to inspect which changes (commits) have been deployed to a particular tier/channel.

  17. It should be possible to override configuration options separately and as well in bulk. For example, I want to turn on just a single analytics tracking option in the development build to check if it works, but I want to switch a set of several backend endpoints all in one go.

Hummus improvements 2

2019-06-23

Today I’ve improved my method of making hummus again. This time, after cooking the chickpeas for 2 hours, I boiled them with a teaspoon of baking soda for 20 minutes. I found this somewhere on the internet. The result was incredible: chickpeas became very soft and mushy, skins came off without any effort, and this all summed up in a very, very creamy paste after blending. Previously, no matter how long I would grind these peas in my semiprofessional blender, the paste would come out crumby. This time it was close to perfect.

Unfortunately I ran out of lemons, so the taste came out a bit dull and on the nutty side. To be continued.

Effort and joy

2019-06-22

I’m exploring this idea of doing more activities which feel like play. For my kid, I tried to implant an idea into his mind that to have great results he has to put great effort in learning some proper skills. So when he wants to learn roller skating, I remind him to put in hours of practice.

But then if he doesn’t enjoy it, what’s the point? I often feel like I’d like to learn a cool skill myself, until it comes to the practical part and I find myself bored and not wanting to do it. So when one can do anything and everything, what’s the point of following something you don’t really enjoy doing? Perhaps you’ll love the result more than the process?

Find three hobbies you love: one to make you money, one to keep you in shape, and one to be creative.

From traffic to efficiency

2019-06-21

Today we had great weather in Berlin. Sunny, a bit of wind and around 24 degrees Celsius. And that means there were a lot of cyclists on the road.

I was taking my usual way to work, and started to notice that I was getting annoyed at the amount of bicycles on the street. Everyone’s racing each other, riding in lines of two or three, not paying attention to the rules… What a mess! Until I remembered what a huge blessing it is, because there are still places where cycling enthusiasts fight for anything like this to happen in their cities.

I remembered that I haven’t spent even an hour of my time in a traffic jam during the last five years I’ve been cycling. Before that, traffic was usual and accepted part of my life every day. I’m immensely grateful that I don’t have to experience it anymore.

Whenever I see a line of cars waiting for the traffic light to go green, my mind cringes of the inefficiency of this situation. Multiple chunks of expensive metal that are powerful enough to uproot a tree, pointlessly standing there, usually with just a single person inside, costing their drivers’ time and heating up the space around them. And then look at the cyclists: lightly sweating and melting excessive belly fat, these smart women and men are flowing in herds on amazingly elegant, thin and light diamond-like vehicles, taking up almost no space, and bringing smiles to their riders and everyone around them.

App configuration

2019-06-20

App configuration is one of my hidden passions. Think of an application that ships to five tiers of users (dev builds, then internal, alpha, beta and stable), with different set of options (backend endpoints, feature flags etc.), compiler flags, and all automatically on a Continuous Delivery system. How to make it work predictably, easy to inspect, difficult to break and misconfigure, friendly to modification and extension, mockable in a testing environment, partly dynamic based on the environment etc etc etc.

Sounds complicated, very techy and detailed, and feel like home to me. I often get very frustrated because I can’t solve all of the puzzles at once in my head. But then I feel high levels of satisfaction because it just works for all of the team.

Configuration usually spreads very quickly and deeply through the codebase. It’s difficult to refactor it, because often you have to simulate certain environments. It’s a careful, minesweeper-like work.

I wonder if I should start writing detailed guides on what works best from my experience. I also wonder if I can read anything on this subject.

Retirement drumming

2019-06-19

One of the retirement dreams I fantasize about is learning really fast punk rock drum beats, really soft smooth jazz grooves and african rhythms. These genres of drumming inspire me the most.

When mobile apps are better

2019-06-18

Few years ago I started to notice that there are digital products which’s mobile apps are vastly more usable than their desktop alternatives.

Take PayPal. Their website has been recently redesigned, but even now so many things are presented at once that I’m lost. And their mobile app: beautiful, fast, concise presentation of just the features that matter.

Or eBay. Their website is very crowded and complex. And the mobile app? Again: modern, fast, concise.

Another examples would be Microsoft Outlook, Amazon, various German banking and transportation apps.

I think these mobile apps are better because they had less legacy to support and the screens are much smaller. The competition, and thus demand, for good UI is also more intense on mobile.

Judging bicycles

2019-06-17

I noticed that I distract myself on unnecessary things. You probably noticed that I like bicycles. I would cycle through the city on a great sunny day, and keep my focus on every pair of wheels that passes by. I literally judge people by what they ride. This is horrible.

I’m deliberately training my mind now to treat bicycles as objects, so that I can have more room for interesting thoughts.

New kettlebell

2019-06-16

I’ve got myself a new kettlebell, 20kg this time. My friend Dave said that I would get over 16kg rather quickly, and I think he was right.

This one has a much thinner handle despite being heavier. I haven’t battle-tested it just yet, but the grip already feels much better. I’ll do a workout tomorrow.

Guided by Apple

2019-06-15

I think what Apple has done with SwiftUI is great. I can see how it improves how iOS engineers work on a daily basis. It would be better if Apple released it much earlier though.

I just love that we have hot code reloading now. If you haven’t used it yet, just wait and see how it will simplify your codebase. The cost of change just became insignificant.

I haven’t been doing any work for Apple platforms since one and half years by now. It helped me to observe the community from a distance. I now can see even more how heavily guided the Apple community is. Before this year’s WWDC, only enthusiasts would consider using libraries such as RxSwift. And now Combine is on the learning list of pretty much everyone.

Imagine how cool it is to be working at Apple, knowing the secrets in advance, and seeing how everyone is excited about your work!

It’s a good reminder to be on a lookup of great ideas, not guidance. It’s also a good reminder that marketing is as important as the product itself.

How I blog on an iPhone

2019-06-14

Today I discovered how to blog on an iPhone. And I did it in the most complicated way you can imagine!

I blog in a text editor on a laptop. I’ve been travelling a few times since the last month, and had to keep up with my daily blogging. So using my phone to blog became a need.

I use an excellent markdown editor 1Writer on my phone for simple note taking. I wondered if I could connect this blog’s git repo as a Files extension on iOS. This should somehow allow me to save posts directly to the git repo.

And bingo — Working Copy does just that! So now I can create posts in my favorite editor on another platform.

There are three takeaways.

Apple was smart to bend its original vision of not having direct access to a file system. Files app is a very limited resemblance of it. This allows complicated workflows without creating more apps. I bet that if someone came up with a blogging app for my workflow, they would have a hard time matching text editing experience from 1Writer. Same with Working Copy.

Second, I came up with a complicated workflow. If a workflow is so complicated, there is a way to simplify it. But I don’t want to simplify it just now. So I keep distorting the reality.

And the last one — open standards are awesome. Because I stuck with plain text files and git, I can transition to another platform without a hassle.

Like in a video game

2019-06-13

Our short bicycle trip is coming to an end. Everything went amazingly well. We swam in a lake, rode 160km, enjoyed hours upon hours of forest air, cooked together, ate ice cream. We talked a lot.

I’ve heard a saying once: the best thing you can do for your child is to take ‘em on a road trip.

My kid was playing with random things all the time. Several times he would sit at a window and hit bugs that sat on the other side of a mosquito net. “Look dad, like in a video game!”

I remember playing a “hit the fly” game on my SNES 25 years ago. Well, the metaphor of hitting the fly went completely in the opposite direction!

First bicycle trip

2019-06-12

I wanted to try bicycle touring for some time now. Somehow I got a wave of inspiration, so I booked a place in another city and one day after it we went. I took my kid with me.

First, it was a bit more than 65km to the place we were staying at. I’ve ridden up to 40km in one day, but no more than that. Germany is famous for its good roads, and it didn’t disappoint. But the route I took went through the woods, so we enjoyed 15km of hilly muddy gravel tracks. That was by far the most difficult part of the trip.

And second, my bicycle setup weighted around 65kg. That’s a lot: my steel Hanko (probably around 17kg with all of the accessories), water and panniers (8kg), my kid (26kg), and his bycicle attached with FollowMe (10+4kg).

The best takeaway: the heavy, stiff, robust Marathon Tour Plus were a great investment. I was surprised I didn’t slip on that mud even once.

Accepting eye candy

2019-06-11

For some time I’ve been nurturing a pragmatic approach to UI design. Focus on the problem, solve it in the most frictionless way, verify the result, repeat.

My striving for pragmatism and utilitarian design started by two major triggers: reading too much into Lean Startup and Indie Hackers community, but also being tired with the gimmick overflow.

I’m actively pushing back on this extreme in my head these days. I’ve realized that if an MVP solves a problem of a user, it might not solve it after all because user won’t want to use the product. First of all, the app needs to land in user’s hands, and they need to be compelled to stick with it. If a user doesn’t have an incentive to forgive your occasional quirks or even the onboarding process, they will put away your app and call it as they feel it (and not how the software is) — “too difficult”, “too slow”, “not usable” etc.

What I remind myself is that packaging is as important as the product itself. Packaging means the looks of a software product. The more the user is attracted by what they see, the deeper they will dive in the product — “surely there has to be something good in this eye candy.”

Joe Rogan — Naval Ravikant

2019-06-10

For the past two days I’ve been enjoying Joe Rogan’s interview with Naval Ravikant. I love how he talks about modern day and age, always dropping to a simple foundational level of tendencies.

My main take away is that memorization is a very ineffecient process of learning. That’s something I realized with my own experience before. What I didn’t realize is how to study in a more effective way: try to understand the basics as good as possible, and make sure you can explain them without any leaps in concepts.

Lately I realized that I trust only those speakers and teachers who can explain the concepts in a logical and sequential way. This is also what blogging every day helps me with — I practise explaining my thoughts.

Some iPadOS impressions

2019-06-09

I’ve been using iOS 13 on an iPad for the last week and it works awesome. I especially like the iPhone-size keyboard that you can type on with one hand.

In general, there’s something I like about Slide Over and the Split View approach — its task-orientedness. Especially with Slide Over, you have a main thing you’re working on and some assisting applications on the side. It’s modeled after your focus. Freeform windows invite more distraction. However, like with any opinionated workflow, with Split View and Slide Over there will be friction in some cases, which wouldn’t be there if user would have a bit more control.

Using a touch screen gives me a lot of wrist pain even after 20 minutes of work. Not great for ergonomics.

Tools and abstractions

2019-06-08

Publishing to this blog is very straigtforward if you know how to use git:

git add . && git commit -m "Updates" && git push origin master

Because I do it every day for the last five months, I got tired of typing this command over and over. So I thought why don’t I make a script. But then I didn’t do it because I didn’t want to.

I’ve learnt a few months ago that there’s a ctrl+r shell command which does a search and autocomplete for recently used commands. So now whenever I want to publish, I just hit ctrl+r, type “Upd” and hit enter. There, no script was needed after all.

In the words of software architecture, ctrl+r is a good abstraction that covers yet another specific case. No special module was required and the user could achieve the same result with less tools. Even better — typing the script’s name would be most likely more work than hitting 4 key strokes: ctrl+r, shift+U, p, d. Not only this abstraction requires less work upfront (by creating the script), it brings less weight with it (no need to update, remember, commit to using this script) and requires less effort to use it. Clearly it’s about knowing how to use better tools.

Sometimes I like to entertain the idea that building specific rich UIs is counter productive to human development. It’s like always using a different kind of writing device that requires separate skill when making a quick note or writing a letter. This is why pens stuck with us for so long — it’s just a good tool, a good abstraction for human activity. It can help you in various activities, be it transferring value (closing a business deal), communication, memory extension (post-it notes).

Having and not having

2019-06-07

I think that compounding of skills and human qualities is real. Be it professional skills, athletic performance, ability to control one’s mind, wealth, mental health. The ones who have the asset will continue working on it and will get better at it. The ones who don’t have the asset won’t work on it and will get worse at it.

It almost feels like it’s unfair. We grow up being taught that sharing with the ones who lack something is good. Sharing is caring. But you can’t plant in somebody’s mind a piece of motivation, mindfulness, peace, hope, immediate urge for action. You can share words and emotions, but it’s the receiver who decides what to do next.

I really hate the fact that nothing good in personal development happens on its own most of the times. You have to be deliberate. And the only thing that keeps you from progression is action.

It’s important to remember that one can move in either direction: from not having to having it, and also from having it to falling back and then loosing it. It gives hope to people, but also this hope might be just a warm feeling and not an urge for cold-headed action.

Caret caret

2019-06-06

I assume you’re using Slack lately, aren’t you? Have you seen that ^^ has become both the new CC and the new “Did you have a chance to look at”?

How to stop human progress

2019-06-05

I assume that all of the scientific and technological progress will significantly stumble, if not halt, if only we remove clean tap water and toilets. That’s it. All of the bright minds will be constantly occupied with hunting for drinking water, struggling with digestion issues, trying to find a place where to empty the bowels.

I’ve heard a quote somewhere (paraphrasing): “As soon as things start to work properly, they are not called ‘technology’ anymore.” Yeap, clean water is considered a human right.

All of this is just to mention that I’m very grateful for the modern plumbing and sewer infrastructure.

Beginners ask which technology to learn next

2019-06-04

I’m chatting with my mentees almost every day. I keep getting the same question from the fullstack beginners: which technology should I learn next — Go, Node, React or Vue?

First, the most important part is to do an introspection exercise: which types of problems do you like solving? If you like tinkering with polished user interfaces, go heavier on the frontend side. If pushing pixels around the screen bores you to death and you feel like you’re loosing time, go heavier on the backend side. If you hate what you’re doing doesn’t matter which end of the system it is — perhaps try looking for something else.

Remember that the choice of technology will most likely dictate which kind of problems you’ll be working on.

Then when you’ve picked one side of the system, learn one programming language at 80%. Then learn the most popular framework at 80%. Then start looking into any of these topics:

My point is that as soon as you gain experience in one language and one framework, you will be able to transfer this knowledge to other languages and solve similar problems there, and you want your problems to be difficult (otherwise you’d be bored). Building a small web application will be very similar in Ruby or Go or Node, React or Vue. Building maintainable and scalable systems is where the most interesting and most well paid problems hide. Particular language syntax is only a part of the equation, usually the easiest one. It’s more important to know how to build systems and work efficiently.

WWDC 2019

2019-06-03

Ok, now that the kid is finally sleeping, I could quickly check what Apple has delivered this year. So far I’m very impressed. Three things caught my attention.

First, something that I dreamt about badly probably since my primary school years — you can finally connect two pairs of wireless headphones to one phone! Gosh, how many things I envisioned. The best one was a Bluetooth audio broadcaster that you can put in a pocket. But Apple has exceeded all of my expectations.

Second, SwiftUI is something I wanted for many years. A declarative UI framework with hot code reloading. My initial reaction was that it needs to prove itself first to become a thing that “a real programmer would use.” But with Apple’s marketing agenda I don’t have significant doubts in that. Raw UIKit adapters seem to be there too. See, Apple, you can do amazing stuff! Now imagine they would spend all of their effort building similar stuff on foundations they had instead of reimplementing the universe!

And third, I’m really, really impressed how well Apple executes its longer term strategy. Last year we got Marzipan and a bunch of iOS apps on macOS. This year we got screen sharing aka Sidecar between macOS and iPadOS. From what I can tell one can tap on the macOS screen with a finger now. So the next logical thing is to get either touchscreen macs (not sure about that) or further laptop use case displacement with iPads. Anyway, the story is so coherent in my mind that I’m blown away. And every step encourages you to spend more money. Well played.

Mentorship update

2019-06-02

I’m enjoying meeting people that reached out to my call for a mentee. I’ve met around ten people so far. Everyone has different needs, and that’s cool. I’m glad that people find it helpful.

I decided to close the proposal for now because I don’t think I can take on more people.

Expectations regarding VR

2019-06-01

Here’s my list of expectations after thinking for 10 minutes about potential use cases for VR after it’s widely adopted. This all should be obvious because I haven’t played with VR almost at all, and even haven’t read any science fiction books about it.

I really hope we all will be surprised by some things that are completely not obvious today.

On estimates

2019-05-31

When you calculate estimates, try thinking of an optimistic scenario and a pessimistic one. Let’s say they ask to implement a login functionality using Rails. If I’m healthy, everything is fine at home, I’m not distracted, and I work 6 hours a day, I can finish it in 5 working days. If I get sick, or my kid gets sick, or I’m distracted, or there’s a requirement that adds a lot of complexity that I haven’t paid attention to before starting to work on this project, then I think it would take me up to 18-20 working days to finish it.

So here’s the observation: if your optimistic and pessimistic estimations are less than three times between them (pessimistic = optimistic x 3), then probably you should think more about them.

I would always bill the client by the pessimistic estimation if possible. In every other project I’ve worked since, every estimation multiplied by three usually comes put to be very close to reality.

Naval's Podcast

2019-05-30

I’ve been really enjoying Naval Ravikant’s podcast. One of the quotes from him that made me thinking:

Given that the main function of universities these days is filtering and signaling, the best move is to get admitted to Stanford and then drop out.

Great material for not to think about pain too much while working out.

Show me your date format

2019-05-29

Here’s a helpful tip that I’m using a lot: start using a consistent date format in all of your writing. The format that works for me the best so far is YYYY-MM-DD, for example “2019-05-29” as of today. Here’s why:

There are so many ways to write a date that this trick brings me a mental relief because I’m not thinking anymore how to write a date.

Explaining functions

2019-05-28

I was teaching some basic JavaScript to a friend the other day. Some of the things, like variables, assignments, basic arithmetics were very easy to explain. It got tricky in two concepts:

  1. What is the difference between console.log(myFunction) and console.log(myFunction())? The notion of passing a function as a parameter vs passing a result of a function invocation was very difficult to explain. We spent probably an hour just on that. I tried many analogies, and the one that clicked with my friend was the same analogy we use to teach the pointers: passing function as a parameter is like giving an address to a house, and its result is like having this house right in front of you. I don’t think it’s the closest and the most accurate metaphor, but it worked.

  2. How to explain what document.getElementById does? To my friend, it wasn’t clear that though both the HTML markup and JavaScript code are in the same file, JavaScript needs to have special code (indirection) in order to access HTML elements. Again we used several metaphors, and the one that clicked was that HTML and JavaScript by design are completely two separated worlds that have little to do with each other; however it would be helpful for these two worlds to interact with each other, and that’s why we have these bridges like getElementById.

I was very delighted that everything we needed to make programs and see the results (btw, with a very fast feedback loop) were just a text editor and a browser. Open a file, reload it once in a while, and you have a very productive set up.

Lezyne Micro Floor Drive

2019-05-27

I got myself a great bicylce pump last week — Lezyne Micro Floor Drive. I have to admit Lezyne has a very confusing naming when it comes to pumps. There’s probably a system in it, but it’s not obvious unless you really know what every pump is for.

Anyway, so I got the model with a manometer. The pump is awesome — very lightweight, so I can throw it in my commuter bag without noticing additional weight. It’s also one of the few small pumps which you can push against the ground.

But then basically the same day I got it, I somehow cracked the manometer, so it stopped holding the air pressure. Well, the pump became useless. But what does a human do when some of their possesions break? They throw it away and get a new one, right? Wrong. The human takes their mighty toolbox and applies creativity to solve the issue — the very thing our brains were designed for.

I quickly checked the internets for the replacement hose, and the exact same hose with a manometer costs around 55€. I mean, the whole new pump is less than that. No thanks.

But then I found a replacement hose from Lezyne that doesn’t have a manometer, and is also much cheaper. I hesitated before ordering it because I didn’t know if it fits. But I still took the risk, it arrived today and… bingo! It fits perfectly. Only the length was a bit too much. I was very surprised I could cut the hose with a kitchen knife, because somehow I expected that the ends of the hose would be capped with some special nuts. But the system is much simpler: the hose can be cut to any length, and it goes on a male ventil connector.

Additional to that, the old broken hose had a great ABS Flip Chuck which I managed to fit on another floor pump I have from a different manufacturer. So now I have two awesome pumps.

Lezyne, well done — your products are very easy to repair! I wish more companies would be like you.

Quote of the day 26 of May 2019

2019-05-26

One of the quotes from today that I’m putting in my memory pocket:

One can use the truth to lie.

I don’t know the original author.

It’s a good reminder that some people say right things with wrong intentions. I guess one can see it a lot in the politics. Also a great reminder to myself to keep the consciousness in a clean and fair state.

Setups and habits

2019-05-25

I have periodic swings in my attitude towards software. When the curve is belly-up, I strive for the convenience. Shiny UIs, no configuration overhead, ease of use are the key factors during these periods. But then another loud story in the news happens, and I become all of a sudden very aware about my usage patterns, so I drop to the no-gimmick side of the curve: mostly text and terminals, try to share my data with a few parties as possible, prefer privacy over convenience.

I benefited from both of these extremes a lot. It’s obvious that the healthy way lies in the middle. But I like experimentation, and am motivated a lot by utopian visions, so that’s why extremes are my bread and butter.

The greatest takeaway from all of these swings is that setting up tech stuff sucks big time. It’s a burden.

Habits play huge role — it’s much less of a burden if tech is all familiar. Being locked in an ecosystem is also a huge factor. I’ve been attempting to use an Android smartphone as my primary device for a while. Man, switching to another ecosystem sucks so much. I polished my iOS usage patterns over many years, and now everything that is against the habit feels like an obstacle.

It might be truly an art to be able to merge an experience of using a particular service and platform patterns, so that people of both worlds feel like home.

Also a good reminder to self that the best ecosystem to stick with is the most simple, convenient and open one. Keep your notes in plain text files.

Social media snakes

2019-05-24

I’ve heard a few (just a few) people saying that social media is really not the best thing for a good mental health: constant comparison, FOMO, pushy political agendas etc.

I’ve also heard other people suggesting that someone (I assume they are talking about themself) should show an example (in their own life) how a healthy social media usage would look like.

Listen, if you really think it’s bad, then it’s a good idea to draw an analogy here: it’s like playing with snakes. Some are bitten more than the others, but noone is perfect as there might be a snake crawling from the behind. So if kids play with snakes and they suffer, would you then bring in an experienced tamer to show some tricks on how to handle them properly?

My stolen bicycles

2019-05-23

I’ve had two bicycles stolen in the past several years. Both of them had a child seat installed on them. Because we arrange our family transportation almost exclusively with cycling, not having a bicycle means that all of a sudden we have to spend additional one to two hours of pointless commuting every day. This is painful.

Having something stolen from you sucks. I think there’s a difference between different types of theft: one can steal money, which is sad (and sometimes vital, unfortunately) but at least it’s replaceable; one can steal a phone, which is sad because it can have a photoalbum full of memories that the owner didn’t have a copy; one can hypothetically even steal a wheelchair, which I think is even worse morally. Because theft of a bicycle happened to me personally, and considering the fact that both bicycles had child seats on them, I would naturally put this situation into the more immoral theft bucket. “How could they steal something with a child seat on it?! It’s almost as if they would steal a stroller!”, thought I to myself.

This all kept going on in my head, until a friend said once: “What if the thieve also has a child, and they needed the money more than you do?” And man, this torn me to pieces. How could I have such a blind spot and not even think of such a scenario?

So I’m more content now. Luckily I had the opportunity to replace the bicycles. Hopefully these thieves needed them more than I did.

Why mentoring

2019-05-22

I was at the end of my third year at the university. I’ve been using Microsoft technology a lot: a huge Windows fan for more than a decade by then, I tried to get into .NET, C# and ASP as much as I could. I still didn’t understand much, but the power that behind these tools seemed enormous to me. I remember making an assignment for my databases course using MSSQL and generating the reports using ASP.NET. It felt so powerful — what real programmers would use on their job.

A few years prior to that, probably around when I was fifteen, I was an avid reader of a few computer magazines and some geeky websites. It seemed like people were talking about Linux everywhere. It was just better than Windows in every way, they said. So I decided I want to give it a try. I remember going to a book market one day to buy a CD with a Linux distro. I still used dial-up and didn’t have a high-speed internet at home. It was so confusing to find out that there are not one, not two, but a plethora of Linux distributions. One of the guys at the market sold me four or five CDs with an outdated version of Redhat that he had at the back of his stand.

I went home and spend a tireless evening trying to install that thing. I had no idea what I’m doing, I was super confused when an article mentioned running “sudo make” — where do I even run it? It was very frustrating so I gave up. No Linux for me just yet.

Now back to my third year of university. That Linux curiosity bug I caught around fifteen years of age started to become more and more loud in the back of my head. “Maybe I’m doing it all wrong with this Windows thing?” “Maybe I’m missing out?” “Maybe one can develop software without a visually rich IDE?” “Maybe real programmers use only terminals for real work?” “Why do all of these people run Linux on their servers?” etc etc etc.

So I decided I wanted to switch to Linux as my main operating system for a few months just as an experiment. But I was very afraid: what if I can’t do my assignments for the university? What if my WiFi card doesn’t work? And the worst, do I throw away all of these years of my Microsoft experience for the sake of seeing this damn penguin while booting my computer?

It was a difficult choice. Unfortunately I didn’t know anyone who could help me to make the decision. Except a friend of a friend, who was very experienced, and I knew they charged 50 dollars per hour at that time (I was very impressed by that number). So I decided I would ask them for an advice. I wrote a lengthy email explaining the situation and asking for guidance. Then I re-read it probably four times, correcting typos and removing ambiguity from my writing so that I don’t make an impression of a complete newbie. When it was ready, I wanted to hit the “Send” button, but… I just couldn’t do it. I decided to sleep over it and send it out next morning.

In the morning I read that email one more time. And then deleted it. I was so ashamed to come across as a total newbie to that person that I didn’t even dare to ask for an advice.

Luckily enough I still gave Linux a try. I started with Ubuntu, then at some point up-(down?)-graded to Debian, and stuck with it for a year or two. Best learning experience, I tell you. Tireless nights of recompiling font rendering libraries because I couldn’t stand the default text anti-aliasing, and the good one was patented (Debian is GNU). Making my programming assignments using C/C++ and GTK/+ (what a piece of, ergh-ehmm, “something” that thing was back then!) — and that was a computer graphics course! I had to argue really hard why QT is worse because one of my peers used it for their coursework. Then writing AT codes configurations for a Bluetooth modem so that my computer could connect to the internet through a Nokia dumbphone. I think I even worked on a few freelance webdesign projects running Photoshop on Wine.

Some people say personal computing is getting worse these days. Not in my book, I tell you.

That fear of asking for advice is exactly why I started offering mentorship and advice to others. I can’t offer much, but now at least I can suggest somebody trying Linux. No question from a newcomer should be received as stupid.

Rational optimism

2019-05-21

It’s very important to be positive and encouraging when people approach you with their aspirations. This happens to me a lot when friends pitch their ideas of a company, a product or a career choice they want to make. It’s much easier to be discarding of a dream someone has rather than think of how this can actually become a reality.

I once told a friend about a monthly income that I dream about. I must say it’s completely ridiculuous. I don’t know anyone who earns as much. I have little to no idea how to get to that point. I mean I do have ideas, but no idea of an actionable strategy. Boy I was surprised when that friend all of a sudden became very supportive of this ambition. They remind me of it on every other occasion, and it comes across as very real and true encouragement. Rarely I feel so supported as when I’m around this person.

I really want to be more like that. When somebody hangs out with me, they leave with another pair of wings on their back.

Screw pessimists. They don’t do anything any way, and they find all of the possible edgecases and reasons why something won’t work. I’m very sorry to everyone who I spilled my portion of unhealthy negativity on.

It only makes sense to be negative if you have a clear alternative (and doint nothing is not one). Otherwise lift people up by default.

This is a note to self.

ClojureScript nREPL Diary — 7

2019-05-20

Together with a colleague I’ve found a wrong assumption in my nREPL middleware thingy: Cursive won’t attach :ns and :file to the message it sends to the nREPL server. Atom’s ProtoREPL does it, and I assumed it’s a requirement (I’m very unfamiliar with nREPL’s codebase still, so I poke at it mostly like at a blackbox).

I don’t have a solution yet how to do it. The main problem I’m trying to solve: I’d like to call Reagent’s render function only when a line of ClojureScript has been evaluated. Or at least a line of code within a ClojureScript REPL. But I can’t figure out yet how to determine within an nREPL middleware if there’s an active ClojureScript session.

I’ve been looking into the implementation of wrap-cljs-repl. What’s weird is that the session, which arrives via the message, is an atom. While I’m seeing only strings (identifiers).

Will keep digging further.

Thoughts on “Preventing the Collapse of Civilization”

2019-05-19

I enjoyed watching the latest talk by brilliant Johnathan Blow called “Preventing the Collapse of Civilization”. I like how he brought up the idea that Elon Musk expressed in one of his interviews, that because of the stagnation in the space exploration industry in the US, the skills and knowledge would be lost over generations of specialists. There’s a notion of institutional knowledge. I also like the quote from somewhere that one can’t be considered a runner if they have done a marathon two years ago and they haven’t run since. Johnathan Blow transferred this idea to software engineering, and I think I agree with him on this point. I would expect that my fellow average frontend engineer haven’t written much assembly in their career. I don’t feel any sadness or fear though. I think everything is ought to pass eventually. Though, if possible, we should enjoy the ride.

It is perhaps that inherent complexity of software has changed over time. Software itself is different these days, in a way. Yes, it’s still all about making computers to do what we want them to do. However:

I can continue further, but won’t. This list of questions is very sporadic — I didn’t spend much time to make a coherent questionaire out of it.

Anyone developing a system that is going to be used by several hundred thousand users (again, would that even be possible in the 1970s?) should most likely consider these problems.

But I sympathize with the talk on the point that many programming processes take too many layers of indirection, and perhaps we could have solved all of the cultural problems mentioned above without several of these layers. I really wish there would be such a universe with this outcome.

A friend of mine is a very enthusiastic cyclist. He lives in a city where casual cycling is not widespread at all. Everyone pretty much has to use a car to have a decent way of living. Traffic jams is a norm, you’re expected to have at least some portion of this draining experience every day. My friend wishes that people in this city would organise their lives in a way that cycling would become a norm, and that they would drive their cars less. But it’s very foolish to think that people would give away comfort of their cars for an utopian vision of a Dutch-like urban cycling culture. So instead he waits and eagerly expects for the society to buy more cars, to spend more time in traffic, all until the current system will explode and the society will reach a tipping point of discomfort where it has to change something.

So perhaps we’ll experience the same blow up in the software department, where the complexity would be at a such higher level that we’ll be forced to reinvent the world. I expect the soon to be fulfilled prophecy of the end of Moore’s law will contribute to that big time.

For now, my best takeaway from this dystopian world view is the following: truly absorb Fred Brook’s “No Silver Bullet” and do things that matter, one step at a time. Don’t allow yourself to go into bikeshedding. Be lazy to type and hungry for thought.

18+

2019-05-18

Gotcha.

I unapologetically love big text when working with a computer. 18 points is the usual setting I go for. I don’t have much of screen real estate left, but I also don’t apply any effort to distinguish characters.

cmd+plus is the best thing we have in the modern browsers, after hyperlinks. Best feature in any Electron app too.

I always wonder how people can see a letter that’s only 2mm high.

Hundred functions and one data structure

2019-05-17

Highlight quote of the day:

It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.

— Alan J. Perlis

Here is the rest of his epigrams

Friends often ask me why I appreciate Clojure so much. I usually tell basically the same quote but in a more complicated way: it has a very delightful and minimal set of abstractions, and yet you can solve all of the usual problems with them. I think this quote is a more concise and understandable explanation, so I’m putting it to my argumentation toolbox from now on.

Manipulation vs rebellion

2019-05-16

One thing what I’m not sure of is where the difference is between manipulation and being rebellious. Say, one person manipulates another person using fear, and I think it’s completely fine to call out the manipulator for an immoral behavior. But then there’s a situation when a person says something to another person that’s challenging and takes them out of their comfort zone, so the receiver of the message can unwisely rebel against that.

The reason why I’m genuinely curious is that I believe that morals follow the same ubiquitous path of the laws of nature, like our discovery of any natural sciences. If no mathematical fact is an island, why should there be moral islands?

I don’t think I have a right to define what’s good and bad, even for my own life. That’s why I observe all things around me, try to figure what makes most sense, and change my mind accordingly. One of the most difficult part here is to pay little loyalty to one’s own self in the past.

Whenever I hear a challenging thought addressed to me, I often don’t know if it’s a manipulative trick or the other person truly wants to help me. By default I try to question everything, and that leads often to no actions from my side.

I think that one should follow what they think is right proactively. Inaction is often a sign of double-mindedness, and that doesn’t help anyone.

Deliberate waiting is not an inaction. Fearful or indecisive waiting is a sign of inaction, I think.

On fixing obscure crashes

2019-05-15

When I receive a report of a crash or an exception in an app that I’m working on, it takes me some time to recognize it as something that’s real and that I should relate to. My immediate reaction is “oh, it’s only a one time thing” or “it probably is not in the code our team has written”. I’m talking about issues with some level of indirection and obscurity, not the one where the stacktrace directly tells you how to fix it.

After procrastinating for some time, I start digging through the code base. Emotionally, the process reminds me of learning something new — very uncomfortable and with a constant desire to switch to another activity. The problem has to be force-fed to the brain first. Then the most effective way to solve it is to go and have a good night of sleep.

On the next day, as expected, the code paths are much more familiar. I usually start inventing the most inrealistic scenarios that can cause the crash. It’s very important to write down all of these theories, with any related thoughts.

A good strategy is to try simulating the crash in an isolated way. Usually it starts with some sort of not-normal usage of the application: jump around, click on all of the buttons all at once, use three apps on different devices at the same time, toggle on and off network connection — do everything and anything to break the app. When a certain pattern of this not-normal usage starts to repeatedly crash the app, you’re on the right track. Try reducing the steps to the minimum to achieve the failing result, and stop when there are just a few of them and you can still reliably reproduce the issue.

Most of the times at this point an “aha!” moment arrives, and you know what should be fixed. It’s obvious now, and it wasn’t that obvious just a few minutes ago.

In some cases when it’s still not obvious, what helps a lot is to set up a separate project from scratch that will follow the same code path without any other code around it. This strategy allows to shorten the feedback cycle. The crash will start to happen at some point, and then you end up distilling a single atomic change to the application that causes the issue.

By now it might be clear what code causes the issue, but may not be clear why. If it’s a closed-source API that you’re using, don’t be ashamed of hacking around it and applying a good old monkey patch. Remember: users do not see your code, and even if they see it they most likely don’t care about it.

Expect the worst

2019-05-14

I really enjoyed listening to this interview with Derek Sivers. Derek is very inspiring on many levels: in his personal story, in following his interests, the way he runs his website, former businesses and many other things. Also a great story teller — it was a pleasure listening to him.

What I’m thinking about recently is the approach on how to think about future. Tim and Derek discussed a rule that can be succinctly described as “hope for the best and be prepared for the worst.”

From a very young age I’ve noticed that if I expect something bad, it won’t happen, but if I’m positive about an outcome then I’ll be disappointed. So I’ve decided to start expecting everything to go south by default.

I think this is an attitude which leads to negativity by default. The reason that my expectations were opposite of the outcomes is that most likely I’ve prepared well for the bad outcomes and was too much in ease for the other ones. It wasn’t this magical (or even worse — supersticious, blaaargh) expectation by itself which lead to the outcome. I like simplifying the world so it can fit into my head.

What I also love is that the notion of “this pleasant thing will go away at some point”, be it young age, spotless health, great weather, relationships etc., agressively pushes me towards being in the moment and enjoying it to its fullest. Makes me very greatful.

Great run today too.

ClojureScript nREPL Diary — 6

2019-05-13

Just a tiny fix today: when attaching an app reload call to the :eval nREPL message, the :code of the message needs to be evaluated in its original namespace. I somehow missed it and was overwriting the original namespace with the one where app reload function resides.

I like fixes that lead to code deletion.

ClojureScript nREPL Diary — 5

2019-05-12

I’ve been thinking how to proceed with the ClojureScript nREPL Example I’ve been toying with for the past week. There are a few things on my mind.

Cool stuff.

nREPL middleware for automatic reloading

2019-05-11

Ok, I’ve hooked up a middleware to my ClojureScript nREPL Exercise that triggers a reload function after every evaluation via nREPL. It means that any change to the codebase will be reflected instantly, without even saving the file.

Here’s a demo:

Next step: assemble a small Reagent app and make a demo with it.

Instant evaluation of ClojureScript with nREPL

2019-05-10

Today I’ve experienced a moment of pure joy — I got my editor to evaluate ClojureScript forms, and then the app (running with figwheel) would instantly reload and reflect the changes. I don’t even have to save the file.

Shaving off a second from a 5 second feedback cycle isi cool, but not a game changer. Shaving off 5 seconds from a 5 second feedback cycle changes everything.

Being able to evaluate code in the context of a running application from one’s editor with a close-to-instant feedback cycle allows a very interactive development process. For example, one can write functions and before they are even hooked in the codebase, developer can execute them against the running application state and see instant results.

It was a painful learning process to get to a point where I understood (just a bit) how to extend nREPL. I’m going to publish the examples soon. I’m a bit lazy to do it this Friday evening.

I’m also very happy that Clojurists Together will support one and only Tim Pope to work on vim Fireplace. One of the items on his plan is to look at what’s new within ClojureScript ecosystem. I really hope we’ll have a reliable setup for ClojureScript REPL via nREPL, because so far I couldn’t make it work. Here’s the link to the announcement.

Reason to upgrade

2019-05-09

We’ve talked with a friend a few days ago, and they mentioned that somebody wouldn’t buy a new model of a smartphone because they don’t need the new model and the old one does everything they need from it. Everything inside me resonates with this approach (though I assume my list of purchases on Amazon is longer than of an average consumer — you can safely say I’m a hypocrite), however the next question that almost flew out of my mouth was “why doesn’t she need a new model?”

When looking at a professional and the equipment they use, subconciously I start to find reasons why they have the newest or not the newest model of a device or a tool. I was watching a short movie about one band’s recording process in the studio, and my attention was glued at the CD drive slot of an old (erghm, from 2011) iMac the sound engineer was using. Like, these are professionals with huge budgets and worldwide fame, so why can’t they upgrade their equipment?

Man, how screwed I am with my stereotypes and the way of thinking. It’s ingrained by now. Why in the world do I have to come up with a reason for staying on an old model of x or upgrading to a newer model? Why if there’s so much room for leisure, people interaction and creativity, I spend nights (like now is almost 3am) of watching YouTube on tech updates and politics? Why all of this bikeshedding? How can I break free?

ClojureScript nREPL Exercise

2019-05-08

So today I made the REPL exercise I started yesterday to work with the clj CLI tool. I’ve tried it so far in Atom’s ProtoREPL and VS Code’s Calva and it all works almost flawlessly. It crashes with Vim’s fireplace. My team mates said that it also works with CIDER and Cursive but I haven’t seen that yet.

Code is here: https://github.com/mkarp/cljs-nrepl-exercise.

ClojureScript nREPL Exercise

2019-05-07

I’ve been spending an unhealthy amount of time trying to set up a reliable ClojureScript REPL environment via network REPL. There are just too many things that I’m unfamiliar with to wrap my head around.

Here’s a tiny repo with the minimum setup I’ve landed so far: https://github.com/mkarp/cljs-nrepl-exercise.

Hope to replicate the setup for the Clojure CLI tool tomorrow.

Website updates 06.05.2019

2019-05-06

I’ve started to collect tips that help me learning from online courses.

Also I’ve picked up my fitness routine after a week of slacking around.

Generations and change

2019-05-05

I’ve been skeptical about how people describe generations. There are baby-boomers, generation x-y-z, millenials, all of that. I’m skeptical now of me being skeptical.

Few weeks ago I’ve listened to an interview with one of the Ukrainian oligarchs (we do have a few), and his answers got me thinking. When asked, (all paraphrased) “So can we change anything in this country for the better? Like so it is, for example, in Switzerland, where most of the people abide by the law, benefit from taxes, business is done transparently etc.”, he answered: “Why do we need to change it? We don’t need to change anything. Is it normal for you (talking to the interviewer) and me to bring a box of chocolates when seeing a doctor, an officer and a lawyer? It is normal, it is expected. I can’t change people. Even more, I think changing people means telling them what to do, and that’s immoral. So no, we can’t change it and we shouldn’t. The new generation will have their own rules and that’s when it might change.”

This can be perceived as him resisting the change because if there will be systems in place that will make his not-so-clean big business mechanisms impossible, then he’ll loose. Put it bluntly, “I’ll milk that cow as long as I can, and what happens after me is your problem, kids.” One can argue that he has enough influence to bring reforms that will make average Misha’s life better.

I think he is right that it’s impossible to change the system. You have to replace it. Only so few people change their minds, and usually it happens because of a crisis in one’s life. If we want a sudden change, then we’ll have to bring a sudden crisis to many people at the same time, and that’s probably a nightmare — either a war, a recession, a revolution — some sort of cataclysm.

When new people (aka generation) come with a different mindset, because they lived their youth in a different zeitgeist, watched different movies and read different books, they will live differently. Do you have a TV, and did your grandparents have a TV? Every generation does the opposite of what their parents did, until they become just like their parents. Do you watch YouTube as much as your grandparents watched TV? I surely do.

It’s a good reminder not to be confident in the future based on the current state of the things. If Germany is the best country to live in at the moment (we can argue about that, and if you don’t agree you’re probably right, just let us have it as an example), it might be not the best place to live in 25 years. And if there’s a stereotype that East lacks creativity (I’ve heard it many times that West is the one that comes up with original ideas, and that East copies them), let’s live a few more decades and see who is better off — the ones who grew up in lavish societies where luxuries became necessities, or the ones who had to dream and work. Yeap, sounds pretty contrast, on purpose. Not blaming anyone — how can a child pick the environment it is born to?

If you’re feeling sad or mad — it’s fine. It’s a symptom that you’re afraid of that things will change, and that’s part of being a human and being afraid of death I guess. A symptom that we should expect the change and, as much as I don’t like this chiche, embrace it. That we shouldn’t hold too much to our past successes.

Back to taking notes

2019-05-04

Just a friendly reminder to use open formats instead of proprietary ones when possible. Both as an engineer and a user. Plain text survives many generations of apps and services. Notes are extension of your memory — try not loose them.

I’m in my note taking phase again. There are periods in my life when I take notes about everything: meetings, learning, thoughts, ideas etc. Same with bullet journaling — I use it when I’m either overwhelmed or just trying to get my you-know-what together. Same with todo lists — I find that I use them only when there are too many things to take care of, like when moving apartments.

For this note taking period I’d like to try Notational Velocity. The only reason for that is because a few people that I follow on the internet recommended using it. I’ll be using a fork of the original app called nvALT.

With nvALT, there’s an option for the app to use plain text format. The files are stored in a Dropbox folder. I’m using 1Writer on iOS. My main requirement for a note taking app on iOS is that it should not prompt me to enter a title for the note after I hit “New Note” — either it should figure out the title based on the current time and date, or based on the first line of the note. 1Writer does exactly that. Additionally it syncs with Dropbox like a charm. And it has a customizable keyboard panel where I put all of the important Markdown symbols like #, *, _, [] and (). I think it’s a great setup.

Tracking visitors

2019-05-03

I’ve inwardly debated myself whether I should add a tracking script like Google Analytics to this website. The benefit is that I can see that people appreciate it and pay attention to me. The downside is that I can see that, and I would most certainly want to see it multiple times a day.

Then I ask myself: if I ever want to stop blogging every day, which probably happens very soon because one can have just so many ideas to share, will seeing that there are many visitors stop me from quitting? By the principal on inquisitive querying, I remind myself that readers is not why I’m writing every day.

So why I’m writing? I think it gives me hope that I’m able to do things. There’s one solution to all human’s problems that causes them self-harm — just do the right things and quit doing the wrong things. That’s often impossible. Writing daily gives me this emotional anchor that I’m able.

So no, this website is free of any analytics tracking scripts as of now, May 3rd 2019. There’s a bit of JavaScript now on the first page — the very first paragraph after the title. Check it out.

Optimism, sadness and dismissal

2019-05-02

I think it’s good to be positive and optimistic. Sometimes things don’t go as planned, and sometimes bad things happen. If not taken too close to heart, negative events have less impact overall, in my experience. Obviously we’re not talking here about really sad stuff, like diseases or death. Just in general.

What I’ve noticed is that negativity is very relatable. People like to talk about their problems, and when I don’t talk about my problems in response (usually because I don’t have many and if I have some I try not to give them too much attention), I often see that people feel I don’t resonate with them.

When a person experiences sadness, being overly positive can be perceived as being dismissive. Like their problem doesn’t matter. So I don’t want to be cheering them up too much if they’re sad. Mourn with those who mourn. But I also am a poor partner in sharing sadness. The best option is always too listen, not interrupt, and let a friend talk as much as they need. I’m genuinely interested, and I’d like to come up with a solution, but I shouldn’t. Fixers are dismissive. There’s time to be sad.

If a person is too optimistic and dismissive about their problems, the problems might not get solved early enough. Prevention is better that cure. So you want to have a bit of constructive complain, and it should lead to action.

Static website generator rant

2019-05-01

I’m blogging every day for four months straight already. I might have skipped a day or two, but I would write two posts on the next day then. I don’t care if you think it’s cheating. This blog is for me in the first place anyway.

So now I feel like I have a bit of a right to rant about static website generators. I specifically forced myself to put almost no effort in the tooling behind this website until now, because I know how I and many other people end up not publishing anything because of the tooling paralysis.

So now it’s time to make it look like a real homeblog.

I’m using Jekyll at the moment. Almost everything feels great:

Now the downsides:

So I think I’m in the market for the new blogging engine. I want a good website hosting too. I have very little requirements — keep the good parts about Jekyll and GitHub Pages and solve the bad parts that I’m experiencing. If you can recommend anything — please let me know.

Happy first of May everyone!

I'm quick feedback cycle dependent

2019-04-30

This week I realised that when programming I either need to have a working unit test setup, or a working REPL setup, or at least some quick visual feedback. Quick means under a second. After experiencing all of these it’s very emotionally difficult to have slow feedback as it feels almost saddening.

Best way not to care about tooling and productivity? Never try good tools. It spoils everything. I’m definitely spoiled.

How I dealt with RSI

2019-04-29

If you don’t know what RSI is, check out Wikipedia.

For me it started as a feeling of weakness in my right wrist. I couldn’t lift a piece of furniture when moving apartments — my hands couldn’t hold the grip. Then at some point it started to be difficult to fall asleep because of the dull pain in the arm. That was the moment when I decided to try fixing it.

By the way, my pains went from almost not noticeable to difficult to tolerate when I switched to using Apple’s latest Magic Keyboard and Magic Mouse. The keyboard has so little key travel that it just feels like typing on a table. The mouse is meant to be held with a pinkie and a thumb. Good luck with avoiding wrist stress with these products.

There things that did wonders for me:

  1. I started to use a split keyboard. I’ve tried several ones:

  2. I started to use an ergonomic mouse. For a while I’ve been using a vertical mouse like this one, but I used to tip it to the side several times a day because it’s too high. I’ve tried using a trackball until I started to experience thumb pain. I ended up using Sculpt Ergonomic Mouse because I find it’s ball-like shape to be right in-between usual mice and ergonomic vertical ones. It kind of has benefits of both without the downsides.

  3. A regular arm stretch routine. This one helped me a lot.

That’s it. Hope someone finds it helpful.

New name for second-hand

2019-04-28

I was listening to several interviews with Andrew Yang last week, and I loved how they “rebranded” universal basic income — the freedom dividend. Dividend entails that an individual benefits from technological progress of her nation, and freedom… well, who in the US doesn’t like freedom?!

I used to be sceptical of giving things new names. The thing stays the same now matter how you call it! But then I noticed how different it is when it comes to people-related things. I have opinions on it. I’ve seen friends’ lives turned around as soon as they changed the way they talk about themselves and life in general. Language affects feelings a lot.

And who would argue that Newspeak works? I myself am most likely a product of what the communist party used to preach back in the USSR days. Death and life are indeed in the power of the tongue.

I think that second-hand is great. But the name sucks. Think of it: does the name spark joy in you for using your money effectively? Do you get a feeling that it’s a trustworthy source of material goods that would last a lifetime and feel great when you’ll be using them? Are you getting full of hope that humanity will survive it’s own technological advancement and not destroy Earth’s ecology?

Yeah right, there’s not even a glimpse of any of these feelings.

If a product survives a period of usage from its first consumer, and is even market-worthy to be re-sold, then I think it’s a huge compliment to the product and the manufacturer. I as a second owner of this product will enjoy it’s luxury-like quality, won’t spend a fortune to acquire it, it will most likely just work because it’s repairable and the manufacturing defects are clearly absent, and yay the industry doesn’t need to make another product for me. Some stuff does get better the longer you use it.

So we need a good name for second-hand. We have a bunch of terms already, like reusable, vintage, eco-friendly, budget-friendly etc. “Renting out” misses the luxury and ownership part. I’m sure people came up already with a term “co-owning”, like they call a usual WG a “co-living” space (please, don’t).

These all are bad, in a way. We need something like The Freedom Dividend but for used stuff. I tried to come up with some names, but quickly halted the process after my brain spit out “The Luxury Booty”. I think something with “classic” might work well.

Any ideas?

Always get luxury items

2019-04-27

I’m sick and tired of using low quality tools and everyday items. I want a set of proper high-quality wrenches so that I won’t strip paint from my bicycle anymore. I want high-quality vice so that I don’t have to fiddle with keeping that metal pipe in place while sawing it. I want some more stuff, but I won’t keep listing it here, though I have a habit of giving three examples. Three is a cool magic number. So is my habit to mention what I won’t be doing.

I’ve been there multiple times. I wanted to optimize a process. So I bought a cheap crappy thing to do it. It worked but the result was meh. So I would buy a high-quality replacement and would throw away the cheap one. And then the result started to come out awesome.

My secret of getting things of the highest quality without becoming poor consists of two principles: waiting and buying second hand. Waiting is good no matter where you buy. It allows the honeymoon period of the desire to fade away. In general it’s good not to buy something you want for at least two months. And then second hand. I had so many good deals already that it’s impossible to go back. I had a few bad ones. People in Germany buy tons of great stuff and often never use it. Thank you, western society!

In my teenage years cool kids from my peer group wore certain brands. But no one hand any money, so we shopped at a second hand. It was always an awesome way to spend a day: you go with your friends through the piles of crappy clothing, dig through them, find something very stupid or funny, laugh at it; and then eventually you dig out a treasure — a piece of clothing that fits you perfectly, is in a great shape etc. Success always felt like winning a lottery, while the process reminded me of fishing. And after the hunt we always went for food.

Once I found a pair of 501s in one of these piles. I never wore Levis before, but those pants costed only two bucks, so why not giving a try. These jeans became a lifetime memory for me. I never, before or after, wore a pair of pants more comfortable than those ones. Probably the first and the last pair that I could wear without a belt. They were just perfect in their size, material, fit and looks. Even though they were used, I wore them for two years straight, and had to eventually retire them because the material thinned too much in the inseam. Because I loved these jeans so much, I went to the official Levis store and bought a new pair of 501s of the exact same size. I paid, no kidding, 50x more. And you know what — worst pair of jeans ever! Poor fit, weird material, and I torn a huge hole in them by tripping over the stairs.

Ready for one more story? Here we go. Last week we had friends over for dinner. It was awesome to eat together; fresh air full of blossom smell filled the room through an open window; and finally we could enjoy some evening sun since a few dark winter months. When it was time for the dessert, I took out my beloved semi-professional blender, threw in some frozen bananas, strawberries, coconut milk, a pinch of vanilla and cardamom, and with a push of one button in a few minutes I was able to serve almost two liters of a freshly-made, no-added-sugar, vegan, glorious icecream. Deep inside my heart I thanked that young lady that handed me this awesome almost new blender for a tenth of its market price. I had a simpler blender before, but it could barely crush one banana. Everyone liked the dessert very much. Every dinner party is better if there’s icecream around.

Naked or art?

2019-04-26

There’s this thin line between something being empty or not present and highly conceptual:

I like that parables and stories make it easier to decide for me. Is it emperor’s new clothes or pearls before swines?

As always, it’s not about the phenomenon, but rather the person. If you would go to the bar, would you use the bartender to get the drink or the drink to get the bartender?

A short, not-really a story, of my career

2019-04-25

I remember my first ever earned money. It was twelve dollars. I was making various jewellery with beads and selling it to my classmates. I was around ten or eleven years of age. I remember I took an empty box for baby napkins from my cousin, and that box looked like a bear, and it became my first piggy bank. I thought I had an enormous amount of money. Around the same time I used to help out on a market close to where my grandparents lived, and local businessmen would employ kids to unload watermelon trucks. The biggest pay I ever got from that job was two cracked watermelons, so having twelve bucks in my piggy bank felt great.

I remember my first freelancing gig. I was twelve and I just learned basics of HTML and CSS. My mother was on a phone with a friend and somehow they started to talk about their company’s website. A few minutes later my mom asked if I could make a website for her friend, and I, full of excitement, said — of course! Then she asked how much I would charge for it, so I imagined the highest amount of money appropriate for my skill, so I said… hmm… yeah, twenty US dollars. I was sure they would reject me for such a bold rate, but instead they replied they’d happily give me a hundred. A hundred US dollars. Be sure I poured all my knowledge and creativity into that website. That thing was shining and squeaking with glorious DHTML and every imaginable CSS property!

When I was twelve, I thought a hundred dollars is an enormous amount of money. For many families it still is. By then I thought that a thousand dollars is, first and foremost, an unachievable amount, and then also I had no clue how to spend it. But later I learned that both thoughts were not true.

Probably a decade later I landed a job where I was earning around a thousand dollars a month. I thought it was an incredible salary for such a young fellow, and am still very grateful for it, and still think it’s a privilege. At that time I remember talking to a friend about a person we both knew, and that they were earning around ten thousand a month. I remember thinking that this amount of money is unachievable to earn, and I would have no clue how to spend 120k a year. And then my friend said: “Wait for it. Once you earn this amount of money, you’ll have a clear need and understanding how to spend it.”

I won’t say how much I earn now, but I will say that these days I have a very long list of ideas how to spend not only 120k, but many millions. I don’t think I have clear enough ideas, so that’s why nobody has given me such money just yet.

I do know that there is, and there should be, enough of an amount that a person can spend on themself and their family to have an incredible level of comfort and leisure. And oh boy, I believe it’s way low 120k. I’m very grateful for all the folks in the FIRE community that showed all of us that lots of middle-class-western-society people swim in a thick fatty layer of the financial soup, and more good can be achieved with less money.

There is such thing as enough. And you don’t need that fancy 3500 USD touring bicycle with a steel folding frame, Pinion gearbox and a carbon drive belt you’ve been wishing for so many christmases already. Learn how to maintain a gear casette and a good-old metal chain instead.

Meeting famous people

2019-04-24

I had a few moments in life when I met a person that I used to see only on video. I wanted to say “on TV”, but that doesn’t fit the modern context. Who are these people? Musicians, speakers, engineers. Most of them are among best pros in their industry, so there’s a lot to learn from them.

I’m not looking forward to meet such people. I have no idea what I should ask them. Usually you have to be at a very advanced level of skill to be able to ask an interesting question. They most likely are very popular, so meeting a new person might be more of a uncomfortable burden rather than an interesting event, so I don’t want them to feel bad.

I think it’s totally fine if you don’t know what to ask a president when you meet them in real life.

Priorities 101

2019-04-23

Think of something on your to-do list that has been there for a while. You don’t look forward to tackle it. It feels like a burden. You have other several things that you’d rather be doing instead of it. This thing gives you a bit of anxiety. You don’t know how long it’s going to take you to finish it. Today was a sunny day, and you were sitting on a curb eating two scoops of nice icecream after lunch, and this thing from your to-do list popped up in your mind and spoiled the entire moment. You’d even go for a grueling workout, or perhaps tidy up your apartment, or finally meditate because you’ve been busy since a few weeks and you we’ve been putting off mindfulness for later. You would do anything and everything except that dreaded thing on your list.

Well, congrats, because obviously that’s the number one thing you ought to be doing now.

I finally saw Norma Jean

2019-04-23

No, not the actress. I’m slowly going through the list of music bands I wanted to see live in my teens, and today I crossed off Norma Jean from the list.

Great small club, friendly crowd and overflowing amount of noise. The guys are just pros — started and finished with the same level of energy and power. One of these bands that sound like no one else.

Great show!

Looking for a mentee

2019-04-21

Update 2019-06-02: I have closed the proposal for now.

I’m looking for a mentee. I’d like to help a person move forward career wise.

My name is Misha, and I’m a programmer. I used to work on Wunderlist for iOS, then landed at Microsoft, and now I’m doing my programming and managing duties at Pitch — a startup which I was very lucky to cofound with my friends. My biggest strengths are frontend work, product design and implementation, and I try to listen people with all of my attention.

So far I’ve helped at least four of my close friends, and all of them are excellent professionals and doing phenomenally well. This makes me incredibly happy. You can ask me about details in person.

Requirements:

We will be discussing your plans, perhaps dreams and ambitions; we will be structuring your learning path; we will be reviewing your work; we will be preparing for interviews; we will be making sure the least amount of effort brings results; I will be answering your questions, no matter how seemingly silly they are.

I can’t promise a lot, perhaps just a few of my hours in a month. I’ve seen it work very well.

And I won’t charge you a dime — it’s all free.

If you’re interested, send me an introductory email to hello@mkarp.co. And please share this link with your friends who might be interested!

Thoughts on testing UI

2019-04-20

Several years ago a colleague introduced me to a talk by J. B. Rainsberger called “Integrated tests are a scam”. I really like and resonate with the ideas presented in this talk. The dependencies should be isolated and pushed outwards the system one’s working on. In ideal scenario, everything inside the small world (system) one has control of is covered with a robust yet flexible set of isolated tests. External dependencies provide various uncontrollable inputs, which one’s system needs to consume gracefully and with lots of forgiveness (think of the worst case scenarios — an html parser, or some fresh software that works with a decades old legacy system).

Yes, but then I’m confused if this advice is applicable when we’re talking about UI-heavy applications which I tend to work on in the recent years. For me, the most dreadful scenario is logging a user into the app. User opens the app, and is presented with a plethora of choices to sign up (three social media buttons plus a good old email-password combination), and then… well, then follows a huge tree of one-off states and verification steps. “I as a user login with my Google Apps for Work account, and if I’ve logged in previously, but my employer in the meanwhile has signed our company for a team account, then I’m presented with an option to choose either a private workspace or my team’s workspace.” Things like that.

It’s entirely possible to spec this whole process out with isolated unit tests. But in the end it doesn’t give me any real confidence. Because in the end everything that matters is what user sees on the screen, and how do you test that?

In ideal world, I want a single command that would launch a dozen of parallel UI tests that would go through every single one of the login scenarios, with every deviation on every step, and would record at a minimum a slide show of what user has seen on every step. Then I want to see a huge gallery of screenshots to be able to assess with a human eye how did it all go.

Making changes to others' code

2019-04-19

In a company of a friend, it’s usually better to listen more and talk less. The same I’ve noticed around the code: when trying to fix or improve someone else’s code, it’s better to read more and write less.

Most of the times I find that the less the changes I introduce to fix a bug, the more I understand and know the codebase. Understanding and knowing are different: knowing means you’ve read the codebase in breadth and you roughly remember the modules’ contents; understanding is when you know how modules work and why they are built in a certain way.

Introducing too many changes to fix or improve the code that someone else has written (even in a separate module), is often similar to disregarding that person’s opinion in a patronizing way. Making small changes is similar to either agreeing with the speaker and adding another related short idea on top of what they’ve just said, or making a short polite correction to their speech.

Code authors might be secure and confident in themselves, so rewriting their code might not be perceived as an insult. However rewriting ideas and past learnings doesn’t seen to be welcomed ever. Rightfully so. Ideas need to be defended and compared, and an implemented idea is usually better than the one that needs to be implemented. Rewriting past learnings is most of the times foolish, and if undertaken then should be done very carefully and tested thoroughly before shipping.

It’s always better to talk to the author before making changes to their code.

hard-wrap

2019-04-18

Another indispensable item in a programmer’s toolbox is a hard wrapping editor plugin. I’m using hard-wrap for Atom. The problem it solves is reformatting a set of lines to not go beyond a wrap guide. Mine wrap guide is set to 80 characters, and it was always painful to readjust the comments and docstrings for them not to go beyond this guide. With this plugin it’s just a stroke of a hotkey.

Sunglasses are considered harmful

2019-04-17

A few days ago I was in a park, and somebody came to me and very politely recommended me to take off my sunglasses. I got immediately prepared for an argument, because it is a strange recommendation, and I thought I did nothing wrong. Why would anyone think wearing sunglasses is inappropriate?! But then the person explained that during that time of the day (around 10am) it’s beneficial for my circadian rhythm if my eyes are exposed to the blue light.

It turns out somebody even got a Nobel Prize for this discovery.

Thank you, stranger! Though I will still wear my glasses when cycling for safety reasons.

Age and blossom

2019-04-16

I’m lately thinking about the value of time. How much will I be wanting to get back to my thirties when I’m in my forties?

These days I’m sort of regretting the time I’ve pointlessly spent in my university years (not necessarily for the actual studies but all of the time in between). I think I’ll be regretting the time pointlessly spent in my thirties when I’ll be in my forties. I’m expecting myself to feel sorry that I didn’t enjoy enough sun, fresh air, nice mornings, smiles and romance while my body is in its prime time. Or maybe I won’t regret, and the life becomes more enjoyable the older you get, apart from all of the pain here and there.

To play on that fairly sad note, I’m waiting for tree blossom every year, and every year I’m paying more and more attention to it. But I can’t understand how can I get enough of it: I look at it, and I want to be full of looking at it so that I have a nice memory, but it feels like it goes in and out — it doesn’t stick. And then I can’t get enough of looking at the blossom. “The eye never has enough of seeing.”

Stack Overflow Survey 2019

2019-04-15

Stack Overflow published their Developer Survey for 2019, and among all (yay, Clojure devs earn the most on average!) of the questions this one caught my attention. How come >81% of Chinese and >80% Ukrainian participants believe that future people will live much better, but there are only >56% of German participants who answered this question positively? Have you seen France?

Is it because when everything is great, a person becomes even more demanding, more picky and starts to pay attention to smaller problems? Like, a person who receives just 50€ a month won’t even bother thinking about holes on the driveway, and they perhaps think that only if they get 500€ a month then the life would become easy, and thus they just dream that their child would earn more than that. That’s totally possible, so they are optimistic about the future. Money do solve problems in similar scenarios.

Or is it because when everything is great then a person starts to pay attention to bigger problems that are not trivial to solve (climate change, wars, economies, identity issues etc.) and starts to fear them? These problems are difficult to solve, thus they become pessimistic. Should we then follow the good old “the less you know, the better you sleep” translated-from-Russian proverb?

In case you wonder, I’m full of opinions and spent just 20 minutes writing this note.

Semi-horizontal dropout rant

2019-04-14

Ok, the least user friendly bicycle rear dropout are the semi-horizontal ones. If there’s a fender installed, and a touring tire, then it’s fiddly to take the wheel out. When putting the wheel back, it’s tricky to make sure it’s centered and has the right position in the dropout. And then the derailer tries to push the wheel to the front, so while you’re centering the wheel it might just pop out, and the gripping washer can easily damage the paint in the dropouts. So many things can go wrong.

Vertical dropouts are much easier: put the wheel in, tighten the axle bolt and you’re done. The wheel is either sitting in place, or it’s not. Easy.

One too many

2019-04-13

Based on YouTube’s view counts, anything related to the minimalism of posessions, living out of a suitcase, micro apartments, living space hacks etc. etc. etc. is very popular. I don’t think many people apply the learnings (based on the judgement of my own self, ofcourse), so I wonder why they are popular.

Is it that people have less space these days? Or they want to have less space? Or they perhaps want to travel all the time? Or is it just a craving for being entertained with neat ideas and watching others do something interesting?

Watching (or reading) people solve logic riddles makes me feel smarter. Let me not be fouled by it.

It’s a great time to be alive — people can have less posessions without compromises in their lifestyle. Rent, share, temporarily buy and sell, enjoy access to a variety of relatively cheap high-quality products.

What can you throw away (or better sell) tomorrow? I have one bicycle too many.

No shame in easy explanations

2019-04-12

I have this ingrained belief that every thing and experience can be good (real, worthy, deep, of a high quality) and cheap. As an example, take a thermos, or a cover of a song. There are real thermoses that feel like a high quality thing when you hold it in your hand (it’s heavy, it feels robust, the quality of production is great, it’s meant to serve for many years), and there are cheap ones that are planned to be replaced within a short time. There are great covers for which an artist has added their personal touch, rehearsed a lot, and shows their best skills, versus a fellow that is not interested in growing as a musician.

So I’ve been applying for a long time the same approach to learning. Want to learn calculus? Take the foundational century-old five-volume work of a great mathematician, force-feed its dry formal explanations into your conscience, and try to pretend like you’re smart enough to understand. Want to learn programming? Start with Stroustrup, then to The Gang of Four, and perhaps proceed with “The Art of Computer Programming.”

I would try, and try, and try, and shame myself for falling asleep in trying to detangle unfamiliar abstractions from these smart books. What I’ve figured out, is that I wasn’t driven by the desire to learn a subject. Instead, it was my inner pride of “I’m smart and I can do it” motives, plus the fear of being judged by others of not knowing a subject for reals (appearing like that cheap thermos), that were driving me to go to these sources.

So I gave up on thinking that I’m good enough, and these days I don’t shy to learn from a teenager using nyan cat examples in her YouTube video tutorials. It turns out others don’t care about me, and I am learning new things.

Gifs at work

2019-04-11

One way to dramatically improve your communication with your team is to start sending screen recording gifs. A picture is worth a thousand words, and if you have a keyframe animation on your hands, it’s worth number-of-keyframe times more.

When there’s a bug to report, a new thing you’d like to show off, a question that you want to ask about something you see but you don’t know what the names are of all the things you see — just record a short gif and send it out. It speeds up communication, makes it more effective, saves time for everyone, and it’s a ton of fun to use.

You can even brag to your teenage kids (or friends?) that you get to play with gifs all day at work.

If you’re using macOS, I can strongly recommend Gifox.

Why does letting go work

2019-04-10

Did you ever wonder why the notion of letting go of control works for people? Why do we struggle, hold to our fears and foundations, suffer from that, and only then discover that we can change our thinking and feelings about something seemingly important, which in fact is not that important at all?

You may have experienced this feeling in your life. For me, the biggest transitions happened when I understood that I can’t change other people, nor satisfy their real deepest needs, especially for the closest people I have in my life; whenI understood that I’m not going to become a swimsuit model with a beautiful smile; when I understood that I’m also going to get old, if God’s will; when I donated more money than was left in the account; when I quit my seemingly secure job to start a new company.

The question I’d like to put in your mind today is why there’s such a mechanism inside us that makes our spirit bigger and mind calmer when we release a stronghold or take a risk. Why does it work?

No mathematical fact is an island.

Perhaps, most of the things we do today is some manifestations of wanting to be in control? Manifestations of us pretending we know what we do?

In other news, sadly I missed Clojure Berlin today, but I had a pretty rad run today.

Santucci Cycles

2019-04-09

If you’re in Germany and you will ever want to get a nice bicycle, look no further than Santucci Cycles. Dan is an amazing mechanic. And he has an excellent taste for the right bicycle looks. And he is a very nice and friendly person. And he explains every single little thing if you’re interested. And reasonable prices. And his store is a good point of reference for elegant components. Seriously, just look no further.

Check out how good his works are:

Foundations — check!

2019-04-08

In the last few years I was very interested in everything related to personal finance, zero waste, diets, sleep and exercise. I think these are the foundations of human existence. I thought these topics might be worth teaching at schools, but unfortunately opinions on them change too often, so I don’t think formal education system can keep up with the fads.

These topics are magnets for polarizing opinions, neverending heated discussions (aka holy wars), herds of social media influencers and centuries worth of YouTube videos. Same as with productivity hacks and equipment, code editors, raising a child etc. It just doesn’t feel like we’re going anywhere.

I’m getting tired of thinking and talking about these topics. I’d like to stop pretending I’m rational and would like to admit I know little to nothing. I’d like to wrap this chapter in my life with a set of rules of thumb that I’ll dumbly use to guide myself in the future. I’ll start to assemble a list.

I wish I would be finished with these years ago.

Good music is great ideas

2019-04-07

I was talking to a friend the other day about music and bands and all of this. When they asked what genre is my favorite, I told him my previously coined answer that I follow artists and bands rather than genres. And then I finally could answer why. You know these moments when something smart flies out of your mouth accidentally? Right, so that was one of these moments. I said that not all of the musicians within a genre have original ideas.

It was all about ideas all of these years! How couldn’t I see it before? Good composition, lyrics, arrangements — everything are just ideas that are well executed.

Now I have a bit more of a story to tell. I’m happy that I finally understood it. I wanted to write a story about someone I know doing a funny thing all the time, but I won’t. Man, it’s so liberating to not let yourself say stupid things.

Lil Peep

2019-04-06

I was going through Lil Peep’s videos, and it seems like he (they?) wanted to show that this smartphone addictiveness thing is like this honest way to represent reality. I see it as part of the story: accept that you’re not perfect, don’t hide, don’t lie to yourself, stop trying to be the best version of yourself, and it’s not going to be better any way.

We had emo in the early 2000s, and the message was similar, except it was mostly about crying in your bathroom rather than onboarding heavy substances.

Lil Peep’s music is very cool. It’s sad that he went away.

I’m thinking of going to see Norma Jean in two weeks, anyone wants to join?

Make fun of myself

2019-04-05

I was always very ashamed when people would joke about things that I hold dear to my heart. The oldest memory I have is when I was seven and I was very intimidated if anyone was in the room while the theme song from Teenage Mutant Ninja Turtles was playing. I just loved the song, and still do. I wanted to sing and dance every time I hear it. But if anyone was in the room, I would turn red and hope that intro would end as soon as possible.

Then at some point I saw other people make fun of themselves, and saw how easy they would handle when others make fun of them. They would appear so confident, mature and secure.

One other thing that I’ve learnt about myself is that the things, hobbies, beliefs and even strongholds come and go every couple of years. I loved to listen to metal ten years ago, and didn’t even consider hip-hop listenable. Now I listen to weird rappers from SoundCloud. Go check out Lil Xan. Everyone seems to have face tats these days. Cool.

Making fun of myself prepares me to handle situations when someone, intentionally or not, makes fun of something that I like. This has a great side-effect: I tend to care less about what others think and say.

But it also helps me not to take myself too serious. Cause only a boring luddite would write on his homy corner of the internet every day, right? Look at him: interested in all the fads and trying to be a writer.

Apps and their settings screens

2019-04-04

I often try to assess my impressions of various software products. There’s this feeling, which I’ve noticed among myself and others, that some apps just don’t appear to be a “great app.” I don’t yet have a clear answer of what makes an app a great app.

One thing that I noticed is that often it’s the settings screen of an app that will make it or break it. If it’s an application for macOS, iOS or Windows, then the settings screen is almost obligated to have a look and feel of the system’s Settings (Control Panel) screen. Also, the amount of settings usually depends on how well the product team did its job, and if it found the sweet spot of glorious defaults that work for almost everyone. I didn’t list Android, Linux or any web apps because I don’t think there’s a consistent look’n’feel for these — things change too often on that front, in my opinion.

Settings screens should be purely utilitarian ones. They need to be descriptive just enough. They shouldn’t be magnets for UX innovation, unless the product is a completely new thing. A bunch of tabs, checkboxes and drop downs is all we need.

If you work on apps, please, please don’t create a custom settings screen.

Ultimate peace

2019-04-03

Today I was listening to a very inspiring podcast episode on Mad Fientist. The story is about a fellow who went underwater with his money and in general with him becoming a responsible human being, and then how he changed it all basically overnight.

The whole story is great, but where it really got me to the wow point was when the guest mentioned arriving at the feeling of peace, which was a completely new feeling for him.

I don’t know if I’ve experienced something like this. I hopefully did a few times in my life. I doubt that it’s entirely impossible to achieve this state of inner being without becoming financially independent, though in this podcast they’ve agreed it would not be possible for both of them. See, if this feeling would depend only on money, then it’s a very fragile situation to be in. Perhaps it’s much less volatile in the USA. But I’ve seen people loosing money in no time. Governments change, wars happen, robbers rob — this all happened within my country of origin and my family not so long ago.

My quest is to find an understanding of an ultimate way of being content. It needs to make sense. It needs to be independent of modern social constructs and economy. Basically like math, but for the soul. It needs to connect all of the dots in my head.

Convervative to yourself

2019-04-02

It’s a bit of a piggieback thought from this one.

When you have a preference, what do you do when someone else violates it? Imagine you’re a vegan that’ll be hosting a dinner party tonight, and a friend brings another friend that you meet for the first time, and they brought a normal cheesecake. It’s beautiful, most of your friends wouldn’t mind having a piece, but your mind is shocked of having something that contains milk in it for the first time in years. Do you then take a stand for animal rights and latest pro-veganism scientific research and not let it go on the table? Or you swallow the tide of arguments rising in your mind and say a forced “that’s so kind of you”? When and how do you make sure that this friend of a friend knows foods like this are not welcomed here? How do you make sure this won’t happen again?

Yes, I’ve been in this situation on the both sides more than once. And again, having a preference might result in a weakness (of having less social acceptance) if not handled correctly.

My goto strategy is the “be conservative to yourself and loyal to others rule.” Works 142% of the time.

💛 BVG

2019-04-01

So today there will be happening a whole day strike for BVG, one of two public transport companies in Berlin. I’ve been cycling today in the morning, and I had two observations:

  1. There are a lot of traffic jams around the city.
  2. The amount of cyclist I’ve seen is probably three times as many as on a usual day.

So I’d like to say a big thank you to all of the workers of BVG. First of all, the quality of your service is incredible. And then today’s strike showed all of us how this city can be changed for the better. For at least one day.

Senior engineers and their agendas

2019-03-31

I’ve worked with many experienced engineers before. One trait I’ve seen they all share is that they have a set of preferences that were build up over the years. People prefer different approaches, technologies, working styles, languages — you name it. Some of these preferences are based on previous experiences, and some are just biases (but everyone listens to them more because they are coming from an experienced person — aka an argument from authority).

A mistake that I’ve seen these very experienced coworkers of mine do is to express their very polarized opinions in a loud manner, bringing down the camp with an opposite opinion. I think this is a mistake, because often members of the other camp work with them on the team.

What I’ve seen working very well is to stay mild but persistent about pushing one’s own hidden agenda. See, if a person bases their judgement on valid experiences, then I think it might be a good strategy to follow it. There are many valid ways to build software. However, if the team doesn’t feel compelled to follow the proposed way (for example, it’s too much against the main stream, too exotic, or they just don’t like the leader), then it would be a mistake to make the team follow that judgement because of the potentially lower team morale.

I think that experienced people need to put more effort into making sure their peers really want to follow their suggestions. One has to build relationships for that. One has to be interested in the people on their team as much, or perhaps even more, as they are interested in their agenda. One has to build trust by supporting others and being friendly to them; taking responsibility in critical situations; constructing the work in a way that the team, the product and the agenda can move forward altogether.

The most immature thing to do is to put less experienced people down with excellent arguments, make fun (or even protesting) of the popular opinions or decisions, and pay attention to only one’s own problems.

Empathy comes from relationships

2019-03-30

So you’ve might have heard people talking about diversity on your social media feed. So did I. It all appears to be a very important issue. However, when you talk about facts and numbers, my brain gets it, but my emotional substance, aka heart, doesn’t get it. As feelings is a huge player in our decision-making game, I think it’s important to make sure we feel the importance too.

I never understood what’s so difficult in being a woman in the tech industry, until my wife entered the profession. Just by observing her work and learn, and talking about different things that happen at her office, I totally started to understand how weird we often might behave.

I never understood what’s so difficult in being an asian or african woman in the tech industry, until talking to my asian and african female friends. Only after that, making sure I listened carefully, I finally understood how and why I can and need to improve my behavior.

As usual, I don’t think putting a label on a person helps. What helps is befriending such people and making all of the labels materialize in your life as faces of your friends. And how and why can you get such friends? Well, I do have an answer for you, but you won’t like it.

Preference is weakness

2019-03-29

I suggest you to entertain an idea to think about preferences as weaknesses. For example, these are all preferences: following a strict vegan diet; wearing a neon-green mohawk; using a very custom shell configuration; practicing a strict and unusual sleep schedule (like polynomic sleet); taking a shower every day etc etc etc.

All of these things have their benefits: lower environmental impact, ethical eating, self-expression, productivity increase, health improvements, more time, being less smelly.

What I would like to explicitly point out is that every preference we build up in our lives leads to less opportunity to enjoy life. When one has a taste for good wine, being served a glass of a cheap something, that remotely reminds a fermented juice, the evening might become very gloomy. If one is having an unusual sleep schedule and strictly omits carbs, then how would they go out for movies with friends, oh and indulge in some caramelized popcorn?

So you’ve guessed it right: the most ultimate way to maximize enjoyment in life is to starve yourself by laying naked under a rock for a week. Even wearing underwear would feel special afterwards! Yeah, make your choices (and judgements) wisely.

I like to have preferences. What I’ve seen working very well is to keep them secret. My grandma doesn’t need to know that I’m (mostly) vegan. When I visit her, she serves me an amazing dinner, made with love and thinking of me, and it is fish and potatoes. I pay respect to my grandma, and ask how she’s doing, or perhaps ask her to re-tell me that story from her childhood in a 42nd time. I don’t try to find excuses how not to eat that poor fish, and even don’t take out my phone to present her with the excerpts from the latest cancer research articles. Yes, indulging in meat is bad, and this fish probably has some unhealthy chemicals in it. But I’d rather cherish the moment with her, and leave the debates to the moment when I’m with someone I don’t like as much. And at home you won’t ever see me eating fish.

The example is not real. I’m not a vegan, neither I’ve seen my grandma for a while, but I do love my grandma and have some imagination, and I think you get the point.

Much love for cycling

2019-03-28

My social media bubble circle is getting full of nice cycling videos, mostly from Netherlands. Here’s a nice video which shows how people transport all the stuff you can imagine, from their brittle bodies (and no helmets!) to sofas and ovens. I have a need of transporting a table once, and I seriously considered renting out one of these huge cargo bicycles.

Just three tweets down I saw this article from Forbes regarding lowering the sales tax for bicycles. Great initiative.

It’s difficult to break the system, but I hope we can motivate more people to get rid of their cars, move closer to their work, and get cycling. I believe that cycling culture is a system that has little to no unwanted side-effects.

I’m also looking forward for clothing brands to start producing more sports clothes that look casual and stylish. It’s difficult to find clothes that fit an active cycling lifestyle and that don’t look like you just came from a racing track.

Oh, and a special request to folks at Twitter: can you please tune the feed algorithm to keep feeding me with with goodness? Cheers!

Fear of China

2019-03-27

I’m thinking more about various bits and pieces of information regarding how education and technology firms are organized in China.

Last year there was an article by Sir Michael Moritz about work ethics in Chinese tech companies. One of the most memorable (for me) observations from this article was this notion of a “9-9-6” culture (I hope I’m getting it right because I don’t have an access to the original article anymore): workers start working at 9am, work until 9pm, and do it 6 days a week.

I’ve talked to a Chinese friend of mine, and they mentioned how their high school schedule was structured: they usually would study on campus 5 days a week, every day from morning till 9pm or 10pm, then study a bit on Saturday and visit their family in the afternoon, and then go back to campus on Sunday evening to have an exam. This all sounds pretty much bizarre to someone even from a post-USSR country like myself.

On top of all of that, I’m not sure how much western world is bounding itself by its culture and ethics; if it’s good or not for the human progress; because it seems like Chinese government is less hampered.

It’s also obvious to me that I have little to no clue about the situation. I should probably read less news. One thing that I feel is fear that such pace will make the rest of the world irrelevant at some point.

It’s also easy to discard the idea of being required to study or work for 14 hours a day as unsustainable. I feel like in the western world, the idea of work-life balance is pretty much accepted as a norm. I’ve been listening to “Thinking in Systems” by Donella H. Meadows, and one thing stood out to me: the notion of a stock in every system. The easiest example of it is a filled bathtub: there’s an inflow and an outflow of water; if they are equal then bathtub will remain filled at the same level at all times, leading to a dynamic equilibrium; if they are unbalanced, then it would either lead to an overflowing or an empty bathtub. So naturally every system, that we want to keep full of stock, should have a sufficient inflow and a fair outflow of things, energy etc. If I think of the human mental health and will power as a stock, shouldn’t it also be refilled and consumed in a sustainable manner? What is sustainable? Perhaps we just became too undertrained and lazy?

Never cleaning my ~/Desktop

2019-03-26

I love that screenshots land by default in the ~/Desktop folder on macOS. A friend showed me once their Desktop folder, and it had all of the screenshots for the several past years. My friend has never cleaned this folder. What they ended up having is a sort of a timeline of their work and life events. There was a screenshot with an achievement, another screenshot of a nice email from a special person, of a joke, and of some funny customer support email.

I’ve borrowed this approach of not cleaning the Desktop folder and use it ever since. I also disabled showing the documents on the desktop, so my desktop looks neat.

I’ve also set up the gif recorder I use to put the recordings on the desktop.

It’s awesome to indulge in some nostalgia once in a while and go through the past memories.

The private email experiment

2019-03-25

But his emails!

I’ve been trying to use email and phone calls recently a bit more than I would do previously. It works out to be interesting so far. I have several people with whom I exchange emails once in a while. We share some recent news, updates and ideas. It’s like writing short blog posts but just for a single friend.

What I really like is that we can take days to respond to these private emails without offending each other. There’s no expectation for a quick reply.

Today I’ve met with one of such friends for a coffee, and it was a nice segue from a digital conversation to a usual one. We kept talking about various topics, and it was still very interesting for me to hear the details. I knew the highlights of what my friend was talking about, and the details provoked more questions from my side. I didn’t feel like we were disconnected at all for the time we haven’t seen each other.

I’ll continue the private email experiment.

Laughter generation in Clojure

2019-03-24

My kid comes to me every second day and asks if we can play with some Clojure on the computer. We were bored today, which is awesome in a way, and he asked me to show some stuff I do at work, so I launced a REPL and we began iteratively develop a dumb phrase generator:

user=> (def people ["Mom" "Dad" "Mr. Stinky Feet" "Captain Underpants"])
#'user/people

user=> (def actions ["smelled" "ate" "threw away" "kicked"])
#'user/actions

user=> (def items ["toilet" "cheese" "tomatoes" "poop"])
#'user/items

user=> (defn rand-el [xs] (get xs (int (rand (count xs)))))
#'user/rand-el

user=> (defn laugh! [] (clojure.string/join " " (list (rand-el people) (rand-el actions) (rand-el items))))
#'user/laugh!

user=> (laugh!)
"Mr. Stinky Feet threw away tomatoes"

user=> (laugh!)
"Captain Underpants smelled cheese"

You can see that laugh! is not a pure function, which is fine considering the context, and that it doesn’t have any side-effects. Yet there’s still an exclamantion mark in its name (in Clojure it’s common that exclamation mark is present in functions that deal with mutable state). The exclamation mark is there because this function has generated, independently of its output, so much sincere giggly laughter from my kid that I consider it now very, very side-effectful.

My kid wouldn’t wait for too long if he wouldn’t see the result on the screen. I appreciate having an quick interactive prototyping environment. Obviously it’s not all unique to Clojure, so you can go and play in your own computerized sandbox of choice. And if you wonder, mine’s still better, and green is the best color.

By the way, we did this all using the all-new shiny Replete 2.0 REPL. Can definitely recommend it if you’re in these kind of things. Congrats Mike and Roman on the release!

On learning vim

2019-03-23

I’m thinking of switching to vim for my day-to-day work. I’m trying to gradually prepare myself for the transition. First, I’m writing this blog using vim. There’s little to no structured editing involved in it, which is the main difference between writing freeform text and code, but it’s still useful to build the basic habits. Then I’m using vim for a few experimental projects. They don’t go as fast as they would go if I used a familiar editor, but the main point is learning, and so I learn at least an editor.

It’s definitely a good advice not to learn a new programming language and a new editor at the same time. When learning either of these I feel completely lost in the very beginning. It’s very comforting to have something familiar in the process so the brain can hold onto it. Otherwise the new environment becomes so unfamiliar, that my brain declares it’s actually hostile, and thus I should flee… to check what’s on the Hacker News today.

I also made a curry today, and I’m very happy with the outcome.

Wrist bruises

2019-03-22

I did some exercises with a kettlebell yesterday. The more I use it the more I fall in love with it. I don’t know what it is exactly, but the challenge of using it brings me excitement, unlike with pull-ups, dumbbell squats or lunges — I hate these with everything in me (which most likely means they are exactly the exercises I should be doing the most, duh).

Just today I woke up and I’ve noticed horrible bruises on the outer side of my wrists. What’s even more weird is that they don’t look like a usual bruise, more like a burn. Obviously they have a bit of a bittersweet aspect: unpleasant signs of small accomplishments.

I’ll be reading how to use a kettlebell properly over the weekend.

1-1s

2019-03-21

I’ve been reading today a guide how to do successful one-on-one meetings with team members. The main purposes are: to build a relationship, to align with the team’s values and to offer support. I think this makes sense, and I appreciate that somebody gave it a structure.

The point which I feel is missing in lots of the leadership mumbo-jumbo (I like to call it this way because we take it too serious) is that a person should simply care about another person. You can internalize every book and tweet from John Maxwell (which is good, don’t read what I’m not saying), but if you don’t care about a person — it all can burn in a glorious blue fire of the infinite Russian gas, because none of it matters.

So how do you start caring about a person? I don’t know. Think of it, and perhaps try being a nice human first. Try thinking about the person not as an IC or FTE, but as a friendly soul captured inside another collection of flesh and bones. Keep it down to earth, simple, relatable, and people will open up.

Definitely get rid of your hidden agenda. And if do need to keep it, ask yourself why I have something to hide.

In other news, my fitness game goes strong since last week.

New old Thinkpads

2019-03-20

Apparently I’m late to the game, and there are a few Chinese modders that sell custom motherboards with modern parts for older Thinkpads, like X61 or X220. I don’t know why, but both models just appear to be very attractive to me, so bringing some good performance (‘cause man needs his Electron apps) into these classic bodies sounds very tempting. I still don’t get how people order these boards, and how does one live with a fear that their computer might catch fire at anytime. But this commitment to sharpen great tools, and the fact that there’s demand for them, is awesome. Talk about zero-waste!

Here’s an article on an English speaking website.

I’ve run 10k yesterday. This time it was very slow — 54 min.

Most difficult things about zero waste

2019-03-19

It seems like zero waste becomes mainstream. How do I know? I check what youtubers with more than 100k+ subs are up to, and then make my judgement.

I remember when I was a kid and my grandma used to wash and then hang to dry plastic bags that she got at a market together with the produce. I thought this was ridiculous. It somehow felt that this is a thing what poor people in small towns do, and I saw myself as a smart boy from a big city. Sure. Yet a few years later I find myself instinctively doing almost the same. I mean, I don’t exactly wash the bags, but I now think it’s not that bad of an idea. My grandma gave me a positive example.

I like reusing things in general. Some things are suited for frequent reuse, like a kitchen knife, some are not suitable for it at all, like a plastic knife you get at a fastfood diner. You can reuse a plastic knife, but it will break very soon. Same with the plastic bags — they are just made to last two or three usage cycles, and that’s it.

The most difficult things in becoming a zero waste grocery shopper:

It’s also helpful to not try going zero waste on day one. Gradual change is more sustainable.

Choices that don't hurt

2019-03-18

I love to plan my days. Every day that I start slow and planned out usually turns out to be great. It helps me making the right choices throughout the day. It’s one of the most difficult part of life when you have plethora of choices (which is a privilege and is awesome) — to make the right decisions, the ones that don’t hurt you. The most trivial examples are to skip a piece of cake at a friend’s birthday; not to indulge with food which the fridge is full off; to go earlier to sleep instead of going through the YouTube subcriptions. These won’t hurt you.

Fitness diary is very much up-to-date

Work atmosphere

2019-03-17

I know that some people are put off by other people being overly optimistic. For example, when a manager on a team acts a bit too visionary.

It’s difficult to build a team where there’s a nice atmosphere. But it has to be done. Nobody want to come to an office of disenchanted coworkers.

Cynicism is often what makes people very relatable, especially for people that do the actual job. Cynicism is a manifestation of distrust and pride. I distrust my boss, because they say nice and positive things, but then don’t do anything about what they’ve said in the past; so after a few of similar incidents I start putting everything they say through a distrust filter. If someone from the management team seems to be supportive of my boss, they immediately fall into the bucket named “liars”. Rightfully so, I think. But because I’m the one who does the actual work, and I do my best to deliver on all of my accounts, I become (most likely subconciously) prideful, and start putting myself morally above all of these corporate parasites. Pride is ugly in any shape of form, so that’s a downside.

We tend to hold stronger to our negative experiences. So after working with a bad manager, we become suspicious of all of the future ones.

I think that’s normal. Trust and friendships have to be earned. If you’re building a team, keep doing what you’ve said, and keep being positive. At some point people will see that you’re a real deal.

Hummus improvements

2019-03-16

I think I’ve improved my skills for making hummus today. First of all, I finally have measuring cup and spoons, so I could for the first time follow the recipe precisely. And then I’ve changed the order I blend the ingredients. Previously, I would first deal with the chickpeas, and only when they turn into paste I would add the rest of the ingredients. Today I’ve tried blending everything except chickpeas first, until it becomes a smooth creamy paste, and then add small portions of chickpeas together with some water. It turned out much more organized and way, way more tastier. Thank you, internet!

Oh, and I visited a friend today and tried their vegan chili. Now I don’t even know if I can call a “chili” that bean dish thing I cook once in a while. Man, there are great cooks out there.

I was also watching a few of Gordon Ramsay shows yesterday, and now I’m upset because I can’t get my time back.

Show me your *

2019-03-15

No, I won’t ask you to show me anything right now.

In Russian there’s a saying (pardon for the one-to-one blunt translation):

Show me your friends, and I will tell you who you are.

This observation of life is used by tech companies for some years already. We can also come up with some modern age variations of this saying:

Well, it’s obvious that anything we do with computers reveals something about us. I just like how it plays together with the old saying.

Cursor in Terminal

2019-03-14

I’m observing my perception of responsiveness of applications. For example, I unconsciously think that a GUI programming editor like Atom or alike is more responsive than command line. Responsive is a vague term, I know. In other words, command line would always appear to me as a rather old and rigid input field.

Today I’ve tried a simple trick: making cursor in the Terminal behave the same as in Atom. That is, a thin line that blinks. Previously it was a block that doesn’t blink.

I was so surprised that it changed my perception dramatically! Now the Terminal window doesn’t appear to be hostile/slower/unusual at all.

Old habits never go away. I’m still looking for a ten-key-less split mechanical keyboard with a proper fn row.

Moving points with merge-with

2019-03-13

I saw an example of doing a move operation on a set of points using merge-with in Clojure the other day.

Say, you have a triangle in a 2D space, represented by a list of points:

user=> (def points '({:x 10 :y 10} 
                     {:x 15 :y 17}
                     {:x 25 :y 30}))
#'user/points

And then you’d like to move them all ten ticks to the right:

user=> (map #(merge-with + {:x 10} %) points)
({:x 20, :y 10} {:x 25, :y 17} {:x 35, :y 30})

And that’s it. No loops, no imports of specific modules to deal with geometry, no custom types, function or operators. It’s just the most vanilla Clojure one can possibly imagine. I just can’t get my head around of how elegantly it allowed me to express this idea.

This is the point where I would probably be very excited and eager to learn math during my university years. What other concepts from algebra and geometry are present there in functional programming, just perhaps they are named a bit differently? However, making websites and playing music was more appealingto me back then, so I wasn’t as excited.

This blogpost is dedicated to Martin who promised me to read it the next day at 06:30 in the morning. See, Martin, I wrote it. And yes, I’ve changed the publishing date :)

Automated Twitter reposts

2019-03-12

I finally automated reposting of my blog to Twitter. I’ve used IFTTT. No need to login there anymore!

Testing.

ripgrep in Atom

2019-03-11

A few of my teammates use emacs. To navigate the code, I’ve seen them using ripgrep. It has superpowers to search contents of a project almost instantaneously. The workflow looks like this:

This is so easy, and so handy, that I immediately wanted to use the same approach. I haven’t switched to a proper editor just yet, and still using Atom. Intuitively, I’ve started to use “Find in Files” feature, but it turned out to be much, much slower, both in terms of navigation and search.

Today I had an idea of searching for “ripgrep” in Atom’s plugin repository, and luckily somebody else has already thought about the same problem and has written a plugin for it: atom-fuzzy-grep. I recommend it whole-heartedly. Don’t forget to install ripgrep to get the speed-of-light search.

Interviews with Cal Newport

2019-03-10

I was listening to several interviews with Cal Newport this week. He has published his new book called “Digital Minimalism” last month, and thus he goes on many occasions to publicize the ideas.

One of the ideas I liked was the notion that focus is the new IQ. Doesn’t mean much by itself. I understood it so: for knowledge workers, focus is a competitive advantage. And by focus, as far as I understood, Cal didn’t mean a lazer-like penetrative attention for overachieving one’s goals, opposed to the hustle propaganda. Focus was presented as long spans of uninterrupted attention.

Another idea (or perhaps a fact) was that social media wasn’t designed to be very addicitive in the beginning. What Cal says is that reading a few posts by one’s friends and family doesn’t cause an obsessive urge to check the feed every two and a half minutes. Apparently, people at Facebook needed to boost their numbers before the IPO, so they employed a few research papers with some theory and psychology behind the slot machine industry. After that things like a like button have been added, which feeds on our urge for social approval. Or batching of likes and comments — same as with slot machines, it’s the intermittent positive feedback that causes addiction.

The third idea is something called “digital detox”. I’ve intuitively did something like this last month (ideas do float in the air). Cal suggests going cold turkey on all of the tech stuff for 30 days, unless one needs it for work, and then slowly adding bits and pieces that add real value (social media most likely doesn’t fall in this category). I must say that after doing something like this I do appreciate modern tech conveniences a bit more. It feels magical to be able to go through email for half an hour while waiting for a doctor appointment. Using wireless headphones feels so good.

I probably will end up not reading the book. I’m actually compelled to read Cal’s other book called “Deep Work”. And I definitely recommend listening to the interviews.

Started to collect bicycles

2019-03-09

A friend of mine asked for an advice regarding which bicycle to get for a daily commute and an occasional light tour. I’ve started going through my bookmarks and surfacing my most favorite bicycles on a separate page. I hope somebody finds it useful!

In other bicycle-related news, I’ve finally fixed a problem with my front disc caliper. It turns out that aligning disc brakes in not that easy as they say, but there are a few tricks to make it easier. I found this video from Parktool people to be very helpful. At one point they showed how to use a disc brakes pad spacer. I didn’t have one, so I just folded a piece of paper, and it worked perfectly! It was so satisfying to finally fix the issue.

Better looks for this website?

2019-03-08

Yesterday I’ve asked on Twitter if there’s a designer who’d be willing to donate some time to make this website look prettier. Many of my friends got back to me offering help, which was very surprising, and I appreciate when people are so generous.

So far I’ve been using a few rules for the styling of this website:

I’ve received great feedback over the last several months. Somebody said that they like the roughness of the blog (typos, no fluff, cheap looks and poor story telling, no fact checking etc.) Somebody else said that the website is refreshing with the focus on the content.

Thanks everyone! I still enjoy the exercise of publishing stuff on a daily basis.

Fitness diary is up-to-date.

On learning vim

2019-03-07

After finishing my second year at the university, I’ve done an internship at a software shop. That company got a few interns (including myself) for several weeks, showed us around the building, and then assigned a random task of learning how to use a some sort of an accounting system that they were building. I found it very boring, so instead of doing the assigned duties I’ve unashamingly taught myself basics of using vim. My internship report was very generic and vague, but it was accepted because it was impossible to check my knowledge of that proprietary accounting system.

I think learning how to use vim was one of the best decisions I’ve made in my career. I’m nowhere near being fluent in it, and I’m still building the habits. I’m using vim almost on a daily basis, and it has been a huge productivity enhancer for more than a decade so far. I doubt that learning that accounting software would bring the same benefit.

Yesterday I’ve learnt about :dt (“delete till”) command, and be sure I said “wow” out loud.

Tips on disagreeing

2019-03-06

Disagreements at workplace are difficult to resolve. I’ve discovered several rules to solve that fit my working style.

  1. When there’s a deadline or a need of urgence for a decision, in the situation a leader needs to take charge. It doesn’t matter if the leader is someone from the C-level position or an engineer on the team — the only requirement is that this person is somewhat competent and that they will be responsible for the outcome. The leader in charge needs to listen to the arguments of the disagreeing side. The leader needs to make a decision which path to follow. It’s very important to be honest and explicit about the reasons why certain suggestions weren’t accepted. By the way, discarding and ignoring are different things, and team’s leaders need to spread the culture of not being offended when one’s idea or opinion are reasonably rejected (again, not ignored).

  2. When there’s no deadline, but it’s a discussion of potential work, I suggest still identifying a leader for this work. Then I will try to convince the leader at maximum two times, with all of the politeness, kindly presenting succinct arguments. If after two times my ideas don’t get traction, I let it go.

What I noticed over my last few working years, is that rarely decisions that appear to be very important are being followed in their original shape later on. Facts are easily forgotten within organizations (unfortunately). So if there’s a strong opposition, I’d rather continue working with people who are still my friends, than win an argument which will be likely overridden in a few months. Decisions are often temporary, markets change, yet reputation and friendships are hard to gain.

As always, nothing is an absolute except a few things in life, so use your best judgement.

Skeuomorphism is coming back

2019-03-05

It seems like we’re starting to slowly go out of the flat UI design fashion cycle. I notice that 3D and rich textures are used by designers more often these days to bring some differentiation to their work. I think flat UIs should stay for a bit longer though, iat least until we see first mass market AR devices that target casual usecases. I suppose that low resolution textures should look better with the modern UI trends. As soon as skeuomorphic is back in fashion, AR will have harder time because texture is not only about the colors when in 3D. Materials have roughness and irregularities. Our brains are tunes to perceive something that looks only 98% natural as fake and perhaps even dangerous (“something is wrong with it, it is weird and I don’t know how it will behave, so better stay away from it”). Try looking at renders or movements of human models in any 3D game and you know what I mean. They look unbelievably realistic, yet they are a tid bit different from real humans. That’s the reason why movie companies don’t strive just yet for entirely realistic appearance of their characters, and instead use human models of unrealistic proportions (eyes are too large, no neck, square heads etc). But as soon as AR is settled and the value has been proven (I think it’s a safe bet that it will happen someday), we’ll see a race for performance improvements, and after a few years AR computers will have enough power to render realisticly looking objects. Then skeuomorphism will be back, in all of its glory, until we don’t need it again.

And yes, fitness journal is up to date.

Indian marriage

2019-03-04

I’ve recently learned from a friend about Indian marital traditions. Their family, and all of their social circle, follows the customs of parents choosing a spouse for their child based on considerations of prestige. I felt quite disturbed to hear how it is done. For instance, one may see their soon to be spouse for just an hour before the wedding. And they even have techniques and questionarries to prepare for these moments.

While it’s easy to discard these traditions as archaic, rude, dishonouring to the children, I force myself not to blindly follow modern ways of thought about marriage. Perhaps there might be something good about these traditions that we don’t see anymore because the whole idea in general appears to be bizarre.

One thing, that I’m very very jealous, for sure is the respect and reverance my friend shows to their parents. There’s also a sense of community and feeling of being obliged to their social circle. I often notice after myself that I don’t respect my parents’ opinion on things, thinking that I’m smarter and my sources of information are better, and also I notice that I try not to care of what people will think of me. It is especially easy to do as when one has money in this modern very much technologically developed part of the world, because they can buy food, shelter, health care, transportation, leisure and entertainment, childcare etc. Many of these things might be not achievable without a strong social bond a few centuries ago.

I’m not saying that forcing people into something they don’t want to do is a good idea. I just try not to define what’s good and bad.

Changing disc brake pads

2019-03-03

Today I worked on my bicycle a bit. Thorougly cleaned the drivechain. Fixed the mistake of attaching the crank chain ring in a wrong way. Changed the gear shifting cable. Changed disc brake pads for the front wheel.

The last task became a nasty trip into a rabbithole. To begin with, I’m a complete amateur when it comes to bicycle maintenance. I could adjust my disc brakes (TRP Spyre) with the old, a bit worn out, pads without any issues. However the new pads have a bit thicker layer of the breaking material, and no matter what I did the pad would rub the disc. I spent in total around two hours trying to find a solution, and gave up. I hope that the pads will break in and wear out a little, and then the rubbing will stop.

Taking yesterday’s post into consideration, I should have taken my bicycle into a shop and let a professional do the job, while I should have been working on my programming skills. I feel like I’ve failed on many levels. But I’m not too rational, so I’ll let myself build the desired skill, which I’m not specialized in, through the most effective (for me) way — trial and error.

Today’s resolution is the following: don’t try to do more than one bicycle maintenance task in one day. I think mistakes come when I become tired.

Specialization 101

2019-03-02

I’m thinking a bit about professional specialization lately. According to modern economics 101, specialization is what empowers all of the technological growth and development. Having all the nice things is great. I’m not too old, but I remember how I wished I would have something like a smartphone just 20 years ago. I don’t even mention things like century-old buildings, central heating, concrete roads, airplanes and public transport.

On the other hand, not all of the consequences have been accounted for. Some of us are very distracted; have mental and physical health issues; environmental situation is uncertain.

Most worrying to me is the fact that the more I specialize, the more I have to outsource the basics of my existence: cooking food, taking care of my household, groceries, fixing a bicycle, cleaning my clothes, taking care of my child etc. These are boring necessities of life, which are not necessarily fun to do, but they keep me resourceful. Perhaps it’s an archaic social stereotype that I have, but it’s still somewhat unacceptable to me if a grown up person can’t cook an omelette, even though I resonate with veganism. And with the specialization, it’s detrimental to the societal development to be distracted with food preparation — one rather should be doing whatever they are specialized in.

Somehow it feels like putting the interest of the society before one’s own interest. Sounds scary and honourable at the same time.

Fitness diary is up to date.

On being normal

2019-03-01

One of the revelations I got about myself over time is that it’s ok to admit that I like normal things. Things like when other people say nice things to me, or pop music, or junk food. I trained myself many years to appreciate the alternative stuff (tried not to care what people say, listened to punk rock or metal, tried eating the right foods). I think it was a few manifestations of my ego and pride, and I was happy to let them go. Understanding that I’m normal gave me lots of empathy to others.

Cars in the city

2019-02-28

When I cycle inside the city, where there’s another traffic light every 300 meters or so, I play a small memory game by remembering the cars that drive next to me. Often I would see the same car multiple times when I catch up with it while it stands at a traffic light or in a traffic jam. Sometimes, though less often, a car would catch up with me.

I also noticed several times that I would get to the destination quicker, or as quick, or perhaps a few minutes later than a friend of mine with a car, and we would leave from the same point.

It seems like using a car inside a busy city doesn’t bring that much advantage in terms of speed when comparing to riding a bicycle.

Less work

2019-02-27

One of the most difficult parts of my job is to make sure I’m doing the smallest steps towards an ideal vision of a product while making sure that users benefit from these steps.

Let’s say I have to make an app to order a pizza. It can be infinitely complex with visualizations, menus, ingredients selection, filters and search, description pages, checkout and login experiences, promotions, eye-candy design, social media mumbo-jumbo, delivery notifications, communication between customer and the business etc etc etc.

The most vital question a product designer (or engineer) must repeatedly ask themselves, almost in a mantra-like manner: what is the minimum amount of work I have to do to increase the value proposition?

After being involved in finding a solution to a problem for some time, we get blind spots, and it becomes difficult to further divide our solution. That’s when it’s helpful to involve other people that are not yet bought in our solution.

Doing less work is awesome. You see results quicker. It’s easier to estimate. It’s possible to see the light in the end of the tunnel. It will have less bugs. Everyone is happier with less work.

Confused about diets

2019-02-26

I’ve been consuming lots of information regarding diets in the last few years. I’ve tried high-fat-low-carb, paleo, and during the last year mostly whole food plant based diet with having meat once every one or two months. Doesn’t matter which diet, the wierdest thing is that I don’t feel any significant difference. Mood, focus, cravings, muscle pain, headache, skin, sleep — all is kind of the same. I know one thing that definitely makes me feel worse — sweets. Maybe if I have too much fruit in the morning, I feel not very well in the afternoon. Diet-related information is so polarizing, with contradictory statements between the camps, with “alternative” scientific facts, and thus very confusing. It seems like most of the camps agree that eating too much and too often is detrimental; dark leafy greens are good; sugar and processed foods are bad; diary is bad; mixing fats and carbs is not very good. That’s about it. On top of all of this uncertainty there’s a whole social aspect of the diet, when one has to explain their preferences and dietary beliefs at every social occasion. Honestly, I don’t know what to do.

In other news, the fitness diary is up to date.

Breaking programmer's trust

2019-02-25

I’m happy I get to use ClojureScript at work these days. I have many reasons for being happy about it. I want to talk about one of them: it cares about my work. Yes, I know, this statement is as vague as it gets. Let me explain.

Previously I was using Objective-C and Swift to build iOS applications. I don’t necessarily like any of these languages. I like my work a lot, and I think the best tools are the ones that don’t attract my attention to them but get out of my way and let me focus on my work instead. My work is apps, not languages. I know both languages reasonably well to be effective — that is, to build these apps. I don’t care about using Swift on servers or Linux — I don’t think it’s that valuable in terms of utility, as there are very similar languages that can do the same. I try to approach programming languages from a very utilitarian point. I begin by learning just enough of them to continue the learning process through trial and error while delivering results. I don’t care if it’s statically typed, garbage collected, functional or declarative. The only thing that matters is that it either helps me or distracts me from shipping.

Also, I appreciate language enthusiasts. Language designers are often very creative people, so I enjoy listening to or reading their thoughts for several hours every month.

When Apple released Swift, the promise was ambitious and grand. Modern language, somehow better to work with, cool stuff like passing functions around and such. It all still probably holds. However, why I didn’t care about Swift, and still don’t care, is that Apple didn’t care about solving my problems with it. It’s a break of a relationship, if you please. I immediately felt like I’m being left out, yet I thought I was part of the community that made iOS so significant by bringing great apps to the AppStore. I checked yesterday, and the last version of Wunderlist still has 5.5k ratings with 4.6 stars average in Germany, despite not being updated for almost three years — it’s a great app and people like it. But again, Apple didn’t care about solving my problems. Yes, I know, Apple owes me nothing. It at least has to stay attractive to me. See, the problems I had are not solved with static typing or better syntax. I was making apps, and I needed better tools to make better apps in more efficient ways. I wanted hot reload, I needed faster build times, I looked for better UI testability, I would be happy not to solve codesigning issues in the 100th time. Yet I got something else.

So I had my reasons to be skeptical of the whole Swift’s hype-train, and I also was skeptical of me being skeptical. I like to think that I’m old enough to have had an opportunity seeing how my unshakable work- and programming-related convictions were detrimental to my professional and personal growth, so these days I deliberately decide to stay open to new ideas. Because most likely I don’t understand something. So I jumped on the train and started using Swift. And you know what? Exactly — nothing really changed. I like the new syntax a lot, I think composing functions is great, there’s map and reduce from the standard library, and I like that it is still very practical. However, my working day hasn’t changed much.

Then this whole ClojureScript thing happened to me. Again, I was very skeptical at first, and skeptical of me being skeptical. I tried it, read about it, gave it a try. Then I discovered it pretty much gave me everything I hoped for. I can experiment with the UI in a live fashion. I can interact with a running app right from my editor (and no, hot reload is not the same as having a REPL.) But I also have a glorious hot reload. I write significantly less code. I need less testing because it takes me much less time to fix a mistake. These things were exactly the ones I wanted for developing apps.

So now I’m very happy that I’m in a land when things make more sense to me. I appreciate it when things make sense. ClojureScript hasn’t violated my trust yet. Does it have its flaws? It does. I still think it’s great because it cares about solving my most important problems.

Renting things from the society

2019-02-24

I think I’m quite materialistic. I don’t strive for the latest and greatest, but I identify things that I think I’m lacking in my life, or the things that I already posess and that are not of the level of quality I’d like them to be, and then I start looking for the new (to me) things. Sometimes I would go straight to online retailers, but more often I would set up a search on Kleinanzeigen (Germany’s craigslist), and begin the hunt.

Few years ago I purchased a bicycle from someone who didn’t need it. It wasn’t a great bicycle, but it was something I wanted at that time. I’ve happily ridden it for a few years. When I decided to upgrade, I found a different person who needed it and sold it to them. Looking at this process on a scale of several years, I think of it as if I’ve rented this object from the society.

Being a ukrainian, this process satisfies my ingrained never-ending emotional quest for deals. Somehow being good at finding deals is a virtue in my culture of origin. While I inherently share the feeling, I tend not to get any moral satisfaction from it. In my mind, seeking deals is almost equivalent with being needlessly greedy.

I get moral satisfaction from the fact that a resource is used, either by me or by someone else, it doesn’t loose its value by needlessly occupying space in my basement, and then it is even reused. I get satisfaction from an understanding that I don’t posess an object, but I simply get to use it for a limited period of time. It gives me a feeling of detachment from my posessions. When I don’t need an object, I can give it back to the society. I get satisfaction because this way of consumption is less resource-intensive than buying new things. Ideally this also should bring incentives for the manufacturers to produce higher quality products, that cost more, that last longer and survive many seasons of fashion.

This mind trick is very helpful when one plans to use an object for a limited period of time. Say, there’s a child underway, and a family needs a certain type of stroller for the first six months, and another stroller for the following year. Or one has started training using a kettlebell (like I did), and it’s possible that they will need a heavier one in a few months (like I aspire to) — so there’s no need to order several weights beforehand, because they can simply find the right one for temporary ownership at the time they need it.

Owning right things at the right time means you need less room for storing things. I also usually look for things of higher quality because I’ve experienced that they are more pleasant to use and they break less often.

This whole idea somehow plays well in the sharing economy that is so overhyped in the mainstream news these days. What I don’t like is that participants of the sharing economy are often potrayed as ones who avoid responsibility and planning, who don’t really know what they want in life so they don’t commit to anything.

Counter to that, the idea of renting things from the society has a halo of being environmentally responsible, efficient with resources, using high-quality luxury goods, looking after one’s posessions — all of the things that are opposite of the modern consumption sins.

Impressions from :clojureD 2019

2019-02-23

So :clojureD happened today. I think it went great! There were several talks that I found entertaining and/or educational. I also got to chat a bit longer with some of my friends and people from the community. And we had an after party. I think these things are what programming conferences are for.

My resolution from today is to attend talks that are rather artsy, or about which I have barely any clue. And if the talk is boring, quietly walking out is always an option.

My favorite talk was about graph databases. It started with a very basic introduction, and then Paula transitioned into more advanced stuff like indexes, and she did it with just the right speed. I appreciated how honest she were regarding DataScript. Seeing code examples gave the presentation a very hands-on feeling. In general it was great to listen to a talk from someone who has decades of experience on the subject, and yet they are very humble.

Tomorrow is :clojureD 2019

2019-02-22

Tomorrow another episode of :clojureD will be happening here in Berlin. Last year I’ve missed it, and this year it landed in my calendar early. I’m looking forward to meet lots of great people and to hangout with my team. Last year we were only five engineers, and now it seems like our team will be close to 15% of all of the attendees. We’ve also prepared some awesome stickers specifically for this event. My favorite one is where the puppy pushes parentheses to the sides.

I’ll go and get some proper sleep now.

On planning

2019-02-21

I’m learning how to work a lot recently, mostly by observing others. One of the things I really would like to be able to do is to get better at planning and executing according to a plan. There are always so many things to do, and focusing is more and more difficult for me.

Having a plan keeps me calm.

I also worked out today. I’m slowly building up my fitness equipment inventory. The main criteria is to have maximum versatility with as little amount of space as possible.

Unhappy list

2019-02-20

I think one of the most useful advice in life is to keep looking for whatever makes one happy and fulfilled. This question comes more and more often in my recent conversation with friends, and rarely can anyone tell a definite answer. I too haven’t figured out what it is for me just yet.

So far I’ve figured out only a few things that make me unhappy:

I don't understand what privacy is

2019-02-19

Recently I thought I started to pay attention to my online privacy. I deleted most of the accounts on various SaaS-es, installed various tracker blockers in Firefox, deleted social media accounts etc etc etc. I even started to write this blog because I needed to pour out some thoughts but didn’t want to use any social media, because in this way I think that I own the data.

Then I thought that privacy perhaps is not what I thought I was going for. Due to this blog, every shady company and malicious person can find out about me much more than previously. So I actually opened up instead of hiding. And once something has been published online, I guess it’s public forever.

I’m striving for something, just it’s still not quite clear what for. The best answer I have so far is that I’m fighting against my own online convenience. I’m downshifting because I don’t want the modern state of tech to be my status quo. It’s too good to be true already, and I’d like to shift right now towards sustainability rather than further convenience. I want to feel amazed every time I use an online delivery service, or every time I learn a new skill through YouTube. It all is a fruit of voluntary suffering, in its mildest form. I’ll probably be writing more about it in the following weeks.

Today is Tuesday, and Tuesday means running.

Emoji at work

2019-02-18

I’ve noticed how several teams I’ve been a part of have been using emoji reactions feature in Slack. This is a bit weird to me. Why would one exchange the powerful expresiveness of text for a limited, though very cute, set of icons?

I thought it might be because we actually have to communicate with more people in a faster way these days. Or because perhaps text isn’t that expressive at all, at least in the shortest form — one can be perceived as very angry or simply pragmatic and friendly while sending out the same message. Or perhaps emoji may have more meaning compressed into them and they have a positive connotation by default?

For example, the last reply in the a chat conversation like this:

can be perceived quite sad and even almost official. However, if you just replace the same last sentence with several emojis:

it already looks very much friendlier. The meaning of the message is kind of the same though.

Without even a note of condemnation, I imagine that sometime in the past, a person who heard an idea, that people would be using emojis instead of writing actual messages in a work context, — they laughed out loud!

Speeches and trust

2019-02-17

I noticed that I tend not to trust a person who delivers a speech or a message, independently of the platform, if they are not openly talking about their flaws, recent mistakes and imperfections; if they skew the gray area of some ethical concerns in a way that they can potentially, or factually, benefit from; if they don’t say anything in particular, rather than just words of excitement, encouragement and listeners’ self-satisfaction; if they play the teeters-totters trick of jumping between this is good VS this is bad maximas while talking about the same thing. A person can be a great influencer, and not believing them can cost a portion of one’s social capital.

What’s tricky is that sometimes the argument they are delivering is a valid one, but because the spokesperson is contradicting (in my eyes) the argument with their own lifestyle, I discard it.

It’s difficult not to judge the person but rather the message. It’s a good reminder for me not to do so.

First kettlebell workout

2019-02-16

I had my first workout with a kettlebell today. It was very difficult, and satisfying. I’m looking forward to tomorrow to see what muscle have been engaged the most. I don’t think I have enough energy left to type anything more into the computer.

Follow-up on the temporal Reagent component state

2019-02-15

Yesterday I’ve written about my dilemma regarding whether to put a very temporary state of a Reagent component into a local atom or into re-frame’s db. While I thought that I will go with the local atom solution, I’ve decided against it. The reason was that I talked with several of mine team members, and they gave me valid reasons for going the full-on re-frame route:

I’ve noticed that I often value opinions and attitudes of my colleagues more than I care about the technical aspect of work.

I wonder if I’m missing a good balanced solution that is not that polarizing. I hope I’ll have a few hours of solitude over the weekend and something pops into my mind.

In other news, I’ve skipped a training session this week because we had a dinner with friends. My kettlebell is here so I’m looking forward to a workout. The dinner was awesome. I got to know a bunch of very cool music from a friend. I’m listening to hip-hop much more these days. Also a friend of mine was very surprised that I don’t have a Spotify account. I couldn’t really answer why it is so. I kind of just don’t see why I need it.

Temporal Reagent component state

2019-02-14

I was making a comparison today whether I should keep some temporary state of a Reagent component in a local (relative to the component) atom or in the re-frame db. Keeping it local to the component means that I can expose a more semantically-meaningful interface, but it also means that I have much less control over the component from the outside and, which is the trickiest part, I’ll have two disconnected pieces of state. There’s a fine line that I could draw between these two pieces of state, but I wonder if this line will be clear enough for the next engineer who’s going to fix bugs in my code.

Here’s how both interfaces look like:

; Keep the state in the re-frame db
[my-drag-n-drop-component-1
  {:on-click #(dispatch [:click id])
   :on-drag-start #(dispatch [:start-dragging id])
   :on-drag-end #(dispatch [:stop-dragging id])
   :on-drag-enter #(dispatch [:enter-drop-target id])
   :on-drag-leave #(dispatch [:leave-drop-target])
   :on-drop #(dispatch [:move id])}]

; Keep some of the state in the component
[my-drag-n-drop-component-2
  {:on-select #(dispatch [:select id])
   :on-move #(dispatch [:move id])}]

The second one requires way less glue and is obvious how to use. However it requires for the component to maintain all of the drag-n-drop information internally. The idea of having the full state of an application in a single atom is very simple to grasp and to reason about, thus powerful.

The solutions are not too different in technical terms. I think I’m going to go for the second option. I’m very tired of writing glue. Semantically-meaningful interfaces are easier to work with. And the issues will have to be fixed in any way.

Clojure Berlin Feb 2019

2019-02-13

Today is the second Wednesday of the month, and it means we had the one and only Clojure Berlin. Best place to spend a programmer’s evening, I tell you. We had an amazing round of lightning talks, and it went very well. George has presented his work on Ghostwheel and it got me even more excited about the idea of speccing out functions and generative testing. Matt has showed his library that brings JavaScript interoperability closer to CLojure’s standard library functions, and it also looks awesome.

I felt like all of the topics tonight were relevant to me. Perhaps they were basic enough for me to understand. Usually I don’t get much from the talks about machine learning, type systems, language design and other complex things.

What I don’t like about myself is that it’s almost one and a half years of working with ClojureScript for me, and still I call myself a complete newbie. It’s a nice way to set the expectations of my peers to a low level so that they don’t judge me at a high standard. But that’s embarrassing. I would like to get to an advanced level. Let me me remind myself that like anything in life, people don’t stumble into advanced things. It takes deliberate practice.

Feb 12th 2019

2019-02-12

Today was a very nice day. One of these days where I feel I made some good impact on our product and team.

I haven’t been eating breakfast regularly for a few years. Partially because of laziness, and partially because I have spikes of inspiration for intermittent fasting. But lately I got on a hook of having a coffee with 85% chocolate and nuts every morning, and every evening I’m already excited for the next day’s breakfast.

:clojureD 2019 is coming up next week. I’m very proud that our entire engineering team will be there. I can’t imagine that any other of my previous teams would like to attend a conference altogether. This is very cool.

And as usual, Tuesday means running. I did 10k today in 46:50, and I think it’s not too shabby. Not my best time, but feels good.

Summer garden floor

2019-02-11

I’m thinking often about a summer garden floor. That is, the ground. There are things that look great, that don’t get worse as one uses them and that don’t need a lot of maintenance. I don’t care if it’s dusty or not, if somebody goes on it with or without shoes, if something has spilt over it. I don’t really care how it looks like down there, so I can sit with my head up straight and watch the sky as the sun goes down.

A bright beige expensive couch is an exact opposite of it. That’s why I don’t envy those who possess one.

I wish that household items, clothing, bicycles and software would be like a summer garden floor. That is, they look and work great, don’t get worse over time and don’t need lots of maintenance. I see classic style in things, carbon belt drive and Clojure as tiny steps in the right direction.

Grocery stores and Walden

2019-02-10

Several years ago I caught the zero waste bug. Since then I’m making small steps in eliminating all of the everyday waste I produce. Last week I found a grocery store where they sell everything unpackaged. I must say it’s a bit of a hassle to plan what I’d like to buy, to weigh and marker the jars (did I mention I’m collecing too many of them already?), to bring all of this stuff to a store and then to fill it. I also noticed that the store itself quickly becomes quite messy, because pretty much everyone is sloppy when filling up their containers, so it makes sense to have a person who cleans up the space all the time. If I would open such a store myself, without having prior experience, I wouldn’t even think that such a person is needed.

I like to joke that the moment I noticed I become older is when for the first time I used words “groceries” and “exciting” in the same sentence. But well, even as a child I loved going to markets and stores. It calms me down when I go through a market and I see mountains of produce.

I’m slowly going through “Walden” by Henry David Thoreau. A couple of things caught my attention already. It’s interesting that back then people paid attention to the thickness of fabric for their clothes. I like the idea that the more advanced we become in our technological development, the more clinged we become to the objects (the notion of men becoming tools of their tools). So I enjoyed a portion of my shameful exposure, because I tend to care about things, and that consumes lots of time. Perhaps I’d better spend it on art, music or spiritual stuff? And finally, the notion of adopting christianity as a form of agriculture. I can’t really explain this idea, but I somehow feel it.

Fitness diary is up-to-date, as usual.

node-cljfmt

2019-02-09

When I was introduced to ClojureScript, my team mates recommended me switching to Atom. I’m open to learn how to be effective with cljs in vim or emacs, but learning how to use an advanced editor in parallel with a new language is a recipe for a failure. I’m playing with my vim setup a lot though.

I’ve heard that Clojure community is talking about having a standard formatter for the language. I’d love to have something like that to completely automate such a bikeshedding.

I’ve been using lein-cljfmt for a while, and it works, but the approach is very, very slow. I’ve tried building zprint with GraalVM, and it works, but something put me off in regards to it, and unfortunately I don’t remember the details.

Yesterday I found the node-cljfmt npm module. After installing it, additionally to atom-beautify, I now have automatic formatting on every save of a file! It’s still quite slow but not annoyingly so.

Dear readers, ...

2019-02-08

I just wanted to say that I’m very grateful for everyone who reads my daily notes on this website. This week I’ve heard from three people I know that they enjoy reading them. I even met a person because of it! That’s very cool. I didn’t expect this kind of response at all.

I wish more people would be writing on their websites and using RSS. I love reading Andy Matuschak, Derek Sivers, Early Retirement Extreme and Brent Simmons.

As for an RSS reader, I recommend using NetNewsWire if you happen to be on a mac.

Kids and construction sites

2019-02-07

I was cycling to the office today, and at one of the intersections I’ve noticed several kids looking at something with their mouths open. They were bluntly staring at it. More kids were gathering, gradually pushing their eyes out. As they were all looking in the same direction, I naturally turned my head to check what’s there that’s so attractive.

It was a good-old construction site situation.

Watching other people at work in real life is a great alternative to Netflix. But also online. YouTube’s DIY/restoration/renovation/here’s-how-you-do-it community is huge. I’ve spent embarrassingly too much yesterday time watching random knife restoration videos.

In other news, today is Thursday, and thursday is the best day for a athletic training, so my fitness journal got a tiny bit thicker.

New page — Favorite Products

2019-02-06

There are moments when I enjoy doing personal computing. Most of these moments are triggered not by the computers themselves, but by the understanding that the people who designed the hardware and software I’m using predicted my expectations just right. The button sits right where I looked for it. The text explained something right where I got confused. The flow of a feature was so coherent that it didn’t need any explanation.

So I’ve decided to collect these pieces of human ingenuity. This collection deserves a special place in my heart on and on my website. Please welcome the list of my favorite products.

Travel like the wealthy ones

2019-02-05

My wife and I were visiting Prague a few years ago. We had a very exciting day of wandering through the city, and in the evening we stayed at our room listening to some cool stuff. Tim O’Reilly has just published his “WTF? What’s the Future and Why It’s Up to Us” book, and we were listening to an interview about it. One of the quotes he mentioned was from Hal Varian, also know as the Varian Rule:

A simple way to forecast the future is to look at what rich people have today; middle-income people will have something equivalent in 10 years, and poor people will have it in an additional decade.

This idea has hit me just in the right moment. I immediately noticed that I’m listening to this incredible human wisdom sitting in a very comfortable armchair, in an apartment that I’ve airbnb-ed from someone I’ve met just 3 hours ago (yet I somehow trust them), after a day of cleverly navigating through a foreign city and seeing the coolest places (like if I’ve been living here for ages), eating at the best (by the opinion of a majority) restaurants, understanding what the signs in a foreign language were saying — all without knowing anything or anyone in the city!

Take me a century back, and to achieve the same level of leisure I’d probably have to be incredibly wealthy, and not only in monetary terms but also in terms of a social capital and an amount of talent. How would I be able to stay at someone’s place without knowing them, or their friend? And this friendship would have to be maintained across international borders. How would I be able to know what most of this city’s natives think about this or that restaurant? I’d probably had to be quite famous so that these people would like to share their opinion with me. How would I be able to navigate through the neighbourhoods like a native? I’d probably have to hire an individual guide and pay them for the whole day of work.

I was enjoying the benefits that only a few wealthy ones could afford in the past, yet I paid a few hundreds for it.

I must mention I didn’t feel confident at all while doing these things. For example, I was eating the supposedly best burger in the whole city without my personal experience of trying all the other ones. In a sense you can say that I was guided (controlled) by my smartphone. Some people (users) have fed the system with data, other people (designers and engineers) have optimised the way I interact with it, and now it was making decisions for me where I’ll be drinking my cup of coffee, what I will be saying to people in a completely foreign language and where I’ll be sleeping that night.

As a side-effect, having experienced how worry-free it is to travel these days, I have a hard time to start planning our bicycle tour this year. I kind of have this habit already of letting someone else (or something else) to tell me what to do.

Planning a small bicycle tour

2019-02-04

This year I’d like to do something I wanted to do for a long time — to go on a small bicycle tour. I got very lazy at planning my trips, partially due to technology (more on that tomorrow). This time I’d like to plan 5-6 days worth of travelling, with my kid and my wife. I’d like to enjoy the fitness-y side of things, not thinking much about other things, plus see something interesting every day.

I’ve found https://ridewithgps.com and I think I’ll use it to plan the route. Also Google Maps’ street view is amazing to plan what you’re going to see when. Technology really adds to the experience of travel. But more on that tomorrow.

Switched to an "old" phone

2019-02-03

Due to some circumstances I had a chance to try somethin I wanted to do for a while — to switch to an older phone. I went with an iPhone SE, a model which by now is already 3 years old. It has an amazing size, weight and performance characteristics compared to every modern smartphone, great screen, camera and fingerprint sensor. I personally think that most of the smartphone innovation stopped with this form-factor. From that moment on the benefits were mostly made up in my opinion.

But if I’m honest, the only reason why I wanted to switch is because I wanted a piece of hardware that would bring the maximum amount of convenience to my life, but at the same time it wouldn’t attract me. I’ve learnt that I very much like new and shiny equipment. iPhone SE is boring, and I don’t want to use it. I use it when I need it and it doesn’t attract me. This is my favorite of its features.

And oh my, how horrible the internet experience has become since the last time I’ve used a browser on a 4” screen!

Feb 2nd 2019

2019-02-02

Today was a very calm day. I didn’t think too much. I went to a packaging-free store today, and I liked it a lot. I did some exercises with my kid — he ran with me, counted my reps, acted as an additional weight (25 kg is very handy), kept the list of repetitions updated, and was an obstacle during some exercises.

Should one get children?

2019-02-01

Friends sometimes ask me why we got a child. I can’t give a definite answer. At some point I felt an empty and void feeling on my arms. We thought having kids earlier is better because everything becomes more difficult when you get older. Many of our friends were getting children too, so for us it was kind of logical.

It’s one of the toughest challenges for one to undertake. I love my son.

I often notice myself full of judgement that my peers don’t get children. I often think they are selfish. I guess I’m mostly jealous that they can do some of the cool things I’d like to do, like travel, spending weekends like they and only they want them to be spent, hanging out with friends after work. But I think it’s most likely me who’s selfish and non-determined because I don’t get to do all of these things. I can do them, but I don’t and I find excuses.

I’m often sorry that my friends who are very good people don’t get kids. Because they would be great parents and they would bring great people into this world. I’m sorry that lots of people who won’t be great parents and will bring hurt people into this world are having kids.

Getting a child at 25 in Europe is a very social and at the same time anti-social thing to do. You will most likely drop out of what you’re friends of the same age are up to. You will meet some other parents soon when the kid starts going to the kindergarden. You will become more flexible as the kid gets older.

My kid manipulatively made fun of me this week by saying “dad, everything you want to do in this life is just to eat peanuts and chocolate.” I think we had an argument either because of sweets or brushing his teeth and that’s when he said it. He also interrogated me regarding some new stickers that we made this week at work. After finding out that I’ve put my sticker on the plant pot at my desk in the office, he cleverly negotiated which of the plant pots he can get for his room at home, and he put his sticker in the same manner on that pot. Later a friend of ours came for a dinner, and my kid took her by the hand, brought her to his room to show off the sweet sticker setup, and said that dad has the same at work.

My kid also said that when he grows up he wants to work at my company.

Random thoughts on formal education

2019-01-31

I’ve met a friend today, and we were talking about education. My friend is in the business to help people land great jobs. He told me a few stories how he worked with graduates of various coding bootcamps, and how naive many of them were. There was often a clear expectation that one is entitled to a job once they finish the coding bootcamp. It’s perhaps a helpful idea to break these kinds of expectations in the society.

I remember my grandparents talking how life was more predictable in the USSR, especially in regards to careers. You go to school, then through an apprenticeship or a university, and after that there will be next steps for you pretty much prepared. The most well-connected students would usually land jobs in their city or in another big city, but it wasn’t unusual when students would have to move to a smaller town or a province. And USSR was like very big, so sometimes these moves were across several timezones.

It seems like we don’t have similar predictability even in the not yet enough saturated programming industry. I’ve hired several people in my life, and most of the time I didn’t even ask them about their formal education. I usually care mostly about what they did at work.

If I’m being asked what kind of formal education should somebody undertake to become a proficient software engineer, I usually don’t even know what to say. I often mention that one has to be passionate and determined enough to try developing their own projects.

I liked this idea that I saw today on Twitter, and yes, I’m kind of got hooked on the social media stuff again:

Given that the main function of universities these days is filtering and signaling, the best move is to get admitted to Stanford and then drop out.

You can probably learn most of the things they teach at Stanford on your own while working part time. You will not get the same benefits as students at Stanford get, but you might get some other benefits that they won’t.

I think what education comes down to these days are being determined, interested and disciplined.

I think that Jacob from ERE has some interesting ideas on education.

My wife is an amazing self-taught software engineer, and that she has learnt it mostly using online courses and books. The best investment she has made so far was into getting a Safari Books Online subscription.

Muscle, taste and music

2019-01-30

I do general athletic workouts every Thursday. But tomorrow we have some friends over, so I moved the session to today. It felt great, however some muscle are sore since yesterday’s run.

It’s so unusual for me to feel the muscle separately! Before starting to do sport activities on a regular basis, everything I could tell you about how my muscular system feels was either that I’m tired or I’m fine. These days I can say that I feel my lats, longissimus, front deltoids etc.

It’s very similar to the development of taste. As a kid, I used to like some foods or I disliked them. I couldn’t explain why or talk about the details. These days I can recognize spices and ingredients. Or take music as another example. As a kid I only cared how I felt when listening to a band. But now I can lay with a good pair of headphones listening to a favorite song, imagining a studio where musicians play their distinct parts, and I can even move in that studio, all within my mind, from one instrument to another.

That’s why I think it’s very important for humans to learn how to do fitness on their own. I think it’s one of the things that shouldn’t be outsourced to others (in this case — personal or group coaches). Get several sessions with a professional, learn the basics, build up unused muscle to omit future over-compensation and injuries, and go and learn this skill on your own. Yes, you will make mistakes, won’t do the best exercises, perhaps even harm yourself. But that’s the journey. Read, experiment, check how you feel, watch smart people on YouTube, and grow your knowledge. Our generation has so much opportunity to become these amazing superhumans that can do anything and everything, and we shouldn’t drop the ball on it.

A month of blogging every day

2019-01-29

Today marks exactly a month of me blogging every day. Nothing special so far. I definitely didn’t grow a horn, or even become more mindful. I intentionally removed all of the analytics from this website, thus I don’t know if anybody reads what I write. I didn’t set myself an explicit goal. I treat this whole blogging endeavor like an exercise to see how far it can take me. I don’t think I convey any new or interesting information, and I don’t think I should. It’s my homy corner of the internet.

Today is Tuesday, and Tuesday means running.

I haven’t programmed much this month. And I got back to writing some code this week, which feels awesome.

Bicycle tires update

2019-01-28

I was thinking about getting Schwalbe Marathon Plus Tour tires since the last summer. The promise of never (well, almost) getting a flat again sounded great. I couldn’t justify the purchase because my Schwalbe Spicers worked just as fine. I was riding with a fairly big ~4cm cut in the front tire that I inherited from the previous owner, and even that wasn’t a problem — I didn’t get a single flat tire or a blown up tube. But this week it snowed, and I surrendered to the temptation to get the Marathons because I could now justify the purchase by the need of a thicker profile. I didn’t get the proper winter version with spikes though.

Man these new tires are sweet. I’ve pumped in a good 4.2 bar (~60 psi) for both tires, and they roll so smooth. The generous amount of profile plus the puncture protection layer make it feel like I’m constantly riding on a very soft sturdy surface. Cobblestones are much less of a problem now. Marathon Plus Tour is much softer compared to my old Spicers, even considering the fact I used to put less pressure into my old tires.

I’m looking forward to my next ride tomorrow morning.

In-app chatting

2019-01-27

I was thinking recently regarding various communication methods we use. Most people I know use at least three chat apps on their phones. All of them use email. Having at least three active social media accounts is a norm. The notion of a norm, by the way, should not be discarded — a person may be seen as weird if they don’t have a Facebook account (because perhaps they have something to hide). I think that calendar is also a communication tool, which is one of my favorites because it binds with our perception of time.

Every successful app or a service should eventually become a chat application in some shape or form. I think the ones that do it well are those that augment the conversation in some way, and not necessary in a clever bot-like way. For example, if you’re discussing a schedule, the app can give you a shortcut in its interface to reference time slots, and show to all of the people if one is busy. Or if you’re working on a website design, the service might have a 1-click option to put a screenshot of the website right in the conversation, so that when you say “How do you like this new button?” the screenshot will be right under this message. If the service allows to augment the conversation with such references, you can without much hassle turn this conversation into an email thread, and so your clients don’t need to use the app, but you can also keep the conversations bound to their original context for future reference.

Email is so far the safest calm haven for a distracted mind.

Library, supermarket and my data

2019-01-26

I had two experiences this month. First, we’ve enrolled in our local library membership. The moment I went in the building I immediately fell in love with the whole concept. Everyone just hangs out there, reads something, surfs the web on a public computer or plays a board game. I see public spaces like this as a quintessence of human development on this planet. Very cool.

So I’ve signed up for a membership the same evening. The organization behind the library asked for my full name, address, date of birth and email. I had to agree to the terms of use. I had to pay the required fee through a trustworthy 3rd party service. That’s it — I could use all of its online resources from that moment. If I need to borrow a physical book from the library, then I’m required to present a document confirming that I live at the claimed address. All of this totally makes sense as libraries are supposedly subsidized by the local authorities, who are financed by the tax system, and they need to make sure only the people who live in the neighbourhood are getting benefit from it.

There’s a supermarket I like to get my groceries from. I also like the place — relaxed atmosphere, the produce is of a high quality and without packaging. They have a membership programme which offers significantly lower prices to the members. Sounds cool, so I tried to register for it. The process made me more worried with every step. I was required to provide personal data, including photos, for all members of my family. Then they directly asked for my bank account details. In the very last step, they required me to agree that they will send my data to a credit score company for a check. At that point I gave up. Yes, I provided all of my personal data by that point, but the last step made me not to contribute any further into the sunk costs of this whole endeavor.

I don’t understand why a supermarket needs my photo, my bank account details, and sends my data for a credit score check, when I put in my credit card at every check out. I wonder if they need any of my data at all. I can pay my monthly membership at the check out as simply another item on the bill. And the worst thing that happens is that someone abuses the discounting system by sharing the membership card between multiple people. But isn’t that possible to find out and block the membership?

Tradeoffs with myself

2019-01-25

How does everyone stay honest with themselves?

Say, you know that something you do doesn’t align with your values. For example, you’re convinced that lying is bad, yet there are situations where you lie. Or something simpler: you know that throwing away plastic packaging pollutes the environment, yet you buy your favorite cereal that’s wrapped into plastic.

I understand there are critical moments where one has to make the tradeoff or otherwise it will be a big problem. But what if it happens on a daily basis, as part of a normal routine, that can be changed? How does one go to sleep with a calm mind after a day of such tradeoffs?

Do we need hyperlinks these days?

2019-01-24

I was reading DHH’s reading list yesterday. I’ll definitely read some of the titles from the list perhaps even this year. What caught my attention is that there were no links to the books — it was just a plain text list. I think he has done it purposefully. Where should these links point to? Amazon, Goodreads? It could be perceived either as a promotion or affiliation.

Not having a link is not a problem at all — just use search! But then we give away the beauty of the internet — it’s i-do-whatever-i-wantedness and decentralization.

I’d probably still leave the links out of the reading list though.

In other news, things on the fitness front are going very well. I also added a list of my favorite products and my wishlist. My corner of the internet becomes very cozy.

I've been to a theatre today

2019-01-23

I’ve been to a theatre play today that a friend of mine organized. Her daughter had a birthday a few weeks ago, and this play was a present to her. It appeared as a very simple story in the beginning. A toy giraffe with several toy giraffe children, living in a home with her partner — a toy husky, which also has a pup of its own. The whole story consisted of various conflicts that these two went through. The husky couldn’t talk — it only made sounds usual for a dog. But giraffe was fairly anthropomorphic, at least in her behavior. My friend portrayed her as a very demanding and patronizing character. It was a play for children, but I still had to make everything complicated in my head. The story had a happy ending — those giraffe and husky were dancing to some romantic music and occasionally kissing each other.

Together with my friend who was doing the show, we took the same way home after the play, and my friend explained me a bit more about the story. It turned out that giraffe was a refugee from Kenya, and she didn’t choose that husky as her partner. Somehow they got together. My friend has probably brought a lot of her inner world to the story behind the play.

I often think if very simple entertaiment is better than the advanced one. On one hand, your feelings can’t lie — watching best actors on a big stage brings an incredible feeling of awe. On the other hand, doing a show for a tiny audience of people you know has this halo of trust, honesty and diy-iness. It’s like comparing a dinner of some sophisticated professional cousine to my grandma’s pies. I tend to think I appreciate the latter more because it’s… well, it’s a part of the relationship.

Talking and running

2019-01-22

I’m talking a lot these days. Mostly about myself, but also a lot about work. I mean, people ask for it, so I try to entertain them. I’m kind of tired of it. Part of it is that I needed to explain to all of the candidates for my new team what we’re about and what we will be building. I will pay more attention to listening in the following days and weeks.

I went for a run in the evening today. I did 10k. I haven’t done 10k since March or April last year. Cool thing is that I don’t have any sore muscles this time, and no pain in the knees. I remember when I just started to run (I think 2 or 3 years ago), and even 800m would give me so much pain that I had to stop. A bit later, after 3k my knees would hurt for up to 48 hours so bad that I had to walk without bending my legs. Now it’s way better. What I’ve changed: proper warm-up, run on the front part of the foot, get proper running shoes.

I wanted to listen to a podcast during the run and I didn’t want to take the phone with me. So I borrowed the awesome iPod Shuffle from my kid, loaded a podcast using a cable via iTunes, and went out. Really, I had to even use these headphones with a cable? Oh yes, I did, and I’m surprised how well it worked out! And I didn’t have to bring a full-blown pocket computer with me. iPod Shuffle has these very handy big buttons for the playback control and it’s a bliss to press them even with my thick woolen gloves.

I’m keeping my fitness diary up to date too.

Is targeted advertizing evil?

2019-01-21

The short answer: yes, and… no.

DHH in his latest post on Signal v. Noise:

The world of commerce spun around just fine in the era before ads could be targeted by personal information. When ad buyers would place their spots based on context. Got a new car to sell? Put an ad on a website that talks about cars. Maybe it wasn’t as efficient, or maybe it was.

The issue is more complex in my opinion. Our economy relies on consumption, and the bigger it is the higher is the stock price. This model requires either for products to serve rather short life spans (modern light bulbs) or for producers to come up with periodic innovations (smartphone upgrades).

Because many companies opted in for the second approach, they were introducing innovations without considering environmental or ethical impact. Innovation brings little value if it doesn’t optimise (or disrupt) the existing process: it either shaves off several moments of unnecessary friction from my life, or it’s “meh” and “why do I even need it?”

We had many years of successful iterative innovation in the tech industry. As a result, individuals became more productive. One can do more tasks with less latency than in previous years. During a 10 minute bus ride, one can call their parents, buy groceries for a dinner party and edit a sales deck. Think how much time the same actions would take them in 1985.

I’ll derail here a bit. Think what can replace a smartphone considering the fact it needs to make us even more productive. Hint: you’ll need 30 seconds to perform the same tasks in 20 years time, and don’t even ask me how — I’m excited and terrified at the same time.

Back to the topic. We switch contexts multiple times every minute. The speed of life has increased. The time we spend making a decision, especially a simple one, has decreased. Having a billboard ad in a few places in the city is not enough: an individual might not even have a chance to visit these places before they need (or want, because if I can then I should) to make the decision. Marketing departments understand that, so they began the race for our attention. Because workplace can be more productive, and individuals want to progress in their careers and keep their skills valuable, and there’s an incentive to bring more sales, they come up with smarter ways to find customers.

That’s how we’ve arrived needing data scientist in the modern online commerce. Being data-driven is a virtue these days. If a business doesn’t fine tune their target audience search, then they won’t stay long above the water.

I see it like so: consumption -> innovation -> increased productivity -> increased competition -> fine tuning of sales processes -> targeted advertisement based on personal data.

The questions is not how to stop tracking customers, because it’s just a consequence. It will happen naturally when we stop consuming more than we need.

If an online commerce resource stops targeting their customers, then it becomes less competitive. Ofcourse there are other ways to market, for example delivering an exceptional quality. Nobody googles what phone they need to buy if they want an iPhone. Apple has built an incredible business with a word of mouth and a great image. Yet, can you please remind me why did their phone sales drop in the last quarter?

I’m probably wrong, and would like to hear what other people, who know more about the subject, think.

Toy recommendations

2019-01-20

My kid has recently turned six years old. I’ve observed him playing with various toys over the years. A few friends asked me recently which toys are the best. Here’s my short take on it.

I define “best” like so:

Best picks so far:

You can also put Lego on the list if you’d like. It’s definitely one of the best things one can get in a toy store. However, it becomes quickly boring for my kid. He assembles a figure, and then it starts collecting dust on the shelf.

My kid finds many things to play with in the kitchen and among my small collection of fitness equipment (TRX, rubber bands).

He got into stiching and embroidering recently, which suits my definition of a good game. I realize that for some rather active kids it wouldn’t be stimulating enough.

How ideas click

2019-01-19

Today we’ve talked with my wife Varya about possible triggers for a change in the society. From what I understand, an awakening to a more sustainable and less hedonistic lifestyle can happen only after a dramatic and shocking experience. General population won’t give away its comforts (perceived as a right and an element of freedom) by simply hearing a good idea. So it seems like either a revolution, a war, a crisis or at the very least a huge scandal is required to make the society wake up from the status quo.

And I don’t think people are inherently bad. Perhaps the vast majority of the population is so preoccupied with the vanity of human existence that it simply doesn’t have enough room to reassess its behavior.

Another way to make people change their minds is marketing. The goal for a pioneer is to make others truly want a result, an object, an effect. And while others will pursuit their desires, perhaps pioneer’s goal could be met.

Nike’s and Apple’s slogans come to my mind when thinking about it. You probably can recall them. It’s a well known fact these slogans have nothing to do with the products of these companies. They simply make us want to be in the group associated with the slogan.

When thinking about the devastation brought by over-consumption, which is the foundation of our everyday lives and the economy, it is perhaps not possible to stop it by putting on external restrictions. A pioneer, who’s on a path to change the foundation to a more sustainable way of living, has to either wait for the next economic downturn, or find a marketing trick which would make consumers want to change their behaviours gladly and voluntarily. That’s why I think the whole FIRE idea acrtually fired: it pointed people not to reversing the negative ecological impact, but to having more time, options and freedom. The improvement of the ecology is the main goal (as I perceive it) behind the movement, however it’s cleverly presented as a side-effect of one becoming a more fulfilled individual.

I’ve changed my attitude towards every sort of packaging. It’s not that I truly care about that poor sperm whale choking on plastics in the ocean. It’s that I once heard an idea that having packaging is often unnecessary, and thus not optimal. If I can consume a certain product without a wrapping of any sort, what’s the use of packaging for it? It became somewhat a sport for me to find my favorite products without packaging. I also derive satisfaction from watching our garbage bin getting full way slower. A month without throwing away trash appears to me like a very aspiring thing to do.

Same ideas click differently for different people.

iPad is tempting

2019-01-18

Today I wanted to use an iPad again. I saw how my colleague was using a terminal emulator on his iPad and I imeediately got this craving. What’s weird is that the emulator app wasn’t any better than on any other computer. It’s just the understanding that what seemed to be a toy a few years ago is ready to be used for my work.

I don’t understand this craving, and I don’t like it. Yes, latest iPad is an awesome piece of engineering. Best possible screen, weight, size, touch and pen (-cil) support, physical keyboard. But it’s not that different from a laptop. Yet I want it.

I wish I wouldn’t want it. I wish I thought “meh” and went to do some meaningful things instead of daydreaming about it.

Although the technical capabilities are very similar, I don’t get the same craving when I see a Surface Pro.

What’s cool is that despite all of the richness of Apple’s UI components, using shell on this newest and hottest hardware still makes sense. There’s ls, cat, curl and grep, there’s vim. It all works like on any other machine. I have this moment of appreciation for how great pipes and filters architecture is on a weekly basis.

To supress the craving for wanting to use an iPad, I tried to convince myself that it’s all proprietary software, with cameras, microphones and location services that are out of user’s control, so I immediately became scared of it. Fear is a great antidote for craving.

20 minutes

2019-01-17

I’ve been blogging every day recently. It feels good so far. When I’m writing more than two paragraphs it takes me significant time — up to an hour. My notes are not meant to be educational or entertaining for others. It’s mostly for me.

My wife said that now I have a limit of 20 minutes to write a post. Well, gotta do what the boss says. So expect less reading and hopefully not more typos.

In other news, I’ve met three very bright people today.

And in the evening I had a training session. I’ve made a note in the diary.

What's next is uh-oh

2019-01-16

Ben Evans in his newsletter this week:

The mobile market is reaching saturation, and so is the smartphone market, and Apple has won the high end of the smartphone market. This is not ‘the fall of Apple’ — it’s just the shift of smartphones to boring maturity, as we look for what’s next.

As I’ve mentioned before, I’m looking forward to all of the things that we expect and don’t expect in the future. Nothing is cooler when someone comes up with an idea, markets it well, and it gets spread all over the world.

I hope we come up with a recommended ruleset for personal computing someday. Something like a manual that is built on ethical foundation. How one can use all of these awesome things without hurting themselves. Something that is woven into the morale conduct of our culture.

What I’ve experienced is that as long as the tech is used for non-educational consumption it hurts. When it’s used for expression of creativity it grows one’s mind. Perhaps this principle can be a guiding star for what’s good and what’s bad.

So why “what’s next” is uh-oh? Because this new thing will be more addictive than anything else we have nowadays. Think about it: you can only beat something like a smartphone if you come up with a tool that brings more convenience. It will allow getting all of the information you want with less friction. It will allow to perform similar tasks in less time. And after we’ve eaten the sacred fruit of the enhanced lifestyle, it’s very painful to go back. Life becomes faster. Barriers disappear. Some important tasks are not doable anymore without this new thing (think of WeChat and payments in China).

But it will bring some devastating side-effects, like anything else humanity has developed (except bicycles, surfing, piano, bridges and corgi). And we’ll have to unwind the deminishing effects on the society. One step forward, two steps back.

How can we make sure the newest coolest thing doesn’t bite us in the arse? No idea!

May a tool not become a master. Think of sustainability upfront.

Fitness update — Jan 2019

2019-01-15

This week I’ve made a change that brings me fear. I’ve been training with a team of professional coaches for almost a year by now, and it has been a blast. I’ve learned many new exercises and techniques. I’ve got stronger. I probably also revived some unused muscles.

Though mirror keeps saying to me that there’s no change. I’m kind of split between whether I should care about what I see in the mirror or not. Part of me says that if I’m training 3 times a week, and pushing myself really hard, then I should at least see some nice curvatures around the waist line.

The reason why I don’t want to go for the bulky looks is that I’ll have to eat lots and lots of stuff that I wouldn’t normally eat. I just can’t see how getting chicken or tofu with every other meal is healthy. Protein shakes are either processed too much, or one has to go really out of their way to prepare them. I’m concerned about the health in the long run.

Thus I like to go for the function more than for the form, so as long as I see my power not stagnating I’m pretty much satisfied.

So, regarding the training with a personal coach. I’ve been thinking a lot about it. I figured out that having a personal coach doesn’t align with my value system. I know, sounds weird. I’ve given up on not sounding weird already, so I don’t judge you if you judge me. I’m very grateful for being able to experience such a privilege. But I’ll stop training with the coach starting from the next month.

One thing I’ve figured out is that no teacher will make you smart, no personal cook will make you eat healthy, no spiritual leader will make you closer to God, and no personal coach will make you fit. It always depends on you. If you want a result — learn about the subject, and practice it yourself.

But it’s a scary decision for me. Feels similarly to co-founding a company. What if I exercise in a wrong way and get an injury? What if I don’t find enough motivation? What if I start skipping the leg day?

I went for a run today. It felt good. I did a warm-up, some stretches and drills, and then two rounds of fartlek. My GPS watch lied to me shamelessly claiming I did 10km, which is not true. I probably have to adjust some settings. I had no pain during the run, except so much belly pain in the beginning that I almost gave up and went home. It’s the first time I’m having it and I have no idea what it was. I ran in the evening. Most likely the pain was caused by my huge lunch, and a banana that I gobbled one minute before the run. I’ll try not to eat too much on the days I run.

I’ve also decided to write an exercise diary here on the website. It’s mostly for me as I don’t think anyone will find it any interesting. But here’s the link anyway, for some random public accountability reasons.

I’m struggling to come up with any goals except being persistent with the plan and not injuring myself.

My bullet journal

2019-01-14

There’s a system called The Bullet Journal. It’s very cool because it lets you combine notes, events and todos all in one place. Among all of the systems I’ve tried using, this one has proven to be the most versatile and flexible.

The only other one that matches the flexibility is called “Passion Planner”. But to use it you’ll have to either buy a special notebook, or spend too much time drawing the calendars and all of the columns, or perhaps print it yourself (which I did once, and it came out meh). I fancy once in a while using a complex system like this to organize stuff, but in my case the system itself starts to get more attention than the stuff I’m trying to organize.

Ok, so back to the bullet journal. I’ve tried doing it on paper. It works well as it has a good set of abstractions. I eventually got tired of carrying my notebook everywhere, and of retyping all of my scribbles into a computer when I needed to share them. So I thought of using an app for that. There must be an app for that. There are probably several apps for that, and I already anticipated spending an evening to compare all of them and to choose the best. So I almost opened the search engine…

But then stopped.

You see, I’ve started journaling many times in my life. In fact, I started so many times that I decided these were not disconnected beginnings but continuations of my life’s journaling efforts with gaps in between. The best piece of wisdom I got from all of the attempts is that never, never ever use a system which locks you in any other format rather than plain text files. Even if it’s openly accessible (like JSON or an SQL table), don’t do it. Use plain text files. I’ve started journaling with Wordpress, Evernote, OneNote, Apple Notes, Day One, Bear and perhaps a few more. What does the current fashion say which journaling app is the best? The problem with fashion is that things go out of it sooner than you want it to happen. All of these apps grow weary after awhile. You change computers, change systems, and your notes and journals always have to travel with you. These are the pieces of information that are irreplaceable. Plain text files on a disk (or perhaps Dropbox if you trust them) will survive any transitions between tools and apps. You just need a text editor and you can continue journaling. Don’t forget to do a backup, as well as flossing your teeth.

For my bullet journal I’ve decided to use plain text files. I’ve opened my text editor and jotted some of the tasks:

. Write a blog post
. Buy groceries
. Be nice

Good. Then I completed some of the things, and postoned others:

x Write a blog post
x Buy groceries
> Be nice

Good. On the next day I continued. I figured out that I wanted to have a separate file for each day, so I created a new one:

# 02 Jan 2019

. Write another blog post
. Cook dinner

And then I thought that I might have forgotten something that was on my list yesterday. So I had to look it up in the previous day. And then it continued, day after day, a process that I soon figured out can be automated.

There was a trick that I’ve seen working very well. We’ve done it at Microsoft To-Do. The idea was that a user has to start every day with an empty list of todos, and the system will suggest what the user might do today. Some of the todos came from reminders that user set awhile ago. Some came even from a fancy machine learning backend looking at one’s inbox. The most useful suggestions came in a group called “From yesterday.”

It’s amazing how well it works. You try to achieve some things today. You don’t have time for the rest. Next morning you plan your day from scratch, and decide if the things that you wanted to do yesterday are still relevant today. This cycle filters out unimportant things naturally.

So I wanted to have the same. I had 10 minutes to somehow bring it to life. The tool I had at hand at that moment was the best piece of software ever invented — unix pipes and filters. Why is it the best? Natural selection, I tell you. So I went on a mission to make my bullet journaling script work, and here’s what came out:

#!/usr/bin/env bash
cd "~/bullet" || exit 1
TODAY="$(date +'%F').md"
if [ ! -f "$TODAY" ]; then
    PREVIOUS="$(ls | tail -n1)"
    TITLE="$(date +'# %a, %b %d %Y')"
    sed "1s/.*/$TITLE/" "$PREVIOUS" > "$TODAY"
fi
"$EDITOR" "$TODAY"

It’s a bit cumbersome to read. The gist is that for every new day it will create a new file, copy everything from the previous day, and set today’s date as a header. That’s about it. Tasks and notes travel automatically from day to day, and I have to simply clean the completed ones out. While the last step seems tedious, it’s actually very satisfying because I remind myself of the things I achieved on the previous day.

It works fantastically. I eventually started tracking my work-related tasks, as well as my personal ones. It’s a text document, so I can use all of the creativity I have, except when it involves drawing. I can divide these documents into sections, track my fitness progress and my projects.

For example, we’ve just moved to an apartment which has old wooden window frames, and they leak cold air in winter. Each window consists of two parts: a big one and a small one, and they open separately. I wanted to seal the gaps of each of these parts. I bought some sealing tape, and it turned out I bought not enough. So I had to get more the next day. Not to forget which windows are already sealed, I came up with a silly system in my journal:

..xx xxXX

Means nothing to you, but for me it works amazing. There are 8 windows, and the space means there’s a wall between them. . means I haven’t sealed the window at all. Small x means I’ve sealed only the bottom part. Big X means I’ve sealed it completely.

Here you go. It’s nothing to be proud of, except that I had another chance to exercise my creativity muscle. A bit of “Low Tech, High Concept”, as they put it.

A useful question

2019-01-13

Here’s a question you can use for your next intentional interview:

If all people in the world were like you, which companies would go out of business?

I came up with it somehow by accident. Then I said it to a friend and they liked it. Everybody likes to talk about themselves. I like talking about myself too, hence there are notes on this website.

So, if all people in the world were like me:

If a person comes to a bar, they use the bartender to get a drink. If Jesus comes to a bar, he uses the drink to become friends with the bartender.

I often crave sugar though.

Maths and YouTube

2019-01-12

We’ve met with some friends today. At some point we started talking about kids and education. One couple came from a country where one’s allowed to homeschool their children. I’ve heard that in Germany homeschooling is forbidden as it can supposedly limit child’s opportunities in life. I see cons and pros for both approaches, and I don’t know which is best. It’s sad not to have an option though.

At school and later at university, I always went for the highest marks. It didn’t matter what subject it was or if I like it or not, I always wanted to get an A grade. As a result, I’ve received a golden (unfortunately, it’s only the color) medal when graduating from school and a red diploma after my last year in the university. These are the things schools would give to their students for their excellent academic performance. It felt like I’ve achieved the goal.

Only later, when thinking more about it, I realised the mistake I’ve made. The color of my diploma meant nothing in the real world. But I wasted so much effort to get it. I would be better off learning the things I like and find interesting. Instead, I’ve studied them very superficially, on a level that’s just enough to get the grade I wanted, and then moved on to the next subject.

After finishing my formal education, I was very ashame of my shallow knowledge. For example, I knew about derivatives from maths, but I never understood what they really mean. Well, I knew how to use the formulas, and I could probably recall the formal definition, but I didn’t understand what derivatives represent in the real tangible world. And why, for example, a derivative of speed is acceleration?

Only when I started to address my shame, my wife sent me a link to the Calculus One online course from the Ohio University. Author of this course went leaps and miles to make sure students understood what exactly a derivative represents in the real world. This course isn’t loaded with heaps of repetitive exercises (unlike in my formal education), but it’s full of creative visualizations with the emphasis on explaining the concepts.

I felt a huge amount of relief after finally understanding what a derivative is. I finally felt like I wasn’t dumb after all.

My wife was doing a remote course on statistics last year. I’ve watched how she learned calculus. Whenever she didn’t understand a concept, she would go on YouTube and watch a video after video, from different authors, with different styles of explanation and different examples. Khan Academy does an excellent job on this front. My wife would not stop until she understood the concept. I think this is way superior when compared to a usual class at the university, when you have to be at a lecture at a certain time and being taught by the same teacher. It doesn’t matter if you had enough sleep or not, if you’re sick or having a headache, or if you like the teaching style — you had to take it. Or perhaps you could read a book. Math books I could ever get hold of were very dry.

When compared to learning mathematics online, sitting in a class seems not only like a waste of time, but something what can potentially have a negative influence on one’s motivation to learn.

I don’t think that the usual school like we have it today is all useless. It certainly has positive sides.

I think one should always assess if they are learning what they enjoy, if they enjoy learning at all, and make corrections if a point of dissatisfaction is met. And never stop learning a concept until the level of understading is reached. Good indicator is that one can explain the concept in several different ways using their own words.

How to require and execute the same nodejs script

2019-01-11

I needed for a particular node script to be executable and available to reference with require from another script. And there’s a neat trick how to do it.

Imagine you have a script like this:

#!/usr/bin/env node

const config = {
  endpoint: 'https://example.com'
}

process.stdout.write(JSON.stringify(config, null, 2))

Executing it would produce the following output:

$ ./config.js
{
  "endpoint": "https://example.com"
}

Then imagine you have another script that references the one above:

#!/usr/bin/env node

const config = require('./config.js')

config.testing = true

process.stdout.write(JSON.stringify(config, null, 2))

This obviously won’t work, because we don’t set module.exports in the first script. Then let’s set it. We add module.exports = config to the first script, and here’s the output when we execute the second one:

$ config-test.js
{
  "endpoint": "https://example.com"
}
{
  "endpoint": "https://example.com",
  "testing": true
}

Hmm, the script outputs two JSON objects, but I expected only one (the last one, to be specific). After looking at the code again I figure out that by simply requiring config.js in the second script, interpreter automatically executes process.stdout.write command in the first script, and outputs the first JSON object.

What I would like to have is that the first script stays executable and its output is a JSON object, but when I require it in another script, then it would stay silent. Well, after a bit of struggling and nudging my mate Paulus (thanks, Paulus!) I’ve discovered this trick.

In the first script I add a conditional in the end:

require.main === module ?
  process.stdout.write(JSON.stringify(config, null, 2)) :
  module.exports = config

And then:

$ ./config.js
{
  "endpoint": "https://example.com"
}
$ ./config-test.js
{
  "endpoint": "https://example.com",
  "testing": true
}

Works like a charm!

An open letter to a fellow mobile engineer

2019-01-10

Yesterday I’ve announced that I’m gathering a team to build the mobile version of Pitch. The feedback was awesome, so thank you for all of the retweets, and especially if you’ve applied! I’m going through the list of applicants now.

This whole process is quite new to me, and I don’t really know if it’s going to work as I planned. I have some intuition to follow a certain direction. I need some smart experienced people who are willing to share the risk. I thought it would be helpful to explain more in detail how we’ll be working on this new thing. So here’s a long open letter to a fellow mobile engineer.

If you think this writeup is worth sharing, please go ahead and use your favorite social media means to do so!


Hey there!

My name is Misha, and I’ve been developing iOS applications for the last couple of years. I’ve been lucky to work with some brilliant people that built Wunderlist. Few other people consider it as one of the best todo apps on the AppStore. I think that’s very cool because todo apps are ubiquitous and there’s lots of competition. Last year with some of my former teammates we’ve started a new company called Pitch. At some point, we’ve raised the question who will build the mobile apps, and the choice naturally fell on me. So now I’m starting to gather a team that will bring Pitch to the plethora of smartphones and tablets available out there.

Building Wunderlist was a great ride. However, after working on the same product in the same way for five years straight, some of the ways we used to work grew weary on me. With the new team, I want to improve the process. You know how some people naively hope that their new ventures will be the most successful ones and that they won’t repeat the mistakes of the past? Well, I think I’m one of these people. I sincerely hope my team will find better ways to develop mobile applications.

In the previous years, I was opposed to the mobile apps built using web or hybrid technologies. PhoneGap, Apache Cordova, responsive web apps, React Native — all of these, I thought, are evil. My main point was always that they wouldn’t let me build a delightful user experience and become a burden in maintenance.

My understanding of what makes a great user experience has changed over time. These days I still believe that UI has to look stylish and be responsive. And I also believe that feature consistency across all of the platforms that our company claims to support, familiarity of the UI, being able to respond to user feedback quickly (not just with a “we hear you” email, but with a “we just did it” email) and time to market are as important.

Against my own will (well, almost), I got introduced to the modern web development cycle. There’s more — I even had to learn Clojure/Script! It was a bet that our CTO Adam had taken when we started tinkering with the very first versions of Pitch. Boy was I opposed to these choices! I always thought that web development ecosystem has a number of layered abstractions that are one too many, and here we have a whole different niche programming language on top of it. What can possibly go wrong? Ignorant me was eagerly waiting for the time we’ll have our first sleepless night because of this niche language’s teething problems, so then I can be right at least once in my lifetime.

Now I’m glad I was wrong. In retrospect, I think that choosing Clojure/Script was one of the best decisions for our young team. Becoming an exclusively Clojure/Script company allowed us to hire an incredible team of brilliant and experienced people in no time. Moreover, Clojure/Script gave us a property that I adore and haven’t seen anywhere else: we focus on the problem and not on the technical intricacies of a particular language.

I’ve experienced how we work while building a product with a cross-platform codebase. As an engineering team, we see the need of a user, and we come up with ideas to solve it. Talk about these ideas, draw and test them. Then we write data structures and functions. Clojure/Script is very well suited for these — there’s little to no syntax. Code is data, by the way. The language is also highly interactive, so we see the results as we type the letters into the editor. Additionally there’s a REPL sitting next to the editor where one can sketch a solution and interact with a running app. It’s like being able to change tires while riding 25km/h (I’m an urban cyclist) and having infinite lives. Not dangerous and very impressive!

The feedback loop of getting something in the app, making it work and polishing it takes way less time than in my usual way of doing things with native iOS. We don’t wait for the compiler to finish churning through the bits, and we don’t have to click or tap through the app, again and again, to bring it to the right state. It may sound superficial, but think of this: the feedback cycle drops from a 15-30sec interval to 100ms. How much faster can one iterate? How long will it take one to polish a UI element? Just this simple fact frees us from a burden of wasting time waiting while the code compiles, so we don’t spend time over-engineering a button class in a (mathematically) proven way using all of the particularities of a language so that it’s robust and doesn’t break when something changes. When the feedback cycle is significant, every bug leads to a painful cycle of changing few lines of code at a time, recompiling, restoring the state of the app, and checking the result. But when the cost of an error is just a few hundreds of milliseconds, one stops worrying about it. It’s not a problem. It’s so much not a problem that we can break it many more times, completely guilt-free, and stop after we find the best solution for the user and the business.

As the app is cross-platform, after every change to the codebase, we get fully featured apps running on macOS, Windows, Linux and in the web browser. Thank you, CI/CD computers from the cloud.

That’s the qualities of our current day-to-day work that I want to take to the yet to be formed the mobile team. That’s why I’m taking a bet and would like to start building a hybrid mobile application. It has an insignificant probability of failure, and all of these ambitions might evaporate in a year or two while we’ll be rewriting the app using native means because the outcome doesn’t meet our standards. We’ll be a team of smart people with an adequate level of humility, so we’ll go through the bitter feeling and correct the course. Or perhaps not, and everything turns out well, and we’ll reap the good fruit of taking the risk.

As a mobile team, we won’t be a platform-expert silo that simply implements technical requirements and mockups given from somewhere else. I see us being a part of the engineering team which builds the product altogether.

We won’t be a team which is invited to a product meeting simply as platform experts, where we can help to figure out how to adapt the product to the platform limitations (small screen, touch input, SDK intricacies) or benefits (voice assistants, on-the-go scenarios, security features). I see us taking part in the discussions and processes that shape the product and its direction.

I see us talking about more about the problem and less about the implementation. I see us coming up ideas on how to save users’ time, not arguing whether to hop on the next fad train of the new variation of MVC. I see us iterating on the problem with close to instant feedback, not fencing swords while “it’s compiling.”

I believe that we can prove to the development community that a team of curious minds can ship a hybrid mobile app with an excellent user experience.

So, enough me with this ambitious visionary mumble-jumble. Now about you. I’m looking for a few new awesome teammates, no matter of the race, gender, religion or any of it. Someone who would like to take risks with the technology of choice. Who likes experimenting and solving problems of users and the business we’re in.

I’m looking for open-minded iOS and Android engineers who love their respective platforms, and who would like to build a bridge to the world of the web apps and come up with productive ways to solve problems.

I’m looking for frontend engineers who are experienced with ClojureScript and want to dive into the land of native mobile apps, where 16ms response times and proper rubber-banding animations are flowing.

If it sounds exciting, then I’d like to hear from you. You can find the job description and the “Apply” button here!

Cheers, Misha

Clojure Berlin is awesome

2019-01-09

Clojure Berlin is one the best groups of people to hang out with. Everyone there is smart, talks about interesting topics and what’s very cool is that the whole event appears to be a big group of friends.

I had some weird ideas regarding how to build software, and I’ve met somebody tonight during the meetup that not only appreciated the idea but also complimented it with their experience. It felt very unusual that somebody would resonate with my weird idea.

When I visit social events like other meetup, concerts, shows, conferences, usually it feels strange. I know that most of the people at these events share at least one interest between me and them — that’s why they’ve made an effort to come to the event! Yet I usually end up talking to no one.

This meetup is not like this, at least for me. Come next time if you happen to be in Berlin.

The "Why?" chain

2019-01-08

Every parent keeps talking about their children, even when they grow up. My mom always reminds me that I tortured her with a question: “why 2 plus 2 equals to 4?” I don’t blame her for not answering this question. And I got an answer in my twenties.

When I became a father, I’ve made a promise to myself that I will always answer my kid’s “why?” questions. I don’t always keep the promise. When I’m tired I simply reply that I don’t know. But whenever I can, I try to follow the long chain of “why?” questions to the very bottom of the rabbit hole.

Funnily enough, usually the chain ends somewhere at the beginning of the universe or at the level of atoms.

— Dad, why did we come in late for the morning circle (in the kindergarten) today?

— We left our home too late.

— Why?

— Because you were busy playing.

— Why?

— Because you find play interesting.

— Why?

— Because you’re naturally curious and you like to learn.

— Why?

— Because if humans would be wired to be incurious they wouldn’t progress as a species, and perhaps wouldn’t survive through tough periods of time.

— Why?

— Because when sudden cataclysms arrive one has to be smart to find a way to stay alive and well.

— Why?

— Because people have little time to react.

— Why?

— Because from the definition of cataclysm it means an unexpected fast change.

— Why?

— Because people needed to find a term for the event.

— Why?

— Because they needed to communicate.

— Why?

— Go to your mom.

People-related abbreviations are considered harmful

2019-01-07

I think that abbreviations related to people bring more harm than good. The only benefit is that they save you some typing. The downsides are plenty.

People come up with abbreviations to name things that otherwise would be too long to explain. In programming we deal with this problem all the time — naming is one of the two biggest problems in computer science, as the saying goes. Same as class and function names, abbreviations are simply abstractions, and they entail complexity.

Complexity is a great tool when you want to cheat.

Here’s the thing. When we’re using abbreviations in our organizations, we abstract our language away from the level of relationships. We can refer to a co-worker as a “person”, a word that is loaded with importance, human value, individual privacy and empathy. Or we can refer to a co-worker as an “FTE” — a Full-Time Employee, a term that means a position in the need to be technically fulfilled. An empty box in a system for which someone can be hired or fired. It’s a neutral word that is void of emotions and moral implications.

Terminology can change the way we think about a phenomenon. Abbreviations elevate it to the next level, which is even more disconnected from the human interaction.

Can I fire a FTE? Sure, I won’t think too long. I have goals to reach and work to do. Hiring and firing FTEs mean pushing buttons on my computer. They are percentages, numbers, spreadsheets and graphs.

My parents didn’t say “FTE” at home when I was a child. My friends perhaps don’t even know what it means. Thus I haven’t had time to build an emotional connection to it. So I don’t care.

But can I fire a person, a mother or a son? Oh, here where the question becomes loaded. There’s an instant feeling of responsibility rising.

Organizational abbreviations and slang are especially hideous when spoken out loud.

You can probably tell I’m reading “1984”. I’m utterly fascinated by Newspeak.

When speaking inside a team, I’d encourage you to think about your team not as if it’s a soulless function of money and time to produce a result, but about as of a group of people. Try using the usual empathetic every day language that people grew up with and that they are familiar with.

My weird relationship with things

2019-01-06

I’ve noticed a behavior of mine at some point: I don’t mentally refer to an object as mine until I do a round of maintenance for it. For example:

This is helpful in many ways.

First, it makes things that I own better over time. I value them more, and enjoy their longer lifespan. This can be achieved also by customizing or replacing parts with more reliable ones.

Then, it makes me want less things. I go through the mental exercise of making a thing mine, and I get tired pretty quickly even thinking about it. I don’t want to spend time on the new things I get.

I’ve discovered a few hobbies while practicing this exercise. One of them is repairing electronics. It started with a broken screen on my smartphone. Replacing it was frightful, but the satisfaction was immense. I used that thing with pride. My friends immediately started to ask me to fix their phones. Here’s a freebie, and no need to thank me: if you want to keep a friend, don’t fix their phone.

The electronics repair hobby brings lots of utility to me. I can spend my leisure time in a way that brings value. I save time and money because I don’t need to go to a store or a repair shop and ask somebody to do it for me. I think one can take a positive environmental angle on it too.

I’ve torn down and put back my Kindle today because one of the buttons was stuck and sitting a bit asymmetrically. I’ve enjoyed 30-40 minutes of a nice mental flow, which felt great. I didn’t actually fix the button because of a metal spring that was bent and I couldn’t straighten it.

I often look at the things not from what they can do but from how maintainable they are. I love how relatively easy to repair older MacBooks are. My favorite is the unibody 15” one. You could swap or upgrade the battery, hard drive, RAM, display assembly, keyboard with relatively easy effort. The first 15” retina was also great, though more components were custom or soldered on the logic board. Latest 12” MacBook consists basically of 5 pieces: logic board, screen, battery, trackpad and a keyboard.

I like that companies like iFixit, people like Louis Rossmann, and acts like Right to Repair are actively pushing towards liberalization of hardware repair.

On the other hand, I am still undecided whether unauthorized repair means stealing intellectual property from the manufacturer, or if it’s a human right as a part of the fact of ownership.

Don’t hear what I’m not saying. I won’t tinker with every thing I get. Especially if it puts safety at risk. It’s a useful exercise that I sometimes do.

Predicting the future of tech

2019-01-05

I was reading Steven Sinofsky’s twittered musings on the topic of iPads replacing other forms of personal computers. He’s probably right. I don’t know. I also can’t find the tweets anymore. Steven posted an excerpt of an article from 30 or 40 years ago where the author doubted utility of a computer mouse. As you can imagine, that article is very funny to read now that we live in the future it was trying to dismiss.

In retrospect the sceptics who had wrong predictions will look the same as Steve Ballmer’s interview about the iPhone.

The topic of trying to predict the future reminded me of the great article by Ben Evans called “Office, messaging and verbs”. Do yourself a treat and read it. My takeaway is this one:

Rather, the way they change tools is if you give them fundamentally different ways to achieve the underlying task.

This is awesome on many levels. I like to be reminded about the fact that we don’t know what we don’t know. Also, I enjoy to observe my hindsight bias. I like how most of the tech things of today are so obvious (not) to be invented!

I sometimes imagine myself going to the ancient world and picking and choosing what novelties of 2019 I’d tell the people of that time (yeah, silly).

I love this quote from Hal Varian:

If you want to understand the future, just look at what rich people do today.

Indeed, having fruit as a staple in ones diet, modern health care (Germany is doing very well on this front), international travel, mobile communication devices were unthinkable of a middle class person not even a hundred years ago.

I get full of appreciation for innovators and dreamers. I’ve been dismissive about many recent novelties (touch screens, YouTube, bitcoin). Since then I’ve decided to be more open to the ideas that I think are stupid, that I don’t understand or that seem to be useless. Ideas are fragile.

These days, I personally look forward to the culmination of the Moore’s law, quantum computing, space travel, new energy storage tech, privacy war, withdrawing from hedonism and false self-reliance empowered by technology, switch from excessive consumerism to more sustainable drivers of the economy, liberalization of hardware development, basic income, self-driving cars and many more things. I’m optimistic that mostly good things will survive, and that we’ll all be just fine.

My Twitter dilemma

2019-01-04

I have a problem with Twitter. Well, several, I suppose. First and foremost, I have little to no discipline of keeping myself away from the timeline. If only I open it with an intention to distract myself for a minute, I’ll find myself 20-30 minutes later still mindlessly scrolling through it. I’ll hate myself after it because I lost time.

After reading the timeline I usually find myself feeling way worse than before I opened it. There’s so much negative yelling about politics and world problems that want it or not — it gets on you. And then I’m feeling that we’re all doomed.

There’s also little to no value that Twitter brings to me these days. It used to (I even landed a job once). There are a few people there that I care about, but that’s about it.

So I thought of deleting my account. I had the same issue with Instagram, I deleted my account, and I think that it was a great decision almost every day since then. In a similar fashion I went ahead and disabled my Twitter account.

But then I wrote a blog post yesterday, and wanted my friends to have a look at it. How should I let them know about it? I don’t have even a slightest amount of hope that somebody will visit my homely corner of the internet. Everybody says RSS is dead. Never in my life I felt so isolated.

So I reactivated my Twitter account, posted the link there, and got some feedback from my friends. The feedback felt great! But then I got swallowed by the cunning dragon of Twitter’s timeline, and the negative feelings overcame.

I think setting up an automatic repost might be a good way to solve the problem. I’ll give the password to my account to a friend so that I don’t have a chance to login.

Also, I wish that Twitter would have RSS feeds for people’s timelines.

A thing I like about ClojureScript

2019-01-03

I’ve been a part of a team consisting mostly of ClojureScript engineers for a year now. I’d like to point to one positive piece of feedback from my side.

By using ClojureScript, our team gets an opportunity to talk less about the language and more about the problem.

Perhaps it’s because the syntax is very minimal, the amount of abstractions one can use is just right, and there is usually a single way how to express an idea in the constructs of the language.

I used to work with Apple’s Swift before, so I’ll give you an example for it. When using Swift, one can often express the same idea using classes, structs, plain functions, protocol extensions or even enums. That’s a lot of things to take into account, and different people can have preferences for one or the other. When a member of a team opens a pull request, reviewers start to not only look at the algorithm or the approach of the solution, but at the usage of the language constructs, because they in fact are part of the approach. Then an argument regarding the usage of a language construct might rise, and if something needs to be solved it would require refactoring many lines of code.

I’m not saying these kind of discussions are useless. Also, Swift has its advantages. It always depends on the context. For a young company like ours, I think it’s great that the programming language gets out of the way and we can skip (perhaps postpone?) discussion about the use of the language.

To solve a problem using ClojureScript one can choose between a function or a data structure (which there are only a handful). Yes, I’ve naively simplified the statement, and so did I with the Swift example.

Of course, technical discussions are always present. However, more often than not we talk about browser’s behavior and APIs, performance characteristics of the code, function composition etc. Most of the time, these topics are not about how a particular problem is expressed using the language.

That’s the number one thing I like about ClojureScript. It simplifies communication and removes distractions.

P.S. I still consider myself a newbie in ClojureScript. Most likely the language is more complex than I even imagine. That’s not the point. I observe how our team operates, listen to the conversations, and this post is my conclusion.

Thank you, Vicky

2019-01-02

I’ve just finished reading Vicky Robin’s letter to the FIRE community as she is departing to some other contexts. There’s lots of gratitude and warm heartedness throughout the whole letter.

I’m taking time to dream and write and think and stay close to my heart, trusting that this, like everything else I’ve done, will bear fruit in surprising ways. I have no idea where I will land, but my little boat is clearly leaving the harbor.

That’s beautiful. I appreciate when people are self-reflective, and they aren’t afraid to tell everyone about their thoughts, hopes, doubts and feelings.

I also appreciate Vicky’s thoughts that the whole FIRE movement misses the point: financial independence is not a final destination, but a tool.

I always thought that teaching history, philosophy, ethics and literature at schools is a waste of time. Give me more STEM, you know. These days I think that both are very important. On the other hand, I doubt any of these subjects can be really taught (go through the curriculum and verify the knowledge). How does one teach another so that they want to change their life?

Teachers have to plant seeds of curiosity and inspiration, prove their teaching with a personal example, and then provide guidance. In this context, I think Vicky has done a great service to the FIRE community with her letter: she showed how she feels about the topic, and she pointed to vision and gave perspective.

I wonder if she originally thought of “Your Money or Your Life” as a strategic transitive point, or she has discovered that it is not worthy of being a final destination in the retrospect.

On a seemingly disconnected note, I had a conversation with a friend of mine yesterday who just switched jobs. When I asked him about the reasons for the switch, he said that he followed his former manager, because this person is a pleasure to work with. I’ve asked my friend to describe this person because I’m curious of what characteristics such people have. It turned out that the person was almost 60 years of age, very seasoned in their experience, had seen enough in their career to become a hands-off manager, but yet they continued to keep doing actual work. I think this is a great explanation of why one would follow another person.

With the today’s increased pace of the economy, and me being so focused on it, I wonder if I even trust older people. Does my infinitely prolonged childhood make me continue to distrust older people (because they simply don’t understand) as it was in my actual teenage years?

I think we need to listen more to the older, senior and wise people in our lifes.

Follow YouTube channels via RSS

2019-01-01

I went back to consuming content with a RSS reader. Now I’m gradually building up a list of subscriptions to various sources.

I have a bunch of YouTube channels that I enjoy watching. I don’t have a YouTube account. Today I thought that it would be great if I could be notified of new videos on these channels in my RSS reader. Well, I was very pleased when I found out that somebody else has already thought of it.

From YouTube’s help:

To get an RSS feed of a single channel’s uploads, paste the channel URL into your RSS reader.

That’s cool.

Recent thoughts on applications

2018-12-31

I’ve been thinking on what kind of GUI apps I enjoy using. Several years ago I put great value on the aesthethics of an application. At that time I would choose the aspect of how the application looks and feels as perhaps the most important one. Heck, I even took part in developing a very attractive todo app, which many others considered if not as the one with the best set of features, but at least with the best look and feel (yes, partially padding myself on a shoulder here).

Funnily enough, I have a come-and-go relationship with any todo systems (with an exception of bug trackers) as I use them exclusively for short and busy times of my life (moving apartments, finishing a project etc.), so I never stuck with a todo app for a long period of time.

After my mind became familiar with the novelty of good-looking software, I eventually got bored with the aesthethics and started to pay more attention to the habitual and utilitarian aspect of it. Never have I been in a state where any of these aspects were maximas (i.e. I wouldn’t think that useless but pretty app is of a great value), and it’s just that priorities have changed.

A piece of software I’ve been enjoying a lot is Kleinanzeigen (a copycat of craigslist for Germany). The looks and feels of it are not worth mentioning — they are there, and they allow a user to extract value. The utility of this service is enormous. For example, it simplifies moving inside a city, inside a country or even internationally, by allowing users to hopefully quickly dispose or acquire furniture and other posessions. Here you go — this website “empowers geo-arbitrage” (perhaps something for a not-so-good billboard ad). Or another idea: the website allows one to “rent out” certain things if they are undecided about owning them yet, or maybe if they need them for a brief period of time (like a camera for vacation). Then there are the environmental and monetary aspects to it, the delayed gratification one (when opposed to 1-click buys), a bit of excitement of risk and so on. Yes, I overthought it much more than I should.

How did I end up comparing GUI apps to something that’s a marketplace? I don’t know. They are pieces of software with which users interact, they have some graphical interface, they are intended to solve users’ problems. I think most of the software is somehow connected in my mind. But these are apples and oranges. The reason why I think about software in such a way is because I’m thinking what to work on and how to make my results more useful. No one should directly compare building warehouse furniture to designing kitchenettes, however someone has to decide to work on either of these (at least at the same time).

Recently I’ve started to pay more attention to the ethical aspects of software. Obviously, that’s not without a reason. I’m influenced by the media and their stories how this or that company tracks its users, pushes limits on privacy (or pivots ehm, redefines the term), develops techniques for their apps to become addictive and so on. In the light of such news features like decentralization, encryption, openness become practically important.

How do I incentivize myself and others to create ethical software? How do we keep it up with the competition? A friend of mine used to repeat a mantra: best product wins. So how do we define “best” here?

I don’t think we should necessarily oppose ethics and convenience. I hope there’s a sweet spot.

Accounts cleanup

2018-12-30

I’ve just spent around an hour deleting all of the accounts that I’ve previously created on various online services, and that I don’t plan to use any more.

I very much appreciate when a service has a “Delete account” button.

Website updates

2018-12-29

I’ve been thinking of what I like about the internet. It turns out I appreciate visiting homepages of various interesting people. I like that that web is distributed and everyone can do whatever they want. Something inside me resonates with the push against centralization. I also rediscovered RSS, and replaced reading Twitter with going through my feeds once a day.

I’ve removed all of the analytics snippets and custom fonts from my homepage, and added an atom feed.

In other news, a few of my friends were asking about my interest in personal finance recently. I thought it would be helpful to have a summary page with some links that I find useful, so here it is: On Personal Finance.

Devlog — Transpose a Matrix in Clojure

2018-04-10

Today I learned a neat trick how to transpose a matrix (vector of vectors) in a very concise manner in Clojure.

Assume that you have a data structure like this:

(def input [[1 2 3]
            [4 5 6]
            [7 8 9]])

And that you need to get a data structure like this:

(def output [[1 4 7]
             [2 5 8]
             [3 6 9]])

By applying (apply mapv vector input) you will get the expected result. I discovered the solution on Stack Overflow.

Here’s an explanation, in my own words:

Non-obvious Tips for Beginner Software Engineers

2018-01-10

My name is Misha, and I’m a Senior Software Engineer currently working at Microsoft. I started my professional career in 2008. Since then, I’ve worked with several teams in Ukraine, Australia and Germany, and have learnt several tips that I never heard anybody sharing with others.

Here are some of these tips. I think they are targeted at beginners. If you find any of them helpful, I’d love to hear about it. Send me a direct message on Twitter or write me an email.

1. Use English for everything.

This is for the non-native speakers like myself. I can’t emphasize enough that being proficient in English is the most important skill in our industry.

Learning is most effective when one uses the knowledge proactively. When it comes to the language, one has to speak it in order to become more proficient in it.

Here’s what helped me to improve my English skills:

2. Learn grammar.

Your colleagues will judge you based on many things, and the way you write is one of them.

3. Use your real name online.

When your colleagues will try to mention you in a group chat, or send you an email, they always will start with typing in your first name. They will think, “I want to send an email to Peter”, and start typing p-e-t… And all of Peters are expected to popup with autocomplete. If the receiver is not there, the sender goes off on an unpleasant journey of looking up the receiver in the address book of sorts.

Make sure you use a combination of your first and last names when registering an email address, personal domains, a Twitter handle, a username in Slack and everything else. Not only it looks “professional”, it also saves your colleagues’ time.

4. Care about your online security.

When starting to work in an organisation, one is given access to private code repositories, group discussion, server credentials etc. It is a high risk for an employee or a contractor to use weak or repetitive passwords.

5. Learn how to use a Unix shell and a Unix-like OS.

Try using Linux as your main OS for a couple of months. Some things most likely won’t work, and you’ll learn many skills while fixing them.

Try using a Unix shell, like Bash or zsh, as your main interface to the computer. Navigate the file system using cd and ls, write code and texts using vim or less, check email using mutt etc. Knowing how to use shell will become one of the best tools in your professional toolbox.

6. Always have a personal computer and phone.

It’s a good idea to make a clear cut between home and work when using your employer’s hardware. I find it useful to think that everything one does on a) any device in their working hours or b) outside of the working hours but on employer’s devices belongs to the employer. Using work devices for private purposes or side projects might lead to legal consequences.

You will likely switch jobs at some point, and you want to give away the devices without being afraid of losing personal data.

7. Learn to type quickly.

Being a quick typist gives one an advantage of being able to try different code ideas fast. I often start writing code without a clear understanding of what the final result will be, and I try to “massage” the first working draft into something that is more readable and has better naming. Being able to type the code quick allows me to produce results faster.

Typing quickly is also helpful when communicating with others. Sending “Liz, thank you so much for your help yesterday!” instead of a short “Thanks” will make one’s relationship with Liz better. You want to be able to write nice messages quickly and without an effort.

That’ll do it for now. Thanks for reading!

Learning notes on RxSwift

2017-11-10

These are my learning notes on RxSwift after watching an introductory video course. I’ve sent these notes to a friend of mine who mentors me, and he suggested that I publish them as a blog post. It positively impacted my learning process.

I’ve written all of the definitions in my own words so that I can remember the material better.

After finishing the video course, I had some significant gaps in understanding of the basics. Because I just kept writing the notes, I had a goal to be able to explain the terms, and after finishing, I’ve started to understand them.

I stopped the videos and redid all the examples I saw by myself. This helped a lot, because I learn by doing.

I’ve used Xcode Playgrounds for this. Setting up Playgrounds to work with a 3rd party CocoaPods library is tricky; I’ve tried to use an open source tool to automate the process, but it didn’t support Swift 4, so I did it manually in the end.

The course was in Swift 3 and RxSwift 3. RxSwift 4 was just released and had some significant changes, which I figured out from the documentation.

It was challenging for me to understand the RxSwift’s Getting Started documentation, and after finishing the course and getting some hands-on experience, the documentation became very clear.

I’ve also found marble diagrams very helpful.

Here are the notes: