Pain. Or, Why Learning to Code is like Learning Chinese.
savemefrombschool.com
savemefrombschool.com
I don't think I know of a single good programmer that learned to code in such a horrible grueling manner. If you're not making shit from the very beginning, then you're never going to learn to love it, and if you don't love it, then you're not going to be very good at it.
One of the most important traits of a good programmer is that while they work hard, they barely consider it work. Especially at the beginning, where the work:play ratio is practically zero. The boring programming grind should only start when you're doing work for other people that you don't care very much about; if it feels like that before you reach that stage, you're doing something wrong. Find a nice easy graphical language to play around with while you learn about functions, classes, I/O, and algorithms; you can start worrying about mastering the LAMP stack once you've realized that the programming part of it is easy and fun, and the LAMP part of it is just another set of technologies whose quirks we learn and put up with in the name of getting things done a bit more easily.
I think the real problem is that the blog post might be right: you do need to know the basics to get very far in programming. But the basics of programming have nothing to do with hard library-specific study and grueling memorization; they involve loving to build things and make them work, thinking logically and experimenting with all sorts of code just to see what happens. The rest comes pretty naturally once you have that down.
I am not someone who will learn something conceptually just for the sake of knowing it.
The point is that, what I learned from Chinese was that if you just suck it up and force yourself to learn the basics for a while (no matter how much you wish you could just get back to building things) that you can actually become better faster. That is the part that's painful - the actual making-of-things part is way fun.
Hm, this doesn't sound right. My programming education only began in earnest once I started writing programs for other people, for money. Every new project stretched my abilities.
I think the conclusion is, hard stuff is hard, and you have to try hard.
For example, if you know Italian and you want to learn Spanish you can translate a lot of your prior learning. The sounds are the same, the sentence structure, and many of the words even. Even English to Spanish isn't that different.
When you know English and you want to learn Chinese you have to learn a completely different way of pronouncing and listening to language.
I think her point is that non-technical people don't realize that there are a lot of fundamentals and basic principles that you need to learn to code well that you can't just pick up in your non-technical life.
This might be a bit of extrapolation but while all human languages are very different, they all have recursion and learning to program is more or less harnessing the mastery of recursion that we language speaking humans already have. I've been terrible at learning learning but I can pick a programming language reasonably quickly, I don't need to rewire to anywhere the same degree.
I agree to your point about programming for non-techies though. And unlike with natural languages, you can't hand-wave your way out when you stuck..
For example, if he learned Mandarin in Taiwan he could've picked up a southern accent.
(And yes as remarked below my first exposure to the language was in Taiwan, but the courses I follow are not Taiwan specific)
8 years into the language, I still have real difficulties with some of the r's at the end of words, "有空儿吗?" (you kongr ma?)
The strength of the comparison doesn't come from the need for persistence, which is truly critical to either undertaking, but instead the kind of mental reformatting that needs to go on before either mode of expression is going to make sense.
I liked her bopomofo example because it highlights the fact that there is a level below programming can even begin --- it's the level that "your grandmother" can't even see --- and if you think you can just dive into an intro to Python (sorry Mark Pilgrim) and hope you'll be sadly, sadly mistaken.
Both endeavors require a great deal of tedious study of minor detail. You need to unlearn a lot and relearn it more generally. You can't program if the idea that computers run instructions isn't implicit; you can't speak Mandarin if you don't speak and hear tones without thinking twice.
Any subject is hard as you get deeper into it. Chinese pronunciation is hard from the beginning for a native speaker of English because of the need to attend to phonemic tone. Chinese grammar eventually gets to be plenty hard, although I find it congenial compared to Russian grammar because it is mostly based on word order and function words rather than on inflection.
As for what is hard about programming, I HEAR (but don't know from personal experience) that learning to think recursively is hard. Pointers are hard, I am told, for many people who learn C. Thinking about programming from a functional rather than imperative perspective is hard until one studies a functional language thoroughly (usually).
Whether it's learning a computer language, or learning a natural human language, one has to get out of the world of instructional materials and into the world of actually communicating with them machine or the foreign person. It's the live situations in writing new code or conversing about new topics that really test a programmer or a language learner.
There's a failure of pedagogy in teaching the language. Chinese grammar is trivial if taught properly (we teach "prepositions" and "adjectives" before introducing "coverbs" and "stative verbs" and that seems to work). And while the tones can be tricky, most people don't get nearly enough listening and speaking practice.
As you said though, practice makes perfect. For me recursion was fun but memory management with vectors of pointers was a bitch. Easy to have a conceptual understanding, but the sort of thing you only master when you need to trace stuff through source to figure out where an error is. Then it clicks for good. :)
One similarity: actually using the skills practically is incredibly vital for learning. For Mandarin, this is conversations; for programming, projects. Another: there's a few interesting isomorphisms between linguistics (Chinese is the first foreign language I've seriously tried to learn) and computer science. But overall, learning them has been a very different experience.
She's comparing learning Chinese as someone that knows English to learning programing as someone that is non-technical.
Both require people to learn fundamentals before they can go on to do "the fun stuff" (for Chinese, ordering food and for Programming, your own twitter client). This is because what you're learning is so alien to what you know, both as an english speaker and as a non-technical person. A lot of people stop learning at this point, at the fundamentals. She's saying don't stop there--power through it. There's light on the other side.
Computer languages are how you translate your project ideas to what a computer/platform can understand, literally it's still a language
Just today, I cracked my recursion homework assignment, which I assume to be uncrackable for mere mortals and after my CS teacher just told me to do it.(I wrote code since middle school!)
Currently I do most of my development for the linux platform but I was considering moving to windows to take advantage of some opportunities in that area but I am facing some of the same challenges as the author of the article. The C# language and .NET platform are a whole new world and it feels like I am starting from scratch. It's hard to justify as I can do everything I need to do on the linux platform.
If I had just been tossed into a "Programming in Java" one-week course I probably would have been totally lost because they would gloss over a lot of the basics in an attempt to teach the specifics.
I don't entirely get the analogy... is she learning assembly and CPU design before learning 'print "Hello world"'? That's great... unless you want to actually write anything remotely practical.
It is, however, entirely true that learning Chinese is goddamned hard. There's a saying: "After studying Chinese for 5 years, you learn humility."
>> 'Someone once said that learning Chinese is "a five-year lesson in humility". I used to think this meant that at the end of five years you will have mastered Chinese and learned humility along the way. However, now having studied Chinese for over six years, I have concluded that actually the phrase means that after five years your Chinese will still be abysmal, but at least you will have thoroughly learned humility.'
For me, programming was never a really difficult problem. I suppose this is because I learned to use DOS and BASIC at an early age. I some basic (pun not intended) programming before I learned algebra. I learned html and javascript when I was 12 and didn't really get the point. Nobody had told me that html was generated.
I didn't use any of my programming skills until I went to college and starting playing around with linux. It wasn't difficult for me to pick back up.
I suppose fluency with programming could be similar to fluency with language. If you start early, it's a lot easier.
I suppose you could also program or seen code programmed with an accent.
I should add that learning to code != learning the LAMP stack. Hopefully she'll take her own advice and learn the fundamentals first.
but on a different note, as far I can tell (and granted I am brand new to this) does "coding" as a general term necessarily imply a scripting language? can you not "code" a database or is there a different verb for that ("implement")?
On your original note, "learn the LAMP stack" is, IMO, not especially ambitious for 5 years. Get a good CS degree (3-4 years) and actually try to learn the material instead of just passing, and learning the specific technologies is just a matter of skimming the manual as appropriate. Yes, it is entirely possible to get such a degree and have no practical clue, but that's a symptom of never doing anything outside of class.
If you use something like Django, you won't even interact with the database directly. I don't know if there is a coding-ish word for "writing SQL queries," but there's certainly more than SQL in database land.
Honestly, my number one tip for learning this stuff is just to read constantly and write code whenever you can. Also, sometimes you need to do projects that don't end in a product you can sell in order to learn new things, so get used to throwing stuff away (not literally, of course, but certainly from a revenue standpoint).
Overall though, knowing how to code (and having learned for the "right reasons") is hugely helpful in dealing with Software people in the future. I suspect you knew that already :)
There is some perl adage about a good programmer being a lazy programmer. Learn the shortcuts. I think python is a pretty good one, so might be emacs.
I think you generate code. Programming and implementing are probably better verbs, in my opinion.
I have worked with a CS graduate that struggled with practical application. And programmers that can't write from scratch.
Rudiments such as coding paradigms get you a long way, so does cut and paste and a bit of glue code. Reuse where possible.
You can get lost in theory, you can learn and learn more and more; but you can also thrive on a minimal subset of something larger - like a programming language. You can't learn everything!
You can understand a language without speaking it - and possibly get by with grunts, nods and hand gestures.
enough said.