It took me some twenty-plus years to really learn how to program. It wasn’t for a lack of trying either, it was just that I was trying the wrong way. I tried to learn to program by following tutorials that created programs I didn’t have the slightest interest in keeping. I was trying to learn for the sake of learning.
Now I’m sure that works for some people. Intellectually curious for the sake of it. I envy you. But that’s not how it worked for me and I know that’s not how it works for a lot of other people.
What made it click for me was programming in anger. Programming because I needed to. Programming because I gave a damn about what I was writing and I wanted it done sooner rather than later.
That’s how I learned to program Ruby. By making it my mission to write Basecamp in it. When you’re learning on a mission, the order of things come really naturally. So what exactly do I have to do to get this messages section working in Ruby? Oh, I’ll need to do a loop here. Oh, I’ll need to get something from the database there.
Before you know it, you’re half-way done with your idea and you’ve accidentally learned how to do it too.
In short, you start with little bit of something real and make it tick. Then you make it tock.
Jeff Mackey
on 22 Sep 10Passion. Purpose. Pressure. All three motivate more than “Hey one day I’d like to learn Rails.”
Brian Cardarella
on 22 Sep 10This has been a question I’ve been hearing more and more often. People looking to get into Ruby (via Rails) feel overwhelmed and don’t know where or how to start.
Passion can certainly force a hand. However not everybody has that passion project.
DHH
on 22 Sep 10Brian, I think passion overstates the issue. You don’t have to have that all-flaming, insatiable desire to get going. You just have to want a concrete, real program to work. Starting to learn something without even a shred of a goal feels premature to me.
riddle
on 22 Sep 10I’m wondering how Jason Fried will learn Rails (he declared it here some time ago) – there’s no anger in motion, because there’s always someone to code what he wants for him.
Or is this unrelated?
Ben
on 22 Sep 10@DHH
You not having a Computer Science degree explains A LOT.
Neil
on 22 Sep 10So so true, it’s taking me years, but now I’m getting right into php/js/as with my own projects.
I find programming is for people (who aren’t naturally good at it) who posses patience and determination.
You have to love/want it!
Joshua Pinter
on 22 Sep 10Couldn’t agree more.
Besides, those tutorials are always built with those situations best suited to demonstrate the tutorial itself. It gets hairy out in the real world and that’s when you really begin to learn.
Erik
on 22 Sep 10I think there is a combination of things that you touched upon:
1. You have to personally need whatever you are building / coding. That’s your drive to actually take the plunge and pay attention.
2. The corollary is that it helps if it is something personal that only you need, or that only you will see the results of (for at least the first few versions). That will prevent perfection paralysis, where the perfect becomes the enemy of the good.
3. It helps if it can be iterative in nature, and if whatever it is can be built out in phases. That allows for the learning process, and as you build out each subsequent piece of functionality you can plan time for fixes, tweaks, and enhancements to the prior phases based upon what you have learned since then.
I’m not a programmer, but this is how I learned to build a database in MS Access, which to a non-programmer can be maddening at first.
Robert
on 22 Sep 10Agreed, I find it more useful to work on something practical and reference books/tutorials when you actually know what you are looking for.
You can always read through technical books later to fill in your knowledge gaps and polish your skills after you’re sure you can be successful making things.
Terry Sutton
on 22 Sep 10What I often wonder about programmers is whether or not they have CS degrees. Not that this is necessary (nor ideal necessarily), but it certainly makes it easier.
I’m always envious of the guys who learned to program in university – 3-4 years of continuous experience.
Did you go to university? Take any university classes? Or did you just learn on your own with your own side projects?
[I ask because I’ve tried to learn PHP about 25 different times, but life always gets in the way. When I return to a tutorial I was learning a few weeks ago, I always need to start from scratch.]
Maxim
on 22 Sep 10And what tutorials/sources of information/books/websites would you recommend for someone who NEVER programmed and only knows basic arithmetics, algebra, HTML & CSS?
Frank Hmeidan
on 22 Sep 10Nice. Sounds familiar – its the same reason I learnt Web programming, coming from a background in Java.
Christophe Maximin
on 22 Sep 10Most people learn to program because they love the idea from the start. If you’re asking yourself the question, you’re probably on the wrong track :)
DHH
on 22 Sep 10I actually got half a comp sci degree (my bachelor was in biz admin/comp sci), but that wasn’t where I truly learned to program.
Michel
on 22 Sep 10I really think that’s a great way of learning, that’s how I learned most of what I know too. I’ve been trying to get into Ruby, but I lack the motivation after a full-day of programming at work even though I have tons of great projects I’d like to get done.
During my last vacations, I started playing around with Ruby, got a good start with it, but as soon as work started again I couldn’t get around to continue. I’d like to make my job switch to Ruby and Rails, but coming from ASP.Net, it’s a pretty big change that I’m sure will never happen.
Guillaume
on 22 Sep 10a precise goal was key for me. Even though I was in a programming school, I had no interest for it, until I realise I wanted to work in visual effects. Then I had real problems to solve -for myself and not for the sake of a good grade -and learned a ton, effortlessly. By a ton I mean many languages (C,C++, perl, python, tcl) and scary concepts like object oriented.
Lack of interest had transformed into huge passion.
I wish my teachers had taken time to find concrete examples for us to solve, rather than theory-only classes, which seemed pointless for so long.
Jamis
on 22 Sep 10@Terry, a university degree is more of a resume builder than an experience builder. I speak as a holder of said degree.
Am I glad I have that degree? Yes. I was exposed to several things that I might not have been exposed to otherwise, and which I found very interesting, like compiler theory and abstract data structures. But I had learned to program before I attended college—my unversity experience did nothing to make me a better programmer, just a better theoretician.
Experience is a better teacher than a lecture hall, but the lecture hall may be better at putting new ideas in front of you.
Vincent
on 22 Sep 10As a programming new-commer, I’m wondering a little about the process though. I understand the general principle (idea -> make wire-frame -> choose the language -> code -> release / iterate-iterate-iterate -> profit), but where I think I would get stuck is the ‘choose the language’ phase, prior to the coding one. Not to say that any of the other steps are easy.
Dan
on 22 Sep 10Thanks for the post David. It helps to reinforce what I’ve learned as well. I’ve only programmed for about a year. I agree about the books not being helpful. And to add to that, I don’t think they’re very well written either.
As a complete beginner to programming with no computer background, it took a little while to figure out the “have to dos” vs. the “its up to you”. What I mean is, for example, when you start a session in PHP, you HAVE to add “session_start” at the top of the script. OK, cool, that’s great!! Black and white.
Where it gets tricky, and where I think many books fall short is for example; say you want to query the database and display your results. Most books will show you one way (their way) but not really give other options or even state “there’s other ways to do this”. I was always left wondering – is this THE definitive way to do this, or do I have choices?
Even more confusing was the area of overall program design and architecture. How you structure things etc. In books and tutorials you’re always shown how to write a little example of a script in one file – but not so much how to get a bunch of scripts in an application to interact and talk to one another. And if they do show you that, the focus is still on the details in each file and not a very good explanation of where they’re coming from with the design. But, it actually isn’t so confusing once you do what you’ve suggested – just start building and figuring it out.
This is where I have interest, and to close a longwinded comment – this is where, YES for sure, I have found building something to FINISH it has taught me much more than books or tutorials.
Don Schenck
on 22 Sep 10I have one, ONE, Ruby on Rails question that I need answered. Where do I get such an answer?
My switch from .NET to RoR is driven by my need to build my subscription-based website, and to move to the Next Big Thing. Not anger as much as desperation … which works for me!
JF
on 22 Sep 10I’m wondering how Jason Fried will learn Rails (he declared it here some time ago) – there’s no anger in motion, because there’s always someone to code what he wants for him.
Actually, it’s frustration. It’s exactly what DHH was talking about. I’m frustrated when I can’t make something work on my own. I don’t like having to ask other people for help to hook this up or that up.
My personal interest in Rails isn’t to learn how to build something from scratch, it’s to understand code that exists, being able to stitch things together, and to modify how things work around a new design idea.
Rob
on 22 Sep 10It depends what you mean by ‘learning to program’. I’ve been doing it well (arguably) for about 5 years, now, but I don’t consider myself a good programmer, really.
I think there’s a huge gap between those who learn to program because they think it’s something that would be good to know – I see these all the times; people posting ‘What’s the best C++ compiler to learn with?!’ on forums – and those people who program because they actually have something they need to get done that’s not possible without some code.
I’m with you, DHH. It’s programming because you need to. Tutorials are nice to give you a brief feel for the language, but you’ll never start learning until you have a project. To be honest, I’m not sure if that’s enough, though. I feel, some days, that to really learn ruby, I need to use it at work for the next couple of years. Efficiency and understanding of idiom comes only from exposure, and that is as much a part of programming as being able to write a simple script.
Andy
on 22 Sep 10Agreed – I absolutely can’t learn anything unless I’ve got a real project to get my teeth stuck into. I tried to lear Rails back in the 0.9 days, but without a real project it was just a bit of messing about. When I finally got a real project to implement in Rails, that’s when I REALLY started to learn it.
It’s a shame that ‘on the job’ training gets a bad name – it’s really the best kind there is.
Merle
on 22 Sep 10Jason, If you have a good working relationship with programmers and can get them to execute your ideas as you envision them then that is a massively valuable skill in itself.
JF
on 22 Sep 10Jason, If you have a good working relationship with programmers and can get them to execute your ideas as you envision them then that is a massively valuable skill in itself.
That’s not enough for me. I want to be able to execute some of these ideas on my own. Every time I have to pull someone else away from their work to hook this little thing up, or try this other idea out, it’s a distraction. It’s selfish.
John Polacek
on 22 Sep 10As others have stated, when it comes to learning anything, the key is to love doing it. Learning a new programming language obviously requires spending vast amounts of time, and if that prospect doesn’t excite you, you will probably fail. Frustration is enough to get started, but passion is required to maintain the momentum.
As an artist, people often tell me I am talented, but it’s not true. I think of talent not as an inherent gift, but rather an inherent desire to become good at something. Either you are excited at the prospect of expending huge chunks of your life doing something, or you aren’t.
Steve R.
on 22 Sep 10I wrote exactly one program outside my grad work, because I had to. I hated it. I took up RoR to solve some specific business problems that have frustrated me throughout my career. I am working on two RoR apps now, in my (limited) downtime, and enjoying it immensly. I suspect that DHH’s design-from-pissed-offedness of Rails resulted in a framework that appeals to others with a similar PO threshold and approach. While I still do not write great code, I can spot my abominations much faster now than when I was working on stuff I didn’t care about or found ugly as hell and/or painful to develop in (looking at you, C#), so I’ll get better faster. Or even, just get better.
Fleas
on 22 Sep 10I don’t get the ‘anger’ made me code idea. I’ve always enjoyed crossword puzzles and chess, I like to think and find solutions and analyze the solution to see if there is an even better solution.
I Like to code many steps in thought, ahead of the first line being written, just like chess.. you can see some obvious straight forward good moves that give you a piece or two, but if you think just a little longer, a little deeper, you might see the window of victory, instead of the instant gratification of obtaining your opponents pieces.programming to me is like that, there is the “Oh wow, I got it to work HOORAY!” and then the “Now I understand it, and it would be much better to DO THIS instead!”
Last but not least, the absolute best way to learn anything is to do it and help others learn it.
hasen
on 22 Sep 10I learned programming the you envied ;)
however, I didn’t learn proper project management habits until I was doing something real (aka real life website). Suddenly a whole lot of other things became necessary: I needed a way to keep the history of my project, I needed a way to deploy the website, I needed to deal with databases, I needed to administer the server … etc, etc.
At first I was doing a horrible job at all of these bits, then over time I learned.
I’m still not sure if I’m doing them properly or not.
Don Schenck
on 22 Sep 10To answer my own question: Try harder. Look. Experiment.
I found the answer to my question; it was a right-click away in my NetBeans IDE!
See what just happened? David’s post forced me to confront my ignorance, and my post displayed it, cause me some embarrassment. In turn, I tried harder … “Adapt and overcome”!
Thanks, 37 signals!
Matt
on 22 Sep 10Nice post, I think I fall into the same category. I often find myself reading books and glazing over wondering if I really need to know 10 ways to solve the same problem – Just show me the best way! Anyhow, I liked your insight
Matt Brown
on 22 Sep 10The best thing I ever did for my career (without even planning it), was building a music-reviewing website. I got an Associate Degree in CS and that gave me a good foundation to build off of, but I didn’t know shit until I dove in and coded things up by myself.
Instead of building “Hello World” apps that you just toss in the trash afterwards, build something you’re actually interested in keeping.
Ironically, my music website has been going strong now for ten years. I build a new version each year as technologies change – to enhance my skills. Almost every interview I’ve been in, they care more to talk about my demonstrated skills from that site, versus caring about a degree.
Build something you can call yours that can serve as your playground for learning. Who knows, someday it might pay the mortgage too.
David Albrecht
on 22 Sep 10Not to be snide, but the stuff 37signals does doesn’t require much computer science—their strengths are more in design, and writing. And Ruby buries a lot of CS inside its internals (data structures, compiler design, etc.).
To the extent that most jobs don’t require knowledge of CS, it’s a fair statement that going to university is a waste of time for many. However, you’re never going to get MapReduce, or a new programming language, or facebook, without at least a few guys who really understand how to build at scale. I respect what 37s does, but their engineering can’t hold a candle to most of these companies. (I recall reading something about a 500GB production database giving them trouble a while ago…Google’s BigTable infrastructure processes petabytes of data without breaking a sweat).
Justin Ko
on 22 Sep 10Jason Fried, I will fly in and teach you Rails for $100/hour.
Jose Rivera
on 22 Sep 10I really enjoyed programming while in college. I learned Fortran 77, and C++. Now, I wish I had the time to learn Ruby on Rails to develop some awesome applications.
Jon Glick
on 22 Sep 10It’s a shame that ‘on the job’ training gets a bad name – it’s really the best kind there is.
Jon Glick
on 22 Sep 10whaaaa??? this just ate my entire comment! the above was a quote from Andy’s comment.
Justin Ko
on 22 Sep 10Jason, why should you pick me? I started as a designer 7-8 years ago. I knew Photoshop, CSS, and HTML…but was frustrated staying “client side”. So, I picked up some Rails & Ruby books and read them cover to cover.
With that said, your approach will be the same as mine; going top down – starting with the browser, then going server side. I know how a designer thinks, and what areas will be tough to grasp.
Having someone at close hand where I could ask questions and not feel like I’m bothering them would have been extremely valuable and saved a lot of time.
Whatever happens, good luck on your path into the world of programming :)
Sachin
on 22 Sep 10i agree on that….fire in the belly to do and achieve something is must
Mark
on 22 Sep 10I started a rails website with a friend and we are both learning programming on the fly.
Not only are we programming because we need/have to. But we can help each other out on some of the more difficult concepts.
Ciarán
on 22 Sep 10Thats the best type of programming, making a handy tool for yourself or something that your passionate about. Its a driving force when problems arise.
Grant
on 22 Sep 10I’m a designer who learned to program out of shear frustration. I didn’t have the resources to hire a programmer yet I had ideas that I wanted to execute and was tired of feeling helpless. I let the frustration motivate me, and now I can play both ends—design and development—it’s the best thing I ever did for my career.
matt mcknight
on 22 Sep 10I actually found the structure of DHH’s first Agile Web Development with Rails book quite useful, and it’s a tutorial that walked me through creating an application.
Of course, I already really knew how to write (Java) web applications, and the sheer magnitude of XML that was absent from the proceedings was sufficient motivation to make it a real page turner.
Amber Weinberg
on 22 Sep 10I’m going through the same thing with trying to learn Objective C. While I’ve been going through a great how-to book, I can already tell that the best way to learn it, is just going to be by jumping in and trying to create my first commercial app.
Yaritsa
on 22 Sep 10@David, excellent article and very valid points @Jeff Mackey Great comment!
Michael Hopkins
on 22 Sep 10Thanks, David, for the post. I’ve preferred the approach you advocate for some things, like learning PHP. For others, like SQL, I did much better doing dozens of exercises and quizzes online. As another example, I learned CSS as I built a website, but I did practice DIV positioning several times.
Rachid al Maach
on 22 Sep 10I think that the most important thing you did wasn’t anger but the believe that you had in what you were making. Secondly the believe that Ruby could help you in reaching your goals.
As of my own experience I couldn’t learn it before being convinced that it could be a tool for me. Still a learner like most of us the best way is to just to do it, starting to scratch your own itches. One of the best motivation to learn.
Gaurav
on 22 Sep 10@Jamis It’s unfortunate that your degree in CompSci didn’t make you a better programmer. I used to program before starting my degree as well, and now when I’m just about to graduate, I can say without a doubt that the degree helped in making me a much better programmer. Of course, personal projects helped me apply what I learnt with different languages, solution stacks etc. But the degree itself made sure I knew how what I going to approach the problem. Things like computational complexity, design patterns, refactoring practices, etc. can be learnt by yourself, but it’s only when they’re forced on to you that you actually realize the importance of each. Before university, most of my code was just hacks, as long as it worked in a strict sense, I didn’t care. Another thing my degree helped me with is open my mind to other paradigms, school of thought, etc. For example, I would’ve never considered LISP before in my coding. Of course all of this can be learnt by oneself, but most people would just continue writing weak code without realizing how it could be improved.
Robert Sullivan
on 22 Sep 10Interesting point, as I’ve just finished reading McDougall’s Born to Run, in which he noted that on ultra-runner, Anne Trason, was motivated by anger/competition. She supposedly said to some Tarahumara Indians either “How does it feel to compete (or be beaten) by a woman?”. But the Tarahumara run for the pure joy of it. So yes there’s the anger/frustration element, surely that had impact on Torvalds when he wanted to run a real OS, but didn’t have $5K to license one, but certainly, there were elements of passion and creativity and not bothering with what other people think, i.e. “you can’t write an OS – it’s too hard” (when Tanenbaum wrote Minix in 10,000 lines).
As for CS-degree/no CS-degree – c’mon, are we to believe Mark Zuckerberg, Bill Gates, Steve Wozniak, aren’t real programmers because they have no CS degree? Laughable. My own experience is that CS provides a good base, but the real world is where you push the limits. CS just skims the surface. It’s actually sad to see the UofX become little more than an expensive cafeteria serving wealthy clients, plopping this or that degree on their tray, and they go off on their merry way, a little poorer, but a stamp of approval.
Do you think they teach classes at the University on how to scale Twitter? Facebook? Skype? LinkedIn? BaseCamp? No – but the guys who did will probably come in and give a guest lecture, like Bill Gates did at Harvard. Apparently that was the one lecture Zuckerberg didn’t sleep through, or actually attended – when he wasn’t working on his little side project.
Universities mostly give you access to other smart folks, and resources, and time, but certainly there’s no law that states only good, proven software comes out of the U.
Anywho – learning programming is a continual process. The U is a great starting point. Or your local community college, or even a commercial course, a lecture. Have lots of fun!
Eric Rafaloff
on 22 Sep 10I really agree with this! I’ve been trying to learn Rails for a while solely for “learning” reasons… and it’s been so hard! I’m MUCH more motivated when I’m sinking my teeth into a project and getting satisfaction out of it!
Ray Saunders
on 23 Sep 10I often learned programming techniques by following my curiosity – how does this program work? – how did they do that? – then noticing a different/better way. I also found motivation was a great teacher – pranking a colleague via software, building in-house software instead of spending zillions to buy a package, etc. I’m also very much into ‘what if’ thinking about almost anything, then trying to see if I can do it via software.
Sherwin Valdez
on 23 Sep 10something like Just in time learning XD
cantbecool
on 23 Sep 10@JF I completely understand where you’re coming from. When I was doing an internship, I constantly had to ask help from people around me on how to complete a task in .net. After about a week of doing that, I got pissed off at myself and quit.
After that experience, it gave me the motivation to start something fresh and exciting. (Ruby/Rails) It’s everything I hoped it would be. Now, I’m just waiting for the next batch of Rails 3 books to come out and make my second little project.
@DHH Thanks for sharing your thoughts on the matter. What programming languages did you initially learn PHP at school?
Thibaut Assus
on 23 Sep 10You really changed the way I feel about programming and the life in general. Now, really, I’m so happy to create software that way ! By creating it, just sticking to it, without waiting…
viatropos
on 23 Sep 10100%. If you want to make something so intensely, and it involves computers, and you’ve never touched a computer, you’ll master programming on the journey. That’s exactly how I got started.
Brian Lopez
on 23 Sep 10@DHH completely agree on the style of learning. I’ve always been the type that needed to be down in the trenches to really grasp the tools I was trying to use/learn. Almost every project I have on Github started exactly the way you described.
On a related topic, I find it interesting that a lot of people with genuine understanding or talent for something traditionally are lacking the passion to do anything useful with it. I like to challenge those people to help others (including myself). At the same time when you come to some enlightenment, we should absolutely share it with others on your blog or twitter or whatever – you’re surely not the only person who may have been struggling with what you were working on.
This to me describes the open source community as a whole in my experience so far. And I’m fucking loving it :)
Niklas
on 23 Sep 10I agree, I’ve seen to many people try to learn by tutorials they were not interested with. Set a goal (high) and then learn what you need to learn to reach that goal.
Daniel
on 23 Sep 10Same concept applies outside programming; for anyone who’s resilient in getting things to work, and working better.
MJ
on 23 Sep 10This is exactly how it worked out for me.
For many years I was trying to program from books, I’d get 5 or 6 chapters in and then stop. I thought I was just a person who couldn’t program, just not capable of wrapping my head around it.
Then I had a website I wanted to build and I wanted to try out Rails and I forced my way through and… hey! I know how to program in Ruby, how did that happen?
Only wish I’d made that discovery when I was 10, rather than 25, I might be a bit further along in my career.
So now if I want to learn a new language I find a new project to build in it first.
Matti
on 23 Sep 10It sounds a bit like when my daughter learned to ride a bike. My parental advice didnt help, but when she learned and I asked how she did, she answered: “I just concentrated and kept the feet moving” :-)
James
on 23 Sep 10I am old – I’m 43 – and my experience of programming started with Cobol, then REXX, 390 Assembler, then C/C++. But the turning point in my career – was when I had mastered data-structures – organising data, addressing, understanding algorithms, sorting, searching, collating etc. It’s not enough to know the syntax of a programming language. Once you understand data manipulation – then any/(all)most languages will do.
Long ago I attended a course given by the head of development and learning (on HLASM) at AMDAHL (Australia) – and the single most important piece of advice I can pass on from him – to you – is ‘know your data’.
Geoff
on 23 Sep 10I’ve been programming computers since the early 1980s, starting with Commodore BASIC, 6502 assembler, a bunch of languages in college, and today, Perl.
Programming is a verbal activity. You program by expressing what you need the computer to do in a language it understands. In order to be successful doing this, you need to have a certain mindset, and that mindset, I fear, is something that books never teach.
Knowing a bunch of programming constructs - where to put a PHP tag, what a while loop is - these are all akin to a child learning his first words. The child may learn that if he parrots the words in a certain sequence, he gets things to happen. A lot of beginning programmers do the same thing: they cut and paste from examples on the web, see results that resemble what they need, cross their fingers and hope for the best. The problem is, they really don’t understand what they’re doing; they’re just mimicking something.
A real programmer can look at a problem much in the same way an experienced furniture mover looks at a house’s contents. He can tell that first the front door needs to be removed from its hinges, then the couch can come out - sideways - followed by the large lamp that stands behind it. There is an order to his approach, dictated by experience with what works and what doesn’t.
I tell people that if you can sit down and write out all the steps it takes to get from your kitchen table to the grocery store and purchase a carton of milk—down to the detail of finding your car keys, checking to make sure you have enough money in your wallet, selecting a grocery cart, etc., then you can program. It’s just a matter of learning the talk that gets you what you want from that point.
As the original writer found, having a reason that truly motivates you to learn, rather than a vague idea that learning something might be good for you, is important for the human psyche. It’s like the chicken and the pig walking down the street past a ham and eggs joint. The chicken turns to the pig and says “I’m involved in that!”. The pig knocks the chicken on his ass and declares “you might be involved, but I’m committed!” Having a problem that you need to solve makes you committed.
Good luck to the new programmers out there. It is a worthwhile, rewarding experience to program and do it well.
James
on 23 Sep 10Your comments are right – I used to ask trainee’s – write down in as much detail as you can – how to make a cup of tea. It usually starts off high-level – and then when they begin to get ever more fine-grained in their analysis – they begin to realise the granularity of what might be needed to properly address a problem..
One thing that I would say though – unless you have a degree in CS – where you may have indeed studied data structures and algorithms and how to implement them from scratch; many of the building blocks of data analysis are shielded from the very modern programmer. For example – who writes a liked list these days; when in C++ STL you can just use vector or list – and there are many other examples. As in my previous post – it’s about knowing your data!
Once you become versed at how to organise data – you can look at most programs’ UI or usage and think ‘I know how I would implement that’ – ‘I understand how that works under the covers’.
James
on 23 Sep 10Here’s my last post on the topic – a blatant piece of self-promotion.
www.tenfiftytwo.co.uk/pipelines
Nigel
on 23 Sep 10In 1972, while studying engineering, we did a 5 day, mornings only, course in Fortran IV (on punch-cards). This taught us the basic concepts of constants, variables, loops, function calls, etc., and how to make a program run on that particular mainframe.
We were then given 3 tasks to hand in over the course of the year, and it was up to us to find out how to do it.
From an engineering point of view the programs were interesing (calculating the co-ordinates of the bouncing points of a snooker ball), so we were quite happy to get stuck in and do it.
A few hours introduction, some interesting programs to write as part of the learing curve, and I’ve never looked back. That introduction was enough to learn and use about 14 languages.
Michael Kingsford Gray
on 23 Sep 10How does one learn to program? First: go to University and do a Computer Science degree, at the very least. Then get a Math degree or an Engineering degree.
Those who don’t take this basic step will remain clumsy novices, as far as my experience goes. And no, don’t parade the occasional freaks who break this rule. Neither you nor I am in that class, and we never will be.
BrainiacV
on 23 Sep 10What I’ve always done and what I’ve told my students to do…is dream up an application you are interested in. And then program it. Self interest beats “doing the assignment” hands down. As to arguments about degrees or no degrees, I don’t think it makes a difference. When I was taking CS classes (to get the degree, I already knew how to program), I found most instructors were teaching blatantly bad methods and grading on the wrong things (rote memorization scored higher than error tolerant programs). But I may have been going through the system at a bad time.
Blake
on 23 Sep 10What always seemed to hinder me from learning a new language based on a project I wanted to start from scratch wasn’t a lack of motivation to learn it or anything to do with the language itself, it was creating the damn database. I’m not a DBA, nor do I care to be one, and I seriously think I’d rather take a swift kick in the groin than deal with creating the tables, picking field types, etc. My motivation for the entire project goes on a rapid decline at this point, which is probably why I’m not a programmer lol.
Don Schenck
on 23 Sep 10I recently helped in the creation of software that will help save REAL lives of REAL, LIVING people.
Without a CS degree! Not too shabby for a “clumsy novice”!!
@Blake You’ll love CouchDB!
Don Schenck
on 23 Sep 10Okay, gang, I just reserved ClumsyNovice.com.
Any suggestions what I should make of it?
A site to rant about bad code?
A place to rave about great code?
A place to confess about coding horrors??
Other??
Lisa DiMona
on 23 Sep 10David, you are seriously on a roll with your posts this week. I love this one—and all these smart comments.
Joe
on 23 Sep 10As one who has been programming since the early 80s, learning basic on a Timex Sinclair and then the TI 99-4A I would almost have to say that you are either a born programmer, or you are not. I have never earned a degree in programming, I have instead an ASAS in Computer Networking Systems, a BS in Informaiton System Security, and am currently working towards my MBA. During these studies I was required to take programming and scripting classes where I more taught than learned. Students found it difficult to grasp even the basic concepts of programming and as a result turned into quivering piles of mush, requiring a substantial amount of hand holding to get through the requirements.
While I would not consider myself a rockstar programmer I do fairly well, I have used Basic, Fortran, C, C++, C#, Perl, PHP, Javascript, HTML (realy markup more than programming) and even played with assembly languages. Most languages act teh same so finding one your are comfortable with learning will help you get ahead. From there you can “learn” other languages (read figgure out how their syntax works). But above all if you don’t get it, don’t sweat it, because somewhere along the line you will find someone who does.
Igoe James
on 24 Sep 10It started with something like passion, but more like a love of problem solving. My father worked with military computers in the 50’s, and tried teaching me binary numbers in the late 60’s – i was around 7 or 8 – so i was accustomed to prods to work in computers. It wasn’t until the early 80’s that I took a BASIC course. I loved it, but still floundered around for a decade in college learning COBOL and PL/I, later doing desktop/server support, and project management. In early 2000, I needed to script information transformation and decided to use VBA. Well VBA, later involved SQL, PHP, and now .NET. And it still involves a love of problem-solving, finding the perfect answer.
Igoe James
on 24 Sep 10As for learning new languages:
- Sometimes passion will get you over the hump, and get you working long days, with no reward and little food. I wouldn’t count on it though.
- Keep your goals small, especially if you are a novice. Avoid overreaching.
- Convert code you know into one you want to learn. Transitioning from VBA to VB.NET, I would drop a VBA class into VB.NET and then fix it so it would compile. Just try and keep your transition in smaller steps.
- Pick a task, and work toward it. Plan and build small website, but focus on good design principles and best practices.
- Certainly read, but maybe read and understand, without doing anything thing at first until you have a better grasp. Reading and implementing has its benefits as well, since you might be more likely to retain the information.
- If you feel you must, just do it. Expect to make mistakes, if for no other reason to handle the inevitable feelings of incompetence.
Kim
on 24 Sep 10I am 52 years old and have programmed in Cobol,C,C++,Delphi/pascal, Natural,PHP, Javascript,C#,ASP, ASP.net and probably another couple of languages that I have forgotten. I have headed up development teams and have recruited programmers. I don’t have a CS degree. I have yet to have anyone who knows me and my skills express that I am not capable.
The worst programmer I met was not only someone who held a CS degree – he had been a lecturer at university.
I agree with David that ‘programming in anger’ is the best way to learn. I have 5 C++ books on my desk – not one gives you a clue about threading other than the theory. The only way to really get to know the issues are to write programs that you have to get working. No university or book will help you when you really butt heads with a problem.
Climb in and remember that Google is your friend!
James
on 24 Sep 10Most are misunderstanding David’s phrase “programming in anger”. It means doing it for an actual purpose rather than training or an academic exercise. It doesn’t have much to do with being “angry”. It’s more of a European usage that doesn’t get much usage in the US as it comes from British English.
The origination was that the army would fire weapons “in anger” in a real combat rather than in training and it was generalized to using something for it’s intended purpose.
Michael Fever
on 24 Sep 10I thought I knew what I was doing before I went to college. I had done a lot of programming of my own applications, like online games and silly fun stuff. When I went to college I learned the proper way of doing things. One of my peers, whom I shared an apartment with whilst in college was also a programmer. I watched him program using his old methods and tools, not using the structures that we had learned and I seen him struggling. He would complete the program and then go back after to adjust things to the expected way of presentaion. Had he of used the techniques he had learned and programmed it the right way from the beginning there would be no need to correct.
Moral of my story: If you want to learn how to do things properly, take a course. Learning from the book is fine, but it definitely is better to learn by taking a course.
Mark Lovik
on 24 Sep 10This thread has a number of ideas jumbled together. If you take Bloom’s taxonomy there are different learning stages. Knowledge, Comprehension, Application, Synthesis, Evaluation.
In commercial development … we need the higher level’s of learning to even be functional. At this stage … working with a mentor … or with others is useful. You need the steps to get started, and the conceptual foundation to learn to APPLY these concepts by writing code.
There is a leap from how-to books (steps to follow), to the concepts needed to architect larger applications. This is a lifelong learning process. Getting hungry (for the learning … or desperate for the check) is a motivation for this process. The motivation is only good enough to be a focus.
The code experience (the Application level) is the meatball level of coding. It is the minimal coding level … but not good enough. The best approach to anything is not a rule, but something you should be able to eventually determine on your own .. and fit this answer differently depending of the problem context. This is the Analysis level (top level of Blooms). This is difficult to even teach without significant background development experience.
So to learn. 1. Start by the book, and writing code. 2. Think how to use your tools in different ways as you develop code, and what could be done better. 3. Read the code of others, and take classes from reputable teachers. 4. Start looking at the patterns and architecture books. 5. It should never end ;)
If you dismis academic curricula … I have recently used simple CS2 ideas to improve the speed of commercial code by a factor of 10000. Used OS ideas to cleanup threading issues. Used Programming languages to develop a filter parser for football coaches. .... You need to code and you need the academic foundation to code right. The academic experience is not good enough on its own.
Stephen James
on 24 Sep 10Too much pressure or too close of a deadline does not usually create good programming. It’s create shortcuts and hacks that work—at least for now.
Seeing someone else’s (or a group of coders is even better) code that does a similar function and then using those programming techniques is the easiest/fastest. It prevents obvious mistakes.
Derek Scruggs
on 25 Sep 10Well said. I didn’t study CS, but was always good at math. Though I wish I had formal training in some of the deeper topics of CS, I feel like I’m a better than average programmer because I’ve always had to solve real-world problems.
Also, I don’t think age matters much. I didn’t even own a computer until after college and didn’t really write production code until my early thirties.
I’m in my forties now and finally getting a chance to sink my teeth into Rails. I think I appreciate it more because I’ve evolved from a simple form-to-email script in Perl on into to basic PHP, then Zend Framework the last two years. Every step of the way was a business problem with near-term deliverables.
Brandon Hays
on 27 Sep 10I’m a bit late to the discussion, but as a relative newcomer to programming (1 1/2 years) I can say that this is outstanding advice. I am 31 and just beginning to program, and I think (or at least hope) age and education mean little on the road to creating working software.
I had the good fortune to participate in Gregory Brown’s Ruby Mendicant University, and that was shockingly effective. Most of the work is focused on creating shippable products of your own design (and often after your own interests).
The timetables are tight, but there’s guidance and support from Greg and the community. It’s the most effective learning tool I’ve experienced in my short programming career.
I’ve learned more from focusing a for a few weeks on projects that are meaningful to me than the prior 6 months of building a bunch of Hello Worlds.
Now I program because I have projects I want to see completed and use, rather than for some abstract educational goal, and it’s made a huge difference.
I’m super grateful that there are community members like Greg who focus on helping people write high-quality code while staying focused on the end result: building functioning software that matters.
Ben Joven
on 28 Sep 10learn Python first…
This discussion is closed.