ossu / computer-science

:mortar_board: Path to a free self-taught education in Computer Science!
MIT License
165.57k stars 20.92k forks source link

OSSU v7.0 - suggestions #387

Closed ericdouglas closed 7 years ago

ericdouglas commented 7 years ago

For the next version of our curriculum and beyond, we'll introduce a participative model of reformulation/updating to our curriculum.

Once in a year we will batch all suggestions and make the update of the curriculum (if necessary) at once. This update will be done in 20xx-03-01 (March, 1th) of every year.

Around February, 25 I'll show a "draft version" of the curriculum with such modifications and we'll have some days to discuss it and finish the release that will be done next week/month.

For breaking changes (e.g. course is no longer available), we will update the curriculum any time it occurs. Other than this, the curriculum will only be updated next year.

We already have some suggestion here and here, feel free to comment on this issue with all your suggestions for our next update!

joshmhanson commented 7 years ago

The currently-linked Introduction to Cloud Computing course doesn't seem to exist anymore (the link just goes to the IEEEx page).

I don't know anything about cloud computing courses, but here are a few possible alternatives I found:

Would greatly appreciate comments from people who have taken any of these courses.

joshmhanson commented 7 years ago

In addition to the University of Washington's Programming Languages course I linked in #385, which I suggested as a replacement for what's currently in the Programming Paradigms section, I also found these:

I just finished the Programming Languages course and I can say it is absolutely stellar for comparing and contrasting OOP vs. FP and dynamic vs. static typing. I know nothing about the above linked courses, but I find it interesting that they mention a third major paradigm -- "declarative dataflow" -- and use the educational programming language Mozart.

This pedagogical strategy contrasts with the approach of Programming Languages, which is to teach three very different languages (Standard ML, Racket, and Ruby), which is valuable because some assignments involve porting code from one language to another, to see how they differ in syntax and semantics, but also has the disadvantage that the student has to learn three new languages.

Would love to hear commentary from anyone who has taken the Paradigms of Computer Programming course.

ahmedvip2008 commented 7 years ago

https://forum.freecodecamp.com/t/computer-guide-get-job-ready-with-1-fcc-cert-3-projects-2-courses-and-10-books/64027

https://forum.freecodecamp.com/t/computer-guide-computer-science-and-web-development-comprehensive-path/64470

https://forum.freecodecamp.com/t/computer-guide-web-development-with-computer-science-foundations-comprehensive-path/64516

https://www.fullstackreact.com/30-days-of-react/

https://gist.github.com/royshouvik/a152b1cbd7e44d4d9a62

https://www.codingame.com/home

https://www.interviewing.io

https://bento.io

https://www.coursebuffet.com/degree/computer-science

http://www.theodinproject.com

http://www.webdesigndegreecenter.org/learn-to-code/

http://blog.agupieware.com/2014/05/online-learning-bachelors-level.html?m=1

http://blog.agupieware.com/2014/06/online-learning-intensive-bachelors.html?m=1

https://www.edx.org/course/calculus-1a-differentiation-mitx-18-01-1x

https://www.edx.org/course/calculus-1b-integration-mitx-18-01-2x

https://www.edx.org/course/calculus-1c-coordinate-systems-infinite-mitx-18-01-3x

joshmhanson commented 7 years ago

I just started the Internet of Things course and I'm already halfway through. To be honest, it is pretty bad. It is so shallow and useless that you learn more by just reading the Wikipedia article about the IoT. I don't think it belongs anywhere in the curriculum.

Almost any of the Coursera courses on the IoT would probably be better, but maybe it would be best to just leave it off the curriculum altogether and instead have a separate section after the core curriculum giving recommendations for specializations, e.g.: https://www.coursera.org/specializations/internet-of-things

It's probably a good idea for the core curriculum to at least have one course about embedded programming. I'll look for something and post here if I find anything that looks good.

ghost commented 7 years ago

In response to @hanjiexi:

I also dropped the IoT course, it was pointlessly silly.

I'm taking the https://www.edx.org/course/embedded-systems-shape-world-utaustinx-ut-6-10x course and so far I've like it a lot, you have to buy components, but I don't see how most people would get around that really.

There's also a second course: https://www.edx.org/course/embedded-systems-shape-world-multi-utaustinx-ut-6-20x - I believe the actual UT@Austin course is 1 class that the two parts cover.

joshmhanson commented 7 years ago

After thinking about all the suggestions that I have for the next iteration of the course, I realized that the best way I could show my thought process is to simply fork the repo and make the changes I like. What ended up happening is that I really liked the result, and now I think my forked repo is very close to how I'm going to proceed in my own personal studies.

https://github.com/hanjiexi/computer-science/

Some of the changes I've made are significantly different from OSSU. I definitely don't expect OSSU to adopt all, or even any of them, but in case some of them do interest the OSSU community as matters of discussion, I will describe below the non-trivial ways in which my fork diverges, and include a link to the exact commit where I made those changes.

Changing 'free' to 'little to no cost': I disagree with the requirement that everything be free. In theory, I would say that the colleges and companies that make these courses available deserve to be paid for their work, and it is a ridiculously paltry amount of money that they are asking for compared to the cost of actually attending their institutions. The focus of the curriculum should be on quality, not cost, and I would never replace a superior course with an inferior one just because the superior one costs a tiny bit of money.

In practice, the previous point is irrelevant because virtually everything is free already, and even for those things which aren't free, there are ways for low-income students to obtain them -- e.g., financial aid from Coursera. But I still don't want "free" to be an explicit requirement, this is just strange to me as nothing is really free.

Overhaul of course structure: This is the largest overall change. Basically, I don't agree with making the course structure linear, because I have found it virtually impossible to actually progress through the courses in a linear manner. Courses are never available at exactly the right time for a linear progression to make sense.

And I also prefer to take 2 courses at a time so that my brain has something else it can think about when I get stuck. (This was actually one of the strategies suggested in Learning How to Learn.)

Replacing the math course and adding optional textbooks: I felt the Effective Thinking through Mathematics course was good for what is was, but I don't think it was really relevant to my studies. Stanford's Introduction to Mathematical Thinking provides more of the foundation in formal, logical thinking needed for a study of CS.

I also added a couple optional textbooks after the Nand 2 Tetris classes because those classes don't go into great depth about computer architecture or operating systems. Many programmers probably won't need that much depth, but those who are going to be programming closer to the hardware (i.e. systems programmers) should probably read them.

I probably shouldn't have bundled both of these changes into one, sorry I am still learning how to organize my workflow around git.

Added prerequisites: To support students who choose to take the courses in a non-linear manner, as I have been forced to do, I added a prerequisites section so you know what you need for each course.

Added recommended specializations: My course overhaul resulted in a 'Core CS' section that is slimmer than the current OSSU curriculum, and this is intentional. Some of the classes at the end of the current OSSU curriculum are either low-quality (like the Internet of Things class) or just kind of shallow and frivolous. What I wanted is a Core CS curriculum that represents the best of the currently available, online, general CS courses -- courses that every single CS major should take, no matter what they are going to do later on.

I wanted to balance the generality/broadness of this 'Core CS' section, which appears to be about 3/4 of what an actual bachelor's degree would look like, with a final section that takes a deep dive into a specific subject matter. But the subject the student chooses is up to them. Hence, I added a list of specializations that look particularly high quality to me.

Change from per-course project to one final project: I don't like OSSU's current structure of having each student do a project after every single course for two reasons. First, there are many courses for which a project doesn't seem to make sense -- I can see myself doing a programming project after a programming class, but not a calculus project after a calculus class. The second issue is time. I want to get through this curriculum as quickly as possible; doing a bunch of little projects has a high opportunity cost.

So I rejigged the curriculum to include a mandatory final project that consolidates all of the knowledge one has gained over the entirety of the curriculum. In contrast to a bunch of tiny projects, I think one big project would be far more valuable as it could represent the best of what a student can do, and could therefore be more valuable to future employers.

A few smaller changes:

To reiterate, this is probably far too many breaking changes for OSSU to consider adopting. Feel free to cherrypick what you like and ignore or discuss what you don't.

ganganimaulik commented 7 years ago

Changing 'free' to 'little to no cost': I disagree with the requirement that everything be free. In theory, I would say that the colleges and companies that make these courses available deserve to be paid for their work, and it is a ridiculously paltry amount of money that they are asking for compared to the cost of actually attending their institutions. The focus of the curriculum should be on quality, not cost, and I would never replace a superior course with an inferior one just because the superior one costs a tiny bit of money.

In practice, the previous point is irrelevant because virtually everything is free already, and even for those things which aren't free, there are ways for low-income students to obtain them -- e.g., financial aid from Coursera. But I still don't want "free" to be an explicit requirement, this is just strange to me as nothing is really free.

I agree with @hanjiexi here. We should consider quality over free. If someone is not able pay then a free option should be given as an alternative.

srilman commented 7 years ago

@hanjiexi I really like that you divided the course structure into Core Curriculums, which makes more sense to me than displaying all CS subjects linearly (as OSSU currently does). However, I think (especially for the Core Systems section), it would make more sense to have an "Advanced" or "Elective" version where you could include harder courses that specialize in one subject. For example, an "Advanced Systems" section could include the Operating Systems course and the Computer Architecture course from OSSU 6.0.

Also, I would recommend that OSSU adds the books that @hanjiexi to the free-books.md file.

joshmhanson commented 7 years ago

I do feel that my fork is a incomplete in a few areas, and I like your suggestion as a potential solution. So basically, it could look like this in outline form:

Core CS

'Core CS' is supposed to roughly equal the first 2-3 years studying CS in college, 'Advanced CS' the last 1-2 years, and 'Pro CS' should ideally represent the highly domain-specific and fast-changing skills you gain immediately out of college to get a good job.

I'll work on this, but I fear that finding high-quality resources to populate the Advanced CS section could be challenging.

joshmhanson commented 7 years ago

I'm feeling pretty good about my fork now. Here is a quick summary of substantial changes I've made since my last post:

The only thing I feel is missing is "tracks", meaning, suggested progressions through Advanced CS based on what domain the student intends to focus on (e.g. system programming). But this is not something I really feel prepared to do, since there's a lot of advanced CS topics that don't exist in online courses, and I would want advice from specialists, so I'm going to leave it as is for the time being.

I'd be happy to contribute my changes to OSSU but it's not clear if they are too drastic to be incorporated.

ericdouglas commented 7 years ago

@hanjiexi I truly appreciate your effort to improve our curriculum. You made interesting suggestions and we'll consider everything.

I only need some more time to evaluate all changes and batch them all to our new curriculum version.

joshmhanson commented 7 years ago

Thanks @ericdouglas

Also, I just got an email about this new program: https://www.edx.org/micromasters/software-development

The first two courses in that series are an updated version of "How to Code - Systematic Program Design", with harder quizzes and a required project for every course. Note that you can take the courses for free, it's just graded assignments that cost money, similar to Coursera's new model.

The remaining courses in that series include a course on object-oriented programming as well as an intro to software engineering. This could be great for two reasons:

  1. For replacing the Object-Oriented Programming in Java course that is on both OSSU official as well as my fork
  2. For having an intro software engineering course; currently, the curriculum goes from basic programming principles to the highly advanced engineering course that expects you to have already taken a software engineering in Java class.

I just started taking that OOP in Java course we both have in our repos. It's... okay. It fits well as a beginner-level course and direct follow-up to CS50, but the assignments so far are really easy and lame. The videos are also really low-resolution. When students move from OOP Java to the Programming Languages courses, they will experience a huge shift in both quality of materials (Dan Grossman produces masterfully written notes to complement the material in his videos; I think I will reference these notes for years) as well as challenge in the assignments.

I then started looking for other classes on Object-Oriented Programming and found that this course goes way too far in the opposite direction: it actually seems too challenging to replace OOP Java, and not just because I don't know C++. Plus, the instructors are really hard to understand if playing the video on 1.5x-2x speed. (I say this as an American though; YMMV.)

So these new courses coming out could be just the thing the curriculum needs. I will look more closely at them later and try to figure out where they could go in my fork. For OSSU however, I'm guessing you wouldn't want to include them yet, since they aren't starting until later this year (and the last courses 2 don't even open up until 2018).

TYRONEMICHAEL commented 7 years ago

Thanks to everyone involved in this project. Just curious if we are opting free over quality. I.e if there is a better paid course, as opposed to a free course, are we opting for the free course on the same subject? If this is the case, I really think we need to present the learner with the option of taking either the free version or the paid version.

When are we looking at having the revised curriculum for 2017?

ghost commented 7 years ago

I'm all for "necessary" costs. Paying for materials or books - those things make perfect sense to me. Paying for the base content, I think that is a problem. Paying for grading, that again I'm OK with.

The content of the courses is widely being paid for by grants, mostly federal ones.

I ultimately things @hanjiexi 's direction is good.

MohamedAlsdyaq commented 7 years ago

@xhanjiexi Please have a closer look at the programming languages series course, it really doesnt add new skills to me at all. And the lectures have an atmosphere of boredoom. I dont know if its because SML or becuz im coming from CS50 which is really a great course

joshmhanson commented 7 years ago

@MohamedAlsdyaq The goal of the 'Core CS' curriculum in my fork -- and I think the goal of OSSU overall -- isn't to give us the latest trending skill in software development. For that, we could do something like the "Full Stack Web Developer Nanodegree", or any number of other career-development courses.

The goal is to give us a well-rounded education in computer science, akin to what you would get in a university. Once you have this, it is much easier to pick up new skills, because you will have the practical and theoretical foundations for understanding where every skill fits into the context of broader computer science.

One of the practical and theoretical foundations you need is a strong foundation in understanding programming language paradigms, e.g. functional vs. object-oriented, static vs. dynamic typing, type inference vs. explicit typing, parametric vs. ad hoc polymorphism, strong vs. weak typing, mutability vs. immutability, abstract syntax trees, semantics vs. syntax, etc.

You won't really get this from any other course in the list; you'll encounter paradigms, and use them, but won't deeply understand the meaning and implications of choosing one over another, except in a shallow sense. This knowledge enables you to analyze a problem and determine what programming language will be most beneficial to use to solve it.

Dan Grossman's Programming Languages series is one way to get that foundation. I chose it because it's often regarded as one of the best CS MOOCs ever, I enjoyed it a lot myself, and it corrects some of the errors that CS50's teachers make in some of their off-hand comments about type systems. If you really don't like it, you can try Paradigms of Computer Programming, but I've never tried it, it's meant for more advanced students, and the language they use is even less "relevant" than the languages used in Programming Languages.

Regarding the languages he chooses to demonstrate his points (SML in A, Racket in B, and Ruby in C): a well-rounded programmer should be familiar with a Lisp-derived language (Lisp → Scheme → Racket, and you'll be using Racket in Part B to create your own programming language) and an ML-derived language (ML → Standard ML, OCaml, F#, Scala, Haskell, the latter three are all trending).

Ruby is very popular of course and needs no defense; it's similar to Python which you did in CS50, but your hardest Ruby assignment will be a lot harder than anything you've done so far in Python as it involves implementing double dispatch, a somewhat mind-bending design pattern.

Nevertheless, if Programming Languages doesn't excite you right now, not to worry. That may just mean I shouldn't have put it so early in the curriculum.. So I would suggest skipping it for now, and coming back to it later. I am still debating about where those courses should go in the curriculum; your feedback suggests it should go later, but I hope to hear feedback from others on this too.

TYRONEMICHAEL commented 7 years ago

@hanjiexi thanks for the detailed overview. It makes me want to jump straight into it the Programming Languages course. I think you got the goal of OSSU spot on. When is OSSU looking to revise their new 2017 curriculum? Also is Programming Languages meant to replace How to Code: Systematic Program Design in your fork?

joshmhanson commented 7 years ago

When is OSSU looking to revise their new 2017 curriculum?

I can't speak for OSSU, I think Eric Douglas is still thinking about it.

Also is Programming Languages meant to replace How to Code: Systematic Program Design in your fork?

No, Programming Languages replaces and extends the Programming Paradigms section. How to Code: Systematic Program Design ("SPD") is actually still in my fork under a different name, because its teacher has revised and expanded it with this newly announced series of courses: Software Development.

The first course in that series is a revision of SPD1 and SPD2, and the second course is a revision of SPD3, and all the courses after that are new. So in my fork, I've already removed the old SPD courses as well as the old "Object-Oriented Programming in Java" course which I found to be of poor quality, and replaced them with courses 1-4 of the new series.

I also added courses 5-6 of the new series onto the very end of the Core CS section because it fills a gap that was missing: an introduction to software engineering (i.e. design of a large and complex software system). Combined, I feel these last 2 courses should provide adequate foundations for anyone who wants to take the advanced Software Architecture course (although I haven't yet reached the point where I can verify this course's quality).

csaltijeral commented 7 years ago

Albeit the Structure and Interpretation of Computer Programs course is around 12 years old (and the book is even older), how does it compare with the Core programming courses in @hanjiexi 's fork and the courses in the current version of OSSU? Is it more of a complement to the Core programming/OSSU programming courses?

ghost commented 7 years ago

SICP is little changed from 1992 when they upgraded to version 2 of the course. Actually even at that it's little changed since the original version taught in the 1970s. MIT Students are also being somewhat given an "east" first semester. Berkeley used to teach SICP as well and went off into something else and came back to using SICP on Python as a replacement http://cs61a.org/

Berkeley and Harvard have more non-CS/EE/CE students taking their course than MIT. SICP is much more oriented to functional and mathematics thinking.

MIT has their newer Python course which of course is more data oriented, so it's less about "programming".

They are all good courses, but CS50 has the best "online" aspect in addition to grading the assignments without MIT's "scheduled" nature.

I think from some aspect, CS50 gives you a great taste for programming, but at the same time there is still a gap from CS50 to the other courses which for some of us is going to be easier since we probably already have some level of scripting and programming experience from past endeavors. (In fact some of us playing around with this might have BCS/MSCS degrees and work as professional programmers ...)

joshmhanson commented 7 years ago

@csaltrev The How to Code/Software Development series, which is integrated into my fork, is based on How to Design Programs, which is similar to SICP. From my research (I've never read it myself), it seems that SICP requires some special domain knowledge (possibly in mathematics), so it's less suitable as an introduction. If you already have a strong math background, or you just want to be really hardcore, you can probably learn the same things from SICP as you would from How to Code.

The reason I have both CS50 and the How to Code courses, both of which are introductory and have no prerequisites, is because of differences in content. CS50 teaches imperative programming and manual memory management in C -- not something you're going to be doing in the functional and object-oriented programming you will do in How to Code. I consider both to be essential knowledge.

ghost commented 7 years ago

CS61a's version of SICP mostly addresses the additional math knowledge requirements.

Though remember that in general in the US, CS students at University level have high school level Calculus 1 (differential single variable) and often Calculus 2 (integral single variable) and at MIT if you do not have REALLY good math skills, you are going to bomb anyways, so I don't think that was ever an overwhelming issue for them.

HtDP is really a complete new course that only sort of resembles SICP. (For even more fun, I took an experimental Haskell version of SICP when I was an undergrad at UT@Austin.)

TrueBadur commented 7 years ago

Hello, I've tried to go through the Algorithm part 1 series without knowledge of Java at all, even though I have an idea about OOP and C, I found it quite hard to solve first assignment, so I suggest placing any Java course before the Algorithm course

UDstack commented 7 years ago

When will the V 7.0 will be out ?

ericdouglas commented 7 years ago

Closed due to v7 release