ossu / computer-science

🎓 Path to a free self-taught education in Computer Science!
MIT License
172.72k stars 21.82k forks source link

Reorganize Advanced Curriculum #799

Open bryanyli opened 4 years ago

bryanyli commented 4 years ago

Currently, the Advanced CS courses are organized in such a way where the learner is encouraged to pick a subset of the courses. I think that organizing it in a way such that there are separate "sequences" and having the learner pick from those sequences allows for the following benefits:

A short example of what I had in mind is shown below.

Advanced CS

After completing every required course in Core CS, students should choose a couple of topics in Advanced CS based on interest.

Programming Languages

Courses Duration Effort Prerequisites
Introduction to Haskell 14 weeks - -
Learn Prolog Now! 12 weeks - -
Compilers 9 weeks 6-8 hours/week none
Functional Programming in Scala (Specialization) 29 weeks 4-5 hours/week One year programming experience

Software Development

Courses Duration Effort Prerequisites
Software Debugging 8 weeks 6 hours/week Python, object-oriented programming
Software Testing 4 weeks 6 hours/week Python, programming experience
Software Architecture & Design 8 weeks 6 hours/week software engineering in Java

Robotics

Courses Duration Effort Prerequisites
Classical Mechanics - - Single Variable Calculus
Differential Equations - - Single Variable Calculus, Vector-valued Functions, Matrices
Modern Robotics (Specialization) 26 weeks 2-5 hours/week Classical Mechanics, Linear Algebra, Calculus, Differential Equations

Theory (Focus on Algorithms)

Courses Duration Effort Prerequisites
Theory of Computation (Lectures) 8 weeks 10 hours/week discrete mathematics, logic, algorithms
Advanced Algorithms - - Algorithms
Computational Geometry 16 weeks 8 hours/week algorithms, C++
waciumawanjohi commented 4 years ago

There is already an Advanced Theory and an Advanced Programming track.

Is the thrust of this Issue to replace Advanced Applications?

bryanyli commented 4 years ago

The thrust of this issue is to separate the current advanced sections into smaller sections that are more like "senior sequences", which involves replacing advanced applications. However, as shown above, I think it would also be useful to separate sections like Advanced Programming into Programming Languages and Software Engineering.

I think this approach would benefit students because it gives a list of topics, not courses to pick from.

waciumawanjohi commented 4 years ago

a list of topics, not courses to pick from.

This is the current intention. That's reflected in language like:

Courses in Advanced CS are electives. Choose one subject (e.g. Advanced programming) you want to become an expert in and take all the courses under that heading. You can also create your own custom subject, but we recommend getting validation from the community on the subject you choose.

and

students should take every course that is relevant to the field they intend to go into.

waciumawanjohi commented 4 years ago

Here's a provocative idea. Perhaps we should go the opposite direction.

Perhaps we should replace Advanced CS with something like Elective CS. This could be a section of courses that cover topics that are elective in the CS2013. We can organize the courses thematically to help students grok the structure. But the only 'requirement' would be for students to do some reasonable count of electives. Not to complete a suite of related courses.

Separate from that we can have Capstone/Major Project. This would be filled with courses that expect students to take on a project of significant scope.

Advantages:

Drawbacks:

bryanyli commented 4 years ago

That is quite an interesting idea. While I do like the idea of branching out, I think I prefer the idea of gradually building up towards a project in a track.

I think it would be beneficial if we could get additional opinions on the topic.

spamegg1 commented 4 years ago

@Alphyte Here is some additional opinion:

I've finished Advanced Programming and I'm halfway through Advanced Theory. Also finished one and a half Advanced Applications (Scala + half of Fullstack Open).

In my opinion they cannot be organized to build up to a project. They are fairly separate topics that don't mesh together well. Such is the nature of these topics (and electives in ANY subject in general).

As for Advanced Applications, they are very much self-contained (due to how Coursera designed specializations). They can be taken while ignoring the rest of Advanced CS. They are designed to build up to a project by themselves. Let's say there are 5 courses in a specialization; the first 4 handle the build-up, the fifth being the project.

The purpose of CS2013 is to be well-rounded and cover pretty much everything. The only way, as far as I can see, to create tracks to build up to a project, would be to create multiple, much shorter, more specialized mini-curricula, separate from OSSU; obviously this would move far, far away from CS 2013. (One example would be: "Functional Programming Curriculum": How to Code 1,2 + Prog Lang A,B,C + Haskell + (maybe 1-2 other general courses) + Scala Spec. But even this has a lot of repetition in it.)

So I'm against this idea.

I agree with @waciumawanjohi that it would be easier to maintain his idea of Elective CS than to create separate tracks. But I don't like this idea either. It would be more confusing than the current setup.

I think the current Advanced Programming - Advanced Systems - Advanced Theory - Advanced Applications is a good balance between these two ideas: they present some semblance of tracks while also presenting a good selection of elective subsets to take.

More importantly they paint a very good picture of the overall landscape of CS, which is really vast. The current setup greatly alleviates this. You want to be: an Academic? -> go Theory. A Programmer? go Programming. A Systems person? go Systems. Something else? choose an Application.

We should also consider the maturity and the interests of advanced students. While we continue to recommend that they stick to one Advanced subset, they can feel free to mix and match courses from multiple subsets if they like. They will have much more command over their own destiny at that point, strict adherence to the guidelines is not necessary. (This kind of thing happens even in real life universities.) By that point maybe they will have already found jobs and forgotten about "finishing" OSSU, or they will continue to learn whatever they like.

At least this has been my personal experience. I "officially" finished OSSU by taking Advanced Programming then a specialization; but continue in the other subjects (partly as a guinea pig for the community).

I think the current organization is excellent, let's not rock the boat. Don't fix it if it ain't broke, ya know?

I'm probably going to be in the minority on this one. But I will support whatever comes out of this. Best of luck to all of you! :rocket: :+1: :100: :heart: :smiling_face_with_three_hearts:

virtyaluk commented 4 years ago

I honestly don't understand why Haskell, Prolog and Scala programming courses are included in advanced track. They should be considered as an optional side tracks and not advanced. Why there are no good courses on Java and C++?

Compilers should be included in Core CS. It is a base course essentially.

Tim Roughgarden' Algorithms courses are highly dependent on prior knowledge of discrete math, complexity theory and computation theory. You should consider including more depth intro in those subjects before the algos courses or provide an optional course like the one from Sedgewick which is more independent.

Consider adding Blockchain course as part of Advanced apps track.

Thanks.

waciumawanjohi commented 4 years ago

They should be considered as an optional side tracks and not advanced.

In the OSSU:CS curriculum, advanced courses are somewhat optional.

Why there are no good courses on Java and C++?

Haskell and Prolog are included not to teach those languages, but to teach programming language concepts that they embody well. If a better course were found that taught the same concepts in a different language, we would switch.

You should consider including more depth intro

There was a group of contributors that looked at this earlier in the year. Ultimately they made a recommendation to keep the current structure. (Read more here: https://github.com/ossu/computer-science/issues/664)

If you would like to bring together a few other contributors to take another look at how to improve the algorithms & data structures recommendations, I would be interested in reading that analysis.

Consider adding Blockchain course as part of Advanced apps track.

I think a fintech track in the Advanced Applications would be a great idea.

MOSTAFAEZZAT commented 3 years ago

I do really agree with this thread that specializations should be more specific, for example if i want to be a software engineer there is no specific guide in the course after finishing the Core CS. Haskell and Scala after searching i found it's more suitable for making programming languages and compilers which is good for people who want to learn how things have built or beyond the high level programming and that fit with Compiler Course in the Curriculum. So i see @Alphyte new design it's more professional.

Thanks in advance

riceeatingmachine commented 3 years ago

Consider adding Blockchain course as part of Advanced apps track. I think a fintech track in the Advanced Applications would be a great idea.

I would like to nominate teachyourselfcrypto.com for this. It's a website inspired from the OSSU itself and is a complete course on all the big crypto topics. It's free.

I'd say blockchain forms a part of advanced systems.

riceeatingmachine commented 3 years ago

Speaking of reorganization, game theory in advanced theory has a part 2 which is a nice course but not in the curriculum. It requires some basic calculus though (to compute local maxima/minima). Not sure why it's not in the course, given that part 1 is.

riceeatingmachine commented 3 years ago

@waciumawanjohi I read #664 and it seems like one of the issues is that the coverage of Data structures isn't good enough. I found a course specifically focusing on teaching data structures (it's a part of a Data Structures and Algorithms Specialization).

The instructors are quite good, I did their course on Intro to discrete math, which is a part of the OSSU.

I found one review directly comparing the specialization with Roughgarden:

This class hits the sweet spot for people who find Tim Roughgarden's Analysis and Design of Algorithms course too intense and hand-wavy, but who still want mathematically-sound, proof-based discussion of algorithmic techniques. (Listen to Roughgarden's drive-by treatment of Karatsuba's algorithm in his first week of lectures, and you will appreciate Neil Rhodes' coverage of the same algorithm all the more.)