Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save wbthomason/9941653 to your computer and use it in GitHub Desktop.
Save wbthomason/9941653 to your computer and use it in GitHub Desktop.
UVa: CS Courses and Programming Languages

This is only my personal opinion, and other TAs probably will differ/should also post their opinions.

Java and C++ are really very similar. Java is more strictly object oriented than C++, and C++ lets the programmer have more low-level control (or rope with which to hang themselves, depending on how you look at it), but the paradigms they enforce are largely the same. So, when considering a new language to learn, we really have to consider what we'll get out of it - what about the language makes it worth learning. There are a few factors here. First, as the student answers have mentioned, the practicality of a language is important. If knowing a language might be necessary to get you a good job or to allow you to contribute meaningfully to a large open-source project, it might be a good idea to learn it. Second, you also need to look at how the language can help you in a larger sense. Does it use a unique paradigm, or one you haven't encountered before? Can it introduce you to new ways of thinking about and solving problems? Is it capable of expanding your skill set beyond giving you new syntax to use? Some less "practical" languages are very significant for these reasons. There are, of course, other factors to consider, but I would posit that these are two of the most important. With that said, here are some of the languages I would deem "good to know":

(Note: I've linked tutorials for each of these languages. I haven't used all of them personally, so if there are suggestions of better tutorials, please say so in the followups. For a briefer overview of most/all of these, I'd strongly suggest visiting [learnxinyminutes.com] - it's a collection of brief overviews of syntax and major paradigms for a large body of languages)

For employability:

  • Java and C++, as you mentioned, are large industry standards.
  • PHP is heavily used in web development, less so elsewhere.
  • Javascript is rising greatly in usage, both for web development and other areas, thanks to the advent of frameworks such as Node.js and asm.js
  • Python and Ruby, as the student response noted, are used by a significant number of companies - Dropbox, for example, is written largely in Python, Python is one of Google's interview language choices (along with Java and C++), and Ruby on Rails is a very common web framework for (in particular) startup companies. [Added by Mike] To show the power of Python, Google Chrome is written in a (non-exhaustive) combination of C++, Python, and Java. As a side note, Guido van Rossum (author of Python) now works at Google.
  • The student answer also mentioned SQL and regular expressions. Regex, in particular, is less of a language and more of a tool - there are libraries for its use in most major languages, and you should definitely know how to solve problems with regular expressions. SQL is largely the standard for enterprise database development (though there are new and growing alternatives - MongoDB, for one), and is pretty easy to develop a basic proficiency in quickly. It isn't terribly commonly used in interviews (unless you're interviewing for a company which specifically does database work), but regex definitely are.
  • If you're interested in mobile development, Objective-C is very important, as it's the de facto iOS language. We used to have a lab on Objective-C in 2150, but I don't think we're going to have it this year (in part due to the weather-related scheduling difficulties).
  • If you like/plan on doing low level work (Operating system development, coding for embedded devices, etc.), C is necessary. It's fairly similar to C++ (C++ began as essentially a set of wrappers adding classes on to C), but is more popular for many lower-level tasks.
  • [Added by Mike] Matlab/Octave, R, and Mathematica/Maple. If you're interested in image processing, signal processing, or pretty much any sort of data processing or statistical analysis (usually using matrices or vectors), these are the tools for you. Thankfully, they have a fairly straightforward learning curve and are useful for rapid prototyping (one of the big reasons why they're used).
  • [Added by Mike] VHDL and Verilog. If you're interested in hardware design, these are very useful tools as they quite literally specify hardware design. Intel, AMD, NVIDIA, etc. all look for people with experience in these languages.

For improving your skill as a programmer:

  • Haskell (or other functional languages). In all probability, Haskell and the FP paradigm are unlike any code you've seen so far. However, this difference can give you alternate (and often very elegant) ways of modeling and solving problems, and I would strongly encourage everyone to learn at least one functional language. Haskell is my personal favorite, but others -- in particular Scala and Clojure, both of which run on the Java VM -- are very popular, and are used by some startups. FP is fairly big at the moment, and many more "mainstream" languages have FP features. I'd still assert that there's something to be gained from learning a "purely" functional language. [Added by Mike] Erlang, mentioned below, is another functional language that is used primarily by some major telecommunications equipment because it's the industry that Erlang came out of.

  • Go. Go is a language designed and championed by Google, who intend it to be largely a replacement for older systems-class programming languages (such as C). It's notable mainly for its approaches to concurrency and interfaces, and could become more notable if it gains further traction for use in industry. Other significant languages in a similar vein are Erlang and Rust (which is a very immature but promising language; it's currently in version 0.9, and changes essentially every day - alternate tutorial). Another interesting "up-and-coming" language (a.k.a. people want it to be the "next big thing") is Julia, which is trying to give the speed of C with the readability of Python/Ruby (aren't they all nowadays...)

  • C#. C# is, in my opinion, Java done right (or at least better). It's very similar to Java in terms of syntax and overarching paradigms (strongly OOP, etc.), so it's pretty easy to pick up. However, it has some interesting features regarding tasks and concurrency, functional programming, and events. I would have put it in the practical section, since it is fairly widely used in industry, but it hasn't seen as wide adoption as many of the others in that section, due partially to being tied to the Microsoft ecosystem. Still, I'd say it's worth learning.

  • [Added by Mike] Prolog. Whereas C++, Java, C# and the like are imperative programming languages and Haskell, OCaml, and Erlang are functional programming languages, Prolog is a declarative programming language. Imperative programming means the programmer specifies how they want something done; declarative programming means the programmer specifies what they would like done, and lets the computer figure out how to do it. Where is this useful? The main areas are natural language processing (IBM's Watson used Prolog to parse the questions Alex Trebek asked - Source), theorem proving, games, "expert systems" (related to AI), and other areas that require logic. If you're interested in Prolog, here are some examples, including a Sudoku Solver: Examples.

  • [Added by Charles] Declarative languages are also used in hardware design - Verilog and VHDL at least.

  • [Added by Mike] Lisp - Common Lisp/Scheme. Although dated, one of the many "rites of passage" of a budding young programmer (and the final project for Yale's CPSC 201 Intro to Computer Science course) is to write a Scheme interpreter. If you like parentheses and recursion, this is the language for you! Lisp is one of the oldest interpreted languages, and is based on the lambda calculus (i.e. it's an early functional language). Lisp is the preferred language for AI primarily because you can self-modify code and symbolically program. If you take Professor Worthy Martin's AI (CS 4710) course, he historically used/required Scheme for the programming assignments. This has changed in previous iterations of the course, but he still appreciates those who pay homage to Peter Norvig (his book is AI algorithms in Lisp). Also, here's Norvig's explanation: Why Lisp?.

  • [Added by Mike] In previous iterations of CS 2150, Prof. Bloomfield has included lectures on esoteric programming languages, of which I am a huge fan of (and I believe Charles is too). These include Shakespeare, Chef, INTERCAL, brainf***k, (my personal favorite) dogescript, and the newly created ArnoldC. [Added by Wil] As well, I'm a fan of Befunge (2-dimensional programs are fun), Malbolge (a language so hard to use that a search algorithm had to be used to write the first valid program), and Whenever. [http://www.dangermouse.net/esoteric/] is a decent list of some more esoterics.

There are many other languages, and many other criteria by which to select languages. Hopefully, some of the other TAs will have more to say on this subject. If you have other questions/more specific questions about a language, I can answer them in the followups. Hope this helps!

[Added by Charles]

  • As discussed above, Java and C++ are very similar- object-oriented, procedural, compiled. Focus on languages that are different from that. (Though C# is wonderful. It's all of the good things of C, with all of the good things from Java, minus the bad things of C++.)
  • Know what interpreted languages are and how to use them. Javascript is very commonly used in a lot of areas- too much, in my opinion. Be familiar with either Ruby or Python (scripting languages), or both. (I'd recommend Python.)
  • Make sure you have used one or more functional languages. LISP and ML are somewhat traditional- Haskell is maybe the most popular ATM, from what I've gathered.
  • Regex. I've never used a regex in a program (though you certainly can), but I use them every single day when programming. Or just when editing text. Just about all editors have a regex search / replace mode, and sed works wonders when you need it.
  • Read K&R, also known as The C Programming Language, 2nd Edition. It's a great way to understand lots of what happens in all of the C descendants, which is just about anything procedural with curly braces, as well as how computers perceive your programs.
  • If you're heading to web stuff: Ruby, Javascript (check out Node.js), SQL, and of course HTML/CSS (markup rather than programming languages).
  • I've not been exposed to declarative languages in an AI / etc. context, but they're used in hardware design - VHDL / Verilog.
  • [inb4 OS TAs] If you're interested in seeing how a language develops- now's a good time to get involved in the Rust community.

The most important thing, though, is to learn to learn new languages. Learning about compilers/interpreters (Weimer's PL class is great) helps with this- understanding how the computers perceive expressions, functions, evaluation, etc. in both compiled and interpreted contexts. And knowing a little bit of different things can help you draw of familiar paradigms in a new one.

[Added by Mike]

Note: This list is based on what I've (Mike's) seen firsthand and what I've been told. I encourage other TAs to update this list if they notice any inaccuracies.

Class Name Language(s)/Framework(s) Used (not necessarily taught)
CS 1110/1112/1111 (Intro to Programming) Java, in the past there has been a brief intro to Python
CS 1120 (Introduction to Computing: Explorations in Language, Logic, and Machines) Scheme, Python
CS 2110 (Software Development Methods) Java
CS 2150 (Program and Data Representation) C++, x86 Assembly, IBCM (to simulate machine code), C, Obj-C (brief intro)
CS 3240 (Advanced Software Development Techniques) Historically, Java; in recent iterations: Python, Javascript, PHP
CS 3330 (Computer Architecture) MIPS Assembly
CS 4414 (Operating Systems) Historically, C; in recent iterations: Rust
CS 4444 (Introduction to Parallel Computing) C/C++ (sometimes with CUDA and OpenCL)
CS 4610 (Programming Languages) & CS 4501 (Compilers Practicum) C, Javascript, Python, Ruby, Haskell, OCaml, Cool (classroom object oriented language - like IBCM, just pedagogical language)
CS 4620 (Compilers) C
CS 4630 (Defense Against the Dark Arts) C, x86 Assembly
CS 4710 (Artificial Intelligence) Historically, Scheme. In recent iterations, your choice, but code is provided in Java.
CS 4720 (Web and Mobile Systems) Java, Javascript, PHP, SQL
CS 4730 (Computer Game Design) Recently, all of the projects have been in C#. Historically, it's been Java, C#, Javascript (with HTML5), etc.
CS 4740/CS 4501 (Cloud Computing) Python, C#
CS 4750 (Database Systems) SQL, PHP, Javascript
CS 4753 (Electronic Commerce Technologies) PHP, Javascript
CS 4810 (Introduction to Computer Graphics) Historically, code is provided in C++, but you have the option to use a language of your choice. In the current iteration, Tychonievich allows C++, Java, Python, D, and C#.
APMA 3140 (Partial Differential Equations) Matlab and/or Mathematica (if Hopkins teaches it)
APMA 5070 (Numerical Methods) Matlab
ECE 3430 (Embedded Systems) C
ECE 4435 (Computer Architecture and Design) VHDL/Verilog
ECE 4750 (Digital Signal Processing) Matlab
STAT 3080/3120/3430 (Intro to Statistics/Statistical Computing) R, SAS
PHYS 2660 (Introduction to Scientific Computing) C/C++
PHYS 5630 (Computational Physics I) C/C++ (with CERN's ROOT Package)
PHYS 5640 (Computational Physics II) C/C++ (with GNU's open source linear algebra tools)

Also, be sure to keep track of CS 1501 courses. Nishant Shukla has taught Haskell, Michael Paris is currently teaching Node.js (a Javascript REPL, read-eval-print-loop/interpreter, as well as a set of functionality expanding libraries and a framework for building projects not necessarily related to webpages with Javascript). In the past, people have taught esoteric language courses (rumor has it TA Mike wrote a syllabus and planned on teaching an esoteric language course, but opted to become a TA for 2150 instead...). These are fun 1-credit pass/fail courses that introduce you to (theoretically) new and fun, relevant topics.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment