Do you think you have peaked?

Not even close. 

30 years of programming and my best code has always been my most recent. I just keep getting better and better with no end in sight. And I love it. As far as I’m concerned, there’s absolutely no reason to believe the hypothesis of peaking and declining. Not me, that’s for sure, and not most of the people I know in their 40’s and 50’s. 

In this way, we are “not” like athletes at all. I remember watching Michael Jordan when he played for the Wizards, riding the staionary bike to keep loose during timeouts. What a pity, I thought, to be at the top of your game, then a shadow of yourself just 5 years later.

 We programmers are not like that. Just take care of yourself and you don’t have to level off until you would have anyway. All the new technology and opportunities keep the field fresh. And the people, too. 

Should I try programming if I’m not sure?

I’m not going to try to motivate you, because only you can motivate yourself. I’m just going to share my perspective that might shed some light on your issue.

I had the same problem in college until a fraternity brother who had graduated 2 years before told me something I had never thought of. He said, “You may never have a better opportunity to explore and learn new things. Once you settle down with a career and family, all your time will be spoken for. So try everything! How will you know who you are and what you’re interested in unless you experiment?”

Some of the best advice I ever got, and since I was a sophomore at the time, I tried as much as I could for the next 2 1/2 years. I still majored in math and became a computer programmer, but I did a lot of stuff that I simply don’t have time for today. And I miss a lot of it. Back then, I thought humanities was boring, but what I would give for a few days off to curl up with a good book.

Sometimes you can learn a lot about something you are interested in by doing something totally different. Reading literature might help you write code. Music may help you with math. Working at the mall or living in a fraternity house could help you learn how to run a business.

At this point in your life, you still don’t know (for sure) what you’ll love and be good at for the rest of your life. So keep doing those things that “seem” like they’re boring and uninteresting. Many of them will be a waste of time, but there will certainly be a few pearls in there, too. Don’t miss the opportunity of discovering
them because you just want to stay in your comfort zone. Now is the best time to leave that comport zone and discover the other stuff. Eventually, you’ll be glad you did.

How do you boost your creativity?

The single most important thing I do to “boost creativity and/or productivity” is to work in such a way that I don’t need to “boost creativity and/or productivity” to get my work done. This has to be done the night before.

I always quit all online work at least 2 hours before bedtime and print whatever I’m working on.

Then I go into any other room with program listings, blank paper, and pens (especially red!) and plan out all of tomorrow’s work.

All analysis, design, and refactoring must be done at this time. I do not allow myself to sleep until the next day’s work is laid out. I also do not allow myself to get back onto the computer. The idea is to have a clear “vision” of what I am going to accomplish the next day. The clearer the better.

This does 2 things. First, I think about it all night (maybe even dream about it). Second, I can’t wait to get started the next day.

I always wake up and start programming immediately. Once I get going, it’s easy to keep going. Any difficulties are probably because I didn’t plan well enough the night before.

With proper planning, “getting into the zone” becomes a much smaller problem.

What should a business guy have to offer?

An overwhelming majority of the time spent on a software startup is at the terminal, coding. If you’re not doing that, then you damn well better be bringing something else of value, a lot of value, to the table. Things I’d be looking for… 

- Specific domain knowledge. You gotta be the guy who says, “No, no, no, that’s not the way you do in this industry. You do it this way. And you sell it this way.” 

- Our customers’ industry contacts. You gotta be opening doors for us while we’re busy coding. 

- Analysis, design, testing, implementation. You should be very proficient at all the stuff on the Systems Development Life Cycle that’s not coding. 

- Operations. You should good at running the business while we code. This could include many things like accounting, marketing, selling, order processing, help desk, legal, etc. 

We programmers are not dummies. We are working on the critical path, but we recognize that a whole lot of other stuff has to happen in order to be successful. And we want to be successful, which is a primary driver.

Can you do that other stuff? Great. If not, you need to find some way to add value. 

And don’t forget, ideas != value. We all have a million of them. What else ya got? 

How do you stay productive?

1. Do not have access to the internet on your work machine. If you don’t have 2 computers, get a netbook for < $300 and connect it to the internet. They should be in 2 different workstations, ideally in 2 different rooms. The thinking is that if you have to get up, you’ll only do it if it’s really necessary. It works pretty well.

2. You should have 2 modes: coding and not coding. For coding, you should be at your desk coding. For not coding you can be anywhere, but “not at your desk”. One of my biggest problems is that I often find myself in one mode when I should be in the other. If you’re having trouble writing code, then you probably don’t know what to write. Grab source code listings, pen, & paper and “get away from your computer”. Don’t come back until you know exactly what you’re going to be working on. Better yet, until you’re “dying” to work on it. On the other hand, if your doing analysis and are stuck, stop. Go back to the computer and code something, anything small, just to get going.

3. End every day in analysis mode. Don’t go to sleep until you have tomorrow’s plan ready. You should wake up knowing exactly what you’re going to be working on and excited to do it.

4. Never text or IM when working. Have the cell phone nearby only for emergencies. For email, go to the other computer once an hour (see #1 above).

5. Try 48 minutes on, 12 minutes off. For long coding sessions, this works pretty well for me:…

6. Ipod.

How do you feel about competition?

One thing bothers me about this whole WorkHard / WorkSmart / BeProductive meme: it focuses too much on “the competition”. 

I know my approach is heresy in some parts, but bear with me… 

I understand that there’s always “some” potential competition, but I choose to not pay much attention to it. The only thing I compete with is another version of myself in another universe. “What would that other Ed have done?” 

And that’s awfully hard to measure. I’ve tried all kinds of metrics to keep my projects going, but the only one I use now is how much progress I make each day on my most important task. Pretty subjective. 

I have seen tons of good software and services and have done a lot of work deploying them. What invariably happens is that there is no solution for something the consumer wants, so that’s what I write. I like to think, “If I had good competition, I would just go out and sell it for them. But since I’m writing something no one else has, I won’t worry about competing with anyone but what I would have been.” 

This may sound a little silly, but it works for me. Provide something that no one else is providing and working harder or smarter than the competition suddenly doesn’t mean so much. I just have to be a whole lot smarter and better than doing nothing at all.

What is an example of an interview test?

Here’s one of my favorite examples that can work for almost any language. 

Remember, before any of this happens, I have already helped the candidate get comfortable and have made the purpose of the exercise clear: to assess where they’re at and how/where they might fit in. It is not a test. Just an exercise to help us both. I offer them a soda or coffee, a little privacy, and this little problem… 

You have an array. Call it “a” or whatever you want. It has a bunch of elements, numeric, alphanumeric, or whatever. You decide. Sort it. Without using a second array or a pre-existing function or routine. While I’m explaining this I’m sketching it out with my own pencil and paper. I suggest that they sketch out what they want to do themselves and then write some code (in the language being evaluated) or just pseudo code for general purposes. Be prepared to discuss whatever you want to present. Don’t go nuts, just a few pages and 15 to 30 minutes. And have fun. 

When I return, I have them explain how they approached it. (Here’s what my code will do…) Then we go through the code line by line. At this point, it’s incredibly easy for me to ask questions, such as…

Why did you name that variable that name? 

Why did you use a for loop? 

How else could you have done iteration? 

How would you do it with 2 loops? 

How would you do it with 1 loop? 

Which variables are global? Which are local? Why? 

Why did you reuse the variable "i" in the inner loop? (Oops) 

How can you make it faster? 

How could you make it clearer? 

How would you change it if you knew the probability of the original order? 

How would you refactor this? 

How would you extend this to do...? 

Which code would you put in a library for reuse? 

You kinda get the picture. No 2 interviews are the same. Imagine the programmers you already know having this discussion with you and how much you’d learn about them. 

There are no right or wrong answers, just learning. Which is what you want. 

This simple test eliminates the 90% of applicants who are not suited for this work and 100% of the posers. You can tell right away who they are. 

On the other hand, good programmers shine on this. It’s actually fun to hang out and talk about this stuff with them. I’ve even had candidates email me later with revised code based on our discussion. Those are the motivated ones. Big points for that. 

Why do coding tests?

“No, coding on the whiteboard or on paper, or even the 5 minute exercise on the laptop is not really coding.” 

It doesn’t matter whether or not it’s “really coding”. All that matters is how effective it is in evaluating your candidate. 

I have interviewed over 2,500 devloper candidates and every single one has had to code with pencil and paper, in a room alone for 15 to 30 minutes. This has always been, by far, the most effective thing I could have done. 

I never cared what they actually wrote. I never once found out if it would even compile or run. And I never cared. The only purpose of the coding problem was the “discussion afterward”. This told me volumes. 

Given a person, a discussion, a problem, and 1 to 3 pages of written code, I could ask many questions focused on a single issue and take it any direction I wanted. And learn what I needed to know about that person… 

How did they attack the problem? What did they feel comfortable using? How did the deal with the situation? 

What kind of attitude did they have? How much did they enjoy dealing with the problem and discussing it? 

How well did they defend their choices? How willing were they to take criticism? How willing were they to stand up for what they believed in? 

These are the things I want to know now. Not 3 months after they start working. Programming with pencil and paper and discussing afterward is the best way I’ve ever found to find these things out. 

The Investor Entrepreneur Chasm

Investor: What are you building? 

Entrepreneur: Artificially intelligent software that automatically builds sophisticated business applications based on the enterprise’s business rules. 

Investor: Your competitors are too entrenched. What can you do that’s simpler? 

Entrepreneur: Small business software that ties all a company’s applications together. 

Investor: You’ll never compete with Microsoft. What else? 

Entrepreneur: Tiny apps that all kinds of people can use to run their stuff. 

Investor: 37signals will kill you. What else? 

Entrepreneur: Social software that enables your sales people to understand what’s happening in the global marketplace. 

Investor: It’ll never work. Can you do something more practical? 

Entrepreneur: An intelligent e-commerce system that guarantees the consumer the best value. 

Investor: You’ll never compete with Amazon or Ebay. Got any other ideas? 

Entrepreneur: Recipe software. 

Investor: OK, if that’s the best you can do, we’ll go with it. Geez, I just wish you guys would dream a little bigger.