I could not get through those three books but I get paid to program. My code is repetitive and shitty but I can produce a working web app as long as it doesn't have to support too many users, and it's fine.
My husband never read any books about formal programming and taught himself from those random "learn Java" or "learn python" books. He's a mathematician and programs to write simulations/solve equations, and he gets paid for it too.
If you can't get through those three books maybe you can't hope to be a computer scientist, fine. But you can certainly program, in the same way you don't have to be an English major to read or write.
Most programmers write code that other people have to read, maintain, or extend at some point. If you write repetitive, shitty code, you may be qualified to write some useful programs for yourself, or write a web app that doesn't have to support too many users -- which are valuable skills -- but it is not fine for the majority of programming jobs. Incidentally, given that you can do what you described, I'm also pretty sure you could get through those three books if you tried; they are not rocket surgery.
I couldn't agree with you more araneae, personally I am tired of seeing the statements where it is hinted that you need to have done xyz otherwise you have no business calling yourself a (good) programmer.
I know people who haven't touched those books and they may be considered the so-called "bad" java programmers, yet that is not the case...these people know the intricacies of J2EE, have read & understood the many JSRs and have in-depth knowledge of the many java libraries and frameworks..yet they are not traditional computer scientists with CS backgrounds
There's programming, and then there's programming.
I'm sorry, but what you're talking about sounds like it doesn't qualify as "programming" as much as web design and code plumbing. Note that in large part I'm talking semantics, here, in that my definition (and I suspect Joel's as well) differs from the way you're using the word).
I understand that you're likely paid well to do it -- as are plumbers. And it's a respectable job. I'm not trying to knock what you're doing.
But by your own admission your own code less than ideal. And Joel is talking about what a good programmer would need to be able to do, and if you want to start someone off on the path to becoming a good programmer, it's not a bad suggestion.
If you just want someone who can copy and paste code off of Github and doesn't really understand it, well, then you don't want a "good programmer" -- and frankly anyone worth their paycheck in IT probably already knows how to do that.
I don't think you need to get through those three books as your first order of business learning to program. "Give up you're never going to get it" is a ridiculous attitude to have when trying to learn anything.
Try something simple. Work your way up to more and more complicated things just like any other learning endeavour.
If you want to stick to plumbing type programming then go for it. If you want to branch out into a more formal computer science type understanding, by all means grab some text books and learn some data structures, algorithms, abstractions, oop patterns, etc.
So true: If you can program, you are a programmer. How you came about this knowledge is insignificant.
However, the post was about the fastest way to learn programming and books are a terrific way to do that. Not the only one. Maybe not the best one for you. But for many people, books work great!
This conversation seems to be entirely missing the point of the original article. The programmer to be in question is working at a .Net shop and needs to be able to get up to speed in a timely manner. It addresses a particular person in a specific instance.
Really he needs to understand what object oriented is, variables, arrays, loops, conditionals, debugging and the actual .NET syntax. Understanding these thing the person will be able to do their job. That seems to be the most important thing. Certainly you may not consider the person a "real" programmer but, it is up to him to fill out the rest of his knowledge and grow as a programmer.
The "top" answer sounds suspiciously like today's XKCD
K&R is awesome but... C would not be my first choice for a beginning language.
Things like pointer arithmetic, memory allocation, etc. distract from the basics and high-level concepts.
I would start with Python or Ruby these days. If Python is good enough for intros at places like MIT, it's good enough for me.
C is a masterpiece of elegance and simplicity and gives you a mental model of how a real computer works, and it gives you a foundation for understanding Unix, but I just think it overloads a beginner with stuff that gets in the way.
came to comments expecting a lot of reasons why Scheme or Lisp was a better choice LOL
It's tempting for us, as programmers, to consider Python an easier language to learn than C. I'm not so sure. Python is simple for programmers to learn because it uses a large number of common programmery things: lists, hash tables, classes, modules, etc. Things that beginners won't have a clue about. C doesn't have any of these.
Sure, it takes a while for you to wrap your head around pointers. But it also takes a while for you to wrap your head around inheritance. By virtue of being a smaller language, C has less of these things to wrap your head around.
If you need a dynamic array, you have to build it yourself from what you already know. Instead of having to learn yet another opaque concept, you're reinforcing your knowledge of pointers and dynamic memory allocation. Double benefit!
And once you know C, it can give you a boost towards learning other languages - most of them are implemented using C! If I don't understand something, I can always look at the source to see how it works. Since they're implemented in C, many languages tend to map easily to C concepts.
The same cannot be said about going the other way. A Ruby programmer learning C has to unlearn all the assumptions and niceties Ruby has spoiled them with. How much of Ruby is going to be applicable to C?
A month ago I went to advice the teacher of a high-school level video game design program about the curriculum of the program. I'm a C/C++ developer, but I too thought as you did that introducing a bunch of high school kids to programming using C or C++ would be too hard.
The school in question is mostly low-income kids looking for a vocational experience, so we expected a bunch of kids who would be out of their depth if thrown in without a garbage collector. But then the teacher mentioned that none of the kids had a hard time learning C or C++, pointers included.
So the group of game developers who had come to advice pretty much all agreed that learning C/C++ first was actually the best thing that could happen to those kids. Show them C first to teach them what the machine is REALLY doing (with only a minimal abstraction layer), give them OOP with C++, and THEN transition them to a scripting language and higher level environment so they can produce something interesting before the class is over.
Our goal was to efficiently prepare a bright non-programmer to an entry level .NET support job. Python and Ruby are great (I hack in both daily) but each is a diversion from the stated goal. By contrast, K&R is only 228 pages and is a good introduction to C#.
> C is a masterpiece of elegance and simplicity and gives you a mental model of how a real computer works
It used to. Now, with multicore systems and out-of-order execution and cache and nearly everything else that makes modern hardware fast enough to use, it is an over-simplified view of the abstraction the hardware wants you to see, but is not detailed enough to guide you when you need extra performance.
As an example, C says nothing about cache lines; its memory model is completely flat. Cache is ideally 'transparent', but we all know that cache hits are a lot faster than misses. C gives you no guidance on how to arrange your data structures to ensure as many hits as possible.
I suppose most of us would give a similar answer as what Joel gave, but I found this nice pair of comments:
Is this really the only way to be a good programmer? I'm someone that wants to study programming in my spare time and that's a bit of a daunting list for someone new to the industry... – toleero Jul 28 at 14:54
No, it is not the only way to be a good programmer. But if three books is a "daunting list" than you might be underestimating what it is that programmers do. – Joel Spolsky Jul 28 at 15:05
I think by "daunting" he means that the books do not look accessible to someone outside programming.
I would say "Learn Python the Hard Way" if you're absolutely new to it. It moves quickly and will give a good sense of what it's like to actually push the bits around. Most people who really like programming seem to have a similar first experience (like using BASIC on their PC or calculator); replicating that seems like a good first step, no?
Not all "programmers" are Joel. Not all programmers do something hard. For instance, writing an online survey is not hard. It is programming, but it is relatively easy, but boring and repetitive. It's also something that is commonly done by "programmers."
Not all programming is cutting edge computer science.
There's an aspect of "I had to do this, so you should too" in recommending that list, but it's not fatal to the overall principle: if enough programmers get on the same canon of fundamentals, then they will all benefit from sharing a common paradigm.
I am firmly convinced that if you don't enjoy programming you'll never actually become a programmer.
It does not matter how smart you are.
It does not matter how much you WANT to become a programmer.
So the first thing I do when introducing someone to programming is point them at tools that will allow them to be productive quickly to see if they "get a kick" out of creating things with code.
I think Joel's advice to start with C is GREAT. But only if the question is "I think I love to program. But I'm a noob. I want to become a great programmer. How do I start to become one?"
You can learn to love something, largely because you find yourself successful at it. On other threads you can hear from people who hated math until they learned logic and they were off to the races. I am sure that programming has the same thing; in fact, I know programming has the same dynamic. I know this because there is a steady stream of "how Python/Ruby/mobile apps/ditching my boss made me fall in love with programming again" which suggests strongly that one can change affect. Too strongly for it not to be true.
Maybe Joel is right, maybe not. It might depend on the person. At 13 years old I tried learning C++, at 14 Java, at 16 C.
None of them stuck. Part of it was that the concepts were too difficult to understand. In which case Joel's list might help, as it is more about concepts than teaching programming. I think a bigger part of the problem was that it was too difficult to write anything useful in those languages. After a semester of C (Intro to Programming) I don't think I could write a single useful program. If it was a semester of Python I'm damn sure I could write useful code after it.
I wish a book like "Learn Python The Hard Way" existed back then. It would have been great to understand the basic concepts of programming, and see the code actually work. I remember a C class where the instructor was teaching about arrays. I don't think a single person in the class really understood what he was talking about. Compare that to Python lists and dictionaries, you can see them work, you understand what they do and how to use them immediately.
I'll take Joel's advice and read those books. But I'm not sure they are best way for people to start.
Why not make them start in machine language, I mean since they need to learn how everything works before they can program in the language they choose right? I find it somewhat funny that C and C++ are the default "starting point" languages to learn programming when there are still lower-level languages than these. I see no problem with starting out at a higher level language and going from there, part of programming is having enthusiasm and being able to play around. By starting with easier languages, a person's interest may better be captured and can lead to more self-learning, the way I see it, the natural progression is to want to learn the harder, lower-level stuff as you move along in a development career anyways.
I'm a bright person, and I learned to program in 6 months with only "programming" experience being Excel VBA scripts.
Joel's method would have made me drop out and convinced me that programming was terribly boring-- much like a how a kid who wants to play the piano would feel after starting out on 6-months of only scales.
I learned so quickly because I loved it, and I loved it because I could be instantly productive making apps with Ruby on Rails. There was still a lot to learn, but those things could be learned later "in the field" as they were relevant.
I completely agree. My initial foray into programming was writing sites in PHP, and I learned a lot about logic, functions, classes, and structuring projects because of it— and my transition into other languages. Had I said I wanted to learn to program and someone tossed K&R at me and told me to "work through it by sheer force", I doubt I would have found the subject to be so interesting.
Certainly K&R is a must-read, but Joel's advice...
"If you can't get through this sequence, you're not going to be able to program, so you might as well give up now."
...is terrible. There is more than one way to introduce someone to programming.
The first programs I wrote were complex BASH scripts that solved specific problems I needed solving. I had a friend that was there to help me a long the way. But the main reasons I continued learning were because I had the immediate benefit of having my problems solved and also because I had tangible evidence of my progress. The rest snowballed from there.
I understand where Joel is coming from with his advice, but I don't think I agree with it. I had read quite a few programming books in the past (C & Java), muddled through the exercises, and thought I understood the concepts, but until I dived into solving real problems, I didn't "get it".
Exactly - that's how I learned programming, too. It didn't matter so much about the syntax, but what problem you could solve. For me it was a Perl CGI script for letter writing and earlier a Hypercard registration system that got me into programming, despite my father and teachers repeatedly trying to teach me BASIC. Today it might be adding javascript to a page, or customizing/coding a game using tools like Scratch or Gamemaker.
And there is decades worth of research backing this up (problem-based learning, situated cognition), but CS education has been slow to adapt.
I did this. It's not for everyone, but for a highly motivated person it's not that hard either.
A friend who's in Med School wanted better working conditions than working at crappy call centers. I gave him a high-level overview of what programming is about and threw him the Django tutorial and made myself available for questions. As I gave him practical requests for useful web code, I delved into the details of Python and web programming in general, while slowly introducing him to tools of the trade like the shell, debuggers, and data structures, trying to make every step of the way easier for him.
Six months later he got a job at a biomedical NGO. He began by documenting and testing existing code, but now does quite a bit of coding by himself.
I've found that teaching theory along with the tools that utilize it to be a very good strategy.
I'm surprised no one made any mention of what this bright person knows in the first place.
One of the best ways to teach is to map known concepts to new concepts. For instance, I might introduce methods to people who already know what functions are, but talk about messages to those who don't.
Yeah, Joel is dead on for how to learn to program. Unfortunately, I think we need to question that question more.
What folks are often asking when they ask "how do I program?" is something entirely different.
How do I learn how to make a website? Use wordpress or yola or squarespace.
How do I learn how to make that website look better? Read design blogs, some starter tutorials on html and css and start diving into the CSS. It's not that hard a standalone thing to learn.
How do I learn how to make that website do something fancy like fade things out? Start diving into the javascript in the same way.
How do I learn how to make that website do something functional like send an email, or save a session? Pick a modern framework (Ruby on Rails, Node on Express), read/watch the starter tutorials on it, and dive in.
How do I learn how to make that website do something functional and NOT have it be a horrendous hack job? Time to start reading those programming books :D
Just sayin' it's not always step 1. Depends on what you need to get done, and what you really want to learn how to do. Yeah?
For application development, I'd start with an environment that actually tried to make things simpler for the programmer and showed how you can use programming to tweak a design first before programming from scratch - an IDE (see Microsoft's beginner resources http://msdn.microsoft.com/en-us/beginner/default.aspx ) or game development environment (like gamemaker or XNA).
See also actual curricula for high school or non-computer science students (CS0 courses), like
The first book, Code - Charles Petzold, is only ten bucks on the Kindle right now (SOLD) and I own the other two.
I remember SICP being like 90 bucks for my hardcover copy and I'm pretty sure I bought it after reading the Joel on Software article "The Perils of Java Schools" while I was loving life as a bank IT guy so this is workable advice. It only took five years to become a "real" programmer after that. Also I sure don't remember K&R being $68[1]. (Yes I know SICP and K&R are both online for free)
I think in addition to studying these books, the student should be put right to work coding simple tasks. The best way to learn is by doing, not by theory.
The student should get in and start hacking away at some non critical part of the code base. Perhaps the UI, or some reporting or tests. Something it's OK to break for a day or two.
Pair them up with a more experienced developer and make sure they do code reviews. Discus the code and talk about what went right and what went wrong.
Agreed. I wish more books would adopt this strategy: "Ok, stop. To move forward with the application we will need code that does X, Y, and Z. Here is the spec that I want you to code for the next step. Work on it for a bit. If you're having trouble check out our forum for other people's attempts at a response and you can see 10 ways to solve the problem. On the next page you will see the code answer and the book will continue with an explanation of the code."
Even as a beginner you can tackle small snippets of code using the basic control structures.
Here is how I read this thread:
Q: How do I quickly get a complete coder newbie up to speed to support .NET apps?
A: Teach him Lisp and C
What a silly, dogmatic, and unpractical answer. No one even bothered to ask about what kind of work this person is going to be doing, what sort of apps he'll be writing, what industry he's working in, etc.
Obviously, the company where this guy works is giving him a shot at a super-entry-level programming job. If he has any hope of succeeding (which means being productive ASAP) in this job, learning C and Lisp is not going to help him.
The only well-known language worse than C to start with would be C++. We used this in high school AP Computer Science before they switched to Java. Spent about 80% of our time learning pass by reference, templates, and about segfaults. The other 20% was on algorithms. Made programming seem horribly complex.
Don't knows about you, but I wouldn't consider someone a "programmer" unless the had a solid grounding in pass by value vs. reference, generic programming, and hardware memory protection mechanisms. Yeah, and algorithms are important too.
My first "real" job was with a software company, in the QA department. I got lucky getting that job, as I had no requisite skills. Anyway, I wanted to learn how to program. I took a C class at a local university. I remember, vividly, being so frustrated that I was in tears when trying to learn about pointers and recursive functions. Very basic to me now, but at the time, extremely frustrating - I simply didn't understand the concepts. I reached out to a few of the developers at that company and they helped me. I'm not a stud programmer, not by any stretch of the imagination, but I've made a good living over the years - and I have not once programmed in C since that class. BUT --- the things I learned in that class have helped me tremendously. For example, it helped me when I was programming in VB and needed to tap into raw winapi functions. A combination of C programming basics, along with OS basics, will get you a LONG way when trying to understand and solve challenges you'll come across in "normal" programming challenges.
I am helping a friend learn to program. He was doing "Learn Python The Hard Way" but was loosing steam. I created a project for him to do, a simple ASCII game: https://github.com/antoinehersen/ASCII-Dungeon-of-DOOM.
Having a project with visual and interactive elements is far more motivating. Also it push you to learn the real skills needed for programing, not only knowing what a loop is or how to open a file, but figuring what to use when, and how to organize and connect it all.
This experience will create a reference frame for everything he might subsequently read in a book.
I strongly believe that accomplishing a small scale project that as some value is the best way to learn.
wow, i disagree! i can't even imagine starting with C. that's like saying the only way to learn to build with legos is to learn how to mold plastic first. sure it's possible, but desirable?
Learning how to write code is actually fairly easy. Kids can do it. The hard part is to write code that doesn't make your co-workers hate your guts because they have to maintain it. I'd recommend getting a copy of McConnell's "Code Complete".
I found a simple method that works really well: ask the student to invent their own language syntax on paper. We start with a simple language that can draw on screen, and proceed from there.
I'm noticing that Students naturally discover many of the issues and tricks that they would otherwise have to "study" (such as flow of execution, nesting, variables)
I occasionally teach at schools in NY, and this semester my students "invented" the smalltalk syntax. It was heartwarming to witness.
[+] [-] araneae|14 years ago|reply
I could not get through those three books but I get paid to program. My code is repetitive and shitty but I can produce a working web app as long as it doesn't have to support too many users, and it's fine.
My husband never read any books about formal programming and taught himself from those random "learn Java" or "learn python" books. He's a mathematician and programs to write simulations/solve equations, and he gets paid for it too.
If you can't get through those three books maybe you can't hope to be a computer scientist, fine. But you can certainly program, in the same way you don't have to be an English major to read or write.
[+] [-] mquander|14 years ago|reply
[+] [-] Maven911|14 years ago|reply
[+] [-] SomeCallMeTim|14 years ago|reply
I'm sorry, but what you're talking about sounds like it doesn't qualify as "programming" as much as web design and code plumbing. Note that in large part I'm talking semantics, here, in that my definition (and I suspect Joel's as well) differs from the way you're using the word).
I understand that you're likely paid well to do it -- as are plumbers. And it's a respectable job. I'm not trying to knock what you're doing.
But by your own admission your own code less than ideal. And Joel is talking about what a good programmer would need to be able to do, and if you want to start someone off on the path to becoming a good programmer, it's not a bad suggestion.
If you just want someone who can copy and paste code off of Github and doesn't really understand it, well, then you don't want a "good programmer" -- and frankly anyone worth their paycheck in IT probably already knows how to do that.
[+] [-] grannyg00se|14 years ago|reply
Try something simple. Work your way up to more and more complicated things just like any other learning endeavour.
If you want to stick to plumbing type programming then go for it. If you want to branch out into a more formal computer science type understanding, by all means grab some text books and learn some data structures, algorithms, abstractions, oop patterns, etc.
[+] [-] Derbasti|14 years ago|reply
However, the post was about the fastest way to learn programming and books are a terrific way to do that. Not the only one. Maybe not the best one for you. But for many people, books work great!
[+] [-] absconditus|14 years ago|reply
[+] [-] darasen|14 years ago|reply
Really he needs to understand what object oriented is, variables, arrays, loops, conditionals, debugging and the actual .NET syntax. Understanding these thing the person will be able to do their job. That seems to be the most important thing. Certainly you may not consider the person a "real" programmer but, it is up to him to fill out the rest of his knowledge and grow as a programmer.
The "top" answer sounds suspiciously like today's XKCD
[+] [-] RockyMcNuts|14 years ago|reply
Things like pointer arithmetic, memory allocation, etc. distract from the basics and high-level concepts.
I would start with Python or Ruby these days. If Python is good enough for intros at places like MIT, it's good enough for me.
C is a masterpiece of elegance and simplicity and gives you a mental model of how a real computer works, and it gives you a foundation for understanding Unix, but I just think it overloads a beginner with stuff that gets in the way.
came to comments expecting a lot of reasons why Scheme or Lisp was a better choice LOL
[+] [-] alextgordon|14 years ago|reply
Sure, it takes a while for you to wrap your head around pointers. But it also takes a while for you to wrap your head around inheritance. By virtue of being a smaller language, C has less of these things to wrap your head around.
If you need a dynamic array, you have to build it yourself from what you already know. Instead of having to learn yet another opaque concept, you're reinforcing your knowledge of pointers and dynamic memory allocation. Double benefit!
And once you know C, it can give you a boost towards learning other languages - most of them are implemented using C! If I don't understand something, I can always look at the source to see how it works. Since they're implemented in C, many languages tend to map easily to C concepts.
The same cannot be said about going the other way. A Ruby programmer learning C has to unlearn all the assumptions and niceties Ruby has spoiled them with. How much of Ruby is going to be applicable to C?
[+] [-] SomeCallMeTim|14 years ago|reply
The school in question is mostly low-income kids looking for a vocational experience, so we expected a bunch of kids who would be out of their depth if thrown in without a garbage collector. But then the teacher mentioned that none of the kids had a hard time learning C or C++, pointers included.
So the group of game developers who had come to advice pretty much all agreed that learning C/C++ first was actually the best thing that could happen to those kids. Show them C first to teach them what the machine is REALLY doing (with only a minimal abstraction layer), give them OOP with C++, and THEN transition them to a scripting language and higher level environment so they can produce something interesting before the class is over.
[+] [-] systemtrigger|14 years ago|reply
[+] [-] derleth|14 years ago|reply
It used to. Now, with multicore systems and out-of-order execution and cache and nearly everything else that makes modern hardware fast enough to use, it is an over-simplified view of the abstraction the hardware wants you to see, but is not detailed enough to guide you when you need extra performance.
As an example, C says nothing about cache lines; its memory model is completely flat. Cache is ideally 'transparent', but we all know that cache hits are a lot faster than misses. C gives you no guidance on how to arrange your data structures to ensure as many hits as possible.
[+] [-] mquander|14 years ago|reply
Is this really the only way to be a good programmer? I'm someone that wants to study programming in my spare time and that's a bit of a daunting list for someone new to the industry... – toleero Jul 28 at 14:54
No, it is not the only way to be a good programmer. But if three books is a "daunting list" than you might be underestimating what it is that programmers do. – Joel Spolsky Jul 28 at 15:05
Seriously.
[+] [-] Hyena|14 years ago|reply
I would say "Learn Python the Hard Way" if you're absolutely new to it. It moves quickly and will give a good sense of what it's like to actually push the bits around. Most people who really like programming seem to have a similar first experience (like using BASIC on their PC or calculator); replicating that seems like a good first step, no?
[+] [-] araneae|14 years ago|reply
Not all programming is cutting edge computer science.
[+] [-] sunchild|14 years ago|reply
[+] [-] cek|14 years ago|reply
It does not matter how smart you are.
It does not matter how much you WANT to become a programmer.
So the first thing I do when introducing someone to programming is point them at tools that will allow them to be productive quickly to see if they "get a kick" out of creating things with code.
I think Joel's advice to start with C is GREAT. But only if the question is "I think I love to program. But I'm a noob. I want to become a great programmer. How do I start to become one?"
[+] [-] Hyena|14 years ago|reply
You can learn to love something, largely because you find yourself successful at it. On other threads you can hear from people who hated math until they learned logic and they were off to the races. I am sure that programming has the same thing; in fact, I know programming has the same dynamic. I know this because there is a steady stream of "how Python/Ruby/mobile apps/ditching my boss made me fall in love with programming again" which suggests strongly that one can change affect. Too strongly for it not to be true.
[+] [-] jeffreymcmanus|14 years ago|reply
[+] [-] antoncohen|14 years ago|reply
None of them stuck. Part of it was that the concepts were too difficult to understand. In which case Joel's list might help, as it is more about concepts than teaching programming. I think a bigger part of the problem was that it was too difficult to write anything useful in those languages. After a semester of C (Intro to Programming) I don't think I could write a single useful program. If it was a semester of Python I'm damn sure I could write useful code after it.
I wish a book like "Learn Python The Hard Way" existed back then. It would have been great to understand the basic concepts of programming, and see the code actually work. I remember a C class where the instructor was teaching about arrays. I don't think a single person in the class really understood what he was talking about. Compare that to Python lists and dictionaries, you can see them work, you understand what they do and how to use them immediately.
I'll take Joel's advice and read those books. But I'm not sure they are best way for people to start.
[+] [-] devs1010|14 years ago|reply
[+] [-] DanBC|14 years ago|reply
[+] [-] joshcrews|14 years ago|reply
Joel's method would have made me drop out and convinced me that programming was terribly boring-- much like a how a kid who wants to play the piano would feel after starting out on 6-months of only scales.
I learned so quickly because I loved it, and I loved it because I could be instantly productive making apps with Ruby on Rails. There was still a lot to learn, but those things could be learned later "in the field" as they were relevant.
[+] [-] ceol|14 years ago|reply
Certainly K&R is a must-read, but Joel's advice...
"If you can't get through this sequence, you're not going to be able to program, so you might as well give up now."
...is terrible. There is more than one way to introduce someone to programming.
[+] [-] sunsu|14 years ago|reply
I understand where Joel is coming from with his advice, but I don't think I agree with it. I had read quite a few programming books in the past (C & Java), muddled through the exercises, and thought I understood the concepts, but until I dived into solving real problems, I didn't "get it".
[+] [-] edtechdev|14 years ago|reply
And there is decades worth of research backing this up (problem-based learning, situated cognition), but CS education has been slow to adapt.
[+] [-] Daishiman|14 years ago|reply
A friend who's in Med School wanted better working conditions than working at crappy call centers. I gave him a high-level overview of what programming is about and threw him the Django tutorial and made myself available for questions. As I gave him practical requests for useful web code, I delved into the details of Python and web programming in general, while slowly introducing him to tools of the trade like the shell, debuggers, and data structures, trying to make every step of the way easier for him.
Six months later he got a job at a biomedical NGO. He began by documenting and testing existing code, but now does quite a bit of coding by himself.
I've found that teaching theory along with the tools that utilize it to be a very good strategy.
[+] [-] teyc|14 years ago|reply
One of the best ways to teach is to map known concepts to new concepts. For instance, I might introduce methods to people who already know what functions are, but talk about messages to those who don't.
[+] [-] derekreed|14 years ago|reply
What folks are often asking when they ask "how do I program?" is something entirely different.
How do I learn how to make a website? Use wordpress or yola or squarespace.
How do I learn how to make that website look better? Read design blogs, some starter tutorials on html and css and start diving into the CSS. It's not that hard a standalone thing to learn.
How do I learn how to make that website do something fancy like fade things out? Start diving into the javascript in the same way.
How do I learn how to make that website do something functional like send an email, or save a session? Pick a modern framework (Ruby on Rails, Node on Express), read/watch the starter tutorials on it, and dive in.
How do I learn how to make that website do something functional and NOT have it be a horrendous hack job? Time to start reading those programming books :D
Just sayin' it's not always step 1. Depends on what you need to get done, and what you really want to learn how to do. Yeah?
[+] [-] edtechdev|14 years ago|reply
http://csunplugged.org/
http://scratch.mit.edu/
For application development, I'd start with an environment that actually tried to make things simpler for the programmer and showed how you can use programming to tweak a design first before programming from scratch - an IDE (see Microsoft's beginner resources http://msdn.microsoft.com/en-us/beginner/default.aspx ) or game development environment (like gamemaker or XNA).
See also actual curricula for high school or non-computer science students (CS0 courses), like
http://csta.acm.org/
http://coweb.cc.gatech.edu/mediaComp-teach
I would not throw SICP at someone who didn't already know how to program.
[+] [-] andymoe|14 years ago|reply
The first book, Code - Charles Petzold, is only ten bucks on the Kindle right now (SOLD) and I own the other two.
I remember SICP being like 90 bucks for my hardcover copy and I'm pretty sure I bought it after reading the Joel on Software article "The Perils of Java Schools" while I was loving life as a bank IT guy so this is workable advice. It only took five years to become a "real" programmer after that. Also I sure don't remember K&R being $68[1]. (Yes I know SICP and K&R are both online for free)
[1] http://www.amazon.com/Programming-Language-2nd-Brian-Kernigh...
[2] http://www.joelonsoftware.com/articles/ThePerilsofJavaSchool...
[+] [-] aiham|14 years ago|reply
For anyone interested, I found SICP at http://mitpress.mit.edu/sicp/
[+] [-] jay_kyburz|14 years ago|reply
The student should get in and start hacking away at some non critical part of the code base. Perhaps the UI, or some reporting or tests. Something it's OK to break for a day or two.
Pair them up with a more experienced developer and make sure they do code reviews. Discus the code and talk about what went right and what went wrong.
[+] [-] inuhj|14 years ago|reply
Even as a beginner you can tackle small snippets of code using the basic control structures.
[+] [-] thok|14 years ago|reply
Here is how I read this thread: Q: How do I quickly get a complete coder newbie up to speed to support .NET apps? A: Teach him Lisp and C
What a silly, dogmatic, and unpractical answer. No one even bothered to ask about what kind of work this person is going to be doing, what sort of apps he'll be writing, what industry he's working in, etc.
Obviously, the company where this guy works is giving him a shot at a super-entry-level programming job. If he has any hope of succeeding (which means being productive ASAP) in this job, learning C and Lisp is not going to help him.
[+] [-] iradik|14 years ago|reply
[+] [-] ajross|14 years ago|reply
[+] [-] codeslush|14 years ago|reply
[+] [-] scott_s|14 years ago|reply
[+] [-] antoinehersen|14 years ago|reply
I strongly believe that accomplishing a small scale project that as some value is the best way to learn.
[+] [-] unknown|14 years ago|reply
[deleted]
[+] [-] iradik|14 years ago|reply
[+] [-] einhverfr|14 years ago|reply
My answer: Exacting logic.
C is a great language at teaching exacting logic. "Wax on, Wax off" kinds of things.....
[+] [-] skurry|14 years ago|reply
[+] [-] apitaru|14 years ago|reply
I'm noticing that Students naturally discover many of the issues and tricks that they would otherwise have to "study" (such as flow of execution, nesting, variables)
I occasionally teach at schools in NY, and this semester my students "invented" the smalltalk syntax. It was heartwarming to witness.