Self-teaching programming skills -- some bumps in the road
September 7, 2013 11:57 AM Subscribe
I know MOOCs have like, a 7% success rate and I'm starting to viscerally understand why.
How do you keep yourself on track, as a self-guided learner?
How do you shift gears between multiple programming languages?
How do you refresh yourself on material after a lapse?
Special snowflake background details within.
So I've been learning to program in Python for a couple of months now. I started off with Learning Python the Hard Way and MIT's 6.00 course, but when I got stuck, those were soon overmatched by the ease of doing Udacity's CS101 and Codecademy's Python track right in my browser.
This was all before I discovered Coursera, which is not self-paced like the others. I neglected my coding for nearly a month-- I don't even remember why-- and now I'm taking a course in program design which uses Beginning Student Language. I'm ahead of the schedule and it's given me a yen to do more coding. The problem is, I look back at the projects I was doing before (in Python) and they seem far too advanced for me to understand, like I'm back at square one. I'm not sure what to do to get my head back in the game, and I don't want to keep starting over with new resources.
So I've been learning to program in Python for a couple of months now. I started off with Learning Python the Hard Way and MIT's 6.00 course, but when I got stuck, those were soon overmatched by the ease of doing Udacity's CS101 and Codecademy's Python track right in my browser.
This was all before I discovered Coursera, which is not self-paced like the others. I neglected my coding for nearly a month-- I don't even remember why-- and now I'm taking a course in program design which uses Beginning Student Language. I'm ahead of the schedule and it's given me a yen to do more coding. The problem is, I look back at the projects I was doing before (in Python) and they seem far too advanced for me to understand, like I'm back at square one. I'm not sure what to do to get my head back in the game, and I don't want to keep starting over with new resources.
Sorry if I'm approaching your situation the wrong way here, but think about travelling obliquely. You say you've been "learning to program in Python for a couple of months now" but why are you? Do you want to get a better job, do better in life, etc, or is it just a passing curiosity?
I'd recommend finding a goal that is more interesting. Want to build the next MetaFilter? Want to build a webapp on $topic_you_love that you can sell access to? Find something that requires you learn Python but that's a more passionate and interesting goal. You'll then HAVE to learn Python to reach the more interesting goal and constantly apply what you're learning.. don't learn theory for the sake of it.
Just learning Python for the sake of it or lifting weights for the sake of it is really easy to give up on. But launching an online community for your buddies or getting buff to turn heads at the beach? Those are goals that can keep you in the game.
posted by wackybrit at 12:40 PM on September 7, 2013 [6 favorites]
I'd recommend finding a goal that is more interesting. Want to build the next MetaFilter? Want to build a webapp on $topic_you_love that you can sell access to? Find something that requires you learn Python but that's a more passionate and interesting goal. You'll then HAVE to learn Python to reach the more interesting goal and constantly apply what you're learning.. don't learn theory for the sake of it.
Just learning Python for the sake of it or lifting weights for the sake of it is really easy to give up on. But launching an online community for your buddies or getting buff to turn heads at the beach? Those are goals that can keep you in the game.
posted by wackybrit at 12:40 PM on September 7, 2013 [6 favorites]
Best answer: On any given day, I may have to write in JavaScript, Perl, PHP, Python, Erlang, C, or a shell scripting language, and it's *frequently* 3-4 in one day as I add one small feature that requires new code in the browser, the server-side web app, some web services, and a backend. I hate that--the pain of context-switching never goes away. So some of these issues are likely to persist throughout your career, but it does get easier as you begin to see how similar programming languages really are.
As a beginner, you should document the crap out of every project. As you become more and more experienced, what you'll learn to do is write code that just feels obvious: your code will follow that language's coding standard and look just like every pro line of code you read elsewhere in that language; variable names will all be obvious and follow an obvious pattern; objects and their methods will almost tell a story as you read the code; everything in the app will be in a 'standard' place; etc., etc.
You're not there yet, so document the bejeezus out of everything, addressing your future self's need to reboot these skills. Write a README.txt explaining the whole app. Explain the point of every function, plus what it expects and what it returns. Even translate the code, line by line, into English. You wouldn't be quite so verbose in professional, published code, but this is student work, and you're likely to refer to it again to refresh your memory.
posted by Monsieur Caution at 12:46 PM on September 7, 2013 [7 favorites]
As a beginner, you should document the crap out of every project. As you become more and more experienced, what you'll learn to do is write code that just feels obvious: your code will follow that language's coding standard and look just like every pro line of code you read elsewhere in that language; variable names will all be obvious and follow an obvious pattern; objects and their methods will almost tell a story as you read the code; everything in the app will be in a 'standard' place; etc., etc.
You're not there yet, so document the bejeezus out of everything, addressing your future self's need to reboot these skills. Write a README.txt explaining the whole app. Explain the point of every function, plus what it expects and what it returns. Even translate the code, line by line, into English. You wouldn't be quite so verbose in professional, published code, but this is student work, and you're likely to refer to it again to refresh your memory.
posted by Monsieur Caution at 12:46 PM on September 7, 2013 [7 favorites]
On a more nitty-gritty details note, it might be a good idea to use going back to old code as an object lesson in good commenting and good code organization. When you're going back through, keep an eye out for what comments would've really helped you get up to speed faster, ways you could have organized your classes, etc. to make it easier to get up to speed on a reread, that sort of thing.
Because if you do decided to do a lot of programming, you will be going back to code you wrote months ago and starting from square one fairly often. Its good to develop habits early on to make that less painful.
On preview: seconding what Monsieur Caution said.
posted by Zalzidrax at 12:48 PM on September 7, 2013 [1 favorite]
Because if you do decided to do a lot of programming, you will be going back to code you wrote months ago and starting from square one fairly often. Its good to develop habits early on to make that less painful.
On preview: seconding what Monsieur Caution said.
posted by Zalzidrax at 12:48 PM on September 7, 2013 [1 favorite]
I am also learning programming on my own (Python). I am working through the online book How To Think Like A Computer Scientist. I would suggest HTTLACS, but no matter what learning material you are using, it is key to stick with it and not jump from material to material again. When you get stuck, feel free to search the web for answers. A lot of times I would be stuck on a problem for what seemed like a really long time and then realized my understanding of the syntax was wrong after doing some googling.
To catch yourself up to speed, why not re-read the chapter you left off on/redo some of its exercises? If after a month, the projects you had previously been working on really seem that unfamiliar, I have a feeling that maybe the materials you were studying from did not have you practice the concepts enough or maybe you weren't working on them often enough to have the material stick. Repetition is really key. I like HHTLACS because not only does it give you a lot of practice, it builds upon concepts and skills learned in previous chapters in the exercises of every new chapter.
I am not as good at keeping myself on track either. I had almost a month where I was coding for an hour or so about every other day after work and then an hour each day on the weekend. Then I had a week or so where I didn't have enough time to get my coding in, and after that it was a struggle to sit myself down and program for even an hour a week. It really must be made a habit. Work it into your schedule instead of just thinking to yourself that you'll "make some time." As I was trying to illustrate, I know I was a lot more productive when I went about it that way.
And as far as shifting gears between programming languages, I think (for myself at least) it is best to just focus on one programming language, and learn the fundamentals of programming in that language before branching off into anything else. Python, luckily, seems to be one of the easier languages to learn these concepts in. As I have read, heard, and, from what I comprehend myself, the same concepts you learn in one language will mostly carry over into another (as long as they are used for the same purposes) and it will just be a matter of learning a different syntax. In the preface to the material I am currently studying from, a teacher who taught high school AP Computer Science (in C++) continuously had classes of students who were having trouble comprehending the underlying principles of programming, and when he taught them Python at the very beginning of the course, his students' comprehension greatly improved. I, myself, am having a much easier time understanding basic concepts of programming through Python than I did with a previous foray into C++.
posted by sevenofspades at 1:01 PM on September 7, 2013 [3 favorites]
To catch yourself up to speed, why not re-read the chapter you left off on/redo some of its exercises? If after a month, the projects you had previously been working on really seem that unfamiliar, I have a feeling that maybe the materials you were studying from did not have you practice the concepts enough or maybe you weren't working on them often enough to have the material stick. Repetition is really key. I like HHTLACS because not only does it give you a lot of practice, it builds upon concepts and skills learned in previous chapters in the exercises of every new chapter.
I am not as good at keeping myself on track either. I had almost a month where I was coding for an hour or so about every other day after work and then an hour each day on the weekend. Then I had a week or so where I didn't have enough time to get my coding in, and after that it was a struggle to sit myself down and program for even an hour a week. It really must be made a habit. Work it into your schedule instead of just thinking to yourself that you'll "make some time." As I was trying to illustrate, I know I was a lot more productive when I went about it that way.
And as far as shifting gears between programming languages, I think (for myself at least) it is best to just focus on one programming language, and learn the fundamentals of programming in that language before branching off into anything else. Python, luckily, seems to be one of the easier languages to learn these concepts in. As I have read, heard, and, from what I comprehend myself, the same concepts you learn in one language will mostly carry over into another (as long as they are used for the same purposes) and it will just be a matter of learning a different syntax. In the preface to the material I am currently studying from, a teacher who taught high school AP Computer Science (in C++) continuously had classes of students who were having trouble comprehending the underlying principles of programming, and when he taught them Python at the very beginning of the course, his students' comprehension greatly improved. I, myself, am having a much easier time understanding basic concepts of programming through Python than I did with a previous foray into C++.
posted by sevenofspades at 1:01 PM on September 7, 2013 [3 favorites]
Best answer: Yeah, as others are saying, what is the point here? What little code I know was learned to figure out how to accomplish something.
Also, I homeschooled my gifted-learning disabled sons. They either tore through material that was a good fit or grudgingly trudged through stuff that wasn't. When they were up to speed on phonics, I had them pack up their phonics game ceremoniously one last time and we mailed it to a younger cousin of theirs. They hated phonics but they needed it. We didn't get through all of it but it brought them up to grade level.
So I think maybe one issue you are having is not knowing how to give yourself credit and get closure. It sounds like you bounce around from course to course and judge yourself for not finishing anything. But my sons never finished a single textbook in public school either. Yet they got to the end of the year and were promoted to the next grade. This is a common issue among homeschoolers: Figuring out when you are "done" and acheiving sone sense of closure.
It helps to have real world goals/projects because that has structure built into it. If I want to do x on a website I own and I google around, I have learned "enough" when I have implemented the feature. If I remain dissatisfied and want to improve it, I can do that. But I have some sense of an endpoint built in. If it is functional but not great, yes there is room for my study but it isn't required.
If you don't want to do a project, at least make a list of goals. When I homeschooled, my sons were checked twice a year against a state list of grade level competencies. Those things where they were at grade level got some kind assigned work with wiggle room for negotiation. Those areas where they were below grade level got assigned work and it was okay if they didn't like it. Where they were above grade level, they got to choose optional enrichment materials for pleasure and no curriculum was assigned. When they came up to some standard, required work got dropped.
So you need a list of competencies or goals or something to measure yourself against. Then if x curriculum accomplishes some goal, you can stop with some sense of closure even if you do not get through all the material.
posted by Michele in California at 1:26 PM on September 7, 2013 [2 favorites]
Also, I homeschooled my gifted-learning disabled sons. They either tore through material that was a good fit or grudgingly trudged through stuff that wasn't. When they were up to speed on phonics, I had them pack up their phonics game ceremoniously one last time and we mailed it to a younger cousin of theirs. They hated phonics but they needed it. We didn't get through all of it but it brought them up to grade level.
So I think maybe one issue you are having is not knowing how to give yourself credit and get closure. It sounds like you bounce around from course to course and judge yourself for not finishing anything. But my sons never finished a single textbook in public school either. Yet they got to the end of the year and were promoted to the next grade. This is a common issue among homeschoolers: Figuring out when you are "done" and acheiving sone sense of closure.
It helps to have real world goals/projects because that has structure built into it. If I want to do x on a website I own and I google around, I have learned "enough" when I have implemented the feature. If I remain dissatisfied and want to improve it, I can do that. But I have some sense of an endpoint built in. If it is functional but not great, yes there is room for my study but it isn't required.
If you don't want to do a project, at least make a list of goals. When I homeschooled, my sons were checked twice a year against a state list of grade level competencies. Those things where they were at grade level got some kind assigned work with wiggle room for negotiation. Those areas where they were below grade level got assigned work and it was okay if they didn't like it. Where they were above grade level, they got to choose optional enrichment materials for pleasure and no curriculum was assigned. When they came up to some standard, required work got dropped.
So you need a list of competencies or goals or something to measure yourself against. Then if x curriculum accomplishes some goal, you can stop with some sense of closure even if you do not get through all the material.
posted by Michele in California at 1:26 PM on September 7, 2013 [2 favorites]
This thread is closed to new comments.
I'm self taught, and staying on track is definitely hard. Having a project I really want to finish helps keep me focused. Get the fundamentals under your belt, then get going on a small project you find interesting. Just keep plugging away, try and work on it every day if you can. You'll be amazed how much you improve after a few months when you look back at your old code!
posted by meta87 at 12:06 PM on September 7, 2013 [4 favorites]