Teaching Programming To A Highly Motivated Beginner
cacm.acm.org
cacm.acm.org
If you view programming as a craft, having mentors/coaches/peers definitely helps you improve much faster.
That said, students pick it up quickly, and are very satisfied with their new skills. I can't wait to get into actual programming next week.
Computers don't work like that today. Installation and configuration of various dependencies are a real challenge when learning.
This is especially true when trying to teach kids - we like to think they're all computer geniuses now, but really a lot of kids don't seem to have any idea of how to navigate a file system. They're hooked on installers.
You might be interested in Yehuda Katz's project, Tokaido.
http://yehudakatz.com/2012/04/13/tokaido-my-hopes-and-dreams...
To your first point, I really wish people would make virtual machine images with dev environments already set up on them.
I think this is actually often more of a problem in the long run, as it just pushes the learning of how RoR interfaces with the rest of the stack to later. If you're seeking to teach someone how logic, program control flow, and separation of concerns work (as the author did by abstracting the "grunge work" as he calls it), why not pick an environment a bit more bare-bones?
I see the merit in allowing someone to get something up and running rapidly, but I think they may miss important concepts when learning in an environment that favors convention over configuration.
He's not missing important concepts but deferring important concepts to learn other important concepts that lead to progress today.
You end up paying back that deficit one step and one layer of abstraction at a time:
Some of Brian's biggest forward mental leaps came when he took
a step back away from the day-to-day project grind, learned new
concepts in a course or from a book, and then thought about how to
apply them to SwearBuy.If your goal is to tinker with a new language, or a new tool, it would be really nice to start from a working example that you can fiddle with, rather than being stuck with the sometimes arduous task of configuration.
Then again, I prefer learning from reading a book than from being taught. Everyone is different. It must be amazing to have someone guide you and check up on you once in a while though.
It's been so long since I started programming that I can't really remember mine. My wife is learning now and I sometimes worry that my gauge of what are good beginner projects is off.
* a console hangman game
* a weird ascii art animation program
* a "guess the animal" program that used a binary tree of yes/no questions to guess the animal the player thought of. if it failed, it asked for a question that could be used to distinguish the wrong guess from the right one, and appended it to the binary tree (which was stored on disk)
I thought those were such a big deal back then :) Oh, the good old times :)
Figured out the following technologies on the fly: Python for the machine learning part, the backend and web scraping (after I finally gave up on SOAP), SQLite, HTML/CSS, PHP (after giving up on Django), Apache web server, FTP protocol (for backing up my stuff to my external drive). There are probably other things I tried and gave up on but forget.
I definitely went down a LOT of blind alleys and generally found out-of-the-box frameworks incomprehensible. The difference in the various communities was fascinating, too. For instance, try comparing forum answers to CSS or PHP questions against Python or, gasp, C. Holy cow.
*The result, if anyone cares, was that I figure they systematically overestimate High temps, underestimate low temps and overestimate POP.
EDIT: forgot javascript/jquery.
We are really into StarCraft II, so she's thinking of building a build order identification game for her first bigger project. We'll probably go ahead and use JQuery Mobile + PhoneGap to make it a free Android app we can give to our friends. Not quite as complex, but it should be fun!
For those of you that don't play StarCraft: A build order is like an opening in chess: it sets up the rest of the game, and recognizing/responding to a build order is key to being a good player. The game she wants to build would help train people to recognize build orders by showing them a quiz with pictures.
But, I also want to learn because I know that I need to understand what is being built and if it's being built in the best way to accomplish the goal - getting the job done for the customer.
Is it realistic to focus on being a generalist with an understanding of various languages or do I just need to learn one language first like Python and go from there? I noticed the MIT Python videos are free also. Thanks
Studying other languages exposes you to issues that you might not experience on your own, but on the other hand it's hard to apply your understanding of them all quickly. Python is an excellent language to learn first.
Learn enough of one language to be dangerous, code the minimum that comes close to what you feel you need (or a toy version of it), and then you'll have a much better idea of what else you want to learn. Good luck!
I live in a small tourist town and I was surprised to find a local Ruby developer. We met up and I asked him to tutor me a couple of hours per week trying to build an actual Ruby on Rails application.
He set up the project structure and wrote a couple of tests, and I'd go back home and try to get those tests to green. Boy it was hard. I'd grind for days trying to get the last couple of tests to pass, so when we'd meet up for our weekly session he'd resolve them in just a couple of minutes and it made perfect sense. It was worth it just for those "ah ha!" moments.
Of course, the motivation isn't in learning the language/framework itself, it's in building something useful or meaningful to you.
In the end, with 2-3 hours of weekly mentoring, I was able to release the functional application in six months and learned tons in the process.
While she hasn't needed a lot of help with those, she has also been working on extracurricular projects that I've helped put together for her. This is where I think the article was most revealing: I have been worried about helping too much, but now I can see why the opposite is true.
The author mentions that struggling with what you're learning is important. I agree. However, I think I have been letting my student struggle with the wrong things in the name of not "doing it all for her". I think it would be better to err on the side of providing every resource I can to define a straight path to a completed project. When she gets comfortable at a certain level, we can make the projects more complicated by involving more parts, rather than more frustrating by giving her less information.
Although I'm not building my own projects in the exercises, I am building something that I understand. This week's exercise was Pong and I'm looking forward to Asteroids in week 8.
Making something concrete really helps me understan the concepts.
I'm hoping to make the process of going from newbie to experienced easier and more meaningful with CodeMontage (http://bit.ly/CodeMontageLaunch) - you get to work on real, open-source and social-mission projects, you get feedback and code reviews from experienced developers, and you build a portfolio of open source, quality code that you can reference later or use to get a job. It's also really nice for the experienced developers / experts in a language to be able to give code reviews on important projects - it's nice if you have a friend willing to pair on your side project, but definitely can wear on a relationship over time (and when all your friends are learning to code...).
> Since we finished our final tutoring session in March 2012, I didn't hear from Brian for six months. He recently sent me an email mentioning that he just wrote a Python script to help him model personal stock investments: "I'm very proud of this script because it was the first thing I've done that was both practical and purely for personal use. I was evaluating a stock investment and wanted to simulate a bunch of scenarios. I started to model the scenarios in a spreadsheet before I realized that a spreadsheet wouldn't work, but python was perfect."
Showing how programming is useful for "both practical and purely for personal use" seems to be the surest path for enticing non-professionals...with everything that we have to keep track of in our lives, purely academic pursuits can be tough to stick to.
I've already got a BA in business, and while repaying college loans, I really can't afford to pay for college classes to be able to meet with a professor. Besides, I'm not sure that college courses would teach me electronics and programming faster than I can teach myself. (College was a good experience, but I'm not trying to get another BA)
I'd almost like to start a service connecting interested learners with subject-matter mentors. In fact, some type of mentorship/tutoring program could be an integral part of a good hackerspace.
My wife has recently asked me to teach her some programming. I doubt she will be that highly motivated though. I am guessing her interest is just to explore this world and perhaps better understand the work I'm doing. I have never taught any beginners but this could be a fun experience for both of us. I am wondering what kind of assignments, projects or scenarios to go through, and what kind of a development environment to use.
I love python and think it's probably the best language to learn (and use), but I'm not sure how excited my wife will be from looking at a console? I was considering a little bit of javascript together with HTML/CSS, but most of the programming involved with interactive web pages I find a little boring... Any suggestions for some cool simple projects to walk through and learn programming with?
A friend of mine who is highly motivated is having fantastic success with Zed's "Learn Python the Hard Way" (http://learnpythonthehardway.org/). I can't say I'm teaching him, though, I'm just in text and email contact if he hits a sticking point.
If going back to school is probably not an option for this guy due to other obligations (and finances) do you have any advice for the path from solid hobbyist into entry level professional?
By mere rewriting the code from Scheme to (ugly) Python they lost all the elegance and convenience acquired by decades of evolution of the classic courses and two editions of SICP.)
Watching 6.00CS is boring, when you remember how this very code supposed to look in Scheme.
The old Berkeley's CS61A, which is based on the same great book, was also translated into Python.
For teaching in Python, at the very least, its standard idioms must be carefully selected and used, as it is in the original Python tutorial on the web.
It's how I finally added some structure to my learning adventure.