Expanding list of things that should be part of the Computer Science curriculum.

Undergraduate CS

Introduction to imperative/unstructured programming (assembly)
At least 3 different programming paradigms, from e.g.:
Functional. Clojure, Haskell or Scheme are good choices. Languages where functional programming is "optional" (such as C++, Common Lisp or Python) might not be that suitable in a pedagogical setting.
Imperative and structured. C or Java might be good for this.
Declarative. Prolog, SQL or XSLT, or perhaps some vendor/domain-specific XML based language.
Logic programming. Prolog.
Object-Oriented. Common Lisp or Smalltalk. Should be introduced to students before exposure to C++, C# or Java. A nice exercise is implementing OO using a functional or imperative language.
At least 2 different development and runtime paradigms
One with a compile-and-run cycle. C, C#, Java.
One with a REPL. Common Lisp, Clojure or Python.
One running on a platform independent virtual machine featuring garbage collection (C#, Clojure, Go, Java, Scala).
One running on "the metal" and not featuring garbage collection (C).
Using a text-based build system (CMake, Gradle, Make, Maven).
Using a version control system (Git, SVN) together with 3 or more people on a project spanning two months or more.
Continuous integration
Testing
Algorithms and Data Structuring
Encapsulation and modularisation.
Message-passing.
Recursion.
Speed, size and representational trade-offs: Hash tables, linked lists.
Trees and tree traversal
Storage and retrieval strategies and their trade-offs (CAP-theorem, etc.):
Scalable "NoSQL".
Structured RDBMS using SQL.
Usability and user perspective.
Not only for those who intend to work directly with user interfaces, but formative and important for all CS students (who by definition are "technical" of nature).
A particularly good resource is "The Design of Everyday Things" by Donald Norman.