99
votes

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)?

12
  • 1
    Maybe related question: programmers.stackexchange.com/questions/10930/… :D
    – jmservera
    Jul 28, 2011 at 15:12
  • I've heard that Learn Python The Hard Way is good for non-programmers starting out.
    – john2x
    Jul 28, 2011 at 16:48
  • Take a look at Small Basic. It is simple, but useful for the beginners.
    – user32666
    Jul 28, 2011 at 17:17
  • 3
    I think explaining programming to someone who has no mental model of anything your talking about is useless. Figure out what language your going to be talking about and have them hit the tutorials and get their hands dirty then explain. They will struggle and you will swoop in and speed up the learning process. Jul 28, 2011 at 23:39
  • 1
    I would ask him to read Edgser Dijkstra's |On the cruelty of really teaching computing science|, get him to learn about the reason for that article, so he can be wary about the possible brain damage that can be inflicted on him by the generally accepted ways of teaching programming
    – vfclists
    Nov 7, 2011 at 17:59

10 Answers 10

124
votes

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.

50
  • 25
    As someone who has had to bang his head on the desk over "programmers" who came highly recommended for their C# abilities, but couldn't do simple things like implement a very well documented base class, find memory leaks in c and c++ programs, or simply figure out a problem on their own or learn a new idea at even a moderate pace, I agree. This isn't elitism; it's common sense. If you can't master pointers and recursion, you will never be very useful to anyone who needs developers who can solve problems on their own. Jul 28, 2011 at 5:01
  • 53
    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. Jul 28, 2011 at 15:05
  • 32
    You are so out of touch sometimes, Joel.
    – Robert S.
    Jul 28, 2011 at 15:09
  • 46
    Sorry, the newspapers take a couple of days to arrive at my private club because they need to be ironed by a valet before we can see them. Jul 28, 2011 at 15:13
  • 19
    Unfortunately, this answer fails the up to speed quickly part.
    – rlb.usa
    Jul 28, 2011 at 16:35
30
votes

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.

4
  • 29
    "If you want to build a ship, don't drum up people to collect wood and don't assign them tasks and work, but rather teach them to long for the endless immensity of the sea." - Antoine de Saint-Exupery Jul 28, 2011 at 17:00
  • Julien - nice! Exactly!
    – jkoreska
    Jul 28, 2011 at 17:04
  • I completely agree with you on this one! I've mentored/tutored many developers whom had no experience and at times had no idea they would end up programmers. I did this simply by guiding them along the way... their own curiosity and passion lead them to the end-result. Had they not had any of those two attributes, I don't believe it would have been possible for them to achieve what they achieved. I work with too many programmers who lack one or both those attributes and are in it just because there is a lot of work available...it's awful!
    – Jeach
    Mar 20, 2013 at 14:33
  • I agree. I feel the question of learning programming is answered in a very literally. People learn things for a reason. People learn to program to solve problems, help people, and turn ideas into something real. I've met people who forgot this along the way and when they rediscovered it they rediscovered their love for programming. When you really enjoy something you will learn, you will find ways to learn, and you will get better.
    – Luis Perez
    Nov 3, 2013 at 14:14
12
votes

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.

4
  • 1
    "entry level developer supporting existing .Net applications" ... "he will have to learn about arrays, linked lists, the compilation model of whatever language he learns, modularization, resource management, paradigms, patterns, bit-O-notation" Those are all 'nice to haves', but I bet that a good chunk of the developers who wrote the code don't have those skills. Nov 7, 2011 at 4:27
  • 1
    @KirkBroadhurst: If so, then something is wrong at your company.
    – sbi
    Nov 7, 2011 at 21:36
  • @sbi I think you'll find something is wrong in a lot of companies. OP's company is suggesting that a non-programmer (but he's a 'smart guy'!) be moved to a role doing application support. I don't know where you work... but in my experience that's 'the real world'. Really good, competent programmers are the exception - like in most industries, most people do just good enough to get by. Nov 7, 2011 at 21:41
  • 1
    @KirkBroadhurst: Where I work is my decision. I have fled companies for being incompetent, and I'd flee if none of the developers know about at least most of these things.
    – sbi
    Nov 8, 2011 at 6:05
7
votes

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++.

8
  • 4
    ""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?" You mean Here is the STL. Wait, what. Why didn't you teach me to use the STL in C++ from the start?!
    – Raynos
    Jul 28, 2011 at 7:40
  • Well, STL is sweet. I am referring more so to the Windows API in so far as Windows programming goes. The windows API is not designed with OOP in mind. I find it a great exercise to make some poor chap write an application using the API in c++. I then have him/her write a Window class and encapsulate the event loop so on... you know, make it object oriented. Then after they finally have it working I show them Windows Forms. It really forces them to deal with some basic concepts--i.e. how a Windows application works-- that someone would never get if they just jumped into .NET. Jul 28, 2011 at 8:04
  • 4
    why would anyone touch the windows API with a stick. I mean were talking about the hWND from the 80s right? Clearly you use some nice abstraction instead (Which abstraction is a completely different debate). Sure knowing how it works under the hood is nice but you don't need C#.NET for the abstraction
    – Raynos
    Jul 28, 2011 at 8:08
  • 2
    The Windows API is amazing. Anyways, I only use it for a teaching tool. For instance, people usually do not understand how events get magically fired in the windows programs. It is helpful for them to have to fool around with the event loop. Also, programmers need to at the least be familiar with the hWND especially if they will be dealing with any apis that fool around with graphics--just as you will have a hard time doing anything in Unix without knowing how to use an XID. Anyways, it forces them to learn how a windows program works. Also, once they finish, they know how Windows.Forms works. Jul 28, 2011 at 8:13
  • It doesn't have to be a transition to C# b.t.w, just to .NET in general. I think @Joel has a good article on the Law of Leaky Abstractions as to why it is often good for programmers to look under the hood before using a framework. Jul 28, 2011 at 8:15
6
votes

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

6
votes

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.

2
  • 1
    I think pair programming is a really great way to teach novice programmers, but I think pair programming all the time can be problematic. I think novice programmers need some time working alone to learn how to solve problems and to build confidence in their abilities.
    – Helephant
    Nov 7, 2011 at 20:37
  • Yep, get them going with the pair programming & give the simple tasks -- real tasks, on the software they're meant to be working on, in the language they're meant to be working in, with real accomplishment. Review & mentor all their work and they will progress.
    – Thomas W
    May 15, 2013 at 0:52
2
votes

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
vote

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.

1
vote

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.

1
vote

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.

Not the answer you're looking for? Browse other questions tagged or ask your own question.