Closed palladian1 closed 2 years ago
I disagree with the proposal, but completely agree with the general, overall ideas. The proposal will lead to even more confusion, and complaints. Learners will ask "how am I supposed to meet these prerequisites? They are not covered by the curriculum". Or "Am I supposed to learn all these other things before I can even take this course? How long would that take? Why does it say 12 weeks then?" and so on... I can't remember how many hundreds of "prerequisites" questions I must have answered. Obviously they are not going to find these RFCs and read them.
So it's not really this proposal's fault, it's the format we have itself that's the problem. The main issue with the "Prerequisites" column in the whole curriculum is that it's very short and creates a lot more confusion than it helps. I'd like us to do away with that column altogether and replace them with "course context" pages. @hanjiexi suggested this to me some time ago (I can't even find them on Github anymore). I can provide long, detailed explanations for many, if not most, courses.
OSTEP is probably the one course that requires detailed contextual explanation the most, out of all courses. I see learners just waltz in to this course all willy-nilly, like it's any other online course, and go like "oh look it's the first project! OK let's go!" then running into so many issues, wasting a lot of time and suffering pain. THIS COURSE IS NOT NORMAL. It's an exceptionally hard topic. Moreover, some of the tools and knowledge required is near impenetrable: you mentioned how hard it is to find a decent C learning resource, or learn all the "dark arts" and technical details for low-level code. Not to mention that it's basically cobbled together from bits and pieces here and there. We still don't have any idea how to do or test some of the projects, because the author does not maintain them. (Also for some reason, along with CS50 and Nand2Tetris, this course seems to attract people from all over the internet who never heard of OSSU before, or did any of the prior courses, to our Discord.)
As such, OSTEP would be the perfect starting candidate to take a crack at creating course context pages.
I think the best solution would be like this: @palladian1 write a long article, explaining all the details you listed here. I think you already have most of the relevant material written down. It should start by saying that this course is unlike others. It would have all the relevant information, with links to resources. You can say "this is the best we think there is" or "this is the best we could find/recommend so far". It can include a realistic discussion of how long it would take to learn all these things properly, and maybe suggest that there is no shame in just reading the textbook and doing the textbook homeworks and moving on, with the projects being more difficult and time consuming optionals, linking to your xv-annotated. You can mention the great benefits of doing the projects, and that the "prerequisites" are significantly lower if one decides not to do the projects.
Then we replace the "prerequisites" with a link to that article, which can be a Markdown file in a folder, like contexts
. This can begin the slow phasing out of "prerequisites" and the phasing-in of "course context pages". Sorry if this feels like hijacking the issue and creating a lot more work for you, but I think this is the best choice. If we're gonna do it, let's do it properly.
I like the alternative proposal by @spamegg1 better overall!
My original proposal was trying to address the problem that the current OSSU curriculum doesn't fully prepare students for OSTEP; the biggest barrier is the C knowledge, but there's also a gap between OSSU's intro systems course (Nand2Tetris) and a systems course like CS:APP that covers all the other prereqs besides C that OSTEP expects students to know. But a "course context" page would let us explain that in more detail, plus we could add links to resources there. We could even host our own version of the OSTEP projects like @spamegg1 and I have been working on, with improved documentation and guides to running the tests on machines besides the UWisconsin lab computers.
I'd be super happy to start working on a "course context" page with all the notes and resources I've collected so far!
I do disagree on two points:
First, I actually don't think OSTEP is much harder than other OSSU courses, if the prerequisites have been met. At first, I found myself struggling with the x86-specific details, looking up hardware specs in old Intel manuals to try to make sense of what was happening in the code. I had to read manpages for objcopy
and objdump
, read Makefile tutorials... it was a lot to learn, and that was just the beginning in order to then be able to understand the actual topics being taught in the course. At the time, that was really frustrating, and it absolutely felt like OSTEP was significantly harder than any other OSSU course before it.
But my opinion changed completely when I found the CS:APP course: it turns out that every single one of those aspects I had struggled with were taught there, in a really clear way. It made me realize that the real problem isn't that OSTEP is impossible because you're expected to figure out x86 assembly function call conventions on your own; the problem is just that OSTEP expects you to have already taken a systems course like CS:APP that would have taught you that. I really wish I'd found CS:APP earlier; that would have saved me so much time. In retrospect, taking OSTEP right after Nand2Tetris without CS:APP in between them feels kind of like if someone tried to take Algorithms right after Py4E; yeah, you can probably figure it out, but it's gonna be a struggle. But once I found the right resources to learn the prereqs, the rest of OSTEP didn't really feel any harder than, say, Programming Languages, Nand2Tetris Part 2, or the Algorithms courses.
There is a caveat: the poorly-documented and unmaintained projects did cause some additional frustration when I couldn't figure out how to run the tests, or when the tests were buggy. But I think @spamegg1 and I have more or less ironed out most of the big issues there, at least for Linux systems. We could document that in a course context page, but we will have to figure out how to run them on Windows and macOS as other students take the course. Still, while it is annoying, I don't think it's too bad -- after all, the Programming Languages courses have similar issues with SML/Emacs in PL A and Ruby versions in PL C, and I definitely had my fair share of problems running the Nand2Tetris tests on Linux. So I think we can handle that either in the course context page or as problems arise,
Second, I disagree about skipping the projects. The course uses the projects as its primary assignments for a reason: the homework questions are just short "reading comprehension"-type questions, similar to the questions that pop up in the middle of videos on Coursera or edX. Many of them are simple demos for you to just watch. I'm a big fan of learning by doing, so I think it's important for OSSU courses to include programming exercises. I think doing OSTEP without projects is comparable to doing the multiple-choice questions in Algorithms without the programming exercises, or doing the in-video questions in How to Code or Programming Languages without any of the problem bank questions or homeworks. Plus, the ability to see the actual implementation of a simple Unix-like OS in xv6 is, for me, a big attraction of the course.
In addition, although I do agree that skipping the projects would shorten the time required, I don't think it's that big of a difference. It would remove some of the prerequisites like Makefiles and some of the x86-specific details (at the expense of losing the opportunity to understand how paging, context switches, interrupts, locks, etc. are implemented). But I think the biggest time sink by far is getting the required C knowledge, and that's actually just as important for the course as it is for the projects: without knowing C well, the vast majority of the material would be inaccessible. So I don't think removing the projects cuts down on the prereqs by much; if students have indeed learned enough C to understand the code examples in the lectures, then it wouldn't cut down on the time by much more than the normal amount of time it takes to do any assignment.
Completing the prereqs will take significant time, mostly spent learning C. Since this is the only course in the curriculum that requires C (although Computer Graphics requires C++), I think we can definitely expect that students in a time crunch (or students who aren't particularly interested in systems development) might decide not to do the projects, or might even skip OSTEP altogether, and I agree -- there's no shame in that.
The difference in my mind is that by affirmatively recommending the projects, the official OSSU curriculum will still meet the CS 2013 guidelines, especially for the Core-Tier2 hours, which I don't believe would be met with the homeworks alone. Then students can make their own decision about whether to stick with the official curriculum to meet the CS 2013 guidelines, or to cut out some parts of it.
Alright, I think those are good points.
I've probably built up the difficulty too much in my head, and the course should be easier with our contributions and your roadmap through the projects. That is true.
I still think the book and homework alone cover the curriculum requirements, but I might have to do a deeper look into it. If the projects are doable and not too time consuming, there is no need to fight over this point.
Taking your disagreements as valid, could you make an accompanying pull request @palladian1 ? If you put fixes #926
in the title, Github will automatically pick it up and link it to this issue. It can give a better idea to other commenters. No rush, take your time.
@palladian1 will be offline for a few days, but worked very quickly and very hard to provide me with an early draft of the context page. I think it looks great. Here it is for other commenters to see:
This looks like a well reasoned deep dive that should assist students in being successful in the course. I like the idea of having this as a linked page in the repo, which gives future students the ability to make pull requests as needed.
A breadcrumb for other readers of this RFC: the CS:APP course that palladian1 refers to as very helpful above is the same as the Computer Systems: A Programmer's Perspective course/textbook in the context draft.
The context draft is great!
Suggestion regarding the “Running the projects” section. Right now, the draft provides some guidance for running projects on a Mac or PC, with a mention that some students use VMs. Have you considered primarily recommending a cloud VM (such as GCP Compute Engine or AWS EC2)? Along with the recommendation, a setup script could be provided to configure and install necessary dependencies.
The benefit: students will start with similar environments. This mimics the original college course where students were provided with preconfigured VMs. I assume this eliminates issues and questions related to unique setups.
The 2 downsides: cost (although It should be less than $10 a month); those unfamiliar with cloud computing concepts may have difficulties (although some simple guides could help).
For C: The instructor's website lists this book for learning C.
@riceeatingmachine It's included in the draft under Resources/C/Additional(optional) resources. @palladian1 and I discussed it for a while, and we anticipated a lot of people mentioning K&R like you just did :) K&R is highly revered for obvious historical reasons (some people get upset if it's not the default recommendation) but it's old and outdated, not free and it can be hard to find a copy. We noticed there are too many options, and the "best resource" debate can go on forever, so we decided to reduce the options to two: one great free resource, and one arguably best non-free resource. (This idea is similar to how the curriculum had "Learn You a Haskell For a Great Good!" and "Haskell Programming from First Principles" back in the day.)
That tracks with a quick check: K.N. King's C Programming: A Modern Approach has hundreds of ratings on both Amazon and Goodreads, which should give us fair confidence that they are a valid signal. Those ratings are almost equal to K&R's ratings on Amazon and Goodreads. And A Modern Approach was published about 20 years after K&R's most recent revision.
I had an idea. There are 3 courses in Advanced Systems:
Digital circuits covers:
How to efficiently and reliably encode information using bits The basics of digital signaling, combinational logic, CMOS technologies The principles of sequential logic and finite state machines Performance measures and design tradeoffs
Computer Architecture covers:
Instruction Set Architectures: datapaths and FSMs, programmable datapaths, the von Neumann model, storage, ALU instructions, constant operands, memory access, branches, jumps.
Assembly Language: from assembly language to binary, symbols and labels, instruction macros. Models of Computation: computability, universality, uncomputable functions. Compilers: interpretation vs. compilation, compiling expressions, compiling statements, compiler frontend, optimization and code generation. Procedures and Stacks: procedural abstraction, activation records and stacks, stack frame organization, compiling a procedure, stack detective. Building the Beta: circuit building blocks, ALU instructions, load and store, jumps and branches, exceptions. The Memory Hierarchy: memory technologies, hierarchical memory systems, the locality principle and caching, direct-mapped caches, block size, cache conflicts, associative caches, write strategies. Labs: simple assembly programming, Quicksort procedure, designing the 32-bit Beta processor.
Computer Organization covers:
Pipelined Beta: pipelined execution of instructions, data and control hazards, resolving hazards using bypassing, stalling and speculation. Virtual Memory: extending the memory hierarchy, paging using hierarchical page maps and look-aside buffers, contexts and context switching, integrating virtual memories with caches. Operating Systems: processes, interrupts, time sharing, supervisor calls. Devices and Interrupts: device handlers asynchronous I/O, stalling supervisor calls, scheduling, interrupt latencies, weak and strong priority systems. Processes, Synchronization and Deadlock: inter-process communication, bounded buffer problem, semaphores for precedence and mutual exclusion, semaphore implementation, dealing with deadlock. Interconnect: the truth about wires, point-to-point vs. shared interconnect, communication topologies. Parallel Processing: instruction-, data- and thread-level parallelism, Amdahl’s Law, cache coherency. Labs: optimizing your Beta design for size and speed, emulating instructions, extending a simple time-sharing operating system.
This stuff is covered by a book called Computer Organization and Design (much of) which I read last year. We could replace these courses with that book (I haven't read CS:APP but I think it would overlap as well).
We can replace these courses by either of these books and make that a prerequisite for OSTEP.
Note that the CO&D book requires the student to have completed Nand2Tetris 2 (because it assumes that you know how stacks etc work - it would be really difficult to understand the book if you haven't done Nand2Tetris before).
These books are also in the recommendations of teachyourselfcs.com and they recommend them as prerequisites.
Our favorite introductory book is Computer Systems: A Programmer's Perspective
Once you feel comfortable with the content of Nand2Tetris, we suggest either returning to CS:APP, or considering Patterson and Hennessy’s Computer Organization and Design, an excellent and now classic text.
The most significant “pre-requisites” in our opinion are: computer architecture before operating systems or databases, and networking and operating systems before distributed systems.
If we add a C book to the curriculum, it can be listed as a pre-requisite to the Compilers course, which mentions:
An optional course project is to write a complete compiler for COOL, the Classroom Object Oriented Language. COOL has the essential features of a realistic programming language, but is small and simple enough that it can be implemented in a few thousand lines of code. Students who choose to do the project can implement it in either C++ or Java.
Since it as an advance and elective course, I presume people taking it will want to the final project. If you know C then using C++ should not be so hard (I presume).
There are 3 courses in Advanced Systems... We could replace these courses with that book... and make that a prerequisite for OSTEP
This seems like a bigger discussion (replacing multiple courses with a textbook). Great contribution to point out another book that may suit as prerequisite preparation for OSTEP. I'd suggest keeping that separate from replacing other courses in the curriculum (a topic that could become its own RFC).
If we add a C book to the curriculum, it can be listed as a pre-requisite to the Compilers course, which mentions: An optional course project... implement it in either C++ or Java.
I'm wary of listing a C textbook as prerequisite because there is a project that students can do in a related language.
@palladian1 Lots of great comments on this RFC. Can you open a pull request with the changes you've envisioned, incorporating any changes you feel are right based on the feedback above?
My hypothesis is that it will be more maintainable to have a single context page, that is meant to provide context for any course that needs it, with only the single entry for OSTEP in it. When later contributors wish to add context for another class, they can add an entry in that one file. (An alternate approach would be a folder for context files, and each course gets its own context file). Either way, I recommend against creating empty entries/files for the other courses in the curriculum (which would be a maintenance headache when a course in the curriculum changed).
I'd suggest keeping that separate from replacing other courses in the curriculum (a topic that could become its own RFC).
I don't mind making the RFC but I'm haven't taken the 3 advanced courses yet to do a full comparison.
It's been many months since a PR based on the discussions here was invited. And there is now another RFC around the idea of adding context to courses (including OSTEP). https://github.com/ossu/computer-science/issues/976
In light of those facts, I'm closing this issue.
Problem: The prerequisites listed for OSTEP do not reflect the background knowledge needed for the course.
Duration: 1 month
Background: The current listed prerequisites are "algorithms, familiarity with C is useful".
I took all of Core Theory before returning to OSTEP, but I found that none of the material from the algorithms courses was necessary to understand the course. I know real-world operating systems make heavy use of data structures and algorithms, but that's not the case in OSTEP. The lectures and homework assignments treat operating system concepts very generally, and the projects (where those concepts get applied) do not require any algorithms knowledge to complete them.
I recommend removing algorithms from the list of prerequisites. One advantage would be that students could now move through the OSSU curriculum from top to bottom as listed instead of jumping around between Core Systems and Core Theory. It might also make it easier for students to finish Core Systems sooner, as an integrated unit. One disadvantage I can think of is that the algorithms sequence might provide additional coding maturity needed before tackling OSTEP.
On the other hand, OSTEP has other prerequisites that aren't listed on the OSSU page. The OSTEP instructor explicitly states some of them in one of the early lectures: he assumes that students have taken a course on x86 architecture, are comfortable reading (but not necessarily writing) x86 assembly, and have some experience using systems programming tools like Makefiles,
gcc
flags, linker scripts forld
, and theobjcopy
andobjdump
utilities. I think it's possible for students to get by if they've taken Nand2Tetris, but familiarity with the above prerequisites would certainly make the course much easier.The course also assumes deep knowledge of C, which is not reflected in the phrase "familiarity with C is useful". For example, the instructor identifies the
initial-utilities
project (where you implement shell utilities likegrep
,cat
,zip
, andunzip
) as an indicator of a student's readiness to take the course; he even recommends that students (at UWisconsin, where the course was originally taught) who take longer than 60 minutes to complete it should schedule an appointment with him if they want to continue in the course.Overall, my solutions to the assignments required C features like
#pragma
directives, bit-fieldstruct
s (and bitmasks and bitwise arithmetic in general), POSIX threads and locks, function-like macros, function pointers,extern
/inline
/static
keywords, C preprocessor directives in assembly files, etc. Students are expected to identify some C standards (e.g., that signed integer overflow is undefined behavior while unsigned integer overflow is defined and just wraps around back to zero). None of these were covered in the course or book (except for threads and locks, but the assignments assumed experience using them before the lectures or book discussed their implementations). They also weren't covered in CS 50. I found most of these features in the "advanced" chapters of C books I had read before taking this class, and I don't believe I would have been able to finish the course if I didn't already have a good amount of experience in C.That said, it's definitely not my intention to say that OSTEP is a poor course for OSSU. It's still the best online OS course I've seen so far (and much easier than Hack the Kernel), with a complete set of lectures, a free textbook, and complete assignments (though admittedly, the tests are occasionally buggy and the assignments repo isn't maintained).
But I do believe the listed prerequisites should reflect the additional knowledge the course requires, especially since that knowledge isn't provided by other courses in OSSU, so I would recommend adding language identifying these prerequisites. One obvious drawback is that acquiring the required knowledge might add to the time it takes for OSSU students to complete the curriculum, but I think that's outweighed by the advantage of being frank with students up-front about the prereqs. I think that once students have met those prereqs, OSTEP should be about as challenging as any other OSSU course; without them, it becomes overwhelmingly difficult. (To my knowledge, only one other OSSU student has completed the OSTEP course, compared to the dozens who have completed Nand2Tetris.)
One last note: I definitely agree that OSSU shouldn't add courses to the curriculum just to teach a specific language, but I don't think the prerequisites should link students to hackr.io either. That might be great for other languages, but I think C is sort of unique due to its many pitfalls and the ease with which one can introduce serious bugs and security vulnerabilities in C code. I've found errors and insecure coding practices in the C tutorials listed on hackr.io as well as websites like GeeksforGeeks and TutorialsPoint. I recommend either removing the link altogether, or alternatively, pointing it to a list of recommended C resources that we know are (relatively) good/safe.
Proposal:
After these changes, the prerequisite list might look something like this: "Nand2Tetris, extensive C experience; familiarity with x86 assembly is useful".
Alternatives:
extras/readings.md
.If either of these alternatives is preferred, I'd be happy to contribute the resources that I found useful for OSTEP.