Hey there! My name is Rakhim, I'm running Hexlet.io. Check out my Intro to Programming course, new lessons are out twice a week.

This blog is about life, technology, tools, people and their languages. I also have a much older blog in Russian.

Products aren't for people yet

Remember how your parents would try to use Windows 95 or something like Norton Commander. They’d copy an app shortcut to a floppy disk and be amazed how much stuff they were able to put inside. All the games, and lots of space left! And you’d think they don’t understand anything at all, they are just clicking pretty much randomly, hoping this magic machine would at some point understand them and do the right thing. That was the time when programmers were building products for programmers.

It wasn’t awesome, but it was sincere. Nobody was pretending that software was built for regular people, and the consensus was: in order to use a computer you have to learn something. Or know someone who can help.

Today we’re living in times when programmers ~are building products for people~ believe that they’re building products for people.

This isn’t awesome and it’s not sincere. Today all of us regularly feel like our parents with Windows 95. You have to learn or, more commonly, just remember how to use a certain website or an app. And I’m not talking about small pieces of software, I’m mostly talking about huge, global products: Google’s user interfaces are chaos and madness, Facebook is madness and mess, Android is mess and vertigo. Trying to do something non-trivial, not the most basic thing reminds me of good old pixel-hunting quest games: What if I press here? Is it a button? Can I drag this? Oh, this is text, but it’s clickable, and this is a button, but it looks like a text…

Using these interfaces on a daily basis feels like a dream to me. You know, like in a dream you’re trying to run, but it’s futile. And everything changes chaotically, and nothing makes sense. And it’s so nice when it rains, but sausages are going to burn. You know. Meanwhile, Google and Facebook are doing AB-tests: “hmm, if we make this button less button-y and move it to the left, more people would click it”. So we get an update to a bad UX.

It’s hard to build painless products in general. But it’s especially hard for programmers to build painless products because in order to become a programmer we all had to endure suffering consistently. This is the unfortunate reality: you have to eat lots of shit to become a software developer. So we have a higher tolerance to UX pain, and this affects the way we design products and interfaces.

I’m talking about our tools, of course: languages, libraries, frameworks. You’d like to get into the creative process and explore interesting problems and abstractions, but first, you have to deal with versions, dependencies, compatibility, bugs, updates, and other accidental complexity. This is a vicious circle because programming tools are created by programmers.

Of course, we aren’t doing this because we love pain. Lots of progress is made all the time. Unfortunately, often, users pay for this progress. Architectural solutions based on programmer’s convenience affect end-user experience, design, and UI. My favorite example is Atom. A text editor. Still works with visible lag on an insanely powerful multi-core, multi-gigabyte machine. This text editor performs worse than one would 30 years before. Because Electron is a nice development tool.

Electron is not bad, the situation is bad. The situation where Electron is a good choice is pretty bad.

We can say bad things about programmers, rant about how we can’t write code anymore, how frontend web developers are insane and npm is considered harmful. But it seems like on the macro level this is just a transition period. Some day we’ll get to the point where programmers would build products for people, and, hopefully, we’ll think of it as “people are building products for people”.

Justify when reducing user's freedom

Links should not forcefully open in a new tab because by enabling this the designer takes away some of the freedom from the user. Without target="_blank the user has a choice: open here or in a new window. With target="_blank" the user has no choice.

I will not add background music in my podcasts because this would take away some of the freedom from the listener. They can add background music to the speech, but they can’t remove the music if it’s present in the source.

Of course, some links require the new tab and some podcasts require music. This is not a rule about web interfaces or podcast production. It also doesn’t mean “allow as many options as possible”. This is just a reminder: if your idea reduces the user’s freedom, you have to justify it.

What is binary?

My attempt to explain binary numbers.

Backups

I’m not going to try to convince you to backup data. I didn’t do backups for the most of my life, except for some photos and videos here and there. And those weren’t really backups, more like archives on external HDD’s.

I use computers every day since, gosh, I guess 5th grade, and never ever did any hard drive fail on me. This is remarkable. Screens, keyboards, mice, even fans have died over the years, but not hard drives. Good old magnetic, noisy, spinning monsters.

Backup evangelists love to say how “your HDD will fail, it’s inevitable”. Well, yes, it will fail inevitably as you use it for years, but the truth is — you’ll more likely switch computers before your drive fails.

But the truth is, it’s extremely unlikely that you’ll ever need a backup. You’re probably good. I prefer to think about this stuff as an insurance. This is how you buy peace of mind. There are so few aspects of life where you can actually do that — pay some money (not much, too, which is great), and get some peace of mind. Medical insurance, for example, is sort of like that, but not really that good. With data backup, I can be pretty sure I will get everything back as it used to be, effectively travel back in time. Recovered data is precisely the same as lost data, so it’s not really lost anymore. While my body after medical treatment is not the same anymore.

I’m not gonna go all “3-2-1 backup” on you. That’s the idea that in the perfect world you need at least 3 total copies of your data, 2 of which are local but on different devices, and at least 1 copy offsite. So, if all of your files are on your computer, then you need two external hard drives and a remote hard drive (maybe one at work, in another house or in the cloud). I don’t do that yet. For now my backup strategy looks like this:

  1. Offsite backups with Arq (Dropbox and Amazon Cloud Drive)
  2. Local backups with Time Machine and Carbon Copy Cloner

Most of the things I work on daily are on Github (personal and work), Dropbox (personal) and Google Drive (work).

Let me first explain why I said no to Backblaze and Crashplan. Long story short: I don’t trust them.

Backblaze

Backblaze is a beautiful, sleek guy who says “don’t worry about it bro”. Mac client is minimal and cool, and it “just works”.

There are few issues with Backblaze:

  • It’s not really a backup solution. If you delete a file from your computer, then in one month it will also be deleted from Backblaze’s servers. It syncs stuff just like Dropbox does. This is why Dropbox in and of itself is not a proper backup solution.
  • If you backup an external drive and disconnect it from your computer, then Backblaze will delete that backup from their servers.
  • Backblaze doesn’t backup 100% of files. You can remove some exceptions manually, but some of them are built in. So, I can’t really have a complete copy of my boot disk, for example.
  • If you need to restore files from Backblaze, you’re gonna have a bad time. Your options are: download a Zip-archive (if your file is 10 levels deep, then you’ll get all the upper level folder structure in the archive) or get a flash drive or a HDD via mail. You can’t restore files in place.
  • Some users say it’s very fast, some say it’s very slow. I can’t figure out the reasons, but for me it was dead slow. It took almost 120 hours (5 days) to upload less than 200G of data.
  • Android app seems to be made by a very intelligent puppy.

Crashplan

Crashplan is a douchey-looking guy in an expensive suit who says “the synergy is just overwhelming in this merger”. It took me a while to understand how it really works. It’s called CrashPlan Online Backup and it can backup, among other places, to your external hard drive. You know, because online.

But once you get it, it’s pretty great in theory. With Crashplan you can backup to any local hard drive and offsite machine (like friend’s computer or any other machine in your network) for free, and with additional fees you can also backup to Crashplan’s cloud.

  • If you use their cloud, then it’s really a backup solution. All your files are stored in the cloud forever*. Unlike Backblaze.
  • You can restore any file to its original location or any other location. No need to download Zip-files from a cumbersome web interface.

(* not forever)

Crashplan Mac app is… well… ugly like hell.

Look at this Java shit.

I was happy with Crashplan for the first few days, and possibilities of adding more backup destinations if I decide to go all “3-2-1” was reassuring. But it turned out I can’t trust it.

Crashplan, like any other software of that type, is supposed to work in the background, doing its thing while I do mine. I was restructuring files in my photo archives, moving files from folder to folder, renaming stuff. Nothing extreme. But in few days when Crashplan said it backed everything up, I tried to restore some files to check how it works. And it just lost the whole photos folder, tens gigabytes of photos. That was the folder I was fiddling with.

I understand this is unfair. Trying to make a reliable copy of the file system while it changes is hard. But:

  1. Should it fail, it must fail gracefully. Losing all the files is unacceptable.
  2. The end user should never worry about this stuff. I wasn’t doing some crazy hacking, I just moved files around.

Oh, and Crashplan’s Android app seems to be made by a very intelligent puppy as well. Is there a software company ran by puppies I know nothing about?!

Arq

Arq is only an app for your Mac or PC. It doesn’t offer any cloud backup storage itself. It’s not even a guy like Backblaze or Crashplan. It’s a faceless, soulless robot who says nothing. This is what backup software should be like.

Arq can backup to Amazon Cloud Drive, AWS, Amazon Glacier, Google Drive, Google Cloud Drive, Dropbox, OneDrive, your SFTP server or NAS. You can set multiple sources and destinations. For example, I have the following setup:

  1. Home folder → Dropbox
  2. Photo archive → Dropbox and Amazon Cloud Drive
  3. Podcasting archive → Dropbox
  4. Current video projects → Dropbox and Amazon Cloud Drive
  5. Work-related podcasting archive → Google Drive

And at any point I can add other destinations, including a network attached storage.

My Mac’s SSD is just 120G, but my Dropbox is 1TB. It’s great to finally make all that space useful by setting Dropbox as a destination for Arq. And Amazon Cloud Drive is just a great deal — unlimited storage for $60 per year. Of course, you have to remember, that it’s not really unlimited, and if you go crazy, Amazon is allowed to kick you out.

Some cool features of Arq include:

  • Local encryption. Arq encrypts files before sending it, and sends it with SSL.
  • Backups are stored in open documented format. Even if Arq dies and completely disappears, your encrypted data is safe and accessible.
  • A very nice and straight-forward native app with some advanced features like CPU usage, upload rate, scheduling, data validation, budget restrictions (relevant for AWS, for example). You can also make Arq run shell scripts before and after backup sessions.
  • Arq truly backups everything. All the files, any format, any size (even crazy tens-of-gigs files) without restrictions.
  • Fixed price and no recurring fees.

Arq also can archive: backup a folder, click “Detach…” and Arq will stop backing it up, but will store the previous backups indefinitely. This is great if you want to backup some external drives that rarely update.

Local backups: Time Machine and Carbon Copy Cloner

My photos and work-related audio- and video-projects live on an external drive and are backed up to the cloud along with the home folder. The whole internal SSD gets only local backups, because it’s not that important. There are two things I need from this system:

  1. Restore the system to a previous state. І never needed this with Macs, but I just feel safer this way when I upgrade the OS.
  2. Boot from USB drive if internal drive fails. As I said, I didn’t have failing drives (neither HDD’s nor SSD’s) in my life, but SATA cables do fail sometimes. Should that happen, I can just boot from an external drive and continue working until the problem is solved.

Time Machine is good enough for quick restoration. I use Carbon Copy Cloner to make an external bootable copy. Alternatively, SuperDuper! is also nice. I like CCC more because it also copies the recovery partition, which is used to reinstall macOS. You don’t really need it, because all modern Macs come with a Network Recovery option.

That’s it folks.

Please, recommend me a book about X

In the past I spent hours asking people to recommend me some books, in both real life and on the internet. I was starting to learn programming, so obviously I wanted to find The Bible, the best book for each of the aspects of coding. What is the best book about algorithms? Can you please recommend a book about Java? I’m looking for a good book that’ll teach me Django. Any suggestions?

When online courses and videos became widespread, I remember asking similar questions about courses and screencasts. Today our community at Hexlet.io is pretty big, and questions like this appear in our chats, social media, forums and blogs every day.

Of course, there are objectively good resources and not too good ones. “C Programming Language” is a great book, even if you don’t plan to program in C (let’s be honest — you probably don’t). O’Reilly books are usually pretty good. SICP is a must-read. Right.

But the thing is, if you go ahead and ask this question publicly, say, on Reddit or HackerNews, you’ll get plenty of answers. You probably won’t have a definitive answer in the end. Same if you just Google this question: many compelling answers, and you still have to decide.

The thing is — there is no Bible. No silver bullet. And if hundreds of people recommend a particular book, it only means there are higher than usual chances of that book working for you. It might not work for you at all, and that’s fine.

If you’re serious about learning something, you gotta take in plenty of information, read multiple books, listen to many people, watch lots of videos. Some of them will be subjectively bad, some — good. They will work together and help you understand ideas from different perspectives.

Think of this like trying to create a 3D model of an object. One book, one author, one approach is like taking one photo of that object. You get a lot of information (compared to nothing), but creating a good 3D model from a single 2D photo is hard, especially if this object is new, unknown and unexpected. You need at least few other photos, from different angles. Some photos will be so detailed and awesome, that they’ll contribute more than several other photos combined. This quality, level of contribution to the overall result is determined by compatibility between the photo and you. Your sensors, your brain, understands certain photos better than the others.

At some point you’ll get enough, so that new photos won’t make much of a difference anymore. There’ll be a point when you open another book and just don’t get anything new from it. This is how you know you got somewhere.

So, yeah, take some recommendations from people you trust, or just go ahead and get most upvoted books and resources along with some random picks. Nobody knows what is good for you. And only one person can know.

The best general advice, I guess, is to put some effort into knowing yourself first. Try to figure out what works better for you, that’s the only person who matters when it comes to education. Some people get the best results from thick, serious textbooks, some — from humorous, illustrated blogs, others — from videos. There is a guy who says “video is the worst medium for computer science education!” and gets hundreds of upvotes on Reddit? Well, who cares? Jacob from Wisconsin learns better with books and doesn’t get much from videos. Great, now what? This fact is useless to me, I want to know what works for me.

This is not “we’re all unique snow-flakes” type of bullshit. You are not unique, there are lots of people with very similar mindsets and mental structures when it comes to learning stuff. That’s not the point. The point is — unless you actively learn about yourself, you won’t know which non-unique group you belong to. Being unique or not is irrelevant.

— What is the best way to learn X?
— Know yourself first, then try whatever.

What am I doing

There is a popular anecdote in the frog community. Especially older, wiser frogs love to tell to it to younger frogs. It goes something like this: once there was a man who worked at work and ate at diners, and all seemed fine enough to him, and over the years things in his life were constantly changing for the worst, but he didn’t really notice and didn’t make decisions to fix this trend. Today always seemed not too bad compared to yesterday. A year ago was hard to recall, so he didn’t bother. He died being an unhappy, grumpy, miserable man. The end.

The boiling frog anecdote is considered extremely offensive in the frog community.

Metaphorical tales are fun and all, but I find them very unhelpful at times. If you’re stuck somewhere in life and need a push, a boiling frog analogy won’t wake you up. The whole problem is in not seeing stuff clearly, and another perspective just makes you not see stuff clearly from another perspective.

So, instead, think of an unhappy, grumpy, miserable old man regretting his lack of decisions.

The frog is fine.

Dreaming of obsession

When I was a kid, everyone around me was obsessed with something. For some it was football, for others — cars, video games or some martial art like karate. And I was jealous. I couldn’t get obsessed, I was trying to, but couldn’t.

I didn’t have doubts that I’ll become obsessed with video games as soon as I get a gaming console. My parents got me a NES (actually, a Chinese NES clone called “Dendy” that were extremely popular in exUSSR in the 90-s), but instead of a real obsession I got obsessed with the idea of obsession.

I didn’t finish a single game, I didn’t play much in general, but diligently filled thick notebooks with cheat codes, maps of levels and best paths to clear them. I spent hours exploring the cartridges at all gaming stores in the town, compiling tables of comparison to help me decide what to buy. I guess, I was obsessed with something — the infrastructure, the things that surrounded the games. I was simulating the video games obsession.

In high school I was jealous with football fans. They always had something to fill their time: they discussed endless games and championships, played football-related computer games, exchanged cards and posters, read newspapers and magazines. I was jealous just like I was before. I forced myself into watching football games, simulated emotions, got myself into senseless arguments, bought newspapers and read the news. Of course, it didn’t work, I got upset and carried on being jealous.

I am unable to be obsessed. And it took more than 20 years to realize I actually am very lucky.

How to evaluate personal growth

Note: I don’t differentiate between personal and professional growth in this essay. Professional is considered a subset of personal.

New Year is upon us, and along with resolutions for 2015 many of us try to take a look at 2014 and find some promising changes. Did I become a better entrepreneur? Am I smarter than before? Am I going in the right direction? Do I even know what direction to go?

It can be hard to evaluate personal growth, but it’s very important to get some idea about it regularly. Seeing that you’re getting better is a huge motivation boost.

It’s easier with measurable things, for example, with programming. A year ago I didn’t know Ruby on Rails, today I can build simple things with it. Several months ago I’d spend days setting up the working environment, today I have made automation tools to deal with it in minutes.

Back in the university it was also pretty comfortable: I got marks and I could see if I’m getting better. I could also measure the time needed to complete assignments. Working for someone is another position where you have delegated some part of the evaluation to a trusted party: your boss, your team or your clients. Getting a bonus or a raise or just a positive comment gives you some idea. Since January 2014 I’m working on my startup. There are of course measurable things there too: sales, clients, feedback. Just like in school or at work they measure the outcome, and you can get some idea of what it took to get there. But being an entrepreneur (god, I still feel so sketchy saying that), it’s a bit different.

Working as a software developer for some company, you have some tasks, some context and some defined goals. There is a relatively small set of skills you use and assess. Mainly, programming, communication, learning, teaching. So, if you meet all the deadlines, keep your team and clients happy and learn and adopt new things — seems like those skills are getting stronger. In other words, you are able to connect the outcome with your actions and skills.

The difference you’d feel as an entrepreneur in a startup is that the number of skills and actions is larger. Not that entrepreneurs are better than developers! Au contraire, they are worse: they don’t have a chance to focus on a single thing for long periods of time, they have to deal with lots of things, using different skills, but still have the same number of hours in a day as everyone else.

As a result, when your startup, say, gets more sales, you can’t always clearly see the path from actions and skills to this outcome. Yes, you can see the feature your team completed to get there, but that’s not deep enough.

It gets worse: sometimes the path isn’t there at all. Maybe, you had nothing to do with this increase in sales. Or maybe “nothing” is exactly what you did: sales increased because you didn’t do what you wanted, didn’t get in the way.

Startups are about learning, but measuring learning is hard. How your actions and skills affect the overall business is a topic for another discussion, let’s get back to personal growth. So, it’s the end of the year, there’s definitely been some progress over the months, but did I become better? It is very possible that I didn’t grow at all — my team did, my co-founder did, but not me.

Maybe, one way to tackle this is to imagine you-from-the-past dealing with today’s issues. But that’s impossible, unfortunately. That person is gone, you’ll never have access to your past, unless they invent a time machine. But even if they do, and you go there and ask you-in-the-past “what would you do in this situation?”, and get an answer (along with “what the hell, who are you?!”), what next? How to determine if your present answer is better and if it shows your superiority? But fear not, there is a way to evaluate personal growth! It’s called… embarrassment.

About 12 months ago I was convinced I have to spend weeks writing a huge project description and business plan, then hire 5 best developers and designers I can find, work for several months and release this awesome, successful and fantastic product everybody would love. If you’re into startups you know this is a bad bad idea. I know it now, and I feel embarrassed about considering that a year ago. Did I become better in thinking about startups? I’m pretty sure I did.

The best way to preserve this embarrassment material is to keep a diary. Write about your ideas, actions and thoughts every day, and review them in the future. Of course, if you’re embarrassed by everything you do in the past — that’s a bad sign. But if you have nothing — that’s even worse. So, hopefully, a year from now I will feel embarrassed about some of my current ideas and actions. The hard part is to accept the idea that you’re never perfect, you’re never the best. The idea is not to be the best, it is to be better.

Russian «kinda», «sorta» and «like»

I hate fillers. Everybody does. But we kind of don’t care. It became like natural, sort of invisible. We learned to filter them out as we hear people speak, but once you really noticed them in a conversation — it’s done, they’re going to chase you until you kind of die from internal linguistic bleeding (distinctive cause of death of grammar nazis and those who support the movement).

Probably, the most commonly used filler word in Russian is «типа» and it means «kind of» or «sort of». «Тип» has the same roots as English «type», so if taken literally, it means «of the type».

— Что это за штука? Дилдо?
— Ага, типа.
— И зачем он тебе нужен?
— Ну, я теперь, типа, bi-curious.

— What is thing thing? A dildo?
— Yeah, sort of.
— And why do you need it?
— Well, now I am kind of bi-curious.

There is another one similar to «типа» — «как бы».

— Я все понял. Как бы…
— I understood it all. Kinda…

Blin

Hey there. My name is Rakhim and I love English. I love it so much I write little notes about quirks and not-in-the-textbook stuff about English. My notes are in Russian, which happens to be my first language. So I thought why not publish the same kind of notes the other way around – about Russian. So, here we go. The first one is about “blin”

Blin is a type of a pancake common in Russia and exUSSR countries like Kazakhstan. Here are some tasty blins:

But «blin» is also a commonly used interjection, a word used to describe frustration. It is very VERY common in any Russian dialect and the closest analogy from English I can think of is «shit!» or «crap!» or «snap!». It is soft, isn’t considered curse, but is really simple indeed and somewhat vulgar.

Я забыл презервативы!.. Блин! I forgot the condoms! Shit!

Блин, сколько можно ждать?! Damn, how long should I wait?!

It is also used to describe some sort of disappointment or regret.

Блин… она никогда не вернется ко мне… Damn… she will never come back to me…

You probably wonder, why «блин» of all words? What pancake has to do with this emotion? The truth is — nothing. The same as «shoot!» or «fudge!», «Блин» just happens to sound alike with «блядь», which literally means «whore» and considered a real curse word, something parents don’t like their children to say. «Блядь» can play the same role and make the emotion stronger:

Блядь, что это за место? What the fuck is this place?

Блядь! Что ты делаешь?! Fuck! What are you doing?!

If a mosquito bit you in the nose you can say «А, блин!», that would correspond to «Ah, snap!». But if someone hit you with a baseball bat in the head while you were carrying a full cup of boiling water in one hand and a wild cat which spent 8 years in the sewers catching rats in another, you’d say «А, бляяяядь!» («Aaah, fuuuuuuuuck!») and start your new life of a vegetable.

It is important to understand that both «блин» and «блядь» can be used in the middle of the sentence and would be equivalent to English «freaking» or «fucking». In the text they should be put between commas.

Чаю, блин, принеси! Bring me the freaking tea!

Рот, блядь, закрой! Shut the fuck up!

And the last thing: there is also something in between: not yet «блядь», but already not «блин». It is «бля» — a short, somewhat less curse, but still very bad and vulgar.