Of Musicians And Programmers

Jeff Atwood posed the age-old question again today on his blog, and I thought it was worth a little more introspection as someone who was (is?) a musician first, programmer second.

The question: “Why are so many programmers musicians?” (Note: the question is coming from a programmer, not a musician, which is the first notable point. Many programmers might fancy themselves musicians, but it’s highly doubtful that a proportionately high number of musical performers write code offstage.)

REAL ARTISTS SHIP

Sure, both musicians and programmers create and release things, but we never really give either group full credit for how inherent this release cycle is to their jobs.  Simply put, if you’ve written code but have never compiled a self-created working program of some kind, you wouldn’t call yourself a programmer.  Likewise, you’re not a musician if you’ve never played a song.

This point is almost so obvious it’s ridiculous to waste time on, but think of all the people you know who have jobs that could go on for fifty years without a tangible “thing” being created.  Most people I know who input data into spreadsheets, make photocopies, wait tables, count money, deliver newspapers, or sit in meetings throughout their day could do so from early adulthood to retirement and never build anything.

The real reason our hearts flutter a little bit when we hear the words “real artists ship” is because it’s fundamentally true (because you fundamentally can’t be a real artist without having shipped something), and also because we know that a vastly disproportionate number of all the people we’ve ever met in our lifetimes we’ll never ship anything.

The point being that if you limit the input to only people who ship stuff, you’re immediately going to see an overlap from there on.

LOUD == POPULAR

Let’s face it. Becoming popular–at least to an extent–as either a musician or a programmer has less to do with personal branding or even (dare I say it) skill as much as it does with just being louder than everybody else. It might not make you the best or the most world-famous, but you can still pretty much guarantee in the fields of music and software that as long as you’re loud enough you’ll get noticed and followed to one degree or another.

Just ask these guys:

 

GOING NICHE FOR PROFIT

Both musicians and programmers are raised with a similar value set. Learn the tools that are valued, get a job using said tools, profit. So of course the most unbearably boring, untalented, and uninspired losers in both fields do just that. They study CompSci or Classical Performance, learn java or the violin, and get a job in a big office building or junior high school. It’s safe, it’s secure, and it’s a no-brainer.

On the other hand you’ve got the true hacker types who realize and value success a little differently. These are the programmers who give up Java for Ruby after college, or the musicians who drop out of college entirely and bend circuits.

The irony is that the more niche you go with your career, the higher your chance of success. Right now there are a million people hoping to be a successful rapper or pop singer, and probably 200 trying to be successful power electronics musicians. 

And of course since even the average musician listens to more music than they write, the demand for strange genres like power electronics rises disproportionately. If you’re able to become one of the top 20 of the total 200 power electronics musicians, you’ve found yourself in the top 10% internationally.

Obviously the same goes for programmers.

Just as in DHH’s concept of the ’surplus’ and Giles Bowkett’s idea of the ‘fringe’, as a musician or a programmer you have the ability to carve out a niche to be successful in, which is very powerful even if by the simple mathematics of “fish in the pond” numbers.

Certainly every career you can think of has its niches and maybe I’m overdoing it a bit, but I think this is a huge draw for musicians and programmers to their fields (and to the place where you can successfully be both). While I’m sure most advertisers and marketers are still working offline, I would highly doubt that specializing in “social media” as a marketer could automatically bump you to the top 10% internationally in your field, or specializing in Japanese used car sales, or kangaroo veterinary medicine, or Laffy Taffy humor writing, etc, etc, etc.

 

Noise musician or Merb contributor? LOL DUNNO.

Noise musician or Merb contributor? LOL DUNNO.

 

 

SO WHAT?

The percentage of musicians who consider themselves programmers is very low. Even if it would make perfect sense thematically for him to knock out a Perl script from time to time, I’ve never seen William Basinski make a contribution to Open Source or Prurient write a badass Lisp compiler.

But there are way more “musicians” (or people who call themselves musicians) than there are “programmers” (the same).

The percentage of programmers who consider themselves musicians, all else considered, is disproportionately high.

This is for a bazillion trillion reasons, probably, but has everything to do with the specific personality traits that would draw someone to proramming in the first place.

Again, all else considered, if you consider these personality traits:

 

  1. Builds and releases “real” stuff
  2. Understands the value of “loudness” as personal branding
  3. Able to learn new things
  4. Sees the “niche” or “fringe” as dollar signs, and, oh yeah,
  5. Can actually write fucking computer code
You’re already down to a tiny fraction of a tiny fraction of the world’s population. If we were to graph all of these people to the left side of a Venn diagram, and all the people who have points 1-4 in their personality but change point 5 to “can actually play a fucking instrument” to the right, the amount of overlap would be so absurd and intense that you’d think we were graphing the same group.
Oh wait, we pretty much are, and that’s exactly the point.
Link to my music, if you know me from software.

 

 

Posted in Art, Code | Tagged , , , , , , , , , , , , , , , , | Comments closed

Donating A Dollar A Day For A Year

I’ve decided I’m going to donate $1 a day to things I like for a year, and started last night with a donation to the This American Life Podcast.

I have several reasons for wanting to do this.  First, making a donation to things that have given me joy gives me more joy. Second, making frequent tiny little donations (selfishly) allows me to feel joy frequently. Third, there are a lot of great new micropayment services that didn’t exist just last year.

My plan is to stay as close to the plan of $1 a day as possible, meaning 365 individual donations of $1 each day for a year.

I realize I won’t stick to this plan, so I’ll allow myself the occasional weekly or biweekly payment to especially good causes if I need to catch up.

The point being that I don’t want to spend more than a double-digit amount on any one cause, but any “cause” that has given me joy (in part thanks again to services like Tipjoy) is fair game for a donation.

It doesn’t matter if it’s a charity, nonprofit, a person whose blog, tweets, or software I’ve enjoyed, a place, piece of art or architecture, musician or song, huge corporation or microbrewery.

In short, if you’ve ever provided me with joy, brace yourself to feel the wrath of my (one single) dollar.

Posted in Uncategorized | Tagged , , , , , , | Comments closed

What Can You Do When You Can’t Sleep?

Posted in Code | Tagged , , , , , , , | Comments closed

Making UITableViews Suck Way Less

Usually I wouldn’t get involved in arguments about which configurations framework designers choose to make default, but in the case of the iPhone’s UITableView, it’s pretty apparent the default options are going to lead you in circles of UI Case Study research and aesthetic ponderings before you realize a flip of a switch will solve 90% of your problems.

And I mean, come on. There’s a reason we’re not developing for Nokia. The iPhone’s beautiful by default, right? Right?

Let’s check out a boring iPhone app with the boring UITableView defaults running on a device:

Boring iPhone App

Boring iPhone App

And the Boring App’s default configuration in Interface Builder:

Boring Interface Builder Default Configuration

Boring Interface Builder Default Configuration

But let’s flip the switch on that mofo and make a beautiful application with beautiful design:

Awesome Interface Builder Default Configuration

Awesome Interface Builder Default Configuration

Oh, SNAP. I bet you know where I’m going with this.

Here’s our AwesomeApp in the state of being Awesome and being edited to be even more Awesome:

Awesome App Being Awesome

Awesome App Being Awesome

 

Awesome App Being Edited Into Even MOAR Awesomez

Awesome App Being Edited Into Even MOAR Awesomez

Posted in Art, Business, Code | Tagged , , , , , , , , , , | Comments closed

Why I write software (and why I think you should too)

Hackers.

Hackers.

Just as you can split the world between smokers and non-smokers, or perhaps survivors and non-survivors, or people who have jumped out of a plane and those who have not, etc, it is possible to split the internet-dwelling public into two distinct groups:

Those who write software and those who complain incessantly about the software others have written.

I see it every day: “The iPhone can’t send MMS.” “Gmail’s filters just missed some spam. FAIL.” “Fail Whale sighted!” “AWS could have at least contacted us before losing all of our user’s avatars.”

It’s relentless; eternal. That is, at least among groups of individuals who are users rather than creators of software.

Sure, you see programmers complaining about software. Hell, they complain about software louder and more frequently than their non-programmer contemporaries. But it’s a very disctinct, different kind of whimper.

A programmer complaining about software is akin to an astronaut expressing concern with his flight suit, rather than wishing his ship could reach Mars in under a half an hour or have cup holders installed in every seat.

And when a programmer finds a problem in his current toolset, he fixes it and passes the changes along. It strikes me as a little bit of a shame that the “Patches not Tickets” mentality can’t spread beyond Open Source and into an overall fix-your-problems-your-damn-self mentality that helps everyone, regardless of medium.

I read an article somewhere that I would never be able to find again now where the author compared users of software to drivers of a car and developers of software to mechanics.

I think I dig that analogy. I really do, except for the fact that developers of software are less like auto mechanics and much more like MacGyver meets John Cusack.

Think about it. There are heart-racing thrillers out there where the protagonist sprints around a city solving one little problem after another in order to save the world (Bruce Willis), but there’s something that runs way, way deeper.

You can’t make a good movie without a hefty dose of kickass problem-solving.

Hell, you can’t even live an interesting life or have a not-dull day if the desire to solve problems quickly, efficiently, and kick-assedly isn’t engrained deeply into your being somewhere.

It’s not what seperates the men and the boys; it’s so much more than that. Solving problems is quite literally what seperates us as humans from animals, and I would argue that every aspect of suspense, excitement, and catharsis that can be found in humanity is a direct result of problem solving.

Think about it. John Cusack doesn’t get the girl at the end of his movies for being charming or handsome (rookie mistake), but because he’s a ninja of a problem solver. He’s a true hacker. “Handsome gentlemen gets girl by being handsome” doesn’t work as a movie because it’s boring. There’s no excitement!

So instead John Cusack hacks the situation in front of him, studies the girl, studies his environment and his adversary, and hacks and hacks until he gets the girl.

Killer.

The only point I’m trying to make here is that you can’t be an interesting person who does interesting things unless you’re in the business of solving problems, and developing computer software is the most literal application of problem-solving methods you can find in our society.

When you’re in the business of writing software, you’re paid only to solve problems. Fix small bugs, develop massive systems, think of new ways to improve stability and performance, help fix problems of communication and connectivity, the list goes on and on and on.

This is why programming is not, well, “just typing.”

And when I said a literal application of problem-solving, I meant it. It’s not “I solve the problems of communication between manager and employee” or “I solve the problems of bringing new products to market.”

It’s literally “This piece of code would not properly execute when I sat down this morning. Now it runs like a bat out of hell.”

I’m happy to be in the business of solving problems. I’d rather be a John Cusack than a Bill Murray. And all it takes is a computer.

Posted in Business, Code | Tagged , , , , , , , | Comments closed

Beautiful Moments in Programming: Phusion Passenger

 

Phusion Passenger (Modrails) Self-Installer

Phusion Passenger (Modrails) Self-Installer

Posted in Code | Tagged , , , , , , | Comments closed

Writing PDFs with Ruby on Rails Using Prawn and Prawnto

I’ve had the opportunity to spend the last few days working with the amazing Prawn Ruby gem and the equally stellar Prawnto Rails plugin., which allow you to dynamically create PDF files from a Ruby on Rails application. It’s elegant, fun, and stupid simple, and since I’ve never written a tutorial before, these libraries inspired me to crank one out.

In this tutorial we’re going to build an app together that takes user submissions for a cover letter, and their previous job title and description to print out for job candidates.

So let’s create a new Rails app.

Open up terminal and let’s do this thing. I’m calling my app “resume.”

rails resume

Great. Now let’s use Rails scaffolding to create the foundation for our app.

Change into your app’s directory:

cd resume

and let’s get our scaffold on.

For our purposes, we’re going to have a form asking the user to paste in their cover letter, type the name of their previous employer, and a description of the work they did there.

./script/generate scaffold Submission coverletter:text previousjob:string description:text

Remember to migrate your database and we’ll run the development server to be sure everything’s working.

rake db:migrate
ruby script/server

Now if you navigate to http://localhost:3000/submissions you should see a very basic looking page to start working with.

rails scaffold

Awesome, now let’s open up our IDE and do some configuring. The first thing to note is that the 1-2 punch of Prawn and Prawnto will not currently work with Rails 2.2. I’m sure support is just around the corner, but just for now to be safe, let’s open our environment.rb file and roll back to Rails 2.1.

resume/config/environment.rb

Found in resume/config/environment.rb

Let’s hop back into terminal and install Prawn and Prawnto.

sudo gem install prawn
./script/plugin install git://github.com/thorny-sun/prawnto.git

And open resume/config/environment.rb again and configure the Prawn gem dependency:

Found in resume/config/environment.rb

Found in resume/config/environment.rb

And here I always migrate my database once more to make sure things are working.

Awesome. Now prawn and Prawnto are installed and we can start kicking ass.

Let’s open up the Submissions controller in app/controllers/submissions_controller.rb.

For this tutorial, we want to have PDF views for both the list of all submitted resumes as well as a PDF for each individual one. We’ll do this by editing both the index and show methods in the controller to render PDF. Luckily with Prawn and Prawnto this is as simple as rendering any other format.

We simply type:

format.pdf { render :layout => false }

In the respond_to block so the index method looks like this:

Found in app/controllers/submissions_controller.rb

Found in app/controllers/submissions_controller.rb

And the show method looks like this:

Found in app/controllers/submissions_controller.rb

Found in app/controllers/submissions_controller.rb

Now let’s move on to creating our PDF views. For the index view, create a file in app/views/submissions called “index.pdf.prawn,” and for the show view a file called “show.pdf.prawn” in the same directory.

First, let’s just make sure it works. In index.pdf.prawn, simply type:
pdf.text "Hello World!"

and save the file.

Now, if you navigate your browser to http://localhost:3000/submissions.pdf, you should get the familiar PDF browser action:

And the resulting PDF should read as you might expect:

Awesome. So now let’s customize it to our app.

In app/views/submissions/index.pdf.prawn:

And in app/views/submissions/show.pdf.prawn:

Sick. Now fill in some dummy information to your app and navigate to: http://localhost:3000/submissions.pdf which should print a PDF of all submissions, and http://localhost:3000/submissions/1.pdf which will print out a PDF of the submission with the ID 1.

Congratulations!

From here there’s a million directions you can go:

Exercises:

Beginner: Trick your users into submitting false resumes. Use their submitted data to print out Madlibs-style resumes and cover letters.

Intermediate: Use a Rails plugin like Paperclip to allow user photo uploads and print the images to a PDF.

Advanced: Work with the Prawnto team to patch the amazing plugin to Rails 2.2!

Posted in Code | Tagged , , , , , , , , | Comments closed

First in a Series: Beautiful Moments in Programming

 

Django's Abstraction of SQL

Django's abstraction of SQL

 

 

Django’s Pythonic SQL abstraction is a beautiful sight to behold.

Posted in Code | Tagged , , , , | Comments closed

So what’s the deal with those Twitter charts, anyway?

Twitter Clusters

Twitter Clusters

A couple of nights ago I posted some Twitter charts, the most interesting of which is reposted to the left (click to enlarge).

What you are looking at is a dendrogram of the people I follow on Twitter, sorted by their use of English. Dendrograms are great for showing off the results of a clustering algorithm, which is exactly what I wrote in Python, from examples found in Toby Segaran’s exquisite O’Reilly book, Programming Collective Intelligence.

Essentially, I ran the script for this example across the RSS feeds of the 88 or so people I follow on Twitter to analyze each user’s use of English words, any repetition in subject matter, and visually cluster them with other people who are talking about the same sorts of things.

The result? Stunning.

After tweeting the link to this image, several of my followers began checking out people they were clustered near and discovering more interesting people for themselves. In short: it worked. Surprisingly well.

With few exceptions, the clusters of people broke down by points of interest to the point that made my jaw drop (even if I was a little overenthused).

Just for some context, @darcyyy, @hilarywalker, and @monikamagdalena, all clustered together, are my best friend from high school’s girlfriend, my best friend from college’s girlfriend, and my girlfriend. @darcyyy and @monikamagdalena know each other, @hilarywalker and @monikamagdalena know each other, but @hilarywalker and @darcyyy have never met.

The perfect algorithm would therefore have put @monikamagdalena in the middle. But would it? Both @darcyyy and @hilarywalker have recently joined Twitter, both to “see why their boyfriends have so much fun on the internet.”

Impressive.

I myself (@bryanwoods), am in a distinct cluster with @robertjwhitney (longtime friend and coworker here at the Colab) and @elliottt, a mutual friend of ours from college. No, we’re not talking about college, but the algorithm knew we had a lot in common anyway. The bond runs deeper than our education and manifests in language.

In the bottom right quadrant you’ll find the “Land of the Bloggers,” with the NYC tech and shakeshack-meetup group slightly above them.

I could go on for every single person, but needless to say I was impressed.

And while I want to give all the credit to the Python code that executed the script, that would be silly, since there’s a reason I ran it over the people I’m following on Twitter, instead of an arbitrary list of blogs or even my Twitter followers.

Twitter is the only web service on the internet right now that forces a regular user to really open up and begin discussing their true thoughts, opinions, beliefs, goals, values, etc. It’s why it’s beautiful, and it’s why it’s the first step toward The Great Entertainment which I will be addressing in future posts.

Think about it. I might list myself on Match.com as a lover of moonlit beach walks or on Facebook as a thought-obsessed hater of the genocide in Darfur, but it will only take a few days (at maximum) on Twitter to reveal whatever my true passions are (in my case, staying inside, drinking coffee, iPhone/Rails development, and–in the biggest “wow” for me–daily musings on “what kind of day” today is).

Not completely different from how I list myself on Facebook, but therein lies the important difference of How I Want Others To Perceive Me and Who I Actually Am.

So before I thought too much of it, I added my Twitter followers to the mix, and it totally skewed the results. I thought of a million reasons why the algorithm wasn’t good enough until I realized why software is still in its infancy:

The best Python script in the world is still computer code.

It can be beautiful, elegant, and efficient, but it cannot replicate human behavior.

It’s important in this case, because at least 50% of the people who follow me who I don’t reciprocally follow back are only following me for alterior motives. They’ve got a blog to peddle, a marketing career to manage, a “social networking personna” to lend credibility to, etc.

The other 50% of my followers who I don’t follow back are people I naturally find to be boring, or at least not interesting enough to have flood me with thoughts throughout the day.

Sorry, but it’s the case.  And that’s important, too, as this algorithm could only work across a list of a subset of people who have something important in common.

And the important factor here, of course, is that my following list is “A List of 88 or So People Bryan Woods Happens To Find Interesting Enough To Read Mass Amounts Of Micro Messages From On A Daily Basis.”

Quite a niche market indeed, but it’s precisely why the results were so beautifully accurate.

Which is exactly why, then, that while I was hoping to build a Twitter friend recommender, it dawned on me that making one would be totally impossible.

How can I expect the unexpected? How can I script the unscripted? How do I know who’s interesting and who’s boring?

Surely there are as many (if not more) rails-addicted freaks who I find boring than I find interesting, so how do I filter them out?

I’m not sure I can, which is why I’m happy how it turned out just the way it did.

Let me know if this chart has helped you find anyone interesting.

Facepalm

Facepalm

Posted in Art | Tagged , , , , , , | Comments closed

We need an open source iPhone community like, now.

Recently I’ve downloaded a few iPhone applications that have used the UITableView in ways I could have never even imagined. Really classy, brilliant interfaces that make using the software a real delight.  Check out Tweetsville, Facebook, and Twinkle to see what I’m getting at.

Tweetsville in particular is outstanding. The amount of work Ed Voas put into getting the scrolling right and the little thought bubble embellishments is a real inspiration.

I want to do something similar with an application I’m working on for the Colab, but scattered blog posts aside, getting up to speed on creating these kinds of pimped-out interfaces is real work, and it needn’t be.

Now that Apple has lifted the NDA on iPhone developers, I figured there’d be a wealth of not only books, tutorials, blog posts, and screencasts, but also real open source projects to hack on by now. This could not be further from the case.

I think the reason for this is pretty self-explanatory, albeit two-fold.

  1. The iPhone SDK itself is not Open Source
  2. The App Store offers a built-in business model

And while both of these points are undeniably true, their unessecary impact on open source code projects is truly baffling.

As for the iPhone SDK itself not being Open Source, it certainly doesn’t cause the welcoming, hack-me-into-submission community we’ve come to expect in our web frameworks, but it’s truly inconsequential. Sure, you don’t see the same amount of Open Source contribution in the .NET community that you see with Rails, but the barrier is entirely mental. If you want to Open Source any code you’ve written, you have that right.

So onward to the second point. The point about the App Store offering a built-in business model. I’ve already argued that this is not only revolutionary but potentially the biggest deal in software that exists today, but you might want to grab a chair for this one, because I’m about to blow your mind.

CHOOSING TO GIVE AWAY YOUR SOURCE CODE DOESN’T MEAN YOU CAN’T CHARGE FOR THE PRODUCT.

It’s one of those truths that is so obvious it’s almost not worth saying, but just think about how deeply it runs throughout every software community.

If Ed Voas was to contact me tomorrow with full source code of Tweetsville, there are several things I would do with it.  First, I would open it in XCode and see what does what. Second, I would start tweaking it to see what works and what doesn’t. Third, I would import the parts that are helpful to me into the project I’m working on and get the two pieces glued together. Fourth, I would save the project and blog about how Tweetsville is the best iPhone app in the world. Fifth, I would blog about what I learned, tar up my project, and share it with you all.

What I would not do (and what I seriously doubt anyone else would do) is slap a new logo on Tweetsville and try to undercut him on the App Store, just as you don’t see anyone taking the Open Source Wordpress iPhone project, rebranding it, and selling it for 99 cents as “iWordpress.” It’s a totally unjustified fear.

Sorry to single out Ed here, but it serves an example for my needs.

The fact is, you can only learn so much from tutorials. But even if we reach a point where there is a wealth of information to get you going on the iPhone, what begins to happen is a natural chasm between newbie tutorials and advanced brainmelting information.

Most people who want to get serious with any software framework want to spend most of their time in the middle, and that’s the place where real projects are the most beneficial.

So what do we do, then?

This is the real meat of what I’m trying to get at, and to be honest I’m not entirely sure.

I’m totally willing to set up and even initially front the bill for any kind of solution we can think of to mend this chasm.

Is it something as simple as an IRC room? A message board? A God damned iPhone app? Something over-the-top complex?

I really don’t know, but the moment we figure it out and set up a place where creative Open Source hackers are not only encouraged but expected to trade back and forth full working projects is the day we begin to see a huge shift in the evolution of iPhone software.

And since we’ve found our business model, we don’t have to be all punk rawk about it either. If five dudes want to use whatever resource we come up with to go 20-20-20-20-20 on a paid application, more power to them.

But right now we need to trade source or it won’t happen.

If you’ve got any bright ideas, twitter me, and if you know of a community starting up like I’m suggesting, let me know so we can join forces.

Posted in Code | Tagged , , , , , , , , , , , , , | Comments closed