Ask HN: How Do I Become A 'Good' Programmer... Like Everyone Else Here
I've been developing for about 4 years now, 'seriously' building fairly complex web and mobile apps for about 2. Yet, every day I run across articles here and comments that make me feel incredibly useless and inexperienced.
How do I bridge that gap between where I am now, and being able to spend time browsing through modern php, ios, (whatever language I know) articles and not feel under water and under the average knowledge bar?
62 comments
[ 0.17 ms ] story [ 104 ms ] threadIf you aren't familiar with something that you see, look it up. If it looks useful to you, build something with it.
A group of people will always look smarter, more knowledgeable and more accomplished because you will see the acomplishments collectively, and compare them to your own, individual work.
tl;dr - Don't let it get to you, carve out your own niche.
This is essentially what I do. Thanks for the tldr.
I still run across stuff I don't understand, all the time.
And I'm not one of those people who have "1 year of experience 15 times" instead of "15 years of experience". I'm pretty aggressive about learning new stuff and expanding my horizons. And yet the pace of change is so fast, there's always new stuff coming out, or areas of tech I'm discovering for the first time.
The moral of this little diatribe? Don't sweat it. Be curious, explore, learn, hack, and don't worry too much about comparing yourself to others. And don't assume everybody on HN is some uber-genius, super-brilliant "10x" programmer. I mean, sure, there probably are people like that here, but I'm pretty sure they are a small minority.
For another take, you might find esr's "How to become a hacker" essay useful:
http://www.catb.org/esr/faqs/hacker-howto.html
Other than that, my only advice would be to start a project (open-source or not, whatever you think) that gives you a venue to challenge yourself. That is, start a project that you don't believe you're really competent to complete, and then go do it.
Also, "read a lot".
To bridge that gap, you might want to see if there are tech Meetups in your area. In NJ where I am, there are two extremely active groups that throw together entrepreneurs, investors, devs and developers a few times a month for very low cost. Establish who you are, and get assistance from others, advice sharing, make new contacts, find out where the industry is going, etc.. Normally you walk out of the meetings on a better career path than when you entered.
The same goes for each of those fields, and every other field--there are certain people who know a lot about them, and when the topic comes up they talk about them. The reason it seems like there are a bunch of super-brilliant "10x" programmers is that there are many, many of these specialized people on HN and around the web, and at least a few of them always have something to say about a topic. It doesn't mean they're all super-brilliant "10x" programmers.
The only work which matters is the work which gets done. You can accomplish a lot by simply doing the things that need doing. Bad code gets written and all that.
If you answered yes to all of the above, then you're probably already a "good" programmer, and you'll only get better. If not, then let's maybe discuss why not. E.g. is there something about your job that's getting in the way of you improving as a coder?
> When you're coding, do you think "What's the best possible way to do this," instead of just "How can I get this code to run?"
I do both. Mostly begin with phase 2 (mentally) and then go back and look at the 'best way' and design schema and business objects around that. I end up making a lot of sacrifices and doing things that are probably not optimal due to what I think is poor real world experience and experience working with other, more seasoned developers. My knowledge of design patterns is fairly limited and I tend to churn out projects that work, are fairly reasonable but yet I think they lack the elegance of many of the open source projects or example githubs I've seen.
> My knowledge of design patterns is fairly limited
I'd recommend reading articles and books on that. And also reading open-source code. The latter can be very challenging, but also very rewarding. You should study it until you understand not just what design decisions were made, but why they were (most likely) made. If you can't figure it our, ask :)
> I tend to churn out projects that work
There's nothing wrong with doing that as a first step. Many programmers will make something that works, and then refactor it into something that works and is nicely architected. Have you tried that approach? Is the issue that you don't have enough time per project?
> I think they lack the elegance of many of the open source projects or example githubs I've seen.
It's a good sign that you recognize as much. That means you have an eye for good code, which is huge. What's your biggest obstacle right now? What prevents you making the jump from merely appreciating good code to writing it?
You're 'Good' now. When you stop getting that feeling, you're no longer good.
You've escaped the Dunning Kruger effect for now: http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
You may already be "good". The thing is that there is something or someone better out there than you and this applies a lot more when it comes to HN. I feel like a loser when I browse HN because well, a lot of ppl are faaaar better than me at the things that I want to be good at. It is all relative. Stop sweating it and focus on what you want to achieve. If you get what you want, who cares whether you are good or xyz.
It's possible that you right now today may know somethings that the person who made you feel like your underwater has no idea about.
I always feel like I don't know anything and that's a good thing, it keeps this subject interesting.
IMO you should decide what you want to do in more concrete terms. Being a "good" programmer can mean a lot of things. Do you want to become an expert in some specific area of computer science, i.e. machine learning? Do you want to design your own language? Or an OS? Or your own framework? Do you want to be the ideal super-productive jack-of-all-trades startup first-hire/tech founder? Do you want to strive for the broad knowledge, wealth of experience, and leadership + mentorship abilities of an effective CTO? The list goes on.
You can't have it all. Pick one, or pick a few. Then spend years challenging yourself, ideally working on real projects that are meaningful to you, alongside other great programmers who give you something to aspire to.
Once you have picked your definition of "good programmer" (your goal), write out a map of stuff you do and do not know. For example, I am a full stack developer, but I don't yet know CoffeeScript. It would probably be a good addition to my toolset as I do a fair amount of JavaScript programming for the frontend. Having this map will help you fill in the blanks of technologies and concepts you are missing. Take your time and learn these slowly, usually as a part of a project, and not just an exercise. As you learn, adjust your map. You will inevitably come across stuff you did not know existed or was important.
Remember, it's easy to run in many directions at once with this approach. Don't do that. If you already know Ruby, don't go learning Python (and vice versa). They fulfill a very similar role. Instead go learn how HTTP works. Or how to work with a different data store you haven't used before. Or how to use a frontend JavaScript framework. Or go learn C.
Here's my recommendation learning technologies to become a full stack developer (in order, when starting from scratch): HTML/CSS, Python, Django, PostgreSQL, JavaScript + jQuery, AngularJS, HTTP, networks/socket programming, C + data structures and basic algorithms, functioning of operating systems (libraries vs syscalls, toy operating systems), compilers (build a toy one), Lisp, Haskell, Erlang, networking again but this time thinking about distributed systems.
Good luck!
Basically, focus on getting things done and building things. If a part of what you are building seems like too much work, someone probably has already built a solution for that. Otherwise, don't worry about using the absolute cutting edge stuff. At one point there was a tongue in cheek saying that "it would take more time to evaluate the popular JavaScript frameworks than to write a new one" (or some such). It still holds today, so don't sweat the name of the tech and stick to the stuff that you can be productive with.
Read those articles and take the time to research the parts you don't understand until you really grok it. Read and try to understand good code, take every opportunity to go a little bit deeper into the tools you use (web frameworks, libraries, etc) if they are open-source. Getting better sometimes means knowing more, but mostly it's about not being afraid to dive in.
Thirteen years later, I know vastly more than I did then. I've worked with a wide variety of languages, applications, and frameworks. I've spent untold hours reading blog posts, articles, code, and Reddit/HN discussions. Today, I still feel like I know a pretty good amount about programming, except now I also know (and accept) that there's effectively an infinite amount of possible programming-related knowledge out there, and I will only ever know a fraction of it.
Like you, I routinely see articles posted that make me once again feel clueless and inexperienced (such as raganwald's recent post on JS multiple dispatch, or anything involving Haskell / Lisp / assembly / cryptography). I sometimes worry about dealing with technical interviews if I ever move on from my current job. Ultimately, though, I know that I can get stuff done, and that while there's lots I don't know, I have the ability to research and learn.
The other posts give some pretty good advice. For me, it comes down to:
1) Learn by doing. No better incentive to learn how to do something than when you need that to make a project work right.
2) Keep reading technical discussions on sites like Reddit, HN, and tech blogs
3) Never be afraid to say "I don't know", and go research the subject.
Also, don't sell yourself short. Impostor syndrome is real. Just because everyone in the room is smart doesn't mean that you are not smart. Intellect is not zero sum.
I'll second what mindcrime said about never really feeling like you know everything. The rate at which new CS knowledge is being created is far faster than the rate at which I can learn, so I've long since given up being able to learn it all. But what I can do is see patterns. I can see that the new single-page Javascript MVC frameworks are reinventing patterns that were common in desktop GUIs a decade ago, or that what Chrome's rendering engine is doing when it schedules JS execution isn't all that different from the Win32 message pump, or that Guice/Dagger are basically introducing data-flow programming to Java, or that Go's channels & goroutines are basically the same as Erlang messages and processes. Then I can apply what I already know about those other programming paradigms to the new technology, and only focus on learning the differences. That's a lot easier than picking up a new concept from scratch.
Just the amount of understanding required to comprehend the keyboard press to the letter appearing on the monitor is insane.
Remember, you're not useless and inexperienced. The stigma from those words alone are holding you back. I have a feeling you are bored. You have a thirst!
Also, recall that articles and comments are much like Facebook, a peek into someone's good life that makes you feel bad about yourself. The good always seems great, and the bad goes untold. I'm on revision 744 of a 10 page website/service layer right now with only 30% of the requirements met.
You need to realize that there are a lot of people commenting on hacker news (or for instance Stack Overflow). On any given topic, specialists of that field will show up and share their insight. For instance, on an article on technology X, it's not uncommon that someone that helped developing X shows up.
You also need to remember it's not the same person that knows everything :) it may be the case for instance that the distributed algorithms expert is clueless about PHP for instance.
I used to feel inexperienced and self-conscious until I started looking through the code of open source projects I use, seeing sloppy and sub-optimal code. We're all human, and we can always improve.
The important thing is to keep learning hard things unrelated to your current development stack and methodologies. Don't get stuck on only doing tasks where you are already an expert.
Awesome advice.
Never stop learning and never stop pushing yourself. I'm driven to know everything I possibly can about my areas.
Could you please elaborate on this? As in, what kind of books do you look for? I have developed this feeling that focussed blog posts by experienced programmers teaches more than books. Also, there are way too many self published authors out there. I know it's a good thing in a way but with so many books, it gets tough to figure out which ones are worth your time. In other words, I'm looking for an example like "I wanted to learn x, so looked up and read y". Thanks.
How can it work? How does it work? How it should work?
And the most important thing:
Avoid involving yourself into code that is a mess before knowing how it should be written in the first place.
Also, if you're into OOP, think about access modifiers as:
private - if it's called from somewhere it has to be only in this class... (or im gonna slap someone!)
protected - only this class and its child classes...
public - does this really has to be part of an interface?
Once you start thinking this way you know you're on the right track.
...and read a lot. :)
Thus, I think that to become a better programmer, you need to get better at these three things.
"Explanation", I think, is the most difficult one. I have found that studying math has improved my explanation skills dramatically, and it helps not only when talking to computers, but also when talking to people. Of course, not everyone has the opportunity or desire to study things like calculus or differential equations, but I think that reading computer science books is a nice way to exercise that math/logic muscle.
To get better at things like debugging, I had to tear down some mental barriers. Sometimes you'll have to go out of your comfort zone. Never think "oh, this is too hard for me". For example, if you're writing something in Python, you must be mentally prepared to dive into the internals of a 3rd party C module. The key is to approach it with a "we must get to the bottom of this!" mentality.
Don't worry too much about technology. Your "goodness" as a programmer isn't defined by how many languages you know. It's better to know a few very different languages than a lot of similar ones. For example, I think that knowing Java and Lisp is better than knowing Java and C#, because you can quickly pick up C# using your previous knowledge of Java, but knowing Lisp may teach you something you wouldn't know if you decided to stick only to enterprisey languages that give you higher employability.
That is SO true. Explaining things to others is a great way to make sure you really understand something. Hence the old saying "to truly understand something, you must teach it".
I'm ashamed to have forgotten to include this point in my response, but I think people looking to learn new things should make it a point to look for opportunities to teach / lecture / explain / whatever, as much as they can. What has worked well for me is volunteering to present at the local Linux User's Group or Java User's Group or something like that. It forces you to really do a deep dive into a very focused area for a while, to make sure you can do it justice.
Sometimes, folks who think they know everything just don't know how little they know. Some of your smartest people sound not terribly confident because they know the limits of what they know and how many things are unanswered. Sometimes, really talented, amazing people feel like shams and really mediocre people feel like they have conquered everything and are The Bomb.
After that, you also need to find out some kind of objective measure of "good" for x thing. I don't know enough about programming to suggest what that might be for that domain.