Nov 25 2009

Quotable DHH 2009

David Heinemeier Hansson, commonly referred as DHH, is a polarizing programmer with a self professed fucking potty-mouth. He is opinionated and uncensored. He is a world renowned hater, he hates big enterprise software, large startup valuations, and apple pie. The web development framework he fashioned after himself is as opinionated and know-it-all as he is. From Wikipedia…

Hansson is known for the crude and brutal way he expresses his opinions; both online and in real life. One of the main criticisms of Hansson has been about his and his company’s arrogance. Hansson, however considers these criticism unfounded and in fact he openly acknowledges and embraces the arrogant claim made for him.

Over the last year I have collected a few choice quotes from DHH’s keynotes, blog posts, and twitter updates covering a range of topics such as programming, enterprise sotware, and company valuations.

Constraints drive innovation and getting your idea out in the wild in two months instead of six will likely do you a world of good. A month or two out the gates, you’ll have a pretty good idea of whether you “got something” or not.
Entrepreneurs, Angels, and the cost of launch

The best frameworks are in my opinion extracted, not envisioned. And the best way to extract is first to actually do.
Why there’s no Rails Inc

Lines of code by itself doesn’t really mean that much to me. What you’re able to express in those lines mean a lot, though. So if you’re able to write the same piece of functionality in 10 lines instead of 100 lines you’ve made huge strides in simplicity. That’s part of the argument for why Ruby is a more pleasant language to work with than say Java or C#.
Talking Rails 2.0 with David Heinemeier Hansson

This is a snowflake… Your application is not one of them. For most of the time, for most of the people what they do is not unique. You are not special
Quote from DHH on ROR

In the beginning, there was no Rails, there was only Basecamp. After working on Basecamp for a while, though, I eyed the option of giving all the generic pieces a life of their own. But even then, I continued to work on Basecamp first. Which meant that all the functionality of Rails came as extractions of a real application, not of a “what somebody might need some day” fantasy, so prevalent in framework design.
Ask 37signals: The genesis and benefits of Rails

I’m certainly of no illusions that Rails is perfect nor that Ruby is a speed daemon.
Twitter trouble

When you work with open source and you discover new requirements not met by the software, it’s your shining opportunity to give something back. Rather than just sit around idle waiting for some vendor to fix your problems, you get the unique chance of being a steward of your own destiny. To become a participant in the community rather than a mere spectator.
Twitter trouble

Scaling is the act of removing bottlenecks. When you remove one bottleneck (like application code execution), you tend to reveal another (like database queries). That’s natural and means you’re making progress.
Twitter trouble

Requiring X years of experience on platform Y in your job posting is, well, ignorant. As long as applicants have 6 months to a year of experience, consider it a moot point for comparison. Focus on other things instead that’ll make much more of a difference.
Years of Irrelevance

One of the easiest ways to shoot down good ideas, interesting policies, or worthwhile experiments is by injecting the assumption that whatever you’re doing needs to last forever and ever.
Optimize for Now

PHP scales down like no other package for the web and it deserves more credit for tackling that scope.
The Immediacy of PHP

Bitching is such a succinct form of expression. It doesn’t require or usually entail deep analysis. It’s the easiest way to write something “interesting”.
Bitching is the killer app for Twitter

All odds are not created equal.
Startup School 2008

Often the simplest idea in the world, like treating your customers nicely, while still asking for money for what you do, can work. And you can build great businesses like that.
Startup School 2008

Forgoing sleep is like borrowing from a loan shark. Sure you get that extra hours right now to cover for your overly-optimistic estimation, but at what price? The shark will be back and if you can’t pay, he’ll break your creativity, morale, and good-mannered nature as virtue twigs.
Sleep deprivation is not a badge of honor

What separates programmers who are 10x more effective than the norm is not that they write 10x as many lines of code. It’s that they use their creativity to solve the problem with 1/10th of the effort. The creativity to come up with those 1/10th solutions drops drastically when I’m tired.
Sleep deprivation is not a badge of honor

Software development is rarely a sprint, it’s a marathon. It’s multiple marathons, actually. So trying to extract 110% performance from today when it means having only 70% performance available tomorrow is a bad deal. You end up with just 77% of your available peak. What a bad trade.
Sleep deprivation is not a badge of honor

I’ve always been a jealous person. I’ve always wanted things that others had. Skills they possessed. Authority they held. Success they enjoyed. But instead of feeling sorry for myself and growing spiteful of others, I found it to be the best motivation to imitate, adopt, and strive for the same rewards.
Productive Jealousy

Don’t let growth be your primary yardstick of success.
Finding the natural size for your company

How about you turn your perceived weakenesses into strengths. Embrace your constraints, work with limited budget of your own money and write less software.
It doesn’t have to be all or nothing with a startup

Average environments begets average work.
Average environments begets average work

No one can be a rock star without a great scene.
Average environments begets average work

So if you want your team to excel, quit thinking about how you can land a room full of rock stars and ninjas. Start thinking about the room instead!
Average environments begets average work

Do you value effort over effect?
Average environments begets average work

Humans are incredibly eager to live down to low expectations.
Average environments begets average work

Are you finding the root causes for your daily grind or does the wheels just keep spinning on the same issues?
Are you finding the root cause?

Aesthetics is a feature in itself.
There’s no shame in looking good

There’s absolutely no pleasing everyone. You can’t and shouldn’t try to make everyone love you. The best you can do is make sure that they’re hating you for the right reasons.
Work on what you use and share the rest

My core philosophy about open source is that we should all be working on the things that we personally use and care about. Working for other people is just too hard and the quality of the work will reflect that. But if we all work on the things we care about and then share those solutions between us, the world gets richer much faster.
Work on what you use and share the rest

I think the days of the traditional San Francisco startup approach are numbered. It’ll be flushed down the drain along with CDO’s and zero-down mortgages.
How did the web lose faith in charging for stuff?

Of all the terms I hate with a passion, “professional” would probably rank above “enterprise” and just below “potty mouth”.
@dhh

Speaking of presentations. I’d much rather we banished kung-fu kittens and went with beautiful women for the filler stock art. Works in ads!
@dhh

You’re bound to upset, offend, or annoy people when you’re not adding heavy layers of social sugarcoating.
I’m an R rated individual

Nothing is sacred in Rails, everything is up for debate.
Rails 3 and the Real Secret to High Productivity

When an advertiser is claiming something to be an “all-new” car/soap/computer/camera it usually means exactly the opposite. It actually hardly even means new, at best it’s most commonly just “marginally-new” or “just-a-few-tweaks-new”.
There’s nothing new about all-new

Focusing on just the newness of something is usually a pretty weak selling point.
There’s nothing new about all-new

Ideas on their own are just not that important. It’s incredibly rare that someone comes up with an idea so unique, so protectable that the success story writes itself. Most ideas are nothing without execution.
I had that idea years ago!

Just because you thought of a site to share photos with friends wouldn’t have made you Flickr.
I had that idea years ago!

Why does the idea of work have to be so bad that you want to sacrifice year’s worth of prime living to get away from it forever? The answer is that it doesn’t. Finding something you to love to work on seems to be a much more fruitful pursuit than trying to get away from the notion of work altogether.
Early retirement is a false idol

If you come to the realization that work in itself isn’t evil, you can stop living your life as a waterfall-planned software project too. No need to divide your timeline on earth into the false dichotomies of Sucky Work Era and Blissful Retirement Era.
Early retirement is a false idol

There’s nothing like the look of beautiful Ruby code in the morning. Gracefully colored by TextMate and rendered in Bitstream Vera pt 12.
@dhh


Nov 18 2009

Favorite Programming Quotes 2009

When I am not coding I am reading about code. Here is a short list of memerable programming quotes I read over the past year about the science and art of software development. Over this last year, my interest and reading habits have been related to software development, team leadership, and entrepreneurship and this quotes reflects those topics.

What we learned over several years is that the registry in the data center is an evil, evil thing.
Sriram Krishnan

No code is faster than no code.
Merb Core Tenent

Rails is the best framework for the 80/20 rule out there. It will get you 80% there faster than any framework, but it will fight you tooth and nail for the remaining 205.
Ezra Zygmuntowicz

Software: do you write it like a book, grow it like a plant, accrete it like a pearl, or construct it like a building?
Jeff Atwood

I will not break my back or my sanity on Windows troubleshooting any more.
Jamis Buck

Premature parameterization is the square root of all evil.
Sean McGrath

If you can’t be a chick magnet, be a porn magnet.
Zed Shaw

Piracy is a natural state of affairs for users with lots of time and no money.
Jeff Atwood

Every time DRM prevents legitimate playback, a pirate gets his wings.
Nathan Bowers

What ruby does offer is a more intuitive way of coding. Its form is simple. It’s full of grace. Ruby is succinct. It’s not the messiah of languages though it attracts many messiah-figures and their fanboy prototypes.
Renae Blair

I do believe I have post-traumatic Java syndrome.
Renae Blair

The thesis explicit in Crockford’s book (JavaScript: The Good Parts) and implicit in Conway’s (Perl Best Practices) 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.
Giles Bowkett

Frameworks like Rails make you fast, and Sinatra makes even Rails look slow.
Giles Bowkett

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.
Giles Bowkett

Instead of charging the going rate of $250, we decided to charge $350. Why not? I figured we could establish ourselves as having the premium product simply by charging a premium. In the absence of additional information, consumers often use prices to judge products.
Joel Spolsky

That’s another flaw with performance-based rewards: They are easy for one of your competitors to top.
Joel Spolsky

Longevity is a big part of credibility.
Jason Calacanis

People’s reputations are made in the bad times more than the good times.
Jason Calacanis

If you can’t sell your product, it’s not a product–it’s a hobby.
Jason Calacanis

I fear — as far as I can tell — that most undergraduate degrees in computer science these days are basically Java vocational training.
Alan Kay

Agile is not just about speed.
Jack Milunsky

I can’t choose whether someone is offended by my actions. I can choose whether I care.
Martin Fowler

Would you pay $100 an hour for an untrained accountant? Because if your consulting rate is $100 an hour and you do your own accounting, that’s exactly what’s happening.
Chris Wanstrath

So, what does it mean for teaching and learning programming when the solution to every beginner problem is available on the Internet?
Cay Horstmann

One of my most productive days was throwing away 1000 lines of code.
Ken Thompson

Deleted code is debugged code.
Jeff Sickel

Good software architects are like condoms… bad software architects are like Viagra.
Sidan

Nobody hates software more than software developers.
Jeff Atwood

Not all liquidity events are created equal.
Brandon Watson

Not all code needs to be a factory, some of it can just be origami.
_why

If you program and want any longevity to your work, make a game. All else recycles, but people rewrite architectures to keep games alive.
_why

I think Ruby is the next best thing after sliced bread and Common Lisp.
ivanstojic

The best way to market yourself is to be remarkable.
Chad Fowler

I rather raise nerds than raise gangsters.
The RZA

Not having a clear goal leads to death by a thousand compromises.
Mark Pincus

Chase the vision, not the money.
Tony Hsieh

Those that say it can’t be done, shouldn’t interrupt those that are actually doing it.
Michael Arrington

What it comes down to is that Rails developers are just that: Rails developers. They’re not software developers, at least not most of them. … Their framework dictates how their systems are designed instead of the problems the systems are designed to solve.
Samuel Tesla

If you are single and you want to do startups, stay single. Stay single for a while, startups can be all consuming 24/7 suck you dry.
Steve Blank

You can’t build everything and there is no more a killer feature. Everyone has a different killer feature.
Matt Mullenweg

I am the unhappiest WordPress user in the world, I think it sucks.
Matt Mullenweg

The biggest motivation is not the money but the impact.
Matt Mullenweg

If I’m on the titanic I want to be steering.
Matt Mullenweg

You don’t want to be the site that people should use, you want to be the site they can’t stop using.
Roelof Botha

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
Martin Golding

One man’s feature is another man’s complexity.
Juixe TechKnow


Nov 7 2009

Retweet October 2009

From time to time I just blast tweets about software development, project planning, team dynamics, or whatever else comes to mind. Here is a synopsis of recent tweets and rants. If you want to follow the conversation follow me at techknow and/or juixe and I’ll be sure to follow back.

Software Development

  • I can haz codebyte!
  • Hacks are in the eye of the debugger.
  • Is there a werewolf in your software, then why do you need a silver bullet?
  • I know HACK is a four letter word but it is not a bad four letter word.
  • It is okay to paint by numbers but its something different to code by numbers. I code by polynomials.
  • If it doesn’t matter either way, why not choose the option that is easier to implement, cleaner to design, and friendlier to use.
  • Content is the killer app.
  • They say those who can’t do, teach. Well, those that can’t create content, aggregate.

Team Leadership

  • The sooner you adapt, the wider your lead.
  • Don’t nickel-and-dime old business assumptions.
  • When leading the way, be sure to get out of the way. As a leader you don’t want to be a roadblock or bottle neck to the troops.
  • A manager should do two things: give precise tasks and expect precise results.
  • Don’t confuse opinion for advice, don’t confuse advice for a plan.
  • Even a detailed schedule can’t predict the future.
  • Sometimes schedules are another way we lie to ourselves.
  • Time does not run on a schedule.
  • A good skill is to identify the skillset of your team, a better skill is to improve those skills while leveraging them to the fullest.
  • Little baby steps add up to giant leaps for mankind.

Product Placement

  • In Windows, when you overwrite a file instead of replacing it without a trace, the OS should put a copy in the recycle bin first.
  • You can learn a lot about someone by taking a look at their FarmVille farm.
  • Is Twitter lists just another metric for users to have a pissing match on Twitter? If comparing followers wasn’t enough…
  • Why is it that installing ImageMagick is a longer and more painful process than upgrading OSX?

Self Dev

  • In certain task I am worth my weight in gold, in others I am worth my weight in lead, but I do my best to avoid tasks were I cost my weight.
  • Many people will ask for out of the box ideas, but they don’t want ideas too far away from the box, more like ideas hovering around the box.
  • It’s okay to have your cake and eat it to, as long as you bake the cake yourself…
  • Be a double agent of change.
  • On man’s problem, is another man’s opportunity.
  • Authenticity has no substitute.
  • Not failing fast enough is the biggest failure.
  • Failure is when you don’t learn from it.
  • You have to kill it to win it.
  • Fail frequently, fast, and furious
  • If I played baseball I would be the GM.

Questions

  • What is the opposite of a trophy wife?
  • Do you have a failure resume?
  • Is Facebook to big to fail?
  • How many tweets does it take to get a trend?
  • There are wrinkle free pants, when will we see tangle free headphones?
  • Which is best Happily Ever After or Happily Ever Now?
  • What does it mean to ‘trust the chicken?’
  • Do you have to sell out to get buy in?
  • If you are not passionate, who do you expect your team to be passionate?

Quotes

  • Good ideas are simple. – @jason
  • Money is the shortcut. – @garyvee
  • Great entrepreneurs don’t have better ideas, they have better process. – Eric Ries
  • Pay attention to pixels. – Bump Technologies Job Listing

Sep 10 2009

World’s Most Famous Developer Excuse

I have to say that the World’s most commonly used excuse is “it works on my machine“. Amongst programmers this excuse must rank up there with other famous excuses like “It’s not you, it’s me” and “sorry, I guess I didn’t get reception.” When ever I hear a developer explain away broken builds, compilation errors, or bugs with “it works on my machine” I usually answer with one of the following replies, depending on my mood.

  • Oh, are going to ship your machine to the client.
  • Do you want all of us to work on your machine.
  • Yeah, so fix it on my machine!
You Break It, You Buy It

You Break It, You Buy It


Aug 22 2009

Songs in Code

Programming related hashtags don’t make the top trend on Twitter. But last Friday night, when most people are out except geeks, the hashtag #songsincode made it to the top trends on Twitter. As of today, here some of my favorite songs in code.

Songs in Code

  • @juixe: if(self.getLikes().contains(BIG_BUTTS) && !self.canLie()) {other.getBrothers().deny(false); you.getFace().add(ROUND_THING); you.getSprung()} #songsincode
  • @techknow: Rhythm instanceof Dancer == true #songsincode
  • @techknow: 2.times do we_will end; rock_you; face :has => ‘mud’; disgrace you, big #songsincode
  • @anteaya: if “its” === 1999 then party; end #songsincode
  • @cessor: for(int i = 99; i >= 0; i–) { Bottle b = _bottlesOfBeerOnTheWall[i]; b.Pass(); } #songsincode #CSharp
  • @seeflanigan: Love.is_a?(Battlefield) => true #songsincode
  • @stewdio_org: return “that’s” + ( name.indexOf([ “girl”, “stacey”, “her”, “jane” ]) > 0 ? “” : ” not” ) + ” my name” #songsincode #tingtings
  • @malvim: try { me.go(“rehab”); } catch { return “No, no, no!”; } #songsincode
  • @bricriu: if (self.go() { return new Trouble() } else if (self.stay()) { return new Trouble().intValue() * 2} #songsincode
  • @projektdotnet: int main(void){get_your($body_beat); let_your(blood_flow); return 0;} #songsincode
  • @NescioPhone: try { margaritaville.Resolve(“Lost”); } catch (Exception woman) { Trace(this.Fault); } #songsincode
  • @brotzeitbrettl: for(int i=0; i==0; i=1) { we.celebrate(); oh_yeah.allright(); dancing.stop = false; } #songsincode
  • @chiihime: foreach (night in myDreams) { me.see(you); me.feel(you); }; #songsincode
  • @joestump: if (IN_YOUR_ARMS && TONIGHT) { die(); } #songsincode
  • @brentgarner: if($theEnd){$loveYouTake = $loveYouMake;} // #songsincode #beatles
  • @stewartyu: while(money++) { problems++; } #songsincode
  • @dustinfineout: if (time.equals(‘hammer’)) { this.touchable = false; } #songsincode
  • @kevinwo: hold($me, $close++, $tiny_dancer); #songsincode
  • @llemirtrauts: for(var oclock = 1; oclock <= 12; oclock++){rock();} #songsincode
  • @abachman: you.dance if you.want_to?; #songsincode
  • @dbrady: i == sky << eye; i.looking!(@you); i.authorized?(your.mind, :read) == true #songsincode
  • @zarkon: if (you.loves(somebody)) { them.set(free); } #songsincode
  • @llemirtrauts: @paynen [money, show, getReady, goGoGo].forEach(function(value, key) {key + for(value);});!stepOnMy(blueSuedeShoes); #songsincode
  • @jonrimmer: x = ‘Umbrella’; you.Permissions[‘StandUnder’] += self.GetPossession(x + x.Right(4) + x.Right(4) + ‘eh’ * 3) #songsincode
  • @jverdi: while(true) {if(!this.touch()) {echo “can’t touch this”;}}#songsincode
  • @tiemez: while(false){ self.giveYouUp(); self.letYouDown(); self.runAround(); self.desertYou(); } #songsincode
  • @mikemangi: function iWant(){ $rocknroll=’allnite’; $party=’everyday’; keepon($rockn); } #songsincode
  • @librarythingtim: if(!woman) { cry = false; } #songsincode
  • @motherwell: if(you.think(sexy) == true && you.want(myBody) == true ) { you.tellMe(so) } #songsincode
  • @TjoosDude: me.see(you.watch(me.watch(you))); #songsincode
  • @cameronhunter: (function( you ){ return you.getLove().matches(/bad medicine/) })() #songsincode
  • @tower10: @paynen function () { walk(this).way(); talk(this).way(); } #songsincode
  • @eviltabbycat: public interface egyptian {public void walk();} #songsincode
  • @frenchs: int *chicks = (int*)malloc(sizeof (int)); int *money = null; free(chicks); #songsincode #rusty_c
  • @joestump: if (HUMPTY_DANCE) { define(‘TRANCE’, true); do_the_hump(); } #songsincode
  • @paynen: (girls == boys).like(girls.do(boys.like(girls.do(girls.like(boys)))) #songsincode
  • @beenewilliamr: dc -e'[dsm1laxsr]sj[2/ljxlcxq]st[3*1+ljx lcx]sy[d1=qd2%0=td2%0!=y]sc[100P]sw[0P] se[q]sq[d1700!>qdlm%d0=w d0!=esr1+lax]sa28lcx’ #songsincode
  • @skatterbean: if not self.check(): self.wreck() #songsincode (thanks do @dreid for the bug fix)
  • @frenchs: if(!roxanne) { self::turnOnLight(self::RED); } #songsincode
  • @eegiffin: class HotelCalifornia { void checkOut () { canLeave=false; } } #songsincode
  • @ald: try { Britney.Sing(); } catch (Exception ex) { throw new Exception(“Oops”); } #songsincode
  • @herlifeinpixels: while you.find(me, indaclub): me.sipping(bub); if isinstance(you, sexylilthug): you.need = me.got; #songsincode
  • @dhinojosa: assertTrue(heat.isOn()) #songsincode #glennfrye
  • @llemirtrauts: [].push(“ah”).push(“good”).push(“real good”);#songsincode
  • @ara_p: roof.set(“fire”, true); #songsincode
  • @proxymoron: if(wantTo) { we = dance(); } friends = !dance(); if(friends != dance()) { we.remove(friends); } #songsincode

For some unexplainable reason, I found a lot of developers tweeted/coded the song Dude (Looks Like a Lady) by Aerosmith.

Dude (Looks Like a Lady)

  • @davglass: var Dude = new Lady();#songsincode
  • @jrconlin: @davglass Shouldn’t that be: (Lady) new Dude; ? #songsincode
  • @Slow3000: dude.setLook(Looks.LADY); #songsincode
  • @krigsi: LooksLike(“Dude”,”Lady”) #songsincode
  • @ptone: import dude as lady #songsincode
  • @clindh: looks == (lady)dude; #songsincode

I found these three variants of Jay-Z’s song 99 Problems interesting.

99 Problems

  • @brotzeitbrettl: echo count($this->problems) == 99; foreach($this->problems as $p) { echo ($p instanceof Bitch) == false); } #songsincode
  • @peterc: Okay, just one more: # problems.size == 99 && !problems.include?(“bitch”) #songsincode
  • @tome: en(problems) == 99 and “bitch” not in problems

Some songs, in code, by Michael Jackson.

RIP MJ

  • @techknow: dianna.setDirty(true) #songsincode
  • @pud: If (BillieJean.is != my.lover) { BillieJean.justa = ‘girl’; i = 1; } #songsincode
  • @RobertFischer: !my.isLover(billyJean) && billyJean.claims(my.theOne) && !my.isSon(theKid) #songsincode
  • @krigsi: if($Annie = ‘OK’) { SmoothCriminal(Hit) } #songsincode

Sep 17 2007

Twelve Elements of JavaScript Style

I’ve been reading a lot of articles and viewing many presentations on JavaScript. One of the most prolific writer and presenter on the subject is Yahoo!’s Douglas Crockford. I’ve recently rediscovered Crockford’s classic article on The Elements of JavaScript Style (part 2). Between these two articles Crockford lists 12 key elements of JavaScript style.

  • Avoid archaic constructions.
  • Always use blocks in structured statements.
  • Avoid assignment expressions.
  • Use object augmentation.
  • Use common libraries.
  • Watch out for type coercion when using ==.
  • Use the ?: operator to select one of two values.
  • Don’t use the ?: operator to select one of two actions.
  • Use the || operator to specify a default value.
  • Never use implicit global variables.
  • global variables are evil.
  • Use inner functions to avoid global variables.