99

I have been asked to take a person in our IT department who has no programming experience but is a smart and capable person and help him move into programming at lets say an entry level developer supporting existing .Net applications. I definitely believe this person can do it but I am looking for the quickest way to get him to speed. I have a bunch of ideas but wanted to see what other people thought. I know this is going to also be highly dependent on how he learns, but I am talking in general.

So the question: What do you think are the best ways to get a non-developer up to speed quickly on development (.Net in this case)?

gnat
  • 20,543
  • 29
  • 115
  • 306

10 Answers10

124

I usually prescribe the same sequence for anyone who wants to learn programming. It's very theoretical, but it lays a good foundation. It should take three or four months of fulltime study, but programming isn't something you learn overnight.

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.

  1. Code, by Charles Petzold.
  2. The C Programming Language, K&R
  3. The Structure and Interpretation of Computer Programs, Abelson and Sussman.

My rule is: work your way through those three books by sheer force, if necessary. Ask any questions you have, but only after struggling to figure it out on your own. If you can make it through those three books, congratulations, you're a programmer, now I can throw you PERL IN 15 MINUTES or whatever rubbish is at the bookstore in the Big Bookcase of Java and you will manage fine. If you can't make it through those three books, give up, go home, you're never going to get it.

I don't think you need to learn C and Scheme, to be honest. They're just a foundation for future learning. These two fairly simple books are both very simple on the surface (C and Scheme are super-easy languages) but they get very deep on the real art of programming without wasting time on confusing syntax, so they are excellent to start to re-wire your brain to be a good programmer.

Attempts to take a shortcut and go directly to learning the exact thing you want to learn right now (like starting with C# and ASP.NET) are doomed.

Joel Spolsky
  • 7,074
  • 21
  • 57
  • 49
30

The best way to get a non-developer up to speed quickly is to inspire them!

To have any success, the candidate must be at least curious, if not passionate, about programming (regardless of the platform).

While I agree with Joel in the case of the ideal candidate, I'd be careful not to cram too much theory into a weak mind - it'll only put them off. If they're inspired, curious, and hopefully passionate, they'll want to understand the theory after they've seen the magic.

I completely agree with @karudzo - self-accomplishment and a constructive review can be very inspiring.

jkoreska
  • 692
12

I am looking for the quickest way to get him to speed.

The quickest way might be to give him the time it takes, although that could easily be a year or two.

Sure, it seems easy to teach him a simple language (C#, if he's to do .NET stuff), but learning a language is not learning to program.

If he never has programmed, then, besides the syntax and library of at least one language, he will have to learn about arrays, linked lists, the compilation model of whatever language he learns, modularization, resource management, paradigms, patterns, Big-O-notation... - the whole enchilada. That's a lot of stuff to plough through, and most of us took several years just to learn these basics, and even more to become a real professional programmer.

There's material out there that covers a lot of this (like Stroustrup's newest book that teaches programming using C++, rather than teaching the language C++), but there isn't very much of it and nothing that covers all of it. So the guy must be willing to learn, and to read a lot of books and articles.

As to how to do this: I don't have a full-blown curriculum at hand to paste here. (Sorry.)
What I'd recommend, though, is to start with teaching him one programming language, so that he has a chance to make some fast initial progress and get some encouraging results. There's quite a few books out there to teach such languages, pick one you're familiar with. If the book has many exercises, and he is willing to do them, be prepared for spending a lot of time helping him with those. If the book doesn't have (m)any, start to think up your own ones well ahead, but be prepared to adapt them to his level/speed of understanding.
If that first language wasn't either C or C++, IMO he should learn one of these next. K&R is good for that, as is Stroustrup's TCPL or, if he can (with your help) deal with a steep learning curve, Koenig/Moo. The reason I'd recommend this is that, once you know C or (IMO preferably) C++, it's relatively easy to pick up any of those C derivates like C#, Java, ObjC...

For the rest, provide him with a constant stream of good books and articles. I don't think it's very helpful if we suggest too many of those, since 1) it has to fit to your company's culture, and 2) you have to feel comfortable telling him to learn that stuff.

sbi
  • 10,052
7

I wouldn't start them on .NET. I have made this mistake too many times. Don't let an employer pressure you in to creating an incompetent programmer because of time. .NET may be a fast development platform, but it doesn't force developers to learn programming. In C# alone, you will find a developer getting stuck on reference types, object lifetime, they will leave huge memory leaks (yes it is possible in .NET), and will have poor designs. It would be much better to start them on C or C++ (probably c++ since they will need to use OOP concepts) and then say something like: "Now wouldn't it be nice if your memory was managed for you, every thing was object-oriented, and you didn't have to deal with all of these nasty pointers?" Here is C# and JAVA. If they have mastered c++, they will conquer both in a week or two each. I recommend Joel's regiment. That was the list that my CS 101 teacher gave me, and I was much better when I hit numerical analysis because of it. This will also allow you to find out earlier if the candidate will cut the mustard or not. Also, once you get c and c++, you will automatically understand c# and java after reading the introduction to the books. Not only would you understand them, but you would understand them better than someone who didn't know c and c++.

6

Pair programming. Let them shadow you while you write your own code - any code. Within hours, then have them enter your code in for you, while you tell them what to do, keystroke by keystroke even if necessary. Answer a few of their questions, but not so much so that you get slowed down by much - just let them soak it all in. They'll also find your typos and more of your bugs than you might think. Within a few days, they'll be able to start 'navigating' telling you what code to enter for tasks similar to ones they've seen before.

I learned much of what I know as a developer this way within a month, and have taught several other new developers this way, one of whom was able to take over for me as the lead developer at a startup after several months. When we first started working together, he hadn't ever written a single line of code.

trace
  • 61
6

Give them something simple, but useful to solve. Let them fumble through a bit and help them polish it up. There's nothing like a small accomplishment to help spur them on (although someone not interested in programming w

jschorr
  • 169
2

Give him a good ide (visual studios, express is still good). Teach him the common 60% of syntax (leave out yield, linq, enums, attributes, etc, do teach classes, virtual and override). Spend time on the debugger (especially callstack). Then tell him to google "msdn functionanme" whenever he needs help and that should get him off to a quick start.

Also teach him to never catch and swallow an exception. Tell him he must rethrow or log it!

Bonus: teach him how to serialize json data so he can easily read/write to a file. A db is overkill and too much to learn and you dont want to have him writing custom file formats although i may let one entry per line type of file pass to save/load an string array as acceptable.

1

I know a lot of people have been talking about languages and books for those languages. I differ.

Programming is about learning to think analytically. First and foremost the person should be able to think and come up with the algo on a piece of paper for what the problem is. You have to guide them so that they get the right thinking technique.

Next comes the fundamentals of the language. Get them started on the language of choice. Give a problem to program.

After this first cut is over get them to do the CS fundamentals and the Design Patterns.

Now get them to reprogram the earlier problem with these new concepts.

Nomad
  • 19
1

Start him on the basics: variables, loops, while loops, for loops, arrays, teach him basics, printing to screen, doing some simple math. Move into methods and basic OOP, things like here's how to create a class, show him the why not just the how.

The language doesn't matter, but pick something you know and that is highly abstract (java, python etc...) that way he doesn't need to worry about things like memory management, pointers etc... Teach the basics of recursion, towers of hanio or recursively searching directories.

Learn to program is a good free resource on Ruby programming. Make it fun, easy and entertaining.

Snow_Mac
  • 349
1

Give him some challenges and have him learn how to find resources to solve the problem himself.

If you can teach him how to find answers and be self-sufficient, he will naturally learn how to program well. Critical thinking and resourcefulness are two key skills for a programmer.

At the end of the day, passion/interest is definitely going to be a key factor in how successful they will be in learning it quickly. If he doesn't have or catch "the bug", it might be a slow and/or painful process. If he does catch the bug, he will be up late coding, off work hours, having the time of his life.