I recently received an inquiry from a Hacker News newcomer on how to best participate in the community. I was ready to reply, "Just follow the guidelines and be yourself." Then I realized that it was actually a very good question that deserved a much better answer.
So here is my more detailed answer, based upon many years of hard knocks.
A smart accountant once told me that the answer to "How much money did you make?" is always, "Who wants to know?" If it's an investor, the answer is "A lot." If it's a customer, the answer is "A little." If it's the IRS, the answer is "None."
Same thing here. The answer to "Who is a superstar developer?" is always, "Who wants to know?"
To a project manager, the programmer who hits every deadline (regardless of quality) is a superstar.
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 stationary 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.
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.)
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 programmers 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 an 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 makes me angry! (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 upset yourself)?
The most important lesson my mentor ever taught me:
We went to a client to work on Problem X. He quickly determined that solving Problem X would achieve nothing. Problem Y was the real problem, but was way outside our areas of expertise.
So what did he do? He slept 4 hours a night for the next 2 weeks studying everything he could find about Problem Y. He reviewed reports, industry literature, called experts, and talked to as many people in the company who knew anything about that subject area. Within 2 weeks, he presented a brilliant solution that no one had ever considered but was instantly understandable by their experts. (That solution included work done by us and we had a great client relationship for years.)
My customers do great things. They often need my software, built and functioning properly for years to do these things. I love building stuff, but they are the real heroes. Just some of the things that they do:
I try to approach not to change the world, not to build cool stuff (well maybe just a little), but to genuinely help people. For a business person, this thinking is difficult and counter-intuitive.
Why do I do this? Because of my first mentor (and cofounder).
He was relentless in everything he did. I learned to stay up all night, keep calling on customers, and stay with tasks until we got somewhere with them. I remember many nights with thousands of invoices spread across the carpet, watching the graveyard shift run their machines, or scanning reports on-line, looking for clues. He wouldn't quit and the reason was always the same, "These people need help and we can help them. So we do. Don't worry about how hard it is or how much time we spend. It'll all work out in the end."
"If you're capable of writing the best web framework in the world in your spare time, chances are you can also create a business at the same time."
Don't make the mistake of underestimating yourself.
I'm not suggesting that you'll go out and write Rails in 3 weekends. What I am suggesting is that the more I meet famous programmers and the more I meet people from this community (online and offline), the more I realize that there's not really all that much that separates us.
"And in my experience when enough people are saying that 'you can't do that' there is an opportunity waiting for you that is proportional in pay-off to the number of people asserting that it can't be done."
Most of my most memorable successes were when others said that something couldn't be done. First you think, "Why not?" Then you think, "What would it take?" Then you figure that you'll never find out for sure unless you try. The reward is compounded by the initial skepticism.
One says, "It doesn't matter". This is for when I get so stressed out, I have trouble doing anything. It helps keep things in perspective.
The other says, "Jabez Wolffe". His guide boat forced him to abandon his swim across the English Channel because they couldn't see through the darkness and fog, and it was too dangerous to continue. What they didn't realize was that they were only 100 yards from shore, but they had no way of knowing.
I had a friend in college (I'll call John) who would shoot hoops, play golf, or play table tennis with anyone at any time. But he would never play anything else. He wouldn't play touch football, softball, bridge, or even shoot a game of pool. I could never understand it until I finally figured it out: he wouldn't play anything unless he knew that he would win. How sad, I thought.
I just realized (to my horror) that years later, I am just like him. I don't push boundaries like I used to. I don't call on that extra customer, volunteer for that project, or apply to programs like yc if I think there is any chance I won't win. There's always a reason: the software is missing too much, the demo sucks, there are 14 other things that have to be done first,: You get the picture.
I never thought of this as "fear of failure". I just got so used to succeeding in everything I did that I didn't want to do anything else where I didn't succeed. I became John without even realizing it.
If you want to be famous, go be an entertainer, athlete, or politician.
If you want to be a programmer, check your ego at the door. The two biggest roadblocks to success in programming are incompetence and attitude. Big Ego = Bad Attitude.
I measure my success not in fame, but in the value gained by those who use my software, and the value gained by those they serve, and so on, and so on. I don't know them and they don't know me, but I'd like to think the world's a better place because of all the ones and zeroes I've arranged. They are the stars and that's good enough for me.
I have a simple guideline for real life interactions with others that carries over quite well on-line, "Deal with issues. Ignore details."
It's amazing how well this works in person, especially when trying to get something done. My number one question to another is probably, "Is that an issue or a detail?" We can almost always decide together which it is. Then, if it's an issue, we deal with it, and if it's a detail, we move on to the next issue.
This has also saved me countless hours and aggravation on-line. If I post something and someone disagrees, I quickly decide whether or not it's really an issue and only engage the other if it is. I realize that this is just a judgment call, but I'd estimate about 90% of on-line disagreements are just details. In these cases, I think it's best to simply move on.
Examples are everywhere. In fact, almost every human interaction is an example. Here are a few off the top of my head:
Quality Control rejected one program because it was indented 4 spaces instead of the standard 5, but accepted another, even though it had enough memory leaks to crash the server under certain conditions. The first was a detail; the second was an issue. It took me 2 days to get Q.A. to understand the difference.
A friend recently arrived for a dinner party an hour late and then complained to me that another spoke with her mouth full. As far as I was concerned, the first was an issue and the second was a detail. My friend thought otherwise about both.
Sometimes I think I'm living in two worlds, the customer world, where everyone is scrambling to get stuff done, and the startup world, where everyone is talking about what the customer world should be like.
Don't misunderstand me, though. I love the startup world. There is an underlying current of optimism that I rarely see in the customer world, where people are just too busy to see the possibilities if they hit them in the nose. Sometimes I have to grab my customers and yell, "Let's slow down for 5 minutes and think about a better way to do this!"
In the startup world, it's often too easy to lose sight of the definition of success. Success is not starting a business, getting into an incubator, or securing funding. Success is satisfying paying customers over and over again.
Five minutes after winning the presidential election of 1904, Teddy Roosevelt vowed not to seek re-election in 1908. Six minutes after, he regretted what he had just said. He tried to return in 1912, but failed and regretted his hasty decision the rest of his life.
Why do I mention this? Because whenever I feel like I'm in a difficult situation (not all that much different from yours), I promise myself not to pull a Teddy Roosevelt and do something hasty that I'll regret forever. Neither should you.
For what it's worth, time is not slipping away. In spite of what you may think, 30 is not old.
1. I write software: business applications. I love what I do. I love getting something to work right the first time. I love seeing people use the software I wrote to do their jobs and run their businesses. I can't imagine doing anything else.
2. The software I have inherited in all 80 companies I've worked at has sucked. I mean really sucked. Nothing to be proud of. Nothing to want to work on. I think it's because business software is now where medicine was 100 years ago.
So I have a choice. Work on other people's crap or write my own. I have done both, but I have to write my own to be happy in this industry. If I could only work on other people's software, I think I'd rather work in a grocery store.
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.
The old town drunk died. His two sons, the bank president and the new town drunk were at his funeral. An onlooker, surprised at how different the two sons were, asked each one how he turned out the way he did.
The bank president responded, "With a father like that, how else could I turn out?"
The new town drunk responded, "With a father like that, how else could I turn out?"
"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.
I used to be awfully hasty in judging others, "She is really smart," or "He is so stupid". Then I learned a lot from my first mentor. He taught that there often isn't much difference between someone who appears smart and someone who doesn't. Perhaps no one spent enough time with them. Maybe they have other challenges, like family, health, or circumstances. Maybe they're just a fish out of water, spending too much time on things that don't interest them. Or maybe they appear dumb because they actually believe that they are. They've been told so many times that they now believe it.
At first, he sounded like some hippie idealist. But the more we worked together, the more his teachings manifested themselves in the people we worked with. People who appeared dumb blossomed under different circumstances all the time. They were smart deep down inside where no one ever explored. (These people were mostly hourly workers who knew way more than their bosses about running the business.)
To this day, when I see phrases like, "intellectual horsepower", I cringe. We "smarties" aren't that much smarter than most other people, if we are at all.
I don't know about the rest of the world, but lots of us sure are in a bubble. There seems to be a real disconnect between what people want to build/invest in and what people in the real world actually need and want to pay for. Just as sample of what I've witnessed in the past few years:
- Ask HN: How do you like my file sharing app?
- Ask HN: How do you like my social app for niche x?
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 reusable 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?
"1. Object Oriented 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"
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?"