Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

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

share|improve this question

closed as not a real question by MichaelT, Martijn Pieters, Giorgio, gnat, Frank Shearar Apr 4 '13 at 13:59

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.If this question can be reworded to fit the rules in the help center, please edit the question.

1  
Maybe related question: programmers.stackexchange.com/questions/10930/… :D –  jmservera Jul 28 '11 at 15:12
    
I've heard that Learn Python The Hard Way is good for non-programmers starting out. –  john2x Jul 28 '11 at 16:48
    
Take a look at Small Basic. It is simple, but useful for the beginners. –  Rafael Osipov Jul 28 '11 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. –  The Muffin Man Jul 28 '11 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 '11 at 17:59

11 Answers 11

up vote 125 down vote accepted

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.

share|improve this answer
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. –  Jonathan Henson Jul 28 '11 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. –  Joel Spolsky Jul 28 '11 at 15:05
32  
You are so out of touch sometimes, Joel. –  Robert S. Jul 28 '11 at 15:09
45  
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. –  Joel Spolsky Jul 28 '11 at 15:13
19  
Unfortunately, this answer fails the up to speed quickly part. –  rlb.usa Jul 28 '11 at 16:35

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.

share|improve this answer
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 –  Julien Chastang Jul 28 '11 at 17:00
    
Julien - nice! Exactly! –  jkoreska Jul 28 '11 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 '13 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. –  luisperezphd Nov 3 '13 at 14:14

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.

share|improve this answer
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. –  Kirk Broadhurst Nov 7 '11 at 4:27
1  
@KirkBroadhurst: If so, then something is wrong at your company. –  sbi Nov 7 '11 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. –  Kirk Broadhurst Nov 7 '11 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 '11 at 6:05

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

share|improve this answer

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

share|improve this answer
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 '11 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. –  Jonathan Henson Jul 28 '11 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 '11 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. –  Jonathan Henson Jul 28 '11 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. –  Jonathan Henson Jul 28 '11 at 8:15

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.

share|improve this answer
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 '11 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 '13 at 0:52

I am currently learning how to program. I've tried many methods, but the most effective one I've found is going through the free online Stanford Intro to CS class: http://see.stanford.edu/see/courseinfo.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111. It includes lectures, assignments, and handouts. It's like going to school at Stanford. It's probably not the fastest method, but it'll get him excited about programming and at least get him started on the basics. The class is Java.

share|improve this answer

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.

share|improve this answer

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.

share|improve this answer

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.

share|improve this answer

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.

share|improve this answer

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