ossu / computer-science

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

Ranking topics in Computer Science Theory #461

Closed waciumawanjohi closed 4 years ago

waciumawanjohi commented 6 years ago

I noticed that Advanced Theory does not include a course for Information Theory, which seems to be a short-coming. At the same time, there are many topics in Computer Science Theory, so the curricular aim should be exposure to the most important topics.* Which begs the question, what are the most important umbrellas of CS Theory?

waciumawanjohi commented 6 years ago

In the short term, I will note that there are two Coursera courses on Information Theory: Information Theory Cryptography and Information Theory

There are also at least 5 other sets of lectures (some with textbooks) on info theory. https://www.quora.com/Where-can-I-find-good-online-lectures-in-information-theory

Emp3404 commented 6 years ago

Cvnbbvb8v

joshmhanson commented 6 years ago

Which begs the question, what are the most important umbrellas of CS Theory?

This is something that I have been trying to do for months. I keep taking a crack at it and then scrapping my work; it's what's held me back from adding anything to that re-organization topic I created months ago (#422). I did indeed put information theory on one of the several lists I created, but I'm not sure how important it is for the curriculum.

The problem is categorization. For someone who loves clean and well-organized taxonomies, there is no canonical way of putting some theories in one box and other theories in other boxes. That makes it extremely difficult to break things down into the major "umbrellas". In fact, you can't even firmly put things in the realm of computer science. The Wikipedia page you linked for example describes information theory as "a branch of applied mathematics, electrical engineering, and computer science".

The other problem is that computer science, defined by Alan Perlis as the "science of processes", is a vast field. At the moment our curriculum is still using "computer science" as a euphemism for software development, even though actual computer science has nothing to do with computers... The reality is that there is no way you could do an in-depth study of all the major domains of computer science in a reasonable length of time. Not that this is a problem; no one expects undergrads to have PhD-level understanding of these problems. I think I would just prefer if we called our curriculum "software development" or something of that nature, so that we're underselling it rather than overselling it.

Here's where my thinking is right now: I want to make OSSU's curricula a lot more modular, narrowing the focus of the Computer Science curriculum down to just a few major elements, but treating them with greater depth, and then have separate curricula for other major domains that the current CS curriculum doesn't address to any sufficient depth. That would mean:

  1. Pull the calculus and linear algebra courses out of the CS curriculum and put them in a separate curriculum called "Foundations" (or similar), which could be shared as a pre-requisite to all of the OSSU courses
  2. Take many of the "Applications" pieces and have separate curricula for some of them
  3. Decide what major subjects to focus on in the CS curriculum and what to split out into a separate curriculum (e.g. "Software Engineering" as distinct from "Computer Science")

What do people think of this?

waciumawanjohi commented 6 years ago

I certainly support work to make the curriculum less linear, as long as it continues to give adequate guidance for how to reach one's goals.

I would want to tweak idea 1. Different areas of CS are going to need different depths of math. It seems entirely possible to be a software engineer whose calculus is fuzzy, while if you're studying information theory, you'll want to have probability nailed and if you're doing anything related to graphics you'll want to know linear algebra well. I think the problem with a Foundations section is that individuals won't know which math courses they need. It seems very appropriate to help students sequence their math courses so that they take them as they are about to become applicable.

Math could still be pulled out into its own section, but we'd want to be clear in the CS section about which math courses to take (and when) on paths through the curriculum.

  1. When you say applications pieces, are you talking about Advanced Applications? Or something else? Those feel largely separate as they are.

  2. On this, I think we should ask the people that are finding OSS what their goal is. I fully recognize that much of the core programming classes that the curriculum covers wouldn't necessarily be covered by a university CS department, many departments would expect learners to pick that up on their own. But if those are topics that most OSS students find valuable (if, say, most OSS students plan to work as software engineers rather than as university researchers), we should make sure our recommendations in that area comes through loud and clear.

You stated that you were interested in treating a few major elements with greater depth. I'm curious which elements those are.

joshmhanson commented 6 years ago

I would want to tweak idea 1. Different areas of CS are going to need different depths of math. It seems entirely possible to be a software engineer whose calculus is fuzzy, while if you're studying information theory, you'll want to have probability nailed and if you're doing anything related to graphics you'll want to know linear algebra well. I think the problem with a Foundations section is that individuals won't know which math courses they need. It seems very appropriate to help students sequence their math courses so that they take them as they are about to become applicable. Math could still be pulled out into its own section, but we'd want to be clear in the CS section about which math courses to take (and when) on paths through the curriculum.

These are good points that I agree with, though I should clarify that I don't mean pulling all math out of the CS curriculum. Discrete mathematics probably shouldn't be pulled out at all, unless it is truly needed in most other curricula.

When you say applications pieces, are you talking about Advanced Applications? Or something else? Those feel largely separate as they are.

I'm saying that subjects like Machine Learning, Artificial Intelligence, Computer Graphics, Cryptography, etc., are all so big in and of themselves that they might as well be split off into their own independent curricula, assuming that there is sufficient material to support them. I believe that such material could be found if we were willing to look hard enough and if we were willing to admit non-traditional resources, such as academic papers, etc.

On this, I think we should ask the people that are finding OSS what their goal is. I fully recognize that much of the core programming classes that the curriculum covers wouldn't necessarily be covered by a university CS department, many departments would expect learners to pick that up on their own. But if those are topics that most OSS students find valuable (if, say, most OSS students plan to work as software engineers rather than as university researchers), we should make sure our recommendations in that area comes through loud and clear.

I fully support collecting more information about the people who are taking the curriculum. That would enable us to focus our efforts on whatever will bring the most value. I would still want to make sure that the name of the curriculum accurately matches whatever the students are looking for, and I have a feeling that computer science isn't what most are looking for.

You stated that you were interested in treating a few major elements with greater depth. I'm curious which elements those are.

My thoughts on this are still in a very early stage. One thing I'm pretty certain of is that OSSU is not really appropriate for an academic approach to computer science. If you want to go into academia and study super-theoretical computer science, you really do need to be going to a university and doing some research under the guidance of a professor.

On the other hand, it seems to me that someone who just wants to be a little worker bee who sits in a cubicle all day writing getters and setters wouldn't have sufficient intellectual curiosity or motivation to study computer science on their own, and would also be very likely to want to have some kind of "brand name" university on their resume, not OSSU.

Based on my own feelings, my assumption (and I could be wrong) is that OSSU students are not interested in becoming academics, but also have far greater self-motivation and intellectual curiosity than your average CS student. If this assumption is correct, then OSSU CS needs to find a sweet spot between the theoretical computer science and applied computer science.

Maybe that sweet spot is to focus on programming and large-scale program design, require extensive development of portfolio projects, but demand the kind of mathematical/logical rigor that isn't typically needed for low-wage "code laborers". Coding bootcamps are sufficient for those types of jobs; we should differentiate ourselves by preparing exceptional students for exceptional jobs.

amorriscode commented 6 years ago

I like this discussion and where it is going. At first I was worried about the idea of pulling things out into their own curricula because that sounds like more work than maintaining a really solid CS path. However, the idea of preparing exceptional students for exceptional jobs is exactly what drew me to OSSU in the first place.

I have been to a programming bootcamp, and I do have a job programming. However, I don't want my knowledge to be the ceiling for my career. I don't want to work in academia either. I am just one student, but for me this path has always been the exciting idea that I can expand my knowledge and career on my own time, for free (or affordable costs).

fractalbach commented 6 years ago

As a thought experiment in "ranking topics" in a non linear way:

What if courses were treated as nodes, and prerequisites as edges. Core classes would be located in the middle, and more advanced classes away from the middle.

This could help learners to create a map of their learning (or a path). This would be especially useful for those want to learn specific topics, but don't know where to start, or don't know what the prerequisites are.

Once a graph of many classes has been formed, recommendation pathways could be created. "Solid foundations" could cover many introductory courses, enabling one higher mobility through the graph (setting somebody up for many different options depending on their future interests).

"specialized" pathes would cover only the prequisites needed to reach a specific node. This would be ideal for those who may already have solid foundations, or are professionals wishing to learn about an emerging topic.

A bonus to having this sort of model is that learners could enter the graph and easily enter in the knowledge they already have. Gaps in knowledge could be quickly identified, and Planning a learning path would be easier with this visualization.

I think a graph model is more natural for the planning phase of learning, and for the visualization of the many topics that relate to computer science.

meboler commented 6 years ago

In a much more in depth version of this graph structure, what if the graph had topics as nodes and prerequisite topics as edges rather than classes? The classes and resources would be linked to topics rather than being the nodes themselves. The benefit of this structure would be the ability to work through relevant sections of classes or books rather than being encouraged to work through their entirety. I see this as making the curriculum much more useful for students who have a specific goal in mind, but potentially making the curriculum unnecessarily complicated for those with less prior knowledge.

I think the current structure is clear (but perhaps slightly intimidating) to beginners but ponderous for students trying to enter it with a moderate level of programming experience. Say I've completed an introductory programming class and then worked on a hobby project for 6 months. Maybe I feel like I've gone as far as I can by googling around and need more instruction. Presumably from my experience I have a topic or two I want to work towards, but the current layout doesn't really give me a way to get there. I know what I know, and I know what I want to know, but I don't know which classes my knowledge/lack of knowledge mean I need to take/skip.

Totally just throwing this out there. I'd strongly hesitate to make the curriculum harder for new students in exchange for clearer usage by semi-experienced ones.

fractalbach commented 6 years ago

The Graph

Motivated by <3 emojis, I set to work upon an example of this graph visualization. the result looks something like a skill tree from a video game, crossed with a flowchart of buggy software riddled with circular dependencies. Enjoy!

This is just one possible layout of the node/edge idea. The important concept is the existence of multiple types of edges, and lot of links:

Different Kinds of Edges

About this Example

Some notes, specific to this example.

I was mostly trying to point out the different ideas mentioned in Different Kinds of Edges, especially the circular link, which I think could be used to traverse through the graph in interesting ways.

The Example Diagram

untitled diagram

Notes

I noticed several things after mapping this out, which led me to the idea that it might be best to have Different ways of visualizing and planning each section:

Conclusion; TLDR;