Are good programmers born or made?

Smart. Motivated. Works well with others. Has passion. Good problem solver. Detail oriented. Able to focus. 

In order to be a great programmer, how many of these are important? All of them. 

How many are necessary? None of them. 

I once had a calculus professor who said, “Many students are simply unsuited for the sciences.” 

I disagreed with him then, and after many years of work experience, I disagree with him more than ever. I firmly believe (with some exceptions) that almost anyone can become great (or at least very good) at almost anything. I’ve seen it over and over again. 

I have worked with hundreds of programmers over the years and screened thousands of others. Almost all of them consistently delivered substandard work. Not because they weren’t smart or motivated or capable. More likely because they weren’t taught properly and were in terrible environments. 

Teach someone how to do the job properly, give them an environment in which they can thrive, give them a chance to do quality work, and treat them like human beings. Then watch what happens. But companies are too stupid or lazy to do this, so they think they’ll just hire talent and dump them into their already sour environment. Fix the environment and let regular people become great. 

Made. 

Why use a framework?

Here’s the dirty little secret that no one wants to talk about… 

The purpose of “assisters” like frameworks and higher level languages is NOT to make good programmers more efficient. It’s to make mediocre programmers more likely to produce “something” of value and to make poor programmers capable of producing anything at all. And if the bell curve tells us anything at all, it’s that these “tools” target 90% of all programmers. But think about it, my fellow top 10%, do you really need all this stuff? If you’re working alone or on a small team with a clear objective, haven’t you always had everything you needed with low level tools? If you need any higher level tools or reuseable components, haven’t you already been building these all along?

Sure it’s fun to play with new things and learn from others, but when it comes time to really produce, don’t we all know how to (and need to) roll with what we know? 

The need for frameworks and high level languages only becomes apparent when we grow so large that we can’t find enough senior hackers. Only when you dip down into the mediocre masses do you need this help.

 

Weakness or Strength?

“Inability to absorb too many details verbally” = personal fortitude to insist that others show a modium of discipline and occasionally write down what they want 

“Inability to multi-task” = ability to focus 

“Inability to manage or even to see certain classes of mundane details” = ability to distinguish the difference between and “issue” and a “detail” 

“Inability to organize” = lack of the need to organize because of intense focus on the most important thing 

“Capable of working through entire books of information” because of the ability to distinguish between “issues” and “details” (see above) 

“Capable of coming up with pretty good project ideas on his own” = creativity

“unusual degree of empathy” = understands the “big picture” 

“Faults tend not to show up terribly badly” but only to those tuned in to the “superficial”, not the “important” 

“If he can team up with…” = understands synergy 

“Is this guy sick?” = a one eyed man in the land of the blind

The Things That Go Without Saying

“1. OO code is less performant than procedural code” 

Never forget, the primary purpose of OO is to help “us”, not our users. OO is a great way to get junior people thinking a certain way, set standards, and make maintainability a little more manageable (usually). The only thing it really does for our users and customers is help us help them by making our lives a little easier. 

“2. The backend is the most important part of development” 

Sometimes I think we get this backward. Think about it. You can do almost anything you want on the back end and no one notices unless there’s a problem. The client side is a whole different story. It has to work perfectly no matter what browser or resolution your user arrives with, and it has to do it using a limited number of technologies, a small footprint, and with limited round trips to the server. It’s almost like it’s 1965 all over again. 

“3. Graphical designers are good at user interface design” 

UI design != UI function. It doesn’t matter how pretty it is if the user can’t figure out what to do or if it doesn’t “function” as expected.


“4. The existence of a superior programming language” 

Yea, some languages are better than others for certain things, but a expert practitioner of a seemingly inferior technology is almost always better than an average practitioner of a superior technology. To this very day, my mother can still “print” faster than any of us kids can “write”. Amazing. 

“5. XML is more economic than a DB” 

XML serves its purpose of being autodocumenting quite well. That’s all it does well. If you need to parse for any reason, almost any other format blows it away. 

How perfect do you have to be?

I can attest that trying to hit a homerun and hitting only a single or double is still great. 

I tried to prove Ferman’s last theorem (years ago) for my senior project. I didn’t :-) But I turned in what I had and got an A+ and 4 invitations to grad school based on that paper alone. 

I entered my fraternity into a contest for Chapter of the Year. I didn’t care about the trophy; I only cared about what would happen to us by doing all the things needed to try for it. It worked. 

I have often tried to solve the biggest problem at some of my customers over the years, but didn’t. But all the little things I had to do to make the attempt turned into pretty good products and services anyway. Nothing wrong with trying to hit a homerun as long as you keep your wits about you and don’t let it become and win or go home proposition. 

How important to society is your software?

“Have you found a way to write software that has a real, tangible, positive net effect on society?” 

Yes. Everything I do.

I (along with many others) write lots of software to help small and midsize businesses compete more effectively. They, in turn, provide value to their customers, jobs for their employees, and pay taxes to their communities. If that’s not a “real, tangible, positive net effect on society”, I don’t know what is. Not everyone has to find a cure for disease or discover how to provide clean air and water for the masses. You don’t have to change the whole world, just a little piece of it. 

A mentor once suggested I think of it like a football team. Some pass, some catch, some run, some block, and some tackle. All you have to do is “your job” well, for the team “the rest of us” to succeed. Please don’t be such an “idealist” that you never find your calling. Just pick something close enough and go for it. 

The real heroes are in the pits every day, helping others do their thing. You oughta join them. 

Why I’m a Late Bloomer

My father taught me to read when I was 2 and from that point on, “everyone” encouraged my parents to “fast track” me. I was tested, examined, and prodded by psychologists, doctors, teachers, and “experts”. I even passed the preschool entrance exam before my older brother (he’s been paying me back ever since). 

Finally one day, my father, of all people, said enough. I would mainstream with all the other kids because he didn’t want me to be a “freak”. To this day, I don’t know if that was a wise decision or a snap judgement. 

So I sat in class, bored to tears for the next 12 grueling years. Looking back, I had no choice but to “let my love of something pull me”. So I learned a musical instrument, started several small businesses, made home movies, and published my own magazine. I excelled in everything outside of school and did poorly in class. I wonder what college admissions officers thought about a self-published C student with perfect SAT scores. I think my magazine did more for my future that anything from school. 

After a great college experience, I spent years of torture in corporate cubicles, bored to death no matter what the job was. Only when I found a way to do my own software startup, did everything fall into place for me. I’m finally living the life I was always meant to live. 

So this would-be prodigy ended up being a late bloomer. I don’t know whether this is better or worse, but I sure am glad I finally ended up where I belong. 

What are your hardest learned lessons?

A few of my hard earned lessons: 

Time spent working does NOT necessarily = amount of work completed. It’s easy to get discouraged when you “sense” you’re not spending enough time on something. Two days ago, for example, I didn’t work much. But it was a very productive day! By the end of the day, I figured something out and the flood gates opened. That’s just how it works for hackers sometimes. If you don’t care anymore, that’s one thing. But being frustrated about time spent is a signal something else is wrong, not your commitment. 

Some experts think we are either preprogrammed with “moving toward” or “moving away” internal metaprograms. OK, whatever. I’m a very positive optimistic person, so I just assumed I was a “moving toward” person. Wrong! I am HIGHLY motivated by that which I do not like, but I never realized it. If I see something I like, I think, “that’s cool”. But if I see something I don’t like, I think, “That sucks. I can do way better than that.” So I do. It may be one of the 7 deadly sins, but jealousy is a great motivator for “moving away” people. I’m older than every speaker at Startup Weekend, the Chief Justice of the Supreme Court, and our president. But I’m just as smart as any of them, and I haven’t got mine yet. That just pisses me off! (See, it works, I’m ready to hack right now.) What about you? How are you programmed? What can you do to stoke yourself (or piss yourself off)? 

“When do you know its time to call it quits?” Never. I realize most people will disagree with me. Walt Disney and Colonel Saunders went to a thousand banks before getting a loan. How soon would you have given up? When do you quit trying to teach you child how to walk because it’s not going as well as you’d like? Jerry Seinfield jokes that it took him 20 years to become an overnight success. I’ve seen the same thing with many hackers I know. If you know deep down inside that your project is a winner, you must do whatever it takes to get it to “walk”. If you’re not sure, then maybe you shouldn’t have started it in the first place. Only you can answer that one. 

Why do you program?

I’m not in it for the money. The money is a barometer of something else. If someone can make money in this business (not that hard to do), then something they wrote is successful at some level. 

I can confidently say that 90% of the code I have ever had to maintain is total garbage. I am often stunned that it even runs and I used to wonder how it ever made it into production. (I don’t wonder any more, now I know, hardly anyone QA’s source code anymore.) 

(Another example: Today I refactored 1200 lines of code that edits credit card numbers down to 46 lines, removing 4 bugs in the process. This has been running in production for 18 years. This is not a joke.) 

I realize that what I see is not a random sample of all code. I never get to work on the good stuff; no one does - that’s the whole point. 

My work, on the other hand, has been wildly received by my customers and users for many years. I love what I do and love providing value to others. I can’t imagine doing anything else. 

For some reason (my internal metaprogams or something), I am much more highly motivated by seeing someone else’s garbage doing well and thinking, “I can do WAY better than that,” instead of people saying, “That was good.” I don’t know why.

Also, it’s my experience that most people do not see the possibilities for truly excellent software (present readers excluded, of course). They believe they have to put up with my previous example. I can’t wait to show them otherwise.