Coding Classes I Recommend Taking - UC Davis

Dec 16, 2019

Dom Fou


The first coding class I took at UC Davis was ECS 10. This was also the first time I tried programming. I remember that when I recieved the first homework assignment, I thought: “Oh, this isn’t so bad.”

I knew how wrong I was when the next assignment released. Coding is hard. It’s very hard especially when you have no prior experience. I remember struggling through the very first steps of my coding journey, but when I look back right now, everything was worth it.


I recently came across a CS advice piece written by a graduate of UC Davis, Rylan Schaeffer, on different types of CS classes and general college advice. I thought this was a very well-written piece, and it inspired me to put my two-cents on this topic. I, however, started my CS journey late and have only taken a limited amount of upper division Computer Science classes. Nevertheless, I believe that I have taken a couple classes which improved my skill as a coder.

My hope is that you find my advice helpful to start your own coding journey.


ECS 10 (ECS 32A/36A) - Introduction to Programming

I took ECS 10 with Matthew Butner in 2017. This course has been discontinued and replaced with the 32 series for non-majors and 36 series for major students. Although the class I took has been replaced, the concepts taught are the same.

ECS 10 is a gentle introduction to programming concepts and structure. I highly recommend taking this course at Davis because you go over concepts that will come up over and over again in latter classes. The language used is Python – this makes it easier to focus on the foundations rather than the complexity of a harder language as a beginner.

Some of the topics you will learn include:

  • Simple Programs – variables, assignments, expressions, etc
  • Control flow – if and else, loops
  • Functions – structuring your code
  • Data Structures – lists, arrays, dictionaries, strings
  • File operations – reading and writing

By the end of the class you will be proficient in how to think about solving problems, which is one of the most important skill in computer science, and how to break down solutions into smaller subproblems.

ECS 140A - Programming Languages

ECS 140A has changed quite a bit depending on which professors you take the class with. I took this class with Professor Cindy Rubio, and it was one of the programming/intellectually harder coding classes at UC Davis. You will study programming languages extensively in this course. To be specific, there will be 3 types of programming paradigms that you will work with (listed below).

The languages taught will depend on professor. Professor Rubio and Thakur will teach:

  1. Golang – imperative programming
  2. Lisp – functional programming
  3. Prolog – logic programming
  4. Golang – parallel/concurrent programming

I heard from friends that other professors may teach the imperative portion with Java and functional portion with Haskell instead. This course is hard because this will be one of the first times you will experience using recursion extensively. The homework assigned in Spring 2019 were all solved recursively with the exception of homework 4 – concurrency in Go. By the end of the quarter, you will be able to use a language’s natural properties to solve problems. For example, Lisp type languages are great for list processing – using tail recursions to reconstruct lists.

Despite it being hard, ECS 140A is a class I highly recommend because you will explore the inner workings of what makes a programming language a programming language. If you’re interested in data, functional programming is incredibly important to understand – how to use list processing methods and higher order functions. Parallel programming is important in modern contexts as now a lot of data is shared on the web. Learning how to mutate data without conflicting other shared states is crucial. For example, imagine having a shared bank account with someone. Since numbers in your bank account are affected by perception and order of operations, we need to make sure that concurrent methods are handled safely (E.g. Watching for data races).

ECS 150 has become a prerequisite of ECS 140A as of Fall 2019. This is bad news for many non-CS majors as 150 is incredibly hard to get into since it’s a requirement for CS and CSE students. In addition, most non-majors do not have as intensive programming experience to take ECS 150 comfortably (ECS 150 is Operating Systems taught in C). If you, however, are up to the challenge to complete 150 in order to take 140A, it is a class you won’t regret taking.

ECS 160A - Software Engineering

ECS 160A is by far the most helpful computer science course I have taken at UC Davis. This class, I believe, would address most of the concerns written in here under the section: Arguments with a Professor, Continued. ECS 160A is a relatively new class. In fact, ECS 160A currently does not exist separately from the regular ECS 160. I originally enrolled in 160 thinking that I would be working on project based assignments. Instead the professor, Devanbu, mentioned that we were taking ECS 160A which emphasizes advanced programming methodologies. ECS 160 will split into the two separate versions in the future – ECS 160A (advanced coding concepts) and ECS 160B (the project version).

Some of the topics that will be covered in 160A include:

  • Design Patterns
  • Functional Programming in Haskell (Segway to Java Streams)
  • Java Streams
  • Software Architecture Designs
  • Java Reflection
  • Testing/Fuzz Testing

Along the way, you will learn how to use helpful tools such as git and docker. ECS 160A is taught in Java except for the last homework which is done in C. By the end of the course you will have taken a peek into concepts that real-world applications use such as microservices for web-based development, and Java Streams for data processing. Understanding Java Streams’ foundational concepts also gives you access to understaning Hadoop operations. You will also briefly touch meta-programming using Java Reflection.

Last but not least, 160A is fun! I personally believe that this course is one of the least theoretical computer science programming course at Davis. Each of the assignments given to us can have a direct correlation to what we do in industry. Furthermore, Professor Devanbu is a very well-knowledgable individual. I appreciated many of his subtle economics jokes throughout the quarter. If you’re looking for a class that teaches you modern software concepts, this class is the class for you.


Yiping Su
Yiping Su
Software Engineer

I am interested in data, software engineering, and the application of computer science concepts in real-world scenarios.