Latest Post

Microsoft Teams sucks

If you told me I was going to die in the next 24hs, asked me to guess what from, and it was a working day of the week, "MS-Teams-induced aneurysm" would definitely be in my top 5 guesses.

I know what you are thinking: "he's exaggerating - no software can be that bad". This reveals one of two possible scenarios: either you don't use Teams in your daily work, or you do use it but you only pretend to work. Don't worry, your secret is safe with me. But just in case, please take a seat and let me tell you all about Teams.

First and foremost, Teams is where information goes to die. If I need a piece of information I know exists, I have to identify the Account (I have 2), the Team (around 25 and growing), the Channel (around 5 per team but only two in actual use) and the media type (was it in a chat? a wiki? a file? If so, in which folder?), all of which are just slow enough to make it frustrating but not slow enough for my office to ditch it (assuming they could and wanted to, which then can't and don't want to). And with a search function that works ~20 percent of the time, it's not unusual for me to just give up. "It's somewhere in our Teams channel" is what I tell people when I don't actually care about whether they find what they need or not. And if I'm looking for something said in a person-to-person Chat, this is different from a Channel chat and I need a different window altogether.

Chat brings us to notifications. Teams is the only tool I know that will display up to four notifications for a single event and leave more than one on. If someone sends a message during a meeting, Teams will display a box in the notification area, play a sound, add an indicator to the task bar, and a second indicator to the meeting windows. Your window will resemble a Christmas tree until you open the chat window, even if you already clicked on the very first notification box. As far as Teams is concerned, a single unread chat is the most important thing that has ever existed, and it will not rest until you've clicked on it.

The system requirements are also an issue, but all things considered they are a minor one. Sure, I cannot calculate the number of hours that I lost waiting for things to load, but I can at least estimate how much my employer had to pay to replace an otherwise perfectly good computer. And yet,if I only consider them a minor issue it's because they pale in comparison to the hours I wasted doing things the Teams way, a burden no hardware upgrade can relieve.

Teams empowers you to go through the motions of work without actually getting anything done. No project can start without yet-another useless channel, a bunch of documents you'll never find, a to-do list hidden at least four levels deep into the interface, and a collaborative editor that ruins your formatting until you open the desktop app. But it takes a strong company leader to stand to Microsoft, and those don't come easy nor cheap. Once your company has willingly chained itself to a Teams-based working environment, your fate is tied to that sinking ship.

And yet, the worst aspect of Teams had escaped me until today when a friend pointed it out: that we started using it because Microsoft imposed it on us right at the beginning of the pandemic. I guess some Microsoft salesman decided that the pandemic was not hard enough on us as it was, and that's why they decided to add a buggy, resource-hungry tool as the cherry on top of the pandemic dessert. I have not yet received my check for working as an alpha tester for a terrible tool I didn't want, and I am starting to believe that I might never get it.

Friends don't let friends implement MS Teams in their organizations. If you are going to choose a collaboration tool that sucks, you might as well choose one that's lighter on resources and less annoying. Even yelling at your coworkers down the hall is better, even if they are in another building.

Just say no to Teams.

Older Posts

I got Covid and I wouldn't recommend it

Two years and 44 days after the beginning of the Covid-19 pandemic, I caught it. I haven't felt this sick since at least January 2013 (probably longer), and I therefore spent an entire week lying on my couch. Which is ironic considering that, as I lay there "looking half dead" (not my words), Germany was scraping almost all protective measures.

What happens when you get sick right as the country is ready to move on? In my experience you get sent back and forth between different services who haven't yet noticed that there's a pandemic going on, you rage against "Corona test centers" who don't test sick people, and eventually someone takes pity on you and takes care of it.

My first difficulty was the PCR test: quick tests are not accepted by my employer, my girlfriend's employer, nor my soon-to-be-ex-doctor's office. But getting a PCR test while sick is bafflingly difficult: the test centers suggested by the 116117 Patient service only offer quick tests, and the multiple other test centers that sprung up these years don't accept customers with symptoms. The only choice is a 20 minutes ride to the nearest Hospital, meaning you need either a car (have fun driving while sick!), a driver (ideally someone who is willing to get sick by being in contact with you), or a moderately-full public bus. Fun fact: do you know which kind of people takes a bus on a working day during working hours? Answer: Old people! Have fun at night wondering how many of them you'll put in an intensive station next week.

I then tried to use the Corona Warn-App to tell anonymous people they should get tested, but that didn't work either. The app doesn't let you self-declare as sick, offering only the possibility of scanning your official code. The problem is that I started exhibiting symptoms on Wednesday, got my PCR results on Friday, and yet as of this writing (one week later) the results are still not uploaded and probably never will be. I said it before and I'll say it again: when security researcher Bruce Schneier said that contact tracing apps have no value, he was right.

And finally, the sickness certificate: my soon-to-be-ex-doctor has not yet learned that they are allowed to extend certificates per telephone, but won't see me in person either. I tried calling the 116117 people again for a referral, but they entered a loop and got me nowhere. I guess no one asked them for a doctor before? I next gave the health services of my employer a try, but they were as useless as always. And as I started going through a list of other possible doctors to call my girlfriend lost her patience, took time off work, and went to my soon-to-be-ex-doctor's office in person to get me the stupid certificate.

People, it's been OVER TWO YEARS since we canceled Karneval the first time, and yet we are still in the same spot where we started. I know that Germany is a bureaucratic place, but that's not the issue - if anything, the fact that there is a protocol to follow is a bit of a consolation. But when EVERY.SINGLE.STEP of that protocol is broken, it really makes you wonder what else might be FUBAR and waiting for you to discover it.

So you want to use my PC

So you want to use my PC? Sure, no problem, it's right there. But real quick, before you start, there's a couple small tips that you should keep in mind.

If you turn it on and nothing happens, that means the KVM switch is listening on the wrong input. Just press the black button behind the screen to switch it back. Can't find it? Maybe it fell down - it has a short cable and sometimes the other cables pull it back. Or maybe it's underneath all of my drawing stuff. Either way, search for it behind the desk and press it. The screen should turn on.

You may also notice that the computer chair has been relegated to the side and that I'm using a regular wooden chair instead. You can use the fancy one if you want - after a couple weeks it may cause some completely unexpected health issues, but on a short enough scale it's fine.

Now, this computer runs Linux. Technically it runs Windows too, but the screen for choosing a different operating system goes away before the monitor has time to turn on, and we lost too much time to spam the arrow keys anyway. But that's probably for the best: given that I haven't booted Windows in a long time, that Windows loves mandatory updates, and that the computer has a mechanical hard drive, there's a good chance that you would have to wait at least an hour before being able to use it. Why haven't I upgraded to an SSD, you ask? I have considered it, but Windows won't let me for complicated reasons. So Linux it is.

You may see a bunch of text scrolling by. That's fine. If the text stops scrolling for a long time you may want to consider pressing the NumLock key several times. I'm not entirely clear on the details, but something about interruptions and IRQs sometimes keeps the PC from starting if it doesn't detect activity. And since the NumLock key doesn't do anything bad, it is the safest key to spam-press.

Once you've made it to the login screen it is going to ask you for a username and password. That one should be easy - I have been using the same combination for over 20 years, so you probably know it already. Need a hint? It's in the same league as my network name plus my favorite number. It's not exactly hunter2, but it's close.

You may have a bit of trouble reading the letters on screen. Don't worry, the screen works fine - I just keep my brightness and contrast real low, and even the smallest hint of natural light turns them invisible. You could adjust the brightness using the monitor's crappy touch controls, or you could do what I do and close the curtains. I'm not going to tell you which one is right, but I am going to vouch for the one that has kept me glasses-free for more than 25 years of extensive computer use.

If you want a graphical interface, type startx and my Mate Desktop Environment will start. Ignore the error about sticky notes - I have been meaning to fix it for some time, but there's always something else and it doesn't bother me anyway. But before you type anything, a word of caution: the interface is in English, but the keyboard is German and the key mapping is Spanish. That means that regular keys are where you expect them to be (except for Z and Y, which are inverted), but if you want to type a single quote you need to add a space afterwards or you'll get an accented letter otherwise. If you have a password with more than just letters and numbers then you may want to type it in a text editor first and copy-paste.

You probably need a web browser, in which case the Firefox icon is right there. But you probably don't want that: the script blockers almost guarantee that whatever website you are trying to open will not work. For those cases I recommend using the super-outdated Chrome browser instead - the icon is right next to the Firefox one. It won't play Netflix because I didn't install the DRM stuff, but everything else should work fine. If you want audio, remember to plug the headphones first. And that reminds me: I have set the browser to auto-delete all history when closing the browser. So don't close the window until you're done, or you'll have to login again. I hope you didn't close the text editor with your password!

Now, I'll be honest with you: at this point most people give up and resort to their phones. And it's okay, I get it. That's what happens when you keep your tools exactly like you want them to be and suddenly you are asked to share. But most people tend to blame Linux for it, which I think it's unfair - if anything, I'd like to see Windows offer even half the flexibility to do things my way.

Now, let's talk about that WiFi password. But first, one question: do you know how to type the "¿" symbol on your keyboard?

Inspired by this article

On bad deals

An article titled Don't talk to Corp Dev has recently showed up in my feed and the HN discussion around it reminded me of this anecdote.

To clarify: this story is based on something that happened in real life, as told to me by someone who witnessed it first-hand. Time has blurred some of the details and I have changed others. So feel free to dismiss the details, but please keep the main point in mind.

Once upon a time there was a small wine producer we'll call Dave. He kept a small shop and was doing well by himself, selling his wine at $15 a bottle. One day a big supermarket chain contacts him -- the chain needs a new wine supplier, and they heard good things about Dave. They have just one condition: they will take care of distribution and advertising, but Dave has to provide them with one month of free wine in return.

Dave is ecstatic: the supermarket chain can spread his brand across the entire country and turn his small operation into a national contender. Sure, giving up one month of profit is not ideal, but the supermarket representative convinces Dave that he'll recover his lost income in no time. Hands are shaken, contracts are signed, and Dave provides them with one free pallet of wine to start the week.

Week two arrives, and the supermarket chain requests two pallets of wine. "Looks like my wine is selling well", Dave thinks, and increases his production targets for the week. But this is not enough: when Dave is asked for five pallets of wine the next week he is forced to hire a new assistant and buy new machinery to keep up. Predictably, week four closes with an even larger order of ten pallets. The loss of 18 pallets of wine is a tough pill to swallow, but at least the month is over and from now on he will get paid.

A new month begins and Dave receives his weekly order: he is asked to deliver a grand total of one pallet of wine. "This must be a mistake", Dave thinks, and calls the supermarket representative. "Last week I gave you ten pallets of wine. So why are you only asking for one today?". "That's easy", says the representative, "up until last week we were selling your wine for a dollar a bottle. This week we will put the price back at $15 and therefore we are not expecting it to sell as well as before".

Facing a large loss of inventory and having invested both in employees and machinery that are no longer needed, Dave goes broke. The supermarket chain finds a new naive wine supplier, and the cycle starts again.

A wise man once taught me that it's not a good idea to enter into negotiations with someone much bigger than you. This is arguably the reason why South American countries formed Mercosur instead of joining theFTAA agreement with North America, but it's also true for simpler activities like office politics.

For the record, I would have totally fallen for this. The first time I heard this story I didn't even consider that someone could do something like this on purpose. Then I started reading news about startups and learned that it happens relatively often.

Consider yourself warned.

Rust Part II: What is it good for?

Last time I talked about Rust I mentioned that I wanted to like the language but I couldn't find a good reason for using it. Luckily for me, the last Advent of Code gave me the perfect reason for doubling down on Rust, and here's my updated report.

In case you never heard of it, Advent of Code is an online competition that takes place every year in December. It is structured as an Advent calendar where you get a puzzle every day, and where the puzzles get harder and harder every day. Plenty of people use this competition as the perfect excuse for learning a new language, which is how I ended up programming lots of Rust in my spare time.

So here they are: in no particular order, these are the things I like, dislike, and feel mildly uncomfortable about Rust.

Things I like

The one thing I like the most about Rust is the power of the match operator combined with enums. Unlike in Python, where the implementation of the match statement is pretty dangerous, Rust makes it easy to program the type of code that's easy to write, read, and maintain:

let mut pos = 0;
let mut depth = 0;
for instruction in orders {
        match instruction {
                Instruction::Forward(meters) => pos += meters,
                Instruction::Up(meters) => depth -= meters,
                Instruction::Down(meters) => depth += meters,

Then, there are the compiler errors. While not true for external crates (we'll get to it), compiler errors in Rust are generally helpful, identify the actual source of the problem, and sometimes even give you good suggestions on how to solve the issue. Gone are the days in which a compiler error meant "I know an error happened 50 lines above, but I'll complain about it here instead".

And finally, as someone who has been doing mostly Python for the last years, it feels so good not to have to worry about indentation anymore. This doesn't mean that I'll stop indenting my code - instead, it means that I can finally move a function around without worrying about pasting it one indentation to the left and turning a class into a class and multiple pieces of code that don't compile.

Things I hate

I am puzzled by how aggressively unhelpful arrays are. The puzzle for day 25 could be easily solved (spoilers!) by writing

horizontal_row = horizontal_row>>1 && !(horizontal_row || vertical_row)

but I ended up having to implement it with Vectors of booleans instead. Why? Because I didn't know how many bits horizontal_row would have at compile time, and Rust refuses to create arrays with dynamic size. I am sure there is a way to keep a large binary in memory and manipulate it at the bit level - otherwise, you wouldn't be able to use Rust for serious game development. But whatever the method is, it is well hidden.

And on the topic of that puzzle, I come back to one of my main complaints from last time: popularity is not the correct way to decide which library is the best one for the job. Do you know the difference between the bitvec, bit-vec, and bitvector libraries? Can you add either of them to your code without worrying about the developer going rogue? How about the fact that the first result that comes up for rust bit vector is an accepted StackOverflow answer suggesting bit-vec... which is no longer maintained?

Minor annoyances

I still can't make sense of the module system. I mean, sure, I know how to put functionality in sub-directories, but that doesn't really explain why I would choose between lib.rs, day24.rs, or day24/vm/mod.rs. The book could use some improvements on this topic.

If I'm doing something like u16 = u16 + u8 (or even better, u16 += u8), the compiler should cast the last value automatically. u8 += u16? Sure, I get it, that's an overflow waiting to happen. But there is no need for me to get in there and write u16 = u16 + u8 as u16 when we all know the data fits just fine.

The collect function is very finicky. This is a function that I used quite often in constructions like .map(|x| something(x)).collect.to_vec(), but more often than not it will complain about not knowing the type required for collect even though there is only one type that would make sense.

And since we are talking about the compiler, one of the crates I needed (it was either nalgebra or ndarray, where I suffered the same problems I had with bit vectors) had a nasty side effect: if one of your instructions failed to compile, they all stopped compiling. Good luck finding the one line that needs fixing!

And finally, I ran a couple times into functionality that had been deprecated in favor of functionality that doesn't currently exist. Not cool.


Would I use Rust again? Yes.

Is it my most loved language? No. But under the right circumstances I could see it happening.

What is it good for? Last time I jokingly said "writing Rust compilers", and I wasn't that far: it's the right programming language for apps that need performance and memory safety, and where we are willing to spend some time calculating who is borrowing from whom in order to get code with fewer bugs. So it's pretty much C++, only with borrowing replacing memory allocations.

I like the idea of giving my original project another try, but I can't make any promises. The Advent of Code has already pushed forward the date of my next project by a couple months, and the time it's taking me to migrate my infrastructure to Ansible is making everything worse.

Page 1 / 16 »