22 ms·
Python is now the most popular introductory language at top U.S. universities
- fithisux 12y agoa language without types, without extensive research? Then, why not C/D/Pascal. i strongly believe for universities sml/ocaml/haskell or even rust are far better choices. I prefer sml.
- aruss 12y agoPython's syntax is a breeze to get ahold of without any experience making it ideal for introducing people to CS and algorithmic thinking without overwhelming them with theory or syntax. Also, a lot of colleges (at least the best ones) offer functional programming in a second semester intro course (Berkeley does Scheme I believe). My own institution uses SML.
- brianchu 12y agoBerkeley's first intro CS course uses Python for 2/3 of the course, then uses Scheme. The final project is writing a limited Scheme interpreter in Python. To further clarify, Java is used in Berkeley's 2nd CS class (followed by C & MIPS in the 3rd intro class).
- sankethkatta 12y agoBerkeley's intro class was entirely in Scheme up until a few years back (2011) when they switched to Python. It switched when the course's professor (Brian Harvey) retired, he wrote a great post of his thoughts on Scheme vs Python http://www.cs.berkeley.edu/~bh/proglang.html http://www.cs.berkeley.edu/~bh/proglang.html
- baq 12y agorust? please. maybe 3 years from now, once it matures. python is good for teaching programming because it's easy to read - a feature that not a single language you mention can brag about.
- Igglyboo 12y agoIt's easy to read and it just makes more sense when someone only knows English. I could show this to my 80 year old grandmother and have her understand what it does with minimal help on my part. word_list = ["hat", "dog", "cat"] for word in word_list: print(word) The same example in Java isn't extremely hard to understand, but it definitely is a decent jump in complexity from the almost plain English syntax of Python. String[] word_list = {"hat", "dog", "cat"} for(int i=0; i < word_list.length; i++){ System.out.println(word_list[i]); } EDIT: Forgot about Java's foreach operator, but even so with java you then have to explain what String[] means and the keyword "in" makes for an easier read than (String string: strings) and System.out.println vs print String[] word_list = {"hat", "dog", "cat"} for(String word: wordlist){ System.out.println(word); }
- Dewie 12y agoTo be fair, couldn't you use java's foreach instead of the regular for-loop? It makes things a bit less noisy.
- valarauca1 12y agoString[] word_list = {"hat", "dog", "cat"}; for(String a: word_list) { System.out.println(a); } extra brackets but pretty identical
- mickle00 12y agoNameError: name 'string' is not defined. :) print(word) means it's even easier for grandma to understand!
- codygman 12y agomapM_ putStrLn ["hat", "dog", "cat"] I'd say the above is pretty simple if explained after: putStrLn "hello world" You don't really have to go into Monads for this to be understood/used. You can just leave it at "you use functions ending with an M if they do something like print out to the screen or get stuff from a web page".
- seanmcdirmid 12y agoIs your name Bob Harper? :) Functional still isn't that popular, in spite of a few vocal supporters. Even MIT went from scheme to Python for their sicp training.
- fjh 12y agoMany of the better European universities teach FP languages in their introductory courses. Off the top of my head, Oxford and Edinburgh use Haskell and Cambridge teaches Ocaml.
- pjmlp 12y agoFCT UNL in Portugal used to have Camllight, Prolog, logic programming and lambda calculus, when I did my degree in the mid 90's. Other Portuguese top level universities offered similar choices.
- seanmcdirmid 12y agoDoesn't Wadler teach at Edinburgh like Harper teaches at CMU? I'm sure many French schools are into OCaml also. European computer science has traditionally been more theoretical than American computer science, but even in Europe you'll find that a lot of 101 courses teach in Python.
- deleted 12y ago[deleted]
- lmm 12y agoCambridge teaches SML, not OCaml, unless it's changed in the last couple of years.
- deleted 12y ago[deleted]
- deleted 12y ago[deleted]
- tdicola 12y agoUnless your university is really weird, I can guarantee you will learn many more languages than just the intro language. When I got my computer engineering degree in the early 2000's I was exposed to C, C++, Java, Scheme & Lisp, SPARC & 68k assembly, and even a bit of Python. Learning Python as the intro language instead of C++ would have been much nicer for folks who were completely green to programming.
- beamatronic 12y agoI would hope that no one in a freshman CS program is "completely green to programming".
- aceofspades19 12y agoWell some introductory CS courses are taken by people in other majors. At my university, all science majors(as far as I know) have to take at least 1 introductory programming course. In that context, it makes sense to use python to introduce the concept of programming to people.
- Igglyboo 12y agoI assure you there are many that are. My first year at uni was filled with classmates that could barely operate a computer, there were many like myself that already had a good handle on programming and cs fundamentals but we weren't the dominant group. Most of the greens dropped out/switched majors after a year once they realized how hard it was. I hear from a lot of parents equating spending a ton of time on a computer with being tech savvy and a natural fit for computer science, this may be why most of them tried it out.
- bookface 12y agoSeriously? What do you think it means to be a freshman? I am getting seriously tired of this attitude in the software community that you're only a legitimate programmer if you've been doing it since you were in diapers.
- npizzolato 12y agoThat's ridiculous. What level of skill do you expect in an introductory program aimed at freshmen? Because that description sure seems like it should be tailored to someone completely green to programming to me.
- Yunk 12y agoSML is great, but based on the UW paradigms course, I'd say it gets a lot of backlash from students wanting something common in industry. Transitioning first classes from C to go would make great sense, but it looks like a lot of schools already replaced C with Java and C++ as first languages. Personally, I do think there is merit in teaching a primarily imperative language first, if only to appreciate other paradigms later and get an inkling of what is really going on beneath your code.
- brudgers 12y agoWhat I took from the Coursera version of the UW course was that SML gets out of the way and let Grossman cover the material at a higher level of abstraction than language syntax. On the other hand, his Programming Languages class is not intended to be introductory. I won't say anything about Python.
- Yunk 12y agoI also thought SML worked quite well at that level, but I think the initial negativity on the forums about an unknown language reflected what to expect from a larger portion of 101 students. > I won't say anything about Python. I will try to learn from your wisdom.
- brudgers 12y agoI was in the second iteration. There were still plenty of people calling for a pony and M&M's for breakfast. I can only imagine the first iteration. SML worked well because it's more or less dead. All the documentation is basically on a single unsexy website. There aren't a bunch of blogs cluttering up Google results or even much on StackOverflow. Racket also has a single Canonical source and good clear documentation and not much noise. I can't say the same about the Ruby ecosystem, where I saw this crazy construct in lieu of a call to super posted in a forum question. The TA asked how the person arrived at it. I knew the answer because I had landed at the same StackOverflow page from Google earlier in the week. Which is not to knock Ruby. I understand why people describe it as beautiful.
- Dewie 12y agoIt's the language for an introductory course, so it's purpose is more of a gateway language than as a be-all-end-all language. Rust would probably be too strict and annoying as a first language. Maybe the same is the case for Haskell, but maybe it isn't such a big deal for those that haven't been "spoiled" by imperative languages and thinking already.
- mimighost 12y agoPython is definitely more friendly than those you've mentioned. I think as introductory courses, the number one goal to achieve is to get students interested, rather than throw every possible details at them and intimidate them away.
- _delirium 12y agoI've seen Processing used in some intro courses for that reason, because the time-to-interesting-experimentation is fairly low (similar to the goal of Logo in the '80s, which was my own first language, although I think Logo was much better as a programming language). I don't think it's a common first language in intro-CS programs, but there are a number of curricula being built around Processing outside the context of CS majors.
- brudgers 12y agoProcessing is a good candidate because it allows a novice to make something interactive and interesting in very few lines of code. The downside is that they wind up typing things about which they understand nothing...e.g void setup {···}. And it's not like void will really make sense after two weeks. On the other hand, placing the mastery in the executing artifact, not the underlying code, might be a good thing.
- boomlinde 12y agoI think pyprocessing (https://code.google.com/p/pyprocessing/ https://code.google.com/p/pyprocessing/) makes an excellent middle ground here. It implements much of the Processing API in Python, without making an effort to hide the underlying principles of the language (like Processing seems to do for better and for worse).
- dragonwriter 12y ago> i strongly believe for universities sml/ocaml/haskell or even rust are far better choices. Rust is a horrible choice now, because it hasn't stabilized. When it has stabilized, it may be a suitable choice (at one point, it looked like it would be too large of a language to a be a great intro language, but since then its been getting smaller, so I'm less convinced that it will remain unsuitable for that role.) Python's a pretty good intro language; as is Scheme, and Haskell might be, though I haven't seen any good intro-to-programming material built around it, and while I think a good intro should prefer a largely-functional style (as the best Python and Scheme-based courses I've seen have), I'm not convinced that a pure FP language is ideal for an intro to the field (though it certainly a good thing to learn in the course of an education in the field.)
- quasque 12y agoThe computing courses at my university use Haskell in the introductory programming course - apparently it works rather well as a vehicle for exploring algorithms and data structures. The students move on to Java, C++, Perl, Prolog and others after that; not sure about Python.
- danieldk 12y agoThe computing courses at my university use Haskell in the introductory programming course - apparently it works rather well as a vehicle for exploring algorithms and data structures. I think a strict language in the ML family would even be nicer, because students wouldn't have to reason about laziness.
- ufo 12y agoRust killer feature is the interaction between the type system and memory management. I don't think this is the sort of thing you want to worry about in an troductory class...
- fithisux 12y agoI made a mistake to suggest it. But the purpose here is to learn something in parallel. Pattern matching/ Types or even lambda calculus are good to introduce with the language. Python is good if you have an algorithms/data structures course, students are not required to optimize for a hardware, only algorithmically.
- freyrs3 12y agoIndeed, the discipline of computer science is really the study of computation and the ideas we want to convey from a first language are things like abstraction, recursion, proof by induction, equational reasoning, sequential/parallel time-complexity. It's much easier to address these foundational concepts in a functional setting (Scheme, SML, etc) and then once undergrads know how to formally reason and do proofs about their programs introduce other languages.
- phkahler 12y ago>> the ideas we want to convey from a first language are things like abstraction, recursion, proof by induction, equational reasoning, sequential/parallel time-complexity. Really? I thought good old imperative programming was the best starting point. Concepts like assignment, branching, looping. IMHO goto is actually useful at that point and structured programming is an abstraction that takes a little while to wrap your head around. Perhaps it's due to the way I learned that I think some things are more basic (no pun intended). Either way I don't think high level abstract concepts like functional programming are even relevant in the real world of software development - abstract stuff is CS, basic stuff is for everyone else who has to take a programming course.
- lmm 12y agoI'd say just the opposite. Variables are hard, in a way that you don't even notice as an experienced programmer, but when we write x = 1 x = 2 that's immediately very confusing for a beginner - are we saying that 1=2? If we stick to immutable values and recursion, and functions that are, well, functions, we get something that corresponds quite closely to first-year mathematics, which makes it easy to learn at the same time.
- dragonwriter 12y agoMost Python material that I've seen that is an intro course makes limited use of changing variable [1] values , being written in a mostly-functional style (generally, preferring, at least initially, recursion to iteration to achieve that -- even though recursion is generally the wrong approach in production Python code.) Using a modern imperative language doesn't prevent you from adding complexity a bit at a time, and -- especially initially -- getting the advantages of teaching things in a functional style. [1] but not object fields, as objects are taught as containers of mutable state, usually late in the course.
- ufo 12y ago1. C, D and Pascal dont have garbage collection. 2. An argument can be made for starting with dynamically typed languages before moving to static typing.
- eru 12y ago> 2. An argument can be made for starting with dynamically typed languages before moving to static typing. As much as I like static typing, I agree that showing people run-time errors seems to do a better job of teaching than letting them know ahead of time via the compiler that their code will likely blow up.
- corford 12y agoActually, D has garbage collection.
- baddox 12y agoPython has types, and I don't know what you mean by "without extensive research."
- Goladus 12y agoPython has types. Python 2.7.1 (r271:86832, Apr 22 2011, 16:34:07) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> type(5) <type 'int'> >>> type('hello world') <type 'str'> >>> type({'key': 'value'}) <type 'dict'> >>> 5 + 'hello world' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' It just has dynamic typing.
- krisdol 12y agoAt my university, Python was primarily introduced when teaching certain concepts: scripting & untyped programming, web application development, and deeper diving into list comprehension functions. It was not the first language taught in CS, but many were exposed to it. That said, it was the first language taught in non-CS/non-major courses, and I imagine several other non-CS/Engineering majors were introduced to the language later in their academic career.
- drakaal 12y agoWhile I love python, I feel like Java has more application for beginners. While I am a backend guy, Java is better right now for split front end backend sorts as you can build a client Nd server for an Android app in Java. This lets you learn front and backend without having to know two languages. I say this knowing I hate a lot about Java, but thinking about how I would teach concepts and techniques while making a student employable and fostering the ability to experiment on their own.
- mikelat 12y agoI think the idea that the simplicity, lax compiler and readability of python will serve as a easier introduction to programming and keep more students from dropping out early. Java certainly has its place in enforcing verbosity, OO, coding standards, etc. I think the mission here is to ease people into coding so if they don't want to progress any further up maybe they'll just manage a companies small PHP website or something and have the knowledge to do that.
- Igglyboo 12y agoI think Python is the perfect first language for beginners. Yea we all know it's not fast or low level or the best language to teach about types or advanced CS topics etc. But it is extremely readable and easy to understand, it makes coding fun and once the students are engaged and know the basics it is much easier to teach more advanced concepts like typing and memory allocation.
- Alupis 12y agoCouple of thoughts: 1) I hope they are teaching Python 3.x instead of 2.7.x. 2) A good portion of the schools cited in the Appendix are not "computer" schools. UC Davis for example, is the last place I would attend for a CS degree (I know many students at UC Davis -- it's much better suited for other degrees). 3) My school (CSU Sacramento) does not even offer any Python courses, but there's a lot of Java and C courses (depending on your major concentration).
- christopheraden 12y agoUC Davis student here. To be fair, ECS10 is not a class that CS majors usually take--it's primarily an elective, and taken by non-majors as a way of satisfying science and engineering general elective credit. The CS majors start with ECS30, which uses C; ECS10 isn't even a required class for the Computer Science programs. As for whether or not they are computer schools, that criterion was determined through USN&WR, as mentioned in the article, which is where your criticism of not being a computer school should lie. Davis is listed at #34 though, so there may be a sharp decline after the first 10, first 15, etc...
- Alupis 12y agoVery interesting (CSU Sacramento student here). Our CS Major's start with CSC10 (or is it 15?) which is C, then CSC20 which is Java, then CSC35 which is Assembler (GAS/Linux). From there, it depends on your focus, but a large amount of classes favor Java, and a few C/C++.
- maxerickson 12y ago
- jrosenbluth 12y agoCIS 120 at UPenn uses OCaml for the first half of the semester and Java for the second half.
- ykl 12y agoOnce upon a time CIS120 used Java for the first 3/4 and Python for the last 1/4. Get off of my lawn kids.
- pvnick 12y agoOne of the classes offered in my major (biochemistry) is "Python Programming for Biology" which is generally the first exposure that most of my peers get to programming, and I tell anyone who will listen how important that class is. Especially in the sciences, Python has a plethora of scientific libraries and great resources to do just about anything that a non-career coder would need. Except in computational chemistry everyone's stuck with ancient libraries, and I recently met an anarcho-capitalist grad student doing all his research in Fortran. Cool guy.
- phkahler 12y agoWhat are the ancient libraries used by computational chemists? I hope to get some insight to the field based on the answer to this question ;-)
- pvnick 12y agoI'm afraid I don't have an answer for that, sorry! If you're truly interested I can ask the guy when I see him this week.
- selimthegrim 12y agoI work with computational chemists at the moment, major offenders are LAPACK and ATLAS in FORTRAN-90
- ylem 12y agoBut Fortran 90 is much more readable than 77 :-p The downside is that binding fortran 90 (95, 2003) to python is much more painful...
- marcosdumay 12y agoI got the impression that mostly everybody writes computational chemistry libraries in FORTRAN. The libraries are not older than in any other field. Some are quite modern, and have wrappers for several languages, but they are always in FORTRAN.
- deleted 12y ago[deleted]
- franparga95 12y agoHey there! I've just started learning to code for building web apps (I know about Fortran 90, it doesn't fit very well on the browser haha), and it took me a while to decide. I looked up in an endless number of hacker websites, but at the end I'm sorry for betraying Python lovers... I'm learning ruby on rails..! I've just started learning, please tell me If it's best to learn python (I'm not looking for an easy language, but for a powerful and versatile one :) Something to develop some ideas I have.. First post on HN!! :D From the center of Spain!
- advocaat23 12y agoWelcome to HN! Ruby is a good idea for webdev but keep in mind that Python is also dominant in other domains of computing in particular scripting and scientific computing. So in my opinion for a beginner Python is more future proof than Ruby [activate language-flamewar-prevention-daemon] and if you later add a system-language (e.g. C) and a modern general purpose language (e.g. Haskell or Scheme/LISP) to your repertoire you are in a very good position to tackle most kinds of software development problems.
- Stubb 12y ago> So in my opinion for a beginner Python is more future proof than Ruby Which is more future proof: Python v2 or Python v3? I figured that I was least likely to regret Ruby for a green-field data analysis project. So far it's been a delightful experience.
- BuckRogers 12y agoEither. They're not really that different from the other. I use 2, but I've used 3.. no issues. It will be an easy move as an enduser programmer when Python3's time in the sun arrives (and it may never).
- marcosdumay 12y agoThe differences are very small. Whatever you learn, you'll be at home in both.
- shire 12y agoPython for web development is confusing as a beginner. I would go with PHP since everything is not magic and you can see things right away.
- deleted 12y ago[deleted]
- aikah 12y ago> PHP since everything is not magic PHP is all about magic.That's why it is popular at first place. And its popularity is an accident we'll have to live with for decades,given the amount of PHP code deployed outthere. But if you are meant to be a CS student,you need a proper multipurpose language.You can do almost anything in python,from 3D games,to complex scientific computation. PHP is merely a templating language,with enough good syntax to be bearable for advanced programmers. PHP popularity is quite unfortunate if you ask me.Not because it is easy to start with or because it's a templating language.But because it could have been way better regardless of its execution model. It could have been cleaner and more elegant if its original author had a clue about how to design languages. most of PHP syntax is due to Rasmus inability to write a sophisticated parser.
- Igglyboo 12y agoThey're majoring in CS not Web Development. PHP doesn't really do anything other than web dev which makes it a poor fit for a general purpose CS curriculum.
- donatj 12y ago> PHP doesn't really do anything other than web dev This is such a complete misconception. Command line apps written in PHP are becoming increasingly popular, not to mention the fact that PHP runs everywhere.
- Igglyboo 12y agoSo does Java and C and Python to some extent. I don't know a single linux distro that ships without python.
- givan 12y agoIs sad that students never get to learn something like http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video-lectures/ http://ocw.mit.edu/courses/electrical-engineering-and-comput... they could easily learn any other language after, learning just java or python is practical only to prepare them for a corporate job.
- postnihilism 12y agoIt's not as though students won't dive deeper after their introductory CS course.
- Igglyboo 12y agoThe article only talks about introductory classes, most universities with decent CS programs will teach more than one language.
- advocaat23 12y agoGood news! I would like to add that another advantage of Python is its usage for scientific computing (Math, Physics, Biology, ...) so students hopefully choose Python to help solving problems for their math classes e.g. using numpy and co. They can then get easiliy into IPython which is IMHO a very important FOSS project. At my university I feel that proprietary scientific programs and CAS like Matlab, Maple and Mathematica are still the preferred problem solvers for students in the hard sciences (except CS).
- mrchucklepants 12y agoIn the engineering fields (I am an ME), I am seeing steady growth in the use of Python and declining use of Matlab. The trend does appear to be more prevalent among younger engineers.
- enrmarc 12y agoYes, Python is an excellent language for beginners, but so is Ruby in my opinion. Not trolling: why nobody is using Ruby in introductory courses?
- atiffany 12y agoWe learned Ruby in our 2nd year of CS at the University of Maryland.
- jqm 12y agoMaybe many of the people who take these intro course are not CS professionals. With the numpy and scipy modules there are a number of uses for Python for science/other majors that don't involve building web pages. This is my best guess as why Python VS Ruby.
- jiggy2011 12y agoRuby has become almost synonymous with rails, Python is used in more diverse areas.
- maxerickson 12y agoIt's probably some combination of happenstance and various numerical libraries making Python relatively popular in scientific computing before Ruby became well known in the U.S.
- rectangletangle 12y agoMany people prefer the English-like syntax (including myself).
- agumonkey 12y agoCoursera proglang used ruby for the OOP paradigm. enjoyed it a lot. Python OOP really feels like a bag of bolts, both semantically and syntactically.
- ufo 12y agoBiggest reason is that Python has been around for longer (at least in terms of popularity in the west)
- spenrose 12y agoPython was heavily based on ABC, a language which targeted new programers and made syntax choices based on user testing: http://python-history.blogspot.ca/2009/02/early-language-design-and-development.html It says a lot about our understanding of our field that new languages generally do not formally test their syntaxes (and other "mental model" features) for usability.
- spdy 12y agoAnd this exactly what everyone needs in the beginning. Simple and clear syntax where you are able to produce results in a short amount of time to keep you interested. I just remembered some people i learned with who struggled along time to get behind the concept of pointers and how to use them when they thought us c/c++ as an intro language to programming.
- eru 12y agoC is not great but bearable as an intro language, mostly because K&R is a good textbook and the language is small. C++ would be absolutely horrible. Is anyone doing this?
- andrewflnr 12y agoYes. At Pasadena City College, at least, most CS classes are taught in C++. AFAIK the creation of even one Python class is still mired in political nonsense.
- pjmlp 12y agoYes, quite a few Portuguese universities.
- deleted 12y ago[deleted]
- brudgers 12y agoIf programming language selection for introductory university courses was based on pedagogical research on introductory computer science courses, I suspect Scheme would be nearly universal given its roots and nearly forty year track record. But that's not how languages have typically been selected for 15 years or so. The direct vocational skills argument has held much more sway.
- pessimizer 12y agoIIRC wasn't that the entire motivation behind the creation of Python?
- kriro 12y agoAll imo... Python as the "101" language is a pretty good idea for universities in general because many fields do data crunching of sorts and Python is fairly widespread in the scientific community. As long as signup to the class is open for all (and not just CS-students) there will be healthy benefits for other departments (economics, biology etc.) Aside from that I've always kind of defended high level languages as entry level teaching tools. The closer to pseudocode/natural language the better. Once you start to think about solving problems like a programmer you can switch languages relatively painless anyway. With the advent of RubyMotion etc. I'm starting to wonder if there would be some value in starting to teach programming on mobile platforms in a high level language as 101 (i.e. the first ever code they write is mobile code). From my experience the "app classes" are always popular because there's a certain cool factor in being able to show a friend stuff you did on your own mobile device. If you'd tailor those classes to low-level phones it would be pretty helpful for certain areas of the world where many families have at least one cell phone but often no computer. Writing the code on the cellphone itself is pretty painful but at least one could write it at a university/school with a computer and carry the stuff that was built home.
- micahasmith 12y agoIn college our intro classes were in C++. While its a tough language I do wonder if it was advantageous to forcefully learn about 1) value vs reference types via pointers and 2) how allocation maps into memory space. Not having that level of depth kinda worries me
- nmrm 12y agoSure, but a systems-oriented course is the right place to pound that into people. Not CS1. CS1 should be an introduction to the nature of the discipline. I can think of many things more important and more representative of the nature of computing than the semantics of C.
- npizzolato 12y agoThis is about an introductory language. No one is saying CS students shouldn't eventually learn those concepts, but why would you want to bog down an introductory course (with non-CS students, many of which probably haven't written Hello World before) on that material?
- ufo 12y agoC++ makes it harder to work with functions/lambdas and the memory management makes some easy things much harder (for example, list and string processing)
- ufo 12y agoC++ makes it harder to work with functions/lambdas and the memory management makes some easy things much harder (for example, list and string processing)
- zo1 12y agoFor 90+% of the problems out there, a business programmer doesn't need to know anything about memory#. Short of a few rules, I don't see why they can't ever go without learning about memory space, allocation, reference types, etc. They will make mistakes, sure. But they will get the work done, and that's pretty much what most businesses need. Eventually, as problems creep in, the messes created by lack of knowledge get resolved/cleaned up. Programming is incredibly easy and powerful, when made simple. The problem is that learning programming in C/C++ is anything but simple! And the only reason we'd think otherwise is because we already went through it, somehow. I've seen non-technical minded people learn programming with C/C++ as their first language. They get frustrated because they don't know why certain things work magically while similar things don't. So they end up learning to memorize what works and what doesn't, and copy-pasting what the book tells them. Eventually kludging together a working solution to a problem in the book. With no hint of understanding why. #Yes I pulled that statistic from thin air.
- blahedo 12y agoThis methodology is suspect, and the headline is extremely deceptive. Note that Guo has conflated CS0 (meaning: CS for non-majors) with CS1 (meaning: intro to CS major). He is upfront about this fact and he does it intentionally, but comments about "first officially-sanctioned exposure in college" and such make it sound like he's unaware that most CS majors do not ever take a CS0 course; and among instructors of CS, phrases like "introductory language" without further qualification is usually understood as referring to CS1. If we then look at the table of actual data to filter a little bit, the story changes. There are certainly some schools, big ones, that use Python in CS1. But a lot of the Python representation is coming from CS0 at schools where CS1 is taught using Java. (I can also clarify one of his other comments: he says of the AP exam using Java that "it's unclear whether that will change anytime soon." This is untrue. It will not change in the next 3-4 years at the very minimum---and that would be the time frame if the College Board said right now today that a change was happening. In fact, though, although the idea's been mentioned, there has been no study or apparent motion on that front, so a more realistic earliest-date-of-change would be around 2019 or 2020. And I wouldn't count on it, given how many CS1 courses are still taught in Java.)
- cyorir 12y agoI think this is a good point. And in this respect I feel like the chosen data may have been cherry-picked or are somewhat incomplete. As an example, take Northwestern. At Northwestern there are several intro routes you could take, depending on your major. CS Majors are not required to learn Python - it is used in some 300-level classes but not in very many 200-level classes (although that may change in the coming years). I've actually taken classes with projects using Python without ever taking classes teaching Python. CS majors will likely take C, C++, Java, MATLAB, or a variant on scheme for their first language, depending on which sequence they take, whether or not they are double-majors, or course scheduling. In contrast, non-CS majors may learn C++, Python, MATLAB, or a variant of scheme as a first programming course, depending on why they are learning a programming language. So while schools like Northwestern may offer introductory courses in Python, I think the truth is more something along the lines of "students may learn Python, or they may learn any of a number of different languages as their first language, depending on what their academic goals/requirements are."
- arihant 12y agoCMU transitioned from Java to Python when I was an upperclassman there. I'm not sure what other similar places do, but CMU splits introductory courses into 2 parts - 110, 112. 110 is the basic programming with gradual intro to OOP and stuff. 112 is where the datastructures come in - it's a programming primer to implementing datastructures and algorithms, so to speak. Here is the issue I feel goes unnoticed as most people place out of 110 and never take it - CMU moved both courses to Python. While this helped 110 in a way by making it more accessible, it also resulted in people getting out of 110 with far less OOP principles than they did before. On the other hand, python works great in 112 because you spend more time building datastructures rather than running into the wall with Java OOP layers over and over. It's also cleaner so how a datastructure works becomes more transparent. But since the curriculum assumes OOP mastery from that point on, with no software engineering course required - I always wonder if replacing Java from 110 (a course for people with no coding background) was a mistake. They put the transition to vote and Python won very clearly. But I always wished they continued 110 in Java (or shifted to Scheme, or anything that follows a stricter regime than python - so one gets comfortable with one way of abstracting problems, be it OOP or Functional) and taught 112 with Python. It probably isn't worth even discussing given how few CS majors take the course, but it always makes me wonder why we needed same language for both courses.
- z1mm32m4n 12y agoI think that's another thing to note: around two thirds or more of the CS freshman at CMU actually take 15-122 Principles of Imperative Computation, which is taught largely in C0 (a type safe subset of C), and then later they transition to full fledged C.
- klodolph 12y agoI think the intense focus on OOP is a problem, and it is symptomatic of teaching students Java as their first language. Just as if you learn BASIC first you love GOTO, if you learn Java first you love classes and think everything should be a class. What especially concerns me is that some people are interested in whether a program or language is object-oriented, and endeavor to make their programs more object-oriented. Object-oriented programming is a design aesthetic, perhaps one of the most nebulous design aesthetics, and it should not be considered a goal or a dogma but rather a source of inspiration for design. Java is a particularly bad example because Java's brand of OOP conflates encapsulation, data structures, and polymorphism. The languages we'll be seeing in the 2020s and beyond will probably be more sensible about these things. Look at the new languages with the most mind share these days (Go, Rust, Swift) if you want an idea of where the wind is blowing. The other problem is that the farther you get from being a freshman, the farther you get from understanding which concepts are necessary in an introductory curriculum. As a senior you might say that OOP must be taught to the freshmen because so many freshmen don't get it, as a junior developer you might want the program to teach the standard library, and as a senior developer you might want to teach people about testing. This is all wrong. The most important things to teach freshmen CS students are very simple. Control structures, data structures, references / pointers, and recursion. Never forget that while OOP is warm and fuzzy and makes you feel good, the number one priority of the intro CS courses is to get the freshmen to write programs that work correctly. Or, since OOP is a design aesthetic, it is only useful once design becomes important. Design is not important for small programs that freshmen write. Let them get off the ground with correct programs, and teach them paradigms once they have enough context to understand them.
- goliathdrakken 12y agoEvery intro to CS course I've ever been in has been in C++, it has always saddened me to see Java being the intro level course today. Now to see Python at the top of the chart makes my head want to explode.
- jiggy2011 12y agoI'd rather it by Python than Java to be honest. In the same time it takes to teach Java you can probably teach Python and C.
- eru 12y agoJust don't try teaching C++.
- deleted 12y ago[deleted]
- mattlutze 12y agoI learned C++ first, then Java, then more recently Python. I really feel like I'd have rather had Python or Java first instead, if only because being concerned about all of the strict formatting and structure in a C++ program puts a level of unnecessary complexity in front of the goal: to introduce a person to programming logic and solving problems with programs. Those complexities are certainly important, mind you. But not as important as clearly opening the mind to the way a programmer thinks, IMO.
- lettergram 12y agoHonestly, I'm not surprised, but I believe this is bad news. Learning C programming (first) was probably the most advantageous thing that has ever happened in my life of programming. When you understand C you understand how the computer functions, and in turn can write better software. It prepared me for virtually all programming and has enabled me to understand concepts correctly, the first time, and has made my life significantly easier.
- simonw 12y agoI think C makes a great second language. Use Python to teach if statements, variables, control structures etc - then later use C to teach low-level algorithms, pointers and how computers actually work. I don't think there's any harm in learning Python first. I think they may be harm in learning C first - it's much more likely to frustrate people and potentially even put them off programming. This is the same reason I dislike Java as a teaching language: having to tell people "don't worry about what public static void main(String[] args) means just yet" when teaching "hello world" isn't a great introduction to programming.
- commandar 12y ago>This is the same reason I dislike Java as a teaching language: having to tell people "don't worry about what public static void main(String[] args) means just yet" when teaching "hello world" isn't a great introduction to programming. This is exactly why I have always thought that the move to Java for intro courses was a terrible idea. C/C++ were never ideal for beginners, but it was still possible to strip it down to building blocks without immediately resorting "don't worry about this now."
- candeira 12y agoI work at Monash University in Melbourne, Australia. Last year we moved our foundational course in data structures and algorithms from Java to Python, with great success. This is a course that used to be taught in C, then moved to Java. I tutored it as a Java course, and was in charge of adapting the tutorial (classroom exercises) and laboratory (programming assignments) materials when we started using Python to teach the unit. The main content of the course hasn't changed. Complexity, Big O notation, sorting and searching are introduced in the first two or three weeks. Students work through the usual implementations of arrays, linked lists, stacks and queues (both array and linked-list based), trees, heaps, tries, etc. All these data structures are explained first as chunks of data with external functions for the operations; then a second time as objects with methods for operations, once object orientation is introduced in week 5 or 6. Iterators are introduced as an abstract interface to list-, array- and tree- walking. Where relevant, we explain every operation twice, showing the iterative and recursive approaches. The course ends with two weeks of lower level work, where the students hand-compile pseudo-Python to working MIPS assembly. The move to Python gained us, among other things, the freedom not to have to explain Java's generics and access modifiers. Many of our students have never programmed with a text editor before our unit, and dropping them into the big boilerplate world of Java micro-management was not good for them or for the course. We used to spend too much time on syntax and other details ("native types are like this, reference types are like htat") that we should have been spending on data structures and algorithms. With Python, we even have time to explain idiomatic Python iterators and generators, and to discuss Python scoping rules (which come up again when we work on local variables in their hand-compilation tasks). So we still teach a bit of language-specifics, but we don't feel we are shackled to have to teach them. Also, teaching them idiomatic Python is a good deed after spending the first three or four weeks in a not very idiomatic subset of Python where we maintain explicit indices, update them by incrementing or decrementing them manually, use while loops the condition checking on the index value, etc. as required by the course content. I don't have data on the results, because I was only the adjunct adapting the tutorial materials. The only difference I noticed was that students had less support from their IDE, and that some common errors (attempting to access attributes on None is the top one) that used to be picked up statically are now runtime errors, as expected. There didn't seem to be any big problems from Python's lack of lexical typing. Type errors are still caught, again by the runtime instead of the IDE and, if anything, this is a better exercise for students, since fixing them requires better understanding of what the program is doing. If anyone is interested, I can ask the lecturer about the outcomes, but just from the fact that neither she nor anybody else teaching the unit has raised any issues the second and third times the unit was taught I can tell it's all going smoothly.
- bphogan 12y agoHelp me out. I love the idea of Python as a first language. But do you think there's an issue teaching a whitespace-sensitive language as a first language? When students eventually move to Java/JavaScript/C#/Swift/whatever, will this be more difficult?
- dragonwriter 12y ago> But do you think there's an issue teaching a whitespace-sensitive language as a first language? No. Most languages are whitespace sensitive, though what whitespace differences matter varies from language to language. > When students eventually move to Java/JavaScript/C#/Swift/whatever, will this be more difficult? I doubt it. If anything, the indentation discipline they've learned will make their code in those languages more readable.
- recursive 12y agoIf you indent your code consistently, you'd never notice that python had syntactically significant whitespace. So the only reason it would ever cause you a problem was if your indentation was wrong. In many languages, programmers specify blocks using both braces and indentation. Python merely loses the redundancy.
- icambron 12y agoI've always been of two minds about this. My intro course at MIT was in Scheme, a class that has since been renamed and is now taught using Python. On the one hand, it was a great course, and the FP was an awesome mindfuck (previous programming experience: TI BASIC). Though I took it all for granted at the time, it definitely set me up to think about programming better for years, and I still reread the book sometimes. The downside was that for a little bit, I couldn't really program in anything really practical, because by 2001 Scheme kinda wasn't. In other courses, I found myself crunching data with Perl that I only sort of understood, or writing C programs in situations where C probably wasn't the ideal tool, because it was the only other language I really knew. The thing where people say "once you know all the theory, you can learn a language in a couple days" isn't really true, and anyway, you probably don't have that couple of days. Point to Python. So the question is really: can you use Python to get most of the benefit of teaching using Scheme while at the same time giving the student a practical tool for future use? I haven't taken the new Python courses, so I don't know how well the material bends to the language, but I remain skeptical of the "most of the benefit" part. Maybe I'm just a curmudgeon, but I sort of think they should keep Scheme and then just have a short (e.g. over IAP) course on practical programming techniques using Python (or whatever). Or maybe someone should rewrite SICP in Clojure? Finally, I know Scheme has continued to evolve, and I wonder if it's really still true that Racket is impractical as a day-to-day language.
- rayalez 12y agoI'm not sure that this is what you're looking for, but just so you know - there's a lisp written on top of python: http://hylang.org http://hylang.org It's relatively new, but I'm really excited about it, and that is what I'm learning, it allows you to get the benefits of learning lisp and python at the same time. It's compatible with python in both directions, so you can use it in any practical project - with django or with machine learning libraries, etc. I think it's really cool =)
- icambron 12y agoThat does seem like a nice option, and sort of what I was going for with my Clojure suggestion. And I suspect that mostly any Lisp will do for SICP's purposes.
- benatkin 12y agoThat id. 8001337
- ps4fanboy 12y agoUniversities will do anything to lower the bar and increase tuition
- xarien 12y agoThis is completely misleading. Just because a course is offered at a 100 level, doesn't mean it's an introductory course. These numbers don't mean a thing... (in case people cared, yes I did go to one of these schools and at least state for that given school, this data is complete bs)
- pgbovine 12y agoplease send me mail with a correction request. thanks
- pgbovine 12y agoAuthor here: Please email course correction requests to philip@pgbovine.net ... I'll probably miss a few important corrections amidst the hundreds of comments. As a clarification, a CS0 or CS1 course usually has no CS prerequisites, so if a course you're trying to mention has other CS prereqs, then it's probably not CS0 or CS1. ha, feel free to DOWNVOTE so that this appears at the very bottom, so that it's visible :) but don't downvote so much that it disappears.
- pgbovine 12y agowow y'all are really bad at downvoting this comment; it's still hidden in the middle :) why does it have 4 points?!?
- theandrewbailey 12y agoThis community appreciates creators coming, sharing, explaining, and answering questions about their work.
- chatmasta 12y agoYale teaches CPSC 112 (CS non majors) in Java. Or at least, they used to. I think I heard this term they switched to Python. I would say that was a wholly good move. The only downside is that CS majors who take 112, and might prefer to learn Java in a class but Python on their own, do not get exposed to Java in any part of the curriculum. The "introduction to CS" course, CPSC 201, is taught in MIT Scheme. It's interesting because for CS majors, the first class is functional programming. A sizeable minority (including myself) skip that class though, since it's only offered in the fall. I chose to skip it because I started the major late, already had programming experience, and Scheme isn't actually used outside of education. From what I gather, I missed out on some valuable lessons in simulating circuits and binary logic. My knowledge there is still weak. After that course, the rest of the core curriculum is taught in C. Scripting languages like Python/Perl/Ruby, you are encouraged to learn on your own, and will often help in assignments. But they aren't explicitly taught as the focus of any course. I absolutely hated some of my programming assignments in C, but I think learning systems programming in such a low level language is timelessly valuable and makes picking up new, higher level languages significantly easier, since you already know the tradeoffs of the underlying data structures and algorithms. For example, if I had not been exposed to pointers, I would not understand the difference in Python between "is" and "==" when comparing strings. In general I think learning c is a valuable albeit masochistic move.
- ommunist 12y agoSo Python is the new BASIC. Being widely introduced in the universities, could be the mark of ageing and obsoleteness. Since the university is normally teaching something very irrelevant to the real life, shouldn't the student look around for that emerging tech that will bring him a job in 5 years from now?
- rubycodesearch 12y agoJustin Bieber is very popular too.
- anuraj 12y agoHaving a structured, type safe language as base works well for Computer Science. Scripting language may be tried for other courses though.
- etrain 12y agoA few points that will likely get lost in the noise here: 1. It is weird to take the top graduate schools and ask about what they teach to undergrads. I'd rather see this done with the best national universities list - http://colleges.usnews.rankingsandreviews.com/best-colleges/rankings/national-universities http://colleges.usnews.rankingsandreviews.com/best-colleges/... - as the basis for this study since that's where the top undergraduate students will end up. 2. I'd rather see trends than raw numbers - the fact that python has grown quickly over the last decade in terms of adoption is more interesting than it being "the top," to me. 3. It is sad that Java still has such a stronghold both in terms of being the intro language and being on the College Board curriculum. It is not the right language for beginners, or, really, anyone. 4. While I didn't take "CS1" in college (thanks AP exam) - I did take CS2 or whatever, and it was taught in scheme with SICP. Scheme was the great equalizer in that it was unlike any language anyone in the class had ever seen and that syntax no longer mattered - only concepts did. I hope it continues to keep its place in second-level courses. 5. It is unfortunate that garbage collected languages are extremely highly represented on this list - memory management may be unpleasant, but acknowledging that we are programming on limited-resource devices should be acknowledged early and often. Forcing students to experience this first hand seems that it serves both the purpose of teaching them abstraction (isn't this garbage collector great!) while maintaining a respect for the fact that resources (cpu, memory, power, network, disk, etc.) aren't free.
- aruss 12y agoIt would also be useful to include liberal arts colleges. I don't think it's representative of top institutions if you only consider research universities. For example, Harvey Mudd, has a top notch CS program, but wouldn't be considered under that metric as it doesn't have any grad programs. I'd be interested to figure out the whole intro sequence. For example, my college begins with Java for the first class, then the next two classes can be taken concurrently, which respectively consist of functional programming/basic CS theory in SML, and Data Structures/Advanced Programming (memory management!) in Java and C++. I'm sure a number of other colleges follow similar procedures. Also - I don't think that "CS0" classes should be included on this list as most are not taught with the intention of further CS education. For example, we have an "intro" CS course that is taught within the context of cognitive science (in Python).
- area51org 12y agoI know, I know, what I'm about to say is just an artifact of the Language Wars and will cost me karma. I can't help myself. We should not be teaching impressionable students that whitespace has semantic significance. This is a fundamental design flaw of Python, and it's just a Bad Idea. Sorry, Guido.
- chillingeffect 12y agoIagree100%.Therereallyisnoreasontoattributetheattributeofseman ticallysignificanttowhitepsace.Justasineverydaylanguage,comput erprogrammersshouldhavethefreedomtonotusewhitespaceastheyseefi t,justasmusicshouldnothaverests;it'sonlythenotesthathavemeanin g.Finally,gentlepeople,Iimploreyouthatwallsinhousesshouldbemad einfinitesimallythin,too,becauseIseenoneedtoseparateanything.
- Doctor_Fegg 12y agoPlease don't break everyone's formatting by writing something quite so long that won't wrap. Thanks.
- McP 12y agoCan someone delete this comment please? I'd like to read the other comments here but this one means I've got to scroll back and forth for each line :(
- NinjaViking 12y agoFor a temporary solution, try right-clicking on it, select "inspect element" or something to that effect and deleting the text.
- Rynant 12y agoI use a bookmarklet that comes in handy in cases like this: javascript:(function()%7Bfunction callback()%7B(function(%24)%7Bvar jQuery%3D%24%3B%3B%24('*').on("contextmenu"%2C function(evt) %7Bevt.preventDefault()%3B%7D)%3B%24('*').mousedown(function(evt)%7Bif(evt.which%3D%3D%3D3)%7Bevt.srcElement.remove()%3B%7D%7D)%7D)(jQuery.noConflict(true))%7Dvar s%3Ddocument.createElement("script")%3Bs.src%3D"https%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.7.1%2Fjquery.min.js"%3Bif(s.addEventListener)%7Bs.addEventListener("load"%2Ccallback%2Cfalse)%7Delse if(s.readyState)%7Bs.onreadystatechange%3Dcallback%7Ddocument.body.appendChild(s)%3B%7D)() After clicking the bookmarklet, you can right-click on any element to remove it.
- loser777 12y agoI'm an undergrad at one of the outlier schools (UCLA) where a combination of the quarter system and a relatively conservative CS department make for an interesting undergrad curriculum. Our "CS 1" is taught in C++ and is mostly dedicated to well, C++. The entire first course is essentially dedicated to teaching you how to not blow your leg off while managing memory. We don't even touch data structures, algorithms, composition, inheritance, etc until "CS 2," which is also in C++. When I first tried Python as part of a 1-week assignment in "CS 2.5" (a lab course), I was blown away and hooked pretty quickly. We don't get formal Python experience really until the extremely work-intensive upper division programming languages course. From my perspective, I think a large number of people are discouraged by CS 1 and how it's more of a programming class than a CS class. The only benefit of a C++ introduction is that it's easier for people to transition to C and lower level code for the operating systems class. Still, C is pretty well covered by our "CS 2.5" and "CS 3." Other fun facts: our CS 0 (programming for non-CS majors) is split into three classes and is also in C++! I accidentally took a C++ at a community college during high school and was forced to skip "CS 1" when I enrolled for my first quarter. I felt so unprepared for "CS 2" that I actually audited a good number of "CS 1" lectures and did half of the projects for the class even though I didn't take it. Actual course numbers: CS 1 -> CS 31 CS 2 -> CS 32 CS 2.5 -> CS 35L CS 3 -> CS 33 CS 0(a-c) -> PIC 10(a-c)
- krakensden 12y agoI went to Davis which also teaches C in the CS1/first course for concentrators, and C++ after. It was really hard, I really liked it, and I've always felt it's given me an advantage over people who have no idea how the lower layers of the stack work. I definitely saw it scare some people off though. So if your only criteria is "what is the passing rate", it probably does worse than python.
- arsalanb 12y agoWe had an intro to programming course at our college (NIT, Srinagar) which was based on C. Seemed perfectly alright, after some thought, because most of my batch mates had never programmed before (and there was a significant population who had no access to computers prior to college) Since I'd been programming since I was 11, it seemed a little arduous to sit thought classes explaining what a variable was, etc..but in the end, I understood they had to do what was best for the whole lot, and obviously couldn't teach something more advanced to an underprepared set of people.
- ausjke 12y agoI honestly foresaw this and advised my kids to learn Python, it's the new BASIC and the new JAVA-in-college. That does not mean Python is better than others, but it does fit a niche in the education system somehow. For EE major etc I would still recommend the plain C stuff though. For web-design etc Javascript might be a better course. Overall Python is a nice choice for the generic public.
- Kurtz79 12y agoIt's very interesting. My introductory course was in C, but on my last year they already had switched to Java. I think Python nowadays is really the better choice: although C has its own merits (and it should be taught at a later course, possibly together with embedded systems) , it introduces more complexity than necessary. Python, with its readability and "batteries included" is really the ideal language for an introductory course, not to mention that it has potential lifelong use as a "Swiss Knife" type of language.
- sagargv 12y agoWhile I agree that teaching Python to non-EECS majors is a great idea, it's sad to see the decline of C/Scheme in university courses. Much has been said on this topic. So, I'm just going to post two links that I think are interesting. Joel Spolskey claims that Java isn't hard enough to separate good programmers from the bad: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html http://www.joelonsoftware.com/articles/ThePerilsofJavaSchool... This article claims that competency of CS grads is going down: http://www.education.rec.ri.cmu.edu/roboticscurriculum/research/C-Programming%20vs.%20Java.pdf http://www.education.rec.ri.cmu.edu/roboticscurriculum/resea...
- david_b 12y agoOT: Since I don't have permissions for an Ask-type post I'll do this here. The lines in this thread break extremely 'late' (http://imgur.com/IzmwWBo http://imgur.com/IzmwWBo), causing me a lot of painful sideways scrolling - my screen only has a 1024x600 resolution, but all other threads I have open look normal (http://imgur.com/Q45ZDQ6 http://imgur.com/Q45ZDQ6). What causes this and how can I get rid of it (FF30 with NoScript and Disconnect)?
- ToastyMallows 12y agoSame here, Chrome 35, all extensions disabled. Oddly, if I open this page up Incognito (logged out), it works fine. Even more off topic, horizontal scrolling can be less of a pain if you just hold shift and scroll up and down.
- mangecoeur 12y agoBit of a reversal from that "Python is dieing" post a few weeks ago. But like i said then - just one person posting some anecdote about people switching away from python does not a trend make. While Python becoming a teaching language of choice among many universities does make a trend (to add to similar upwards trends in job postings, high TIOBE rankings, etc etc).
- dschiptsov 12y agoBecause classic Scheme (or Racket) courses based on SICP are too complicated by new-normal (punk) standards.) Show me a sane person who succeeded to grasp these few big ideas behind SICP after Berkeley CS61A or another similar Scheme or Racket course, who had any regret for spent time and effort?) btw, AIMA and PAIP are much better in CL than in Python.)
- niix 12y agoIt's not surprising to me that Python has become the most popular intro language at universities. For someone who went a school with a poor computer science program, Python was a saving grace and landed me my first job as a developer. Unfortunately the school I went to did not have any courses on Python so I took it up in my free time.
- cylentwolf 12y agoUC Irvine has a couple ICS intro classes. It was ICS 21 back in the day and it was C++ and then Java based. However it is now ICS 31 and it is python based.
- joereggan190 12y agohttp://freerice.com/content-group/watch-argentina-vs-netherlands-live-stream-online-freesat http://freerice.com/content-group/watch-argentina-vs-netherl...
- joereggan190 12y agohttp://freerice.com/content-group/watch-argentina-vs-netherlands-live-stream-online-freesat http://freerice.com/content-group/watch-argentina-vs-netherl...
- topkekz 12y agoit seems that cs61a (UCBerkeley) still uses Scheme at some point http://www-inst.eecs.berkeley.edu/~cs61a/su13/ http://www-inst.eecs.berkeley.edu/~cs61a/su13/ there is also cs61as which is entirely in scheme (but no lecture) https://edge.edx.org/courses/UCBerkeleyX/CS61AS/2014_Spring/about https://edge.edx.org/courses/UCBerkeleyX/CS61AS/2014_Spring/...