EECS 183

Welcome! Are you interested in EECS 183 and/or ENGR 101-003? You’ve come to the right place! Three versions will be offered and are discussed here:

This page only applies to ENGR 101 section 003 and all EECS 183 sections. For Winter 2027, sections 001 and 002 of ENGR 101 will be taught as in previous semesters.

All three versions share fundamental similarities:

Please note: There are Python lecture sections with Python labs, C++ lecture sections with C++ labs, and ENGR 101-003 lecture sections with ENGR 101-003 labs. You must sign up for a lecture and lab section that match (Python lecture with Python lab, C++ lecture with C++ lab, or ENGR 101-003 lecture with ENGR 101-003 lab). Exceptions are not possible.

C++ Version

William Arthur

The C++ version of EECS 183 will be similar to recent semesters. For more details, please visit the current course page. By choosing the C++ version, you will learn core problem-solving and computational thinking skills, and apply them to tackle meaningful, real-world problems. The C++ version will be taught in all sections run by William Arthur.

By the end of this course, you will be able to:

Completing the C++ version of EECS 183 is an excellent and proven first step toward studies in Computer Science, Data Science, Engineering, and many other disciplines.

Python Version

Steven Bogaerts

I encourage you to start by reading a Computer Science and Engineering department post about the Python version of EECS 183: Introductory CS course at U-M now offered in Python. Then if you’d like more details, please read below!

The Python version will be taught in all sections run by Steven Bogaerts. If you choose to take the Python version, you will learn to apply computational thinking in a variety of contexts, using Python as the means of expression and with AI as the focus.

As a result of taking the Python version of EECS 183, you will be able to:

Topics include the following:

Steve, will the Python course prepare me for EECS 280, EECS 281, and beyond?

Short version:

Will you have an easier or harder time in those later courses, compared to someone who takes EECS 183 in C++, or ENGR 101 (MATLAB and C++)? I’ll do my best to lay out various considerations below.

I’ve taught 183 in C++ in the past, and now in Python, and I’ve also taught 280, so I understand well how these courses connect. My perspective is also shaped by having taught CS1 in various languages (C++, Python, Java) at other institutions over many years, giving me a front-row seat to how students internalize logic differently depending on their first language.

EECS 280 Does Not Assume Prior C++ Experience

As of the 2024-2025 academic year, EECS 280 is now intentionally structured to support students arriving from various language backgrounds, including Python and Java. Note, though, that many students currently in 280 still arrive with C++ experience. Because of this, the 280 instructors are actively monitoring and refining the early weeks of the course to ensure everyone can succeed. The course is very carefully designed to accommodate students with background in any language, and the instructors are extremely dedicated and talented.

What Student Backgrounds Succeed in EECS 280?

EECS 183 Python for non-CS Majors

In many professional fields outside of CS, Python has become the dominant tool for data analysis, visualization, and automation. Python has a huge ecosystem of libraries for data science, machine learning, scientific computing, web development, automation, and more. C++ is not commonly used for these tasks in most fields. Therefore, learning Python gives non-CS majors a more practical skill set that aligns with their most likely needs.

EECS 183 Python for CS Majors

The design of the Python programming language allows students to focus more deeply on algorithmic thinking and program structure without as high of a cognitive load from language features that are necessarily exposed earlier in C++. CS students must learn these complexities eventually, but in an introductory context, the pedagogical approach of this course prioritizes a deeper dive in computational logic and problem-solving patterns.

What Prior Experience Means for EECS 280

When I’ve taught EECS 280 in the past, I’ve seen students from different backgrounds have different early experiences. Any gap based on prior language experience typically narrows significantly within the first few weeks. After that, the challenge of EECS 280 comes from ideas that are new to everyone. I expect this trend to continue with the addition of 183 Python students into 280. The ‘Python-first’ path provides students with an early fluency in a language dominant in industry and data science, which complements the systems-level depth they will gain later in C++.

EECS 280 is Always a Transition

I’ll also mention that 280 is and has always been a step up in difficulty from the prerequisite options (e.g., EECS 183, ENGR 101) for everyone. But don’t let that stop you! You can and will succeed if you choose to pursue this, and EECS 183 Python is a solid choice.

EECS 183 Python Students Will Learn Some C++ As Well

I will spend a couple lectures at the end of the semester teaching C++ for Python programmers. This will not result in the same depth of C++-specific knowledge as in the C++ version of 183, but rather will show you how the logic you’ve already mastered in Python translates into C++ syntax. Your understanding of programming logic will allow you to focus on C++ syntax alone, making this transition very efficient. For students motivated to learn this material, in preparation for 280, I am confident they will be on solid ground for EECS 280.

In Conclusion

Regardless of the programming language used, both the C++ and Python versions of EECS 183 are designed to meet the same rigorous standard of computational thinking required for the U-M CS curriculum. While EECS 183 Python is new at U-M, this approach has successful models at other top-tier institutions, and is rooted in my own experience in the classroom. I am committed to monitoring student outcomes closely and ensuring that my students have the foundation they need to thrive in 280 and beyond.

I hope that’s helpful! My goal isn’t to convince every student that Python is the ‘right’ path for them, but to ensure that those who choose it feel confident, prepared, and excited for what comes next. Whether I see you in class or not, best wishes to you!

ENGR 101-003 C++/MATLAB Version

Ben Torralva

The ENGR 101-003 section is a modification of the EECS 183 C++ version taught in recent semesters. It is the only version that will satisfy the College of Engineering’s MATLAB requirements. Like the other versions, it will not assume any prior programming experience and will include all the fundamental material and projects from the C++ version. For details, please see the C++ version of EECS 183. The ENGR 101-003 version will be taught in all sections run by Ben Torralva. Because the two courses are the same apart from the MATLAB portion, ENGR 101-003 students will have access to the full teaching staff, office hours, and instructional resources of the EECS 183 C++ sections. Even though ENGR 101-003 is a unique section, you will have the support of a large, well-established course behind you.

Leveraging the fundamental computer programming and problem-solving skills acquired in the first part of the course, we will transition to engineering applications, taking full advantage of MATLAB’s unique capabilities. This portion of the course is built around solving computational problems involving 3 of the pillars of computational engineering:

As an example of how we can leverage MATLAB to make rapid progress, consider the most important calculation in computational engineering: solving a system of linear equations (SLE). A vast array of engineering problems can be formulated into SLEs, from structural mechanics and electrical circuits to fluid dynamics and data analysis. Formally, an SLE can be written as Âx = b, where  is the coefficient matrix, x is an unknown vector, and b is a vector of known constants. The formal solution is x = Â⁻¹b. In computational engineering, we avoid directly taking the inverse of a matrix and instead employ state-of-the-art linear-solver packages. In MATLAB, an SLE is solved using the mldivide operator, also known as the backslash operator, \, x = A \ b. Far from being a computational trick, the operator invokes an automated routine that inspects the structural properties of matrix  and automatically routes the problem to optimal, hardware-accelerated numerical routines (including LAPACK, BLAS, and SuiteSparse). This avoids getting bogged down in low-level C++ algorithmic details or Python package plumbing, allowing students to immediately apply production-grade solvers to real computational engineering problems. Nonetheless, if low-level details and control of the solution are sought, the packages invoked can readily be determined and controlled.

Choosing ENGR 101-003 offers a versatile and practical foundation, equipping you to satisfy the College of Engineering MATLAB requirement while building the computational problem-solving skills vital across all engineering disciplines.