top | item 1017189

Ask HN: How to become a better programmer?

29 points| Paton | 16 years ago | reply

My questions is: what abilities are required to effectively build complex web apps and services?

My current knowledge is limited to PHP and MySQL, with no real understanding of OOP.

That said, what would you suggest my next step be? Should I take a stab at Ruby? Javascript? Python? Frameworks?

I would appreciate any suggestions.

62 comments

order
[+] tlrobinson|16 years ago|reply
Learn another language. Not just because PHP isn't a particularly good one (IMHO), but because learning new languages inevitably teaches you new ways of thinking about programming.

Ruby is good for OOP.

[+] radu_floricica|16 years ago|reply
Since nobody mentioned yet... lisp is a great language to learn just to expand your horizons. Don't expect to actually develop websites in it (though clojure might be a good bet for more complex web apps), but it _will_ make you a better programmer.
[+] jacquesm|16 years ago|reply
Hey Paton,

The quickest way to become a better programmer is to take a real world problem and then to solve that with a technology that is as far removed from the ones that you are already familiar with as you can imagine.

Since you're already in to the imperative mode why not try a functional or a logic language for a change to see what the other side of the street looks like ?

The interesting bit in that approach is that when you return to your current languages you'll look at them in a completely new way.

[+] bigjust|16 years ago|reply
more specifically, take a real problem that your having ("Scratch The Itch"). That'll provide the ample motivation to spend a lot of time you wouldn't normally. Just build something. If you need to create a blog or whatnot, instead of using a pre-packaged platform, writing it in whatever tech you want to learn. Then you'll benefit two-fold, even though it takes longer than installing wordpress.
[+] tsally|16 years ago|reply
It's important to differentiate between the technical ability to build web applications and the craft of programming. It seems you are interested in the former, in which case I would recommend learning a popular framework (Ruby on Rails or Django). While you are learning a framework you'll pick up the base language just fine.

If you'd like to learn the more general craft of programming, Peter Norvig has some excellent advice: http://norvig.com/21-days.html. You'll find some language recommendations in the appendix.

[+] Paton|16 years ago|reply
Between starting with Ruby on Rails or Django with Python, is one better to start with than the other?
[+] zaidf|16 years ago|reply
A lot of good programmers aren't fans of OOP.

Of course, before you can decide whether you're a fan or not, you should understand it. So I'm all for that:)

[+] radu_floricica|16 years ago|reply
Agree. OOP is great for packaging libraries, but when it comes to software architecture it's way too easy to shoot yourself in the foot.

One common mistake, which I don't think is emphasized enough, is that modeling the problem and modeling the software are not the same thing. The problem can have a "User" actor, but this doesn't mean at all that the software should also have a User class. And yet you see User classes far too often.

[+] Asa-Nisse|16 years ago|reply
Since nobody suggested it, go to college/university and learn about data structures, lists and processor architecture. It will help you become a much more insightful programmer.
[+] KevinMS|16 years ago|reply
This advice is so bad I think it just gave me cancer.

The OP is asking "what abilities are required to effectively build complex web apps and services?"

99.9999999999% of data structures in web programming are arrays and hashes. Look those up on wikipedia and read it, then you are done, now get to work.

Processor architecture??? Is that really to be taken seriously? Not only was it previously not relevant to the OP's question, but its becoming more irrelevant because virtual machines and the "cloud" paradigm.

OOP details are great if you are going to write your own libraries or plugins, but its not necessary for cranking out websites. Most of the time the OOP you are going to be dealing with you can fake.

Javascript is a must have, but you don't have to get so fancy with it. Just enough to drive a popular framework. I'd recommend jQuery, it seems to be the emerging winner.

Learn the CSS, broken browsers, and the box model, which will waste so much of your time.

If you just want to work for yourself try a few web frameworks and go with what works for you. Using anything from PHP to rails to Django, you could take over the world, they are all good.

Look into scalability. Its fun stuff to learn about, even if you never lucky enough to need it, here's a good place to start http://highscalability.com/

As part of scalability look into AWS like EC2, EBS and S3, they are game changers. You don't have to use them, but if you need them, they are there to save your ass.

Learn about "viral" marketing and how sites go viral.

Learn about database backup and recovery, and as part of scalability learn how you can scale databases.

Learn about unit testing, QA or even something like Selenium, figure out which works for you best and in which ways.

Learn to figure out what users want and what itch you need to scratch.

Figure out how to make interfaces that don't suck. And when you do, let me know how.

[+] Zarathu|16 years ago|reply
"improve my PHP abilities to OOP"

Reading that made me laugh. PHP's OOP is extremely flawed (among various other things, like their inability to universalize the $needle and $haystack argument order: http://bugs.php.net/bug.php?id=37088), so using PHP to "improve your technical abilities" wouldn't really get you anywhere except having a better understanding of PHP.

I think that what you're trying to accomplish really needs to be defined in terms that aren't so broad. Especially these days, "technical skills" is such a vague term that it can really be applied to anything.

You don't need to have a complete understanding of some silly framework or whatever in order to still be considered an excellent developer in many ways. For example, you could write a stunningly elegant and clever mathematical algorithm in C without using a function more complex than sqrt(). (Or maybe you could write a more efficient sqrt!)

I think that learning something like that might improve your understanding of machines and could, indirectly, improve your understanding of "web apps and services"—that is, understanding HTTP, statelessness, and so forth.

tl;dr Figure out exactly what it is you want.

[+] Asa-Nisse|16 years ago|reply
I dont want to start a flamewar regarding PHP/OO but I must say that I disagree. There are some things that isnt very well implemented in PHP but in the OO aspect of the language it has most of the needed constructs and if you stay away from the obvious pitfalls its "good enough".

If you value time / fun over code/data integrity at all time PHP is a excellent choice for producing web services. If you are writing a control system for a airplane I would not recommend it.

[+] datasink|16 years ago|reply
What are the extreme OOP flaws still present in PHP 5.3? And how does the needle/haystack issue relate to PHP OOP?
[+] ngom|16 years ago|reply
You need a sound understanding of CSS, HTML and javascript. Although you may have been messing about with them a lot, try and get an in depth understanding of CSS selectors, what semantic HTML mark up is, and how to write quality code in javascript -- unobtrusive javascript is something to look up.

Javascript is really worth learning in depth. It has some quirks that will gently introduce to some useful topics such as JSON, closures, elements of functional programming, prototype based inheritance, and so on. Further, it will help you understand how to get more out of other dynamic languages too; python, ruby, etc. Douglas Crockford has some great videos on Javascript that are worth looking up.

You're not restricted to client-side programming with Javascript either. For instance, look up nodejs - a nascent server-side javascript framework that looks quite promising. It will really make you think if you've just been a PHP guy up to now!

Try and get a handle on PHP's more advanced aspects - many of which have only really arrived in recent versions. Classes, name spaces, closures and so on. Although I'd really suggest another dynamic language altogether; python is a good choice, but ruby is splendid too.

Once you're confident with that stuff you may want to go in a slightly different direction. Try Java, C, Clojure or Erlang. Try reading some more general computer science books.

I hope that helps. Good luck and all the best.

[+] yannis|16 years ago|reply
Before making any suggestions I would ask what is the definition of a better programmer? Since this can be a bit subjective I will suggest that you strive to become an 'expert programmer'. It is difficult to even define what an 'expert' is, but normally one would recognize an expert as someone that effortlessly accomplishes a task. Some characteristics of experts from psychological studies are:

1. Experts such as chess grandmasters rely on a vast store of knowledge of game positions. They tend to organize this information in chunks, which can easily be retrieved from long-term memory. The same is true for other experts from sports to mathematics.

2. They also typically engage in years of effortful study, continually tackling challenges that lie just beyond their competence

In my opinion you need to accumulate both, ie, expand your store of knowledge, as well as continually striving to handle situations where the task in hand is beyond your ability.

At this point in your experience my personal recommendation is to actually focus on number 2, for example refactor some PHP code into OOP, to give you another angle of programming as well as tackle JavaScript for the same reason.

The 10-year rule states that it takes approximately a decade of heavy labor to master any field. As one that has gone through a couple of 10 years:) the best advise I can give is 'learn to program' rather than learn 'to-days-popular-framework-or-language'. Think about it as similar to writing a book, knowing English will not turn you into an author. Practice will as well as motivation.

[+] fleitz|16 years ago|reply
PHP is mostly an imperative language with a C-like syntax. In imperative languages with a C-like syntax most OOP is just syntatic sugar on a pointer called "this" with a bit of RTTI checks for casting. If your code is unmaintainable with out OOP, OOP isn't going to help.

A far more effective skill to have is to figure out how to build a complicated application simply rather than switching to language that makes it easier to increase line count and have semi-working code.

I know PHP isn't cool anymore but at the same time, Facebook was built with it. One person can't build Facebook (in it's current incantation) so it's pretty useless to try and find the magic framework that will let you. Figure out how to prototype quickly: once your userbase exceeds the capabilities of whatever tech you have picked you'll usually have enough users to find capital/revenue or have it knocking your door down. At that point it's easy to find the skills to port to whatever the language / paradigm de jour is.

Figure out how to make the SMTPs of the world not the X.400s once your not building X.400 you can implement SMTP in just about any language.

[+] csallen|16 years ago|reply
I was in your position not long ago. I'd recommend using Ruby on Rails, which will teach you a lot about OOP and the MVC framework. There are some similar frameworks for PHP (like CakePHP), but Rails' established community and abundant documentation make it a better starting place.

Javascript (http://www.w3schools.com/js) is an extremely important part of the web today, and jQuery (http://www.jquery.com) makes it more manageable than ever before. It's not difficult to learn -- you can make a lot of headway in a single day.

If at all possible, work alongside other people. You'll learn a lot from their habits and their code. And work on actual projects. Learning for the sake of learning is much more difficult than learning while you're building something.

[+] macco|16 years ago|reply
I wouldn't concentrate so much on certain programming languages, instead I would concentrate on designing programms. I don't know your background. I guess you are learning on your own, so I would recommend http://www.htdp.org or http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Compute.... Some people will recommend Structure and Interpretation of Computer Programs. This book maybe the best on programming, but I don't think it suits a selfteaching individual.
[+] allantyoung|16 years ago|reply
Good advice and helpful links. I would add picking up a few good books on Design Patterns.
[+] NathanKP|16 years ago|reply
I can do everything I need to with PHP and MySQL, however I'm currently working on JSP, and planning to learn Ruby and Python.

If you want to learn object oriented thinking I would recommend Java or C++. Fortunately I was already proficient at C++ before I started web programming so I already had a fairly firm grasp of object oriented thinking.

As for learning programming languages, to my way of thinking the more languages you know the better, both from a job standpoint and from a flexibility standpoint.

[+] rpledge|16 years ago|reply
Learning a C language (i.e. C/C++/Java) is great advice for increasing your programming knowledge. You'll learn how software works at almost it's lowest level. I wouldn't advise learning some architectures assembly language unless you really get C and want to really dig into low level programming. It's a great skill, but if you don't want your career to go that way there are better places to invest in your education.

OOP (as mentioned in the question) is a great thing to learn as well. Depending on if you have any experience with OOP I always point people to the book "Design Patterns" by Gamma et al. It changed the way I build software in so many positive ways I doubt I could even list them all.

[+] jdietrich|16 years ago|reply
Build stuff. Break it. Fix it. Build more stuff.
[+] vdoma|16 years ago|reply
I'd say focus on the basics - learn more about algorithms, operating system internals, data structures, concurrency, human-computer interaction, general OO/Functional/Procedural programming principles, etc. Languages are dime a dozen - once you're strong in fundamentals, picking up a new technology/language/framework becomes a lot more easier.
[+] mattm|16 years ago|reply
Buy a subscription to Safari Online and spend 15 minutes each day reading about programming.

It doesn't really matter what you read. Just pick a book that currently sounds interesting and read it. Since you are interested in OO PHP, there is a book called something like "Developing Object-Oriented Applications in PHP 5"

[+] cabalamat|16 years ago|reply
Lots of people like Ruby+Rails or Python+Django, so these are obvious choices. Also, if you choose a system that lots of people use, it's easier to get support from the net when things go wrong (as they are bound to from time to time).
[+] alrex021|16 years ago|reply
Learn a new programming paradigm. For example, if you are a OOP literate, learn FP.
[+] meddah|16 years ago|reply
91 Ways to Become the Coolest Developer in the World http://www.techquark.com/2008/11/91-ways-to-become-coolest-d...
[+] NathanKP|16 years ago|reply
That is quite an extensive list and probably includes just about everything you would ever need to know. Personally I like to keep it short and sweet: The coolest developer in the world is always learning and is ready to try new things and new approaches. That summarizes probably 90% of those 91 points.