My name is Ivan Smirnov, and I’m currently a software engineer working on the Google Assistant. I live and work in the heart of Silicon Valley, a mile away from Google’s Mountain View Headquarters. I have a plethora of interests that fill up my evenings, ranging from hobby programming, learning to hang glide, picking up cardistry, building mechanical keyboards, traveling, and participating in adventure sports.
At Google, I spend the majority of my time building out new features for the Google Assistant. The stack is complex and there are many important factors to consider when making any decisions. It’s definitely an interesting environment with a little bit of everything: bugs, tech talks, meetings, events, and quirky coworkers. My favorite part of the culture is getting to learn from my coworkers and sharing my own hobbies and passions in turn.
When I get home in the evenings, my time is divided between organizing events with friends, having tea with family, and hobby programming.
I have a ridiculous number of devices, which explains my love of automation and configuration management (more on that later). Between work and personal hobbies, I have 3 towers, 3 laptops, 5 phones, and 5 VPS’s (virtual private servers). Effectively, I have two primary clusters — work and home.
At work, I use a P920 ThinkStation (36 cores provided by dual Intel® Xeon® Gold 6154 Processors, 192GB RAM, 2TB SSD) with dual 32” 4k Acer B6 monitors. My ErgoDox EZ is front and center, with enough space between the two halves for an OMOTON phone stand. I use a ICEELEC TRRS cable to connect the two halves. I really like the spiral coils on it, since it feels silky smooth and never gets tangled. For navigation, I use the standard issue Evoluent Vertical Mouse 4 — it helps a TON with any RSI or general strain. I have one of these mice plugged in to every desktop I own, as well as a set that permanently lives with my work and personal laptops. After starting to play Overwatch, I learned the value of a large mousepad with a low mouse DPI, so my work mouse lives on a Large SteelSeries QcK Mouse Pad while the one at home lives on the XL flavor. I find this helps me keep my wrist relaxed and arm moving naturally. It took some time to adjust to such a low sensitivity, but I’ve noticed my wrist strain is almost completely gone.
My desktop at home is my pride and joy. It’s a triple-boot Hackintosh (OSX), Ubuntu, and Windows 8 system that I built in 2015. I’m running a Radeon 580 on it (because the Vega 64 line had some critical hardware bugs).
It boasts 32GB RAM, an Intel i7-4770k, and triple Samsung Evo SSDs at 1TB each. One disk is for OSX, the second is data, and the third is a Windows 8 and Ubuntu dual boot. My Windows partition exists solely to play Overwatch; there is no password on the account, and it takes 15 seconds from pushing the power button to logging into the game. After enjoying dual 32” 4k monitors at work, I decided to replicate the setup at home. After tons of research, I settled on the ViewSonic Pro 3268-4K mounted on two AmazonBasics single monitor arms. It’s more convenient to have individual arms, since with screens this big, adjusting height and curve can be a problem when using a dual monitor mount. I have an incredible 4k wallpaper set that I’ve been enjoying for years, and it’s great to finally appreciate its full glory.
Maintaining a Hackintosh is a time-consuming experience and not one I recommend to anyone who is unwilling to dive deep into bootloaders, kernel extensions, and arcane Apple bugs. However, it’s a fantastic opportunity to learn deeply about how modern systems work. The knowledge gained through this side hobby has a tendency to surface in valuable ways at unexpected times.
My home server is a middle-of-the-road Linux box with an Intel i5, 16GB of RAM, and 12TB of storage space. I use it as a staging area for various programs as well as a host for beefy long-running services that are too large for my $5 Digital Ocean droplet.
When I’m on the go, I’m usually either on my work or personal 2017 MacBook Pro. Since much of my work is in the cloud, I didn’t bother maxing out the specs. I like the screen size, and it’s fast enough for my needs. My travel setup is definitely far from minimalistic tendencies, though:
The one bit of software I would struggle to function without is smirnov.wiki. If you look at my top list of sites that I visit, this one is ahead by about 300%. I snagged this glorious domain back when the new TLD stampede was just starting out and made it into my personal wiki. This is the ultimate knowledge store for me. Any information or reference I have goes into this wiki, and over time it’s grown to be a veritable source of highly useful information. One day, I hope to take the time to sit down and clean it up for public consumption.
g/dinto Chrome, it gets expanded to
https://github.com/issmirnov/dotfiles. The expansion works recursively, so mapping
facebook.com/groups/mechanicalkeyboards. The config is pretty intuitive, and I’m slowly building out this tool to cover all my needs. If you run it locally at the DNS level, it even works for phones and tablets!
catclone with syntax highlighting.
cheat findand have a minimal man page dumped out into the terminal, ready to copy and paste.
ifconfig. It’s also easy to write custom color syntax, so I’ve colorized almost all my personal scripts.
I’m always looking to dive into new software and infrastructure, to the point that getting new additions to Kickball/awesome-selfhosted feels like unwrapping presents during the holidays. My current stack includes:
I don’t have a strong allegiance to a text editor and generally use whatever is best for the project. At work, I use CLion for the embedded code and an in-house web IDE for the simple things. At home, I use Android Studio, GoLand, Vim, Atom, and recently VScode in a tab.
My home server is my staging and experimentation ground, and also serves as the backbone of my infrastructure. At the moment, this is the list of the main software and services running on it:
http://code/takes me to my code instance, while
http://g/takes me to GitHub.
On my Android phone, I strive for maximum efficiency, using only a core set of apps:
You’ll notice that I talk about OS choice last. For me, this matters the least. I use custom window managers and spend 90% of my time in Google Chrome and a terminal, so it really doesn’t make a big difference. Each OS has its advantages. Windows is fantastic for gaming, OSX for general usage, and Linux when I want to use the full power of my system for various large projects. I tend to spend most of my time on OSX, since spinning up a Vagrant image with Ubuntu or SSHing into a server is trivial.
Up until I got the ErgoDox EZ, I had never understood the value of mechanical keyboards. I always thought they were for gamers or people who liked to annoy their coworkers. However, in early 2018, my brother bought the ErgoDox EZ, and within 30 seconds of laying my hands on it, I was completely sold. We ordered a 12-Slot Switch Tester from NovelKeys with the following switches: Cherry MX Red, Cherry MX Brown, Cherry MX Blue, Cherry MX Silent Red, Kailh Brown, Kailh Copper, Kailh Silver, Gateron Red, Gateron Brown, Gateron Clear, Gateron Silent Red, and Gateron Silent Brown. After soldering everything together and gluing in the switches, my brother, father, and I started testing to see which switches are best. The LED was an important addition, since it let us know exactly when we crossed the actuation point. Ultimately, I settled for the Cherry MX Browns. The tactile sensations coupled with the stellar reputation and tight tolerances were perfect for me. Naturally, everyone has different needs so I assure the dear reader that YOU and only YOU have made the correct choice :)
I ordered the Black EZ with blank sculpted keycaps and Cherry MX Browns. After typing on it for some time, I decided to install some O-ring dampeners to soften the sound a bit. This was a big improvement for me, since when I get into a flow, I start furiously pounding my keyboard, and the vibrations and noise can get pretty distracting. On a side note, an amusing bit of mechanical keyboard lore is that the first O-rings were actually rubber bands for dental braces.
One of the major explorations that I undertook was positioning the ErgoDox EZ halves for maximum comfort and efficiency. Everyone has their own ideas on how to use it, but when coming from a traditional keyboard, it’s hard to fully comprehend the flexibility that an ErgoDox EZ provides. I found some entertaining videos that really helped me realize the full potential. I started out by following the Official Getting Started Guide and placing the keyboard halves shoulder width apart. Over the course of 2 weeks, I ran experiments over the full permutation matrix of the following variables:
My layout journey followed a typical arc. At first, I branched off the default ErgoDox EZ layout and used the web configurator. It’s a fantastic UI and useful for rapidly iterating. I will not deny it: there were a number of times I forgot to add some crucial key and would have to then plug in my old keyboard so that I could add the symbol back to the layout…
Eventually, I realized that I wanted to leverage more of the QMK features with custom logic. I created a GitHub repo for my layout and would manually add it as a submodule to QMK. That worked well, but I really wanted a way to easily visualize the layout rather than manually drawing ASCII art in the
keymap.c file. Luckily, a coworker created an elegant framework that has a visualizer included. I forked it and have since been happily using it. My ErgoDox EZ layout preview is now generated using a Git hook.
A few notes on my layout philosophy and approach to keymap layers:
%within easy reach. You get one guess for my preferred text editor. :)
pairs right under my strongest two fingers on the left hand. This pairs nicely with the
:=chords on the right hand.
Mod+Shift, and then use my left hand for the arrow keys. You’ll notice the arrow key cluster is shifted to the right by one key, so not the
WASDlocation but rather
ESDF. This lets me save a hand motion when I pop into this layer, since 3 out of 4 fingers are already on the cluster.
Mod(Window/Meta, used for i3 keyboard shortcut command prefix) key right under my thumb, and a
Mod + Shiftright next to it. Similarly, I’ll have my
Ctrlnearby for chords.
I’ve been making heavy use of the QMK hooks provided to us in the firmware to customize the core behavior of the keyboard:
TAP_TOGmacro created by my brother Alexandre. It’s sort of like the Tap Dance option, but is aimed exclusively at layer switching. If I hold it, I get popped into layer 1. From here, several things can happen. If I press any key, then this action transforms
TAP_TOGinto a momentary toggle (
MO) and will reset back to layer 0 when I let go. However, if no key is pressed and I let the
TAP_TOGkey come back up, then this turns into a layer switch key (
TO). This is highly useful, since we were both having problems with rapid typing incorrectly locking us into the wrong layer or keycodes getting recognized in the wrong order. You can see the source code for the implementation.
Esc. Currently, I’m trying to figure out how to make these combos only trigger in certain layers, since when I’m playing Overwatch, they massively disrupt my game.
I’m very excited to learn more about the internals of QMK and see how far I can customize this incredible new tool. The community is rapidly creating new features and new keyboards, so I think this is just the start of a beautiful movement.
At this point in my life, I’m already sitting at my dream setup. I have a perfect desk, lots of good monitors, and comfortable lights and ergonomics.
Looking into the future, my ultimate dream would be:
Super long-term, I’m very excited for brain-machine interfaces to become ubiquitous and reliable. Until then, I will be happily typing away on my beautiful ErgoDox EZ.