New toy?


I read about this language on Medium, and I’ll let you go read that instead of writing about it here. Basically, it’s trying to be Java cleaned up, with all the libraries and support and the JVM intact. I have no clue how well that’s working.

In addition to the features listed in that article, semicolons are optional in Kotlin–and it’s kind of funny-sad how keen the web site is to point this feature out.

Data Structures: a rant

(If you’re curious, the textbook from this class–and the source of the explanatory links I’m using in this post–is available online free here:

– – –

I just got out of another Data Structures class. I zoned out halfway through, which is somewhat unusual for me. Happens more often in Data Structures, because the class starts at 8AM. (Fortunately, I think I found a less winding route to cut down on my time walking to class–hopefully the shortcut will make me less prone to lateness. I am not a morning person. I tend to dream about waking up and going to class. I’ve even slept through the 10AM labs, which is ridiculous and frustrating–but also kind of understandable, because they’re on the day after the 8AM class, and my brain is trying to get rid of its sleep debt.)

But that’s not really why I started tuning out the professor’s lecture today. It was the result of another impractical implementation on the projector, at which point a thought struck me:

If these data structures are so useful, why aren’t they part of the language already?

Python (which is what we’re using, 3.5 at that) is not a dinosaur, and most of the math for these data structures was done like fifty years ago. I’d understand if the point was to get C to be more efficient, but most people don’t even code in C any more. It’s not the right tool for very many of the jobs we have to do.

In fact, this class seems closer to a language design course than something practical to software development. I know that’s the point of the high-flown “computer science” department, but… come on. Even interviewers are getting the idea that this kind of question doesn’t matter that much in the real world. It seems more to me like something to be learned on the fly, when needed. Which in practice would probably just mean memorizing Cracking the Coding Interview because you need a job.

Why does this theory class have to be so… theoretical?

I wish the teacher would spend some time telling us when to use these structures, rather than just what they are and how they’re implemented. Otherwise I think this course may do more harm than good.

Why in the world would you ever use a singly-linked list? Most languages–and especially the ones most commonly in use–have array or list structures of their own, which are 1) optimized for you, 2) don’t require extra code, 3) have been tested far more thoroughly than your code ever will be and are thus more stable and predictable, and 4) don’t confuse the hell out of other people who come in and read your program!

Why in the world would you bother implementing a doubly-linked list either, unless you’re coding a programming language of your own?! None of this makes sense! We have a dedicated class for language design! We have a dedicated class for C programming! Why isn’t it in there instead?!

Ahem. *deep breath*

Hash tables are kind of cool, and so are binary heaps (although they’re less practical). My affection for their clever hackitude is rather stifled by the suspicion that, again, they’d probably be built-in structures if they were that useful. Like Python dicts–those are hash tables behind the scenes. Use those. Everyone knows what they are and you don’t have to code them yourself.

If you’re working with large amounts of data, hash tables and binary heaps could be useful. But the professor doesn’t talk about when, just how to use them. If you’re not working with big data, chances are you just need a dict or list, and can spare yourself and others the experience of trying to interpret your weird code later.

But the professor doesn’t talk about that kind of thing. I wonder if he’s getting homework assignments that use this stuff unnecessarily. He hasn’t been taking points off mine because my work still does what the spec asks for, as clearly/briefly/user-friendly-ly as possible. I haven’t been looking for ways one might use weird data structures in the assignments, so I don’t know if they’re designed to invite us to use them or what.

He also covered recursion, which I think is very useful–again, if you know when to use it, which depends both on the problem you’re solving and the language you’re using. I will casually use recursion to make my code cleaner-looking even if it isn’t always the most efficient option (in Python). But that’s for readability. Mostly I use it when I’m getting user input, and I stick the prompt in its own method and loop if I get bad input. That lets me put all the lengthy, messy error-checking off somewhere and the main program will get back a good value.

I think this practice is supposed to be kind of evil according to functional programming, because user input functions aren’t pure functions? Or maybe, because I’ve sectioned them off and make sure they return good values, they’re exactly what you’re supposed to do in functional programming. Don’t know yet. It works, anyway.

I still use “else:” almost exclusively for “Can’t Happen” errors. It saves me headaches when I screw up the recursion. That’s a minor change with using recursion, but it’s an issue only while writing; I’ll put in extra effort when I’m writing the program to make sure it’s easier to read later.

What I will not do is write code whose purpose is to make me look or feel clever for writing it a certain way. That’s insane. Sacrificing readability, even efficiency because you think it’s cooler to use some homebrew data structure code rather than a freaking built-in Python list? That’s absolutely insane.

When interviewers select for people who know how to do this, I wonder if they realize they may be selecting for a subset which includes the actual worst candidates: the smug “Of course I know everything, if you lesser mortals don’t, that’s your problem, Google it, and also I have very strong opinions about i++ vs. ++i and will totally correct you if you’re wrong.” Fools and incompetents may eventually learn. This person doesn’t think they have to.

(Of course, sometimes a person like that is useful to look impressive in customer meetings, but in my admittedly limited experience, they’re just as likely to insult your customers as to impress them. Ever seen a bunch of startups pitch? Some of those folks need an attitude adjustment. Of course, they’re going to fail; it’s hard to have enough empathy with customers to produce a good product if you have such scorn and disdain for their intelligence. Then they’ll claim they went under because they “failed to pivot.”)

Oh, one more thing. Big-O notation is pretty useful. Even if your main use for it is understanding what other people are talking about, and/or making yourself look impressive. It’s so you can find out which of two algorithms is more efficient, which will probably be something you’ll need to do eventually. It looks way more complicated than it is.

I could very well be wrong about this, and I’d be pleased to find out if I were. I’d love to find something that’d make me a better programmer. I’d be terribly pleased to find out I wasn’t learning something nearly useless. But I don’t think that’s the case.

The CS math course I have (enigmatically titled “Discrete Structures”… I have yet to find out why, unless the reason is “because it sounds fancy”) seems a little more practical at least. Logical thinking comes pretty naturally to me, but I know it doesn’t to everyone, so it makes sense to cover it. I know there’s also set theory, graph theory, and combinatorics later on in the course, and I’ve heard those are good things to know for programming. I guess I’ll find out.

Oddly enough, it’s my English course that’s the most practical. The professor decided to forego the traditional giant clunky writing textbook and told us to order this list of like eight different short story collections, which we read and then write and talk about. That takes up about half our class periods. The other half (each day is dedicated to one or the other) is the professor talking about writing: elements of stories in general that are important (like what the stakes are–is war at risk, for instance?), writing style (like sentence structure, word choice, voice, POV), what it means to have universal appeal, what it means to capture an audience and how to get their attention–and especially the skills of critical thinking and backing up your claims.

This format is a little odd for a class called “College Writing and Research”–but it isn’t bad. I think it’s more effective than the normal route. No writer I know learned writing out of a big clunky textbook, or by doing essays on symbolism in Dickens or whether school uniforms are a good idea.

Since CS folks often point and laugh at the liberal arts, saying their study is useless bull and all those English majors should be studying something useful and practical (like computer science of course), well… I have an uncomfortable piece of news.

Not that I’m saying majoring in English is more likely to get you a job (although it’s better off than, say, Gender Studies). But knowing how to write effectively, which my English class will teach you, is far more practical than knowing how to invert a binary tree.

Sorry, prof.

Please read the comments.

There’s a new site I’m excited about

Hashnode – An open, friendly and conversational community for software developers

Remember when Atwood and Spolsky were developing StackOverflow, and their informal pitch was, “We’re like Experts Exchange, but without the evil”?

Hashnode is like StackOverflow, but without the evil.

Don’t get me wrong–SO is still a powerful resource, especially if you’re after something fairly simple and the question has already been asked. But the community is so huge that the moderators–who are supposed to be a result of Atwood’s valiant attempt at designing a system for the community to govern itself–have become Julius Caesar… and the system kind of needs a Brutus. If you know what I mean.

Basically, what I’m saying is: SO is a great resource, but not a great community any more.

Anyway, Hashnode looks to be more casual. It’s still a smallish community, or at least it feels small, and it looks like there isn’t so much policing.

I think SO’s problems are mostly just a result of its bigness, and also the fact that employers want to see a StackOverflow account on a dev’s resume, with as many points as possible. A tool meant for collaboration has become the subject of competition.

The solution to the bigness is the breakup of SO’s monopoly. I think there are several other sites cropping up to take its place, or at least take the load off; if you look in the comments on that article (which is where I found Hashnode), there appear to be a few different options that hopefully aren’t so dictatorial.

I suggest you join one, if you don’t belong to a forum or something already. Dream In Code is okay, if I remember right, but there was something about it that made me not stick around. Don’t remember what it was. Probably my own inexperience and inability to contribute; it was a while ago.

I don’t think Hashnode has that problem. They’re making a point of trying to welcome beginners. Anyway, you might want to check it out.

Happy hacking!

Programmers and writing

Okay, so I started this post a while ago, not entirely sure what I was writing about. I wanted to write about how I’d suddenly realized I’d gotten to the point where I could tell the differences in personality between programmer bloggers, and how some of them posture more than others in order to look logical and educated and authoritative, and how this didn’t actually seem to correlate with whether I agreed with them. I wanted to talk about how readers of programmer writing expect posturing so much that it takes a real effort to sound friendly and welcoming instead, without the help of body language, but that this allows one’s writing to become more convincing, more motivational, and more enjoyable to read.

Then I thought, why am I writing this? If it’s about not writing like a snob, I’m preaching to the choir. You guys don’t do that. My own post sounded like an ironically self-indulgent rant about why how I write is better, or something. (It’s true that I put a lot of energy into not seeming arrogant. I hope it works.) Or, worse, it might sound as though I were accusing you of needing correction in this area. Neither was something I was aiming for.

Rather, I wanted to warn you about these behaviors, because of the effect they’d have on you as you read about your craft. But I didn’t pin this motive down until I read the intro to an online book LucasFF linked to me, and found this couple of paragraphs:

If you look for help you may find people are not patient with you. You may find that, rather than help, they take the time to express how much they know about the subject. Experienced programmers might tell you that you are wrong. The subtext to their tone might be that you should stop now, rather than inflict your bad code on the world.

After a couple of engagements like this you may decide that you are not a programmer, or don’t really like programming, or that you just don’t get it. You may have thought that you once enjoyed the idea of building your own programming language, but now you have realised that it is too abstract and you don’t care any more. You are now concerned with your other passions, and any insight that may have been playful, joyful or interesting will now have become an obstacle.

For this I can only apologise. Programmers can be hostile, macho, arrogant, insecure, and aggressive. There is no excuse for this behaviour. Know that I am on your side. No one gets it at first. Everyone struggles and doubts their abilities. Please don’t give up or let the joy be sucked out of the creative experience. Be proud of what you create no matter what it is. People like me don’t want you to stop programming. We want to hear your voice, and what you have to say.

Realizing why this post had come about, I decided it was worth writing after all.

A friend of mine emailed me a few months back. He was replying to my request for collaboration on an idea I was toying with. The response came late, because he’d been dreading disappointing me with the news that he’d stopped programming. He’d had it with the infighting.

This is something you need to protect yourselves against. Creativity and motivation are fragile creatures and must be guarded.

Three types of writing

Some programmer writing is just kind of awful to read. It goes off on rants. It boasts about the writer’s knowledge and accomplishments. It insults the reader, or the writer’s coworkers or friends. It’s unprofessional, sexual, or discriminatory. Or it’s any of a dozen other things I haven’t listed.

Sometimes that writing has a valid point to get across, and sometimes it doesn’t.

My thesis here is that if you’re not sure of yourself, it’s not worth reading anyway. There’s a wealth of tech writing that doesn’t do these things.

But I’m getting ahead of myself.

Quora demonstrates this divide a lot. Questions get a lot of variety in their answers. About once a day (that I see when I’m on), someone posts this question:

“Hey so I have this HUGE GREAT IDEA and it’s worth $10B but I don’t know how to code it. Can I get a developer and pay him 20% equity to build my great idea? Should I make him sign an NDA so he doesn’t steal it?”

and the answers are, on the whole, predictably snarky. It’s funny to read the first few times you see the question, and then it gets boring. But there’s usually a range of variation, from

“People like you are the reason I never tell anyone I’m a developer. We’re sick of being badgered with people’s ‘billion-dollar’ ideas that usually don’t even make sense or have a market.”


“Dude. Execution is everything, the idea is nothing–nobody would buy your idea for $20. Go out and learn to code, or figure out something else you can bring to the table to actually earn your ridiculous 80% share. [then optionally actually answers the question]”


“[actually answers question]

“But you’re unlikely to be able to do that, I’m afraid. Most developers have lots of ideas of their own, and they’re more likely to invest their time in their own idea than yours, especially since they’d get all the reward for building their own idea, not just a fifth of it. It’s hard, time-consuming work to build things. If you really believe in your idea, you could start building it on your own by learning to code, and then see if you can get others on board once you’ve made a prototype.”

#3s usually get comments back from the OP, because even though they’re basically saying the same thing as #2, they do the OP the courtesy of actually answering the question first (the order is more important than it seems) and then giving them the benefit of the doubt that they’ve asked out of honest ignorance rather than from a place of superiority and disdain for working devs. In other words, they treat the OP like an adult, even if he’s a 14-year-old boy on a cheap netbook somewhere.

In turn, OP usually listens to them. #1 seems really hostile–an outright declaration of animosity merely for the fact that OP dared to ask such a question (which is never a good approach; if the OP was really so despicable the best thing to do would be to deprive them of an audience)–and #2 is condescending and unapproachable, if somewhat more on topic. #3 is reasonable, diplomatic, and friendly. They’re offering the help OP came for, even if the message they have to deliver is bittersweet.

Be aware of what you’re reading

Joel Spolsky of the blog Joel on Software, as much as I like his posts for other reasons, has a lot of #2 posts on his blog. “If you don’t know this, you’re incompetent!” is a common theme, and to me there are two outcomes to reading that sort of thing: either you know the thing he’s talking about, and you feel smugly superior or think “at least I’m not incompetent at this thing”, or you don’t know it and you think, “oh, great, another thing I don’t understand, I’m farther behind than I thought.” If the latter, maybe you’ll think about learning whatever it is, but now you’re feeling bad about your skills and that doesn’t help anyone.

On the other hand, Jeff Atwood of Coding Horror seems way more approachable, because he’s willing to admit upfront he may not be competent at everything, including the thing he’s talking about. He gets pretty upset when he hears about people who actually can’t write code at all pretending they’re programmers, but I’ve never seen him go off on a wild rant because they didn’t know the difference between UTF-8, ASCII, and Unicode. (For the record, I read both posts all the way through.)

I’m not saying JS’s post on character encoding wasn’t worth reading. I’m saying it was a #2 post, not a #3. It has useful information, but instead of introducing you to it in a friendly way, it kind of beats you over the head with it.

In this article I’ll fill you in on exactly what every working programmer should know. All that stuff about “plain text = ascii = characters are 8 bits” is not only wrong, it’s hopelessly wrong, and if you’re still programming that way, you’re not much better than a medical doctor who doesn’t believe in germs. Please do not write another line of code until you finish reading this article.

It was worth reading, to me, but if his aim was actually to educate people on how to use character sets in code, this was a really roundabout way of doing it and there are several things that are ishy about the post.

  1. I’m not going to infect someone with Ebola if my web site shows up with weird question mark characters. So far, nothing I’ve written has been a matter of life or death depending on if it works in Turkey. This holds for probably most programmers. Ergo, the comparison to a doctor who doesn’t believe in germs is straight-up overdramatic yelling at people who happen to not know this thing you know.
  2. Most of the post is a lecture on the history of character sets and how they work, which, while somewhat interesting, actually doesn’t have much to do with solving the problem JS is complaining about.
  3. His actual message, if his intent was really to stop broken international code, could have been condensed to: “PSA–make sure you declare your character sets, folks! Using UTF-8 will make international users’ lives easier.” This would fit in a Twitter post.

I know I’m kind of picking on Joel, here, but he’s not actually a bad guy. He’s written some really cool software and I think his writing is interesting. This post I’m quoting was written in 2003, and I imagine he’s changed a lot since then. Really I just want to dissect his old writing as an example.

What if you were a new programmer, stumbling upon this post? You’d be really discouraged.

Character sets? What’s a character set and why is it so important? But this guy sounds really impressive and he knows all this history… how am I supposed to know everything I need if there’s really important stuff like this and I’ve never even heard of it? Maybe this is too difficult.

Yeah. No. That’s not a good situation.

Add in the fact that this person, if they have an online presence and are asking for help, is probably hearing from ten different people:

Wait, you’re learning PHP? Why would you put time into learning such a horrible, broken system?

Your design is all off and your conventions are sloppy. Can’t you even indent properly?

You’re going to be horribly ineffective unless you learn how to work with APIs.

Burn that book, you won’t really learn anything effectively in 24 hours like it promises.

You’re not a REAL programmer unless you’ve made something someone will pay you for.

Java is for sissies, here, learn C instead.

That framework does too much for you–you’ll never learn unless you build from scratch!

Why are you still using Notepad++? Let me introduce you to…

Learning Visual Basic first will ruin you as a programmer.

Wait, you don’t know anything about pointers? Seriously? Oh, you’re self-taught, I get it…

…and you’ve got one ex-newbie programmer.

Don’t let that be you–on either end, but particularly not the newbie end. This kind of talk, even if the writers think they mean well, is nothing more than posturing and bullying. It may not be all #1. Some of it may be #2. But unless it’s #3, it’s not something a beginner needs to hear. Even #3 writing is colored by an individual’s specialties and preferences.

Be aware of what you’re reading.

Some writers just posture a lot, without any mind to whether it’s actually justifiable. When you don’t know much about your field, #1 (ranting with no point, or a bad point) and #2 (ranting with a point) are hard to tell apart. Heck, #3 writing can be wildly off target too–but it’s less likely to be if the writer doesn’t need to resort to grandeur to get their point across, and furthermore, #3 writing doesn’t make you feel bad about yourself. Yes, that’s important. You might be thinking this this approach is some crazy feel-good thing where you only read stuff you like, whether it’s true or not.

But how important is it, to a beginning programmer, to have everything right? It’s far easier to realize, “Oh. So that polite guy actually didn’t know quite what he was talking about and it’s really more like this,” than it is to get over the kind of verbal abuse listed above. Your priorities should actually be geared toward protecting your motivation, rather than always getting accurate info. I mean, unless you’re programming kidney dialysis machines first thing, it’s better to be a wrong newbie than a newbie so discouraged that you stop.

Be careful, fellow larvals. Guard your motivation, and be cautious about what you read.

“Gueth” what I’m learning

I got a new book in the mail yesterday. I told my mom,

“I’m waiting for an Amazon delivery today. I ordered a programming book. But it doesn’t look like a programming book.”

That was all I said about it. I don’t know what went through her head when she opened up the package and saw this:


Probably it was something along the lines of, “Yeah, that looks like something Rebekah would buy.”

I haven’t gotten very far in it yet. So far, the writing has been playful, well-organized, and assumes that someone attempting to learn a Lisp dialect probably knows basic programming stuff, and things unrelated to programming that you don’t notice you’re picking up, like how to install dev tools.

The author is an Emacs fan (makes sense if he likes Lisp), which probably means I won’t have to deal with vim. Both editors have a steep learning curve and an impenetrable host of shortcuts and stuff that you really have to put effort into learning in order to make use of them–but vim is unusable if you don’t know all those tricks. If you don’t know Emacs’s tricks, it just turns into gedit with a bunch of weird add-ons (including, if I remember right, a Tetris game, one of those chat-bot therapists, and ADVENTURE). I don’t mind Emacs really, but I hate vim.

Does that mean I’m destined to be Team Emacs once I’ve actually used it for dev? Eh. We’ll see. I’ve always been a Notepad++/gedit/nano girl. I like simple, fast, with code coloring, and a lack of clunky autocomplete features. I don’t like IDEs or editors that try to do too much stuff for you (this seems to be the definition of an IDE). Maybe I’m nursing my *nix influences here, but I prefer a command line and a simple editor–and whatever languages or frameworks work well with this lightweight arrangement–to the bigger, more heavyweight stuff. Code is difficult enough without having a steep learning curve on the stuff you rely on to write it, and I’m impatient, remember?

I am trying out Sublime Text though, because I’ve only ever heard good things about it–and I have to say, it makes the best first impression ever. It does have autocomplete features, but they don’t seem to be slow or obtrusive, and there’s probably an off switch for them. Besides, the rest of the program is beautiful. It starts up and shuts down instantly. gedit takes a few seconds to pop up, while the icon in my Dock bounces. Sublime bounces once and then stops, and it’s up. When you quit, it just goes poof. And the code coloring is really pretty–the designers took time to make sure the colors looked nice together.

I care about that kind of thing. I know some people are like, “whatever, colors, style, just make it functional”–and that’s my first priority, sure, but I stare at code a lot. I have a thing about aesthetics. I don’t like interfaces that don’t flow well; I really don’t like code that’s indented wrong; and I like my tools to be beautiful.

Even my terminal has custom settings to make it look how I want. I use cyan-on-navy, slightly transparent background, 128×32. It’s comfortably readable at any hour, it’s attractive, and I think the slightly larger window size setting is a little easier to read (even if you don’t like 128 columns, consider altering for 32 rows.

Anyway, enough about text editors. Let’s talk about Lisp, and Clojure, and my shiny new book.

I have no clue where I found this book, but I’m glad I bought it. Clojure is an interesting Lisp. It runs on the JVM, actually, which I found surprising but intriguing. “Hello World” takes like ten seconds to run, but Java is on everything, and even our cell phones are quad-core by now, so for most purposes, it’s “who cares about speed” again.


I know that one of my two favorite prospective colleges (both of which sent me acceptance letters over the weekend, by the way) teaches Racket. But I figure functional programming languages can’t be that different from each other–it’d probably be like switching from Python to Ruby or something.

If not, oh well. I do better in classes if I don’t know too much about the subject beforehand, anyway. I get kind of impatient spending time on proving I know stuff I’ve already shot past. (I’m okay with doing stuff I know how to do in order to make something, of course. Even if it’s not fun. Boring and tedious are fine; it’s pointless I don’t like.)

I’ll update later when I have more to share on this. I can’t say firm book recommendation yet, but I like it so far.

UPDATE: It looks like you can decide for yourself. The text is available online!

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.


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.


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.


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.


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.


Unfortunately, this is still around.


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


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.


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


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.


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, 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.


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.


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.


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


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


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.


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.


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.


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.


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


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.


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?


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.


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


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.