Rules for Computing Happiness Revisited

About a year and half ago I wrote down some Rules for Computing Happiness. I based the list off of a similar list by Alex Payne. But in the year and half since then a lot has changed in my life. I graduated from college and finished a year as a graduate student at Cornell University’s computer science running experiments. I’ve also finally joined the world of smartphone users. I spend the greater part of the day writing programs and scripts and spend an increasing amount of time on remote machines. In the light of all those changes I think it’s a good idea for me to revisit the rules I laid down and see how much they’ve changed (or stayed the same). Here goes:

1. Use as few physical machines as possible

This one’s a keeper. I now use only two physical machines: my personal Macbook Air and my powerful Linux desktop at work. I use a combination of Git, Dropbox and Chrome tied to my Google account to keep things in sync between them. In reality the work I do on each doesn’t much overlap so there isn’t a pressing need to keep them in sync.

2. Keep work and play separate

Another keeper. I don’t have any social media apps on my work machine, I generally keep IM closed and I’m busy and in the flow enough that I don’t feel the need to randomly open up Reddit or Hacker News. I should be honest and say that this isn’t a purely (or even mostly) technical thing – in fact it probably has more to do with my shifting perspectives on what’s important. I have my phone near me if anyone really needs to get in touch with me. Since I’m a grad student I have a lot on my plate that is important but little that is urgent so my phone rarely gets used.

3. Get a Linux machine for programming. Use multiple monitors and a tiling window manager

I’m a bit less sure of this one and I’m partly afraid that I’m just plain biased. I do most of my programming on my Linux machine, but I do a decent amount on my Macbook Air too (especially experimental web stuff). I mostly use the UNIX in each so I’ve become fairly agnostic to what skin I’m running on top. I’ve never programmed on Windows so I don’t have anything to add on that matter.

However, I do use two monitors on a regular basis and going back to one can be annoying. I tried using Unity for a while and while it’s not bad, I keep going back to XMonad. It’s clean separation of physical monitors and virtual desktops makes using multiple monitors very flexible and efficient and I always find myself missing it when I’m on a different environment. By contrast, the way OS X does it is complete rubbish, especially if one of your windows is in fullscreen mode.

4. Get a Macbook for non-programming tasks

I’ve had my Macbook Air for over a year now and I love it. It’s the best laptop I’ve owned and probably the best computer ever. I only use a handful of userspace apps but they’re high quality ones like Reeder and OmniFocus. Homebrew is definitely the missing package manager for OS X and makes any programming I do a lot easier.

5. Keep a backup server, either physical or virtual

I’m still running a small Linode VPS that serves my personal website and acts as the syncpoint for my Git repos. I haven’t had any destructive crashes in the past year so I haven’t really felt the need for a backup, but it does offer peace of mind.

6. Learn and customize your tools

Yes, but do realize that it’s not the point.

7. Use public computers as little as you need to

Since I have both a great portable machine and a great workstation I haven’t had to use public computers at all. My desire to work in coffee shops and libraries has also been decresing steadily and I now prefer to work in a private office or a quiet shared workspace.

8. Pay for good software if you need it, but only after you’ve tried it out for a while

I’ve bought software like OmniFocus and Reeder and by and large I don’t regret it. I’m currently considering getting iA Writer. It’s cheap enough that I rarely think twice about gettting something that would make my job easier. However they “trying out” part is harder. My biggest gripe about the Mac App Store is no way to try out apps for a period of time (or stop using them and get a refund).

9. Keep information in open formats, preferably plain text

Yep. The only non-plain text format I interact with regularly is PDFs, only because that’s how most academic papers are distributed. I hold out hope that one day the academic community will move to publishing in hypertext.

10. Use version control on all projects

All my source code, my research data, my configs, my public and private writing are in version control. It not only makes it easy to go back and get something I may have overwritten, it also makes backup easier.

A New Year, A New Phone

This year I’ve decided to make a foray into the future by finally getting myself a proper smartphone. I’ve had an iPod Touch for a while but also had a simple Nokia not-smart phone to make actual phone calls. It’s always been somewhat annoying to have to manage two devices: a real phone for calls or texts and the iPod for any Internet and data-related work. A large part of my resistance to getting an actual smartphone was that I simply didn’t want to spend a lot of money on a cell phone plan when I was surrounded by wi-fi all the time and barely made actual phone calls. But now that there are finally both reasonably cheap unlocked smartphones and contract-free data plans I decided to bite the bullet.

The unlocked iPhone 4S would end up costing me a tad over $800 after tax and Applecare. I was also getting bored of the iOS ecosystem and its closed, silo system for apps. So instead I got myself a much cheaper unlocked Android phone – the Google/Samsung Nexus S. I’m pairing that with a $30 a month T-Mobile data and phone plan. I’m still waiting for a new SIM card to show up but till then I’m making use of the ample wifi coverage that’s a side-effect of living in a college town. For now, I’m only going to talk about my first impressions on the Nexus S itself.

Google Nexus S

Google Nexus S (via Wikipedia)

The Nexus S is Google’s previous flagship phone. Its current flagship is the Galaxy Nexus which Google is also selling unlocked. However it’s almost twice the price I paid for the Nexus S and in my opinion, isn’t sufficient of an upgrade to justify the price. Even though it’s about a year old by now (and technically running the old version of Android), I haven’t had a problem with it so far.

It looks pretty different from the iPhone and the plastic feel takes some getting used it. I also think it slips more easily, but that might just be a personal problem. The back of the phone has something of a ridge at the bottom which I guess is supposed to make it easier to hold. Though the build quality does feel inferior as compared to the iPhone, I like it and have no major complaints.

The Android sofware feels like a breath of fresh air as compared to the iPhone. It is considerably more customizable and I like the presence of both tradiiontal apps as well as “widgets” that add functionality directly to your home screens. I’ve found widgets great for quickly looking up data like the weather, Twitter mentions or what system services are currently running.

The tinkerer in me loves how customizable the Android system is. Changing the look and feel is just the beginning. There are a lot of bells and whistles and options and sometimes it can be a rather confusing. For now I’ve only stuck to the usual set of apps (Twitter, Foursquare, Camera) but I’m looking forward to trying out new and interesting apps in the future. More than that I feel like Android would be a really good platform if I decide to get into mobile dev anytime soon.

There are a few things about the Nexus S that I’m concerned with. I think the battery life is a tad too short, especially with the geolocation services on all the time. Luckily, the battery monitor widget makes it simple to turn off services with a touch so maybe some manual management might make it better. While the Google apps are really well integrated (especially Google Voice) and apps from large companies are well done, third-party apps seem to be of considerably less quality than iOS equivalents. I don’t really blame the developers given the multitude of devices but it does mean that finding good apps for simple things like RSS is more difficult than it should be.

Despite the glitches and minor annoyances I really like the Nexus S. The hardware is pretty solid and I like Android so far. Right now having a fully functional smartphone is still pretty new to me, but I’m hoping that when the novelty wears off I’ll dive into actually programming the powerful computer in my pocket.

Ubuntu should zig to Apple’s zag

It’s another October and that means it’s time for another Ubuntu release. Before I say anything, I want to make it clear that I have the utmost respect for Mark Shuttleworth, Canonical and the Ubuntu project in general. I think they’ve done wonderful things for the Linux ecosystem as a whole. However, today I’m siding with Eric Raymond: I have deep misgivings about the direction Ubuntu is going, especially in terms of user interface.

I’m not a UI or UX designer. I’m sure there are people at Canonical who have been studying these areas for longer than I have. But I am a daily Linux user. In fact I would say that I’m a power user. I’m no neckbeard, but I think that by now I have a fair grasp of the Unix philosophy and try to follow it (my love for Emacs notwithstanding). The longer I see Ubuntu’s development the more it seems that they are shunning the Unix philosophy in the name of “user friendliness” and “zero configuration”. And they’re doing it wrong. I think that’s absolutely the wrong way to go.

It seems that Canonical is trying very hard to be Apple while not being a total ripoff. Apple is certainly a worthy competitor (and a great source to copy from) but this is a game that Ubuntu is not going to win. The thing is, you can’t be Apple. That game has been played, that ship has sailed. Apple pretty much has the market cornered when it comes to nice shiny things that just work for most people irrespective of prior computer usage. Unless somehow Canonical sprouts an entire ecosystem of products overnight they are not going to wrest that territory from Apple.

That’s not to say that Canonical shouldn’t be innovating and building good-looking interfaces. But they should play to the strengths of both Linux the system and Linux the user community instead of fighting them. Linux users are power users. In fact I think Linux has a tendency to encourage average computer users to become power users once they spend some time with it. I would love to see Ubuntu start catering to power users instead of shooing them away.

It’s becoming increasingly clear that Apple does not place its developers above its customers. That’s a fine decision for them to make. It’s their business and their products and they can do whatever they like. However as a programmer and hacker I am afraid. I’m scared that we’re getting to the point where I won’t be able to install software of my choosing without Apple standing in the way. I’m not talking about just stuff like games and expensive proprietary apps, but even basic programming tools and system utilities. That’s not something that I’m prepared to accept.

Given the growing lockdown of Apple’s systems, Canoncial should be pouring resources into making Ubuntu the best damn development environment on the planet. That means that all the basics work without me tinkering with drivers and configurations (something they’ve largely accomplished). It means that there’s a large pool of ready-to-install software (which also they have) and that it’s possible (and easy) to install esoteric third-party tools and libraries. Luckily the Unix heritage means that the system is designed to allow this. Instead of trying to sugar coat and “simplify” everything there should be carefully thought-out defaults that I can easily override and customize. Programmability and flexibility grounded in well-tuned defaults should be the Ubuntu signature.

It makes even more sense for Canonical to take this angle because Apple seems to be actively abandoning it. A generation of hackers may have started with BASIC on Apple IIs, but getting a C compiler on a modern Mac is a 4GB XCode download. Ubuntu can easily ship with a default arsenal of programming tools. Last I checked the default install already includes Python. Ubuntu can be the hands-down, no-questions-asked platform of choice for today’s pros and tomorrow’s curious novices. Instead of a candy-coated, opaquely-configured Unity, give me a sleek fully programmable interface. Give me a scripting language for the GUI with first-class hooks into the environment. Made it dead simple for people to script their experience. Encourage and give them a helping hand. Hell, gamify it if you can. Apple changed the world by showing a generation the value of good, clean design. Canonical can change the world by showing the value of flexibility, programmability and freedom.

Dear Canonical, I want you to succeed, I really do. I don’t want Apple to be the only competent player in town. But I need an environment that I can bend to my will instead of having everything hidden behind bling and “simplification”. I know that being a great programming environment is at the heart of Linux. I know that you have the people and the resources to advance the state of computing for all of us. So please zig to Apple’s zag.

PS. Perhaps Ubuntu can make a dent in the tablet and netbook market, if that’s their game. But the netbook market is already dying and let’s be honest, there’s an iPad market, not a tablet market. And even if that market does open up, Android has a head start and Amazon has far greater visibility. But Ubuntu has already gone where no Linux distro has gone before. For most people I know it’s the distribution they reflexively reach for. That developer-friendliness and trust is something they should be actively leveraging.

The current state of operating systems

I’ve been having some conversations lately about the current state of operating systems and computer technology in general. With the recent announcement of OS X Lion and Steve Ballmer’s claims that they are betting big on Windows 8, it’s an interesting time for operating systems.

In some ways the last decade or so has not been so interesting for desktop operating systems. Only three operating systems are still in popular use and all of them are more or less the same in terms of how they work. The differences between them from a user point of view are mostly superficial. However, each of these operating systems has a different story to tell. Windows has been pretty much stagnant from Windows XP through Vista up to Windows 7. The bold plans that were supposed to be part of Longhorn never came through. On the other hand OS X has been slowly but steadily marching ahead. OS X along with the iLife suite and the iOS devices has been gently pushing personal computing into the future. However, it’s becoming clearer that the controls that Apple places on it’s technology is here to stay and will probably only get more stringent in the years to come. Whether or not the desktop Mac gets completely locked down remains to be seen. Finally Linux on the desktop never really took off (despite some good attempts) and even with Canonical and Ubuntu doing some great work, it doesn’t seem Linux will see strong market penetration any time soon.

So where does all this leave us? I think it’s high time for a Microsoft resurgence. They have an army of really intelligent capable engineers spread throughout the world. They have some amazing projects being incubating in their Labs (and more smart people). Equally importantly, they have immense financial assets and deep, deep inroads to the corporate sector. Though they’re not in danger of losing their immense market lead anytime soon, they  haven’t done anything innovative or exciting in a long long time. And they’re also far far behind in both cloud and mobile computing. But at a time when there are doubts starting to fly about Apple’s intentions (and how they’ll play with companies like Flash and Adobe), it could be just the opportunity that MS needs to make a strong comeback. They’ll need something bold and unique, but there doesn’t seem to be much confidence in their ability to pull off what they need to do.

Being a Linux user for a good few years I think it’s represent some really technology, unfortunately it fails when it comes to getting the little things working properly. Ubuntu does a good job of making the user experience smooth, and I think it’s the best user-facing Linux distribution currently available. But there’s no Netflix for Linux, Flash still has problems and if you’re stepping out of the Ubuntu zone there’s a considerable amount of potential tinkering that you might have to get things working. I personally use Arch Linux and prefer it over Ubuntu mainly because of the bleeding edge packages, but it kinda sucks when you don’t have suspend/resume working for months on end. Once upon a time when I was just diving into the world of Linux and the mysteries of the command line, spending a few hours trying to get graphics working after an upgrade was something of an adventure. But now it gets old really quickly. I’m getting into the phase of “grown-up computing” and I want to use my computer to get stuff done as opposed to figuring out why stuff isn’t working. Should I just sue for peace and stick with Ubuntu on the desktop? Maybe, but at that point I might as well just get a Mac.

Right now, it seems to me that OS X is hands down the best desktop operating system on the market. Unless you’re tied to some particular piece of software on Windows, OS X practically runs everything you would want it to. Of course, with Apple divorcing itself from Adobe and Oracle, it’s interesting to see how long that will last. If Microsoft can’t get its act together and make a comeback, the time might be right for another player to come up. One possible answer is Google with Android or Chrome OS, but I have my doubts if it will work. For one thing, the current state of Android phones seems to suggest that just providing part of the software layer won’t be enough.

A strong entrant to the desktop computing market will need to offer a combined hardware and software combo (even if the software is leased to other players). I’m thinking Apple-level hardware with Ubuntu on top of it. The hardware control would mean fine-tuned and well-tested drivers so that things actually work. However the free software would mean that it would be an open and hackable machine. It works great when you need it to, but you can hack it if you want it to. Canonical might decide to open a hardware wing, especially since Dell seems to have stopped offering Ubuntu as an option.

I think that the lull in operating system activity is coming to an end. As we get more used to the idea of storing our data in the cloud all the time and the web slowly fuses with the desktop, we need the core technologies that power our machines to change as well. However, the change is not always for the best. Furthermore since our livelihood depends on no small part on our machines, it’s in our best interests to make sure that our operating systems do what we want them to. For that reason, as much as I admire Apple’s dedication to perfection  and can understand why they want control of the platform, the lack of a free, open and high-quality alternative does make me uncomfortable. I hope someone stands up to pick up the slack.

Expanding my boundaries

As I start writing graduate school applications and figuring 0ut what I want to do with the next few years of my life, I decided to stop and take a look at just how much of computer technology I really know about. The answer is: not as much as I would like. Though I know a fair amount about programming languages and the related tools, my knowledge outside that area is fairly limited. I have some knowledge about operating systems, a significant amount about computer hardware (including new multicore CPUs and GPUs) and I have a good understanding of the core theoretical concepts behind computer science.

However, I know very little about things like databases, security or computer networks. And this makes me uncomfortable because we live in an increasingly networked world. A growing amount of user facing software is becoming networked, collaborative and social. Both computation and storage are embracing the cloud and it’s becoming more common to have our data in large or small-scale databases rather than in multiple discrete files. Since I plan on staying in the computer field for a good period of time to come, I think it would be a good idea to read up on the networked side of things.

I have a good idea of the hardware layer of networks and the basic socket system (learned all that in the operating systems class) but I have little idea of the protocols and systems built on top of them. I suppose there are enough books out there that would give me a good idea of our networked world, but I don’t just want to know about it, I want to be able to build it (at least parts of it). Luckily there’s tons of great oepn-source networking code out there.

In particular the Ruby on Rails framework and the Mongrel2 webserver are not just completely open source, they also have excellent documentation and manuals. It may not be an entirely good idea for me to start learning about networking by reading server code and documentation, but I like following a “throw myself in the deep end’ policy when I’m self-educating. My plan is to start reading up on how some good networking code works, trying to figure things out and when I can’t figure something out, go look up other resources on it. I did something similar with programming languages when I got interested in them (though not looking at implementation code) and I’ve learned a lot.

In addition to that, there are two computer networking courses being offered next semester (one from an ECE perspective and one from a CS perspective) and I plan on taking one of them. I’m hoping that I’ll have self-taught myself enough that I can use the class to clear any doubts or misconceptions I might have and gain a really solid understanding of the area.

Of course, the best way to learn is by doing and I want to write code that implements the stuff I learn about. I’ve already started this by refactoring my old operating systems project. It started out as an a simple client-server combo that sent data over a network and was a multithreaded program. I’ve slimmed it down and thrown out all the client stuff. At this point it’s a small C library that handles multithreading and establishing TCP connections that could be used for building servers. I have a simple echo server and at some point I’ll sit down and write an HTTP server for it. It’s called Litepipe and you can get it from Github.

I’m really looking forward to exploring and learning about a new area of computer technology, but with all the stuff I have on my plate, it’s probably going to be rather slow going. But that’s ok, I’m not in a rush. I’d love to hear any advice you guys might have on how to get started learning about networking.