On Languages

Tim H. asked:

As a neophyte I’m still learning which programming language is mainly used for what purpose and why. Everyone seems to have a different opinion on the matter. Is there a standard outline of programs and their uses? A secondary question that spawned from the previous is that I’ve heard several say that some programs have “more power” than others; how does a language have more power over another one?

There isn’t exactly a “standard outline” per se, unless you count Wikipedia or maybe if you collected statistics from GitHub somehow. I can’t offer you much more than my own experiences, impressions, and opinions about which tools are meant for–or used for–what purpose.

Your second question is easier to answer, as Paul Graham (a favorite essayist of mine) has already written about the topic quite extensively in essays “Succinctness is Power” and “Beating the Averages“–which I would recommend reading in their entirety, but in case you’re in a hurry, here are the basic ideas.

A programming language should get the job done as simply and succinctly as possible. A language that makes you jump through hoops and take lots of extra steps to do something isn’t a powerful one; it may appear more readable, but it’s also a lot longer. A powerful language should give the programmer freedom to break rules sometimes if they decide it would make the program shorter, rather than having tons of “guard rails” intended to protect stupid programmers from their own mistakes. (If you’ve ever done any programming using Microsoft languages, or something like Ada or Pascal, you know what I’m talking about.)

Basically, it should let you do stuff–quickly and simply. That’s what makes a powerful tool.

Languages and their uses

Paul Graham covered this a bit too.

Again, this is somewhat subjective; everyone has their favorite language that they default to more often than others, and some people may use a tool for something that isn’t exactly mainstream. I also don’t pretend to be an expert on all–or, indeed, any–of the cultures surrounding the tools in this list. I haven’t even used all of them. This is just about what I’ve seen people use the tools to build, and what I’ve heard other programmers talking about.

I won’t cover every language out there. Just the ones that are in reasonably common use today. No one uses Pascal any more, fortunately. I’m also not covering esoteric programming languages. Furthermore, I won’t cover all the dialects of a language; that would be silly. So if you’re looking for your favorite language and it happens to be Clojure or Scheme, you’re only going to find Lisp.

If I missed an important detail about your favorite language or something like that, feel free to add your comments below.

Also, although I have Opinions on certain languages, I’m willing to admit that they may be better tools in the hands of someone with a different programming style or different level of expertise in that tool than I have. But nothing will make me like .NET or VB.

Assembly

A really low-level language used for things like device drivers, and also a teeny-tiny piece of C’s compiler or something (I think?). Most people don’t program in this casually; those who do are usually old-timers who like to be close to the bare metal.

Bash/Bourne shell language

A pain. It’s not bad for entering everyday shell commands, but writing scripts with it is pretty darn annoying (and that’s its only use, unless someone figured out a way to use it for something else for some reason). Most programmers use Python or Perl instead for tasks that would otherwise require Bash scripting language.

I’ll kind of cover sed and awk under this umbrella. Quite frankly, they’re a pain to work with too, although they are powerful tools. They’d be less of a pain to me if I used them frequently, but I don’t. Most people consider them to be pretty confusing, though.

C

A solid language that’s been around forever. Considered quite low-level, but not as much as Assembly; low-level enough to give you control over nitpicky things and allow you to optimize, but is also finicky and doesn’t do much for you. It’s the base language of Unix and Linux, and is what you use when you need to do systems programming, or you want to write an application that runs really fast and you don’t mind taking longer to develop it. C is what you learn when you want to find out more about how programming languages work. However, to be an efficient programmer, you shouldn’t use it when it isn’t necessary–building everything you write in C wouldn’t be quite as crazy as, say, trying to code an OS in Java… but it’d be up there.

C++

Written by Bjarne Stroustrup, C++ was intended to be C’s successor. Instead, it became an independent language serving a different purpose in its own right. C++ is famous (or perhaps infamous) for being… rather elephantine. If someone mentions they know C++, at least someone else in the room or conversation will say, “What, all of it?” C++ has a lot of fans, and you can certainly do a lot with the language, but it’s considered to be kind of crufty and over-designed, with too many features and libraries and add-ons. See the Jargon File entry on second-system effect.

I haven’t used it myself, so I don’t have an opinion on it either way.

C#

I have used this. Not in a big project or anything, but I had a class on it. It’s basically Java, but tied strongly to Microsoft’s Visual Studio. I don’t know much about the language outside that context (I’ve heard Microsoft opened it up, so presumably you can use it outside VS), but I don’t like Visual Studio, so I don’t like C#. I’d just use Java if I wanted something that looked like Java.

COBOL

Unfortunately, this is still around.

Erlang

A functional programming language. Has a small following, I think mostly in academic circles. I don’t know a ton about it.

Fortran

A low-level dinosaur that’s still hanging around. It must be useful for something, but AFAIK the lowest-level programming language that’s still used widely is C. Assembly gets used for device drivers and that’s about it; I don’t know if Fortran maybe occupies the same niche alongside it, or if nothing new is being written in it.

Go

C, reinvented by some Google coders. I don’t know much about this one, but here’s the Wikipedia page on it.

Haskell

I get the impression that this is kind of the hipster of the programming world. It’s supposed to be a great language, but it’s mostly used for academic purposes, rather than in production environments. It’s a functional language, like Lisp and Erlang, and as such is kind of an underdog because functional languages are generally not that popular due to their syntax, which looks scary.

HTML/CSS

Not technically programming languages, as they aren’t Turing complete. They don’t have all the logic structures and utilities that true-blue programming languages have. They still count as computer code, but an HTML document is not really a “program”–it’s a set of instructions to a browser, which is a program.

However, they get a place on this list because they’re responsible for allowing many, many of our programs these days to run, by building the web sites that surround many of our most useful pieces of software. HTML and CSS are almost necessary for a programmer to know how to write. Fortunately, they’re not very difficult to learn either.

They aren’t used for anything other than web design, unless there’s some weird niche I don’t know about.

Java

Java, the industry standard in programming languages but notoriously un-fun to program in. It’s got tons of libraries, the Java Virtual Machine lets it run cross-platform, and it’s slower than slug slime. Not the worst language out there, but not the best either. It’ll certainly get you a job, but is usually not what you want to use on your own projects. (Exception: Android mobile apps. It’s the native language for the platform and so is usually the easiest tool to use for that purpose. This may change in coming years as projects like Kivy mature.)

I found a good article the other day that explained it in more detail if you’re interested. Apparently it’s supposed to be winding down in popularity, but ten years from now, even if it’s true that nobody will be using it to write new things, we’ll still be dealing with legacy applications that are written in Java.

JavaScript

JS covers both client-side and server-side scripting (now). It’s the trendy language of the moment for this, often used by those who bash PHP. JS has grown up over the years. I’ve been thinking about learning it, but I’m kind of booked on projects for the moment.

Lisp

A theoretical paper turned programming language. “Hey, look, it works!” It’s been around forever, along with C, and has a bunch of dialects; there’s Common Lisp, Clojure, Racket, Scheme, Emacs Lisp…

Its syntax looks scary, with all its parentheses, and the concepts involved are alien to any Lisp newbie, but functional programming is supposed to be so elegant and beautiful that merely understanding how Lisp works and being able to write in it is said to make you a better programmer.

I want to learn Lisp, but haven’t gotten a chance to yet.

Machine language

01000110 01101111 01110010 01110100 01110101 01101110 01100001 01110100 01100101 01101100 01111001 00101100 00100000 01101110 01101111 01100010 01101111 01100100 01111001 00100000 01110111 01110010 01101001 01110100 01100101 01110011 00100000 01110100 01101000 01101001 01110011 00100000 01100001 01101110 01111001 01101101 01101111 01110010 01100101 00101110

.NET (various)

Visual Studio is crazy and awful. The .NET framework means you need to develop on Windows machines, which is Not Fun, and use Windows hosting, which isn’t as secure. It’s also, in my experience, an extremely brittle system full of… maybe not full on spaghetti code, but at least rotini code. It’ll take you a long time to learn to work with well, and won’t be fun to use. However, it’s in vogue with employers, so if you’re worried about your job prospects… I’m sorry, just learn Java. I really don’t like .NET.

Okay, let me expand on this a little so you know it’s not just the fact that I’m a *nix user and it’s unfamiliar.

I don’t mind frameworks and libraries and whatnot, and I don’t mind IDEs. They can be really useful in certain projects. But I don’t like IDEs that try to set up a whole bunch of project code according to some framework. If your framework requires a lot of code just to get things up and running, it probably isn’t designed very well. That’s excusable when the platform expects a certain configuration of files and directories, but usually this isn’t the case, or isn’t the case to the extent that the framework sets up for you.

Welcome to .NET.

Some code tools (I use this term to mean a language’s collection of libraries, frameworks, etc) are like stir fry: they give you a basic (or not-so-basic) set of ingredients and you can combine them however you like in order to get a certain nutritional value and flavor palette. That’s a good tool; you can make something that appeals almost no matter what mood you’re in. Some are like Subway sandwiches, where you get this framework and this library and this package and you stick them together and you get basically the same thing every time. That can be good if you want a Subway sandwich, although it’s kind of boring after a while.

But .NET is like tofu… in a world where there are no cookbooks on how to prepare tofu. Theoretically, you can make good stuff with it, but nobody knows how it’s made or how to prepare it properly. There’s no good documentation. The kitchen is probably a wreck by the time it’s done, and the end product is kind of an unpalatable mess.

If you look online for .NET tutorials, you’ll only find those written by dispassionate Microsoft technical writers. I had a whole class where the best book the teacher could find was so bad for learning from that we were all over the Internet trying to find better tutorials.

We didn’t get anything done in that class.

I like to know what all the code in my project is doing. If I’m using it, I want to be able to read and understand either the code, or some reasonably thorough documentation. .NET doesn’t let me do that. When you have the IDE create a project, it makes a project directory full of dozens of files and folders which do weird mystery things. I don’t like that.

That’s why I don’t like .NET.

Objective-C

Don’t know much about this apart from that it’s used for iPhone apps. It’s some kind of C flavor, obviously.

OCaml

I’m pretty sure this is still a thing, but I have no clue what it’s used for. Comments?

Perl

A useful language that’s still an old hacker favorite. Used for basically the same things Python is used for now. They’re not the same language by any means; they carry different philosophies about how programming should be done in their language–but the most obvious difference between the two is that Python looks like English and Perl’s syntax looks like a cat walked across your keyboard.

This isn’t so much of a slight on Perl as it seems, really. Even Perl advocates admit that a given line of Perl code would make an acceptable name for a volcano in Iceland. It’s actually a mark of how good the language is that they use it anyway.

PHP

It’s popular to rag on PHP and promote JavaScript right now, but there are some nice frameworks written in PHP and it’s a decent back-end web language. It’s mostly used for server-side web scripting, but you can use it as a client-side/general programming language too. It’s often used in conjunction with a SQL flavor, such as MySQL or SQLite, in order to work with databases.

PowerShell

Windows’s pale imitation of a command line shell, not nearly as powerful as bash or the other *nix shells. You can write batch files, which are kind of like shell scripts but kind of not.

Python

A high-level scripting language with plenty of libraries and frameworks for nearly anything you want to do with it. There are a few things you can’t do with it, particularly optimization and it has limited options for making mobile apps (Kivy is still under pretty heavy development I think, and is kinda slow). Python is certainly not the fastest language, but it’s better than Java because it’s easier and cleaner to read, and is a lot of fun to work with.

R

An open-source language used mostly for scientific and statistical programming. I’ve heard of people using it alongside Python.

Ruby

If you don’t use Python, you probably use Ruby. They’re pretty similar. I haven’t done much with Ruby, just played around with the Codecademy tutorial a few years back.

Ruby is supposed to be more Lisp-like than Python, but that’s just what I’ve heard.

A lot of people use Ruby for Ruby on Rails, its web framework, which is supposed to be really nice and has a sizable open source community. I haven’t worked with it myself.

Scala

I don’t know much about this one, apart from that it’s kind of in the Lisp family tree and Wikipedia says it’s got some object-oriented stuff involved too. Comments?

Scratch

A teaching language. Like programming with Legos. It’s nonthreatening and cute, a good way to get kids into coding. You don’t actually have to write code, you just drag and drop lines and modify them with drop down boxes or whatever.

Simula and Smalltalk

Not the same language. They’re both early object-oriented languages I don’t know much about, and I’m not sure if they’re still in use. However, for their influence on many of the current main players, they get a mention on the list.

SQL

The infamously boring database manipulation language. Super useful though. Usually used in conjunction with another language, often PHP.

Vala

I’ve seen this used, but only in one place: the source code for Gnome Tetravex. It looks kind of cool.

Visual Basic

Started off its days as completely toxic to programmers, then grew up a bit. It’s dying a slow and horrible death right now as a generically yucky Visual Studio and .NET language. Sadly, I’ve taken two or three classes on it because it was what was available at the time; I think it’s the reason I didn’t hit larval stage earlier. I found it really boring to program in. You can make .NET stuff or, like, Windows XP-looking programs with it. Also, with this language, you’re inextricably bound to Windows. Just… yuck.

Advertisements

The Problem Of Software Licensing

This wasn’t a request, just a personal debate of mine.

Meet the main contenders. On the one hand, we have the likes of DRM: making it difficult not only to pirate their software, but to use it legally after you’ve legitimately bought it.

On the other hand, we have Richard Stallman and the Four Essential Freedoms:

  • The freedom to run the program as you wish, for any purpose (freedom 0).
  • The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this.
  • The freedom to redistribute copies so you can help your neighbor (freedom 2).
  • The freedom to distribute copies of your modified versions to others (freedom 3). By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.

Paul Graham also has an essay that’s pretty sympathetic to Stallman, although it doesn’t explicitly agree with him on the points mentioned above. It simply takes a stand against DRM and restrictive copyright licensing.

I don’t fully agree with either of these. I agree with PG, and my views are closer to Stallman’s side, but I also think the freedoms Stallman considers essential would prevent people from being able to profit from writing software. As someone who plans to profit from writing software as a living, this puts me in a bit of a dilemma.

The main problem, as I see it, is that software “piracy”–the act of seeing a developer (or any digital creator, such as a music artist) selling their work for an amount of money, and choosing to deny them reimbursement for their work and for making your life easier by downloading it elsewhere even if you could have paid for it fairly–is not taboo.

I can sympathize with so-called piracy (which, I agree with Stallman, is a pretty strong word for something that isn’t always bad) in the case where one actually doesn’t have the money. I don’t care if high school students want to grab something I made from a torrent site or whatever instead of… not paying for it and not benefiting from it, which is their other option. I want to help people with my software. I also sympathize when the software is patently overpriced. (Photoshop, I’m looking at you. You’re worth, like, fifty bucks… not two hundred.)

So, what constitutes “bad” piracy? Is “good” piracy even piracy? It’s clear the issue isn’t black-and-white. To me, the license applied to software needs to consider critically precisely which behaviors are to be prohibited, and which ones allowed.

I ran a quick Google search and found a post on debate.com entitled “Is internet piracy a bad thing?” There’s some intelligent discussion going on about the benefits and costs of piracy in general.

Here’s one against piracy:

Internet piracy is theft.

Internet piracy is not as bad as stealing something physical, such as a CD or DVD, as no one lost money from the physical creation of the item, but, it is still theft, and still bad. While it may not be physical, the parallels are unquestionable. In both situations you are getting something for free that has cost others lots of time, money and effort to build. Films especially cost huge amounts to make, often hundreds of millions of dollars, in exactly the same way to how it costs someone to create a handbag or a car. If internet piracy was not an option, you would either not watch said film, or buy it, giving the creators money and consequently payment for their efforts. However, as internet piracy is an option, there is no motivation for people to pay. If everyone pirated this would mean that all films would result in major losses, and film/computer programme/music would all become charitable things relying on donations to be made. Instead, the current situation is some people pirate, and others pay the proper price, giving the creators the money they deserve. But that itself is unfair, as why should some have to pay while others do not? No matter how people twist it to justify what they are doing, despite the fact internet piracy is not stealing something physical, it is still theft, you are not stealing from a shop owner or item-owning citizen, but you are stealing from the creators of whatever you pirate.

Here’s one that says piracy is sometimes okay:

It isn’t [a bad thing], within limits.

Lets say a movie isn’t available in your country. Maybe it will be- in a few months or so (in a cut and extra-less version), but your friends from overseas are already touting how good it is. Perhaps there’s a game that’s two times more costly in your region than anywhere else in the world. It could be that you’ve been screwed over by DRM and locked out of your *legally purchased* software (very, very frustrating, and it really bothers me when a pirated product is *better* and *easier to use* than the legal one, because it doesn’t have the damned DRM) It might be you have your wallet ready, but the software is prohibitively expensive. Say you’d love to pay to watch those episodes of Game of Thrones, but you really don’t want a full HBO subscription. There are instances in which piracy is justified- it can be a means of protecting consumers from bad industry practices, like overpricing, awful DRM (screws over only paying consumers!) or idiotic distribution practices.
Of course, piracy is terrible if it means profiting from someone’s work, plagiarism, or not paying for something you could have reasonably easily obtained legally.

I agree with both, as you might have gathered. I didn’t write either, however.

I’d like to call attention to the last line of that second one:

“Of course, piracy is terrible if it means profiting from someone’s work, plagiarism, or not paying for something you could have reasonably easily obtained legally.”

This lists three things (really, two behaviors) that are to be prohibited:

1. Plagiarism, which we can probably all agree is awful;

2. Benefiting from someone else’s work without giving them the payment they’ve asked for, if you could have reasonably obtained it legally.

This is my view in a nutshell. I think it’s a lot of people’s views in a nutshell. Now, the question is how to keep those behaviors from happening, because I think the current measures are far too restrictive. There must be a better way to do this.

To prevent both of those things, most software companies only distribute binary files. They don’t distribute source code, because a) their competitors could see how their software worked and copy it, and b) it would be easy to illicitly redistribute their programs by just releasing the source code to the Internet. Many software providers also prevent redistribution of their binaries by trying to locate and eradicate sites which distribute them illegally.

Windows, notably, does not do the latter. Not because Microsoft is somehow more noble… they’ve just found a way around the latter concern. Windows copies only work if you have a product key. I think this is a hint as to how we could get things to work.

Another hint is Mac OS X. Part of the code is open, and the other part is closed-source. I consider this fairly acceptable, although it definitely isn’t a perfect solution.

A third hint is actually Chrome OS. Most of that OS’s software is cloud-based. You need server support to run it.

These three hints, working together, can fight at least the second behavior.

If your software is cloud-based, you can open up most of your code. This is because if your software is cloud-based, you can make your users pay for an account to log in to the server, or a product key.

The first option (access through accounts) is basically how Google Play works! (At least on mobile phones.) And as we’ve found, that works pretty well. 🙂 I, at least, haven’t heard much about pirating apps. I’m sure it happens, but not much. I wouldn’t expect it to pick up just because the source became available, either, unless the price of the software exceeded the price of publishing an app to Google Play (about $20, I think) and supporting it. And if it’s cheaper to reproduce and maintain on your own (something crackers are highly unlikely to do, let alone do well), that probably means the original was far overpriced.

The second option (which you have to take if you aren’t providing server support–i.e., if it’s a piece of desktop software) requires making part of your code closed-source. Namely, the part that requires your users to need a product key. The problem here is that if you distribute that binary in the middle of untainted source, piracy-minded folks will just strip it out of your package and use the rest of your source code. So maybe you have to hide your main method or close off one feature that it’s inconvenient not to have, thus making it inconvenient to pirate your software.

(A nasty/fun hack one could try as an alternative to this would be to program the product-key-requirement code in Whitespace or something. Crackers, on the whole, wouldn’t be smart enough to catch on.)

[Edit: A note on product keys. I object to product keys and licensing that say you can only run the program on one machine. I think the legal qualifier should be that you’re licensing the program to one person, not one computer, and deal with licensing for institutions like schools and businesses separately (this, I think, is how the current model came about). Licensing to a person is pretty painless on both sides. Having a user sign into an account which includes their billing data in order to access their program seems pretty effective; at most you get them sharing with close friends and family, which helps (marketing) more than it hurts.]

I think a lot of big corporations would object to this idea, though. They’d be worried about their competitors accessing their code and copying it. Indeed, I’d start off being nervous about putting tinypapers out there like that, at least right now.

The trick is that you have to have a brand and a following first. You have to be recognizable. Furthermore, your users have to like and be loyal to you. If someone else stole Photoshop’s code, even if they had no patents, people would probably recognize that it was stolen Photoshop code. However, a lot of hackers would go, “Hey, awesome, we don’t have to support Adobe.” Adobe has had a history of producing crummy, overpriced software–Flash and Dreamweaver certainly come to mind. Photoshop isn’t crummy, but it is overpriced.

Whereas if I were to establish a brand with tinypapers–make it well-known and recognizable–I’d be more likely to have a good relationship with my users. I can afford to listen to what they’re saying they want. I can afford to give them spectacular customer service. I can afford to start fixing a bug the hour they report it–perhaps even while they’re on the phone with me. I also don’t have a history of ripping them off, and don’t plan to sell my app for more than a dollar or two–more probably, though, I’d distribute a free version first with one line of simple text ads per page–and charge more for server space if/when that becomes a thing.

At that point in my business, assuming (hoping!) I get there, anyone trying to copy me would most likely be ignored, because my users by then would like me too much. The competitor also have to learn to use the tools I’m using, which not many people know how to do, so I have a head start. Because I’m young and not tied to a programming language, I don’t hesitate to learn a new framework like Kivy, even though it’s a steep learning curve.

There would be a trade-off to opening up my code: many companies would not want to buy tinypapers. But I think those would probably be miserable companies to work for, so maybe that’s a good thing. It also might make it harder to get investors. But if those investors care more that my code is open than whether users like my product, they’re probably dumb investors.

It’s tempting to open up my code on GitHub now. I really like the open-source development methodology, the community surrounding GitHub, and the version control software itself. It’s tempting to think that my repo wouldn’t be seen by much of an audience at first anyway. But I think, for prudence’s sake, I’ll hold off for now. It’s kind of a dumb idea to let potential competitors know that much about a larval startup.

I’d really like to hear your opinions on this, readers. Honestly, I’d especially like Paul Graham’s opinion, because he’s seen so much of the landscape I’m talking about and has good powers of analysis (and I’d like to see a more recent essay of his about it). I’ll try emailing him, but he’s probably really busy. Nevertheless, my habit of bugging people I admire hasn’t done me any disfavors yet. 😉

ESR, if you happen to be reading this, I’d really appreciate your comments too. You’ve probably heard a lot of discussion on this topic, and generated quite a bit of it yourself.

Edit: Other Thoughts

It was observed by ESR in “Cathedral and the Bazaar” that repositories which encourage others’ contributions to their code have fewer forked projects running from them; changes got incorporated into the main branch rather than spinning off into their own projects.

It occurs to me, then, that if a startup were to open up their code, there is a way to prevent certain competitors–the ones who are at least partially driven by wanting to make better software. A hacker may look at a commercial application, think, “I can do better than this,” and write his own, thus becoming a competitor. But if the application’s source is open, and the people running the business behind it aren’t territorial about their code, he can apply as a sort of temporary consultant for whatever feature he wanted to program in. Basically, he could program in the feature, and offer it to the company with an estimate of what he thinks it’s worth (maybe $50-$2000 if it’s somewhere from a little bug fix to a neat but not huge addition, or he could ask for stock if it’s particularly large). Then the company could accept or reject it, or negotiate price if necessary. Since they (hopefully) know their users better than J. Random Hacker does, their decision would probably be respected.

This would also solve the hiring problem many startups face! Anyone who provided a few good fixes or features like this would be a very promising candidate. And of course it would make the company’s software better, which is always excellent.

Big companies buy startups for their software (the basis of their market) and their people. Why can’t startups buy code chunks and job candidates?

Workspaces

Here’s an excerpt from a Paul Graham essay entitled “Great Hackers“:

If companies want hackers to be productive, they should look at what they do at home. At home, hackers can arrange things themselves so they can get the most done. And when they work at home, hackers don’t work in noisy, open spaces; they work in rooms with doors. They work in cosy, neighborhoody places with people around and somewhere to walk when they need to mull something over, instead of in glass boxes set in acres of parking lots. They have a sofa they can take a nap on when they feel tired, instead of sitting in a coma at their desk, pretending to work. There’s no crew of people with vacuum cleaners that roars through every evening during the prime hacking hours. There are no meetings or, God forbid, corporate retreats or team-building exercises. And when you look at what they’re doing on that computer, you’ll find it reinforces what I said earlier about tools. They may have to use Java and Windows at work, but at home, where they can choose for themselves, you’re more likely to find them using Perl and Linux.

(This was before Python went mainstream, by the way. This essay’s from 2004 and Python’s really young–it was still obscure at the time. Python seems to be replacing Perl, probably because it’s a good first language, and the syntax looks “friendly,” and so many young hackers will have lots of experience with it. Perl looks intimidating but does a lot of the same things; I don’t know enough about it to say if it does them better.)

This passage kind of made me wonder precisely what different hackers’ workspaces look like, though. Obviously they’ll all strive to be fortresses of concentration, quiet with minimal interruption. But hackers are a blatantly nonconformist culture; individuality is prized to the point that imagining there could be a standard for “hacker workspace” is laughable.

For the purposes of this discussion I’ll extend the category of people being discussed to anyone who programs in their spare time, as those who wouldn’t normally be included in the description “hackers” really only face the barrier of time before they qualify (well, to a certain extent; there are exceptions). I’ll also include other “maker” cultures that work at a desk. To me, artists and writers are the ones who come to mind, although there are undoubtedly more that you can think of.

It made me think about my own workspace, and how much it said about me. Which turns out to be… a lot.

First, that I am a very visual person. The wrong kind of clutter bugs me. Yet, I’m willing to give up the back half of my desk space in order to surround myself with a dozen plants and a 10-gallon fish tank. This is because it isn’t clutter to me.

workspace3

Some people couldn’t bear having so much stuff in their line of vision. For me, it’s essential.

 

When I need to stop and think about something, I pause and stare for a few minutes at my fish, or I water my plants. Being surrounded by this cozy, natural background helps me work. On anything–not just code.

Conspicuously missing from my desk and the surrounding area is any sort of calendar. When my mental organization isn’t enough, I make my to-do lists mostly on the computer. I rarely forget things I need to do unless my workload is really heavy, and then I just write it down in Word or LibreOffice.

I did, in early May, make a paper list of the things I wanted to get done this summer and space to scribble down stuff about them, and put them below my desk’s clear plastic cover. It’s visible under the teapot; look how much I haven’t used it. At all. It wasn’t obtrusive enough to visually nag me (if it were, I’d have thrown it away), so I forgot about it.

I like very much to be organized. Disorder kind of makes me nuts, actually. Not the sort of disorder that you get when you don’t make your bed (I don’t care about that), but the sort you get when your mental systems, or any extension thereof, aren’t easily usable and accessible. It actually puts me in a bad mood until I can sort things out. Any system I use to do a task I’d normally reserve for my brain has to be just as organized as my brain is, or it’s like my brain is what’s disorganized. This is why I always know where things are on my bookshelves, why I clean out my computer’s files on a regular basis, and why I’m picky about how my code looks. If I have notes on a novel I’m writing, they need to be organized too. Props to the writing program Scrivener for satisfying this need–I love Scrivener.

The easiest system to keep organized is my brain itself, and I happen to have a lot of mental space for the things most people would put on a calendar or a to-do list. I think this comes from spending… about five, six years? regularly working on long fantasy and steampunk novels with Byzantine plots. I never relied much on outlines or notes, unless it was fiddly technical stuff like how many miles per hour someone’s clockwork cart was supposed to go or why something that seems unlikely happened. Funnily enough, that’s the sort of thing you put into code as comments. And, because I spent so much time learning to hold so much plot in my head, I don’t think it’ll be much of an issue when I need to hold the entirety of a long program either. Now that I think about it, it seems that writing novels taught me more code skills than I realized.

I also always have music playing. Always. I can barely work without it; I can’t have the emptiness of a sound-space any more than I can stand the emptiness of a bare desk. But it has to be the right kind of music, just like I can’t have the wrong kind of visual clutter. Right now, a YouTube playlist of about 100 nightcore songs is my poison. (Nightcore is mostly just pop and/or rock music at 1.5x speed, unless the person who remixed it actually knows what they’re doing.)

Pop music is easy to tune out, and the speed increase makes it easier to tell lyrics apart from when someone’s actually talking to me. Some nightcore is more techno or dubstep-ish, and that’s really appealing too. But it’s important that it has a solid beat, and that I can mostly tune out what I’m hearing. I speculate that the reason pop music is easy to tune out is because the people who make it realize that if folks listened to their lyrics, they would seriously question their own taste. Whatever. It works; listening to music that I can mostly tune out means I don’t hear all the other little sounds that might disrupt my thinking.

Why do hackers, artists, writers… etc, like cozy, quasi-cluttered spaces, and managers like a rather bare area specifically dedicated to business? (Which is evidenced by the fact that that’s what workspaces in companies across America look like. I don’t need to dispute the latter point; they’re the ones who chose to make their places look that way.) I’m sure they consider our desks ridiculously frilly and cluttered.

Perhaps it’s because for hackers (and for novelists too), it’s that they don’t have bad associations with work, so they don’t have bad associations with the place they work–they don’t feel the need to compartmentalize, to differentiate between their “work space” and where they have fun, because their work is fun to them. Perhaps it’s because they like work and spend more time doing it than managerial types might, so their space has to be comfortable for longer periods of time. Perhaps it’s the hackish tendency not to place value on “seeming professional.” Or perhaps it’s another side effect of how those drawn to maker professions like programming and writing just inherently think differently than people drawn to manager-like professions.

What your chosen workspace (not one that was designed by someone else) says about you is worth thinking about, because it might say something you hadn’t realized before.

Go ahead, describe or post pictures in the comments. I’ll wait 🙂