Monday, February 13, 2012

The Heroes of Java: Ward Cunningham


The 12th part of my "Heroes of Java" interview series is somehow, let's call it special. It's not about an active member of the Java community in the sense of a well known evangelist, programmer or speaker. It's more about someone providing essential backgrounds in both methodology and tools for our daily work. And I am very glad to have him in the series.

Howard G. "Ward" Cunningham
Source: Wikipedia.org (CC BY-SA 3.0)
is an American computer programmer who developed the first wiki. A pioneer in both design patterns and Extreme Programming. He is well-known for a few widely disseminated ideas which he originated and developed. The most famous among these are the wiki (named after WikiWikiWeb) and many ideas in the field of software design patterns. He owns the company Cunningham & Cunningham Inc., a small consultancy that has specialized in object-oriented programming.

General Part
Who are you? (Describe yourself in max three sentences)
I'm a technologist, sometimes a CTO, sometimes a programmer. I'm best known as the inventor of wiki.

Your offical job title at your company?
I have a one-year position as Nike's open-data fellow. My official title is "Code for a Better World Fellow".

Do you care about it?
I like the title but often substitute "open-data" in the title since many of my colleagues are not familiar with the Nike Better World brand.

Do you speak foreign languages? Which ones?
I took Latin in high school. I remember how to conjugate one verb but I don't remember what it means.

How long is your daily "bootstrap" process? (Coffee, news, email)
My day starts early, maybe 5 or 6 am. Before I get out of bed I listening to news and features on BBC World Service. I skim Twitter at the same time on a tablet. Mostly I want to know what people are talking about. If I find something in Twitter that requires concentration I email it to myself using a separate account for the purpose. I don't have regular work email on the tablet. That would ruin the experience. By 7am I'm up, drinking good coffee, and starting to work. By 9 or 10 am I'm at a desk somewhere. I have several offices.

Twitter
You have a Twitter handle? Why? Or why not?
@wardcunningham User IDs were running around a million when I joined. That makes me an early adopter.

Whom are you following in general?
Mostly I follow influential friends along with past and present colleagues. I appreciate good links and a few words explaining why I should look. I follow Tim O'Reily even though he tweets too much. I've dropped Scoble who tweets too much too. I like him, but Tim finds better content for where I'm at right now. I worked with @built a few years ago. Reading him is like watching Portlandia.

Do you have a personal "policy" for Twitter?
I'm proud to have 15,000 followers. I pay attention to what they want from me. I'm more likely to be retweeted when I recall some agile history or write a witty critique of agile today. When I get too far from agile I see followers drift away.

Does your company restricts or encourages you with your Twitter ussage?
My employers have been impressed that I have so many followers. I might pass along something from a company just because they asked. But when tweeting, I think of myself as working for my followers, not for any company.

I don't often read Twitter at work. I try hard to make my work more interesting than Twitter. Here's a tip: You can "subscribe" to interesting people at work by being valuable to interesting people at work. Its how we networked before networks.

Work
What's your daily development setup? (OS/IDE/VC/other Tools)
I like TextMate and Gitx. I'm learning Sublime for all the reasons that TextMate geeks would make that transition. In ssh I type the same vi finger rolls I did 30 years ago. I know vim is, um, improved. Some day I'll learn what else it does. Intellectually I should love emacs but practically it just doesn't stick. What I use says more about where I've been than what is best.

I loved Smalltalk-80 for 15 years. That's the longest I stayed with anything. 15 years was 5 years too long.

I pay attention when people blog about git workflows. Git gives people a vocabulary to talk about complex social interactions. There is gold in those posts mixed in with all the gravel.

Which is the tool providing most productivity to your work?
I tote a MacBook Air. I screen share into a few other macs that are too heavy to carry or too hooked up with wires to be with me.

I like Sinatra though I'm drifting to Node. I still write 20 to 200 character perl scripts at the command line which I convert to indented script files only when I'm done with them. Bash continues to amaze me. I saw <( ... ) in use once and had to call my unix geek friends to find out how that could possibly work.

I'm studying d3.js hoping to be expert. D3.js has lots of small examples that do amazing things. I'm finding every line takes a lot of thought. Its good thought though. There are sound reasons why every line is the way it is and it is good to know those reasons.

Your prefered way of interacting with co-workers?
I love to pair program and will give it a try with anyone. I get bored if I'm in a mentoring role. Don't confuse pairing with mentoring. When pairing you can assume both people bring something to the collaboration. I'd rather find my colleague's strength or passion and learn from them as we go forward together.

I meet a lot of great people at conferences. I especially like smaller events: either local unconferences where I meet friends of friends or elite workshops with high impact people. I like to ask people what they learned recently that they didn't expect to learn.

What's your favorite way of managing your todo's?
I'd rather not leave #TODO comments in code. I've seen code where every line is clear about what it does and thereby invites the next programmer to do more.

I'll write three or four things to do into TextEdit without saving. If I reboot before getting back to them, well, I probably wasn't going to do them anyway.

I work in complex solution spaces. When there are many approaches possible the shortest path to exceeding expectations rarely goes through meeting expectations.

I admitted to my last employer that of the 7-habits of highly effective people I'd only mastered two or three. I was exaggerating. I've never read the book.

When my wife travels she makes check lists for me. Things like feed the cats and bring in the paper. Once she converted that to a computer printout. I made her switch back to hand writing. When I check off her hand written notes I feeling like I'm doing something for her. The computer printout ruined that effect.

If you could make a wish for a job at your favorite company: What would that be?
I wish I could have worked at Xerox PARC in the '70s but only if I could know then what I know now. I like the Wikipedia Foundation and am glad to be welcomed there.

Java
You're programming in Java? Why? 
I find Java libraries hard to grok but likely to deliver when you finally get into them. 2D Graphics, for example.

I once wired the Rino JavaScript interpreter into Eclipse to make a Greasemonky like extension system. It could even dynamically load Java modules when it discovered that JavaScript wanted them. Every hook I need was in the libraries and documented too. Java, Rino and Eclipse all deserves kudos of that sort of attention to details.

I have a lot of respect for the JVM. It provides a widely available platform with memory and process abstractions that has raised the general level

I will admit to being drawn to less demanding languages, ones where "hello world" can be written in one line, or maybe two.

I like to judge a language by the density of leveraged operations. Smalltalk code would do two or three leveraged operations per line. Perl does one or two. C does maybe one if it is written in the old K&R style, much less now. Java is down at the same level as C: two or three lines for every leveraged operation. That hurts.

What's least fun with Java?
If I can't get the paths right in a half an hour I give up and go on to something else.

I'm no fan of XML either. It seems overused in many Java systems. I like to say that JSON is a representation while XML is a career path.

If you could change one thing with Java, what would that be?
I wrote a class called TypeAdapter in FIT. It was suppose to be the stand-in for the universal format converter that I just assumed every big project would develop. I'm still annoyed that it was so hard to write and that so few people understood the value of collecting this responsibility into a single place.

What's your personal favorite in dynamic languages?
I'm liking CoffeScript, mostly because it makes JavaScript's callback-style tolerable.

Which programming technique has moved you forwards most and why?
I try to make code look like it was easy. That's a sure sign that I understand what a programming language or framework has to offer and I've applied it to my problems well. I like to know the power moves but want to show that I don't have to keep using them to get the job done. Most influential was a week long class I once took taught by one of Dijkstra's students. We were told that we would just look at beautiful programs throughout the week but first he would teach us how to appreciate them. You can get a hint of what that week was like by reading Dijkstra's Discipline of Programming.

Making a new language is the ultimate power move. There are lots of ways to do it. Get to know them all A switch statement inside a for loop makes an interpreter. When you write that, ask yourself: what language am I interpreting?

What was the biggest project you've ever worked on?
I spent four years on WyCash, the first commercial software I wrote after working ten years in research. Year four of WyCash development was just as rewarding in a design sense as years one, two or three. The source code was large enough that it broke the source code manager. We had to delete a few lines to add a few more. But it still felt small. That was something. Relentless refactoring.

Which was the worst programming mistake you did?
I admitted recently that I always felt bad that wiki ran as a single server with a single database. I'm working hard on Federated Wiki right now to set that mistake right. Lots of people suffer with wiki markup. Wiki markup might be a big mistake except that people suffer with every other alternative too.

I programmed a computer once where programming errors could burn out transistors. I made plenty of mistakes but managed to reset the computer each time before anything smoked.

In college I worked as a student consultant. I once helped a researcher rewrite their fortran program to use extended-core-storage. I'd just learned about extended-core-storage by reading computer manuals. I knew our mainframe computer had it and it would help. What I didn't know was that batch jobs weren't allowed to use extended-core-storage so the work I'd suggested was a waste of time. I never got over that little bit of ignorance. To this day I have trouble starting a sentence with anything other than "maybe".