5 ms·
Ask HN: How to become a better programmer?
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.
- tsally 17y agoIt'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 http://norvig.com/21-days.html. You'll find some language recommendations in the appendix.
- Paton 17y agoBetween starting with Ruby on Rails or Django with Python, is one better to start with than the other?
- alanthonyc 17y agoI was in a similar situation to you earlier this year, in that I was trying to decide between Rails and Django. I ended up going with Django, but I don't think there will be much effective difference to you regardless of which one you choose. Both platforms are good for building web apps and both languages will help you learn new concepts. I went with Django because of the wealth of documentation abailable online and the fact that I have personal resources to tap on Python (although I've used mostly online documentation for that as well). If you end up going with Django, feel free to email me with questions. I'm sure I can help with some of the "simple" and "stupid" things that can trip up newbs for disproportionate amounts of time.
- andrewcooke 17y agochoose whichever your friends use, or whichever community you find friendliest, or whichever has the documentation you prefer. technically, either is fine.
- ErrantX 17y agoDespite what a lot of people will tell you ;) Python isn't really a web app language (really, at all, in the slightest). Stick with PHP or learn RoR. In all seriousness if a web app is your aim, and you have on in mind, then stick with what you know and get good at it - it will suffice :) at the end of the day there is no particular limitation with PHP that RoR or Python will solve - if you get the point of having to worry about scaling etc. then they all have the same issues/solutions :) EDIT: if your going to disagree that's great! But lets hear some reasoning - there is no logical reason to pick Python to learn from scratch if you already know PHP and wish to start a web app. Seriously speaking it's a waste of time; python is a killer language (and by far my favorite) but PHP and RoR are much saner choices for a web app :)
- jacoblyles 17y agoPython is a mature language with solid implementations, top-class web frameworks, an above average user community, and hundreds of libraries that do pretty much any thing you want. Ergo: it is fine to use with web apps.
- ErrantX 17y agoBut im not deriding Python per-se (indeed I believe it is a fantastic language and the vast majority of my code is in Python). However when you consider it in the situation of a Web App (i.e. running under Apache or another web server) it loses most of the advantages. Not to make it worse - but if you know PHP there is no huge benefit for switching to Python :) Which is what the OP is asking "should I learn a new language to make a web app in". I'd say no, not if PHP serves you fine! :) On the other hand if you want a general purpose language to hand then, yep, Python is ace. (despite all that when programming for the web I still prefer PHP, because, well that was what it is designed for).
- jacoblyles 17y agoI wrote a PHP app back in the day. It was small and messy, had code strewn all throughout the HTML. Hell, I didn't even know how to run a PHP script without loading an URL in the web browser. That's not necessarily a fault of the language, but the books available for PHP taught me how to code that way. And the community was in a perpetual state of newbishness. At least in 2005, the IRC channels were dominated by people (like me) who one day though "I have no programming experience but I would like to make a web app. I know! I'll use PHP!". PHP can be programmed well, but it was hard to find someone in the community to point you in the right direction. Facebook proves that large, successful web apps can be built with PHP. But PHP was probably not Zuckerberg's first or only programming experience. As for your contention that "Python isn't really a web app language (really, at all, in the slightest)", that's just straight stupid, and doesn't deserve a further response.
- jacoblyles 17y agoPersonally I tried Ruby on Rails and I did not like it. There was too much magic going on and it was confusing to a beginner like myself. I thought about Django but I got the impression that it is just "Python on Rails", so I stayed away from that too. I ended up going with web.py, and I enjoy it. I understand what is happening and what all the pieces of my program do. It's not for everybody. There are fewer plug-ins for the framework and doing things like session management is a little harder than in Rails. The community is small (though the Google group is active). I had to spend 10 or 20 hours learning sqlAlchemy instead of having an DBORM handed to me out of the box. But it is far easier to create a complex web app that breaks the Rails/Django paradigm. Reddit uses web.py. There are some cool open source projects on Github that can get you started: http://github.com/alexksikes http://github.com/alexksikes Please note that my experience may have been better because I already logged a thousand lines or so in Python before diving in (which reminds me of a great free book for learning Python - "Dive into Python").
- andrewcooke 17y agoi disagree a little with the advice above as a recommendation for the original poster. i'm not saying that web.py is better or worse than django or ror, but i think that as a "learning experience" it's probably better to go with one of the larger packages. learning to use a big package will teach you a lot. once you have that understanding, sure, go with web,py and cut your own path.
- tlrobinson 17y agoLearn 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 17y agoSince 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.
- rabidgnat 17y ago"Don't expect to actually develop websites in it" I just tried to develop a website with SBCL and Hunchentoot, and it works relatively well for small examples. There's pretty good MySQL support, and it's all pretty fast. I couldn't figure out how to get a long-running SBCL process to keep even on memory usage. I saw a talk from a guy who works at ITA software [1] where he said they blow away their SBCL instances and restart them on regular intervals, so maybe it's just not possible! To anyone who is serious about developing a Lisp website, I'd spend a lot of time up-front evaluating different Lisps [1] I can't find this talk anymore :<
- radu_floricica 17y agoIt's about the tool for the job. Most websites just don't have that much server code to justify a bigger hammer. And lisps definitely take a stronger arm to swing. Right now I'm re-learning PHP, and I'm shocked at both how prone to shortcuts it is, and how practical most of these shortcuts are. It's truly a tool for the job. I have yet to see if the cool toys like first order functions are actually usable, but I wouldn't be surprised at all if they were. All that's missing for most people is a feel of what can be done - and that's exactly what a couple of months of lisp can do.
- NathanKP 17y agoI 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 17y agoLearning 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.
- meddah 17y ago91 Ways to Become the Coolest Developer in the World http://www.techquark.com/2008/11/91-ways-to-become-coolest-developer-in.html http://www.techquark.com/2008/11/91-ways-to-become-coolest-d...
- NathanKP 17y agoThat 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.
- Zarathu 17y agoYeah, that, and the title is totally misleading. There can't be thousands of coolest developers in the world, dammit!
- Zarathu 17y ago"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 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.
- datasink 17y agoWhat are the extreme OOP flaws still present in PHP 5.3? And how does the needle/haystack issue relate to PHP OOP?
- Asa-Nisse 17y agoI 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.
- daleharvey 17y agoto build complex web applications you need to learn javascript, I would also take move along to ruby / python / erlang as well as/instead of php. then I would start bashing out applications as quick as you can, stuff with a smaller scope and a clear end so you can keep them public for quite a while and learn how to reduce/remove maintenance cost.
- jacquesm 17y agoHey 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 17y agomore 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.
- csallen 17y agoI 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 http://www.w3schools.com/js) is an extremely important part of the web today, and jQuery (http://www.jquery.com 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.
- zaidf 17y agoA 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 17y agoAgree. 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.
- olalonde 17y agoI can't describe how OOP changed my life. You have to learn it.
- vdoma 17y agoI'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.
- Asa-Nisse 17y agoSince 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 17y agoThis 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/ 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.
- NathanKP 17y agoDownvoted for tone, not for the quality or validity of your viewpoint.
- yannis 17y agoBefore 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.
- alrex021 17y agoLearn a new programming paradigm. For example, if you are a OOP literate, learn FP.
- breck 17y agoSounds similar to where I was a few years ago. Here are my tips: http://breckyunits.com/twelve_tips_to_master_programming_faster http://breckyunits.com/twelve_tips_to_master_programming_fas... Feel free to email me if you want to talk further. Good luck!
- prakash 17y agohttp://norvig.com/21-days.html http://norvig.com/21-days.html
- macco 17y agoI 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 http://www.htdp.org or http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm 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 17y agoGood advice and helpful links. I would add picking up a few good books on Design Patterns.
- fleitz 17y agoPHP 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.
- jdietrich 17y agoBuild stuff. Break it. Fix it. Build more stuff.
- cabalamat 17y agoLots 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).
- ngom 17y agoYou 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.
- mattm 17y agoBuy 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"