Recently, I’ve passed a course on Coursera, which is called nand2tetris. The course itself is about building your own computer from the ground up. Though it will be better to quote the instructor himself, what the course is about:

The course guides students and self-learners through the construction of a modern, full-scale computer system – hardware and software – from the ground up. In the process, the students practice many major computer science (CS) abstractions studied in typical CS courses and make them concrete through 12 guided implementation projects.

And so, when I implemented the last module/project from the course, I got a Pong game, written in Jack language (your own language, implemented during the course).

Afterwards, the game is compiled through your own toolchain back into binary code and running on your own CPU. Both toolchain and CPU developed during the course.

Pong Game

If you are interested in the crash course for “How does computers work”, read the article.

Read Full Article

I got curious about working in terminal text editors. I knew how to work with emacs and Vim, but both were just simple text editors I used to edit something on the remote server.

So, I asked myself how to configure Vim to work as an IDE in the terminal, not the text editor I used before. It must have autocomplete, syntax highlighting, error reporting, etc… And I found out how to do that.

Read Full Article

Have you ever been interested in how your code, written in high-level language like TypeScript, transforms into a different representation that a computer can understand, a CPU can understand?

I hope, when you will read this article, the picture of code execution pipeline will be more explicit. We will trace the journey of the code, starting from high-level language to low-level machine instructions. We are going to a deep rabbit hole…

DISCLAIMER: I will not dive into technical details of implementation, which differs from one vendor to another. We will go through a conceptual overview only. Otherwise, the article would take hours to read and months to write.

Read Full Article

WebAssembly is a replacement for JavaScript!
C++/Rust developers can now code front-end applications!
WebAssembly is faster than JavaScript!
WebAssembly! WebAssembly!

How many times do you hear these statements? Me, a lot. So I collect the most popular myths about WebAssembly and tell you the truth behind them.

Are you interested? Welcome!

Read Full Article

For the last year, strange things were happening with Medium. Many people complained that Medium hides everything behind the paywall, but I didn’t get it, until recently… but let us start from beginning.

My first blog was a static page on GitHub, written in Markdown. They were deploying through Jekyll. I love everything about Jekyll and GitHub Pages, but when you need to make drafts, share them with your technical editor, got comments on your writing style, etc… it becomes harder to handle all of that, since these are just plain Markdown files.

While looking for other solutions, I’d found Medium a few years ago. It was a breakthrough. It has a WYSISYG editor, you can make drafts and share them with people, getting the feedback as comments to your lines. You were fixing those issues and “Publish”. Decent!

Everything was great until they had introduced paid membership. They were selling this with a motto “let your posts make you money” or something like that. It was optional, so I just refused and forgot about it. You still can read other’s people posts, write your own, so what is the difference, right?

Read Full Article

Recently, I have published an article where I describe a few tricks about how to migrate your project from multi-repository to mono-repository. Some of you really appreciated the topic:

However, some of you wanted more details about the build process itself. So, I have written about that in depth.

Read Full Article

We had a lot of repositories for different services. There are 20K+ commits in 15+ repositories. Each repository has its own Dockerfile, tests, lint rules, etc.

Turns out, it’s hard to maintain, especially when you have dependent repositories across. I.e. you have repository api that is using a package from another repository, let’s say commons. If you publish an update in commons, you need to go through all the dependent repositories and update commons there.

Now, just imagine how long it takes, to make a clone of each repository, make an update there and push changes back to remote. It’s hard to say for me, but these kinds of updates were leading to half a day work just for updating the changes in other repositories. Therefore, we allocated resources for changing that.

But, before I started migration to a mono repository, I spent some time investigating the pros and cons of other alternatives.

Read Full Article