<p>I’m currently a rising Junior in Engineering who has been humbled by the past two years spent at Cornell, here are some of my thoughts on the course load as well as the times that I’ve ****ed up.</p>
<p>This is also intended for anyone that is interested in or is currently in CS</p>
<p>Core CS</p>
<p>CS1110 - Intro Java</p>
<p>I decided to use my AP credits to skip out of this course, so unfortunately I won’t be able to help you out here. From what I have heard however, the professor is very patient does a great job of explaining the material even if he does touch on the verbose side most of the time. If you’ve never programmed before and do not understand how to program, this probably will be a great course to take. (albeit I heard the David Gries is no longer teaching it?) However, if you have some programming experience, this class might be very boring.
Note: This is a programming class
Note2: DO NOT take transition to Java, I’ve had friends who took 1112 as their sit-in class and attempted to do 1130 and got killed by the self-pacing nature of the course.</p>
<p>CS1132 - Transition to Matlab</p>
<p>Pretty easy if you have had programming experience before. The projects ask you to pretty much just translate some “tasks” into matlab code, so if you’re comfortable writing code in general, this class is pretty easy. However, if you are not, then due to the self-paced nature of the course, you will definitely want to start early on the projects and practice writing code for the tests. Beyond that, not much to say about this as it’s a fairly straightforward 1-credit course that you can take multiple times so don’t worry about this too much if I were you.</p>
<p>CS/ENGRD2110 - Object Orientation and Data Structures AKA OO (if you’re engineering CS, you should enroll under engrd)</p>
<p>This is the second java programming course offered, and unlike 1110, will usually only be taken by CS, ORIE, a few engineers, and math majors concentrating in CS (PS: if you’re interested in math, but you’re in engineering, you can declare an independent major by the end of your third semester). Unfortunately, I was an arrogant idiot at the time and decided that I didn’t need to go to lectures for this class. Anyways, from what I remember from the problem sets, they were fairly straightforward and were basically an extension of 1110. Here’s my advice for not suffering in 2110: find some problem that have been bugging you that you believe can be easily solved using a computer, and make that your hobby project until its completion. This gives you an incentive to learn Java while sharpening your googling skills.</p>
<p>Also, memorize the sorting algorithms, those were pretty stupid</p>
<p>CS2800 - Discrete Structures</p>
<p>This is an introductory discrete mathematics course covering material ranging from basic set theory, number theory (mostly dealing with primality and modular arithmetic), combinatorics, and probability. This is the first theoretical CS course that you will encounter so be prepared for a change in the style of both the teaching and the way that you should reason about the problems as it is more math intensive than the programming courses. To survive this course, develop a framework for reasoning about different types of problems and don’t shy away from rigorous proofs. In order to prevent yourself from rushing through with trying to explain your proofs (which will usually make them really difficult to read), I’d suggest typesetting all of your problem sets in latex.
Some of the material in 2800 will also be revisited in 4800. (Probability and Automata)</p>
<p>Notes by Rafael Pass - <a href=“http://www.cs.cornell.edu/~rafael/discmath.pdf[/url]”>http://www.cs.cornell.edu/~rafael/discmath.pdf</a></p>
<p>CS3110 - Data Structures and Functional Programming AKA Ocaml</p>
<p>This is the third programming core CS course. However, you will no longer be using Java. Instead, you will be exposed to a different programming paradigm. I’m not going to lie, 3110 is usually considered a weed-out course, but as long as your willing to let go of some of the stuff you were taught in 2110 and 1110, and are willing to do the work, you’ll do just fine. In brief, functional programming is basically a way of encoding your programs such that every operation performed by the computer is represented as a function, so in order to do anything, you define operations as a composition of other functions. It’s actually not too bad if you ever get used to it (and it does grow on you)</p>
<p>Later portions of the course touches upon some of the more advanced data structures you’ll find out in the wild and various techniques for analyzing the effectiveness of these data structures.</p>
<p>General Note: if you’re doing the programming language vector, this is a very essential course so you will need to remember a bunch of stuff from here as both 4110 and 4120 builds upon some of the ideas presented in 3110.</p>
<p>CS3410 - Computer System Organization and Programming AKA Systems (if you’re doing an ECE minor, you will need engrd 2300 and cs3420/ece3140)</p>
<p>This course gives you a broad overview of how a computer works all the way down to the level directly above the transistors themselves. You’ll learn how to do binary arithmetic and how to turn any arbitrary boolean expression into a simplified circuit design (aka - how to click on a button in logisim). You’ll finish building your own processor by the middle of the course, and the remaining time is spent on ways to make memory seem efficient and how a computer can seem to execute multiple processes at the same time. By this point, you need to be somewhat proficient in the C language, so I suggest either reading up on your own, take the C course, or get a good partner for the last few projects. Apparently the biggest hurdle for most of the people was pointer arithmetic, so I suggest writing your own simple implementation of malloc.</p>
<p>Comment on the projects: they are fairly self explanatory and the TAs are there to help you. If you don’t know where to start, go see the TAs. </p>
<p>**CS4410 - OS<a href=“and%20if%20you%20want%20to%20do%20the%20systems%20vector,%204411%20is%20the%20practicum”>/b</a></p>
<p>cs4410 itself is actually pretty easy. It builds off of everything covered within the latter portion of 3410, and gives a general overview of how an operating system work, including how to write a wider variety of synchronization primitives, how to switch between processes, more memory management, and security. The miniprojects are basically a few questions followed by a few programming assignments about network that you need to complete in python. </p>
<p>On the other hand, cs4411 always consists of 6 projects, each one starting with implementing a userland threading library in C++, then progressively building up upon that until you implement a simplified UDP and then TCP networking. Finally, you implement a virtual file system. You don’t actually write a complete operating system from scratch, but even then, you’ll probably spend a lot of time in Upson 360 to finish this. Note: You don’t have t take 4411 if you take 4410</p>
<p>CS4820 - Intro to Algorithms</p>
<p>This is the second theory course within the core CS curriculum and by far the most difficult CS course I’ve taken here. There are problem sets due every friday morning, each consisting of three algorithm questions. I’ll be honest here, the prelims were a cinch as compared to the problem sets, and even then the prelims were a bit difficult to finish within the alloted 2 hours. Start early. If you start on the problem sets the night it’s due, you might get away with it during the first two problem sets. After that however, give yourself at least half a week to ponder and do the problem sets, as unlike most of the previous courses you will have taken, the problems are not going to be intuitive. Sloppy proofs will no longer cut it, and you’ll come to realize that the runtime analysis you once so feared are now extremely easy as compared to the other parts. Topics covered include problem solving techniques such as greedy, dynamic programming, and divide and conquer. Furthermore, you’ll learn how to “reduce” one problem instance into an equivalent instance of another problem and learn how to solve certain types of problems using algorithms used to find efficient trafic flow configurations in some types of networks. From there, you’ll learn about intractability and how to show whether a problem is Hard. After that, you’ll learn about turing machines again (this section and NP-Completeness are the most difficult at first, but will become extremely easy later on). Finally, you need to be able to use everything you’ve learned so far in order to create approximation algorithms for known hard problems.</p>
<p>Do not recommend taking with a heavy course load, then again this varies with people. Being pedantic is a good quality to have for this class :P</p>
<p>All in all, most of the CS core courses are pretty easily do-able in terms of courseload if you’re willing to put in the effort early on. Also, to any rising sophomore interested in the programming language vector: you’ll most likely only get a single chance (some years even lucked out on that) to take compilers, so if you want to do PL, take the course, even if you may not have the prereqs yet.</p>