I’ve been using Linux exclusively for ~15 yrs. I’ve recently started a fantastic new job – the only wrinkle was that it came with a Windows 10 laptop. This is my first time using Windows after a 15-year break. This is how it’s been going.
Windows is such a mess! It’s sort of shocking how much of a mess it is. Desktop Linux is often criticized for this, but Windows is much worse, somehow! It’s really inconsistent. Half of it is “new” UI and half of it is old Win32/GDI type UI - just as bad as KDE/GTK - except worse, because you can’t configure them to use the same theme. Also, when you install a Linux distribution, it’ll start off either all KDE or all GTK, or whatever - but with Windows you’re stuck with a random mix of both right from the start.
Thankfully, there is a dark theme available - but only for “new” UI things, naturally. So as soon as you randomly stumble into some old non-themed UI, suddenly BRIGHT WHITE!
You can’t customize anything!
You’re pretty much stuck with whatever Microsoft decides to give you, compared to Linux - which is completely customizable: you can build your own version of Linux from the ground up, choosing every software building block yourself, if you choose to. Like almost all Linux users, I don’t choose to - I use a Linux distribution (or “distro”), where someone else has made these choices for me. This lets me pick the distro that’s closest to my needs and customize anything I want to change. I’ve been using Xubuntu for years and it suits me - but there are hundreds of Linux Distro’s to choose from.
Windows Wasn’t Made for Me
I am a software & web developer - and Linux is a toolbox, full of highly polished tools, crafted over decades by software developers, for software developers. Windows is… not that. It’s a commercial OS, aimed at users of Word, Excel & Outlook, pretty much. You can feel this difference all the time that you’re using it - it pervades everything.
The command line tools (echo, cat, grep, sed, awk, find, cut, sort, curl, ssh, etc…) which make up the standard Linux/Unix toolbox are all composable and general purpose. You can join them together like Lego bricks, in whatever combination you like, to make new tools on the fly. You do this on the command line, by piping streams of text from one tool to another and using them to transform it however you need.
Sadly, nobody has ever really figured out how to make GUI software like this - general purpose & composable. Windows has always focussed heavily on the GUI, to the almost complete exclusion of the command line - which means that it doesn’t have this foundation of composable software tools. Almost everything is a special purpose piece of GUI software. Which you have to go and find. And then download and install.
You can get Windows versions of most of the standard *nix userland utils, which seem to work OK with PowerShell:
$ scoop install coreutils
Stupidly long paths with lots of spaces in don’t matter if you’re only ever clicking on things in the GUI file manager - but if you’re trying to use the command line, then they’re just constant friction.
|Windows Path||Linux Path|
|C:\Users\DuncanLock\||/home/duncan or just ~|
|C:\Users\DuncanLock\AppData\Local||~/usr/bin or ~/bin|
…and on and on. In fairness, they have got rid of a lot of the spaces in the paths since I last used Windows.
Thankfully, PowerShell does have a
~ alias for your home folder, and
cd ~ works!
Environment Variables look like this:
%PROFILE%, instead of this:
$HOME; which is fine, just different; although PowerShell seems to accept either form, which is nice.
What isn’t fine, is that they’re stored in the Windows Registry, apparently? If you update these, either using
setx %var% value, or the GUI… you have to restart your shell - i.e. you type
exit, the window/tab goes away, and you open another one. Just let that sink in for a moment.
I haven’t tried this, but I think if you want to add persistent environment variables to your currently running shell, you should put a
setx command in your
$profile file and then reload it:
. $profile - or maybe run
myvar="value" && setx %myvar% "value", or something similar.
Installing things is still, mostly, going to random websites, downloading an
.exe (or a
.msi if you’re lucky) and running it! Holy shit! You now get some click through warnings when you try to run them, but it’s still the only way to install lots of things! This is slightly terrifying and pretty mind-blowing in 2022!
There is the Microsoft Store now, but it’s just… awful? It manages to be both a ghost town and a cesspool of scam/shovelware at the same time, somehow? It’s got less useful stuff in it than most Linux distro “app stores” and is utterly miniscule compared to the Debian repositories, which have ~60,000 packages in, or Arch’s AUR, with 73,000 (these counts include the whole Linux OS, though, with is installed using the same package manager).
Like Netflix, the MS Store deliberately makes it hard to see exactly how much/little stuff they have, but in most useful categories, it’s fairly empty. It usually doesn’t have what I need, so far.
MS could have fixed this with their Store, if that had a proper package manager underneath - but they don’t seem to have done this. Some team at MS decided to rip-off AppGet (killing it) to create WinGet and then mostly abandon it. Some other team created MSIX. Some other team created the Store. Etc…
Some “package managers” have appeared for Windows recently - nuget, choclatey, scoop, winget, etc… These are just papering over the cracks. They don’t have their own package repositories, reproducible builds, package signing, etc… - because lots of things in Windows aren’t open source, so they mostly can’t. They just automate the process of going to the website, downloading an installer and then running it - which is slightly better than doing it yourself.
This isn’t really proper package management - it’s just automated download & install. Linux package managers do the following things:
- Have a package repository of some kind, mostly storing package lists & metadata, binary installation packages, but sometimes source code
- Package signing, reproducible builds, secure downloads, etc…
- Browse & search these packages
- Install a package from the repository locally. This means:
- If it’s a source package system, compile the source and test it
- Copy the files to the system, put them in the right places, and run optional installation scripts and hooks.
- Record all files that are installed and know which file belongs to which package.
- When uninstalling:
- Remove all the packages files automatically
- Run optional uninstallation scripts and hooks.
- Make sure the software is uninstalled safely and completely.
- Be able to update packages. This means:
- Knowing what packages are installed, and what version
- Having the ability to download & update any outdated packages.
Importantly, the whole OS - and all applications - are installed through this system. Everything is installed the same way - and updated the same way.
To be fair to MS, the MSI system does do some of this - but MSI packages have been a pain to create since the start, and apparently still are. So a lot of software still doesn’t use MSI files, 20 years later - they still come with a Nullsoft/ InstallShield/ Inno/ homegrown setup.exe. To be even fairer, there is a new MSIX system, which adds containerization/sandboxing of apps (like flatpak/snap) as well as updating - while being simpler to create - but it’s new… so almost no-one uses it.
Even taking that into account, there doesn’t seem to be a notion that the system as a whole could provide some kind of cohesive application install & update experience. Windows Update almost provides this for the OS, but applications are all updated separately, even if they’re using the new MSIX installer system, afaik. I think the MS Store is supposed to do this, for the tiny number of apps that you can install from there? Maybe this is just me coming in while this is all party-way through being fixed?
In addition to this, these various “package managers” don’t all have the same packages/apps available, so you will probably end up with several of them installed eventually - and have to remember which thing you installed something with when you want to update it - if that “package manager” even supports updating, because not all of them do!
I fully understand the historical & commercial reasons why it’s like this, but it’s still a pretty poor experience for the end user, compared to Linux.
Scoop seems to be the best of the bunch, so far?
$ scoop search wget $ scoop info postgres $ scoop install coreutils wget xh bat ripgrep
A Terminal That Doesn’t Suck
The shells & terminal applications that come installed on Windows are just astonishingly bad. Like 1980s DOS in a window bad - and they haven’t changed at all since I last used them ~15 yrs ago. Just head shakingly awful. There’s a new shell now, called PowerShell, to run inside your terrible 1980s terminal window, but the terminal it’s running inside, still sucks.
I sometimes wondered why the VS Code team put so much effort into the built-in terminal inside the editor. I tried it once on Linux and never touched it again, because the terminal window I had right next to my editor was just massively better in every way. Having used Windows terminals for a while, I now fully understand why it’s there.
The shell that’s running inside this Terminal is configurable, but I’m currently using PowerShell. It’s quite powerful, if you’re willing to learn it, I think. It also comes with enough aliases for things like
ls → dir that it’s fairly comfortable coming from Bash. It’s certainly a massive improvement over cmd.exe + whatever the old shell was called.
Did it Just… Restart Itself and Lose All My Terminals!?
I was surprised by this one morning, when I came back to my Windows machine, it had lost all my open terminals & SSH sessions overnight, as well as all my VSCode windows. My Outlook, Teams and Edge windows were all still there, so WFT!? I initially thought they’d crashed, but after trawling through Event Viewer, I discovered that Windows Update had decided to restart the machine without asking me!
Screw you software, I’m in charge, not you.
Turns out that some Windows Apps are “Restartable” and some aren’t - which means they get reloaded with all their windows when you restart.
I eventually found that Windows Terminal Preview Edition is now “Restartable” too. Sadly, but unsurprisingly, this just means that your terminal windows & tabs come back, but not their contents, or SSH sessions, etc…
Update: It did it again! But the Lenovo thing that’s been nagging me to install a BIOS update, which unsurprisingly also requires a restart, is still nagging me. Because there’s no system-wide package manager, so all these little things have their own installers and don’t co-ordinate anything. Ugh.
This is not how we do things in Linux land:
$ uptime 09:33:15 up 56 days, 16:33, 1 user, load average: 1.36, 1.29, 0.91
You can turn this off - unless your IT dept has set this by policy, which is the case for me.
Virtual Desktops / Workspaces
Linux has had rock-solid multiple virtual desktop/workspaces support forever (30 yrs?) - Windows just got this in Windows 10. It was possible before via hacky 3rd party software, but it was very hacky and didn’t work very well, in my experience.
Using multiple workspaces/virtual desktops is a core part of my workflow on Linux - I currently have 20 of them, so this is fairly important to me.
The one in Windows 10 seems to work better than the previous hacky 3rd party ones, although I have some issues with it:
- There’s no way to see which desktop you’re on, except by going to the switcher.
- The win+tab desktop switcher screen does a lot of things - including the only way to move windows between desktops, afaik. It can be a bit slow/janky.
- When apps get restarted, they all end up on the first desktop, because, clearly, people at MS don’t use multiple desktops.
Windows all Moved to Main Monitor After Sleep/Off
It seems that when Windows sends DisplayPort monitors to sleep, it immediately forgets that it did this, and acts like you disconnected them - and moves all your Windows that used to be on these monitors onto the primary monitor. Every. Single. Time. So, when you wake it up, you have to put all your windows back where they were. Every. Single. Time.
This seems to have been happening since Windows 7, with hundreds of people complaining, to no avail:
- Set screen sleep timeouts really long, or off when plugged in
- Install PersistentWindows - which keeps track of window positions in real time, and automatically restores window layout to last matching monitor setup.
No Middle-Click Paste
Linux (well, really the window managers, so X11 and then, i3, Wayland, etc…) have multiple clipboards. The ones I care about are the Primary selection one, and the Secondary one. The names are historical accidents, but the “primary” one always has a copy of the last text you selected from anywhere, which can be pasted anywhere by clicking the middle mouse button. You just select some text and that’s it - you don’t have to do anything else and you can then middle-click paste this anywhere. The “secondary” clipboard is the “normal” Cut, Copy, Paste, Ctrl+c, Ctrl+v one.
To be clear - I don’t really care about multiple clipboards or history or a clipboard manager, I just want the Primary Selection & middle-click paste thing.
I just want any text selection anywhere to be automatically kept somewhere and allow me to paste it anywhere on a middle mouse click. This is incredibly useful and Windows just doesn’t have anything equivalent at all.
Windows Terminal will paste the contents of the clipboard on a right click, and does copy the last selection to the clipboard - which is close - but this doesn’t work anywhere else, sadly, only in Windows Terminal; I want this everywhere. Also, because there’s only one clipboard, every time you select anything in Windows Terminal, it overwrites the clipboard - which is why Linux has another clipboard, just for this.
This originally said “None?”, but I got some great suggestion in the comments and over on HN, so there are some options now:
I tried PuTTY, which I’d heard was the good SSH thing on Windows, but it’s… not good, at all. PowerShell does come with an SSH client, so once you have this working with a reasonable terminal, you can use SSH as normal.
A few useful keyboard shortcuts I’ve started using:
|Win+Ctrl+left/right arrow||Switch virtual desktop left/right|
|Win+Tab||Open the desktop switcher screen.|
|Win+e||Open the file manager|
|Win+x||Power users menu|
Again, these aren’t very customizable - you can get some more customization of global hotkeys by using the PowerToys Keyboard Manager thing, but there are lots of combination that are seemingly just not possible, for some reason; I’d like to use
Win+Enter to launch a new terminal window, to match my Linux workflow, but that combination isn’t allowed.
Things That are Better on Windows
- Firmware installation as part of Windows Update seems to just work, so far.
- … that’s it?
Footnotes & References
- To see a list of all the currently defined aliases, run