Michael Anhari

MIT 6-3

April 6, 2020
  • computer-science
  • learning

Not too long ago, I put together a curriculum via MIT's OpenCourseWare that one could follow to "enroll" in MIT's Computer Science and Engineering course work (known as 6-3).

It does not include any elective courses, and I made some choices when given an option of multiple courses to meet a specific requirement.

Semester Nulla

6.00SC - Introduction to Computer Science and Programming

This subject is aimed at students with little or no programming
experience. It aims to provide students with an understanding of the
role computation can play in solving problems. It also aims to help
students, regardless of their major, to feel justifiably confident of
their ability to write small programs that allow them to accomplish
useful goals. The class will use the Python programming language.

Semester I

18.01 – Single Variable Calculus

This calculus course covers differentiation and integration of functions
of one variable, and concludes with a brief discussion of infinite
series. Calculus is fundamental to many scientific disciplines including
physics, engineering, and economics.

8.01 – Physics I: Classical Mechanics

Physics I is a first-year physics course which introduces students to
classical mechanics. Topics include: space and time; straight-line
kinematics; motion in a plane; forces and equilibrium; experimental basis
of Newton's laws; particle dynamics; universal gravitation; collisions and
conservation laws; work and potential energy; vibrational motion;
conservative forces; inertial forces and non-inertial frames; central
force motions; rigid bodies and rotational dynamics.

Semester II

18.02 – Multivariable Calculus

This course covers differential, integral and vector calculus for
functions of more than one variable. These mathematical tools and methods
are used extensively in the physical sciences, engineering, economics and
computer graphics.

8.02 – Physics II: Electricity and Magnetism

This freshman-level course is the second semester of introductory physics.
The focus is on electricity and magnetism. The subject is taught using the
TEAL (Technology Enabled Active Learning) format which utilizes small
group interaction and current technology. The TEAL/Studio Project at MIT
is a new approach to physics education designed to help students develop
much better intuition about, and conceptual models of, physical phenomena.

6.01 – Introduction to Electrical Engineering and Computer Science I

This course provides an integrated introduction to electrical engineering
and computer science, taught using substantial laboratory experiments with
mobile robots. Our primary goal is for you to learn to appreciate and use
the fundamental design principles of modularity and abstraction in a
variety of contexts from electrical engineering and computer science.

Our second goal is to show you that making mathematical models of real
systems can help in the design and analysis of those systems. Finally, we
have the more typical goals of teaching exciting and important basic
material from electrical engineering and computer science, including
modern software engineering, linear systems analysis, electronic circuits,
and decision-making.

Semester III

18.06 – Linear Algebra

This course covers matrix theory and linear algebra, emphasizing topics
useful in other disciplines such as physics, economics and social
sciences, natural sciences, and engineering. It parallels the
combination of theory and applications in Professor Strang’s textbook
Introduction to Linear Algebra.

6.042j – Mathematics for Computer Science

This subject offers an introduction to discrete mathematics oriented
toward computer science and engineering.

The subject coverage is divided into three parts:

    1. Fundamental concepts of mathematics: Definitions, proofs, sets,
    2. Discrete structures: Elementary number theory, graphs, counting.
    3. Discrete probability theory.

On completion of 6.042J, students will be able to explain and apply the
basic methods of discrete (noncontinuous) mathematics in computer
science. They will be able to use these methods in subsequent courses in
the design and analysis of algorithms, computability theory, software
engineering, and computer systems.

Semester IV

6.02 – Introduction to EECS II: Digital Communication Systems

An introduction to several fundamental ideas in electrical engineering
and computer science, using digital communication systems as the
vehicle. The three parts of the course—bits, signals, and packets—cover
three corresponding layers of abstraction that form the basis of
communication systems like the Internet.

The course teaches ideas that are useful in other parts of EECS:
abstraction, probabilistic analysis, superposition, time and
frequency-domain representations, system design principles and
trade-offs, and centralized and distributed algorithms. The course
emphasizes connections between theoretical concepts and practice using
programming tasks and some experiments with real-world communication

6.005 – Software Construction

Introduces fundamental principles and techniques of software development,
i.e., how to write software that is safe from bugs, easy to understand,
and ready for change. The course includes problem sets and a final
project. Important topics include specifications and invariants; testing;
abstract data types; design patterns for object-oriented programming;
concurrent programming and concurrency; and functional programming.

6.006 – Introduction to Algorithms

This course provides an introduction to mathematical modeling of
computational problems. It covers the common algorithms, algorithmic
paradigms, and data structures used to solve these problems. The course
emphasizes the relationship between algorithms and programming, and
introduces basic performance measures and analysis techniques for these

Semester V

6.004 – Computation Structures

6.004 offers an introduction to the engineering of digital systems.
Starting with MOS transistors, the course develops a series of building
blocks — logic gates, combinational and sequential circuits,
finite-state machines, computers and finally complete systems. Both
hardware and software mechanisms are explored through a series of design

6.004 is required material for any EECS undergraduate who wants to
understand (and ultimately design) digital systems. A good grasp of the
material is essential for later courses in digital design, computer
architecture and systems. The problem sets and lab exercises are
intended to give students "hands-on" experience in designing digital
systems; each student completes a gate-level design for a reduced
instruction set computer (RISC) processor during the semester.

6.046 – Design and Analysis of Algorithms

This is an intermediate algorithms course with an emphasis on teaching
techniques for the design and analysis of efficient algorithms,
emphasizing methods of application. Topics include divide-and-conquer,
randomization, dynamic programming, greedy algorithms, incremental
improvement, complexity, and cryptography.

Semester VI

6.033 – Computer System Engineering

This course covers topics on the engineering of computer software and
hardware systems: techniques for controlling complexity; strong
modularity using client-server design, virtual memory, and threads;
networks; atomicity and coordination of parallel activities; recovery
and reliability; privacy, security, and encryption; and impact of
computer systems on society. Case studies of working systems and
readings from the current literature provide comparisons and contrasts.
Two design projects are required, and students engage in extensive
written communication exercises.

6.034 – Artificial Intelligence

This course introduces students to the basic knowledge representation,
problem solving, and learning methods of artificial intelligence. Upon
completion of 6.034, students should be able to develop intelligent
systems by assembling solutions to concrete computational problems;
understand the role of knowledge representation, problem solving, and
learning in intelligent-system engineering; and appreciate the role of
problem solving, vision, and language in understanding human intelligence
from a computational perspective