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:
- Completely open to everyone with no prerequisites or prior knowledge expected
- Relaxed, welcoming, and encouraging atmosphere
- Great preparation for future work in computer science and engineering, and for leveraging programming in any discipline
- Same target grade distributions
- Same target workload and level of challenge
- Mostly the same course policies
- Combined EECS 183/ENGR 101-003 Final Project Showcase
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:
- Use modern professional tools to write, debug, and test code confidently
- Design algorithms to solve a variety of problems
- Develop substantial programs to address complex challenges
- Collaborate effectively with peers on technical projects
- Read technical documentation and translate it into working code
- Write programs incrementally, building one part at a time
- Apply systematic problem-solving strategies
- Establish a strong foundation for success in future computing courses
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.
- Broad Applicability: If you’re not planning on further CS study, the course will provide vital experience in data handling and leveraging of software libraries for AI, enhancing your adaptability to the computational demands of your primary discipline.
- Solid CS Foundation: If you do decide to study CS further, then the course will lay a strong foundation for EECS 280 and beyond.
As a result of taking the Python version of EECS 183, you will be able to:
- Write programs without AI tools to solve problems involving computation and data, in computer science and in other disciplines.
- Apply understanding of fundamental computational techniques to critically evaluate, debug, and enhance AI-generated code as part of an efficient programming workflow.
- Use AI tools to more quickly apply software libraries to problems of interest.
- Explain certain key concepts of the field of AI and write programs related to these concepts.
Topics include the following:
- Introductory programming concepts (variables, functions, conditional statements, loops, strings, lists, dictionaries, classes…)
- Iteration patterns including for-each and comprehensions
- The NumPy library for efficient computation
- The Pandas library for data manipulation
- Key ideas in machine learning and neural networks
Steve, will the Python course prepare me for EECS 280, EECS 281, and beyond?
Short version:
-
Preparation: Yes, EECS 183 Python fully prepares you for these courses.
-
C++ Transition: EECS 280 no longer assumes prior C++ knowledge, and we include a C++ “bridge” at the end of this course.
-
Rigor: Both the C++ and Python versions of 183 cover the same core logic and problem-solving standards.
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?
-
AP students - The historical strong success of AP students (who transition from Java) in EECS 280 provides a strong precedent for learning C++ as a second language in that course.
-
Transfer students - These students arrive with experience in a variety of languages. They succeed as well, perhaps after an adjustment period – even more so now that 280 has been changed to not expect prior C++ experience.
-
ENGR 101 (as in sections 001 and 002 for Winter 2027) students - This course is specifically tailored for the diverse needs of the College of Engineering, balancing MATLAB and C++. While its C++ footprint differs from EECS 183, it has a long track record of successfully preparing students for EECS 280.
-
EECS 183 C++ students - This course prepares students very well for 280. It’s an extremely well-designed course taught by excellent instructors.
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:
- Data processing and analysis
- Solving systems of linear equations
- Optimization
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.