Recently I have been following a couple of online courses on Coursera and udacity, and I must say the quality of the material is really good. Browsing through several programming and computer science courses you can notice that the quality of the material is at least as good as many paid physical universities if not better. After all, most of those courses are given by professors from top universities around the world! The number of courses available on the current MOOC websites is increasing year after year which is opening up the doors to new fields of study online.

Computer science, programming and maths courses are widely available on all of the MOOC websites out there. With that many courses available, that gave me the idea to look into devising a complete 4 year curriculum for a free quality Computer Science education. Of course there isn't a "real" degree associated with all that, but after all education is about the knowledge that one attains and not a signed fancy paper.

The suggested curriculum can go over 4 years, each year is divided into 2 semesters and in each semester the student would take 4 required major courses(Computer Science, Programming and Maths) and maybe one liberal arts elective that is not necessarily related to the major.

A typical undergraduate CS program would give the student background in the following areas:

- Computer Programming
- Data Structures
- Object Oriented Programming
- Algorithms
- Programming Language Theory
- Software Engineering
- Computer Networking
- Human Computer Interaction
- Operating Systems
- Web Programming
- Database Systems
- Mathematics
- Discrete Mathematics
- Calculus
- Statistics and Probability
- Linear Algebra

The curriculum basically assumes a high school education preferably focused on the sciences. And here it goes:

### Year 1, 1st Semester:

- Computer Science 101: Teaches the essential ideas of Computer Science for a zero-prior-experience audience.
- Programming 1 (Fundamentals of Programming): Introduces the fundamental building blocks of programming and teaches you how to write fun and useful programs using the Python language.
- Single Variable Calculus: Discusses differential and integral calculus, with an emphasis on conceptual understanding and applications to the engineering, physical, and social sciences. An equivalent course is available at MIT Open Course ware
- Statistics 1: Comprehensive and friendly introduction to statistics including an introduction to R programming and its applications within statistics.

### Year 1, 2nd Semester:

- Programming 2(Crafting Quality Code): Focused on writing quality code that runs correctly and efficiently, Teaches how to design, code and validate programs and how to compare programs that are addressing the same task.
- Introduction to Systematic Program Design: Building programs that are elegant, well tested and easy to maintain. Different tracks with different popular programming languages.
- Discrete Mathematics: Introduces a collection of mathematical topics that are directly related to theoretical Computer Science, each of which is a domain in mathematics on its own.
- Writing in the Sciences: Teaches science students to become more effective writers. Topics include: principles of good writing, tricks for writing faster, the format of a scientific manuscript, and issues in publication and peer review.

### Year 2, 1st Semester

- Linear Algebra: Learn the concepts and methods of linear algebra, and how to use them to think about computational problems arising in computer science.
- Introduction to Databases: Covers database design and the use of database management systems for applications.
- Algorithm Design and Analysis 1: Fundamental principles of algorithm design: divide-and-conquer methods, graph algorithms, practical data structures (heaps, hash tables, search trees), randomized algorithms, and more.
- Software Debugging: Teaches systematic debugging, how to automate debugging and build several functional debugging tools in Python.

### Year 2, 2nd Semester

- Algorithm Design and Analysis 2: Fundamental principles of advanced algorithm design: greedy algorithms and applications; dynamic programming and applications; NP-completeness and what it means for the algorithm designer; the design and analysis of heuristics; and more.
- Software Testing: Basics of Software Testing
- Computer Networks: Learn how networks are designed and work. Topics covered: Networking layers, data transmission, protocols, DNS, HTTP, and network security while learning how the Internet works.
- Cryptography 1: Learn about the inner workings of cryptographic primitives and how to apply this knowledge in real-world applications.

### Year 3, 1st Semester

- Cryptography 2: Continuation of the topics discussed in Cryptography 1.
- Human - Computer Interaction: Build human-centered design skills, so that you have the principles and methods to create excellent interfaces with any technology.
- Programming Languages: Investigate the basic concepts behind programming languages, with a strong emphasis on the techniques and benefits of functional programming.
- Introduction to Artificial Intelligence: Basics of Artificial Intelligence, which includes machine learning, probabilistic reasoning, robotics, and natural language processing.

### Year 3, 2nd Semester

- Web Development:Teaches the basics of Web Development including building a blog web application from scratch and how to make it scale.
- Compilers: Discusses the major ideas used today in the implementation of programming language compilers. You will learn how a program written in a high-level language designed for humans is systematically translated into a program written in low-level assembly more suited to machines.
- Introduction to Data Science: Introduce yourself to the basics of data science and leave armed with practical experience extracting value from big data.
- Automata: Covers finite automata, context-free grammars, Turing machines, undecidable problems, and intractable problems (NP-completeness).

### Year 4, 1st Semester

- Introduction to Parallel Programming: Master the fundamentals of massively parallel computing by using CUDA C/C++ to program modern GPUs.
- Machine Learning: Learn about the most effective machine learning techniques, and gain practice implementing them and getting them to work for yourself.
- Image and Video Processing: Look behind the scenes of image and video processing, from the basic and classical tools to the most modern and advanced algorithms.
- Startup Engineering: Learn the engineering skills needed to build a technology startup from the ground up.

### Year 4, 2nd Semester

- Natural Language Processing: Learn fundamental algorithms and mathematical models for processing natural language, and how these can be used to solve practical problems.
- Probabilistic Graphical Models: Learn the basics of the PGM representation and how to construct them, using both human knowledge and machine learning techniques.
- Artificial Intelligence for Robotics: Probabilistic inference, planning and search, localization, tracking and control, all with a focus on robotics.
- Creative Programming for Digital Media & Mobile Apps: Apply technical skills to creative work ranging from video games to art installations to interactive music, and also for artists who would like to use programming in their artistic practice.

And there you have it, a 4 year curriculum for a full Computer Science education that contains a mix of theoretical and practical topics. What I really love about all those courses is that almost all of them focus on discussing where and how to apply the theory you're learning in the real world and in programming. And this in my opinion is what makes such courses really effective in adding value to the learner, and makes them more ready to the job market.

Platforms such as Coursera and Udacity are revolutionizing the way we learn to the better. The age where virtually anyone in the world regardless of their economic status, color, race and gender can have access to a decent free education is already here. Freedom not necessarily in the monetary sense but also freedom in time, choosing topics of interest, and learning speed. Freedom from the handcuffs of classic educational institutions who's main goal is to make profits while delivering a one size fits all education.

What I would really like to see one day is a new style of educational institutions that are affiliated with with MOOC platforms and operate within different areas. For a certain reasonable tuition they'd host the MOOC courses locally and organize them into full undergraduate programs, they provide the students with lecture material to study, and administer the exams. At the end of the curriculum, successful students would receive a degree that is officially approved by the MOOC platform and that is equivalent to a degree from any other classical education institution.

Do you think such model for tech related education(such as applied Computer Science) can really work? Would love to hear your comments.