Thursday, August 30, 2012

Opinionated

o·pin·ion·at·ed
Conceitedly assertive and dogmatic in one's opinions.

con·ceit·ed
Excessively proud of oneself; vain.*

I'm not sure who first used the word "opinionated" to describe a software framework in a positive light, but I know the place I encounter it most often is in reference to Rails.  The good news is, I bet DHH fully understands the meaning of these words, and is still more than happy to identify by them.  At least he knows what he's doing.  But I still think this is a stupid thing to be proud of.

Unfortunately, writing "opinionated" code has since just become the thing to do.  And I don't think most people who have jumped on that bandwagon bothered to look it up in the dictionary first.  As a result, I now have the impression that when someone says their framework is opinionated what it really means is they're claiming it's general purpose, but it really only works in a very specific scenario, and they don't even understand that other scenarios exist.

Imagine you're walking down the aisles at Home Depot looking for a tool to help you complete a job.  Maybe you need a drill bit extension to reach into a tight corner.  You have a certain kind of drill that accepts standard shaped bits, and your corner has certain dimensions, and you need to set a certain diameter screw.  A helpful sales associate comes up and asks if he can help.  You give him a quick high level summary, and he smiles knowingly.

"What you need is the XYZ fixed flexible dongle attachment!  It's the only choice.  All the other options are total bullshit, I can't believe we even stock them."  He's kind of starting to foam at the mouth now...
"Believe me, this is the one."

OK, you think.  It costs 3x as much as the other items on the shelf, but this guy clearly knows what he's talking about.  You get it home and come to find, it doesn't fit your drill because it has a non-standard bit shape, it doesn't fit your bit because it's built for larger bits, and it's too short to reach into the corner anyway.  And what does the guy say when you take it back to return it?

"Oh, well, this is an opinionated drill bit extension, it's not meant for your job."

Code that does one well understood, well defined thing, is exactly what I want.  But misunderstanding that well defined thing and advertising the code as the solution for everything is stupid.  And being dogmatic and conceited about it isn't helping anyone.

* Definitions from Google

Sunday, August 19, 2012

Blogs are Little Islands

You are not blogging enough. You are pouring your words into increasingly closed and often walled gardens. You are giving control - and sometimes ownership - of your content to social media companies that will SURELY fail.  - Scott Hanselman, Your words are wasted
I enjoy blogging.  I've been doing it since April of 2007 (that's 5 years at the time of this writing!).  For me, it's a great way to work through problems and ideas.  It's kind of a "learning out loud" thing.  And lately, it's been just a way to have some fun with writing.  That's why I'm still doing it, but it's not why I originally started doing it.

I first got into blogging because I wanted to be a part of the community of tech people who were on the interwebs learning from each other and arguing with each other.  That didn't happen, because it turns out a BLOG is not a community.

Blogs are little islands, owned by little dictators.  They've all got large towers built right in the center with mega phones mounted on top, and they're shouting out to sea.  

There's this weird aggregator of shouts out there somewhere, we call it Google.  It archives your shouts, so people searching for a solution to a problem can have a chance of finding the echo of something you yelled long ago.  Of course, that echo has been bouncing around for awhile, and it's probably not terribly accurate any more.  Because of that, we don't shout solutions to problems any more, we do that on StackOverflow now.

But we're all still shouting, so it must be because we want someone to shout back.  But if you even hear my shout, and if you do bother to shout back, the chances I'll hear it are slim.

So instead, maybe you'll fly by my island and drop a leaflet on the beach.  I might pay attention to that, and if I do, I'll leave a leaflet for you on my beach in response.  But you'll never see it, it's my beach and you're not there.

If we're really going to talk, you'll have drive your boat over to my island and stay awhile.  But what a big decision that is for you!  Why would you spend your tourist dollars on my island when there are so many other islands to choose from?  And some of them are much larger, and have many more tourists!

Every island starts out abandoned, with just a lone dictator.  If that dictator is willing to shill for tourists through aggressive marketing, he might attract a bit of a crowd.  But the dictator will still be the dictator and the tourists just tourists.  That's not a great format for interesting conversation...

The little islands model just isn't conducive to building community and having great conversations.  Twitter isn't either, but for different reasons.  And Facebook?  Well it's Facebook.  G+?  *cricket cricket*.  If there's a solution to this problem I don't know what it is.  But I'm pretty sure the solution isn't blogs.

Steve Jobs on Experience

"A lot of people in our industry haven’t had very diverse experiences. They don’t have enough dots to connect, and they end up with very linear solutions, without a broad perspective on the problem. The broader one’s understanding of the human experience, the better designs we will have.” - Steve Jobs, Wired, February, 1996

Monday, August 6, 2012

Chores

I was thinking about chores today.  Maybe a strange thing to spend much time thinking about, sometimes your mind wanders to weird stuff when you're not paying attention.  Anyway, I was thinking about chores; specifically household chores.  You know, stuff like:
  1. Vacuuming
  2. Doing the dishes
  3. Unpacking the groceries
  4. Taking out the trash
  5. Putting stuff away
These chores kind of fall into a few different categories:
  1. Regularly recurring (trash)
  2. Sporadically recurring (groceries, dishes)
  3. Uncompelled recurring (vacuuming, putting stuff away)
With regularly recurring you have to take out the trash on trash day, every trash day, on the same day every week.  Sporadically recurring is, well, sporadic.  Some nights there aren't any dishes to do.  But when there are dishes to do, those dishes have to be cleaned.

But uncompelled recurring is different.  There's no fixed external requirement that forces you to vacuum the floors, or clean all the stuff off the coffee table.  You could do these things on a regular schedule, but that would simply be your option, it's not an innate requirement.  And unlike the sporadically recurring chores, the line at which the chore must be done (the dishes are dirty) is not as clear (the floor is dirty?).  How dirty does the floor have to be before I *have to* vacuum it?  How much stuff must be laying on the coffee table before I clear it off?

I'd like to illustrate another interesting thing about the uncompelled recurring category with a story.  When I was growing up, my dad used to harp on my brother and I about putting stuff away after we'd used it, especially tools.  This was one of those classic dad things, he NEVER put his tools away, but he'd be on our case to clean up our stuff.  One day we'd just finished some project around the house, and he was going into the whole "lets get this cleaned up" routine, but then he did something different than usual and explained why he was on our case about it.  He said was that he personally had the bad habit of leaving stuff out, which not only meant stuff was cluttered but also meant he could never find anything when he needed it, and he hoped that he could instill in us a better habit, which he wished he had himself, of keeping everything it's right place, so we wouldn't have the same trouble. And to this day, I'm pretty fastidious about putting stuff back where it belongs, especially tools.

I take a couple of things away from that.  One is, explaining your motivation can be a more persuasive and effective method than just telling people to do something.  But the one that's relevant to this discussion is that with uncompelled recurring chores, you don't have to wait for the chore to pile up and do it all at once, you can proactively do a little bit of the chore a lot.

Can you believe I just wrote a whole blog post about chores?  Ridiculous!  But my point is really simple, keeping code clean is a lot like keeping a house clean.  It's a chore, and different parts of it may fall into the same categories.  But I think it's clear that most code related chores are of the uncompelled recurring category.  That means there is no clear event at which the chore must be done (like trash day).  And there is no obvious state which forces your hand (like dirty dishes).  Which means it's all discipline.  But also means you can do a little bit all the time and stay fairly well on top of it.

To be honest, I think this a better metaphor than "technical debt."  Which is really too bad, because I hate doing chores.