I’ve been a web & software developer for over 15 years now. In those years I’ve used every Windows distribution since 95 and every Mac OS X ever. I’ve run desktop setups, mobile laptop setups, desktop replacement laptop setups, and up to four external displays at a time running on multiple machines with KVM switches, VNC, RDP, and SSH. I’ve used every piece of hardware from an AlphaSmart to a Palm Pilot to a Raspberry Pi to the iPad 1 that I waited in line 12 hours for on launch day. Not to mention the Gateways, Dells, VAIOs, Macbooks, custom rigs, or my shiny new Alienware 15 R3 :)
Courtesy My iPhone and Really Poor Lighting
On all of these devices, I’ve written software, developed content, or hacked away on them in some way or another. I’ve also gamed on just about every one, too — I’m remembering the hundreds of hours of Snake I logged on my TI-83 in middle school. Of course, as a gamer, nothing will ever come close to Windows. The gap is just so wide already that it will be ages before anyone catches up (although this isn’t ABSOLUTELY true, which I’ll get into more later). This piece isn’t about that however. I just want you to know where I’m coming from.
This piece is about the transition from mainstream OSes (Windows, Mac) to Linux as a software developer.
As a developer, I had to learn to work with pretty much every environment just to survive. Among those environments, Linux has actually been unavoidable. Not that I’d want to avoid it. It’s really a remarkable piece of technology. One I’ve long regarded as perhaps the most important open-source project of all time. What amazed me, though, is that I had never really worked & lived inside a Linux environment. Yeah, I might have SSHed into a cloud-hosted Linux machine every day for years or had Ubuntu 16.04 running in VirtualBox or Parallels, or a little Raspberry Pi rocking Ubuntu under my desk, but I never really used more than Apache, MySQL, PHP, Node, SSH, VNC… terminal stuff.
The CLI.
I thought I knew Linux…
So when I decided it was about time I made the switch and ran the full-fledged — in all its glory — Linux desktop environment (aka Ubuntu 16.04 w/ Unity), I said “No problem.” My wife said, “You know what’s going to happen, right?”
I made a face…
And I was already knee-deep anyways. Developing in Node & Docker on a VM or WSL is dreadfully slow (literally about 30% at best on I/O operations versus native Linux). So, I continued to resurrect my Master Boot Record each time I ruined it with a failed Ubuntu installation (thank God for backups). Mind you, I’m installing a dual-boot setup with Windows 10 on the other side and a mix of NVMe & SATA drives. So, while I blamed my wife for jinxing me, this was clearly inevitable.
Sidebar: If you are trying for a setup like this, be sure to verify your UEFI & secure boot settings (I recommend Google for this) or you’ll be repairing that MBR more than a few times.
Anyways, one or two sleepless nights later, I finally had Windows 10 and Ubuntu 16.04 dual-booting successfully! I then made the smart decision to get some sleep before I got to configuring my system (installing apps, configuring shortcuts, and otherwise making it as comfy as my Windows & Mac environments ever were). A smart decision because this would prove to be no small task…
As of writing this, I’m about 7–10 days in now. I continue to tweak my OS… I continue to succumb to sleepless nights… And I really don’t know when it will end…
And yet I smile.
Courtesy AMC/Gene Page
You see, knowing the little I knew then about Linux, I still knew that I would be able to do just about anything I needed with a little handy-work. I’m a programmer and so having the advantage of quick/easy scriptable access to the system seemed like a glorious concept.
And this has proven to be entirely true.
As a Node developer, I’ve already used it to write a simple window tiling manager that works in many flavors of Linux given a few common dependencies (wmctrl, xprops). I’ve configured custom shortcuts to intelligently launch my multi-app development environment at the click of a key or toss my mouse pointer from one desktop to the other with a click of my mouse. And I’ve finally taken complete control of my system’s resource usage!
Well, all of this can be done on Windows & Mac, no? It can. And I know because I’ve done it. But there’s a difference. Linux is immersive. You need to know your machine. The terminal literally has you stare at the innards of your OS at all times. You live inside it. There must be a bond.
You’ve got to make Tsaheylu.
Tsaheylu: Na’vi word meaning ‘The Bond’; Photo Credit james-camerons-avatar.wikia.com
And for that, you are one with the machine.
Do you understand? Because I didn’t. Not even close. A week in and I’m still not sure I do. But as I decided to start jotting some ideas about this down on Evernote (which I’ve also had to hack because Linux…), I realized I came up with over 20 ideas in, like, 5 minutes. And so, here you go.
24 things I’ve learned (and/or been reminded of) as a software developer (and gamer!) living on Ubuntu for a weekish:
Yes, I’ve doubted this constantly. But it is true. If you’re trying to customize something, theme something, automate something, monitor something, simplify something, or otherwise hack away at your OS in some way or another, you probably can! And other people probably have already, which is even better! There are so many Linux projects hosted on GitHub; it is overwhelming. AskUbuntu.com is an even more invaluable resource that has answered just about any question you can think of. Don’t be fooled like I was either and believe that a resource you’re looking at is obsolete just because it’s a decade old. Linux has stood the test of time, and a lot of these aging resources are still gold-mines of tips, tricks, and know-how.
This is where Tsaheylu comes in. You need to know your system inside and out because it is effortless to break your installation from the terminal. You’ll see a lot of tutorials, or AskUbuntu answer’s out there that tell you to:
sudo this thing && that thing
Don’t trust them blindly! sudo grants a command “super-user” privileges. In other words, the command can modify anything on your system once you grant it access. So, don’t sudo anything before you know exactly what the command is doing and what parts of your OS depend on the files being affected. Linux is extremely powerful, extremely secure, and extremely easy to monitor & maintain, but with great power comes great responsibility. You can just as easily:
sudo rm -rf /
And like … * that * … your entire file-system is gone … * poof * … So, care for your file-system like it’s your baby. Because as soon as you type that password in to sudo something, there’s no turning back. On that note:
Pretty much everything responsible for running the Linux OS is just a file in the file-system (staring right back at you from the terminal at all times). This is, in large part, why it’s so important to know how your file-system is used. Your disks, your hardware devices, your memory, your apps, configs, tasks, everything! They’re all files. They can all be faked, transformed, moved, linked, and synced. What you do with this knowledge can be anyone’s guess, but I’ve encountered countless scenarios already where this can be a disaster or a boon. In every way, though, the pros outweigh the cons. It significantly reduces the complexity of an OS and makes for an immensely straight-forward user to OS relationship. And should we expect any less from a personal computer? I think not.
Similarly, everything that is not a file is still completely exposed to you (and probably sitting in a file somewhere I just have yet to find). I’m talking about the more ephemeral things, like running processes, network activity, and other kinds of resource usage. These are all accessible in the easiest ways, with the necessary command just a google or an apt-get install
away (or see #10).
This is such a simple concept that I’m going to have to be extra wordy here just to be absolutely certain that I bolster this paragraph up enough to do justice to the actual importance of this crucially critical concept.
~ (aka tilde; aka shift + `) is the character used by Linux to denote the current user’s home folder. It is usually:
/home/<username>
aka Home
Pretty much EVERYTHING that you do on your OS is stored here. Settings & configs, caches, application data, downloads, documents, pictures, and so much more. This is also the one directory on your machine that by default grants explicit rights to the logged in user. No sudo
necessary, here. So, be extra careful with these files! Messing these files up won’t necessarily break your system, but it will make your life difficult.
Now, there are also several other folders in your file-system that you should get acquainted with. Places like /usr/bin
, /etc
, /var
, etc. However, these places tend to be a little more system-oriented. They’re places you’ll need to know to monitor your system logs, make changes to server settings or services, or manage hardware devices. I’m still not intimately familiar with all of these, yet, but I’m getting the hang of it.
Since the terminal is so integral to everything you do in Linux (and so lethal to your OS if misused), it’s important to manage those gaping little holes with extreme precision. I discovered Terminator in my Ubuntu on VirtualBox days, and it continues to serve as a fantastic piece of software for managing Linux terminals in native Ubuntu. I’ve currently got it configured to load nine terminals in a single window, so keeping my tasks organized and isolated is a breeze. If you like to tinker like I do, it’s also thoroughly customizable, down to the background or color palette used to colorize each terminal.
Also keep in mind, you can totally leave your desktop environment at any time by hitting CTRL + ALT + one of the Function keys to jump right into a dedicated terminal as any user.
Shortcuts are essential to a delightful Linux experience. And delightfully, Linux obliges in more ways than one. The two easiest ways to create shortcuts are by adding aliases (or functions) to your user’s bash file (usually ~/.bashrc
or ~/.bash_profile
) or by adding custom shell scripts to /usr/bin
. In addition to being able to quickly associate custom commands with any action you want to perform, you can also just as easily bind keys and key combinations to execute those commands. Customize these to your liking, and it will remove all of the thinking from your workflow and let you actually focus on your work.
EDIT: Due to the numerous responses I’ve had (both here and on Reddit), I feel obliged to mention that /usr/bin
is not the directory you want to use! I have yet to explore this option, but most of the recommendations seem to be creating your own bin directory in home and to then link it in your $PATH
variable.
With all of that mention of terminals, commands, shortcuts, and aliases, you’re probably thinking, “Golly, that sounds like a lot of typing!”
It is.
And it is imperative that you have an excellent keyboard to mash away at. I cannot stress this enough. As frequently as is necessary to enter in a sudo
command and type your password, you will want to get it right the first time. Most Linux flavors exhibit a mandatory three-second delay after entering a password incorrectly. Having to do that just three times will end up taking you over 10 seconds… If you’re a programmer, you know how devastating that kind of time can be! And maddening, too… And we all know a programmer on tilt is not a good programmer at all.
While having to enter in your password eleventeen times is expected to cause a major meltdown, do not despair! You will find the way.
Living in Linux takes grit.
It takes perseverance. Sometimes, you just have to set aside a problem for another day. The next time it becomes a nuisance, give it another google. Eventually, you will string together just the right few words and that AskUbuntu answer will come along to save the day. Mama said there’d be days like this, and she was right. Linux is fraught with idiosyncrasies, inconsistencies, and seeming impossibilities. But the community is massive, and the OS really is as versatile (and hackable) as you would expect the perfect open-source piece of software to be.
To save you a lot of headache and wasted bandwidth on google, keep yourself a cheat-sheet. I’m still working on mine, but I recommend you note all of the regular commands you use. Alias all of the longer, trickier commands and eliminate the thinking. Print this cheat-sheet out if you need to and paste it to your wall. There are so many commands, folders, and tricks you need to keep in mind when operating in Linux, that it’s insane to try to remember everything. Sure, you may eventually (though you probably won’t…), but in the meantime, save the trouble.
If you like to tinker, you will LOVE Linux. Pretty much everything is customizable. If you’re running a desktop environment like Unity or Gnome, there are several different tools for this like unity-tweak-tool and gnome-tweak-tool in addition to the baked-in system settings you get with those desktop environments. As I mentioned before as well, pretty much everything in Linux can be reduced to a file. So, dive further into the OS, and you will find you can tweak virtually everything, including boot screens, window decorations, automated tasks, and application configurations or behaviors. There are also tons of resources out there with custom themes for a lot of popular Linux distros. On that note, there are also the countless distros & flavors of Linux out there for you to try! Each one comes with its own unique spin on what an OS should be. This is something you don’t get with Windows or Mac.
However…
With that said, there is not enough time in one lifetime to test every Linux distro & flavor. Do your homework and research the various distros before choosing yours. As I mentioned above, each one is unique, and each one has a learning curve associated with it. While some desktop environments can easily be installed on top of an existing distro — Ubuntu, for example, runs particularly well with Unity or Gnome environments — many do not and many distros need to be installed from scratch to really get the authentic experience. Further, these are muddy waters. Messing with an already established distro like this is one of the easiest ways to bork your system.
Google’s carousel when you search “linux distros”
An example of a Linux Man Page; which you will be perusing frequently.
Sometimes living in Linux can bring about a sort of nostalgic feel. While the OS itself has thoroughly kept up with the latest trends and even pushed envelopes in many areas, the community is still full of programmers and developers. A whole slew of people that already know how to work around minor annoyances and an even broader audience that has been living in totally terminal-based interfaces for decades. As a result, the resources available for Linux on the web are very old-school. Documentation — even official — looks like something put together in the 90s and you will be hard-pressed to find screen-shots in tutorials or application pages. Now, this should come as no surprise since a lot of this content actually was developed in the 90s. Remember, as I mentioned earlier, Linux has stood the test of time and so has this content. If you can get past the aesthetic inadequacies, you will have no problem finding anything you’re looking for.
Simultaneously, Linux will also make you feel like you’re from the future. This is because that same community of programmers and developers that couldn’t care less about shiny docs pages is the same community that is behind the scenes developing all of the latest, greatest technology. So, in so many ways, Linux is on the bleeding edge.
It’s also been re-architectured, and custom-fit to work on countless forms of hardware and is already the undisputed world-leader in non-desktop computing.
As you tweak the OS to your liking as well, it begins to take on a life of its own. Unlike Windows or Mac, the OS isn’t force-fed to you. It’s a living creature you bore with your bare hands. This melding of man and technology is indicative of a world we are fast-approaching and one that is being made possible thanks to the efforts of Linus Torvalds (Happy Birthday!!) and the remarkably innovative Linux community.
14 points and I’ve mentioned the terminal about 100 times and the desktop environment not once. However, it’s the desktop environment that really makes for the complete experience. I get the whole vim and xmonad thing, but I’m a UI developer…
I like a real desktop environment.
And if Linux couldn’t deliver that to me, it would have been a deal-breaker.
Fortunately, after some growing pains with Ubuntu 16.04 + Unity, I upgraded to Ubuntu 17.10 to give Gnome 3 a shot, and boy is it amazing! Gnome 3 is fast, user-friendly, and it looks GREAT!
It also properly positions windows on the desktop, which is a big plus. Unity’s window position calculations are really unreliable, which is a nightmare for any window tiling manager.
Needless to say, I haven’t tested every distro or flavor (for reasons I mentioned above), but Ubuntu 17.10 + Gnome 3 is certainly my favorite thus far. Bust out a dark theme and toss Redshift on top and you’re set:
Yes, it’s true. Linux can do it all! Don’t let anyone fool you. If Windows or Mac can do it, Linux can, too. Linux even runs a lot of Windows apps with the help of a program called Wine. Not that you really need to. I don’t. There tends to be a pretty solid Linux analog for whatever app you need, and with the advent of frameworks like Electron, the difficulties of cross-OS development are becoming a thing of the past. Slack for example is a straight 1-to-1 match between Windows, Mac, & Linux.
Of course, some things are a little trickier, but I’ll get into those after I praise Linux a little more first:
If you run Ubuntu, you’ll have access to this neat little tool called Aptitude (aka apt). It’s an invisible program you can summon up to fly out into the wide web world and fetch for you about 90% of all the applications you will ever need to make Linux do what you want. It manages all of these applications intelligently and keeps them up to date (as you request it, which you should frequently). If you learn how to use this tool well, you will have no problem getting Linux to do just what you want it to. Just be careful when removing packages using Aptitude… Lots and lots of stuff depends on the packages managed by this guy. So, if you remove the wrong thing, things tend to go *boom*.
Despite what people say, you CAN game on Linux. Actually, better than you can on Mac in my opinion. Steam even runs natively on Linux now, which is remarkable. I run Rocket League at full settings (minus 4K) and get max FPS and eight ping… (the ping is probably a credit to my gigabit internet, but still… good to know Linux is maxing out my ethernet). Sadly, 4K gaming is still nowhere near as performant as on Windows, but I expect the Linux Nvidia drivers will catch up soon in that area.
Automation is EASY on Linux. Writing a shell, Python, or even Node script to execute some frequently used task is as easy as writing the script. There is no overhead in Linux and crontab (Linux’s primary task scheduler) takes about five seconds to learn. So, just code up your task, add it to crontab, and you’re done!
As I mentioned earlier, removing the wrong packages can really screw up your system quick. But, even worse than having things go *boom*, is when a non-essential package is missing. These tend to break some subtle feature in your system and can be impossible to track down. This is one of those things I talked about when I said
Don’t Give Up
While you may end up breaking something and have utterly no clue how to find the solution or what to even google for, you will triumph! Live with the issue for a day or two and the answer will find it’s way to you. This is another part of the bond you must have with your OS. Have a little faith in Linux, and things will work out.
In Linuxland, plug & play is dead. Do not expect any device you purchase to work off the bat unless it’s that 1990’s keyboard (see #8 and #13) you grabbed at the bottom of the shelf at Best Buy to hook up to your Raspberry Pi. No, displays, mice, keyboards, headsets… they will all need a little TLC. Yes, it’s just drivers, which might seem easy enough, right? Wrong. Most of these drivers are developed as FOSS (free & open-source software) and by tiny communities of people that are stubborn enough to swear by hardware that was designed exclusively for Windows machines (*cough* Razer). This means that there are a million permutations of hardware that haven’t been accounted for. So — frequently — you will need to dig around to find an amalgamation of solutions to get your hardware working the way you hoped it would when you bought it.
With that said, software is easy! Funny enough, it actually tends to be easier to fake hardware using the Linux file-system than it is getting actual hardware to work. This, however, ends up letting us devise some pretty cool hacks:
If you use WebEx for Desktop on Windows, you will be disappointed to know that the Linux versions do not support presenting (screen-sharing). Luckily, Linux is easy to hack! With direct access to the file-system — which is actually used by the OS to represent our hardware — and a powerful program called ffmpeg, we’re able to solve this problem with one command (and a few dependencies installed):
sudo modprobe v4l2loopback && sudo ffmpeg -f x11grab -r 15 -s 1920x1080 -i :0.0+0,623 -vcodec rawvideo -threads 0 -pix_fmt yuv420p -f v4l2 /dev/video0
What does this do? It uses ffmpeg to capture one of my displays and output the stream as a v412loopback (easily installed from Aptitude) to a file at /dev/video0
, which happens to be the file-system’s representation of my webcam. v412loopback uses the same codec as my webcam, so by running this single line of code, I effectively turn my webcam into a screen-sharing tool, with or without support from WebEx. Couple this with a world-class, open-source broadcasting application like OBS (I still haven’t completely figured this out, but I’m onto something; if you have any insight, please share it in the comments!), and you have a more powerful screen-sharing tool than anything WebEx could offer anyways.
Yes, you will. If I hear one more Linux junky feed me that, “But, GIMP!” crap, I’m going to have a fit.
GIMP is NOT Photoshop.
It never will be. I miss Photoshop dearly. And although it’s just a reboot away, it still feels so far (remember, I dual-boot with Windows 10 and for this reason — and gaming, of course — I will never be able to go 100% Linux). In addition to Photoshop, you may also miss:
Office 365. Libre Office is pretty impressive, all-in-all. But in reality, it’s not good enough. However, if you’re anything like me, you do most of your stuff in Google Docs/Spreadsheets/Slides anyways, so you’ve weaned off the M$ nipple a bit already. Nevertheless, Office 365 is a fantastic suite of products, and it is a little painful to know it’s collecting dust on my Windows side.
Evernote. I use Evernote a lot. And the Windows Evernote desktop client is amazing. It’s so snappy, well designed, and lightweight. Unfortunately, after tons of digging and experimentation, I could not find a single comparable Evernote client for Linux. Fortunately though, the web client is pretty awesome and with a little hacking, works almost as well for me.
The Plethora Of Others That Have No Good Linux Analog :(
To name a few:
Windows Mail… Yes, if you haven’t used it. Try it. It’s really one of the best mail & calendar clients to date, IMO.
Nvidia Control Panel. There is a pseudo-analog for this (nvidia-settings) that comes with the Linux drivers, but it’s not nearly as powerful as its Windows counterpart.
Ableton. If you produce music or sound effects, you will probably be disappointed to hear that the last word of a Linux compatible Ableton was in 2014. While it’s possible to get it working with tools like Wine, getting peak performance will still be no easy feat.
I may edit this later as I think of more, but probably not. I’ve just been so entrenched in the Linux world, I’m starting to forget what it was like elsewhere. And I think you get the idea anyways. You can’t always have the best of both worlds. Nevertheless, as a developer, in just a weekish I can already say that Linux is probably the most complete package of a desktop OS. As a gamer, I say make sure you have Windows at the ready for anything serious, but don’t hesitate to test the waters with a less demanding game like Rocket League or a majority of the now available Steam library.
Of course, any OS is only as good as the applications & programs it supports. And Linux is no different. While I do miss my Windows apps mentioned above, the Linux community was more than accommodating. In the last weekish, I’ve strung together the following suite of applications to streamline my workflow:
Evolution Mail. After trying several mail clients on Linux, I found Evolution Mail to be the most thorough. It supports calendars, tasks, memos, & contacts. It has customizable views, searches, signatures, and everything else you need from a comprehensive mail client.
Terminator. Terminator is — hands-down — the best terminal manager for Ubuntu. It sports custom profiles, tabbed terminal windows, tiled terminal windows, and fully customizable theming. It is an absolute must-have.
Terminator
Google Chrome. If you’re human and don’t live under a rock, you probably browse the web. While Ubuntu distros come with Firefox pre-installed, I think we all know Google Chrome does this better than anyone. And if you need to keep another completely isolated session open at all times, like I do, and don’t like to use extensions for this, you can also install Google Chrome’s parent project, Chromium and run them side-by-side.
gnome-system-monitor. Monitoring system resource usage is a critical part of maintaining a healthy, functioning machine. gnome-system-monitor comes pre-installed with Gnome-based distros and does a great job giving you an overview of resource usage.
Redshift. STOP staring at cool-toned screens! Overexposure to blue light has been proven to have devastating effects on our circadian rhythm. Redshift intelligently warms your screen later in the day to reduce eye-strain and prevent display-triggered insomnia.
Cerebro. If you come from the Mac world, you probably love Spotlight. If you love Spotlight and moved to the Windows world, you probably love Launchy. You may even like Quicksilver (Mac) or just good-ol’ Start Menu (Windows). If you like any of these things and don’t LOVE the various attempts at a launcher for Linux distros, try out Cerebro! It’s built on Electron, so it actually works in Windows, Mac, & Linux. It’s also got a fast-growing community behind it and comprehensive plugin architecture that has been put to use in some really cool ways!
WebStorm (JetBrains). If you’re a web developer working with JavaScript, WebStorm is by far the best IDE in existence. While there are alternatives like Atom, Eclipse, or Sublime Text (though not really an IDE), JetBrains has put together quite possibly the best suite of software for Python, Java, JavaScript, Go, and so many more languages. Further, every single one of them works in exactly the same way. So, the learning curve is a one-time thing.
Sublime Text. Briefly mentioned above as an alternative to WebStorm, it is also an essential companion to it. Heavyweight IDEs like WebStorm can be overkill for a lot of smaller text-editing tasks. Sublime Text is a great, light-weight app to have open when you need to tweak config files, shell scripts, or any other non-project oriented items.
If you know of any other great apps or alternatives to the ones I’ve listed, please do share them in the comments!
If you haven’t given Linux a shot yet as a real, day-to-day OS, I highly recommend it. Just be prepared for the hurdles and learning curve. It will not be easy, but it will be rewarding. Linux has gained some tremendous traction in the past year. I’ve noticed it everywhere. On all of the theme sites, discussion boards, Q/As, etc., there is the same pattern. Lots of talk 5–10 years ago. Then silence. And now a resurgence in the last two years. And from what I see, it’s no coincidence. Linux, as an open-source project, is in a perfect position in today’s world to take off.
I’m on the bandwagon already, and I like where it’s going.
If you’ve jumped on already, I’d love to hear your take on this in the comments. Otherwise, feel free to ask or comment on anything you like! I’m still very new to this side of computing, so I’m all ears.
My name is Jonny Asmar and I want to sincerely thank you for taking the time to read my post!
I started writing code in Notepad over 15 years ago and never stopped. While I mostly work in React/Redux & Node, I have a passion for technology that goes far beyond UI development — this has been my effort to share that passion with you.
You can learn more about me at JonnyAsmar.com, see some of my code on GitHub, or reach out to me at [email protected].
And please be sure to share a few claps if you enjoyed this piece :)