Why I switched to the split columnar keyboard

A bit of history

Have you ever wondered why every row with letters on a keyboard is moved a bit to the side, but no such thing is happening on the numpad? Do you know how this impacts your ergonomics?

The typical full computer keyboard
Keychron C2

Let me introduce you to the staggered keyboard layout. The staggered layout means that each row of letters is moved a bit to the side. I would bet that 99% of keyboards currently sold or built-in into the devices are staggered keyboards.

By GodeNehler – Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=75088136

Such a layout was introduced with the first typewriters. So the layout that you are currently using has not changed since the 1870s! The idea was simple – there was a mechanical device, and on each key press the ribbon was moved to type a character. To prevent jamming the ribbons the staggered QWERTY layout was introduced. As you might guess, the more the machines become popular, the layout becomes a standard.

Later computers were invented, and they also got a keyboard, yes, with the same QWERTY staggered layout. But you might be wondering – there are no ribbons on the keyboard, so why did we still use the same layout? The answer is pretty simple – the people were already used to the layout from the typewriters, consequently, it was easier to switch to the computer if it had the same layout. OK, now that the history lesson is done, let’s jump to another part of this article.

What is wrong with the staggered layout?

Let’s think about how we usually write on the staggered keyboard.

The device is in front of you, and it is narrower than your arms, hence you have to angle your wrist to type properly. This position is not ergonomic at all. Let’s list all the problems.

Problem one – the keys are not aligned with your fingers. For example, if you want to press key D and then E, you have to move the finger up and a bit left. Yes, you might be already used to that, but would it be better to just move up?

Problem two – angling your wrists. If you do so for many hours, many days per year, this can lead to repetitive strain injuries.

Problem three – closing the chest by angling your arms to the inside. By sitting in such a position for a long time, you will have weaker back muscles. It can also lead to pain in the back/shoulders.

Problem four – many of the keys are out of reach so you have to move your whole hand to reach them. That usually means angling your wrist even more…

My issues

I have been working with keyboards for around 15 years. I’ve tried to improve the comfort and ergonomics of my work.

For a few years, I didn’t bother until my first child was born. After a quick parental leave, I went back to work and I discovered the back pain. That is how my ergo journey began. I’ve tried four office chairs and bought a sit-stand desk.

With the keyboards, I started by buying a 100% mechanical keyboard. I quickly realized how ineffective that keyboard was because of how much I had to move my hands.

Keychron C2 vs Keychron K12

Consequently, I bought a 60% keyboard, it was way better. But, there was still one problem that started to become a serious issue.

My left shoulder hurt me just after four hours of working. Some of you might say „Hey you need to exercise and all the problems will be gone”. The problem is that I am already an active person, I am working out.

My physiotherapist said that I have a closed chest and I need to open it, so my shoulders will be inlined, which should fix my pain.

At that moment I decided to try something new – the split columnar keyboard.

ZSA Voyager

The switch

After buying the new keyboard, the switch was fairly easy. The worst was the first week. Then all went smoothly.

The biggest benefit of the new keyboard is that it fixed my pain, literally. I can now sit comfortably for hours, my chest is open and my shoulders are aligned.

I thought that after switching I would have problems with typing on a regular keyboard, which I still have, on my laptop. Happily, that is not true. By learning to type on such a keyboard you are doing it from scratch. That means that you still remember how to type on the staggered keyboard. Your brain will contain two distinct muscle memories. For me, it is not an issue to take a laptop, sit on a couch and type on a built-in keyboard. The only problem is that it is much less comfortable…

Should you also switch?

If you have the same feeling as me – why I am using a staggered keyboard that was invented with the typewriters – do not be shy and go for it.

If you have an RSI – then the split columnar keyboards are the way to go.

If you are curious – you will not regret it.

I have to warn you – it is not an easy switch. You have to learn to type again. So you will have to get out of your comfort zone. You have to slow down to get better.

Next articles about the keyboards

As the next article, I am planning to do a review of my split columnar keyboard – the ZSA Voyager. I will show you the process from ordering, first thoughts, and learning up to my current setup.

Stay tuned.

Crash early

A dead program normally does a lot less damage than a crippled one.

The Pragmatic Programmer, Tip #38, page 113

Have you ever thought about what can go wrong when the application’s logic is broken, but it continues to work? That might happen when the values are not the ones that you expect. For example, a method/function returns an integer, but a negative one, but you expect it to be positive. Another example is trying to access an unknown array key. The database returns an invalid value. You name it.

What if you won’t allow it and crash early? Yes, the client will see “an error occurred, our engineers are working on it”. The actual benefit is that the program will exit and not cause any harm. No corrupted data in the database nor missing files.

How to crash early in the PHP? There are two ways. Throwing a \LogicExpcetion or enabling assertions on production and using them.

Continue reading Crash early

Symfony & PSR-16 Simple Cache

This week I was working on the integration with the Optimizely Feature Toggles.

Its PHP SDK is mediocre.

It makes the HTTP request for the data file whenever the new PHP process is executed.

The data file is in our case larger than 2 MB, so it has to download a large file, but also validate it and parse it.

That makes around 700 ms overhead on each process.

Therefore I needed a cache mechanism.

But, as we try to write the software in a framework-agnostic way, I wanted to use the industry standard interface – the PSR-16 Simple Cache, to not be coupled to a specific cache implementation.

Continue reading Symfony & PSR-16 Simple Cache

How to stay focused in the work?

During the last weeks, I started experimenting a bit with the focus of the work.

Key takeaways:

Split your work into blocks.

The first block should be reading and communication.

You can close your Slack and email after you read all.

Put proper status so your peers will know that you are in the zone.

Do not sit too long in the zone, use the Pomodoro technique to do breaks often.

Close the focus block and then take a break for reading and communication.

Spotify can be your friend and also an enemy, the song which you do not like at the moment can distract you.

As a replacement, I can recommend mynoise.net which has a built-in Pomodoro timer.

Put your phone in a different room, and use the focus mode on your Apple Watch and MacBook to keep focus.

Sleeping – what I have learned

Time for a new episode of what I have learned! 🎬

Wanna be better? Sleep more 💤 During the last few years, I discovered that sleeping eight hours works best for me.
Focused more and much more productive I am 💪
I have tried sleeping less than six hours plus naps. It worked well till I missed the nap. Waking up was hard 😓
Monitoring your sleep is vital. Many researchers say that it is easiest to wake up in the REM, and I can confirm that ✅
That is why I switched recently from 7.5 to 8 hours. I missed the zone.
Now I can wake up and almost instantly jump into the action.

Sleep well 🙂

YAML anchors & aliases

Hey! Last week I was focused on moving the API specification from slatedocs to OpenAPI. This was the first that I had the pleasure of writing a schema by hand, before that I always generated it. I learned a lot and I would like to share one thing.

By default the OpenAPI allows you to define a schema for reusability. But there is one more thing that you can do for reusability – YAML anchors and aliases. By using it you can reuse much more than just a schema:

Continue reading YAML anchors & aliases

Learning mindfulnes

Howdy, some time has passed since I wrote the last message 👋

I was enjoying the #vacations, but, also learning something new 🎁

The thing that I was #learning/enjoying is #mindfulness 🧘🏻‍♂️

This is a technique which always you to take control of your thoughts 🧠

There are many situations where your thoughts are distracting you or prevent the #focus 🤯


When you have finished the working day, but your brain still is there, thinking about that task you did not finish 😑

You had an intensive block of focus work, you were coding for a few hours. But now you have a meeting, but somehow your head is not listening. Your mind is still in the #zone 👨🏻‍💻

Or you are still stressed after the presentation you just did 😬

But, how to do it?

Continue reading Learning mindfulnes

Improving the tests with try-finally block

This week I have learned a neat trick that you can apply to your test cases. You are testing an edge case. The system under test is expected to throw an exception. But, after the exception, you need to do a few assertions. Usually, I did it this way:

 * @dataProvider markAsUndeliverableFailDataProvider
public function testMarkAsUndeliverableFail(Order $order): void
    $exception = null;

    try {
    } catch (\Throwable $exception) {

    self::assertInstanceOf(OrderStatusChangeFailed::class, $exception);

But, there is a better way to do it! Check out the much more readable version with try-finally:

 * @dataProvider markAsUndeliverableFailDataProvider
public function testMarkAsUndeliverableFail(Order $order): void

    try {
    } finally {

Viola! Look how clean this is 🔥

Sytuacja w IT a COVID – przemyślenia

Cześć! Żyjemy już dość długo w świecie pandemicznym. Tym razem opiszę swoje przemyślenia o tym jak COVID wpłynął na branżę IT. W tym wpisie przedstawię moje obserwacje oraz przemyślenia w trzech etapach. Na końcu znajdziesz podsumowanie, gdzie subiektywnie podsumowuję całość.

Świat IT przed pandemią

Jeśli pracujesz/pracowałeś w IT to wiesz jak to było. Zdecydowana większość pracodawców nie zgadzała się na pracę zdalna. Czemu? Bo przecież pracownik w domu, zamiast pracować, będzie zajmować się wszystkim, byle nie pracą.

Continue reading Sytuacja w IT a COVID – przemyślenia

Wpływ silence operatora na error reporting w PHP

Hej, w dzisiejszym krótkim wpisie bierzemy na tapet słynny i jakże często używany operator @ tzw. STFU. Czy wiesz że jego użycie ma wpływ na error_reporting w PHP? Weźmy pod lupę ten przykład:

<?php declare(strict_types=1);


    function () {
        // int(0) [PHP <= 7.4]
        // int(4437) [PHP >= 8.0]

// int(32767) [E_ALL]

@trigger_error('warning', E_USER_WARNING);
Continue reading Wpływ silence operatora na error reporting w PHP