Khan Academy Launches Computer Science Curriculum
joabj writes "Expanding beyond math and the physical sciences, Khan Academy has added a set of computer science courses to its popular collection of learn-at-home instructional videos. For the project, Khan tapped jQuery creator John Resig, who chose JavaScript as the first language to teach students. The initial set of tutorials cover drawing, programming basics, animation and user interaction."
JavaScript can be an ugly language to work with, but the interactive editor they have looks really good and nicely works around all the issue one frequently runs into when using raw JavaScript (catches missing semicolon, catches typos of function names, allows editing color values via GUI, automatically runs the code on each change, etc.).
Khaaannnnnnnnnnn
Every language has its ups and downs. Javascript has the advantage that it bears some similarities to non-scripting languages and will produce instant results without getting too heavily into theory.
Name a language that is easier to get started in. You already have a browser that runs Javascript, regardless if you're on MacOS, *nix, or Windows (or whatever system you use most likely), now all you need is a text editor, which is built in on most systems. I don't know of any other language that doesn't require you to download and install some sort of compiler, interpreter, SDK, or whatever, all of which are barriers to entry. Plus, you have the advantage of using one of the most widely used languages on a platform that can distribute your code very easily and very portably.
You may not like Javascript--and granted, as a language, it's got plenty of warts. (Note that you can fix a great deal of these warts on modern browsers by simply including a "use strict" declaration at the top of your code). But it's a great language to start out in, if for no other reason than that the start-up cost is very close to negligible, and it's a useful language that enjoys a level of ubiquity that most other languages only dream of.
.
Real Programmers must spend their first year writing Pascal code to create hypothetical schedules for students at a university, followed by implementing every data type in a fat textbook from "Associative Array" to "Weight-Balanced Tree." Second year, the same thing - in Scheme. Final year, same thing - in assembler - and with runtime complexity proofs.
Congratulations, the both of you remaining are done.
What is this? Use of libraries? Graphics? User interaction? Heresy I say!
It also has a number of rather large disadvantages: requiring an understanding of closures, no real notion of classes (objects are just glorified key-value stores), implicit variable scoping, implicit insertion of semicolons (in ways that can actually cause errors in some cases), and the confusing (ab)use of the plus operator for string concatenation... and that's just the language itself. As soon as you start adding in the brain damage that is the DOM, it quickly becomes one of the worst programming languages you can possibly use to teach young minds, posing a very real risk of turning them off to programming rather quickly as soon as they try to step outside the narrow confines of the lecture material.
Want to make someone swear off programming for good? Make them write any sort of complex web-based text editor using ContentEditable. It makes my i386 assembly days seem sane by comparison; you spend more than 99% of your time working around bugs in one browser or another, and less than 1% of your time actually writing code that actually does something useful.
Check out my sci-fi/humor trilogy at PatriotsBooks.
Which part of "Academy" confuses you?
I disagree with Kahn calling these Computer Science courses, but I have to admit that I am at a loss as to what to call them. Computer Fundamentals perhaps?
It is a disservice to those looking at these to think that Computer Science is making an iPhone app or game. It really trivializes how powerful computers are and the concepts they embody.
Average Intelligence is a Scary Thing
Name a language that is easier to get started in.
CoffeeScript. Granted, it introduces an additional dependency (CoffeeScript) on what is otherwise the simplest and easiest development platform. Which leads me to the following:
You already have a browser that runs Javascript, regardless if you're on MacOS, *nix, or Windows (or whatever system you use most likely), now all you need is a text editor, which is built in on most systems. I don't know of any other language that doesn't require you to download and install some sort of compiler, interpreter, SDK, or whatever, all of which are barriers to entry. Plus, you have the advantage of using one of the most widely used languages on a platform that can distribute your code very easily and very portably.
You may not like Javascript--and granted, as a language, it's got plenty of warts. (Note that you can fix a great deal of these warts on modern browsers by simply including a "use strict" declaration at the top of your code). But it's a great language to start out in, if for no other reason than that the start-up cost is very close to negligible, and it's a useful language that enjoys a level of ubiquity that most other languages only dream of.
^^^ This. This is the reason (a really good reason) to use JavaScript as an introductory programming language with virtually zero barrier of entry (in terms of development env. setup.)
Obviously, people will complain - argh, real devlupers use <insert toolchain> with <insert IDE/editor/whatever>. And on a real CS-oriented, full-blown and complete programming course, this is true. But we need to notice that Khan's materials are not full-blown courses, but tutorials with the explicit aim of being as accessible to the masses as possible.
Whether this (and/or the choice of JavaScript) will turn people unsuitable for programming into legions of useless code monkeys is a non-issue. After all, the typical CS programs at brick-n-mortar universities have been producing useless code monkeys since the dot-com.
What a system of programming tutorials as implemented by Khan's academy will do, however, is to make the learning of programming more accessible to those that already have the potential of being good developers. Perhaps this could reach them early on before they finish their secondary education (or allow currently enrolled CS-students to use them as add-ons to their formal curriculum.)
JavaScript is a god-awful language, but its development setup makes it a decent first-language. Yes, it does not have true OO, but neither did BASIC. And good and bad developers will become so whether they use JavaScript, BASIC or Haskell (yes, there are atrocious Haskell programmers.)
Different educational institutions have different goals. If you want to go be a programmer and hack source code to make games, apps, real world things, etc. than traditional University education is probably not for you. Unless you are writing a physics engine from scratch, your use of math is probably limited and often CS degrees require a lot of math. Remember that the S in CS stands for science. This is where the University education plays a role. They want to mould students to become scientists, researchers, and professors. A good portion of the science and research material requires strong mathematical backgrounds and im my experience doesn't require the ability to be a super elite programmer. Hell, lots of great ideas are proven and tested with MATLAB scripts. This also applies to the concepts such as runtime analysis and algorithm complexity that are core to developing and proving new approaches and systems. I applaud Khan for it's attempt, but unless there is a heavy math focus later in the curriculum, then they should advertise it as a programming class, not a CS class.
Ruby or Python.
There is still no finer introduction to computer science than Structure and Interpretation of Computer Programs by Abelson and Sussman. Also, be sure to watch the videos.
Computer science is about processes and structures, not computers, and not programs. LISP is still the ideal vehicle for learning about the important parts.
On a personal note, a friend of mine had a CS 101 intro course some years ago that was Javascript based. It was absolutely terrible. I know that it was terrible, because I ended up re-teaching him each of the concepts using random old textbooks that I had lying around. He had no problem learning concepts in other languages (Fortran, BASIC, C, even some MIX when I used Knuth) and then applying them to back to the Javascript that he had to do the problems in.
I know that Javascript wasn't entirely to blame there, but it sure didn't help. But why try to polish that particular turd?
See that "Preview" button?
I'd definitely recommend C as a starting point for anybody serious about learning how to program. You can do high level stuff (pointers, functions). low level (bit manipulation) and everything in between. Also C is the starting point for so many other languages. The knowledge picked up could be extended to Java, C++, C# pretty quickly. If C is considered too cumbersome, Python would be an excellent choice. The clean coding style required definitely builds good habits. But, God Forbid, don't start with Javascript !
Assembly language
Actually, I have, in fact, taught students Assembly language as their first language.
It was a bit of a fluke of scheduling as they were first year engineers and had to cover C++, MATLAB and microcontrollers (i.e. assembler) in the first year. Due to the number of students and sizes of the labs, some of them happened to get assembler first.
It's actually not a bad way to start It depends very much on the student.
Some of them click with high level languages and can get going straight away. Some of them seem unable to grasp how the magic incantations on the screen correspond to anything tangible. Those ones tend to click with assembler much more, since it is much more direct. There's nothing hidden, nothing magic. Each instruction corresponds to flipping some gates in a predictable manner.
here's no awkward things like variables. Nothing like reference semantics which are really quite hard to grasp without understanding pointers. Instructions just move a fixed number of bits from one slot to another. In the case of something like a small PIC, the manual is thick, and but very complete and a person can have a grasp of the entire system (peripherals aside) in one go. And the apparently strange design decisions always have a good, solid reason behind them (always cost).
Once they have a grasp of ASM, you can explain the basic concepts of C by pointing out how you would translate a for-loop into a bunch of compares and jumps. For certain ways of thinking it then becomes much more obvious.
In other words, don't knock assembler as a first language. It's not for everyone, but then neither are high level languages.
SJW n. One who posts facts.
This really doesn't sound like "computer science" when you read the description. Where are algorithms, data structures, computability, complexity theory, etc? Programming != computer science. Even if they really meant that they were teaching programming, teaching a fad language used at an application level (not same as high level language) is not really the best way to teach programming. And what does "drawing", "animation", and "user interaction" have to do with programming or computer science?
Way to go Khan to dumb down computing even more than it already is.
My objection to semantic whitespace is that it frequently gets trashed when doing copy/paste type operations to and from other sources.
Its also more fragile when doing code maintenance, refactoring, editting, etc.
You NEED to teach assembler at some point or you end up with graduates who are unable to understand the basic computing model. That doesn't mean they ever need to use it in a job but if they don't know it they will be impaired and possibly end up like the useless sorts of programmers who don't think efficiency is important or that you can solve it by getting faster computers.
In a field that is essentially less than 75 years old it seems specious to call a language that has been around and in heavy use for nearly 20 years a fad.
moreover, as part of web 2.0 is seems to have kicked Silverlight and Flash's collective asses
and it's extensions into JSON seem to ensure that it will be around for another 20 years
Maybe javascript != computer science, but it is certainly a programming language that is widely used and probably an easier introduction thatn perl/php/c/java
getting a computer to do anything at all is major step for a beginner -why do you think logo with its drawing is such an attractive tool to teach kids?
-I'm just sayin'
Let me tell you where I'm coming from ... I hated JavaScript ... HATED IT ... for ten years, I endured it. A while back, I decided to finally wrap my head around it and actually study it the same way I studied languages like Java, C, and Objective C. Once I dropped the notion that it wasn't a class based language and that I needed to think differently in order to use it, I found it remarkably freeing.
In fact, I grew so accustomed to it that I actually find class based languages constricting.
Yes, it does have some dangerous gotchas, so the trick is to avoid those areas of the language, and then use static analyzer like JSLint for backup. It also helps to "use strict" on all your scripts
The true irony is once I've come to enjoy the old dog, I've decided to move out of development. Maybe next lifetime :)
This is the 2nd mention of the Khan "Academy" in the last week or so.
I want to delete my account but Slashdot doesn't allow it.
In principle, yes. In practice, it's a heck of a lot harder to properly document and verify the expected behavior of code if you have to write complex regular expressions just to get a complete list of all the different possible keys. I've fixed bugs in Perl code (which obeys that same design principle) where some subtle misbehavior was caused by a simple typo in the name of a key—an error that went undetected for months, yet would have been caught instantly in any programming language that requires you to actually define your classes.
It is one thing to understand what's happening at lower layers of abstraction. It is quite another to provide no abstraction whatsoever, requiring the programmer to do significant portions of the work that the compiler should be doing for you. There's no good reason to take on that unnecessary cognitive load if you can prevent it by simply choosing a language that's a little bit more rigorous. Granted, a language can be too rigorous, but JavaScript is so far on the other side of that line that you can't even see the line from there....
Check out my sci-fi/humor trilogy at PatriotsBooks.
the problem isn't that it helpfully adds semicolons where you forgot to add them. that would be great if it's all that it did. however, the problem is that it sometimes adds semicolons just when you don't want it to add them. what's worse is that it's impossible to know the difference between the two unless you're familiar with the language spec.
for example, like to word-wrap long lines in your code? be careful, javascript might just put a semicolon before your line break. in C all whitespace in code is equivalent, not so in javascript, sometimes.
Not disagreeing with your analysis of what JS does... But seriously, if you hard word wrap, you're a moron.