As the title says, I am currently learning to be a programmer, and my tablet does not suffice for the job.
I have already finished a small MEAN-Stack application for learning Typescript, learned some Java syntax (I expect nothing more exciting than a sorting algorithm, but exam language is Java, so…) and the next stop will most likely be plain vanilla C to learn about handling hardware.
Windows I hate with a passion, and I don’t know squat about Macs, so I am thinking of getting myself a decently sized laptop for a sensible Linux install.
History (I started my Liux journey with SuSE Linux 4.4.1, way back when) taught me to be very wary of driver issues on laptops, so I thought I could ask you for recommendations that play fair with Linux.
(as an aside, if I could play GuildWars2 on it in the evening and attach my two big monitors when at home, that would be super cool)
Preface: I’m assuming most people are going to get jobs at a SaaS or hardware company. Obviously, this doesn’t make sense if you’re a macOS, iOS or Windows developer. Also, this is about the work experience, not casual, personal.
This kind of ties into my point. Docker, WSL, Vagrant, brew. Think of all the time and effort spent on these tools that… just try to create a Linux environment on other OSes. Plus, you have to learn how to use those tools and configure them. Or just use the thing they’re trying to minic, Linux?
Especially at work, making things “platform-agnostic” sucks. You’re always going to need to support Linux—optionally you can add macOS and Windows support, but that’s not required and adds unnecessary complexity. It doubles or triples your workload with low-to-no value tasks that your customers, CI, and app don’t care about.
You could be done with your
sed
bash script to get CI working again, but wait, you have to go back and handle macOS differently and if you have Windows, sheesh. Debugging something? Oh,ip
isn’t on macOS. Ohss
isn’t on macOS. Ohnc
is on macOS, but it’s different.tar
is on macOS, but it’s different.Who wants to learn the tooling and workings of 3 different OSes, when only 1 is required?
Am I saying that software doesn’t run on other platforms? No. I’m saying, when you’re ready, you won’t have to.
I’m not talking about developer preferences. I’m talking about the tools that are required at work.
This is simply not true. And in fact, this is actually a huge problem. Sure, everything is nice when it works, but the problem is when something goes wrong and you’re trying to debug. The layers of abstraction will get in the way. At some point, you’ll have to SSH into a machine and figure out why your app is crashing. Or if you don’t SSH, you’ll try to reproduce the issue locally. The closer your dev environment is to the prod environment, the easier debugging gets.
Additionally, all of those abstractions will change. Each job will use slightly different services or new products will come and old ones will die. Linux skills are more transferrable from job to job and over the long term.
Yeah, I’m with you here. Linux gives you the freedom to do whatever the heck you want, even if it’s wrong. I would advise against using Linux for tinkering and customizability. That’s how you break stuff. Stick to well tested hardware and software and get your work done. I’ve always been issued a boring Ubuntu LTS laptop at jobs and I don’t customize it.
But that is also what I’m talking about. I don’t know of a single modern SaaS company that deploys straight on Linux anymore. It’s always going to be some form of container nowadays, making it irrelevant which OS you use. Sure docker might be replaced one day by something else, but you’re still unlikely to run anything straight on Linux.
What are you talking about here? MacOS and Windows support for the actual backend you’re developing? It’s highly irrelevant, because you’d be using Docker so it only needs to support Linux. And for most popular runtimes nowadays, it’s actually easy to do cross-platform if you were so inclined. JVM doesn’t care what it runs on, Python doesn’t care much either, and Rust compiles for multiple platforms. My jars and Rust binaries still go inside docker if they’re supposed to be backend services, rather than client applications.
Or if you were talking about MacOS and Windows support for desktop applications… I don’t think NOT supporting Windows is wise, MacOS is pretty optional.
Why do you need to have CI working on your local machine rather than your CI servers (which should be running Linux)?
Actually, I’m saying Windows is used more, not that people prefer it more. 47% of people reported using Windows for work, 33% MacOS, 26% Ubuntu and so on.
My dev environment is actually closer to the prod environment than it would be if I was running everything without these abstraction layers. The abstraction layers are precisely what guarantee sameness. Prod is a Linux container running on Linux. Dev is a Linux container running on MacOS. Since they’re both pulling from the same base images, it guarantees that I have the same version of each system library, etc. No chance of something like prod being Ubuntu 20.04 and dev being 22.04, or prod having Eclipse Temurin while I use Azul, or prod being OpenJDK 17.0.7 and dev being OpenJDK 17.0.8.
And that’s why most companies I know about, give their devs Macbooks nowadays. Much harder to fuck up and regardless of whether you give your employee a Macbook or a boring Ubuntu LTS laptop, they’re going to be running nearly everything in containers anyway.
I know one company near me that does give out Linux laptops - they created their own distro for better control of what updates get installed from the repos. The rest of us use containers to abstract away the host operating system of the dev machine.