In the previous two posts, I’ve compared and contrasted Windows vs. Linux, .NET vs. Python; but I haven’t dived (dove? diven? English is so confusing(!)) into what development actually looks like on Linux. For you .NET devs, I’ll try to draw parallels as I go.
I use Ubuntu as my operating system, but after trying (unsuccessfully) to use rdesktop, I moved over to Xubuntu. I chose Ubuntu because of its driver support and ease of set-up compared to other Linux distros I’ve tried in the past.
Python development (specifically covering the Django framework) needs a few tools put together in order to work correctly:
virtualenv: a tool that creates a separate virtual environment for storing packages used in a Django project. In .NET, you can place libraries (packages) in the GAC, or you can use NuGet to install them into the project and bin deploy them along with the project. In Python, by installing a package into the virtualenv, you’ve essentially done the same thing a bin deploy would do in .NET. If you don’t install packages into a virtualenv, then you’re essentially GACing the libraries. This is a bad thing for the same reason it’s a bad thing in .NET: You can’t have two DLLs (packages) with the same Assembly name.
virtualenvwrapper: A tool that makes virtualenvs easier to set up and maintain. instead of this command to load a virtualenv:
Nginx: nginx is a very versatile web server. It can be used to reverse proxy calls such that instead of the following:
IIS provides this capability as well.
uWSGI: A lightweight web server that requires zero set-up; it’s used as a development web server for Django projects. Its .NET equivalent would be the Cassini web engine.
byobu: an enhancement for tmux that allows a user to have multiple terminal (command line) windows open at once, and even have splits in the same window. It doesn’t have any direct equivalents on the Windows side, except to say that Console2 tries to take care of the tabbing functionality.
apt-get: A system package manager for Ubuntu (and other debian based systems). It allows you to install new software with one command. I heard they’re bringing it to Windows, and all I can say is, what took them so long?
pip: A python package manager. Nuget for Python.
PyCharm: A Python/Django IDE by JetBrains, the makers of ReSharper. It literally feels like Visual Studio for Linux. Sadly, it runs on Java, but those are the breaks.
Vim: I can’t do Vim justice. It has a steep learning curve and I have yet to scratch the surface of what it can do for editing code. I still haven’t decided on whether I’ll stick with Vim or move to Emacs. Vim’s modal nature is my biggest complaint about it.
I ended up moving to Vim from PyCharm after my Ubuntu system crapped out on me when I made the mistake of trying to uninstall a beta version of Crossover Linux. After a fresh system install (luckly my Home directory was on a separate partition) I decided to forgo PyCharm and stick to Vim.
Problems with using Linux for Development
Installing updates is problematic, to say the least. The Ubuntu software updater doesn’t separate out kernel updates from other updates, and if you’re not paying attention, you could inadvertently try to update the kernel while updating a package. Maybe it’s just my bad luck, but this has always resulted in issues for me that were not trivial to figure out (for a linux newbie such as myself).
Window desktop manager crashing is far more common than it should be. Linux is really stable, Window Desktop managers are not. Here are a list of things that have crashed my window desktop manager, in no particular order: Starting Pidgen, opening an IM window, hitting ‘play’ on a piece of audio. Opening Chromium, booting up, or installing updates. I’ve gone from the proprietary Nvidia drivers to the VESA drivers, to whatever I can try, and it still happens. It doesn’t happen often, but when it happens it’s really annoying.
There is no good support for corporate (synonymous with Exchange and Outlook) email. After a lot of effort, Thunderbird can be used to read and write email, but if you’re using Outlook’s calendar, you’re pretty much stuck. If you use anything more advanced than Outlook’s Email and Calendar (like Tasks, To-Dos, or processing rules) you’re really stuck. Your options become:
1. Try Crossover
2. Set up a terminal services login to a box that runs Outlook, and using rdesktop to connect to it.
3. Use Outlook Web Access, in all its (ahem) splendor. The problem with this approach (besides the fact that it’s OWA) is that you can’t process existing rules in OWA.
Crossover simply does not work for Outlook 365 (or any of the 365 services, come to think of it). A Terminal Services login is an ok alternative, but it has its own issues (copying/pasting, opening links, etc).
Corporate IM / VOIP service is almost non-existent. We run a Cisco VOIP system, and they do not have a Linux client. Even worse is that if you have the Mac version of their software, it can only talk to other Macs — it can’t do voice communication with Windows VOIP users. I wish I were kidding.
Overall, the switch from Windows / .NET Development to Linux / Python development has been a great learning experience, but looking back, I’ve spent too much time configuring and getting everything to work with everything else, and that should not be the way it is. It’s 2013, we can’t do this better?
In the final part, I’ll detail what I consider to be the most optimal solution for a python developer to do both Windows and Linux development without Dual booting.