[]RSS

About Archives Artwork Comic Contact Philosophy Projects Tags

HOWTO think about probems

[Comment]

May 16th, 2008 in Micro Blog

I’ve been meaning to write out my philosophy of software development for a while now. Over the years I’ve watched developers struggle to find solid ground when stuck in design, development, and debugging. They get stuck in what they believe about problems, and the related knowledge that would help them. And when they don’t believe that something can be solved, they make make it harder to find the paths that would get them there.

So if you find yourself swearing at your compiler, computer, or sacrificing chickens to solve difficult problems, then you’re missing a fundamental part of the reality of software: problems are simple once you believe that they are, and once you learn approach them objectively.

The laws (simplified for the impatient)

You (and I) suck. Plan for it. Expect it. Get over it.

It’s a humility thing. Be open to the possibilities, including you’re own fallibility.

The laws (extended mix)

  1. Every problem can be solved, and most are solved already. Solid ground exists, it can be found, it has been found, and it’s usually easy to find. If you don’t believe that a difficult problem can be solved, then you’re missing something. Step back and look for possibilities, and test each theory carefully.
  2. There aren’t just possibilities, there are many great possibilities. If you can’t see more than one way to approach a problem, then you’re not looking hard enough. If you can’t see any possibilities, then you need to know that you are wrong. There are always possibilities.
  3. Software and hardware are deterministic. Have you found a problem that appears to be intermittent or flaky? Relax, you just haven’t discovered the cause or understood the underlying mechanism yet. Focus your tests, and look for a simple, plausible explanation: it’s there. If you think you’ve found something non-deterministic, then expect that you’re wrong and keep looking for answers.
  4. It’s your fault, until it isn’t. Have you found a compiler bug, a CPU flaw, or a library issue? You’re probably wrong. It’s not that it doesn’t happen, it just doesn’t happen very often. Be absolutely certain before you’re willing to believe that it’s not your fault. It’s much more likely to misunderstand syntax, usage, side-effects, and such, than it is for well-vetted tools to be broken. If you can’t prove it, then you don’t understand it well enough.
  5. Study history, as it’s almost always smarter than you are. There’s a whole universe of thinking that exists outside of your head. Until you realize this, you’re going to bang your head needlessly. Don’t be stupid: look around you, and know that many people are intelligent. If you believe that everyone is an idiot, then you really only know yourself.
  6. Your intuition isn’t as good as you think it is. Or as a friend says, “Always, always measure, ” and “Do the arithmetic.” Even when you’re sure that something is true, it’s doesn’t mean anything until it’s proven. Test it. Measure it. And make sure you’re looking at it in isolation of other changes. If you fix it by chance, then you’ve lost a critical piece of learning. Go back and figure out what the underlying truth was, or it will bite you again and again.
  7. Your code isn’t as good as you think it is. No, really, it isn’t. Neither is mine. And that’s just the way it is. Learn to accept your flaws, and the experiences of others. And if you think you’re the best developer on your team, you’re wrong. The best developer is the one who realizes that they’re not the best.
  8. Leave yourself a trail. When you hit a particularly sticky problem, write down the possibilities and record your progress. If you try to do it all in your head, you’ll get lost. And sometimes the act of writing it down (or talking it out) will uncover the path, or at least uncover new possibilities. But mostly, writing it down will save you from wandering around in circles.
  9. RTFM. No really, read it. If you can’t solve a problem, and you haven’t read THE FUCKING MANUAL, then you don’t deserve to solve the problem in the first place. Newsgroups, forums, and wikis can help too. And if you’re stuck and not thinking, testing or reading, then you’ll stay stuck. And as likely as you’re wrong about something, TFM can be wrong too, so test what you learn carefully.
  10. And finally, Just f@ck!ng do it. Are you stuck in development because there’s something you don’t understand? You need to attack the problem and get it over with. There’s only so much to learn about any given problem, and it doesn’t happen any faster when you avoid it. Take small steps. Measure, test, learn, ask questions. You’ll find the solution more quickly when you stop wasting time throwing chairs.

Remember, if you don’t come to understand why things work the way the do (and how things often break), then you will run into the same problems over and over again. It’s always worth the time to figure out the fundamental truths in what we do: it will save time and prevent future pain.

SimpleDB, worth the effort?

[Comment]

April 24th, 2008 in Links

Ten reasons SimpleDB is over-hyped. I’ve been arguing some of the same points myself: losing the expressiveness of SQL (especially for aggregates) and the ease of developing with SQL is a huge factor to consider.

How not to develop applications

[Comment]

February 19th, 2008 in Links

Jakob Nielsen’s Top-10 Application-Design Mistakes. Read it.

Jorn’s top 10 tips for webloggers

[Comment]

December 20th, 2007 in Links

This isn’t one of those shitty b-list top10 lists, it’s Jorn Barger’s tips for new bloggers, street smarts for crafting better link posts. Jorn Barger is the alpha twitch blogger, logging links since 19971 in his brief, thoughtful style. 23

  1. Jorn has also been cutting code since the 60s
  2. RobotWisdom is the first real blog I read regularly, which has greatly influenced my logging style
  3. Sadly, his main site still doesn’t have a RSS feed

Webkit 3.10 features

[Comment]

November 15th, 2007 in Links

A top10 list of Webkit 3.10 features. It will be very cool when webkit is usable in a native Gnome browser.

Six things that Windows does right that Linux still doesn’t

[Comment]

October 9th, 2007 in top10

brainAs a follow-up to last year’s top10 list of things Linux does well, I figured I should write about what the Windows platform does right.

And as I’ve said before, I’ve been developing software for Windows and *nix on a daily basis for more than a decade. I’ve also used OSX (and earlier), WinCE, PalmOS, and many other operating systems. Each system has things that work well, and each has things that will suck the life out of you. Looking at the differences is a great way to learn about what works and what doesn’t.

Note to Digg readers: Windows succeeds as a platform because it’s everywhere, and it’s easy to build software for, something that’s only possible due to their great vendor support (and chair-fueled monopoly). And while Linux vendor support has improved vastly in the last 10 years, it is still no match for the base Microsoft has built. So what? Linux will get there (and it’s my home platform), it’s just not there yet.

What do I think Microsoft Windows does well?

  1. Snappy application startup and windowing. I dual boot most of my systems, and on equal systems (with reasonably optimized packages) Windows beats Linux hands-down in general snappiness (outside of older tools like vim). Recent Linux distributions have improved a lot, but they still lag in snap (especially startup times, window resizing, etc.). This goes for both KDE and Gnome applications. My definitive test? Firefox on both platforms: 250ms on WindowsXP, 1.5s on Ubuntu 6.10. This is partly a Gnome problem, partly an XFree problem, and partly a gcc problem. And if you haven’t noticed the difference, try measuring it yourself.
  2. 3d and wireless drivers. Hands down, most hardware vendors support Windows best. Linux still wins with most of the tangent hardware (printers, scanners, nics, etc.), but it tends to fall on itself with the proprietary mess of new-fangled 3d, capture, and wireless hardware. Some vendors like NVidia have improved their Linux support greatly (and I actually prefer NVidia’s newer XFree driver package over their Windows package), but in terms of support and performance, Windows XP’s vendor support has Linux beat.
  3. Stable ABI and APIs. While the Win32 APIs are a mess, they are binary stable. The nature of Gnu and OSS prefer source-stable APIs (which is also good). Binary compatibility, though, is handy for writing commercial software. Yes, commercial software can be written for Linux, but it makes more sense to release sources on Linux than to aim for widely-compatible binaries.
  4. Games. I’m not a PC gamer, but if I was XP (or 2k) would be the place to do it. Personally, I prefer my hand-held and console games.
  5. Specialty applications. Software development of nearly any specialty software is still cornered in the Windows market. We’ll all be happy when these vendors start supporting Mac, Linux, and web platforms, but that’s still years off. Until then, most people need to keep a Windows machine around. It’s not that custom Linux applications aren’t possible, it’s just that they’re so pervasive in the Windows world: every shop I’ve consulted at has a handful of custom applications that are Windows-only, and no longer maintained. This makes it very difficult for businesses to consider switching away from Windows.
  6. Browser plugins. Flash, for example, even on the newest Linux distros will stop working after a few months of updates (or may not work at all for some architectures). This is especially annoying now that Flash is actually useful, as sites like uTube and Google video use it to package video online. To contrast, I’ve never seen plugins stop working in IE or FireFox on Windows. Flash on Linux has lagged behind the other platforms too, and is not available for 64bit builds of Firefox.

5 ways to be totally unproductive

[Comment]

March 26th, 2007 in top10

brainHave you ever had one of those days filled with email, IM, and office debate, where none of it gets anything done? Communication is useless on its own–if it isn’t metered, focused, and intelligent. A lot of what slows us down is due to simple, standard corporate ways of doing things. But just because it’s common doesn’t mean that it’s productive.

So in that vein, here are five ways to be totally unproductive.

1. Passively ask for help

“Who would be responsible for managing EULAs?”

When you ask for something passively, you’re really wishing that something gets done without requiring any of your own effort. You know that something needs to be done, but are too lazy to figure out the who, the what, or the how. It’s like you don’t even care if it gets done, but you know enough to cover your ass. The problem is that when you don’t care, things only sort of get done … if at all.

So say what you want, and be willing to help it along. You do care, don’t you?

“Who wrote the EULA for the last release? Do they have time to update it, or should I?”

If you can’t say what you really want, then you don’t want it enough. If you’re not willing to do a bit of work to get it done, then you don’t deserve to have it done for you. Don’t be so lazy: your own success rides on the success of everyone around you.

2. Don’t give a real opinion

“I guess that feature would be nice.”

Do you want it or not? When you can’t say what you want, you’re doing a few things: wasting my time, making me think about what you’re saying, and forcing me to question your intelligence. When I ask you what you think, I actually want to know what you think and why. And if you really don’t care, then just say so.

“We need that feature, because of X. “

Say what you want and why; you’re not going to offend me. You’re helping me understand if something is important, based on your area of expertise. You do know what you’re doing, don’t you?

3. Respond with only opinion

“Whoever did it last time should do it again.”

This is another tool of the I-don’t-care-enough mindset. It doesn’t get anything done, and it doesn’t answer any part of what’s required to get that thing done. In fact it does nothing other than give someone more work to do. Hey, go and ask other people more questions.

“Joe should do it because he’s a ninja.”

It’s clear that you want to influence things, but you don’t have the time or energy to actually help. Your best bet is to either take a few minutes to do the leg work (and actually help), or shut up and save your breath. Either approach is better than adding noise to the problem.

4. Complain about something that’s really your fault

“Boy that company is retarded.”

There’s a complainer hidden deep within all of us. The complainer deflects responsibility, pollutes the thinking space, and brings down the team. Is it really someone else’s fault? I doubt it. Most of our failure is our own, and complaining about it certainly doesn’t get anything fixed.

“You know, we could have done better there. No matter, we’ll do X next time.”

Shut up and reflect on the problem. Study it. And learn from it. Then talk about it–only when what you plan to say has a chance of making people laugh, think, learn, or actually get something done.

5. Make fun of the complainers (meta complain)

“Ha, they’re not retarded, you are!”

Be careful when you mock the complainer, as they’re unlikely to hear you. You’re really just complaining too, which doesn’t change much. The mocking, while entertaining, is mostly spam in the work environment.

If you have to chastise the complainer, then make damned sure that you’re accurate and brief. If you fail to be either, your message will fall flat.

Even better than mockery: do something to prevent that thing from happening again. Show people how they can change, or put practices into place that encourage measurement and analysis. If you really want to improve things, then you’ll look for ways to help. And you’ll participate in the fixing.

6. (Bonus) Rant about the whiners, the complainers, and the spineless

Yes, I’m writing about a the lame communications I see every day. Yes, I’m wasting time. And yes, I’m complaining about it. But I’m making fun of the insanity in a semi-entertaining form. The problem is that I’ve never groked why the standard corporate culture cultivates such a meaningless, passionless, passive way of saying things. Frankly, I’m surprised that it works at all.

At least the whiners, the complainers, and the spineless offer us something great. They give us the opportunity to kick their asses, as it’s easy to say what you mean and do what you say.

Ten things Linux distros get right (that MS doesn’t)

[Comment]

December 30th, 2006 in Rants. top10

brainI use Windows and Linux every day. They’re both competent operating systems, each with reasonable applications and windowing systems. I find myself more productive on a Linux system, though, because of a few very simple differences.

So what are the differences?

  1. A useful terminal emulator. So what if it’s only useful for developers: I’m a developer. I like a terminal with capable cut-and-paste, tabs, and resizing.
  2. All-in-one application sources. Man, I love my apt (or yum, or distro-specific tool of choice). Finding and downloading applications for Windows is a crap-shoot in almost every way. I find this especially handy when building new systems: it takes far longer to build, update, and add needed applications on a Windows system than on most Linux systems.
  3. Cut-and-paste, and focus handling. Middle-click cut-and-paste is even more useful than middle-clicking a URL to a new tab, and XWindows does scroll-wheel window focusing right (scrolls the window under the cursor).
  4. Frequent, painless patches and new stuff, all the time. I’ve had a 3d desktop (compiz) and funky search (deskbar) for more than a year now (and I avoid the bleeding edge).
  5. Multi-desktops. Using a single desktop now is a lot like working at a grade-school desk: it’s just too small to be useful.
  6. Good, free tools. Like vim (or emacs). I know they’re old and crusty, but they both live and breathe text editing.
  7. No reboots. I rarely have to reboot a Linux system when patching. Windows is getting better about reboots, but they’re still too frequent.
  8. Open formats and protocols. My stuff (and my network) is mine, locking my stuff in proprietary, costly formats doesn’t work for me.
  9. No need for paranoia. I don’t like the anti-malware tax: the cost, the CPU cycles, and the wasted fear. Signed application bundles are a big part of how Linux gets this right: you don’t have to fear installing new stuff (the rest is in frequent patching and limiting possible damage).
  10. Respect. Don’t tell me what or how to do it: give me choices. And don’t treat me like a criminal, because I’m not.

Update - Someone dugg me, though the server is holding up well (thanks Dreamhost). Remember folks, top 10 lists are for fun.

Update - 2007 - Someone dugg me again. I guess Digg users have a short memory.

Also check out Three more things Linux does right (or that Windows does grossly wrong).

5 things I don’t want to see on your weblog

[Comment]

November 12th, 2006 in Rants. top10

flowerI don’t usually do the top-ten shtick, but I’ve seen too many horrible personal websites linked from , , and this week to resist. There are just a few things that you don’t do in a weblog (and satire is good for the soul).

#1 - Pictures of yourself

Your momma may like your mug, but it doesn’t add anything to your writing. In fact, your picture shatters any hope that I might imagine you as more interesting or intelligent than you are. Let your posts paint it, and stay hidden well behind the curtain.

It’s difficult to undo the effects of prejudice, especially when it’s the result of one of the lower-order inputs like sight and sound. Once I’ve seen your face, my subconscious draws its own conclusion. After that, anything I read is filtered through that picture and what my mind has made of it. And if you’re the average geek, the picture ain’t that pretty.

Let me decide if I want to see behind the curtain. If you decide for me, it’s going to take a lot of great writing to change what my mind’s eye has already seen.

#2 - Hubris (be yourself)

Don’t try to be too cool, too corporate, too fancy-shmancy, or too anything that you’re not. Figure out who you are and write from that. If you’re not honest, I’ll see it and move on.

Advertising is another hint of hubris. I know that you have to pay the bills (don’t we all), but don’t be greedy. If the ads hinder your content, to the left, right, and everywhere, I’ll curse you for your arrogance. If you want to make more money from your site, here’s a hint: write more, and write better — or be creative.

A noisy site is another sign of an inflated view of self. I think it’s cool if you work on other stuff. I’m interested in the things you’ve read. But don’t push it in my face all at once: it’s loud and it’s abrasive. Just avoid the noise. A front page full of dozens of different things doesn’t highlight any one of them well.

Be balanced, be humble, and be yourself. Everything else just gets in the way.

#3 - Ignorance (duh)

I know that we’re all learning, but there are a few sins of ignorance that I find especially repulsive. I wont stick around long if all I find is sloppy, ignorant, senseless drivel.

To start, you need to write clearly and correctly. Bending the rules can be fun, but IM-speak or plain-old lazy writing is just lame. Learning to write well takes time and effort (I’m still just a hack), but if you want to be widely read then it’s a requirement.

Your reasoning needs to be sound too, or at least interesting. A good rant is golden, but a rant rife with logical fallacy is painful to read. One you can write clearly the holes in your thinking become apparent. Fill in the holes (or be more creative), and people will find your writing more interesting.

#4 - Stolen, crappy, or ugly content

Blatant dishonesty is worse than arrogance, and presentation (while superficial) makes the first impression. If it’s not yours, if it’s crap, or if it makes my eyes bleed, I will never be back.

I’m always up for a good 101 Reasons Ruby Sucks rant, but only if the writing is clear, the reasoning is balanced, and it all makes sense. A good rant is useless if you don’t know what you’re talking about. An incoherent rant is even worse as it’s unbearably annoying. And any rant rendered in #0F0-green on black with comic-sans will make me run screaming. It doesn’t have to be beautiful, but it does have to be readable.

Due to the magic of , I skim thousands of posts monthly. I’ll k-line you as soon as I see link-jacked or lifted content. I’m only interested in original content, so if it’s not yours then why return to your site?

Link logs are cool if you add something to the links, and you make it clear that the stuff is located elsewhere. Never make me click through the RSS to your site just to get at the links, as that’s an obvious cash-grab. And always give credit where it’s due, especially when it’s from another blogger. Links are a dime-a-dozen and I’m only going to return if I see something unique or interesting.

Learn to write well. Learn to reason well. Learn to find the interestingness in your opinions. Find a clear, simple presentation. Do that, and I might just read your site every day.

#5 - 404s, server-down, and bandwidth exceeded

I love to read, but I can’t read what I can’t see. I don’t care if your server has gone down in a huge ball of flames, or if your webhost is holding your offspring hostage for payment: keep the site up. Good hosting is cheap, as is reasonable weblogging software.

And don’t submit your site to the major aggregators unless you can handle it. It used to be funny when a site was , but now it’s just sad. If you wan to play with the big boys, be prepared for it.

Killing our language

[Comment]

September 30th, 2006 in Rants. Weblog

This is the first part of an ongoing look at how corporate culture is eroding our language. Corporate munging of our language offends me, mostly because it’s so un-artistic, and evasively dishonest.

Today’s word: Leverage. Here is its common, annoying usage:

Leveraging the latest in browser and web technologies …

Beef #1 - Cover your ass

This use of leverage applies the passive voice — a voice that removes the attribution, ripping the people or purpose out of the phrase. Writers usually do this to cover their ass. If you don’t imply that someone has done something (or say what was done) then you can’t get fired for it.

By blurring blame and responsibility we can hide or exaggerate meaning. And the possibility of dishonesty is the likelyhood of it, so the construct is often misused. It lets us get away with stretching the truth.

Beef #2 - Meaning(less)

Leverage is a weak, lofty replacement for “uses” ( or “uses to advantage”). The above phrase could be reworded:

Using the latest in browser and web technologies …

But even when we remove leverage from the mix, the sentance is weak. It’s horribly vague. Which technologies does it use? Why do we even care? And while the vagueness allows room for dishonesty, the greater crime is its bland weakness.

The gray vague of unsympathizing sea. — Lowell

Inspire me

This use of Leverage is uninteresting, pompous, and muddling. We have such a rich language, why would anyone want to choose the least useful way of using it? And people writing about products should be especially wary of weak language: if they don’t inspire or interest us, they will be out of work.

Next page [>>]