11. Rewrite something that desperately needs to be rewritten.<p>So many times I've encountered something and thought, "I can't believe that people are actually expected to use this software."<p>It was bad from a user perspective: difficult to use, slow, tedious to do what you actually needed to do, unable to "get there from here".<p>Then once I looked under the hood, it was often worse: built upon a horribly designed data structure, inflexible with constants where there should have been parameters, no apparent thought put into its use, too many violations of acceptable practice to mention, looking as if it evolved haphazardly (which it probably did).<p>It's easy to bitch about stuff like this, but you often have to go to the next level to <i>do something about it</i>. It's amazing how much rethinking you have to do and how many tools you have to build to turn horrible software into what should have "obviously" been done in the first place.<p>Easier said than done. And often, some of my best learning experiences.
"Learn a new programming language"<p>I would rephrase this to learn a new programming <i>paradigm</i>. There are fundamental differences between static typing and dynamic typing, object orientation and functional, manual memory management and garbage collection. There are also "pure" single-paradigm languages and multi-paradigm languages. If you learn the same type of language multiple times, you're really just learning new syntax and probably a couple of extra idiosyncrasies, so it's important that you pick languages with fundamental differences.<p>Compare going through this learning path:<p>Perl -> PHP -> JavaScript -> Python -> Ruby -> Node.js<p>To going through this:<p>Java -> C -> Scheme -> JavaScript -> Erlang<p>For example.
Learning Javascript changed my Perl for the ... more fun to write. Possibly better, too. I've started passing around coderefs as arguments to functions a lot more recently, and allowing people who use my APIs to do just that...<p>I've been writing code that allows you to describe a website in data and at a high level recently, and builds you up all the methods you need to interact with it. In general, when people need to provide parameters, I also let them pass in coderefs that can be executed to provide those eg:<p><pre><code> my $name = ref($args{'form_name'}) eq 'CODE' ?
$args{'form_name'}->( $self, @user_options ) :
$args{'form_name'};
my $form = $self->mech->form_name( $name );</code></pre>
Also, randomly: I started putting bug bounties on my code on CPAN:<p><a href="http://search.cpan.org/~sargie/Data-Google-Visualization-DataTable-0.08/lib/Data/Google/Visualization/DataTable.pm#BUG_BOUNTY" rel="nofollow">http://search.cpan.org/~sargie/Data-Google-Visualization-Dat...</a><p>This made me more conscientious about what I release ;-)
> 10. Don’t rush to StackOverflow. Think!<p>Disagree with this one. My rule is, "If you get stuck for more than 10 minutes, post to StackOverflow." I'll post my question then continue trying to solve it myself. Sometimes someone will post a good answer right away, saving me lots of time. Other times I'll end up solving my problem on my own, but I'll still learn something valuable from a comment or answer somebody posts to my question. Here's a good example of what I'm talking about:<p><a href="http://stackoverflow.com/questions/6327396/set-time-part-of-datetime-in-ruby" rel="nofollow">http://stackoverflow.com/questions/6327396/set-time-part-of-...</a>
11. Learn how the entire stack works. I see way too many people coding around problems that could be solved at the server level, the network layer, etc.
Really good article, I agree with every point.<p>If I were to add to it I stress the importance of reading books by different authors and publishers, even if they're about the same subject. This helps you get a much wider, well-rounded view and it often improves the learning experience.
-Build something that is bigger/more complex than your current skill level.<p>This will not only improve your skills in general, but learning from the mistakes you make is probably the best way to grow as a programmer.
+1 for don't rush to StackOverflow!<p>You don't get better if you don't tax your brain a little, much like how you don't get stronger if you use a winch or wheelbarrow to carry a load instead of carrying it yourself.
While people recommend reading code, like the Linux sources, I also find more code focused sites like Code Project (www.codeproject.com) very useful. These aren't blogs like Coding Horror, which are more "philosophy". These articles on Code Project typically are explaining code in detail.
I find that trying to ask my question at StackOverflow is the best way to improve. Because I have to think about how best to word my problem, and really make it clear and concise. And usually when I do that, I end up just solving the problem on my own.<p>Of course, I see a lot of give me teh codez there, so I can see where the author is coming from. Nevertheless, I find it to be a useful tool in helping me become a better programmer.
Really good article. Another way to improve your programming skills would be to teach someone else. I find this to be one of the best ways to solidify your understanding of something.
The article suggest reading code, which I agree is a good way to improve programming skills. But I'm a bit unsure what to do with the advice to read the linux source code. Where would you start? I find the only way to actually get to reading code, is if you have a need to understand some part of it (e.g. to fix a bug or add a feature).<p>So perhaps a more actionable proposal is to try to fix a bug, preferably one you care about, in some open source project.
For those of you who get a database error, I think it is the huge amount of traffic I'm getting at the moment which causes this (>1000 visits last hour). I'm using shared hosting, which might have problems with this, so in one way, you are DDOSing my site ;-). I don't know if it is safe to tell you to just wait and reload the page, but do that, BUT NOT TOO FAST!
What I observe so far is people who learn all kind of programming languages will become very good programmers. And one who see language as a tool to solve problem and applies it smartly will become millionaire providing food for remaining good programmers.
But how does one get ideas for a project? I started learning programming using C++ about 5 months ago. I've been making good progress on learning the concepts but I just can't think of anything useful to create.
1. Learn paradigms, kinds of problems and computer science fundamentals.<p>2. Work on poorly-run large projects with (a) performance problems or (b) code organisation problems.<p>3. Work on other projects with developers that use (1) to solve the problems of (2). You'll be surprised how quickly you learn when you've seen the benefits to be had by doing things better... ;)
Reading and trying to work with the Linux kernel source is hardly a good way to get better programming skills. It's really large and hard to understand. Something like Minix, MenuetOS, or LoseThos is a much better alternative to hack on. LoseThos particularly reminds me of old school hackable boxes like the Commodore64.
All of the advice given here is good and none of the tips here are going to hurt you.<p>It's just another less abstract reiteration of a few truths that encompass much more than programming.<p>Work with different tools. Think. Talk about what you do with other people. Do all of it a lot.
I hope that I fixed the problem now by installing a plugin (QuickCache) which caches pages and serves a normal, static HTML page when possible instead of generating a new dynamically from the PHP scripts each time. I <i>hope</i>.
8. is very important. Once you decide to write article, you got to have solid knowledge about the topic. You just can't write the code and see if it works :) you got to know why and how!
This is severely biased toward things that require no in-person interaction.<p>So I'll add two:<p>0. talk to other programmers
11. attend a Coding Dojo