rc3.org Rafe Colburn on software development (and other topics)

Here’s what happened to the Nortel patent portfolio

Remember when Apple and Microsoft (along with some other companies) bought Nortel’s patent portfolio? Now they’ve formed a new company that’s in the business of extorting license fees from companies infringing on the patents that they now own. Who’s infringing? Everyone, according to the CEO of the new company formed to turn the patents into cash:

Pretty much anybody out there is infringing. It would be hard for me to envision that there are high-tech companies out there that don’t use some of the patents in our portfolio.

It’s an election year, this is a huge problem that exists entirely within legal realm, and yet there is no coalition working effectively to create change in this system. In the meantime, people are unwittingly working to destroy the technology industry entirely through litigation. In the meantime, nearly all developers go about building things as if patents don’t exist at all.

More on why you should learn to program

The most awesome story I read yesterday was trial coverage from Oracle’s lawsuit against Google over Java and Google’s reimplementation of Java for Android. Here’s the judge explaining to Oracle’s attorney (famed litigator David Boies) why Google had no incentive to copy the code they were alleged to have copied:

I have done, and still do, a significant amount of programming in other languages. I’ve written blocks of code like rangeCheck a hundred times before. I could do it, you could do it. The idea that someone would copy that when they could do it themselves just as fast, it was an accident. There’s no way you could say that was speeding them along to the marketplace. You’re one of the best lawyers in America, how could you even make that kind of argument?

As folks like Ray Cromwell and Mike Loukides point out, this is the best refutation I’ve seen for the argument that people shouldn’t learn to code.

As a software developer, I’m thrilled that Judge William Alsup learned to code at some point, and that he’s doing some programming to help evaluate the evidence being presented in court. It’s common to see people making policy decisions, legal decisions, and business decisions that wind up being terrible because the decision makers lack the technical knowledge to even solicit good advice.

As I said yesterday, I welcome anyone who wants to dive into programming.

Why you might want to learn to program

Jeff Atwood wrote a provocative blog post entitled Please Don’t Learn to Code that I wasn’t going to respond to because it looked a lot like trolling to me. What I think, though, is that Jeff is conflating the suggestion that people learn to program with the suggestion that everyone should be a software developer. In the end, though, the post is just a mess.

I’m not for falsely equating programming with essential life skills like reading, writing, and math, or with the things Jeff suggests people spend time on instead — learning how things work at a “basic level” or becoming better communicators. That said, I would encourage people to learn to program for a number of reasons.

The first is that much of the world is run by computers. Learning to program involves learning how computers work at a more basic level. Even just knowing how the Web works at a technical level is helpful, if only to know if something is broken on a site you’re using or on your local computer.

In some ways, the relevant analogy is to auto repair. Knowing how your car works and how to fix some things doesn’t make you a mechanic, but it does make it less likely that you’ll be stuck on the side of the road with no recourse other than roadside service, and also helps to ensure that you won’t be exploited when you have to deal with a mechanic.

There are many people out there who work with software developers who are not themselves software developers. Understanding how to program makes it easier to communicate with them.

The second thing is that learning a little programming can make you better at your job if your work involves using a computer at all. Here’s my favorite programming story of all time. I used to work with a software developer who started her career at a chicken processing plant in Arkansas. She started not as a programmer but as an administrative assistant. Back then, they didn’t do word processing, they typed on typewriters.

Even though she had no formal training as a programmer, she figured out that the electric typewriters they used were programmable, and learned how to program them to complete various forms rather than typing them in by hand. Her boss noticed her good work and had her learn how to program another computer they had in the office. Eventually, he encouraged her to quit and go back to school to become a professional software developer.

Had she not been a smart and curious person who figured out that programming would make her job easier, she may still be working in that chicken plant. Today programming is now a more fundamental tool of automation than it has ever been. How many people could eliminate redundant work if they knew how to write scripts to collect data for them and schedule them to run nightly? How many people struggle with terrible Web applications that could be improved with user-created style sheets or Greasemonkey scripts? Programming empowers you to remove annoyances from your daily life.

The third reason is that learning to program teaches you a different method of problem solving than most people are familiar with. Learning to program teaches you how to break down problems into familiar components and then meld those components together to create a solution. Programming is not the only way to learn those skills, but it’s a good way to learn them, and that skill is widely applicable to every day life.

I wouldn’t make the argument that we make programming courses mandatory in school, or that everyone should learn to program, but I would encourage anyone who has the slightest interest in programming to pursue that interest.

The bubble pattern applies to venture capital

Back in 2007, I wrote about “the bubble pattern,” which was a sort of not particularly insightful observation that assets that perform well generate demand that outstrips supply, which in turn leads to a massive reduction in the quality of assets in that class.

Last week, Felix Salmon turned up a report from the Kauffman Foundation that documented the failings of the venture capital industry. Here’s his conclusion:

The big picture, here, is that an enormous number of institutional investors are still chasing VC returns which haven’t really existed in the industry since the mid-90s. So long as all that money is chasing a relatively small number of opportunities, and especially now that valuations for early-stage tech companies are going through the roof, the chances that the average LP will make any money at all in VC are slim indeed.

This is exactly what I was talking about back in 2007. I’ve worked at a number of venture-backed companies over the years, and I’m very glad for the opportunities that venture capital has provided, but that doesn’t mean investing in a venture capital fund is a great investment.

The grammar of Vim

Like a lot of people, I have gone retro when it comes to editors, using Vim for most of my day to day work. I’ve been doing most of my development these days in a terminal window, logged directly into a VM where I test my code. For more, see this article.

I have been a somewhat casual vi user for at least 15 years, but using it for all my development work has made it more important to vastly improve my Vim skills in a short time. The best article on Vim I read was Yan Pritzker’s Learn to speak vim – verbs, nouns, and modifiers! It totally revolutionized the way I thought about Vim.

For my first 15 years with Vim I tried to learn it the same way you might learn a foreign language from a phrasebook. I had learned everything in a disconnected way. Use j to move down a line. Use cw to change a word. Use yy to copy the current line into a buffer. You can get by this way, but it’s a very simplistic approach.

Advanced Vim users understand that Vim commands are a language unto themselves, and that the key to being productive is understanding Vim’s grammar. Pritzker accurately identifies that grammar as consisting of the following parts of speech: verbs, nouns, and modifiers.

The nouns usually represent positions within the document. For example, 0 represents the beginning of the current line. $ represents the end of the current line. j represents the next line in the file. When you use most nouns by themselves in command mode, the implied verb is “go to”. So if you just type j you move to the next line. There are some exceptions. For example, in command mode, s means substitute a character. In other contexts, it’s a noun representing a sentence.

You can usually supply a quantity along with a noun. So 5j refers to the five following lines, and typing it will move your cursor down 5 lines if you don’t supply a verb. Likewise, the w noun represents a word, and moves to the next word to the right if you use it by itself. 3w moves three words to the right. The biggest problem with the way most people learn Vim is that people learn these things as “movement commands” rather than as nouns.

There are a couple of special nouns that I don’t see a lot of people using — f and t. f means “find the next occurrence” and t means “til the next occurrence” and both of them are applied to the next character you type. So typing f_ means “find the next underscore” (on the current line). t_ means “til the next underscore,” the cursor will stop on the character before the next underscore. (You can use F and T to search backward rather than forward.)

These are helpful for navigation, but they’re even more helpful when you’re constructing editing commands, because they can be used as a noun.

Now let’s talk verbs. The big three are y, d, and c. y is yank (copy). d is delete. c is change. Combining a noun and a verb applies the verb to the noun. That’s the essential grammar of a Vim command. cw changes the current word. c0 changes the text between the cursor and the beginning of the line. d$ deletes to the end of the line.

Let’s look at f a bit more deeply. Say you have a variable named my_integer_value and you want to change the name to my_string_value. If you move to the beginning of the name and type cw you’ll change the entire variable name. Instead you can type fi to move to the “i” in “integer”. Then type ct_ (change up to the next underscore) and the word “integer” will be deleted. You can then type in “string” instead.

Lastly there are modifiers. Modifiers change how nouns are understood. The two big ones are i (inside) and a (around). Here’s a simple example. If your cursor is in the middle of a word and you use the command cw it will change all the characters from the cursor position to the end of the word. If you type ciw it will change the entire word. You can also use paired characters as nouns with i. So to change the contents of quotation marks, you can type ci". Or to copy whatever is inside a pair of parentheses, you can type yi(. If you want to yank the parentheses themselves, you can use a instead — ya(.

This is just the tip of the iceberg, there’s a lot more. But once you know how to put these commands together, you’ll have a much easier time understanding the Vim tips you see online. Suddenly you’re expanding your vocabulary rather than learning a new language.

For example, once you understand the Vim as a language, you can get a lot out of Andrei Zmievski’s Vim for Programmers presentation, which is a whirlwind tour through PHP commands.

Vim is weird enough that it can seem like learning it is probably not worth the effort, but it’s an incredibly powerful tool in the right hands. The problem is that to even get started, you have to learn the difference between the various modes and how to switch between them. You also need to learn the basic methods for navigating through a document. If you’re used to a normal GUI editor, that can be really frustrating. Once you’ve mastered the basics, though, learning Vim’s grammar will really accelerate your efforts to make the most of it.

Thinking about resistance to learning new tools

The Washington Post’s Wonkblog has a depressing story about the inability to solve a seemingly straightforward problem with technology that will resonate with anyone who works in information technology. In this case, aid agencies are trying to get people in developing nations to stop using indoor cooking fires and use stoves that are safer and more energy efficient instead. Indoor cooking fires kill around two million people a year and are horribly inefficient. They produce emissions that cause global warming. Unfortunately, despite the best efforts of agencies that give away stoves and provide training to replace them, the long term effectiveness of their efforts is very low.

In software, I see this all the time. Many users are incredibly resistant to changing tools, even if mastering the new tool would greatly increase their quality of life. What I have also observed is that people compartmentalize their interest in trying new tools. Someone might resist upgrading Microsoft Office but constantly seek out the newest fishing tackle available. Or a designer might eagerly upgrade to the latest version of Photoshop but refuse to learn a few Unix shell commands that would make their life much easier.

I’d love to see a study that measures the correlation between a willingness pick up new tools and career growth. My belief is that a willingness to adapt to new tools is a key to remaining economically productive over the long term, unless you have a very highly specialized set of skills that remains in demand.

People are your competitive advantage

Stephen O’Grady has a piece today, Software is the New On Base Percentage, which proposes that effective use of software is no longer a way for a business to gain a competitive advantage, but rather the price of entry for being a viable market participant.

It begs the question, how does a company gain a competitive advantage these days? My argument would be that the most effective approach is to recruit and retain creative people, and to free them to do their best work. I think this is the real lesson for any business in the Valve employee handbook. Yes, I’m talking about it again.

Valve’s employee handbook is, as much as anything, a recruiting tool. It’s a promise that if you have good ideas, nobody at at the company is going to stand in your way. That’s a great pitch.

At Etsy, we find that the people who are the easiest to recruit are the ones who read the company’s engineering blog, Code as Craft, tried to apply things they learned at their own company, and eventually gave up and just looked for a job at Etsy instead.

Companies that put obstacles in the way of people solving problems find that the first rate employees look for other jobs, and that second rate employees devote their time to using Facebook rather than looking for ways to make things better.

The most effective way to gain a competitive advantage at a company is to create a culture where employees are free to use as much of their brain as they want to build value for the company.

The determination of users

There’s a lesson for software developers in this paragraph:

I did all my email work in that one “legacy” tab, marveling at how much I preferred it to the new-look Gmail that was the only option in any newly opened tab. I carefully “slept” the machine at night rather than shutting it down. I cancelled any software update that required a system reboot. I worried about what would happen if I unthinkingly closed the tab. It was my living connection to happier days.

That’s James Fallows, explaining how he attempted to keep using Gmail through the old interface.

How the University of Florida spends its money

This is the sort of thing I’d normally just tweet about, but hey, I have a blog, so I can add stuff to the permanent human knowledge base by posting it here.

People are justifiably outraged that the University of Florida is eliminating its computer science department. As Alex Tabarrok notes at Marginal Revolution, this is an example of how the institutional incentives for universities are not well aligned with what society most needs from those universities. This story is complicated. The state government is cutting funding for existing institutions even as it creates an entirely new polytechnic university carved out of the University of South Florida.

Cutting the computer science department will save the University of Florida $1.7 million. Many people have noted the size of university’s athletic budget, and that that budget went up by $2 million this year. The athletic budget, managed by the University Athletic Association (Inc.), is available online. UF’s athletic department is financially independent from the rest of the university and in fact pays the university for general services that it uses. So while it has a huge budget, it’s not as though Florida could cut athletics to save the computer science department.

Obviously we justifiably argue that it’s a shame that people care so much more about sports than they do about sustaining important academic programs. But you can’t say that UF is funding sports over computer science.

Applying judgement and influence

I’m just going to keep posting stuff about Valve until I get tired of it.

Did you read the Valve employee handbook? If not, you should. To catch you up, at Valve, the corporate structure is completely flat. They have no managers, and everyone decides what to work on for themselves. The handbook explains what is expected of Valve employees and how people should adapt to that corporate structure.I’m sure some people find it intriguing and others terrifying.

Succeeding at Valve depends on two things, the application of one’s judgement and influence. Employees use their judgement to decide where they can add the most value for Valve. They use their influence to recruit other people to help them build the things that they have decided are valuable. Find a problem to work on, convince other people to help you solve it. Nobody is empowered to order anybody to do anything.

What occurred to me after reading the Valve handbook is that you or I can work in the Valve style regardless of where we work. If you work anywhere but Valve, you probably have a manager and you may have people who you manage as well. Within the constraints of your job, though, you should be relying on judgement and influence rather than hierarchy in your work, just like a Valve employee does.

If, in your judgement, there’s something more valuable you could be working on, you should be convincing people (like your boss) that your time could be better spent working on that other thing. Just be sure that you’re open-minded enough to accept that your judgement could be mistaken. If you’re right, though, it ought to be easy to convince people that your time could be better spent on a more valuable project.

At the same time, rely on influence rather than authority to get the help you need to get your work done. People generally do better work if they believe in the project they’re working on, and the ability to recruit volunteers is a good sign that whatever you’re working on is worth doing. People sometimes mistake interesting for valuable, but it’s always better to work with enthusiastic volunteers than with people who are doing something just because someone told them to do it.

Obviously if you work on an oil rig or at Burger King, this approach may not work. However, the field I understand best is software development, and if you’re working on software, you should the Valve philosophy to heart. Use your judgement and influence to make sure you’re adding as much value as possible at your job. If that gets you into trouble, maybe it’s time to use your judgement and influence to land a job more suited to your talents.

← Before