You should know Linux

Its hard to get everyone to agree on what core competencies developers should have. I’ve long believed that knowledge of C is fundamental to becoming a great developer. Actually, C in general, memory management, pointer arithmetic, and basic hardware (interupts, scheduling, …) more specifically. Up until recently, when someone asked me what they should learn to be a better programmers, I’d always suggest C. As someone else put it “Not ‘getting’ algebra is not acceptable for a mathematician, as not ‘getting’ pointers is not acceptable for programmers. Too fundamental.”

I’m now feeling pretty comfortable in including Linux as a must-know skills. I’d go as far as saying that for certain type of work, like web development, knowing Linux is more important than knowing C.

I’m not arguing that you need to move your development to Linux, I’m saying that you need to be comfortable enough with Linux to be able to leverage it. Linux is the platform of choice for a massive list of tools that you should have in your toolbox. Not having access to those tools puts you and your company at a disadvantage. It isn’t just about having access to programs either, its about having knowledge about alternative ways to do things. I speak to a lot of ASP.NET developers who don’t know what in-memory distributed caching is or who don’t understand non-relational persistence options. This ignorance is a major liability which will be hard to address as long as developer remain uncertain and fearful of Linux.

The other nice thing about Linux is that its dead easy to setup and configure. The documentation no longer solely consists of cryptic man pages, and the community is broader than ever. If you can’t get LAMP installed, then you either picked an uncommon distro, or you haven’t tried very hard.

If you are really serious about diving in, I offer you some choices. First, convert an old PC to a linux server. An single core P4 with 1gb of RAM is more than enough to run a linux server. You can also get a Mac, since Mac OS X is based on BSD (close enough to Linux for our purposes), and has great documentation for developers to install, configure and learn all types of useful things. You can get a nettop. I’m currently running an ASRock 330 (non-ION or blu-ray – unless you need/want them), which has a dual core Atom 330 + 4gb of ram (added afterwards by me). Finally, you can rent an unmanaged VPS. Probably the most popular provider, due to its performance, price, and the fact that you have full root access, is Linode – however there’s plenty of choice.

Which option you pick should largely be based on your needs. If you’ll want something that you can actually use to host something, then a VPS is clearly the way to go. Otherwise, reuse an old machine if you can, or pick between a cheap low-end dedicated nettop or a more expensive (but also more useful) mac.

As for distributions, I’d recommend Ubuntu – in large part because of the excellent documentation and community (though CentOS is a commone server of choice in production). You can pick the Desktop or Server edition. I picked the server since I only ever SSH into the machine and have no need for a GUI.

This entry was posted in Uncategorized. Bookmark the permalink. Follow any comments here with the RSS feed for this post.

16 Responses to You should know Linux

  1. Javier Tia says:

    I’m agree with Paul Batum.

    You can start with project like collaborator or creator preferably FLOSS

  2. Paul Batum says:

    Personally I do not feel like its enough to tell developers to install a linux distro on a old PC. You have to give them something specific to DO with it! Once you have a linux box up and running, what’s worth spending time on? For example, you could suggest that the developer tries their hand at web development with Rails. I think your post would add more value if it had more suggestions along these lines.

  3. Ray Burns says:

    Keeping up on what is popular among open source tools is a good idea, but I don’t know that learning to use Linux buys a developer all that much. The technology in the Linux operating system is still mostly 1970s technology: Everything is still based on text files and command lines, even the latest tools!

    I’ve used Unix and Linux extensively through the past three decades, doing software develoment, network support, kernel development, you name it. Undersanding the concepts of shell scripting , rsh, and daemons is nice, but they are just other names for what most developers already know. The nuances of how a daemon is started vs a Windows service is interesting but not all that significant to developer productivity.

    This is the big difference between learning C and learning Linux: If you learn C you learn some fundamental concepts that computers are inherently built upon, namely pointers. If you learn to use the Linux OS, you don’t encounter any basic fundamental technologies like that. You don’t even encounter any new technologies – only old technologies that have largely been replaced with better techniques over the years. It is only when you learn specific open-source tools and technologies built *on top of* Linux that you actually encounter some innovation.

    I think the main problem you are addressing is that developers often are unaware of open source innovations until years after they happen. This is a valid concern, but has nothing to do with what OS the developers may be using. There are thousands of open source tools out there, so it is very easy to get lost and not notice something new and innovative among all the chaff. Tracking what other developers are using tends to help somewhat, as does reading blogs and looking at what open source applications are using.

    I would recommend people read a great variety of blogs from the open source world so they understand what is out there, then download and play with them on their current OS, whatever it be. That way they focus their time on what is really important to a software developer’s well-roundedness: Being familiar and comfortable with a large variety of tools and techniques. Learning outdated text file configuration techniques seems like a waste of time in comparison.

  4. David Smith says:

    Another must have book is “Advanced Programming in the UNIX Environment”.

    http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0201563177

  5. karl says:

    Jose:
    It might not be the only book you’ll need, but The C Programming Language 2nd edition, by Dennis Ritchie & Brian Kernighan (the creators of C) is a must-have.

    Its a very different book than what we are used to these days – I personally consider it the best language references ever written. You won’t end up writing some sports inventory system, but you will have covered all of the fundamentals and have a really good reference.

  6. José Filipe says:

    Karl, to those aiming to learn C and discovering the power of pointers and interrupts :), would you recommend any specific book?

    Nice post!

  7. mendicant says:

    Everyone should at least try linux for it’s incredible command line and remote administration capabilities.

    In terms of remote configuration and administration of servers as well as use of server resources it is light years ahead of Windows.

    It’s a different mindset, that’s for sure. And absolutely something that everyone should at least experience.

    Personally, I’d far rather be administering a linux box.

  8. Jason Snelders says:

    A couple of small points first:
    1. “I’ve long believed that knowledge of C is fundamental to becoming a great developer” – A programmer, maybe (though I disagree with that too), but not a *developer*. Knowing how to listen to and understand your customer – *that’s* fundamental.
    2. “…learn to be a better programmers” – Proof reading also helps.

    I generally don’t agree with most “programmers/developers should know X fundamentals” assertions for the simple reason I’ve seen too many different situations that provide too many exceptions to the rule.

    Let’s also first agree on what a “programmer” or “developer” is *then* we can talk about what we should know *in general*.

    Consider: A person can build a fine career as a developer doing nothing more than writing Word, Excel and Access macros and automation for businesses. Do they really *need* to know ‘C’, memory management and pointer arithmetic?

    This is a broad and varying industry. It is also a rapidly advancing industry. And in the same way as there are a lot of new advancements we need to keep up with there are many fundamentals that also become “obsolete” (at least, to some of us).

  9. Andrew says:

    Ahh…I was really hoping for more of a PS3 v. XBox360 religious flame war. :)

    On a more serious note, comparing memcached and Velocity aren’t really that accurate. Sure, from a 10,000 ft view they can both be lumped under “Distributed Cache”, but that’s where their similarities end. Distributed Caching apps have been availalbe for years on Windows, they just didn’t come from Microsoft.

    I guess my points is using MS OS doesn’t mean you are limited to the MS Toolbox.

    I do agree with your main point though, even if it’s simply for your Resume. But in a broader sense, you are only hurting yourself by not at least opening your eyes to what else is out there. That’s why my new laptop is a a MacBookPro (helps to have a father-in-law who works for Apple), and now my new web projects are in Rails using MySql, something I never would have been open to if I stuck with only Windows (or at least a lot less likely).

  10. alberto says:

    There is no need to buy anything. Just create a partition and dual boot, or go virtual.

  11. Christian Nielsen says:

    Thanks for your clarification.

    I certainly do pride myself in being a passionate dev. and my point is not that one should get stuck in the ms sandbox. Just that I think there are other ways than diving into Linux that are just as good if one wants to expand ones horizon.

    There are lots and lots of tools and languages out there. That is actually the best thing for me about being a dev, because you can always improve and learn new stuff.

  12. karl says:

    Christian:
    I agree that for most (by far) systems, you don’t need those tools. The post isn’t targeted at most developers though – its targeted at truly passionate developers who want to take their career to the next step. If you don’t even know that memcached exists (or that type of technology exists) , its impossible to say that you don’t need it. Also, I firmly believe that knowing about NoSQL, can help developers write better code – even if they stick with relational tables (maybe it’ll make them think more about the objects, and less about the columns – this is the same as how learning Rails made me a better ASP.NET developer (by a lot)).

    With respect to tools available on Windows – you actually made my point for me better than I could. Memcached is 7 years old – and Velocity made it to a CTP in 2009 and was then replaced/merged into something else (AppFabric). I don’t know the exact AppFabric story, so pretend Velocity, as we knew it, was going to get a 1.0 release this year. The difference between the developer who braved the Linux world and the one who waited in his MS sandbox is pretty significant – a 7 year head start on a technology that’s proven critical to a certain type of application (one, by the way, that a lot of developer dream of being part of (digg/facebook/last.fm/…)

    This is an ongoing pattern too, those tools that are now available on Windows, generally came years behind and are often less mature (certainly we’d agree that it would have taken yet another couple more years (atleast) to get Velocity up to memcached’s standards). What that tells me is that there are tools available right now which are really only viable on Linux.

  13. Christian Nielsen says:

    I must admit I fail to see the argument your making about tools that “you need to know” which (supposedly?) require Linux. So my comment should be seen as a “please educate me” comment – because I would actually like to see it.

    My first thoughts are that in-memory distributed caching and non-relational persistence options are not really required and maybe not even applicable for most of the systems that I build professionally.

    The next thing I can’t help think about is that there are versions of these kinds of tools that run on windows. There are open source projects (NCache express, Memcached, DB4O, CouchDB and mongoDB) already offering these things, and when referring to in-memory distributed caching MS are working on the project named Velocity, which is just that.

    No doubt several of the projects I listed originate from Linux, but if they run I do not see why I should spend time getting to know a new OS, when there is no real chance I’ll end up doing “real” apps for these platforms any way.

  14. While it is true that there are a lot of programming and development tools available for Linux distros, if those tools are open source then most of them are available for Windows as well. What makes learning to work with Linux special is if we can get under the hood.

    Perhaps more importantly to become a better programmer, we need to participate in open source projects whether on Windows or Linux.

    By the way, I am using Ubuntu and have never found a distro as good as this especially for first time Linux users.

  15. Troy Goode says:

    For playing around Linux, I would highly recommend Wubu – a Windows based installer for Ubuntu that configures Ubuntu to run side-by-side with Windows very easily:

    http://wubi-installer.org/

  16. Ryan Roberts says:

    Or you could just get a Mac. I used Freebsd a lot during the 90s dotcom boom, so its Junior Unix enough for me.