The Pragmatic Programmer gives a very popular bit of advice: learn a new language every year. When you learn a new language, you learn a new way to think. You discover new strategies and solutions unique to a particular language's particular culture. And that's all well and good - except that it's kinda bullshit.

First, the thought-changing nature of learning a language is based on something Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing." First, this doesn't imply that every language you learn will change the way you think - in fact it implies quite the opposite. Second, Perlis also said "Bringing computers into the home won't change either one," which is at the very leastdisputable.

Like any other computer guru, Perlis was always opinionated but only sometimes right. But there's a more important objection. You can't learn a language in a year. It can't be done. I've been writing Ruby for three years and I don't really know it.

There's a great book by Douglas Crockford called "JavaScript: The Good Parts." One of the great things about it is that it's a freaking TINY book. But there's a gigantic book by Damian Conway called "Perl Best Practices" which is really just a very verbose edition of "Perl: The Good Parts." Both books say here's a language with a ton of features; use only these features. The thesis explicit in Crockford's book and implicit in Conway's is that the best way to use a language is to carve out a subset of its functionality that is superior to the whole smorgasbord you have on offer. It's how people use natural languages, and it's how a lot of good programmers use programming languages as well.

In the three years I've been writing Ruby, I've carved out a Ruby subset I'm comfortable with and powerful with, but I still haven't mastered it - and it's just a subset of Ruby. Ruby 1.9 will redefine the problem for me before I ever master Ruby 1.8. And if you don't think that's true for you, you're lying to yourself.

This subset thing isn't just the best way to use a language, either. It's the best way to use a computer. First thing I do when I get a new box is I pull the bullshit off. No Spotlight on my OS X box; no spelling correction active in any application I own. I've never in my life seen a spellchecker that could outperform my own perfectionism, or even one that showed respect for my name. No, I did not mean to type "gills," "files," or "geese." Thank you so much for asking. I hate spellcheckers with a passion. Excuse my French, but as an iPhone user would say, they can all go duck themselves.

Back to the topic of languages. I met some guys once, when I was looking for a job. They had an app built in Erlang and were working on building one in Seaside. They wanted to do something pointless and insane with Seaside. I can't remember what, but I remember that it was something you would only ever try to do with Seaside if you had no understanding of what made Seaside different from other Web frameworks. I scratched my head over it, and then I found out the details of the backend app in Erlang. Turns out you could have handled it just as easily with Python and cron.

There were two bizdev guys and a programmer with a beard. I called it - I knew he was a programmer from his beard. I was like, ah-ha! He told me, "yeah, the other guys told me to grow the beard for when we talk to VCs." The bizdev guys had found him somewhere and they had him "come on board as co-founder" (as is the custom among their people). That's when I got it - the programmer was as cynical about these guys as they were about their VCs. He was using them to pad his resume with bullshit projects in exotic languages.

If you do that, Zed Shaw will find you and skullfuck you to death. I'm not kidding. He and I have made a deal with Satan, and this was one of the perks he requested. I can't go into any more detail than that, because Satan made us sign an NDA, but believe me, you'll get what's coming to you.

The only way to learn Seaside is to build a project in it, and not just any project - it has to be a project for which Seaside is a smart technology choice. Same with Erlang. If you write a project in Seaside that has nothing to do with Seaside's strengths, you're not going to learn much.

If you do it right, you'll learn a little. You'll end up with a subset of Seaside you haven't mastered. Beginning to define the subset is as close as you'll come over the course of a single project. But that's still something.

The Pragmatic advice remains great advice, but don't be a monkey about it. You shouldn't always follow good advice, but you should always take it into account. You have other options besides the literal interpretation.

For example, address a new problem space every year. Choose music, robotics, hardware hacking, machine learning, natural language processing, whatever makes your brain pulse. In 2008 I didn't bother to learn a new language, but exploring a new problem space set my brain on fire, and speaking at a lot of conferences taught me a lot.

In 2009 I'm not planning to learn a new language either, although I am planning to put up my first production app in Seaside. In fact, I'm looking to launch a ton of micro-apps and nano-apps. It started when I realized a fundamental flaw with the Rails Rumble: if you can code it in a weekend, why wait a whole year? (The Rumble guys are considering a monthly version, by the way, although nothing is finalized yet.) Frameworks like Rails make you fast, and Sinatra makes even Rails look slow.

I got a head start in December with BoingBoing Minus Disneyland, which screens Disneyland posts out of BoingBoing's feed like a precise inverse of the usual robot goody two-shoes screening out profanity. I'm going for a new app every month, because the other flaw with the Pragmatic advice is that it gives you a big, imprecise goal with a far-off deadline.

Repetition makes a huge difference. That's why, for my music, I'm putting a new beat on Twitter every day. But you have to offset repetition with stronger challenges. A year from now, I don't want to be looking back on 365 trivial, meaningless little beats.

I haven't figured out yet exactly how I'm going to use this, but it'll probably look like this: one new beat per day, one new track per weekend. One new app per month, one milestone on the app per week. The goal is not to establish a far-off goal and find a way to hit it, but to establish a series of tiny, immediate goals that keep you forever moving forward. Aristotle argued that virtue was mostly a matter of having good habits; Lao-Tzu tells us that the voyage of a million miles starts with a single step. So the key is to get moving and keep moving.

My next-door neighbor runs the de facto neighborhood daycare center. It's not a business; they're not using Montessori or any other fancy methodology. It's an elderly couple who people nearby trust and like.

They speak Spanish. Since I'm often up to 2am, the children often wake me, the next morning, with their playful screeching. From listening to the children yell, shriek, and cavort, and listening to the elderly lady keep them under control, I've learned some words and phrases in Spanish.

I just opened up a new app. Gotta learn it; figure out where stuff goes; what does what; et cetera. I find this:

It's like when you're at a conference, at the end of a long day, you come back to your hotel room, and there's a little chocolate in gold foil on the pillow. Like warm fuzzies, except it's more good manners than anything else.

Just to make it obvious and clear, this allows you, in dev mode, to get to any controller and action just via the usual, non-resourceful, non-cleverly-mapped, easy-to-remember classic Rails URL style.

Tuesday, December 30, 2008

There's still a lot of defeatist bullshit going on around the changes in the music industry. Here's something the New York Times considered news fit to print:

this is the reality of the 21st-century music business. Selling recordings to consumers as inexpensive artworks to be appreciated for their own sake is a much-diminished enterprise now that free copies multiply across the Web.

While people still love music enough to track it down, collect it, argue over it and judge their Facebook friends by it, many see no reason to pay for it. The emerging practical solution is to let music sell something else: a concert, a T-shirt, Web-site pop-up ads or a brand...

a tectonic shift is under way. Record sales channeled the taste of the broad, volatile public into a performer’s paycheck. As music sales dwindle, licensers become a far more influential target audience...

It’s almost enough to make someone miss those former villains of philistinism, the recording companies. Labels had an interest in music that would hold listeners on its own terms; selling it was their meal ticket. Labels, and to some extent radio stations and music television, also had a stake in nurturing stars who would keep fans returning to find out what happened next, allowing their catalogs to be perennially rediscovered. By contrast, licensers have no interest beyond the immediate effect of a certain song, and can save money by dealing with unknowns.

Imagine a music world dominated by a boring star system. Imagine a child singer in this world, who grows up in the spotlight. Imagine corporations sucking such a world so dry that everybody in it knows exactly who this child is, and sees her going insane under the pressure of the spotlight, until she matures into a fully-fledged lunatic.

In this hypothetical universe, all this happens, and everyone knows every detail of it, despite the fact that nearly everyone in this world hates her music. Which may explain why nobody does anything to help, as the poor little child-woman-idoru goes mad, and then reappears acting sane, acting as if nothing happened, with her hair all brushed and her teeth all smiles, as if that were not more frightening than recording a simple, angry, honest punk rock album would have been.

Check out how the New York Times describes this hypothetical hell:

Once they were noticed, stars could provide their own story arcs of career and music, and songs got a chance to create their own spheres, as sanctuary or spook house or utopia.

It's not a story arc, you asshole. It's somebody's life. It's a crazy person with more money than Jesus, and odds are she'll never enjoy a penny of it.

For contrast, consider a fascinating little factoid Lawrence Lessig dropped in a recent NPR interview: there are more musicians making a living from music today than there were when file-sharing was new.

What the Internet is doing to music is making it easier for artists to make money based on making good music, instead of manipulating public attention. The old business model: first you convince a woman to do a thousand stomach crunches per day. Then you strip her down to her underpants. Then you hire somebody to make some music as a backdrop while the woman showcases her body.

There's no doubt this business model results in compelling entertainment. But if you tried to make the argument that this was a great way to optimize a system to produce the best possible music, a number of counterarguments would present themselves. Some of these counterarguments would be very strong. If you were cynical, you might even get somewhere with the argument that the old record industry is so twisted, corrupt, and creatively bankrupt that it needs strippers more than it needs musicians.

Don't get me wrong, strippers are fantastic now and then, but you wouldn't want to spend your whole life doing it, and it ain't about the music.

The man tried to get the door open, but apparently could not do it quickly with the bear on his heels. He helped his three kids get under the SUV, and continued to try and distract the bear with his shirt. The bear reached under the SUV from various places in an attempt to reach the kids under the SUV. I had two cans of #15 UDAP bear spray in the car, one for me and one for my wife that we take hiking. I figured, that it may be necessary to distract the bear away from these kids.

Monday, December 29, 2008

One major problem with automated test suites is that they function both as development tools and as traditional software quality testing. Your unit test suite turns into a regression test suite when it matures, i.e., once you're done developing and you've got a piece of code which works. But that's not how it should be. You've got two types of tests that need to exist, and a twisted mutant hybrid which serves both roles. It is a thing which should not be. An abomination. A monstrosity. A spork.

Separate your development specs from your de facto regression-suite specs. When you're doing BDD, you want those things to run as fast as possible. Any delay gets you out of the zone. Specs should run as fast as reflex.

Once you've got your code doing what you wanted to do, copy/paste your new specs into the main spec file for whatever class you're monkeying with, and make sure it still works. Run the real spec file for the class, with all the specs. Once that is done, run all your specs.

The major win of BDD is the incredible speed and flow. Don't deprive yourself of that experience. It's what makes coding worth doing.

The interesting contrast is that at this few-prominent-Rubyists corporation, people were like, "should I learn RSpec?" and "After I finish writing this code, I'm going to add some unit tests." At ENTP, people are like, "RSpec's too freaking big" and "after I finish writing this code, I'm going to release my own testing framework."

So at this corporation, people were asking me, "should I learn RSpec?" And I was really never sure what to tell them. On the one hand, RSpec doesn't feel as awesome as I would like it to. It's big enough that you could bludgeon someone to death with the code base if you printed it out. On the other hand, if you're not using TDD/BDD, you should start, and if you're going to start, starting with BDD will be a gentler learning curve than starting with TDD, because the terminology's clearer. I was very glad when I discovered Shoulda, because it allows you to get the terminology benefits of BDD with a much more lightweight framework.

The competition between testing frameworks is constant and intense. It's like if dinosaurs were still alive, and they rode into battle with soldiers on their backs manning laser cannons.

OK, it's not that intense, I just wanted an excuse for another great picture. But it is pretty intense. Complaining about your testing framework, or rewriting it, is so common that the only programmers who don't complain about their tests are the programmers who don't write any. If you ever want to screen out a non-TDD programmer during an interview process, and for some insane reason you can't just ask to see their tests, ask them if they have any complaints about testing frameworks. If they don't, then they don't use TDD or BDD at all.

(Slightly modified from the original. Stole the idea from Josh Susser.)

With so many options, an innocent question about which testing framework to use can turn into a really long conversation. I really haven't figured out what the guiding principle here should be. The question basically is this: how much of the productivity advantage RSpec users have enjoyed is due to using superior tools, and how much of it is due to simply being the type of people who seek out the superior tools, and then throw them away or redesign them? Because there are plenty of programmers who want to learn something and then not have to worry about learning anything new for at least six months. That's not how you get to the top of your profession, but it is how you enjoy a quiet life, and enjoying a quiet life is a reasonable goal.

The only certain conclusion I've come to: while enjoying a quiet life is a reasonable goal, it's not a goal I'm qualified to give people advice about. If you want to know how to spot a werewolf, how to find underground warehouse raves in foreign countries, how to survive a downhill highway spinout, how to avoid getting beaten up by gangbangers in the ghetto, or how to stay up to date with the latest and greatest Ruby projects, I can point you in the right direction. But there's a theme here. None of these things have much to do with enjoying a quiet life.

If you're not going to hack in your free time, fly to conferences, or even blog, should you learn RSpec? I honestly have no idea. I think the answer's yes, but I've noticed something about myself over the years. If the question is "should I buy this?" I will say "yes" for any value of "this" which you can use to make music. Likewise, if the question is "should I learn this?" and it's a technology that looks fun, I'll say "yes, you should." To me the question of "should I buy this music-making device?" comes down to "does it work?", and the question of "should I learn this technology?" comes down to "is it fun?"

But when a more cautious programmer asks that question, they're asking if it's going to be around more than a year. They're asking, "is this the next big thing?" It's pretty hard to answer that question correctly every time. Honestly I think the difference between learning the next big thing and experimenting with a whole bunch of different things is a difference purely of luck.

You never know what the next big thing is until the dust has settled and the winner's been decided. If you wait that long, you're not learning the next big thing; you're just learning the big thing. The only surefire way to learn the next big thing every time is to learn every damn thing there is. It's impossible to predict which experiments will succeed. That's the whole point of experiments in the first place.

Friday, December 26, 2008

Erratic is a VST plugin for DAWs (Logic, Cubase, Ableton, etc.) which uses probabilistic modulation of various parameters to "humanize" beats. You can also use it to make your beats weird.

Some features are similar to Archaeopteryx. Erratic controls drums probabilistically, like Archaeopteryx, but where Archaeopteryx uses the technique to generate new rhythms, Erratic uses it to add variation to existing ones.

Elysium uses probability in a similar way - in fact many of Erratic's humanizing touches have equivalents in Elysium. However, Elysium's weak point is drums, and Erratic's whole raison d'etre is drums, so the two might make an excellent match. Unfortunately, Erratic is PC-only.

A little while ago I picked up the new issue of Future Music, which included an interview with Dave Spoon, and MP4s (which I watched on TV via my Xbox) where Spoon explains how he made his house hit "At Night," which took him from an unknown to a UK top 40 hit in under a year.

Spoon produced the track entirely in Propellerhead Reason. I loved this - I've used Reason for pretty much everything I've done with Ruby and MIDI ever, not just this year with Archaeopteryx, but my first experiments as well. I sold a small hardware studio around 2000 and switched over entirely to Reason and a few other software bits and bobs. It's fantastic, but a lot of people think of it as a toy. There's some truth to the perception, but it's really what you make of it. There are a lot of people making hit records with Reason; Dave Spoon's just one example. Others include Massive Attack, Eminem, and London Elektricity.

In the Future Music interview, Dave Spoon says that having come up the ranks so quick, he's getting demos from producers all over the place, and that he thinks dance music producers think too much about getting a clean sound, and not enough about hooks and arrangements.

Around the same time, I found this track, "Disc Go" by Syncopix. He looks way too serious, but don't hold that against him. He probably can't help it, he's German.

It's the synth hook that does it. The rest of the track, it's cool, but for me it's all about the hook. I'd go so far as to say that everything else in the six minutes of music hangs on that hook. I'd go further than that, even.

This track features on a Knowledge magazine showcase mix of several up-and-coming labels, many of them based in Germany. The mix is good, but because it showcases a region rather than a particular style, it wanders a bit. For me this one track, coming on at track number 4 in the mix, makes the entire first twenty or thirty minutes of the mix work. The hook doesn't just carry everything else in the track; it carries everything else in several other tracks as well.

So I came up with a riff about a month ago. In the past that would have been the end of it, but with this attention on hooks, I've been revisiting it and working to develop it into something that could carry a track. The result is trancier than I usually like to sound, but it works so far. It started with a phrase. I realized I'd need more than just that phrase, so I added some variations. When I figured out where the variations were going, in terms of the chords, finding the missing link was easy. One thing I like about this process; the initial phrase is a hook on which all the other hooks hang.

The rhythm on the last mp3 is way off because of some technical difficulties; I fried my beloved drum machine with the wrong voltage adapter, so it's impossible to use it as a metronome any more. But it's easy to see how the hook's evolving. For perspective, here it is as a melodic line with no bass or drums.

Also, again, this isn't about the style or the sound; most tracks I buy sound a lot harder than this. This is deliberate practice - turning a hook into a melody for the sake of honing the skill. I'm not exactly taking over the world here, but I'm enjoying the process and seeing results.

Monday, December 22, 2008

I wish I had time to clean this up and go into detail, but I'm just copy-pasting. On Facebook I came across the usual "how could Obama let this douchebag speak at his inauguration? what is he THINKING?" and for some reason I just snapped:

he's thinking about all the crazy fuckers who went and bought guns the day he got elected. somebody needs to calm those nutballs down. remember that bullshit Bush said - "I'm a uniter, not a divider?" think about it, people don't buy guns like that in a big rush unless they're scared. you've got global warming, economic collapse, America losing wars, California on fire, Louisiana under water, New York having its skyscrapers destroyed - it already looks like the Apocalypse even WITHOUT a black president. when you're winning, you can afford to be generous. stop being a bunch of paranoid assholes. you're so used to being sore losers that you don't know how to win gracefully, and I'm fucking tired of it. WE WON. bringing a douchebag like that to speak at the inauguration is a sign of AUTHORITY. it's like bringing a rabid dog to heel. and all the crazy fuckers out in the boonies will calm down and get with the program like they're supposed to.

This? You're scared of Fluffy?

Honestly, Democrats, liberals, ever heard of a word called compassion? It doesn't just apply to gay people mistreated by the demented. It also applies to the demented themselves. These people are in a panic.

And if that's not enough, consider this: top retired Pentagon officials are telling Obama to put a gay man in charge of the Navy. Just the fact that a story like that appears in the mainstream media at all is serious change. How do you think these panicking conservatives would react to that kind of news? Have you ever read their writing? They devote all their imagination to fear; in their world anything familiar is good and anything unfamiliar leads to some seriously wild flights of paranoia. If Obama even gives the gay Navy guy half a moment's consideration, these maniacs are going to be saying that he's going to make gay sex a requirement of life in the Armed Forces.

All Obama's doing is saying, fine, you want to fan their fears and give them absolutely no policy changes that are good for them? I can beat you at your own game. I can let them have their fears, and give them policy changes that aregood for them. And the reality is, if these people stop panicking, they won't care so much about other people's sex lives. Authoritarianism is a response to fear. Help them solve their fears and they'll quit with the lunacy of their own accord.

Show some compassion. Fucking get over it. The conservative wackos are pissing their pants with fear. Let them at least calm down enough to put on a clean pair of underpants. Wackos need their dignity just like anybody else (and they're obviously not going to get it from me). Obama's letting them know he knows they're out there and he knows their concerns are valid concerns. He has a responsibility to them too, and unlike every other Democrat in this country, he knows how to win gracefully.

I've been reading BoingBoing since the old days when you had to go to Barnes & Noble to get it and people would look at you funny.

The old zine was a beautiful thing and the new incarnation's awesome as well. With its severalniftyoffshoots and gigantic audience, the new BoingBoing matured into a fantastic success. But the new BoingBoing also added an inexplicable fixation on Disneyland that I don't appreciate, enjoy, or understand. I don't care about Disneyland one way or the other. When you don't care about something, seeing it pop up as a non sequitur once introduces variety and spontaneity; seeing it a hundred thousand million times gets distracting and irritating.

I described this in the past as the Tim Bray problem, which was a mistake. I've read somewhere (I think here) that the human brain has specific areas devoted to gossip that take automatic precedence over any other brain function except for the recognition of human faces, the adrenaline response, and autonomic functions like breathing. So if you've ever noticed that people's brains seem to shut off the minute gossip or interpersonal drama gets involved, that is in fact literal truth.

Large sections of the human brain switch over to background priority level when gossip gets involved. Which means if you want to use Tim Bray as an icon of irrelevance, because he happens to fit that role for you personally, people aren't going to go, oh, yeah, I see what you mean. They're going to go, oooh, Tim and Giles are going to fight after school.

Describing it as the Disneyland problem is much simpler. If you read BoingBoing every day, you're going to see something about Disneyland sooner or later. Most people seem to love Disneyland. I don't. A few people seem to hate Disneyland. I don't. Disneyland means nothing to me one way or another, which means that any blog post about Disneyland, whether critical of or flattering to Disneyland, is meaningless to me.

I tweeted months ago about wanting a Twitter filter to screen out any reply to @timbray. I still want that filter. But as far as a BoingBoing filter which screens out any Disneyland content, I've built that.

Sort of. It sounds like the simplest app on earth but in fact there are some problems with it. I'm really announcing it in hopes that somebody will point me in the right direction for fixing some of its flaws. Here they are:

Safari: works on my box, fails live

Firefox: fails on my box, links-only live

I don't know what the story is with IE and I don't plan to find out. I do plan to find out how it looks with Google Reader, but I started hacking on this Friday night, and I've had a horrible cold all weekend. In addition to writing this, I've been sleeping all weekend, and I also squeezed in a few hours of work.

Anyway, pooooooor Giles, what a martyr. Yadda yadda yadda. I still use Safari as my blogreader, so a BoingBoing filter which works under Safari and on my box is good enough for me. But I had wanted BoingBoing Minus Disneyland to be my Christmas present to the world, and that just isn't happening.

As far as I can tell, all the problems come down to the inconsistencies of RSS. RSS spawned inconsistent de facto forks left and right the same way HTML did, only HTML did it under the eyes of a lot more developers over a longer period of time. I don't know what's going on with all this cross-browser stuff. My RSS is messed up every which way to Sunday. On top of that, RSS readers seem fragile and easy to confuse. HTTP headers must factor into it somewhere, too, as the only difference I can think of between dev and production is that I'm using Mongrel on my box and (probably) nginx live.

Tuesday, December 2, 2008

You may have seen or heard of Matt Mower's Elysium, which will soon go into public beta. (Like maybe tomorrow.) Lucky me, I'm in on the private beta (woo woo etc.) and got it driving my Korg hardware today.

The second mp3 uses probabilistic features in Elysium, kind of like Archaeopteryx. Where Archaeopteryx gives you a probability matrix step sequencer, Elysium gives you a hexagonal programmatic step sequencer with probabilistic and mathematical features. To unravel that, let's start with the hexagons.

Elysium's kind of like a software version of the reacTogon:

Elysium replicates this interface in software, swapping out the built-in synth for external MIDI control, and adding in some new features. One of these is that individual notes can have arbitrarily complex callback functions in MacRuby.

Another is that you can assign a probability to each note, expressing as a percentage how likely it is to play on any given iteration of the sequence. You can also attach oscillators to any note, which vary parameters such as note volume and length on a regular or irregular rhythm.

To put this in context, consider the guitar riff from "Money For Nothing" by Dire Straits.

As a kid, I once destroyed my dad's stereo with this song. Luckily he wasn't home and I blamed it on the dog. Yes - the dog. I know it seems unlikely that a dog would turn on the stereo, but our dog was part wolf and incredibly destructive. I could blame almost anything on him. Anyway, I tried to get my guitar teacher to teach me this, but he said I wasn't ready; apparently Mark Knopfler plays the riff a little differently almost every time through. I'm not even sure that's true, but if you want to make a riff on a synth for which it is true, Elysium's a very appropriate tool.

It's true of my probabilistic riff mp3, for example - the riff never repeats exactly the same way - and that only takes advantage of the probability settings. I played with the oscillators as well and there's a lot of power there for expressive texture and subtle nuance. I haven't even gotten to the embedded scripting yet.

Update: Elysium is now in public beta. Here's a better example of a probabilistic riff, with a regular, non-probabilistic drum beat. Here's video where I record the riff in Elysium, without the beat, but with some Elysium-driven drums.

Pownce wasn't designed to capture any particular market or change the world in any particular way. Pownce was designed to be, and functioned perfectly as, a holding pattern for fortunate, privileged Silicon Valley/San Francisco celebrities who were, for a time, too well-connected to need real jobs. Northern California is full to bursting with similar companies. Ever so often times get tough, and even the well-connected need to produce something, so they fold up their inflatable castles and do some real work for a year or two, generating actual revenue, until the economy recovers.