When I was 15, the only profession that came to my mind was "graphic designer". As a kid, I loved drawing on a piece of paper. Later my mum bought us a PC, and I started creating "visual art" in Corel.
But then something unexpected happened. My high school in the Czech Republic had a compulsory programming class. We learned the basics of Pascal. After a few lessons, I was convinced programming was by far the most interesting subject at school. I remember thinking "This is easier and much more fun than math!" I was excited.
I started building games. In my free time, I would be skateboarding and playing Starcraft with friends, drawing in Corel, or building games in Pascal. It was around 2002 and we didn't have an internet connection at home. I learned Pascal from my good friend and classmate Martin Čech. Every day at school we would tell each other about some useful language features we discovered (like a switch statement). The only graphics API we knew about was put a pixel on the screen, so I built an image editor that would store images in a custom format on disk. I then used the image editor to create graphics for a simple turn-based strategy game (inspired by Jagged Alliance). I learned about networking much later and used that to build a 2D multiplayer shooter.
Around the age of 17, I realised my visual art was not outstanding compared to the works I discovered on DeviantArt, but I was doing well at programming. There were some competitions in algorithms for high school students and I did OK in those (competed at the national level).
Therefore I decided I would study computer science. It was one of the most obvious and easiest decisions in my life. I felt very lucky because many people find it difficult to choose a career at that age.
Here are some screenshots from a couple of projects from that time:
This was about the tenth game I made, and the first game I released publicly. It was called Total Racing.
I started a 3D game to learn about DirectX, matrices, etc. Didn’t finish.
I grew up using Windows. When I moved to Berlin and started my first full-time job, I switched to Mac.
I go with whatever IDE does the job. For Android development, I used Android Studio. Later I used Sublime and then Atom for most things. Now I'm using VSCode.
My favourite stack to work with is React and TypeScript.
React is not only my favourite technology right now, but in my opinion, the most productive, most fun to use, and best-designed UI library ever created.
Over the years, I have built apps using Delphi, PHP, ASP.NET, Windows Forms, WPF, the Android framework and React. I like React by far the most. It's simple, powerful and easy to learn.
Regarding platforms, I like the web a lot, but unfortunately, it has poor user experience on mobile. Native apps are necessary for good UX and full access to the platform.
However, when it comes to developer experience and release process, iOS and Android are not as good as they could be. Therefore I think frameworks like React Native and Flutter are important - they bridge the gap to provide the best of both worlds.
I have done my share of backend development, mainly in Scala and Java. I like Scala and it's a fun language to learn, however, the compile times tend to be long. Waiting for the compiler is no fun.
A year ago I worked as a contractor on a project to rewrite a CPU-bound backend service from Ruby to Rust. I used Rust only for two months and didn't learn it properly but enjoyed using it. The IDE support was good. Compile times weren’t amazing though.
I am a big fan of static typing. I think types make code more robust because the type checker finds many small bugs that would otherwise happen at runtime. Types also serve as a form of documentation, making it easier for me to understand code written by other people as well as myself. At the same time, I strongly believe programmers should never sit in front of a computer and wait for the compiler for more than a few seconds. If I can have a fast iteration, I am much more productive. I'd rather get good work done in seven hours than spend nine hours being distracted checking Twitter while waiting for the compiler. This is why I think projects like TypeScript or MyPy are the most exciting development in programming languages in a very long time.
I am excited about the potential of TypeScript, React, React Native, Flutter and Rust.
I am blown away by the progress in deep learning and the power of frameworks like TensorFlow, and the relative ease of use of Keras. I did an online course called deeplearning.ai and the biggest takeaway was how easy it was to throw together a machine learning model from some famous research paper, literally in a few lines of code. And the accuracy of those models was not mind-blowing but pretty good, even on relatively small data sets used in the online course. Trained from scratch, it would recognise the face of a known person with 95% accuracy or so. Given more data and training time, these machine learning models can perform some truly incredible tasks.
Figure out what needs to be done, split this into milestones and focus on the most important pieces first. Divide the work into large independent chunks that can be done by different people.
Each person should have a large enough project they own. Owning a project means making decisions, identifying dependencies, driving discussions, setting deadlines, and presenting results. The engineer can split the project into tasks in a task tracking system if they want to.
Then just stay focused and keep shipping™ :) Pick the single most impactful task every day and work on it, and have fun.
Regarding shipping to production, it's good to ship as early as possible, get feedback from users, watch metrics, and iterate.
At work, I'm learning Typescript. Outside of work I recently finished a great course on deep learning called deeplearning.ai. I like learning about things I know very little about because that way I learn the most. It took me a while to finish the class because I did it in my free time. I don't usually code outside of work. I do sports on the weekends (snowboarding, wakeboarding, kitesurfing, and gym).
Last year, I tried applying for jobs in data science but this was more difficult of a switch to make - most companies were looking for people with experience, ideally a PhD in machine learning. In the end, I'm happy I stayed in product development though. There's a reason I've been building products and frameworks all my life - I enjoy it.
I read hacker news and check Twitter almost every day, and sometimes read programming-related blogs. On the weekends I would love to go offline as much as possible, but don’t always manage. Going out for a long day of sports helps.
I like reading books. Some of the books I liked recently were Sapiens, 21 Lessons for the 21st Century, The Hard Thing About Hard Things, Elon Musk, Innovators, Masters of Doom, The Martian and The Kite Runner.
I am proud of the work we are doing at Synthace. The software helps biologists develop new drugs including cancer treatments. About half the people at the company have a PhD in biology. The scientists are smart and it is great to work with them. Our software engineers also learn about university-level biology as a side effect.
I loved both React and React Native the day I first tried them. I helped open-source React Native for Android in September 2015 and later worked on internal open source tooling (Facebook has really good internal tools), supporting the community, etc. This was challenging because the adoption was very high (a good problem to have) so it was difficult for the small team to keep up with the number of incoming pull requests and supporting internal teams at Facebook at the same time.
I was happy to see some great engineers from the community step into important roles, such as managing the release process and contributing very important features. When the small team that built React Native went to conferences like React Conf or React Europe in 2016 and we saw people give really good talks about React Native, I was blown away.
The next project I’d like to mention is the Google Summer of Code in 2009 and 2010. I worked on the debugger that's part of SharpDevelop IDE, and later refactoring tools.
Object graph visualizer in the SharpDevelop debugger
Refactoring tools in the SharpDevelop IDE
SharpDevelop is a free alternative to Visual Studio. At the time it had about 2000 downloads a day. I was a student and really wanted to get accepted into the Google Summer of Code program. There were many candidates applying to Google Summer of Code and I had to convince my mentor David Srbecky that I was the right candidate for the job. I worked non-stop to build a prototype for my project. When David selected me, I was extremely excited and nervous.
I knew this was a huge opportunity. Before Google Summer of Code, I was 23 and had very little professional experience (mostly CRUD applications). This was an IDE with 700 thousand lines of code, and my work would get downloaded 2000 times a day by people around the world! It was an honor to be on that team. To this day, the SharpDevelop codebase is still one of the best-designed ones I have seen. My blog from that time is still online.
I would say code quality, such as the importance of naming and refactoring. Many universities don’t focus much on writing maintainable code. This skill will definitely help you progress faster in your career. There are books about this, for example, Code Complete.
The good thing about the skills above is they transfer to any programming language. You’ll still be using those skills 10, 15 years from now. These skills are harder to learn than React but they are a much better investment.
When it comes to learning, in my experience the most impactful thing you can do is work closely with a great mentor. I tend to gravitate towards companies and teams that have great engineers I can learn from. Find the best engineer at the company and find a way to be on their team. If there are no great engineers to learn from, don’t join the company. When I lived in Berlin, I learned every day from Roman Borschel, who is enthusiastic about functional programming, elegant architecture and scalability. At Facebook, I was lucky to have worked closely with Christopher Chedeau for a few months, where every day was a lesson in managing open source projects, moving fast and getting things done.
Building software to help scientists automate research is a pretty unique challenge. There are questions around “What should we build next and why?” I like this kind of brainstorming a lot.
Regarding technology, we have a custom programming language (slightly modified Go for now) in which scientists build reusable elements. In biology, a lot of experiments can be described in terms of data flow diagrams, except instead of data we’re passing around some physical substance, like a string of DNA floating in a bit of water. Each box in the diagram is called an element, and the whole diagram is called a workflow.
There’s a visual editor built in React where scientists build these workflows. This is quite an interesting bit of UI engineering. Another bit, which I’m working on right now, is a visual debugger for what happens on the robot once you run the workflow. We cannot just run the workflow on the robot and see what happens because it would take five hours to finish, and some of the liquids are expensive.
Therefore, it is crucial to be able to simulate the lab robot and show you a preview of what’s going to happen. Both the simulator and the graphical debugger for the simulator are interesting technical challenges. The architecture of the simulator is a bit like a compiler. We produce high-level commands, which then get expanded into low-level instructions (similar to a how a context-free grammar works), and then we do some optimizations on the instructions in order to decrease the total duration of the experiment.
I have a blog where I write about anything that comes to mind. For example:
- Natural language processing
- Company culture like communication and meetings
- Thoughts on technology, like Why demand for software engineers is going to stay high, the web as a platform, and cross-platform product teams
If you’re interested in something totally unrelated to work, I occasionally upload videos of board sports to YouTube. These hobbies are challenging because when trying something new and daunting, you have to overcome the natural instinct that tells you “don’t do it” until you succeed. This makes those hobbies super rewarding and fun.