Ask HN: What programming languages are used in CS courses these days?
Core
---------------
Intro to Programming => C
Intro to Data Structures => C
Advanced Data Structures => Java
Compilers => C/Lex/Yacc or C++/Flex/Bison
Systems Software => SIC assembly language
Operating Systems => C
Database => SQL and also a "build you own DBMS" project in Java
Electives
---------------
Software Tools => Perl and Java
Neural Networks => C
Artificial Intelligence => LISP
As you can see, C was still mainstream but Java was on the rise. When I went to grad school around 2004, no surprise, Java had mostly replaced C in these same classes. You'll notice no Javascript, no Python, no cool Functional languages, etc. in this list. Just interested to see where things have evolved and especially to see if more "modern"/"cool"/"web oriented" languages have made it into the core courses yet or perhaps spawned new more relevant core course. Thanks for playing...
EDIT:
Hey folks, mind putting your year of graduation so we can pin the answers in time?
Also, since apparently no schools have moved very far past Java, care to speculate on how you might change the core curriculum if you could?
He did his undergrad in CS at UCLA '78-'82.
Intro to Programming => PL/1
Problem Solving using Computers => Algol 68
Operating Systems => MIX pseudo assembly
Data Structures => Mostly theory/test based
Programming Languages => COBOL, Fortran, APL, and ALGOL 68
Software Engineering => C
Simulations => GPSS (General Purpose Simulation System)
Graphics => GDDM (Graphical Data Display Manager)
Very cool how diverse the language selections were.
Also interesting to that C hadn't really caught on yet.
http://www.linkedin.com/groups/Algol68-2333923/about
Data Structures => Mostly java, a couple projects in C
Computer Organization: pretty sure this one was entirely in c.
Programming Languages => Whatever the most recent version of Ada is, python 2.7, prolog, haskell, c#, java, "language of your choice, suggested choices are ruby, python, or perl" and most people chose Ruby, and I believe that was the gamut. I may be forgetting a few, and I know that course has switched to using Ocaml instead of Haskell for the functional language section. The course is all about how languages are implemented and what makes one language different from another, so obviously it bounces around a lot. Super interesting class, one of my favourites.
Networks: Java or C; at least one project was mandated to be in C.
Software design: Ruby, and a tiny bit of Haskell
Operating Systems: C.
Human-Computer Interaction: Mostly javascript.
Almost all grad level courses (except for the intro programming), taken circa '12/'13
After that, professors used whatever they wanted. Most electives let students use whatever language they wanted so long as it ran on the department's Linux machines and you provided build instructions for the professor.
Scala became the intro language the year I graduated with C and C++ following for data structures. Other courses use everything from Scheme to Java to Haskell to Python, depending on the specific course the professor.
My undergrad thesis mentor actually wrote an intro CS textbook using Scala and from what I hear it's worked quite well.
http://www.programmingusingscala.net/
And we used Access for our database course. Sigh.
That said, it wasn't as monolingual as it sounds. Even though the courses were geared toward C++, several of our teachers were enthusiastic polyglots (actually one of them spoke four human languages!), and we were encouraged to explore.
1st year: Intro to programming in Prolog, and data structures in Prolog or C (student's choice).
2dn year: Everything in C, except for system level courses, in MIPS and x86 assembly.
3rd year: Mostly C and MIPS/x86 assembly, a very interesting discipline in programming paradigms teaching Lisp, Prolog, and Java.
4th year: From tis point on, the course starts to lose structure, my choice of disciplines used mostly C/C++, with specialized languages for compilers, and VLSI design. (Have you ever tried to do network programming in C? Strings are funny.)
5th year: About the same as 4th year.
In retrospect, the official list of languages teached in graduation is ridiculously small near the list of languages students were unofficially expected to know at its end.
- Programming I in C
- Programming II in C++
- Data Structures in C++
- Theory of PL rotated languages every semester and project had to be in a language you didn't know coming into the class. (C#, php, pl/sql)
- Software Engineering divided into groups, each group assigned a stack to implement (mine was LAMP)
- Databases pl/sql
- Compilers C/lex/yacc
- OS projects in C and assembly
- Parallel projects in C, python and mpi
- Python language class
- Scripting languages survey was always python and ruby, but rotated in something new or interesting each section.
- A COBOL section with old mainframe
- Assembly class was in MASM
No FP for undergrads. No one had to learn Java or C#, you were given the opportunity to be exposed to them through User Groups or electives, but directed classes in them were reserved for the Information Systems people over in the Business school.
--- edit: formatting
First year with C++ and C. The C++ usage was C-style code just used cout/cin/booleans.
Second year was C, Forth(had to write an interpreter) MIPS32, Java, and Objective-C(Elective in iPhone dev[pre-iOS days])
Third year: C, Java, Haskell, Prolog
Fourth Year: Matlab, C, whatever you want. Most 4th year courses are either fairly specific or you're free to use any language you want. Ex. the Computer Vision course uses Matlab, but the AI course you could use whatever language you wanted provided you supplied steps for running it that the marker could follow.
All these were undergrad courses. My graduate courses were mostly either theoretical or project work where we could choose our own language. The only exception was Maude [1], which we had to use.
[1]: http://maude.cs.uiuc.edu/
I can only speak for the classes I took
Intro to Programming => Scheme
Object Oriented Programming => Java
Assembly Programming => 68k assembly
Intro to Data Structure => Java or Scheme (depending on Prof.)
Operating System => Technically C, though I did some of it in Java
Compilers => Scheme
Programming Languages => Scheme
Distributed Programming => C and MPI
Web Programming => HTML, Javascript, Java, PHP, Apache & Perl
AI => Scheme
Software Engineering course => whatever was required or wanted, we chose Perl
IU-Bloomington at the time barely touched Java, preferring to do most of the teaching in Scheme or C. I would have prefered they had focused more on C (as I still can't program a C program without segfaults galore.) and less on Scheme, but that's how it goes.
The overall trend appears to move towards Python and even some functional languages like Haskell, but Java is still very common.
Core
Intro to Programming => Common Lisp (Now changed to Python)
Intro to Data Structures => C++ and Java
Intro to Object Oriented => Java
Embedded => C/C++ and 68k assembler (possibly some other architectures as well)
Operating Systems => C
Elective
Some of the subjects have been touched on in other subjects, like logic programming.
Compilers => C++/Flex/Bison
Advanced Data Structures => C++
SICP (course follows the book fairly closely, not sure what to call it) => Scheme
Database => SQL (probably python/Java)
Web programming => Python
Logic programming => Prolog
Design patterns => Java
Artifical Intelligence => LISP and Java
Parallel computing => C and C++
2007-2010 undergrad dates here.
I graduated with a degree in Computer Information Systems. CS was not offered at my school which was a relatively smaller university with focus on general business classes or accounting. Finance/accounting/economics/marketing/management were the more popular majors (25 graduated with my major)
The more development oriented classes were Intro to Java & Intermediate Java. We also had an intro to web development class that focused on HTML/javascript and another that used C++. There was also a DB class that used Access and the next level DB class used mysql.
Intro to Programming => Eiffel (Betrand Meyer was our Prof)
Algorithms and Datastructures => Java (Pseudocode in PASCAL)
Parallel Processing => Java
Design of Digital Circuits => Verilog/MIPS Assembly
and in the next courses there will be some Haskell and more Java.
C was used for 101, Systems programming, Operating Systems, and Networks. There was an elective HPC class which taught CUDA C. C++ was another elective class.
Java for 102, Algorithms/Data structures, software engineering, and oddly enough Compilers (along with ANTLR for the parser).
Programming Languages was Racket or ML depending on the teacher.
There were also elective HTML/CSS/Javascript/Ruby on Rails classes but I think they counted for 2 credits (instead of 4) and were only offered online during breaks.
We used MIPS and some other teaching assembly language that I forgot the name of for computer architecture.
Fortran -- Engineering classes
PL/1 -- Intro to Programming EE/CS
APL -- EE (network analysis, etc)
360 Assembler -- EE/CS systems course
PDP-8 Assembler -- EE/CS Project
PDP-9 Assembler -- EE/CS Project
Lisp -- EE/CS AI class and structure and theory of Programming languages
CLU -- EE/CS Research
Pascal -- grad school
I'm sure there were some others in there. I didn't really learn C until I started working on the Unix kernel after grad school.
Alice/Java => "101"-type class
C/Perl/Shell => Intro to Systems
C => rest of the systems branch
Java => Data Structures
Standard ML => functional and logic classes.
Many of the more esoteric electives used their own thing. For example, I used Serpent in Computer Music Systems.
The curriculum changed in my final year. The new students now do:
Python => "101"-type classes and basic data structures and algorithms
Standard ML => parallel data structures and algorithms and other functional and logic classes
C0 transitioning to C => Systems courses.
I do think our distributed systems class was experimenting with Go at some point.
Haskell Java Prolog C and C++ NASM assembly
Then depending on the optional modules you chose you might also do a couple of more specialized languages like Matlab.
There was also a mandatory course involving building a multiplayer networked game with total flexibility on language, but predominantly people did browser based games with one of PHP/Python/Perl/Ruby and JavaScript (although NodeJS wasn't around in 2008 when I did the project, but I'm sure people are using it now).
1998-2001 (Curtin, Western Australia)
Intro to Programming => Pascal (switched to Java in '99)
Intro to OS => C and an x86 assembly variant I don't remember much about
Comms => C
Database Systems => PL/SQL
Systems Programming => C++
Design and Analysis of Algorithms => C
Scientific Computing => C
AI => Lisp
Graphics & Visualisation => C
(Looking back over my transcript, I was a really terrible student :/ Just as well I had a pretty decent grasp of C before I went to uni really.)
There was a course on logic gates etc. where we learned MIPS assembly.
The database course used SQL.
A course on algorithms used Python so we learned that as well.
Then we had a course on languages. Half of it was devoted to Common Lisp, but it also touched on languages such as Java and Prolog.
Intro to Programming => Java
Intro to Scientific Programming => Python
Data Structures => Java
Computer Organization and Design => C & MIPS Assembly
Programming Language Concepts => Java, Prolog, Haskell, Python
Operating Systems => C
Bioinformatics Algorithms => Python
I would have loved to have been introduced to a Lisp somewhere in there. Had to stumble upon that one on my own, and it's my go to language family for side projects now.
We use Python for our introduction course (still 2.x due to a library incompatibility) and Java for the next level course.
After that, it's about 90% Java, with C++ for certain courses. Only exception I can think of is Databases, where we use MySQL and write programs to interface with it in mostly PHP (but also some Java at the end).
- C for an OS course
- ARM ASM for a CPU course
- creating some C# lite language for a compilers course.
- SML for a languages course
- SQL in a databases course
I was pushing to use python for the first programming language class since Java had too many magic words that confused people, but they didn't go for it anyway since internship employers still wanted java in the first years even.
Functional Programming: Haskell Imperative Programming: Scala Object Oriented Programming: Java Concurrent Programming: Scala Concurrency: CSPm Intro Algorithms: Haskell Compilers: OCaml Digital Systems: MIPS Assembler Networks: C Graphics: Java Databases: SQL, PHP (apparently...) Principles of Programming Languages: Haskell
---------------
Intro to Programming => C (GT) / C++ (UCR)
Intro to Data Structures => Java (GT) / C++ (UCR)
Advanced Data Structures => Java (GT) / C++ (UCR)
Compilers => C (GT) / C(++) (UCR)
Systems Software => ? / ?
Operating Systems => C (GT) / Java (UCR)
Database => ? (GT) / SQL (UCR)
---------------
Functional Programming: Haskell
Imperative: C
Object: java
Computational Logic: Prolog
Graphical Computation: c + opengl
OS: c
Concurrent: Erlang, java
Compilers: c+yacc+flex
Program Calculation: Haskell
I've notice very few places teach program calculation. It is an interesting trend and you can learn more about it here: http://www3.di.uminho.pt/~jno/ps/pdbc_fm.pdf
The hard part was the Advanced Algorithms and Data all in C where you can fuck up in the algo implementations AND also in the memory management of your algo implementation. A fuckup on a malloc/free could cost me the failure of an entire exam
However, there was a revamp in the curriculum in that the core courses are not being taught in C. It's not till they are in their Junior year that they now encounter Java or C++.
1st year:
Intro to programming: C (& bash to compile & run programs)
Intro to datastructures: C++
2nd year:
Digital Systems: 68k assembly
Design Project: PIC microcontroller assembly
3rd year:
Prog. Lang: Python, Scheme, Prolog
Databases: SQL
Comp. Org: Verilog, NIOS assembly
Operating Systems: some weird custom language for this one course
Control Systems: MATLAB
4th year:
Compilers: C
Compilers2: C++
Distributed Systems: Java
Computer Networking: Java
Computer Security: C (& learned to use gdb)
Also used bash & java to do my thesis
Those are the names that the school gave the courses it's basically CS1-4
Those are the current courses I took CS1-3 in java and CS4 in C++.
- Networking used Python with Mininet
- Software Development used Java with Eclipse (Android, Swing, JUnit, Google App Engine, GWT, etc.)
I finished my undergrad in 1995 and used C and assembly (RS6000, Spark, x86). C++ started to be an option when I left.
75% Java 25% C
With some smalltalk, SQL, and C++ sprinkled in for some of the more specialized classes
Asking a friend who graduated 2014:
60% C++ 40% Java
Some C#, Python, PHP for some of the specialized classes
Intro to Programming => Java
Intro to Data Structures => Java
Advanced Data Structures => Java
Compilers => OCaml
Systems Software => C
Database => MongoDB, PostgreSQL
Web => PHP
Logical Programming => Prolog
Functional Programming => OCaml
OOP => Java, then C++
Scripting => Python
Intro to Programming => Java/Racket
Software Design 1: C++
Software Design 2: C#
Intro to Data Structures => Java
Compilers => Racket
Systems Software => C/x86
Operating Systems => C/x86
Database => dunno
Electives
Programming languages: Racket Advanced OS: C
Intro to CS: Java
Data Structures: C++
Systems: C
Programming Languages and Compilers: OCaml
Numerical Methods: Python
Programming Studio: Java + Ruby/Python/Perl + PHP/Any web framework + Language of your choice
Intro: Java
Data structures/algorithms : java
Advanced data structures/algorithms: java
Programming languages: C/scala/javascript
web development: php/js/sql
databases: sql
logic: prolog
networking: C
Comp. Organisation: x86 asm
electives:
Operating systems : no code at all
embedded systems : C
digital systems : VHDL
Data Structure: C#
Patterns: C#
Web client: HTML/CSS and jQuery
Web server 1: Java
Web server 2: ASP.NET (WebForms)
Database 1 & 2: SQL Server 2005 & 2008
Project: ASP.NET MVC 4 + Entity Framework
- 1st semester: Haskell (functional)
- 2nd semester: C (imperative)
- 3rd semester: Prolog (logic)
- 4th semester: Java (OOP)
--- Year 1 ---
[few students in the entire school program at all] Offer multiple sections of an Intro to Python class. Focus on Python, because people can start to do meaningful projects in a relatively short period of time, while still learning meaningful fundamentals. Focus on intro classes, to build a broad base of overall programming competence in the school. Focus on games, visualizations, maybe delve into some robotics.
Also offer some web-focused classes, focusing on basic html and css, getting into Bootstrap and Wordpress as well.
Support other topics such as 3d modeling, graphic design, etc.
--- Year 2 ---
Offer an intermediate Python class for students who have taken the Intro class, and who have continued to build their own projects. Expand projects to include web apps, focusing on full frameworks such as Django and more modular frameworks such as Flask.
Start to offer other languages. C for students who want to understand how things work at a lower level. Go for students who want to work in a newer language? Maybe Java for students who want exposure to a statically-typed language, without dropping all the way to C?
Start to bring students to a conference or two, probably starting with PyCon. I took one student to PyCon last year, and it was a great experience for him, and continues to be a guiding experience in his life.
--- Year 3 ---
Offer an advanced Python class. Refine the C/ Go/ Java offerings. Focus on helping students build portfolios of finished projects.
Offer a class focused on databases? Support students in learning Rails? Maybe refine an independent learning class, where students who have learned Python develop a plan for learning a second language or building a specific project. Focus on teaching students to use the appropriate support channels such as StackOverflow, IRC, mailing list archives, etc, more than teaching directly.
--- Year 4 ---
Have a clearly articulated set of pathways for students who just want some exposure to programming, for students who want to build specific projects, and for students who know they want to go fully into CS. Work closely with teachers in the math and science departments, letting students do CS projects that focus on a content area in another class.
---
I could write an essay on this, so I'll stop there. Many of you are now professional programmers. If you could influence a nascent high school CS program, is there anything in here you would want emphasized, or want to steer me away from?
[edited slightly for formatting]
There's less emphasis on syntax (since Scheme is so minimal), and more on concepts - which cover all the mainstream paradigms. In addition, starting with functional programming demonstrably better complements and reinforces learning in other subjects such as Math.
The 'standard' text is HtDP (http://www.htdp.org/); it's being used in high schools as well as colleges. A second, revised edition of HtDP is in development (http://www.ccs.neu.edu/home/matthias/HtDP2e/). There's also 'Picturing Programs', by Stephen Bloch (http://picturingprograms.com/), an alternative to HtDP, perhaps more suitable for high schoolers.
(Incidentally, DrRacket is an excellent IDE, with all 'batteries included'!)
Conversely, his colleague Shriram Krishnamurthi has carried out extensive research into learning, and is now of the opinion that Racket is actually too minimal syntactically! Hence the development of a new (and rather cool) teaching language called Pyret (http://www.pyret.org/). (It's been discussed in thrilling detail on HN in the past.)
Lastly, it was found that beginners who started with Scheme actually did better when continuing later to Java than others who began with Java. There are some rather blunt testimonials (from students) that reinforce this point...
'Matthias Felleisen often teaches a programming languages course, and reports that near the end of the semester, students (particularly the stronger ones) ask why they didn't learn Scheme first, before Java. At least one top student disagreed:
Make sure you always teach assignment and bad programming first. They must go through hell before they are allowed to program in heaven.'
(A lot more here: http://home.adelphi.edu/sbloch/class/pbd/testimonials/)