From a364a1774494570778003bd139f9e03af4c24c4d Mon Sep 17 00:00:00 2001 From: Julian Spring Date: Thu, 16 May 2024 08:46:17 +0200 Subject: [PATCH] update (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add security courses on a provisional basis. See https://github.com/ossu/computer-science/issues/639 * Include link to HtDP book and problem sets * Update readings.md * Added link to HW for Intro to Parallel Programming Intro to Parallel Programming's grader is broken, it's impossible to submit programming assignments. It's also impossible to compile and run the code on your PC, unless you own an nVidia GPU. Thankfully some nice folks on Github created a Google Research Colab page where you can compile and run your homeworks (unfortunately the Final Exam is not available and probably never will be). I understand this uses Google's GPU sharing. * Remove dead link * Simplify table of contents * Fix spelling mistake * Links to prerequisites courses added * Move courses to advanced Change the Haskell course suggestion. A big thank you to @aryzach for prompting the switch. Move courses to advanced programming. See Issue. Closes #669 * Move curricular guidelines out of extras. * Clarify that CS2013 is the curricular guidance for OSSU Resolves #679 * Add The Missing Semester Resolves #678 * Replaced Hack the Kernel with OSTEP Implementing the proposal from issue 690: https://github.com/ossu/computer-science/issues/690 * Add note to Changelog that curriculum is > v8 and < v9. Resolves #674 * Replace LAFF with MIT's OCW Scholar Linear Algebra Resolves #693 * Reflect addition of new Intro section. * Make note more prominent * updated Software Engineering prereqs and added relevant FAQ * Update README.md * Update link to curricular guidelines * Remove link to dead domain * Update link for Compiler Construction * Change Programming Languages Part A Prereq Resolves 716 * How to audit the intro to programming courses Resolves #724 * Updated PROJECTS.md Finished Specialization, using its Capstone as Final Project * Update README.md * Update OS Course Version Resolves #707 * Update README.md * Update README.md Removed LAFF, changed Parallel Programming * Update courses.md Moved Intro to Parallel Programming to Extras * Update readings.md Removed Sheldon Axler's "Linear Algebra Done Right (FREE)" because it is no longer free after the end of July 2020. It was made free temporarily due to COVID-19. * Python for Everyone > Python for Everybody The course, book and website all say everybody instead of everyone. Just a little nit I noticed. * Switch Python for Everybody link Students regularly ask in Gitter how to audit Python for Everybody (Py4E). The instructor of Py4E has created a free version on a standalone site. This has been the alternate link. Instead this should be the main link. * Replace previous Probability course Added a new probability course called Stat110 from Harvard, and moved the previous one to the extra courses page. * Update README.md * Add new question to FAQ Tighten language on some FAQ answers * Rearrange order of FAQ questions * Simplify Intro to Programming Resolves #763 * Raise duration estimate to match Coursera's estimate * Course listing should match course title * Update .gitignore * Use Stanford Database courses Stanford Database courses had long been part of the OSSU curriculum. When Stanford pulled down their platform Lagunita, OSSU had to find a new offering. With the Stanford material back on edX, OSSU should return to this high quality offering. Resolves #718 Resolves #709 * Change chat from Gitter to Discord * Add 'Discussion' header to Core Math and Core Systems * Re-add newsletter link * Remove unnecessary coursework from Advanced Systems. Resolves #772 * Delete reference to cohorts repo. Cohorts repo was closed after an RFC. Resolves #780 * Removed redundant note from Advanced Systems The note was referring to Electricity & Magnetism classes, which were removed. * Update HELP.md A server admin will have to enable the discord widget in the settings for the discord server * Update help.md [#173862703] Authored-by: Waciuma Wanjohi * Replaced FutureLearn pre-calculus with Khan Academy - To be more consistent with our Khan Academy recommendation elsewhere in the curriculum - also some students expressed confusion with the FutureLearn course * Added link to Interactive Exercises from Kurose-Ross textbook website * Update FAQ language and order [#173862703] Authored-by: Waciuma Wanjohi * Use Discord Widget [#173862703] Authored-by: Waciuma Wanjohi * Update math prereq columns * Changed Py4E hours of effort to match OSSU expected weekly effort levels * Removed errant submodule added on prior commit * Prerequisite section mention of high school math links to FAQ * Remove dead link. Resolves #795 * Move the Missing Semester later in curriculum Resolves #778 * Clarify that OSSU is not working in partnership with any org to offer degrees. * Fixed Advanced Systems dead links * Match recommended calc to course listed prereqs https://www.edx.org/course/introduction-to-probability 'Familiarity with U.S. high school level algebra concepts; Single-variable calculus: familiarity with matrices, derivatives and integrals.' * replace dead link Fix for [computer-science/issues/825](https://github.com/ossu/computer-science/issues/825) * Update Newsletter Address * Add link to completion estimate chart Discord user crokei26#1613 created an initial version of this great resource. A huge thanks to them! * Removed Formal Concept Analysis (fixes #818) - fixes #818 - removed `CUDA` and `GPU programming` from topics (left over from before) * Direct Py4E students directly to the lessons * Switch Math for CS from OCW to OLL Implement #832 * add two new books on systems * Add section to FAQ about alts * Sharpen FAQ answer language * Remove direct link to issues We often get issues opened that are empty, with no text or description of a problem. This may be because learners follow the link from the Community section, and post in order to interact. By removing the link (but keeping the link to the contributing instructions) we can hopefully direct new learners in how to interact productively. * Move CS50 to Courses/Extras Resolves #833 * Remove prereq not mentioned by course creators * Remove topic that is not covered in the section * changed the discord invites Changed the 2 invite links (one inside the svg) to direct to the #welcome discord channel. Also changed some relevant language. * Update Game Design specialization Bump to new version * Include edX financial aid information * feat: Change order of database courses * Update issue templates * Changed link to Effective Thinking Through Mathematics course in extras (issue #870) (#871) * Changed link to Effective Thinking Through Mathematics course in extras * Delete .DS_Store Co-authored-by: Jonathan Hustad Co-authored-by: waciumawanjohi * updated Prolog link, added PDF version (fixes #868) (#873) * updated Prolog link, added PDF version * updated Prolog link, added PDF version - removed `Text` column, added footnote instead * updated Prolog link, added PDF version - parentheses * updated Prolog link, added PDF version - added link to book source code * Updated links to both HtC Simple and Complex Data * Added alt link to ocw version of 6.002 in extra courses (#885) * added OCW alt link for 6.002 in extra courses * fixed parenthesis * Update books' editions * Updated the links for books that have a newer edition. I have included the authors' home page for the book where possible. * Updated some titles to reflect the linked edition. I have maintained the original format (``2e`` for the books in the ``Programming`` section ``(2nd Edition)`` for the books in the other sections). Unifying the format could be something to consider. * More realistic estimate for OS course Hi, I am currently taking this course and I am about half way into it. I already have a CS degree and I've been working as a developer for ~8 years. The course is very interesting and comprehensive. If you want to do this course properly, I think 6 hours per week for this course is bare minimum: - There are ~3 hours of lectures each week - The original course is split into 14 weeks - Each chapter has homework at the end of it - Homeworks are not very difficult, but some of them require significant amount of work - Projects require significant amount of work * Update other_curricula.md Add new curriculum (writing started Summer 2019) See more: https://github.com/functionalCS * Reflects locked down CS Timeline Spreadsheet * Spreadsheet link prompts users to make a personal copy * Remove course that is no longer offered Resolves #907 * Make Calculus Required closes #841 * Change calculus recommendation to OLL and OCW Resolves #838, #886 * Change Networking course to Kurose-Ross Resolves #887 * Evaluation section update Change language to encourage students to be proactive in seeking feedback for projects. * Advanced Applications subsumed by Project Clarifies that the advanced application list is a subset of a larger, unspecified, set of adequate options. Advanced Applications was listed as a precursor and possible replacement for the final project. This merges the two and specifies that students may choose another avenue for creating a capstone project. Resolves #830 * Update core math blurb Resolves #921 * Removed Project with Dead Link 1. Removed Binary Machine project as repository link results is dead. 2. Fixed link to applications block. * Update Team * extras/courses: Add Introduction to Computational Thinking by MIT As noted here #912 adding this course to The Math section * Add Algorithms by Sedgewick Add Algorithms by Robert Sedgewick on the basis that it's a freely available book from a reputable institution (it's the textbook for the Princeton Coursera courses). That being said, I haven't had the chance of reading the book so I can't personally comment on its quality. * Commit for RFC at issue #933 (#945) * Commit for RFC at issue #933 Added by error Co-authored-by: Harsh * Add The Linux Command Line book to Tools section in extra readings * Switch 3b1b Linear Algebra from pre to corequisite (#927) Switch 3b1b Essence of Linear Algebra from prerequisite of MIT Linear Algebra to corequisite * Add interesting/useful reading resources (#941) * fix: updated Computation Structures 1,2 & 3 links (#953) * Add books, fix formatting * Add Ethics Course Ethics being a very important education in field of computer science. CS 2013 Says, while technical issues are central to the computing curriculum, they do not constitute a complete educational program in the field. Students must also be exposed to the larger societal context of computing to develop an understanding of the relevant social, ethical, legal and professional issues. This need to incorporate the study of these non-technical issues into the ACM curriculum was formally recognized in 1991. * Update README.md * Update Ethics Course Discord Links * Fix link formatting * fix some links * extras/books recommends Linear Algebra for Everyone closes #910 * Add puzzles-practice to extras Closes #783 * Added Intro to Numerical Analysis Added Introduction to Numerical Analysis by HSE, a CS2013 Elective Course. * Added alternative to Intro to NumAnalysis. Added MIT18-335J as an alternative to Introduction to Numerical Analysis. * Swapped Core security and Core applications links in the curriculum index to reflect the order of the page. Added a link for Core ethics to the index. Updated some capitalization. * Add answer on finding courses * Add cs-video-courses * Add link to goodreads in FAQ * Remove alternate course that is no longer offered. * Update README.md * Fixes typos * Update full stack open hours/week https://studies.cs.helsinki.fi/stats/courses/fullstackopen According to the course stats, every part takes at least 15 hours to finish on average. * update MathForCS dead alternate link * Remove note on provisional status Having closed the [RFC: Add Security Courses](https://github.com/ossu/computer-science/issues/639), it is time to remove the provisional label from the Core Security section. * Replace Numerical Analysis Course Resolves #1006 * Typo fix * Fix typo * Math for CS 2010, 2015/2019 solutions * Add DSA Textbook to Extras Thank you to @hamzakat Closes #994 * alternate links for Computation Structures * alternate links for Computation Structures improved formatting * added OSTEP course page * added OSTEP course page fixed typo * added OSTEP course page fixed typos, removed/updated links * added OSTEP course page updated prerequisites on README * Replace discontinued Intro Sec Course [Information Security: Context and Introduction](https://www.coursera.org/learn/information-security-data) has been discontinued. Replacing with [Cybersecurity Fundamentals](https://www.edx.org/course/cybersecurity-fundamentals) Resolves #1041 * Update README.md * Update README.md * Add information security link to table of contents * hints and tips for OSTEP Project 2A * Rename intro file in directory to README.md Users browsing the directory structure will better understand which file to read first. * Fix typo Small typo fix * Update PROJECTS.md Reword the top description of PROJECTS.md to make it more clear what this section is about. * Swap Intro CS from edX to OpenCourseWare * change Logic course * Update LICENSE copyright year Signed-off-by: Ariston Lorenzo <4tl0renz0@gmail.com> * Improve links From a suggestion by @Alaharon123 here: https://github.com/ossu/computer-science/issues/1078#issuecomment-1264661548 * Update exercism url to point to the current url * Add 2011 Berkeley SICP in Scheme to extras Since the Scheme version remains arguably as/more popular * Update PROJECTS.md * Update PROJECTS.md * update How to Design Programs textbook link * Update courses.md * Update courses.md * Update courses.md * Update courses.md * added resource explaining xv6 code for OSTEP * added resource explaining xv6 code for OSTEP fixed typo * Clarify OSTEP Options Direct most students to read OSTEP and complete homework. Direct only students specializing in systems to undertake the course projects Resolves #1083 Co-authored-by: Waciuma Wanjohi Co-authored-by: spamegg * Clarify OSTEP: add missing link, fix prerequisite * Add structure to links * Update FAQ.md * Update CONTRIBUTING.md * Changed course for Theory of Computation to the one in openMIT (#1125) Resolves #1096 * Reduce time estimate for Probability * Correct link to resources below (#1133) * fix core applications machine learning (#1143) * Fix machine learning in core applications The machine learning course is only 3 weeks long, not 11. Further, it's a very gentle introductory course. Even the prerequisite of Basic coding is stretching it, but it is as listed on the course page. * Fix machine learning Machine learning should link to the entire specialization. The specialization is 11 weeks in all I believe, and they suggest 9 hours per week although that could be scaled down to 4-6 hours if you're just auditing. Also, the prerequisite should be basic coding, linear algebra is not necessary. Closes #1118 * Add a new project from a student (#1130) * Added a PR template for projects. (#1136) * Update CURRICULAR_GUIDELINES.md Reference the upcoming CS2023 * Update LICENSE copyright years (#1152) * Update course link Effective Thinking Through Mathematics * Census Announcement * Move census link to top of page * Correct the CS50 alt URL https://cs50.harvard.edu/ just redirects to Edx. The course is available at https://cs50.harvard.edu/x/ * Remove 2023 Census link * Add better link for How to Code courses Add the Systematic Program Design course (which consists of both parts of How to Code) as the main link and move How to Code to to alt. * Add backt the HTDP book * Add intro-programming course page (#1177) * Create intro-programming course page (incomplete) * Complete the intro-prgramming page * Add intro-programming course page to the README file * Fix spellings * Fix the name of the Py4E course * Add alt for Computer Graphics Resolves #1140 * Update Process Mention taking courses in parallel. Resolves #1139 * Fix CS50P pset links * Changed typo 'strucked' to 'stucked' * fix typos * Create CNAME * Update CNAME * Delete CNAME * Create CNAME * Delete CNAME * Create CNAME * update Software Engineering: Introduction course * Add whitespace May address #1191 * Use full word rather than abbreviation for accessibility (#1194) * Hopefully fix some confusions regarding alt courses Mention the full word "alternative" instead of the short form "alt" which may cause confusion to non-native speakers. Also change "/" to "," for the two parts of HTC course. * Fixed the missing "alt" * Replace deleted course with its video playlist * Adding a new URL course for Git and GitHub because the old link invalid (#1204) * Adding discussions channels * Remove mentions of outdated materials and add warning about them (#1212) * Remove mentions of outdated materials and add warning about them * Remove the new warning blockquote syntax Seems like github pages don't support the new warning blockquote syntax * Update README.md with suggestion from @waciumawanjohi (1) Co-authored-by: Lenox Waciuma Wanjohi * Update README.md with suggestion from @waciumawanjohi (2) Co-authored-by: Lenox Waciuma Wanjohi * Update README.md with suggestion from @waciumawanjohi (3) Co-authored-by: Lenox Waciuma Wanjohi --------- Co-authored-by: Lenox Waciuma Wanjohi * add final project into PROJECTS.md * Move space between badges out of link text * fix: quick stupid case corrections for Discord can I brag about having contributed to ossu yet? :^) * Mark the Py4E course link as link The Py4E course link in the intro cs coursepage was not marked as link. While GitHub renders it as link, the GitHub pages website don't. This PR fixes that. The PR also fixes the CS50P discord invite link, which was expired. This time, I have made a link that never expires, and can be used an unlimited number of times. * Update page to use CSS for center alignment Uses mozilla recommended CSS for centering: https://developer.mozilla.org/en-US/docs/web/html/element/center * Align with div attribute Github homepage does not respect the CSS centering * Add Intro CS coursepage and replace the OCW version with an archived version on Edx (#1224) * Create README.md * Add link to Intro CS course page * Update README.md * Update courses.md This change is adding the interactive, open-source, community-led SICP version that was adapted into JavaScript. This addition seems worthwhile because JavaScript may be a more appealing language to go through SICP with than the original Scheme. In addition, this JavaScript version of SICP was created with the apparent goal of being as close to the original Scheme version as possible: https://sourceacademy.org/sicpjs/prefaces03 * Add SPD coursepage (#1225) * Create README.md * Add files via upload * Update README.md * Add files via upload * Update README.md * Update README.md * Update readings.md * Update README.md * Update README.md * Delete coursepages/spd/HTC2X.zip * Delete coursepages/spd/htc-simple.zip * Delete coursepages/spd/space-invaders-starter.rkt * Delete coursepages/spd/ta-solver-starter.rkt * Update README.md * Add files via upload * Add info about eabling automatic parentheses, square brackets and quotes * Remove the newsletter link The newsletter link does not work anymore. Also, AFAIK, it was not in active use anyway. * Remove Projects.md * Move interactive textbook from courses to readings --------- Signed-off-by: Ariston Lorenzo <4tl0renz0@gmail.com> Co-authored-by: Waciuma Wanjohi Co-authored-by: waciumawanjohi Co-authored-by: spamegg <4255997+spamegg1@users.noreply.github.com> Co-authored-by: Aaron Hooper Co-authored-by: Manuel Esparza Co-authored-by: aryzach Co-authored-by: riceeatingmachine <50071043+riceeatingmachine@users.noreply.github.com> Co-authored-by: spamegg Co-authored-by: Travis Brackett Co-authored-by: Cybermise Co-authored-by: Cybermise <57189446+Cybermise@users.noreply.github.com> Co-authored-by: Josh Hanson Co-authored-by: attackgnome Co-authored-by: bradleygrant Co-authored-by: silential Co-authored-by: Uniminin <42061747+Uniminin@users.noreply.github.com> Co-authored-by: Alaharon123 <34926441+Alaharon123@users.noreply.github.com> Co-authored-by: Silent <64616976+Silential@users.noreply.github.com> Co-authored-by: Tyler Miller Co-authored-by: Tanya Nevskaya Co-authored-by: Hanqiu Jiang Co-authored-by: licjon <67080615+licjon@users.noreply.github.com> Co-authored-by: Jonathan Hustad Co-authored-by: Henrick Kakutalua Co-authored-by: Elahi-cs <67738959+Elahi-cs@users.noreply.github.com> Co-authored-by: Josip Ćavar Co-authored-by: Kye Davey Co-authored-by: Dody2 <44237371+Dody2@users.noreply.github.com> Co-authored-by: Harsh Co-authored-by: azzsal Co-authored-by: Rodi Co-authored-by: NadaTElwazane Co-authored-by: Guilherme Marz Vazzolla <53506039+saerosV@users.noreply.github.com> Co-authored-by: aayushsinha0706 <84586770+aayushsinha0706@users.noreply.github.com> Co-authored-by: Nico Schlömer Co-authored-by: Dion Rigatos Co-authored-by: Matt Rieke Co-authored-by: Nick Roma Co-authored-by: Ethan Deng <44384988+ethand605@users.noreply.github.com> Co-authored-by: Mikhail Loginov Co-authored-by: Eero Pomell <97628152+Password-and-authentication@users.noreply.github.com> Co-authored-by: Justin Kim Co-authored-by: Ariston Lorenzo <4tl0renz0@gmail.com> Co-authored-by: Maheshkumar P <67100964+Maheshkumar-novice@users.noreply.github.com> Co-authored-by: Roman Bird Co-authored-by: martin <66410356+MartinOvington@users.noreply.github.com> Co-authored-by: anantav51 <34206594+anantav51@users.noreply.github.com> Co-authored-by: Choubs01 <115124294+Choubs01@users.noreply.github.com> Co-authored-by: Thái Hữu Trí <110210159+thaitri2005@users.noreply.github.com> Co-authored-by: Rob <39163+robbrit@users.noreply.github.com> Co-authored-by: Ariston Lorenzo Co-authored-by: Pulkit Krishna Co-authored-by: zkv Co-authored-by: Avishek Sen Co-authored-by: Budi_Ubuntu Co-authored-by: Karim Safan <110535652+karim1safan@users.noreply.github.com> Co-authored-by: karim1safan Co-authored-by: Pablo Colturi Esteve Co-authored-by: Yukai Chou Co-authored-by: Maru Co-authored-by: mgg143 <77564511+mgg143@users.noreply.github.com> --- .../request-for-comment-template.md | 28 + .github/PULL_REQUEST_TEMPLATE/project_pr.md | 21 + .gitignore | 4 +- CHANGELOG.md | 165 +++- CNAME | 1 + CONTRIBUTING.md | 19 + CURRICULAR_GUIDELINES.md | 17 + FAQ.md | 136 +++ HELP.md | 9 + LICENSE | 2 +- PROJECTS.md | 156 --- README.md | 889 +++++++++--------- coursepages/intro-cs/README.md | 32 + coursepages/intro-programming/README.md | 88 ++ coursepages/ostep/Project-1B-initial-xv6.md | 35 + .../ostep/Project-2A-processes-shell.md | 45 + coursepages/ostep/README.md | 191 ++++ coursepages/ostep/Reading-order.md | 13 + coursepages/ostep/Scheduling-xv6-lottery.md | 202 ++++ coursepages/ostep/vm-xv6-intro.md | 13 + coursepages/spd/README.md | 96 ++ coursepages/spd/automatic-parentheses.png | Bin 0 -> 75340 bytes coursepages/spd/change-dr-racket-notation.png | Bin 0 -> 106172 bytes .../spd/space-invaders-instructions.png | Bin 0 -> 127965 bytes extras/articles.md | 96 -- extras/courses.md | 102 ++ extras/free-books.md | 123 --- extras/free-courses.md | 245 ----- extras/other_curricula.md | 13 + extras/paid-books.md | 121 --- extras/paid-courses.md | 96 -- extras/puzzles-practice-plods.md | 49 + extras/readings.md | 100 ++ 33 files changed, 1825 insertions(+), 1282 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/request-for-comment-template.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/project_pr.md create mode 100644 CNAME create mode 100644 CONTRIBUTING.md create mode 100644 CURRICULAR_GUIDELINES.md create mode 100644 FAQ.md create mode 100644 HELP.md delete mode 100644 PROJECTS.md create mode 100644 coursepages/intro-cs/README.md create mode 100644 coursepages/intro-programming/README.md create mode 100644 coursepages/ostep/Project-1B-initial-xv6.md create mode 100644 coursepages/ostep/Project-2A-processes-shell.md create mode 100644 coursepages/ostep/README.md create mode 100644 coursepages/ostep/Reading-order.md create mode 100644 coursepages/ostep/Scheduling-xv6-lottery.md create mode 100644 coursepages/ostep/vm-xv6-intro.md create mode 100644 coursepages/spd/README.md create mode 100644 coursepages/spd/automatic-parentheses.png create mode 100644 coursepages/spd/change-dr-racket-notation.png create mode 100644 coursepages/spd/space-invaders-instructions.png delete mode 100644 extras/articles.md create mode 100644 extras/courses.md delete mode 100644 extras/free-books.md delete mode 100644 extras/free-courses.md create mode 100644 extras/other_curricula.md delete mode 100644 extras/paid-books.md delete mode 100644 extras/paid-courses.md create mode 100644 extras/puzzles-practice-plods.md create mode 100644 extras/readings.md diff --git a/.github/ISSUE_TEMPLATE/request-for-comment-template.md b/.github/ISSUE_TEMPLATE/request-for-comment-template.md new file mode 100644 index 000000000..bef0a7e12 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/request-for-comment-template.md @@ -0,0 +1,28 @@ +--- +name: Request for Comment Template +about: Template for creating an RFC to modify the curriculum +title: 'RFC: ' +labels: '' +assignees: '' + +--- + +**Problem:** +Give a 1 sentence description of a problem with the current OSSU Curriculum. Successful critiques of the curriculum will point out ways that OSSU is failing to uphold [our curricular guidelines](https://github.com/ossu/computer-science/blob/master/CURRICULAR_GUIDELINES.md). Examples are: + +* OSSU lists course X as required when the course's topics are elective in our curricular guidelines. +* OSSU does not having a course to cover required topic X from our curricular guidelines. +* OSSU lists courses X, Y and Z that cover the same topics when fewer courses could suffice. +* OSSU recommends course X to teach a topic, but there exists a higher quality course that covers the same material. + +**Duration:** +This should most often be 1 month from the date of posting. + +**Background:** +Give an in depth description of the problem. Describe a solution to the problem. Describe the advantages and disadvantages of this solution. This section should be a few paragraphs. + +**Proposal:** +Give a bullet point list of changes that are being proposed. These can link to a Pull Request. + +**Alternatives:** +Give a bullet point list of alternative ways to address the problem. diff --git a/.github/PULL_REQUEST_TEMPLATE/project_pr.md b/.github/PULL_REQUEST_TEMPLATE/project_pr.md new file mode 100644 index 000000000..14f3a3f98 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/project_pr.md @@ -0,0 +1,21 @@ +# Project Pull Request + +This template is for any submissions to our [projects list](https://github.com/ossu/computer-science/blob/master/PROJECTS.md). +If you're submitting a pull request for any other part of the repo, don't use this +template. + +Before you submit your project, there's a few things to check: + +* Have you followed the [code of conduct?](https://github.com/ossu/code-of-conduct) +* Does this project violate the honor code of one of the courses in OSSU? + +If you've followed those two guidelines, then prepare a pull request for the project +and a post for our Discord. Put the post in the [#projects channel](https://discord.com/channels/744385009028431943/881778556961701909), +and ensure it contains some details for the community: + +* The description of the project. +* Any courses or resources that were particularly helpful that you'd like to share. +* Any learnings that you had while doing the project. +* Questions that you have for the group, or any feedback you'd like to receive. + +If that's all good, create the pull request and send over your Discord post. Thanks! diff --git a/.gitignore b/.gitignore index 9e6fe6d95..b24cf9b6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .idea *.swp -*.swo \ No newline at end of file +*.swo +.direnv/ +.envrc diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d9dbfee..71929b1d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,150 @@ # Change Log +**Note**: The curriculum is currently undergoing review for v9. This consists largely of checking our recommendations against our [curricular guidelines](CURRICULAR_GUIDELINES.md), adding missing topics and cutting redundant or out of scope courses. As Requests for Comment in this effort are completed, changes are made immediately to the curriculum. When the overall review is complete we will notate the version bump to v9. + All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). +This project adheres *in spirit* to [Semantic Versioning](http://semver.org/): +- "MAJOR" updates correspond to changing the topics studied within a subject +- "MINOR" updates correspond to changing courses without changing the topics +- "PATCH" updates correspond to aesthetic and non-essential additions/removals or changing order of classes for better progression + +## [8.0.0] 2017-11-01 +### Added +- extras/readings: "The System Design Primer" +- extras/readings: "Category Theory for Programmers: The Preface" +- extras/readings: "Programming Languages: Application and Interpretation" +- extras/readings: "Programming and Programming Languages" +- CONTRIBUTING: "Learning Git" section to the contributor guidelines page +- Core Math: Added "Essence of Linear Algebra" as pre-requisite to "Linear Algebra: Foundations to Frontiers" + +### Updated +- Moved "Introduction to Mathematical Thinking" to extras/courses +- Moved "Hack the Kernel" (ops-class) from Advanced Systems to Core Systems +- Core Systems: "Operating Systems: Three Easy Pieces" is no longer required, but is recommended as companion text to "Hack the Kernel" +- Core Theory: Replaced Coursera with Lagunita as the host for Stanford Algorithms, since Coursera uses dark patterns to trick users into paying + +## [7.2.2] 2017-07-02 +### Added +- "Haskell Programming from First Principles" book as a paid alternative to learn Haskell +- "Think Python" to extras/readings +- FAQ entries and links under relevant courses +- "Category Theory: A Gentle Introduction" to extras/readings + +## [7.2.1] 2017-05-14 +### Updated +- Networking course should take 8 weeks to complete +- Fixed spelling error + +### Added +- Introduction to Haskell course to [extras/courses](extras/courses.md) + +## [7.2.0] 2017-04-28 +### Added +- Software Testing course +- Link to Stanford Lagunita's Algorithms: Design and Analysis +- Added link to the section on parametric equations and polar coordinates from MIT's Single Variable Calculus course in order to properly prepare students for Multivariable Calculus + +## [7.1.2] 2017-04-22 +### Updated +- Add link to Mega Project List in the introduction of the Projects section + +## [7.1.1] 2017-04-11 +### Updated +- Final touch to release + +## [7.1.0] 2017-04-10 +### Updated +- Reverted reformat of programming languages course + +### Added +- Reliable Distributed Algorithms courses +- New Introduction to CS course + +## [7.0.2] 2017-03-30 +### Updated +- Moved optional online learning courses to extras/courses in a new section +- Moved alternate computer architecture course to extras/courses + +### Added +- Scala specialization under Advanced applications + +### Removed +- Removed all but one choice for required readings to make the curriculum simpler + +## [7.0.1] 2017-03-11 +### Updated +- Fixed link to Bradfield's DIY computer science page + +### Added +- Note under Calculus One with links to errata and course progression recommendations +- Optional courses under extras: + - Strang's course on linear algebra + - Berkeley's Structure and Interpretation of Computer Programs +- Optional readings under extras: + - Van Roy's advanced programming book + - P&H's computer architecture book + - Skiena's algorithms book + - Strang's linear algebra book + - Database Management Systems book + - Tarr's book on creating your own Domain-specific language + - Readings from various authors on distributed systems + +## [7.0] 2017-03-09 +Complete overhaul of program structure + +### Updated +- Clarified contributor guidelines and moved them to separated file +- Switched from many subjects to just four subjects with many topics +- Consolidated free-books.md and paid-books.md into readings.md +- Consolidated free-courses.md and paid-courses.md into courses.md +- Replace old "How to Code" with new "How to Code" (Software Development MicroMasters) +- Replace Princeton Algorithms (moved to [alternative courses](#extras/courses.md)) with Stanford Algorithms + +### Added +- Indicate prerequisites for all courses +- Requirements: subject/topic requirements and project requirements +- Required readings on Haskell, Prolog, Operating Systems +- Courses: Dan Grossman's Programming Languages +- Courses: From Nand to Tetris +- Elective course: Intro to Parallel Programming +- Elective course: LAFF: Programming for Correctness +- Elective course: Introduction to Mathematical Thinking +- Elective courses: Electricity and Magnetism +- Elective courses: MIT's Computation Structures +- Elective course: Multivariable Calculus +- Elective course: ops-class.org +- Elective course: Automata Theory +- Elective course: Introduction to Logic +- Elective course: Computational Geometry +- Elective course: Formal Concept Analysis +- Elective course: Game Theory +- Elective specializations: + - Robotics + - Data Mining + - Big Data + - Internet of Things + - Cloud Computing + - Full Stack Web Development + - Data Science +- Pro specializations: + - Mastering Software Development in R + - Artificial Intelligence Engineer + - Machine Learning Engineer + - Cybersecurity + - Android Developer + +### Removed +- Removed many dead links and obsolete courses +- Removed per-course project requirement +- Course: Object-Oriented Programming in Java +- Course: Functional Programming in Scala +- Course: Computer Architecture (but left as a footnote) +- Course: Intro to Theoretical Computer Science +- Course: Software Processes and Agile Practices +- Course: Operating Systems & System Programming +- Course: Introduction to Cyber Security +- Course: Parallel Computer Architecture and Programming +- Course: UX Design for Mobile Developers ## [6.0] 2016-10-09 ### Updated @@ -73,12 +216,12 @@ Due to Coursera's platform changes, we had the following updates: ## [3.0.0] 2016-05-04 ### Removed -- Section: **Introduction to Computer Science**: +- Section: **Introduction to Computer Science**: - Introduction to Computer Science and Programming Using Python - From Nand to Tetris (Part 1) ### Added -- Section: **Introduction to Computer Science**: +- Section: **Introduction to Computer Science**: - Introduction to Computer Science - CS50 ## [2.0.1] 2016-04-04 @@ -90,7 +233,7 @@ Due to Coursera's platform changes, we had the following updates: - Program Design section course's names and links ### Removed -- **Introduction to Computer Science**: +- **Introduction to Computer Science**: - Introduction to Computer Science - Introduction to Computational Thinking and Data Science - **Algorithms** @@ -99,22 +242,22 @@ Due to Coursera's platform changes, we had the following updates: - Principles of Reactive Programming - **Math (Calculus)** - Multivariable Calculus -- **Software Architecture**: +- **Software Architecture**: - Web Application Architectures -- **Software Engineering**: +- **Software Engineering**: - Agile Development Using Ruby on Rails - Basics - Agile Development Using Ruby on Rails - Advanced - Startup Engineering -- **Computer Architecture**: +- **Computer Architecture**: - The Hardware/Software Interface -- **Operating Systems**: +- **Operating Systems**: - Operating System Engineering -- **Computer Networks**: +- **Computer Networks**: - Introduction to Computer Networking -- **Cryptography**: +- **Cryptography**: - Applied Cryptography -**ps**: These removed courses are now in the [extras](https://github.com/open-source-society/computer-science/tree/master/extras) section. +**ps**: These removed courses are now in the [extras](https://github.com/ossu/computer-science/tree/master/extras) section. ## [1.3.12] 2016-03-17 ### Added diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..982d816af --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +cs.ossu.dev \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..be27d3e6d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Changing the curriculum +OSSU thrives because of the changes made by our many contributors. Read on for details on how to help every student that follows you. +## Non-substantive changes +If you have non-substantive updates to make to the curriculum, such as a course's URL having been moved, spelling/syntax errors, etc., please send a [pull request](https://www.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github-3/) to fix any mistakes that you have found. +## Substantive changes +If you have specific and substantive criticisms of the curriculum, i.e. problems related to the progression/content of courses it would be appropriate to [open an issue](https://help.github.com/articles/creating-an-issue/). While it is acceptable to point out problems, all successful changes naturally require a plan for fixing the problem. +OSSU’s curricular guidelines are [here](https://github.com/ossu/computer-science/blob/master/CURRICULAR_GUIDELINES.md). Successful critiques of the curriculum will point out ways that OSSU is failing to uphold these guidelines. Examples are: + +* OSSU lists a course as required when the course topics are elective in the curricular guide. +* OSSU not having a course to cover required topics from the curricular guide. +* OSSU lists multiple courses that cover the same topics when fewer courses could suffice. +* OSSU recommends a course to teach a topic, but there exists a higher quality course that covers the same material. +## Other ways to contribute +### Responding to Issues +Issues require more than just users to suggest them. Issues require active community members to read and respond to proposals. Even adding simple [emoji reactions](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) can help the community. +### Engaging with other students +Learning is enhanced by engaged peers. You can be that peer for someone new to OSSU. When you see a new person posting in Gitter, ask them a question about themselves. When you see a cohort starting at _almost_ the right time, join in. Doing so will make OSSU a stronger program for everyone, including you. +# Personal Customization +If you want to customize the curriculum for yourself, you are encouraged to [fork this project](https://help.github.com/articles/fork-a-repo/)! diff --git a/CURRICULAR_GUIDELINES.md b/CURRICULAR_GUIDELINES.md new file mode 100644 index 000000000..55ab51366 --- /dev/null +++ b/CURRICULAR_GUIDELINES.md @@ -0,0 +1,17 @@ +# Curricular Guidelines + +[Curriculum Guidelines for Undergraduate Programs in Computer Science](https://www.acm.org/binaries/content/assets/education/cs2013_web_final.pdf) + +Our curricular guidelines are from the 2013 report of the Association for Computing Machinery and the Institute of Electrical and Electronics Engineers. This report is the most recent in a series of such reports outlining the expectations of undergraduate degrees in Computer Science. The report outlines critical Knowledge Areas and topics within them. It drills down further to outline specific learning goals, going so far as to outline what concepts a student must be able to explain vs concepts a student must be able to demonstrate using in practice. + +The CS2023 is currently under development. Track its progress to release [here](https://csed.acm.org/). + +## Organizations publishing: + +### The Association for Computing Machinery + +The Association for Computing Machinery (ACM) is an international learned society for computing. It was founded in 1947, and is the world's largest scientific and educational computing society. The ACM is a non-profit professional membership group, with more than 100,000 members as of 2011. + +### Institute of Electrical and Electronics Engineers + +The Institute of Electrical and Electronics Engineers (IEEE) is a professional association formed in 1963 from the amalgamation of the American Institute of Electrical Engineers and the Institute of Radio Engineers. As of 2018, it is the world's largest association of technical professionals with more than 423,000 members in over 160 countries around the world. Its objectives are the educational and technical advancement of electrical and electronic engineering, telecommunications, computer engineering and allied disciplines. diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 000000000..599d995df --- /dev/null +++ b/FAQ.md @@ -0,0 +1,136 @@ +# Frequently Asked Questions + +This page answers some questions that we frequently receive about the curriculum. +If you have questions that aren't answered here, try asking through one of our [community channels](README.md#community). +If it seems important enough or we get asked that question a lot, we will probably add it here. + +Alternatively, you could [contribute](#CONTRIBUTING.md) an answer yourself. + +## Contents + +- [Does OSSU offer a degree?](#does-ossu-offer-a-degree) +- [How can I review the math prerequisites?](#how-can-i-review-the-math-prerequisites) +- [What is a good course to learn a language (C++, Rust, Java, etc)?](#what-is-a-good-course-to-learn-a-particular-language) +- [Why is the Firebase OSSU app different/broken?](#why-is-the-firebase-ossu-app-different-or-broken) +- [In what order should I take the courses?](#in-what-order-should-i-take-the-courses) +- [Does every resource in the main curriculum have to be free?](#does-every-resource-in-the-main-curriculum-have-to-be-free) +- [Are Coursera courses free to access?](#are-coursera-courses-free-to-access) +- [Is it necessary to purchase the Verified Upgrade for edX courses?](#is-it-necessary-to-purchase-the-verified-upgrade-for-edx-courses) +- [What are the alt links?](#what-are-the-alt-links) +- [Why doesn't the curriculum cover/ignore topic X?](#why-doesnt-the-curriculum-coverignore-topic-x) +- [Why is the curriculum missing some pre-requisites?](#why-is-the-curriculum-missing-some-pre-requisites) +- [Why require experience with a sizable project before the Software Engineering courses?](#why-require-experience-with-a-sizable-project-before-the-Software-Engineering-courses) +- [How can I find a course on a particular subject?](#how-can-I-find-a-course-on-a-particular-subject) + +## Questions + +### Does OSSU offer a degree? +No. OSSU creates guides to resources that will empower you to learn the curriculum of an undergraduate degree. Individuals who used to be involved in OSSU may be working with other organizations to offer degrees, but Open Source Society University is not involved in those efforts. + +### How can I review the math prerequisites? +Many OSSU students choose to review math topics that they have not studied recently. +OSSU recommends students use Khan Academy for such a review. +Below are links to topic assessments. +After taking an assessment, you should have a clear idea what topics to study, and resources on Khan Academy to use. + +- [Arithmetics](https://www.khanacademy.org/math/arithmetic#arithmetic-subject-challenge) +- [Basic Geometry](https://www.khanacademy.org/math/basic-geo#basic-geo-subject-challenge) +- [Pre-algebra](https://www.khanacademy.org/math/pre-algebra#pre-algebra-subject-challenge) +- [Integrated Math 1](https://www.khanacademy.org/math/math1#math1-subject-challenge) +- [Integrated Math 2](https://www.khanacademy.org/math/math2#math2-subject-challenge) +- [Integrated Math 3](https://www.khanacademy.org/math/math3#math3-subject-challenge) + +(Math 1, 2, 3 covers all of algebra, pre-calculus, high school geometry, trig, stats. It interleaves the order of these topics.) + +### What is a good course to learn a particular language? +OSSU focuses on finding the best courses to learn computer science topics, and isn’t focused on finding language specific courses. If you are looking to learn a particular language or framework there are two great resources to check. +1. [Hackr.io](https://hackr.io/) allows users to submit and upvote learning resources for topics such as Python or the Java Spring Framework. +2. Most languages have a community on reddit. When you find the community’s page, check to see if there is a wiki or sidebar with resources. For example, see [/r/python](https://old.reddit.com/r/Python). Note that the sidebar content can be different depending on whether you use www.reddit.com or old.reddit.com. + +### Why is the Firebase OSSU app different or broken? + +The OSSU curriculum and ecosystem have been collaboratively built by many individuals. The Firebase app was one such contribution. When it was written, it was with the intention of helping future OSSU students. + +Unfortunately, the app has not been updated in many years. It does not reflect updates to the curriculum, it contains links to courses that no longer exist, and it has known bugs that prevent students from logging in. + +It is our hope that the creators of the Firebase app can bring the app up to date. Until that time, the firebase app should be considered a deprecated product that is no longer supported. + +### In what order should I take the courses? + +You have a few different options: +- You can progress linearly from top to bottom of the page. +- You can progress linearly through each individual section, but studying different sections in parallel. +- You can design your own custom progression using the pre-requisites to guide you. + +We have designed the curriculum to work for any of the above three styles. + +### Does every resource in the main curriculum have to be free? + +Yes, that is a core goal of OSSU. + +At the same time, we recognize that education is a resource that requires payment to instructors to make it sustainable in the long term. +Therefore, we respect the business model of websites like edX, which make their materials free but with some paid add-ons, like official certificates or extra interaction with course instructors. + +So we only require that the *learning materials* of a resource be free to access, not that every possible add-on be free. +It would be ideal if graded assignments were always free. In the event that free assessments are not available OSSU looks for alternate assessments to pair with a course. + +### Are Coursera courses free to access? + +Some courses that require payment to access probably do exist on Coursera, but we don't put those on our curriculum. +All Coursera courses that we put on the curriculum must, at minimum, be **free to audit**. +For some courses, all course features are available for free; +for others (especially those that are part of a specialization), you may only be able to access the lecture videos. +(If you find the policies have changed for any courses on our curriculum, please tell us!) + +Unfortunately, for some courses, Coursera's interface is [very aggressive](https://darkpatterns.org/) about convincing you that you have to pay. + +You may see something like this on the course page: + +Free Trial + +When attempting to enroll in such a course: +- Click the blue "Enroll" or "Enroll Now" button. +- A pop-up will appear. +- **Do not click** "Start Free Trial", unless you do want to pay. +- Find the text that says "Audit this course" at the bottom. +- Click **Audit**. + +![Audit this course](https://user-images.githubusercontent.com/3349406/27321369-95ca12e6-55cc-11e7-9b5c-f8fedd8fd643.png) + +### Is it necessary to purchase the Verified Upgrade for edX courses? + +If you just want to watch the videos, it is never necessary for any edX course on our curriculum. Note that a number of edX courses only allow students to audit a course for the estimated number of weeks it takes to complete. Students should not begin a course until they are prepared to focus and complete the course. + +### What are the alt links? + +Sometimes a course is on multiple platforms that are reasonably similar in quality so we have an alt or two linked in case the main one isn't being offered at the time or you prefer the other one. Both are just as good, go with whichever you prefer or whichever is available when you want to take the course. + +### Why doesn't the curriculum cover/ignore topic X? + +You can read more about our curricular guidelines and the qualifications of the guidelines' authors [here](CURRICULAR_GUIDELINES.md). If you find a topic that is required by our guidelines and is not included in the curriculum, we should make a change! Read more about [contributing to a change](CONTRIBUTING.md). + +### Why is the curriculum missing some pre-requisites? + +The curriculum assumes two things: +- You are reasonably fluent in English. +- You have gotten through a standard high school curriculum that included physics and pre-calculus. + +Without these assumptions, the curriculum would be out of control with trying to fill in your knowledge gaps. +For those who want to study math pre-requisites, read more [here](#how-can-i-review-the-math-prerequisites) + +Of course, if you find that the curriculum is missing a pre-requisite for a course that isn't part of a normal high school curriculum, please let us know! + +### Why require experience with a sizable project before the Software Engineering courses? +Software engineering tries to solve the problem of dealing with large programs. Building a sizable program before taking the SE courses will help you understand what SE is trying to solve. We recommend the Jack-to-VM-code compiler project from the nand2tetris course because it's the first project in the curriculum that is complex enough to see value in a SE course. That said, any sizable project will do and can come from outside of the OSSU curriculum. The idea is that you've done some large enough project where the pieces started to feel unmanageable. This experience will expose pain points and lead to a better understanding of SE. + +### How can I find a course on a particular subject? +After completing Core CS, learners are ready to pursue computer science +topics of their own interest. How can one find a course on a given topic? +For MOOCs an excellent resource is [Class Central](https://www.classcentral.com/). +For materials from university courses that are online (but not organized) +into a MOOC, [awesome-courses](https://github.com/prakhar1989/awesome-courses) and +[cs-video-courses](https://github.com/Developer-Y/cs-video-courses) +are good resources. For textbooks, [Goodreads](https://www.goodreads.com/genres/computer-science) +is a great platform for reader ratings and reviews. +For learning a particular programming language or framework, +[see this question](#what-is-a-good-course-to-learn-a-particular-language). diff --git a/HELP.md b/HELP.md new file mode 100644 index 000000000..f45250e1f --- /dev/null +++ b/HELP.md @@ -0,0 +1,9 @@ +# Getting help +## Check the FAQ! +Please check our [Frequently Asked Questions](FAQ.md) to see if your question has been addressed. +## Ask in the chat room +[![Discord](https://img.shields.io/discord/744385009028431943.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/5pUhfpX) Join the OSSU [Discord server](https://discord.gg/5pUhfpX)! Discord is an online chat service, similar to Slack or IRC where you can chat with other students and get help. +### Specific problems +If you need help successfully completing the content of a course or are having general technical difficulties, first reach out to the resources provided by the course (e.g. the course forum on Coursera, edX, etc). If you need additional help after that, post in Discord. **In your post, mention what steps you have already taken to try and solve the problem**. +### General problems +If you have general problems with the program not specific to any course, such as preferring textbook-style learning over MOOCs, Discord is a good place to reach out to people who may have great suggestions. You might form a working group that makes the next improvement to OSSU CS! Read more about contributing [here](CONTRIBUTING.md). diff --git a/LICENSE b/LICENSE index 05434d246..7c561549d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Open Source Society +Copyright (c) 2015-2023 Open Source Society University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/PROJECTS.md b/PROJECTS.md deleted file mode 100644 index c779a0253..000000000 --- a/PROJECTS.md +++ /dev/null @@ -1,156 +0,0 @@ -# Projects - ->Here, we are providing a list curated by the community of exercices and projects to practice and reinforce the skills we try to master. - -Projects created by OSSU's students for each course of our [**Computer Science**](https://github.com/open-source-society/computer-science) curriculum. - -### Introduction to Computer Science - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- -Binary Machine | Convert decimal numbers to binary | [Eric Douglas](https://github.com/ericdouglas) | [binary-machine](https://github.com/ericdouglas/binary-machine) - -### Math (Mathematical Thinking) - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Program Design - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Math (Calculus and Discrete Math) - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Algorithms - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Programming Paradigms - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Software Testing - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Math (Calculus) - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Software Architecture - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Theory - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Software Engineering - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Math (Probability) - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Computer Architecture - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Operating Systems - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Computer Networks - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Databases - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Cloud Computing - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Math (Linear Algebra) - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Cryptography - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Security - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Compilers - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Parallel Computing - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### UX Design - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Computer Graphics - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Artificial Intelligence - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Machine Learning - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Natural Language Processing - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Big Data - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Data Mining - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- - -### Internet of Things - -Project Title | Description | Author(s) | Repository -:-- | :-- | :--: | :-- diff --git a/README.md b/README.md index c8fe70497..12cf2ffee 100644 --- a/README.md +++ b/README.md @@ -1,451 +1,476 @@ -![Open Source Society University (OSSU)](http://i.imgur.com/GjEbgIJ.png) - -

Open Source Society University

-

+

+Open Source Society logo +

Open Source Society University

+

Path to a free self-taught education in Computer Science!

-

+

- Awesome - - - Open Source Society University - Computer Science - + Awesome + + Open Source Society University - Computer Science

+
-## Contents +# Contents -- [About](#about) -- [Motivation & Preparation](#motivation--preparation) -- [Curriculum](#curriculum) -- [How to use this guide](#how-to-use-this-guide) -- [Prerequisite](#prerequisite) -- [How to collaborate](#how-to-collaborate) +- [Summary](#summary) - [Community](#community) +- [Curriculum](#curriculum) +- [Code of conduct](#code-of-conduct) - [Team](#team) -- [References](#references) - -## About - -This is a **solid path** for those of you who want to complete a **Computer Science** course on your own time, **for free**, with courses from the **best universities** in the World. - -In our curriculum, we give preference to MOOC (Massive Open Online Course) style courses because these courses were created with our style of learning in mind. - -## Motivation & Preparation - -Here are two interesting links that can make **all** the difference in your journey. - -The first one is a motivational video that shows a guy that went through the "MIT Challenge", which consists of learning the entire **4-year** MIT curriculum for Computer Science in **1 year**. - -- [MIT Challenge](https://www.scotthyoung.com/blog/myprojects/mit-challenge-2/) - -The second link is a MOOC that will teach you learning techniques used by experts in art, music, literature, math, science, sports, and many other disciplines. These are **fundamental abilities** to succeed in our journey. - -- [Learning How to Learn](https://www.coursera.org/learn/learning-how-to-learn) - -**Are you ready to get started?** - -## Curriculum - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Calculus & Discrete Math)](#math-calculus-and-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) -- [Specializations](#specializations) - ---- - -### Introduction to Computer Science - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Computer Science - CS50](https://www.edx.org/course/introduction-computer-science-harvardx-cs50x#!)| 12 weeks | 10-20 hours/week - -### Math (Mathematical Thinking) - -Courses | Duration | Effort -:-- | :--: | :--: -[Effective Thinking Through Mathematics](https://www.edx.org/course/effective-thinking-through-mathematics-utaustinx-ut-9-01x) | 4 weeks | 2-5 hours/week - -### Program Design - -Courses | Duration | Effort -:-- | :--: | :--: -[How to Code: Systematic Program Design - Part 1](https://www.edx.org/course/how-code-systematic-program-design-part-ubcx-spd1x)| 5 weeks | 8-12 hours/week -[How to Code: Systematic Program Design - Part 2](https://www.edx.org/course/how-code-systematic-program-design-part-ubcx-spd2x)| 5 weeks | 8-12 hours/week -[How to Code: Systematic Program Design - Part 3](https://www.edx.org/course/how-code-systematic-program-design-part-ubcx-spd3x)| 5 weeks | 8-12 hours/week - -### Math (Calculus and Discrete Math) - -Courses | Duration | Effort -:-- | :--: | :--: -[Calculus One](https://www.coursera.org/learn/calculus1)| 16 weeks | 8-10 hours/week -[Mathematics for Computer Science](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-spring-2015/index.htm)| 12 weeks | 5 hours/week - -### Algorithms - -Courses | Duration | Effort -:-- | :--: | :--: -[Algorithms, Part I](https://www.coursera.org/learn/algorithms-part1)| 6 weeks | 6-12 hours/week -[Algorithms, Part II](https://www.coursera.org/learn/algorithms-part2)| 6 weeks | 6-12 hours/week - -### Programming Paradigms - -Courses | Duration | Effort -:-- | :--: | :--: -[Functional Programming Principles in Scala](https://www.coursera.org/course/progfun)| 7 weeks | 5-7 hours/week -[Object Oriented Programming in Java](https://www.coursera.org/learn/object-oriented-java) | 6 weeks | 4-6 hours/week - -### Software Testing - -Courses | Duration | Effort -:-- | :--: | :--: -[Software Testing](https://www.udacity.com/course/software-testing--cs258)| 4 weeks | 6 hours/week -[Software Debugging](https://www.udacity.com/course/software-debugging--cs259)| 8 weeks | 6 hours/week - -### Math (Calculus) - -Courses | Duration | Effort -:-- | :--: | :--: -[Calculus Two: Sequences and Series](https://www.coursera.org/learn/advanced-calculus)| 7 weeks | 9-10 hours/week - -### Software Architecture - -Courses | Duration | Effort -:-- | :--: | :--: -[Software Architecture & Design](https://www.udacity.com/course/software-architecture-design--ud821)| 8 weeks | 6 hours/week - -### Theory - -Courses | Duration | Effort -:-- | :--: | :--: -[Intro to Theoretical Computer Science](https://www.udacity.com/course/intro-to-theoretical-computer-science--cs313)| 9 weeks | 6 hours/week - -### Software Engineering - -Courses | Duration | Effort -:-- | :--: | :--: -[Software Processes and Agile Practices](https://www.coursera.org/learn/software-processes-and-agile-practices)| 4 weeks | 6-8 hours/week - -### Math (Probability) - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Probability - The Science of Uncertainty](https://www.edx.org/course/introduction-probability-science-mitx-6-041x-0)| 16 weeks | 12 hours/week - -### Computer Architecture - -Courses | Duration | Effort -:-- | :--: | :--: -[Computer Architecture](https://www.coursera.org/course/comparch)| - | 5-8 hours/week - -### Operating Systems - -Courses | Duration | Effort -:-- | :--: | :--: -[Operating Systems and System Programming](https://www.youtube.com/view_play_list?p=-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c)| 10 weeks | 2-3 hours/week - -### Computer Networks - -Courses | Duration | Effort -:-- | :--: | :--: -[Computer Networks](https://lagunita.stanford.edu/courses/Engineering/Networking-SP/SelfPaced/about)| - | 4–12 hours/week - -### Databases - -Courses | Duration | Effort -:-- | :--: | :--: -[Databases](https://lagunita.stanford.edu/courses/DB/2014/SelfPaced/about)| 12 weeks | 8-12 hours/week - -### Cloud Computing - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Cloud Computing](https://www.edx.org/course/introduction-cloud-computing-ieeex-cloudintro-x-0)| 4 weeks | 1 hour/week - -### Math (Linear Algebra) - -Courses | Duration | Effort -:-- | :--: | :--: -[Linear Algebra - Foundations to Frontiers](https://www.edx.org/course/linear-algebra-foundations-frontiers-utaustinx-ut-5-04x#!)| 15 weeks | 8 hours/week - -### Cryptography - -Courses | Duration | Effort -:-- | :--: | :--: -[Cryptography I](https://www.coursera.org/course/crypto)| 6 weeks | 5-7 hours/week -[Cryptography II](https://www.coursera.org/course/crypto2)| 6 weeks | 6-8 hours/week - -### Security - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Cyber Security](https://www.futurelearn.com/courses/introduction-to-cyber-security) | 8 weeks | 3 hours/week - -### Compilers - -Courses | Duration | Effort -:-- | :--: | :--: -[Compilers](https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about)| 9 weeks | 6-8 hours/week - -### Parallel Computing - -Courses | Duration | Effort -:-- | :--: | :--: -[Parallel Computer Architecture and Programming](http://15418.courses.cs.cmu.edu/spring2016/home)| 20 weeks | - - -### UX Design - -Courses | Duration | Effort -:-- | :--: | :--: -[UX Design for Mobile Developers](https://www.udacity.com/course/ux-design-for-mobile-developers--ud849)| 6 weeks | 6 hours/week - -### Computer Graphics - -Courses | Duration | Effort -:-- | :--: | :--: -[Computer Graphics](https://www.edx.org/course/computer-graphics-uc-san-diegox-cse167x)| 6 weeks | 12 hours/week - -### Artificial Intelligence - -Courses | Duration | Effort -:-- | :--: | :--: -[Artificial Intelligence](https://www.edx.org/course/artificial-intelligence-uc-berkeleyx-cs188-1x#!)| 12 weeks | 15 hours/week - -### Machine Learning - -Courses | Duration | Effort -:-- | :--: | :--: -[Machine Learning](https://www.coursera.org/learn/machine-learning)| 11 weeks | 4-6 hours/week - -### Natural Language Processing - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Natural Language Processing](https://www.coursera.org/learn/natural-language-processing)| 12 weeks | - - -### Big Data - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Big Data](https://www.coursera.org/learn/big-data-introduction)| 3 weeks | 5-6 hours/week - -### Data Mining - -Courses | Duration | Effort -:-- | :--: | :--: -[Pattern Discovery in Data Mining](https://www.coursera.org/course/patterndiscovery) | 4 weeks | 4-6 hours/week - -### Internet of Things - -Courses | Duration | Effort -:-- | :--: | :--: -[The Internet of Things](https://www.futurelearn.com/courses/internet-of-things)| 4 weeks | 2 hours/week - -### Specializations -After finishing the courses above, start your specializations on the topics that you have more interest. +# Summary + +The OSSU curriculum is a **complete education in computer science** using online materials. +It's not merely for career training or professional development. +It's for those who want a proper, *well-rounded* grounding in concepts fundamental to all computing disciplines, +and for those who have the discipline, will, and (most importantly!) good habits to obtain this education largely on their own, +but with support from a worldwide community of fellow learners. + +It is designed according to the degree requirements of undergraduate computer science majors, minus general education (non-CS) requirements, +as it is assumed most of the people following this curriculum are already educated outside the field of CS. +The courses themselves are among the very best in the world, often coming from Harvard, Princeton, MIT, etc., +but specifically chosen to meet the following criteria. + +**Courses must**: +- Be open for enrollment +- Run regularly (ideally in self-paced format, otherwise running multiple times per year) +- Be of generally high quality in teaching materials and pedagogical principles +- Match the curricular standards of the [CS 2013](CURRICULAR_GUIDELINES.md): Curriculum Guidelines for Undergraduate Degree Programs in Computer Science + +When no course meets the above criteria, the coursework is supplemented with a book. +When there are courses or books that don't fit into the curriculum but are otherwise of high quality, +they belong in [extras/courses](extras/courses.md) or [extras/readings](extras/readings.md). + +**Organization**. The curriculum is designed as follows: +- *Intro CS*: for students to try out CS and see if it's right for them +- *Core CS*: corresponds roughly to the first three years of a computer science curriculum, taking classes that all majors would be required to take +- *Advanced CS*: corresponds roughly to the final year of a computer science curriculum, taking electives according to the student's interests +- *Final Project*: a project for students to validate, consolidate, and display their knowledge, to be evaluated by their peers worldwide + +**Duration**. It is possible to finish within about 2 years if you plan carefully and devote roughly 20 hours/week to your studies. Learners can use [this spreadsheet +](https://docs.google.com/spreadsheets/d/1bkUU90y4rKYQHwY5AR2iX6iiPTrPEsYs75GkCAkrgm4/copy) to estimate their end date. Make a copy and input your start date and expected hours per week in the `Timeline` sheet. As you work through courses you can enter your actual course completion dates in the `Curriculum Data` sheet and get updated completion estimates. + +> **Warning:** While the spreadsheet is a useful tool to estimate the time you need to complete this curriculum, it may not be up-to-date with the curriculum. Use the spreadsheet just to estimate the time you need. Use the [OSSU CS website](https://cs.ossu.dev) or [the repo](https://github.com/ossu/computer-science) to see what courses to do. + +**Cost**. All or nearly all course material is available for free. However, some courses may charge money for assignments/tests/projects to be graded. +Note that both [Coursera](https://www.coursera.support/s/article/209819033-Apply-for-Financial-Aid-or-a-Scholarship?language=en_US) and [edX](https://courses.edx.org/financial-assistance/) offer financial aid. + +Decide how much or how little to spend based on your own time and budget; +just remember that you can't purchase success! + +**Process**. Students can work through the curriculum alone or in groups, in order or out of order. +- We recommend doing all courses in Core CS, only skipping a course when you are certain that you've already learned the material previously. +- For simplicity, we recommend working through courses (especially Core CS) in order from top to bottom. Some students choose to study multiple courses at a time in order to vary the material they are working on is a day/week. A popular option is to take the math courses in parallel with the introductory courses. Course prerequisites are listed to help you determine if you are prepared for a given course. +- 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; the Discord community may provide feedback on your planned subject. + +**Content policy**. If you plan on showing off some of your coursework publicly, you must share only files that you are allowed to. +*Respect the code of conduct* that you signed in the beginning of each course! + +**[How to contribute](CONTRIBUTING.md)** + +**[Getting help](HELP.md)** (Details about our FAQ and chatroom) + +# Community + +- We have a Discord server! [![Discord](https://img.shields.io/discord/744385009028431943.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/wuytwK5s9h) This should be your first stop to talk with other OSSU students. Why don't you introduce yourself right now? [Join the OSSU Discord](https://discord.gg/wuytwK5s9h) +- You can also interact through GitHub issues. If there is a problem with a course, or a change needs to be made to the curriculum, this is the place to start the conversation. Read more [here](CONTRIBUTING.md). +- Add **Open Source Society University** to your [Linkedin](https://www.linkedin.com/school/11272443/) profile! + +> **Warning:** There are a few third-party/deprecated/outdated material that you might find when searching for OSSU. We recommend you to ignore them, and only use the [OSSU CS website](https://cs.ossu.dev) or [OSSU CS Github Repo](https://github.com/ossu/computer-science). Some known outdated materials are: +> - An unmaintained and deprecated firebase app. Read more in the [FAQ](./FAQ.md#why-is-the-firebase-ossu-app-different-or-broken). +> - An unmaintained and deprecated trello board +> - Third-party notion templates + +# Curriculum + +**Curriculum version**: `8.0.0` (see [CHANGELOG](CHANGELOG.md)) + +- [Prerequisites](#prerequisites) +- [Intro CS](#intro-cs) + - [Introduction to Programming](#introduction-to-programming) + - [Introduction to Computer Science](#introduction-to-computer-science) +- [Core CS](#core-cs) + - [Core programming](#core-programming) + - [Core math](#core-math) + - [CS Tools](#cs-tools) + - [Core systems](#core-systems) + - [Core theory](#core-theory) + - [Core security](#core-security) + - [Core applications](#core-applications) + - [Core ethics](#core-ethics) +- [Advanced CS](#advanced-cs) + - [Advanced programming](#advanced-programming) + - [Advanced systems](#advanced-systems) + - [Advanced theory](#advanced-theory) + - [Advanced information security](#advanced-information-security) + - [Advanced math](#advanced-math) +- [Final project](#final-project) -The following platforms currently offer specializations: - -#### edX: [xSeries](https://www.edx.org/xseries) -#### Coursera: [Specializations](https://www.coursera.org/specializations) -#### Udacity: [Nanodegree](https://www.udacity.com/nanodegree) -#### FutureLearn: [Collections](https://www.futurelearn.com/courses/collections) - -![keep learning](http://i.imgur.com/REQK0VU.jpg) - -## How to use this guide - -### Order of the classes - -This guide was developed to be consumed in a linear approach. What does this mean? That you should complete one course at a time. - -The courses are **already** in the order you should complete them. Just start in the [Introduction to Computer Science](#introduction-to-computer-science) section and after finishing the first course, start the next one. - -**OBS:** If the course is not open, do it with the archived resources or wait until next class is open. - -### How to track and show your progress - -1. Create an account in [Trello](https://trello.com/). -1. Copy [this](https://trello.com/b/9DPXYv5f) board to your personal account. See how to copy a board [here](http://blog.trello.com/you-can-copy-boards-now-finally/). - -Now that you have a copy of our official board, you just need to pass the cards to the `Doing` column or `Done` column as you progress in your study. - -We also have **labels** to help you have more control through the process. The meaning of each of these labels is: - -- `Main Curriculum`: cards with that label represent courses that are listed in our curriculum. -- `Extra Courses`: cards with that label represent courses that was added by the student. -- `Doing`: cards with that label represent courses the student is current doing. -- `Done`: cards with that label represent courses finished by the student. Those cards should also have the link for at least one project/article built with the knowledge acquired in such course. -- `Section`: cards with that label represent the section that we have in our curriculum. Those cards with the `Section` label are only to help the organization of the Done column. You should put the *Course's cards* below its respective *Section's card*. -- `Extra Sections`: cards with that label represent sections that was added by the student. - -The intention of this board is to provide our students a way to track their progress, and also the ability to show their progress through a public page for friends, family, employers, etc. You can change the status of your board to be **public** or **private**. - -### Should I take all courses? - -**Yes!** The intention is to conclude **all** the courses listed here! - -### Duration of the project - -It may take longer to complete all courses compared to a regular CS graduation, but I can **guarantee** you that your **reward** will be proportional to your extra **effort**! - -You must focus on your **habit**, and **forget** about goals. Try to invest 1 ~ 2 hours **every day** studying this curriculum. If you do this, **inevitably** you'll finish this curriculum. - -> See more about "Commit to a process, not a goal" [here](http://jamesclear.com/goals-systems). - -### Project Based - -Here in **OSS University**, you do **not** need to take exams, because we are focused on **real projects**! - -In order to show everyone that you **successfully** finished a course, you should create a **real project**. - -> "What does it mean?" - -After you finish a course, you should think about a **real world problem** that you can solve using the acquired knowledge in the course. You don't need to create a big project, but you must create something to **validate** and **consolidate** your knowledge, and also to show to the world that you are capable to create something useful with the concepts that you learned. - -The projects of all students will be listed in [this](PROJECTS.md) file. **Submit your project's information in that file after you conclude it**. - -Put the OSSU-CS badge in the README of your repository! [![Open Source Society University - Computer Science](https://img.shields.io/badge/OSSU-computer--science-blue.svg)](https://github.com/open-source-society/computer-science) - -- Markdown: `[![Open Source Society University - Computer Science](https://img.shields.io/badge/OSSU-computer--science-blue.svg)](https://github.com/open-source-society/computer-science)` -- HTML: `Open Source Society University - Computer Science` - -**You can create this project alone or with other students!** - -#### Project Suggestions - -- [Projects](https://github.com/karan/Projects): A list of practical projects that anyone can solve in any programming language. -- [app-specs](https://github.com/ericdouglas/app-specs): A curated list of applications specifications and implementations to practice new technologies, improve your portfolio and sharpen your skills. -- [FreeCodeCamp](http://www.freecodecamp.com/): Course that teaches you fullstack JavaScript development through a bunch of projects. -- [JavaScript Projects](https://github.com/javascript-society/javascript-projects): List of projects related with the [JavaScript Path](https://github.com/javascript-society/javascript-path). - -And you should also... - -### Be creative! - -This is a **crucial** part of your journey through all those courses. - -You **need** to have in mind that what you are able to **create** with the concepts that you learned will be your certificate **and this is what really matters**! - -In order to show that you **really** learned those things, you need to be **creative**! - -Here are some tips about how you can do that: - -- **Articles**: create blog posts to synthesize/summarize what you learned. -- **GitHub repository**: keep your course's files organized in a GH repository, so in that way other students can use it to study with your annotations. - -### Cooperative work - -**We love cooperative work**! Use our [channels](#community) to communicate with other fellows to combine and create new projects! - -### Which programming languages should I use? - -My friend, here is the best part of liberty! You can use **any** language that you want to complete the courses. - -The **important** thing for each course is to **internalize** the **core concepts** and to be able to use them with whatever tool (programming language) that you wish. - -### Content Policy - -You must share **only** files that you are **allowed** to! **Do NOT disrespect the code of conduct** that you signed in the beginning of some courses. - -[Be creative](#be-creative) in order to show your progress! :smile: - -### Stay tuned - -[Watch](https://help.github.com/articles/watching-repositories/) this repository for futures improvements and general information. - -## Prerequisite - -The **only things** that you need to know are how to use **Git** and **GitHub**. Here are some resources to learn about them: - -**Note**: Just pick one of the courses below to learn the basics. You will learn a lot more once you get started! - -- [Try Git](https://try.github.io/levels/1/challenges/1) -- [Git - the simple guide](http://rogerdudler.github.io/git-guide/) -- [GitHub Training & Guides](https://www.youtube.com/playlist?list=PLg7s6cbtAD15G8lNyoaYDuKZSKyJrgwB-) -- [GitHub Hello World](https://guides.github.com/activities/hello-world/) -- [Git Immersion](http://gitimmersion.com/index.html) -- [How to Use Git and GitHub](https://www.udacity.com/course/how-to-use-git-and-github--ud775) - -## Change Log - -**Curriculum Version**: `6.0` - -To show **respect** to all of our students, we will keep a [CHANGELOG](CHANGELOG.md) file that contains all the alterations that our curriculum may suffer. - -Now we have a **stable** version of the curriculum, which won't change anymore, only in exceptional cases (outdated courses, broken links, etc). - -Our students can **trust** in this curriculum because it has been **carefully planned** and covers **all** the **core topics** that a conventional Computer Science course covers. - -We also include modern topics, making this course one of the **best options** for those who want to become a Computer Scientist and/or a Software Engineer/Developer. - -## How to collaborate - -You can [open an issue](https://help.github.com/articles/creating-an-issue/) and give us your suggestions as to how we can improve this guide, or what we can do to improve the learning experience. - -You can also [fork this project](https://help.github.com/articles/fork-a-repo/) and send a [pull request](https://help.github.com/articles/using-pull-requests/) to fix any mistakes that you have found. - -If you want to suggest a new resource, send a pull request adding such resource to the [extras](https://github.com/open-source-society/computer-science/tree/master/extras) section. - -The **extras** section is a place where all of us will be able to submit interesting additional articles, books, courses and specializations, keeping our curriculum *as immutable and concise as possible*. - -**Let's do it together! :smile:** - -## Community - -Subscribe to [/r/opensourcesociety](https://www.reddit.com/r/opensourcesociety/)! +--- -Join us in our [group](https://groups.google.com/forum/#!forum/open-source-society-university)! +## Prerequisites -You can also interact through [GitHub issues](https://github.com/open-source-society/computer-science/issues). +- [Core CS](#core-cs) assumes the student has already taken [high school math](https://github.com/ossu/computer-science/blob/master/FAQ.md#how-can-i-review-the-math-prerequisites), including algebra, geometry, and pre-calculus. +- [Advanced CS](#advanced-cs) assumes the student has already taken the entirety of Core CS +and is knowledgeable enough now to decide which electives to take. +- Note that [Advanced systems](#advanced-systems) assumes the student has taken a basic physics course (e.g. AP Physics in high school). -We also have a chat room! [![Join the chat at https://gitter.im/open-source-society/computer-science](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/open-source-society/computer-science?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) +## Intro CS -Add **Open Source Society University** to your [Facebook](https://www.facebook.com/ossuniversity) profile! +### Introduction to Programming -> **ps**: A forum is an ideal way to interact with other students as we do not lose important discussions, which usually occur in communication via chat apps. **Please use our subreddit/group for important discussions**. +If you've never written a for-loop, or don't know what a string is in programming, start here. This course is self-paced, allowing you to adjust the number of hours you spend per week to meet your needs. -## Team +**Topics covered**: +`simple programs` +`simple data structures` -* **Curriculum Founder**: [Eric Douglas](https://github.com/ericdouglas) -* **Curriculum Maintainer**: [Eric Douglas](https://github.com/ericdouglas) -* **Contributors**: [contributors](https://github.com/open-source-society/computer-science/graphs/contributors) +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Introduction to programming](coursepages/intro-programming/README.md) | 10 weeks | 10 hours/week | none | [chat](https://discord.gg/syA242Z) -## References +### Introduction to Computer Science -- [Google - Guide for Technical Development](https://www.google.com/about/careers/students/guide-to-technical-development.html) -- [Coursera](https://www.coursera.org/) -- [edX](https://www.edx.org) -- [Udacity](https://www.udacity.com/) -- [Future Learn](https://www.futurelearn.com/) -- [Stanford University](https://lagunita.stanford.edu/) -- [MIT Open Courseware](http://ocw.mit.edu/courses/#electrical-engineering-and-computer-science) -- [Obtaining a Thorough CS Background Online](http://spin.atomicobject.com/2015/05/15/obtaining-thorough-cs-background-online/) +This course will introduce you to the world of computer science. Students who have been introduced to programming, either from the courses above or through study elsewhere, should take this course for a flavor of the material to come. If you finish the course wanting more, Computer Science is likely for you! + +**Topics covered**: +`computation` +`imperative programming` +`basic data structures and algorithms` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Introduction to Computer Science and Programming using Python](coursepages/intro-cs/README.md) | 9 weeks | 15 hours/week | [high school algebra](https://www.khanacademy.org/math/algebra-home) | [chat](https://discord.gg/jvchSm9) + +## Core CS + +All coursework under Core CS is **required**, unless otherwise indicated. + +### Core programming +**Topics covered**: +`functional programming` +`design for testing` +`program requirements` +`common design patterns` +`unit testing` +`object-oriented design` +`static typing` +`dynamic typing` +`ML-family languages (via Standard ML)` +`Lisp-family languages (via Racket)` +`Ruby` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Systematic Program Design](coursepages/spd/README.md) | 13 weeks | 8-10 hours/week | none | chat: [part 1](https://discord.gg/RfqAmGJ) / [part 2](https://discord.gg/kczJzpm) +[Programming Languages, Part A](https://www.coursera.org/learn/programming-languages) | 5 weeks | 4-8 hours/week | Systematic Program Design ([Hear instructor](https://www.coursera.org/lecture/programming-languages/recommended-background-k1yuh)) | [chat](https://discord.gg/8BkJtXN) +[Programming Languages, Part B](https://www.coursera.org/learn/programming-languages-part-b) | 3 weeks | 4-8 hours/week | Programming Languages, Part A | [chat](https://discord.gg/EeA7VR9) +[Programming Languages, Part C](https://www.coursera.org/learn/programming-languages-part-c) | 3 weeks | 4-8 hours/week | Programming Languages, Part B | [chat](https://discord.gg/8EZUVbA) +[Object-Oriented Design](https://www.coursera.org/learn/object-oriented-design) | 4 weeks | 4 hours/week | [Basic Java](https://www.youtube.com/watch?v=GoXwIVyNvX0) | [chat](https://discord.com/channels/744385009028431943/891411727294562314) +[Design Patterns](https://www.coursera.org/learn/design-patterns) | 4 weeks | 4 hours/week | Object-Oriented Design | [chat](https://discord.com/channels/744385009028431943/891412022120579103) +[Software Architecture](https://www.coursera.org/learn/software-architecture) | 4 weeks | 2-5 hours/week | Design Patterns | [chat](https://discord.com/channels/744385009028431943/891412169638432788) + +### Core math +Discrete math (Math for CS) is a prerequisite and closely related to the study of algorithms and data structures. Calculus both prepares students for discrete math and helps students develop mathematical maturity. + +**Topics covered**: +`discrete mathematics` +`mathematical proofs` +`basic statistics` +`O-notation` +`discrete probability` +`and more` + +Courses | Duration | Effort | Notes | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: | :--: +[Calculus 1A: Differentiation](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.1x+2T2019/about) ([alternative](https://ocw.mit.edu/courses/mathematics/18-01sc-single-variable-calculus-fall-2010/index.htm)) | 13 weeks | 6-10 hours/week | The alternate covers this and the following 2 courses | [high school math](FAQ.md#how-can-i-review-the-math-prerequisites) | [chat](https://discord.gg/mPCt45F) +[Calculus 1B: Integration](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.2x+3T2019/about) | 13 weeks | 5-10 hours/week | - | Calculus 1A | [chat](https://discord.gg/sddAsZg) +[Calculus 1C: Coordinate Systems & Infinite Series](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.3x+1T2020/about) | 6 weeks | 5-10 hours/week | - | Calculus 1B | [chat](https://discord.gg/FNEcNNq) +[Mathematics for Computer Science](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about) ([alternative](https://ocw.mit.edu/courses/6-042j-mathematics-for-computer-science-fall-2010/)) | 13 weeks | 5 hours/week | [2015/2019 solutions](https://github.com/spamegg1/Math-for-CS-solutions) [2010 solutions](https://github.com/frevib/mit-cs-math-6042-fall-2010-problems) [2005 solutions](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2005/assignments/). | Calculus 1C | [chat](https://discord.gg/EuTzNbF) + + +### CS Tools +Understanding theory is important, but you will also be expected to create programs. There are a number of tools that are widely used to make that process easier. Learn them now to ease your future work writing programs. + +**Topics covered**: +`terminals and shell scripting` +`vim` +`command line environments` +`version control` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) | 2 weeks | 12 hours/week | - | [chat](https://discord.gg/5FvKycS) + +### Core systems + +**Topics covered**: +`procedural programming` +`manual memory management` +`boolean algebra` +`gate logic` +`memory` +`computer architecture` +`assembly` +`machine language` +`virtual machines` +`high-level languages` +`compilers` +`operating systems` +`network protocols` +`and more` + +Courses | Duration | Effort | Additional Text / Assignments| Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: | :--: +[Build a Modern Computer from First Principles: From Nand to Tetris](https://www.coursera.org/learn/build-a-computer) ([alternative](https://www.nand2tetris.org/)) | 6 weeks | 7-13 hours/week | - | C-like programming language | [chat](https://discord.gg/vxB2DRV) +[Build a Modern Computer from First Principles: Nand to Tetris Part II ](https://www.coursera.org/learn/nand2tetris2) | 6 weeks | 12-18 hours/week | - | one of [these programming languages](https://user-images.githubusercontent.com/2046800/35426340-f6ce6358-026a-11e8-8bbb-4e95ac36b1d7.png), From Nand to Tetris Part I | [chat](https://discord.gg/AsUXcPu) +[Operating Systems: Three Easy Pieces](coursepages/ostep/README.md) | 10-12 weeks | 6-10 hours/week | - | Nand to Tetris Part II | [chat](https://discord.gg/wZNgpep) +[Computer Networking: a Top-Down Approach](http://gaia.cs.umass.edu/kurose_ross/online_lectures.htm)| 8 weeks | 4–12 hours/week | [Wireshark Labs](http://gaia.cs.umass.edu/kurose_ross/wireshark.php) | algebra, probability, basic CS | [chat](https://discord.gg/MJ9YXyV) + +### Core theory + +**Topics covered**: +`divide and conquer` +`sorting and searching` +`randomized algorithms` +`graph search` +`shortest paths` +`data structures` +`greedy algorithms` +`minimum spanning trees` +`dynamic programming` +`NP-completeness` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Divide and Conquer, Sorting and Searching, and Randomized Algorithms](https://www.coursera.org/learn/algorithms-divide-conquer) | 4 weeks | 4-8 hours/week | any programming language, Mathematics for Computer Science | [chat](https://discord.gg/mKRS7tY) +[Graph Search, Shortest Paths, and Data Structures](https://www.coursera.org/learn/algorithms-graphs-data-structures) | 4 weeks | 4-8 hours/week | Divide and Conquer, Sorting and Searching, and Randomized Algorithms | [chat](https://discord.gg/Qstqe4t) +[Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming](https://www.coursera.org/learn/algorithms-greedy) | 4 weeks | 4-8 hours/week | Graph Search, Shortest Paths, and Data Structures | [chat](https://discord.gg/dWVvjuz) +[Shortest Paths Revisited, NP-Complete Problems and What To Do About Them](https://www.coursera.org/learn/algorithms-npcomplete) | 4 weeks | 4-8 hours/week | Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming | [chat](https://discord.gg/dYuY78u) + +### Core security +**Topics covered** +`Confidentiality, Integrity, Availability` +`Secure Design` +`Defensive Programming` +`Threats and Attacks` +`Network Security` +`Cryptography` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Cybersecurity Fundamentals](https://www.edx.org/course/cybersecurity-fundamentals) | 8 weeks | 10-12 hours/week | - | [chat](https://discord.gg/XdY3AwTFK4) +[Principles of Secure Coding](https://www.coursera.org/learn/secure-coding-principles)| 4 weeks | 4 hours/week | - | [chat](https://discord.gg/5gMdeSK) +[Identifying Security Vulnerabilities](https://www.coursera.org/learn/identifying-security-vulnerabilities) | 4 weeks | 4 hours/week | - | [chat](https://discord.gg/V78MjUS) + +Choose **one** of the following: + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Identifying Security Vulnerabilities in C/C++Programming](https://www.coursera.org/learn/identifying-security-vulnerabilities-c-programming) | 4 weeks | 5 hours/week | - | [chat](https://discord.gg/Vbxce7A) +[Exploiting and Securing Vulnerabilities in Java Applications](https://www.coursera.org/learn/exploiting-securing-vulnerabilities-java-applications) | 4 weeks | 5 hours/week | - | [chat](https://discord.gg/QxC22rR) + +### Core applications + +**Topics covered**: +`Agile methodology` +`REST` +`software specifications` +`refactoring` +`relational databases` +`transaction processing` +`data modeling` +`neural networks` +`supervised learning` +`unsupervised learning` +`OpenGL` +`ray tracing` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Databases: Modeling and Theory](https://www.edx.org/course/modeling-and-theory)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/pMFqNf4) +[Databases: Relational Databases and SQL](https://www.edx.org/course/databases-5-sql)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/P8SPPyF) +[Databases: Semistructured Data](https://www.edx.org/course/semistructured-data)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/duCJ3GN) +[Machine Learning](https://www.coursera.org/specializations/machine-learning-introduction)| 11 weeks | 9 hours/week | Basic coding | [chat](https://discord.gg/NcXHDjy) +[Computer Graphics](https://www.edx.org/course/computer-graphics-2) ([alternative](https://cseweb.ucsd.edu/~viscomp/classes/cse167/wi22/schedule.html))| 6 weeks | 12 hours/week | C++ or Java, linear algebra | [chat](https://discord.gg/68WqMNV) +[Software Engineering: Introduction](https://www.coursera.org/learn/introduction-to-software-engineering) | 4 weeks | 8-10 hours/week | Core Programming, and a [sizable project](FAQ.md#why-require-experience-with-a-sizable-project-before-the-Software-Engineering-courses) | [chat](https://discord.gg/5Qtcwtz) + +### Core ethics + +**Topics covered**: +`Social Context` +`Analytical Tools` +`Professional Ethics` +`Intellectual Property` +`Privacy and Civil Liberties` +`and more` + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Ethics, Technology and Engineering](https://www.coursera.org/learn/ethics-technology-engineering)| 9 weeks | 2 hours/week | none | [chat](https://discord.gg/6ttjPmzZbe) +[Introduction to Intellectual Property](https://www.coursera.org/learn/introduction-intellectual-property)| 4 weeks | 2 hours/week | none | [chat](https://discord.gg/YbuERswpAK) +[Data Privacy Fundamentals](https://www.coursera.org/learn/northeastern-data-privacy)| 3 weeks | 3 hours/week | none | [chat](https://discord.gg/64J34ajNBd) + +## Advanced CS + +After completing **every required course** in Core CS, students should choose a subset of courses from Advanced CS based on interest. +Not every course from a subcategory needs to be taken. +But students should take *every* course that is relevant to the field they intend to go into. + +### Advanced programming + +**Topics covered**: +`debugging theory and practice` +`goal-oriented programming` +`parallel computing` +`object-oriented analysis and design` +`UML` +`large-scale software architecture and design` +`and more` + +Courses | Duration | Effort | Prerequisites +:-- | :--: | :--: | :--: +[Parallel Programming](https://www.coursera.org/learn/scala-parallel-programming)| 4 weeks | 6-8 hours/week | Scala programming +[Compilers](https://www.edx.org/course/compilers) | 9 weeks | 6-8 hours/week | none +[Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/)| 14 weeks | - | - +[Learn Prolog Now!](https://www.let.rug.nl/bos/lpn//lpnpage.php?pageid=online) ([alternative](https://github.com/ossu/computer-science/files/6085884/lpn.pdf))*| 12 weeks | - | - +[Software Debugging](https://www.udacity.com/course/software-debugging--cs259)| 8 weeks | 6 hours/week | Python, object-oriented programming +[Software Testing](https://www.youtube.com/playlist?list=PLAwxTw4SYaPkWVHeC_8aSIbSxE_NXI76g) | 4 weeks | 6 hours/week | Python, programming experience + +(*) book by Blackburn, Bos, Striegnitz (compiled from [source](https://github.com/LearnPrologNow/lpn), redistributed under [CC license](https://creativecommons.org/licenses/by-sa/4.0/)) + +### Advanced systems + +**Topics covered**: +`digital signaling` +`combinational logic` +`CMOS technologies` +`sequential logic` +`finite state machines` +`processor instruction sets` +`caches` +`pipelining` +`virtualization` +`parallel processing` +`virtual memory` +`synchronization primitives` +`system call interface` +`and more` + +Courses | Duration | Effort | Prerequisites | Notes +:-- | :--: | :--: | :--: | :--: +[Computation Structures 1: Digital Circuits](https://learning.edx.org/course/course-v1:MITx+6.004.1x_3+3T2016) [alternative 1](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/) [alternative 2](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2009/) | 10 weeks | 6 hours/week | [Nand2Tetris II](https://www.coursera.org/learn/nand2tetris2) | Alternate links contain all 3 courses. +[Computation Structures 2: Computer Architecture](https://learning.edx.org/course/course-v1:MITx+6.004.2x+3T2015) | 10 weeks | 6 hours/week | Computation Structures 1 | +[Computation Structures 3: Computer Organization](https://learning.edx.org/course/course-v1:MITx+6.004.3x_2+1T2017) | 10 weeks | 6 hours/week | Computation Structures 2 | + +### Advanced theory + +**Topics covered**: +`formal languages` +`Turing machines` +`computability` +`event-driven concurrency` +`automata` +`distributed shared memory` +`consensus algorithms` +`state machine replication` +`computational geometry theory` +`propositional logic` +`relational logic` +`Herbrand logic` +`game trees` +`and more` + +Courses | Duration | Effort | Prerequisites +:-- | :--: | :--: | :--: +[Theory of Computation](https://ocw.mit.edu/courses/18-404j-theory-of-computation-fall-2020/) ([alternative](http://aduni.org/courses/theory/index.php?view=cw)) | 13 weeks | 10 hours/week | [Mathematics for Computer Science](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about), logic, algorithms +[Computational Geometry](https://www.edx.org/course/computational-geometry) | 16 weeks | 8 hours/week | algorithms, C++ +[Game Theory](https://www.coursera.org/learn/game-theory-1) | 8 weeks | 3 hours/week | mathematical thinking, probability, calculus + +### Advanced Information Security + +Courses | Duration | Effort | Prerequisites +:-- | :--: | :--: | :--: +[Web Security Fundamentals](https://www.edx.org/course/web-security-fundamentals) | 5 weeks | 4-6 hours/week | understanding basic web technologies +[Security Governance & Compliance](https://www.coursera.org/learn/security-governance-compliance) | 3 weeks | 3 hours/week | - +[Digital Forensics Concepts](https://www.coursera.org/learn/digital-forensics-concepts) | 3 weeks | 2-3 hours/week | Core Security +[Secure Software Development: Requirements, Design, and Reuse](https://www.edx.org/course/secure-software-development-requirements-design-and-reuse) | 7 weeks | 1-2 hours/week | Core Programming and Core Security +[Secure Software Development: Implementation](https://www.edx.org/course/secure-software-development-implementation) | 7 weeks | 1-2 hours/week | Secure Software Development: Requirements, Design, and Reuse +[Secure Software Development: Verification and More Specialized Topics](https://www.edx.org/course/secure-software-development-verification-and-more-specialized-topics) | 7 weeks | 1-2 hours/week | Secure Software Development: Implementation + +### Advanced math + +Courses | Duration | Effort | Prerequisites | Discussion +:-- | :--: | :--: | :--: | :--: +[Essence of Linear Algebra](https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) | - | - | [high school math](FAQ.md#how-can-i-review-the-math-prerequisites) | [chat](https://discord.gg/m6wHbP6) +[Linear Algebra](https://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/) | 14 weeks | 12 hours/week | corequisite: Essence of Linear Algebra | [chat](https://discord.gg/k7nSWJH) +[Introduction to Numerical Methods](https://ocw.mit.edu/courses/mathematics/18-335j-introduction-to-numerical-methods-spring-2019/index.htm)| 14 weeks | 12 hours/week | [Linear Algebra](https://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/) | [chat](https://discord.gg/FNEcNNq) +[Introduction to Formal Logic](https://forallx.openlogicproject.org/) | 10 weeks | 4-8 hours/week | [Set Theory](https://www.youtube.com/playlist?list=PL5KkMZvBpo5AH_5GpxMiryJT6Dkj32H6N) | [chat](https://discord.gg/MbM2Gg5) +[Probability](https://projects.iq.harvard.edu/stat110/home) | 15 weeks | 5-10 hours/week | [Differentiation and Integration](https://www.edx.org/course/calculus-1b-integration) | [chat](https://discord.gg/UVjs9BU) + +## Final project + +Part of learning is doing. +The assignments and exams for each course are to prepare you to use your knowledge to solve real-world problems. + +After you've completed Core CS and the parts of Advanced CS relevant to you, +you should identify a problem that you can solve using the knowledge you've acquired. +You can create something entirely new, or you can improve some tool/program that you use and wish were better. + +Students who would like more guidance in creating a project may choose to use a series of project oriented courses. +Here is a sample of options +(many more are available, at this point you should be capable of identifying a series that is interesting and relevant to you): + +Courses | Duration | Effort | Prerequisites +:-- | :--: | :--: | :--: +[Fullstack Open](https://fullstackopen.com/en/) | 12 weeks | 15 hours/week | programming +[Modern Robotics (Specialization)](https://www.coursera.org/specializations/modernrobotics) | 26 weeks | 2-5 hours/week | freshman-level physics, linear algebra, calculus, [linear ordinary differential equations](https://www.khanacademy.org/math/differential-equations) +[Data Mining (Specialization)](https://www.coursera.org/specializations/data-mining) | 30 weeks | 2-5 hours/week | machine learning +[Big Data (Specialization)](https://www.coursera.org/specializations/big-data) | 30 weeks | 3-5 hours/week | none +[Internet of Things (Specialization)](https://www.coursera.org/specializations/internet-of-things) | 30 weeks | 1-5 hours/week | strong programming +[Cloud Computing (Specialization)](https://www.coursera.org/specializations/cloud-computing) | 30 weeks | 2-6 hours/week | C++ programming +[Data Science (Specialization)](https://www.coursera.org/specializations/jhu-data-science) | 43 weeks | 1-6 hours/week | none +[Functional Programming in Scala (Specialization)](https://www.coursera.org/specializations/scala) | 29 weeks | 4-5 hours/week | One year programming experience +[Game Design and Development with Unity 2020 (Specialization)](https://www.coursera.org/specializations/game-design-and-development) | 6 months | 5 hours/week | programming, interactive design + +## Congratulations + +After completing the requirements of the curriculum above, +you will have completed the equivalent of a full bachelor's degree in Computer Science. +Congratulations! + +What is next for you? The possibilities are boundless and overlapping: + +- Look for a job as a developer! +- Check out the [readings](extras/readings.md) for classic books you can read that will sharpen your skills and expand your knowledge. +- Join a local developer meetup (e.g. via [meetup.com](https://www.meetup.com/)). +- Pay attention to emerging technologies in the world of software development: + + Explore the **actor model** through [Elixir](https://elixir-lang.org/), a new functional programming language for the web based on the battle-tested Erlang Virtual Machine! + + Explore **borrowing and lifetimes** through [Rust](https://www.rust-lang.org/), a systems language which achieves memory- and thread-safety without a garbage collector! + + Explore **dependent type systems** through [Idris](https://www.idris-lang.org/), a new Haskell-inspired language with unprecedented support for type-driven development. + +![keep learning](https://i.imgur.com/REQK0VU.jpg) + +# Code of conduct +[OSSU's code of conduct](https://github.com/ossu/code-of-conduct). + +## How to show your progress + +[Fork](https://www.freecodecamp.org/news/how-to-fork-a-github-repository/) the [GitHub repo](https://github.com/ossu/computer-science) into your own GitHub account and put ✅ next to the stuff you've completed as you complete it. This can serve as your [kanban board](https://en.wikipedia.org/wiki/Kanban_board) and will be faster to implement than any other solution (giving you time to spend on the courses). + +# Team + +* **[Eric Douglas](https://github.com/ericdouglas)**: founder of OSSU +* **[Josh Hanson](https://github.com/joshmhanson)**: lead technical maintainer +* **[Waciuma Wanjohi](https://github.com/waciumawanjohi)**: lead academic maintainer +* **[Contributors](https://github.com/ossu/computer-science/graphs/contributors)** diff --git a/coursepages/intro-cs/README.md b/coursepages/intro-cs/README.md new file mode 100644 index 000000000..9b86764dc --- /dev/null +++ b/coursepages/intro-cs/README.md @@ -0,0 +1,32 @@ +# Introduction to Computer Science + +This course will introduce you to the world of computer science. Students who have been introduced to programming, either from the courses above or through study elsewhere, should take this course for a flavor of the material to come. If you finish the course wanting more, Computer Science is likely for you! + +This course has been developed by MIT and is available from three different places. We recommend you to do it from the archived version on Edx. + +> 6.0001 Introduction to Computer Science and Programming in Python is intended for students with little or no programming experience. It aims to provide students with an understanding of the role computation can play in solving problems and to help students, regardless of their major, feel justifiably confident of their ability to write small programs that allow them to accomplish useful goals. The class uses the Python 3.5 programming language. + +**Course Link:** + +Alternative Links: + +- +- (instructor-paced version, runs three times a year) + +## Instructions + +**Note:** These instructions are for the archived version of the course on Edx, which we recommend. They don't apply to other versions of the course. + +- The course does not have a homepage on Edx, but don't worry about it. Open the [link](https://learning.edx.org/course/course-v1:MITx+6.00.1x+2T2018/home) given above, log in (if you are not logged in) and then enroll in the course. +- Work through the course as given in the course overview. Watch the videos, do the finger exercises, and then solve the problem sets. +- You won't be able to submit your responses for the finger exercises, but you can see their answers by clicking on "Show Answer". Check your answers honestly. +- You won't be able to submit the problem sets on their own page. To submit them, go to the "Sandbox" section (It is the last section. You can find it on the course overview). There, you will be able to submit your work and get it graded. +- You don't need to install the full Anaconda distribution to do this course. See the notes section below for more information. +- If you are stuck somewhere, feel free to ask questions. You can join the OSSU chat for this course here: . + +## Notes + +- You don't need to install the full anaconda package to do this course. You can just download the Spyder IDE from here: . It comes bundles with python as well as some popular scientific python libraries (all the libraries which this course uses are included), but it is not as large or complex as the full anaconda distribution. You don't need to set up python separately or anything. +- The community has found this resource useful: +- You won't get any certificate for doing this course. If you really want a certificate, you need to do the [instructor-paced version of this course](https://www.edx.org/course/introduction-to-computer-science-and-programming-7) on Edx. Certificate of an introductory course like this is not very valuable, so unless you are absolutely sure, we recommend you to do the archived version of this course instead. +- If for some reason you want to do the OCW version of the course, you will find many useful notes and fixes of various problems in our [discord server](https://discord.gg/jvchSm9). diff --git a/coursepages/intro-programming/README.md b/coursepages/intro-programming/README.md new file mode 100644 index 000000000..eb011b7cd --- /dev/null +++ b/coursepages/intro-programming/README.md @@ -0,0 +1,88 @@ +# Introduction to Programming + +If you've never written a for-loop, or don't know what a string is in programming, start here. These courses are self-paced, allowing you to adjust the number of hours you spend per week to meet your needs. + +We are currently looking for volunteers to try out both of the following two courses and analyze them in different ways to determine which one is better suited to be included in our curriculum. We suggest that you flip a coin to decide which one to take first, so that you avoid an ordering bias. Once you have completed both courses, please provide your analysis of [this RFC](https://github.com/ossu/computer-science/issues/1164). + +If you don't have time or do not want to volunteer, you are required to do **only ONE** of the following courses. + +## CS50P: Introduction to Programming with Python + +This course has been developed by the CS50 team at Harvard University. +> An introduction to programming using a language called Python. Learn how to read and write code as well as how to test and "debug" it. Designed for students with or without prior programming experience who'd like to learn Python specifically. Learn about functions, arguments, and return values (oh my!); variables and types; conditionals and Boolean expressions; and loops. Learn how to handle exceptions, find and fix bugs, and write unit tests; use third-party libraries; validate and extract data with regular expressions; model real-world entities with classes, objects, methods, and properties; and read and write files. Hands-on opportunities for lots of practice. Exercises inspired by real-world programming problems. No software required except for a web browser, or you can write code on your own PC or Mac. + +**Link**: + +**Note**: This course is *different* from CS50 or CS50x. CS50 is not part of the OSSU curriculum. That being said, if you have completed CS50, you can skip this course and move on to the next one. + +### Instructions + + - If you want to follow along with the instructor, log in to the [CS50 "codespace"](https://cs50.dev) and watch [this video](https://cs50.harvard.edu/python/2022/shorts/visual_studio_code_for_cs50/) to get started. + - Watch each lecture and complete the respective problem set. Read the lecture notes to revise things. + - If you are stuck somewhere, feel free to ask questions. You can join the OSSU chat for this course here: . + - You can also join the CS50 discord server and ask questions there: , but note that it is not affiliated with or maintained by OSSU. + +### Course Materials + +0. [Functions, Variables](https://cs50.harvard.edu/python/2022/weeks/0/) — [Notes](https://cs50.harvard.edu/python/2022/notes/0/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/0/) +1. [Conditionals](https://cs50.harvard.edu/python/2022/weeks/1/) — [Notes](https://cs50.harvard.edu/python/2022/notes/1/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/1/) +2. [Loops](https://cs50.harvard.edu/python/2022/weeks/2/) — [Notes](https://cs50.harvard.edu/python/2022/notes/2/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/2/) +3. [Exceptions](https://cs50.harvard.edu/python/2022/weeks/3/) — [Notes](https://cs50.harvard.edu/python/2022/notes/3/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/3/) +4. [Libraries](https://cs50.harvard.edu/python/2022/weeks/4/) — [Notes](https://cs50.harvard.edu/python/2022/notes/4/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/4/) +5. [Unit Tests](https://cs50.harvard.edu/python/2022/weeks/5/) — [Notes](https://cs50.harvard.edu/python/2022/notes/5/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/5/) +6. [File I/O](https://cs50.harvard.edu/python/2022/weeks/6/) — [Notes](https://cs50.harvard.edu/python/2022/notes/6/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/6/) +7. [Regular Expressions](https://cs50.harvard.edu/python/2022/weeks/7/) — [Notes](https://cs50.harvard.edu/python/2022/notes/7/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/7/) +8. [Object-Oriented Programming](https://cs50.harvard.edu/python/2022/weeks/8/) — [Notes](https://cs50.harvard.edu/python/2022/notes/8/) — [Problem Set](https://cs50.harvard.edu/python/2022/psets/8/) +9. [Et Cetera](https://cs50.harvard.edu/python/2022/weeks/9/) — [Notes](https://cs50.harvard.edu/python/2022/notes/9/) — [Final Project](https://cs50.harvard.edu/python/2022/project/) + +## Python for Everybody + +This course has been created by Professor Charles Severance from the University of Michigan. +> Learn to Program and Analyze Data with Python. Develop programs to gather, clean, analyze, and visualize data. + +**Link**: + +**Textbook**: [PDF](http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf) / [EPUB](http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.epub) / [HTML](https://www.py4e.com/html3) / [Buy hardcopy](https://www.py4e.com/book) + +**Note**: This course is also offered on Coursera, Edx. Those versions require you to pay to get the full version of the course. We suggest doing the course on its website, which is completely free. + +### Instructions + +- You need to [sign in](https://www.py4e.com/) to the course website using your Google account to access the assignments. +- Watch all the videos of a lesson and then do its assignments. +- If you prefer reading books, you can read the HTML version of the chapter related to the lesson linked on the lesson's page, or you can download the whole book in different formats from [this page](https://www.py4e.com/book). +- If you face any problems, feel free to ask questions. You can join the OSSU chat for this course here: . +- You only need to complete the course up to the Regular Expressions lesson. The rest of the course is optional. + +### Course Materials + +1. [Installing Python](https://www.py4e.com/lessons/install) +2. [Why Program?](https://www.py4e.com/lessons/intro) +3. [Variables, expressions and statements](https://www.py4e.com/lessons/memory) +4. [Conditional Execution](https://www.py4e.com/lessons/logic) +5. [Functions](https://www.py4e.com/lessons/functions) +6. [Loops and Iterations](https://www.py4e.com/lessons/loops) +7. [Strings](https://www.py4e.com/lessons/strings) +8. [Files](https://www.py4e.com/lessons/files) +9. [Lists](https://www.py4e.com/lessons/lists) +10. [Dictionaries](https://www.py4e.com/lessons/dictionary) +11. [Tuples](https://www.py4e.com/lessons/tuples) +12. [Regular Expressions](https://www.py4e.com/lessons/regex) +13. [Network Programming](https://www.py4e.com/lessons/network) (Optional) +14. [Using Web Services](https://www.py4e.com/lessons/servces) (Optional) +15. [Object-Oriented Programming](https://www.py4e.com/lessons/Objects) (Optional) +16. [Databases](https://www.py4e.com/lessons/database) (Optional) +17. [Data Visualization](https://www.py4e.com/lessons/dataviz) (Optional) + +### Fixes + +1. If you're doing the BeautifulSoup4 lesson, there is an issue with Python 3.10+ that will give you an error referencing the Collections library. We have a fix for you. We don't expect you to understand it, just put this in front of your code in the imports block: + +```python +import collections +collections.Callable = collections.abc.Callable + +from bs4 import BeautifulSoup +``` + +Doing this should fix the compatibility issue and allow your code to run. diff --git a/coursepages/ostep/Project-1B-initial-xv6.md b/coursepages/ostep/Project-1B-initial-xv6.md new file mode 100644 index 000000000..8ef57313d --- /dev/null +++ b/coursepages/ostep/Project-1B-initial-xv6.md @@ -0,0 +1,35 @@ +## Project 1B + +### all thanks to [palladian](https://github.com/palladian1) + +### Linux Installation + +* Make sure you have a compatible compiler toolchain; if you're on Linux, gcc should work perfectly. +* Install qemu-system-x86 (may be called qemu-system-i386 or qemu-system-x86_64; note that on some distros, qemu is the wrong package). +* Install Perl. +* Install gawk. +* Install expect. +* Make a src/ directory in the same directory as the project's test script. +* Clone xv6 github repo and copy the source code in to your src/ directory. +* Inside src/, run `make qemu-nox` to test whether xv6 is working. Exit xv6 with `Ctrl-a x`; if you forget this, you can also kill the qemu process. It's worth checking `top` or `htop` to make sure qemu isn't running anymore; sometimes it can keep going after you exit and consume a lot of resources. +* Modify the Makefile to set `CPUS := 1`. +* Run `make qemu-nox` again to test that xv6 still works. + +### Instructions + +* Your task is to create a new system call for xv6, `getreadcount()`, that will return the number of `read` syscalls that have previously taken place. Note that the count should be a global count, not a per-process count. + +### Suggested Approach + +* Download the xv6 source code PDF (it's better organized there than in the code you downloaded). Read the table of contents to understand how sheets, pages, and lines are numbered. Then glance at the cross-references after that so you know how to find parts of the code if you need to. +* Take a (very) quick look at the portions of the xv6 source code listed under `processes` and `system calls` on the table of contents, as well as `usys.S` in the `user-level` section. Don't worry about understanding it yet; you just need to see where each file is in the PDF so that you can follow along with the discussion video later, since the professor's code has a different directory layout than yours will. +* Watch the video for discussion 2 on Project P1B, and follow along with your PDF copy of the xv6 code. Annotate it as the professor explains what each part does. +* Read the background section linked on the project's Github page, annotating the xv6 code PDF. +* Read through the xv6 PDF one more time, this time to get a general understanding of the `processes` and `system calls` sections, as well as `usys.S` and `user.h` (NOTE: the last one isn't included in the xv6 PDF, so you'll have to look at the actual code you downloaded). Don't worry about understanding every last line of code, just make sure you know where system calls are defined, how they're called, etc. +* Modify the xv6 source code to add the new `getreadcount()` syscall. You will need to modify several files; I suggest marking your modifications with `// OSTEP project` to make it easy to find them later for debugging. +* There is one other place you'll have to add code, which isn't included in the xv6 PDF: `user.h`. +* Once you're done, run the test script. Test 1 runs a function that will make several `read` calls, then calls `getreadcount`. In order for your code to work, you must correctly keep track of the total number of `read` calls made by all processes. +* If your code passes test 1, congratulations! You're done for now. Don't worry about test 2 until after you've watched the lectures on concurrency. +* If your code didn't pass test 1, you can compare the expected output in `tests/1.out` with your test's actual output in `tests-out/1.out`. You can also look at `tests-out/1.err` to check for any error messages. +* You can also test your code by loading up xv6 in your terminal with `make qemu-nox`. Type `ls` to see all files; you should see `test_1` and `test_2`. Run test 1 with `./test_1` to see what it prints out; you can compare that manually with the expected output. +* Once you've watched the lectures on threads, concurrency, and locks: test 2 checks whether your implementation of `getreadcount` is thread-safe. It probably wasn't before, so in order to fix that, you'll have to add a lock. Then you can run the test script again and check that your code now passes both tests. diff --git a/coursepages/ostep/Project-2A-processes-shell.md b/coursepages/ostep/Project-2A-processes-shell.md new file mode 100644 index 000000000..7ff80cf5c --- /dev/null +++ b/coursepages/ostep/Project-2A-processes-shell.md @@ -0,0 +1,45 @@ +## Project 2A +### all thanks to [Palladian](https://github.com/palladian1/) + +- [x] Interactive mode +- [x] Batch mode +- [x] exit +- [x] cd +- [x] path +- [x] Redirection +- [x] Parallel commands + +### Tips + +* Watch the video for discussion 3 on the Unix shell. +* Read chapter 5 in the OSTEP book. +* Start by implementing a shell that only does one thing: prints the prompt, then exits when you type `exit`. Then add `cd`, then `path`. Then implement the ability to execute commands with `execv`, then add batch mode, then redirection, and finally parallel commands. +* All of the test scripts will use batch mode and redirection, so until you've got those done, you'll have to test your shell manually. +* When you implement the `path` command, make sure you can handle both absolute and relative paths (i.e., `path tests` as well as `path /usr/bin`. +* It's tricky to get the errors down right, so just add error messages wherever it seems reasonable, then run the test scripts and modify your code until you're reporting errors exactly when you're supposed to. If you're running test `i`, you can check `tests/i.err` and `tests/i.rc` to see how many errors your shell should generate and compare to `tests-out/i.err` and `tests-out/i.rc`. +* If you run into issues with test 3 where the test expects something like `ls: cannot access ...` and your shell outputs `/bin/ls: cannot access ...` or `/usr/bin/ls: cannot access ...`, try modifying your $PATH environment variable to start with `/bin`. If that doesn't work, just modify `tests/3.err` to match the output your system gives. You can't modify your system's output without messing with the implementation of `ls` and/or `execv`, so it's okay to skip this test as long as it's working in spirit. +* I had to edit `/tests/3.pre` to use `/bin/ls` due to how it's set up on my system, in order to pass all the tests. Alternatively you can add `export PATH="/bin:$PATH"` to your `.profile` or `.bashrc` file. + +### Memory Management Traps and Pitfalls + +* This assignment makes it really easy to create pointers to stack variables that will no longer exist once they're out of scope, thus causing a segmentation fault. Make sure that if you set a pointer to point to a string, that string is something you allocated on the heap, and not on the stack. + +* That said, if you do use a string on the stack, you can copy it into a heap-allocated string using `strcpy()`, `strncpy()`, `strcat()`, and `strncat()`. + +* Only use `strcpy()` and `strcat()` for fixed-size strings and make sure the buffer you're copying into has enough space to hold the string, plus an extra character for `\0`. + +* For `strncpy()` and `strncat()`, make sure `n` is large enough to fit the `\0` terminator, or add it manually. + +* Watch out for use-after-frees, especially in the implementation of `path`. + +* Make sure you free any strings from `getline()` and `strdup()`, but watch out for double-frees, e.g. don't free a substring of a string you already freed. + +* Avoid the C library function `strtok()`; it's not thread-safe. Use `strsep()` instead. + +* When you use `strsep()`, make sure you keep a copy of the original pointer to the string around so that you can free it later, because `strsep()` will modify the pointer, so if you free that later on, you'll corrupt the page table. + +* After calling `strsep(&buf, delim)`, check whether `buf` is `NULL` before dereferencing it. +* General C coding practice: if you allocate memory for a data structure inside a function, you should free it in the same function. If you allocate memory in a dedicated `create_xxx` function, you should have a corresponding `destroy_xxx` function. That way, you always allocate and free memory at the same function depth, which makes it easier to avoid memory errors. +* After every call to `malloc`, `calloc`, or `realloc`, check whether the result is `NULL`. +* Use `calloc` instead of `malloc` if you're creating an array of pointers to avoid creating pointers to garbage values. +* in `update_path` I had to fix that issue where most of the tests do `path /bin /usr/bin`, but one of them did `path tests`. So i just assumed that if your path starts with a slash, it's an absolute path and you should copy it in as is; if it doesn't, it's a relative path and you should add a ./ at the beginning. diff --git a/coursepages/ostep/README.md b/coursepages/ostep/README.md new file mode 100644 index 000000000..ab1eaf0cd --- /dev/null +++ b/coursepages/ostep/README.md @@ -0,0 +1,191 @@ +# Operating Systems: Three Easy Pieces + +Credit goes to [palladian](https://github.com/palladian1) +## Introduction + +First, we should be frank: it's really hard to find a good self-contained online course on operating systems. OSTEP is the best course we've found so far. We describe below two approaches to the course, a "Base" approach which is suitable for most students, and an "Extended" approach, which is appropriate for students intending to specialize in systems programming. + +The "base" approach covers all of our operating system curriculum requirements and should take about 80 hours of work. + +The "extended" approach contains all of the work of the base approach and more. It involves learning very serious C and x86 assembly, and delving deep into kernel programming. It takes significantly more time (over 200 hours) and is much more challenging. For those students interested in this area of computing it is also highly rewarding. + +## Base Approach + +1. Read through the free online textbook Operating Systems: Three Easy Pieces +2. Complete the homework questions at the end of each chapter. (There is an associated [Github repository](https://github.com/remzi-arpacidusseau/ostep-homework) for the homeworks.) + +This should take about 8 weeks, 10 hours/week. That's all you need to do! + +You will need a Unix/Linux system, some basic command line tools, and a C compiler (such as GCC or Clang). On Windows, you can install Ubuntu in a virtual machine, or use WSL (Windows Subsystem for Linux). Mac OS is Unix-like, so it should be OK to use. + +### Course Links + +* [Book](https://pages.cs.wisc.edu/~remzi/OSTEP/) +* [Homework](https://pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html) +* [Homework Source Code Repo](https://github.com/remzi-arpacidusseau/ostep-homework) +* [Homework Solutions](https://github.com/xxyzz/ostep-hw) + +### C + +**Question**: I see some C code in this book. How much C do I need to know? + +**Answer**: You'll need to read and understand some C code in this book. You'll need basic understanding of arrays, pointers and print formatting. You can consult the free book [Modern C](https://hal.inria.fr/hal-02383654/file/ModernC.pdf) by [Jen Gustadt](https://gustedt.gitlabpages.inria.fr/modern-c/). The [CS50 Manual pages](https://manual.cs50.io) are also helpful to look up functions. You shouldn't spend too much time on learning C. + +The code you'll read is fairly simple and presented in short fragments. The book helps you out quite a bit by manually introducing many C APIs such as the Process API, the Thread API, and so on. You can type, compile and run the code fragments, and read the corresponding explanations. The book explains them in great detail in a conversational style that's fun to read. + +You will also write a little bit of C code. Only a minority of the chapters (about 10 out of 50) ask you to write some C code (while the other chapters require you to run provided simulation code and answer questions). These are usually simple, short C programs that imitate the code that was presented in that chapter, with small modifications. + +If you are getting stuck on these, please don't spend too much time on them. There is a great solution set [here](https://github.com/xxyzz/ostep-hw). There is no honor code for this, so you are free to use the solutions. If you find yourself spending too much time, feel free to read and understand the solutions instead. Your main priority should be to gain understanding of operating systems concepts, not to master C coding. + +## Extended Approach + +If you've chosen this option, then this is the first course in the OSSU curriculum for which you'll need to learn some prerequisites on your own before starting it, in addition to the courses that come before it in the curriculum. You might also run into some issues running the scripts for homework demos and for testing your solutions to the projects (although we hope we've solved most of those by now). + +That said, if you're able to commit the time required for the prerequisites, we believe the reward is well worth the effort: this course is exciting, interesting, and quite useful for other fields of computer science and programming. One big attraction of this course is the opportunity to see a simplified but fully-functional Unix-like operating system in action and understand the concepts and design decisions that went into it as well as the low-level implementation details. + +You should either watch all the lecture videos or read chapters 1 through 47 in the textbook (don't worry, the chapters are usually just a few pages long) as well as finish the projects listed below. We also strongly encourage you to do the homework exercises as they're assigned on the course website or in the book chapters; think of these like the "check-your-understanding" questions that pop up in the middle of lecture videos on sites like Coursera or edX. + +### Prerequisites + +This class requires a lot of experience programming in C. You should finish one of the C books listed in the [resources below](#c-1) *before* starting this course; if you try to learn C at the same time as the course material, you're likely to feel overwhelmed. If you haven't used C before, you should expect to spend a lot of time on this; it's hard to predict how long it might take for each person, but a rough estimate might be 8-10 hours per week for 3-5 weeks. You can always learn C alongside another OSSU course or even redo the exercises for other courses in C to gain practice with it. + +You should also finish both parts of Nand2Tetris before starting this course. OSTEP focuses on the real-world x86 and x86_64 architectures, so you'll have to fill in some gaps in order to translate the concepts you learned in Nand2Tetris to a new architecture. You can do that with the x86 resources below, but note that they all assume you know C, so learn that first. This should take around 6-8 hours in total. + +### Course Links + +* [Course website](https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/) +* [Book](https://pages.cs.wisc.edu/~remzi/OSTEP/) +* [Lecture videos](https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/Discussion/videos.html) +* [Homework](https://pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html) +* [Homework Source Code Repo](https://github.com/remzi-arpacidusseau/ostep-homework) +* [Homework Solutions](https://github.com/xxyzz/ostep-hw) +* [Projects](https://github.com/remzi-arpacidusseau/ostep-projects) +* [xv6](https://github.com/mit-pdos/xv6-public) + +### Roadmap + +This course was originally taught as CS 537 at the University of Wisconsin by the author of the OSTEP textbook, so the projects are assigned in the course according to the best times to give UWisconsin students access to on-campus resources like recitation sections and office hours. That means they don't match up perfectly with the material being covered at that time in the lectures or textbook chapters. We recommend doing the course in the following order instead. + +[Reading order](Reading-order.md) + +* Read chapters 1 and 2 of the OSTEP textbook and watch the first half (the introduction) of lecture 1. +* Do the `initial-utilities` project; it's intended as a litmus test for you to make sure you're comfortable enough with C before taking this class. You can watch discussion 1 for help. If it takes you more than 2 hours to write the code (not counting the discussion time and any time spent debugging), you should consider spending more time learning C before moving on in the course. (If you want more practice, you can do `initial-reverse` too, but it's not required.) +* Watch lectures 1 through 5 and read chapters 3 through 24 of the OSTEP textbook. We recommend doing the homework assignments as they come up in the course calendar or book chapters. +* Watch discussion 3 and reread chapter 5, then do the `processes-shell` project. +* Read the annotated guide to xv6 linked in the resources section below, starting from the beginning and stopping after the `System Calls: Processes` section. +* Watch discussion 2, then do the `initial-xv6` project. +* Watch discussion 5, then do the `scheduling-xv6-lottery` project. +* Watch discussion 7, then do the `vm-xv6-intro` project. +* Watch lectures 6 through 9 (and optionally, the review lecture) and read chapters 25 through 34; again, you're encouraged to do the homework. +* Watch discussion 10, then do the `concurrency-xv6-threads` project. +* Watch discussions 11 and 12, then do the `concurrency-mapreduce` project. +* Watch lectures 10 through 14 (and optionally, the second review lecture) and read chapters 35 through 47; remember to do the homework along with the lectures or chapters. +* Do the `filesystems-checker` project. + +### Running the Projects + +This course was originally taught as CS 537 at the University of Wisconsin by the author of the OSTEP textbook, which means that the homework and projects were written with those students as a target audience and designed to be run on UWisconsin lab computers with specific software versions pre-installed for students. We hope this section fixes that so you can run them on other computers, but we haven't tested this on every computer, so if you run into other issues, let us know on the [Discord channel](https://discord.gg/MJ9YXyV) and we'll try to help out. + +In order to run the homework and projects on Linux or macOS, you'll need to have all of the following programs installed: + +* `gcc` +* `gas` +* `ld` +* `gdb` +* `make` +* `objcopy` +* `objdump` +* `dd` +* `python` +* `perl` +* `gawk` +* `expect` +* `git` + +You will also need to install `qemu`, but we recommend using the patched version provided by the xv6 authors; see [this link](https://pdos.csail.mit.edu/6.828/2018/tools.html) for details. + +On macOS, you'll need to install a cross-compiler `gcc` suite capable of producing x86 ELF binaries; see the link above for details as well. + +On Windows, you can use a Linux virtual machine for the homework and projects. Some of these packages are not yet supported on Apple M1 computers, and virtual machine software has not yet been ported to the new processor architecture; some students have used a VPS to do the homework and projects instead. + +Next, clone the `ostep-homework` and `ostep-projects` repositories: +```sh +git clone https://github.com/remzi-arpacidusseau/ostep-homework/ +git clone https://github.com/remzi-arpacidusseau/ostep-projects/ +cd ostep-projects +``` + +You'll have to clone [the `xv6-public` repository](https://github.com/mit-pdos/xv6-public) into the directory for each xv6-related OSTEP project. You could use the same copy for all the projects, but we recommend using separate copies to avoid previous projects causing bugs for later ones. Run the following commands in *each* of the `initial-xv6`, `scheduling-xv6-lottery`, `vm-xv6-intro`, `concurrency-xv6-threads`, and `filesystems-checker` directories. + +```sh +mkdir src +git clone https://github.com/mit-pdos/xv6-public src +``` + +### Hints and tips for Projects + +- `initial-reverse`: the error messages that are needed to pass the tests were wrong! The provided text said `"error: ..."` but the tests expected `"reverse: ..."` so make sure to match the tests' expectations in your code. +- [hints and tips for `processes-shell`](Project-2A-processes-shell.md) +- [hints for Project 1B: `initial-xv6`](Project-1B-initial-xv6.md) +- [hints for `scheduling-xv6-lottery`](Scheduling-xv6-lottery.md) +- [hints for `vm-xv6-intro`](vm-xv6-intro.md) + +### Resources + +#### C + +Please don't try to learn C from sites like GeeksforGeeks, TutorialsPoint, or Hackr.io (we're not even gonna link to them here). Those are great resources for other languages, but C has way too many pitfalls, and C tutorials online are often filled with dangerous errors and bad coding practices. We looked at many C resources for the recommendations below and unfortunately found *many* bad or unsafe ones; we'll only include the best ones here, so look no further! + +We recommend learning C by working through (the entirety of) Jens Gustedt's *Modern C*, which is [freely available online](https://hal.inria.fr/hal-02383654/file/ModernC.pdf). This book is relatively short and will bring you up to speed on the C language itself as well as modern coding practices for it. Make sure to do all the exercises in the footnotes! + +While the book above is our default recommendation, we also recommend K.N. King's [*C Programming: A Modern Approach*](http://www.knking.com/books/c2/) as a second, more beginner-friendly option. It has some disadvantages: it's much longer (almost 850 pages), it's not available for free (and copies can be hard to find), and it's not quite as recent as *Modern C* (but still relevant nonetheless). That said, it has more exercises if you want extra practice, and the Q&A sections at the end of each chapter are filled with pearls of C wisdom and answers to C FAQs. It also covers almost the entirety of the C language and standard library, so it doubles as a reference book. + +CS 50 doesn't quite cover enough C for OSTEP, but if you've already taken CS 50, you can supplement it with the books above. + +Additional (***optional***) resources include: +* [CS 50 Manual Pages](https://manual.cs50.io): a great reference for looking up C library functions; most functions include both the usual manual as well as a beginner-friendly "less comfortable" option (just note that the "less comfortable" version uses `string` as an alias for `char *`.) +* [cdecl](https://cdecl.org): a tool to translate C gibberish into English. +* [C track on exercism.org](https://exercism.org/tracks/C): additional practice exercises. +* [Secure Coding Practices in C and C++](https://www.amazon.com/dp/0321822137): if you want to understand why other C resources are so unsafe. +* [*The C Programming Language*](https://www.amazon.com/dp/0131103628): the original book on C by its creators. Too outdated for OSTEP, but a good read if you manage to find a copy. + +#### x86 Architecture and Assembly Language + +Nand2Tetris has already introduced most of the concepts you'll need to understand systems and computer architectures, so now you just need to port that knowledge to the real-world (32-bit) x86 architecture. + +The easiest way to do that is by watching a subset of the lectures from the *Computer Systems: A Programmer's Perspective* course (or reading the matching chapters in the [textbook](https://www.amazon.com/dp/013409266X) of the same name). The lectures you'll need are: + +* [Machine-Level Programming I: Basics](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=6e410255-3858-4e85-89c7-812c5845d197) +* [Machine-Level Programming II: Control](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=fc93c499-8fc9-4652-9a99-711058054afb) +* [Machine-Level Programming III: Procedures](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=2994255f-923b-4ad4-8fb4-5def7fd802cd) +* [Machine-Level Programming IV: Data](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=03308c94-fc20-40d8-8978-1a9b81c344ed) +* [Machine-Level Programming V: Advanced Topics](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=3f0bf9ca-d640-4798-b91a-73aed656a10a) +* [Linking](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=0aef84fc-a53b-49c6-bb43-14cb2b175249) + +Additional (***optional***) resources include: +* [CPU Registers x86](https://wiki.osdev.org/CPU_Registers_x86): good for looking up specific registers. +* [*PC Assembly Language*](https://pdos.csail.mit.edu/6.828/2018/readings/pcasm-book.pdf): a short book on x86 assembly. +* [GCC Inline Assembly HOWTO](https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html): a guide to writing assembly code inside a C program. +* [*Intel 80386 Programmer's Reference Manual*](https://pdos.csail.mit.edu/6.828/2018/readings/i386.pdf): the official (and huge) resourcefrom Intel. + +#### xv6 + +You don't need to read anything about xv6 until after you start OSTEP; in fact, we recommend holding off on the xv6-related projects until you've finished the entire section on virtualization. After that, you'll need a guide to walk you through the source code. + +The xv6 authors provide a [book](https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf) that you can read alongside the source code. There's also a handy line-numbered [PDF version](https://pdos.csail.mit.edu/6.828/2018/xv6/xv6-rev11.pdf) of the code with an index to see exactly where each function or constant gets used. + +However, that book glosses over a lot of the details in the code that you might find challenging, including the advanced C features used, the x86 architecture- specific instructions, and the concurrency aspects (if you haven't finished that section of OSTEP before starting the xv6 projects). To solve this problem, we provide an [annotated guide to xv6](https://github.com/palladian1/xv6-annotated) that goes over the entire xv6 code and analyzes it line-by-line with explanations of the C features, hardware specs, and x86 conventions used. That means it's longer than the official xv6 book, so you don't have to read all of it (and you can probably skip the optional sections unless you care about device drivers), but you can use it as a reference if you're scratching your head about some part of the code. + +[Here](https://github.com/YehudaShapira/xv6-explained) is another in-depth explanation of the xv6 code. + +Also [here](https://www.youtube.com/playlist?list=PLbtzT1TYeoMhTPzyTZboW_j7TPAnjv9XB) is an excellent video series walking through much of the xv6 code. + +#### Miscellaneous + +You'll need a general sense of how Makefiles work in order to use the Makefile for xv6. [This tutorial](https://makefiletutorial.com) covers much more than you need; just read the "Getting Started" and "Targets" sections and come back to the rest later if you need to look something up (but you shouldn't have to). + +Additional (optional) resources include: +* [GCC Command Options](https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gcc/Invoking-GCC.html#Invoking-GCC): a guide to command-line flags for the GNU C compiler `gcc`. +* [Linker Scripts](https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts): a guide to writing scripts for the GNU linker `ld`. +* [OSDev Wiki](https://wiki.osdev.org): a great resource for all kinds of OS concepts and implementation details. +* [*Linux Kernel Development*](https://www.amazon.com/dp/0672329468): if you want to apply your xv6 knowledge toward contributing to the Linux kernel, this is a great read after OSTEP. diff --git a/coursepages/ostep/Reading-order.md b/coursepages/ostep/Reading-order.md new file mode 100644 index 000000000..6629725c8 --- /dev/null +++ b/coursepages/ostep/Reading-order.md @@ -0,0 +1,13 @@ +### all thanks to [palladian](https://github.com/palladian1) + +* Before starting the course: `initial-utilities` (aka, project 1a) and `initial-reverse` (not assigned in class) +* Chapter 5: `processes-shell` (project 2a) +* Chapter 6: `initial-xv6` (project 1b, but only worry about test 1) +* Chapter 9: `scheduling-xv6-lottery` (project 2b) +* Chapter 24: `vm-xv6-intro` (project 3b) +* Chapter 28: `initial-xv6` (now pass test 2) +* Chapter 29: `concurrency-xv6-threads` (project 4b) +* Chapter 30: `concurrency-mapreduce` (project 4a) +* Chapter 33: `concurrency-webserver` (not assigned in class) +* Chapter 42: `filesystems-checker` (project 5a) +* (there is no 5b, and there are no projects for chapters 43-51) diff --git a/coursepages/ostep/Scheduling-xv6-lottery.md b/coursepages/ostep/Scheduling-xv6-lottery.md new file mode 100644 index 000000000..59d02dab3 --- /dev/null +++ b/coursepages/ostep/Scheduling-xv6-lottery.md @@ -0,0 +1,202 @@ +## all thanks to [palladian](https://github.com/palladian1) + +### General Tips + +* Read chapter 9 in the OSTEP book and watch the video for discussion 5. Lottery ticket schedulers aren't discussed in the lectures, so you really do have to read the book for this one. + +* In general, you can't use C standard library functions inside the kernel, because the kernel has to initialize before it can execute library binaries. + +* The xv6 kernel has a "kernel version" of `printf`; it takes an additional integer argument that tells it whether to print to `stdout` or `stderr`. Note that it can only handle basic format strings like `"%d"` and not more complex ones like `"%6.3g"`; you can deal with this by manually adding spaces instead. It also has another similar function, `cprintf`. + +* If you do want to use other library functions that aren't available inside the kernel (pseudo random number generators), you can see how those functions are implemented in P.J. Plauger's book, The Standard C Library, and then implement them yourself. + + ### Implementation + + * You'll have to modify the same files you did in Project 1b in order to add the two new system calls. + * In order to understand how processes are created, remember that they start in the `EMBRYO` state before they become `RUNNABLE`--you'll have to find where that happens. + * System calls always have argument type `void`, so take a look at how system calls like `kill` and `read` manage to work around that limitation and get arguments (like integers and pointers) from user space. You might have to back a few steps in the chain that executes them. + * Make sure you're including `types.h` and `defs.h` wherever you need to access code from other parts of the kernel. + * In order to create the xv6 command `ps`, look at how `cat`, `ls`, and `ln` are implemented. Make sure to modify the Makefile to include the source code for your `ps` command. + + +## Spoilers below! + +### Solution walk through + +- Start from a fresh copy of the `xv6` source code. + +- `argint` and `argptr` are important functions. So `syscall`s take no arguments, but in reality, in user code you want to pass arguments to them. + +- So the way you do that is the kernel will call the `syscall`, say, `sys_kill()` with no arguments, then `sys_kill` will use `argint()` to get the arguments from the call stack, then pass that to a function `kill(int pid)`. + +- So you can see there's a bunch of `extern int sys_whatever` function declarations below that; that means that these functions are defined in another file and should be pulled in from there as function pointers. + +- And these `sys_whatever` functions are basically just wrappers for the real `syscall`, which doesn't have the `sys_` at the beginning. So you need to add `sys_settickets` and `sys_getpinfo` to that list of function declarations. + +- Then there's an array of function pointers; it's using this old-school C way of initializing arrays where you can do `int arr[] = { [0] 5, [1] 7}`. + +- And the names inside the square brackets `SYS_fork`, etc. are defined as preprocessor macros in another header file `syscall.h`. + +- So you need to add two more entries in the array with function pointers to `sys_settickets` and `sys_getpinfo`, and then you need to define `SYS_settickets` and `SYS_getpinfo` in the relevant header file. + +- So then all these `sys_` wrapper functions are defined in `sysproc.c`. + +- So there, you need to create `int sys_settickets(void)` and `int sys_getpinfo(void)`. + +- The real `settickets` function will need an int argument, so you need to use `argint` there to grab it from the call stack and pass it to `settickets`; similarly, `getpinfo` will need a pointer, so you'll use `argptr`. + +- Also, there's an extra condition in the if statement for `sys_settickets`; that's because you're not allowed to use a number of tickets below 1. + +- So then there's some assembly code that needs to run for each of the system calls; luckily, it's just a pre-written macro, so you don't have to write any assembly. that's in `usys.S`. + +- So you just add two lines at the bottom to create macros for `SYSCALL(settickets)` and `SYSCALL(getpinfo)` + +- Last part for the `syscalls`: you need to declare them in a header file for user code to be able to call them. that's in `user.h`. + +- So `struct pstat` will be properly defined in `pstat.h`, but you need to declare it in `user.h` as well so that user code doesn't complain when it sees it. + +- Basically, any user code that uses `syscalls` or C (really, `xv6`) standard library functions will have to include `user.h`. + +- So, so far, that's everything for the two system calls as far as the OS is concerned; now we just have to actually implement them with the regular functions `settickets` and `getpinfo`, then implement the scheduler and the `ps` program. + +- `pstat.h` is not for the scheduler, but for the `ps` program, which will work somewhat like the Linux `ps`. `pstat.h` is just to define the `struct pstat`, but there's no `.c` file to go with it. + +- So the scheduler will work by assigning 1 ticket by default to each process when it's created; then processes can set their own tickets using the `settickets` system call. + +- so first we need to make sure each process tracks its own tickets, then we need to assign a default of 1 ticket when creating them, then we need to write `settickets`. + +- the first part is in `proc.h`: processes are represented as a `struct proc`, so we add a new member for `int tickets`. + +- the `int ticks` member is for `ps`; I'll come back to that. + +- One other thing to note in `proc.h` is the `enum procstate`: you can see all the possible process states there. `EMBRYO` means it's in the process of creation; so what i did was `grep` for `EMBRYO` to find where the process was created in order to set the default tickets to 1. Turns out it's in `proc.c`. + +- Inside `proc.c`, there's a function `allocproc`, which initializes a process. + +- There's a process table called `ptable`, and `allocproc` looks through it to find an unused process. + +- Then when it does find it, it goes to create it; i added `p->tickets = 1;` there. + +- okay so the next change is to fit one of the requirements: child processes need to inherit the number of tickets from their parent process. + +- So child processes are created with `fork`, which is in the same file. + +- In `fork`, `curproc` is the current process, and `np` is the new process. + +- So i set `np->tickets = curproc->tickets`. + +- So the scheduler needs to generate a pseudo random number, then it should iterate through the process table with a counter initialized to 0, adding the number of tickets for each process to the counter. once the counter is greater than the pseudo random number, it stops and runs that process. + +- So I ended up looking in P.J. Plauger's The Standard C Library, which is just a big book of all the source code for the C library with commentary. It's pretty good; I don't know if it's still written that way though because the book is from the 80s. + +- So i just implemented C's `rand` and `srand` functions. `srand` sets a random seed (not so random, as you'll see later), then `rand` turns it into a pseudo random integer. + +- There's a bunch of type magic going on there between changes back and forth from integers to unsigned integers; that's to avoid signed integer overflow, which causes undefined behavior. unsigned integer overflow is okay though. + +- I only made one change to make it faster, which was to write `& 32767` instead of `% 32768`. + +- So you'll see the "random" seed i used: the number of `ticks`, which i think counts the number of timer interrupts so far. + +- Which is totally not random at all, since the first time this program gets run, it'll be 0, then 1, then 2, etc. + +- So there's some lines about counting `ticks`; that was for `ps`, not the scheduler. + +- The main change to make it a lottery scheduler is the counter variable. + +- And adding a for loop to count the total number of tickets that have been distributed. + +- So then at the very bottom of this file is the implementation of `settickets` and `getpinfo`. + +- So after initializing `counter` and `totaltickets`, there's for loop that counts the total numbers of tickets that have gone out to processes. + +- Then we get the winning ticket. + +- Let's discuss the original source code first. So first you acquire the lock. You'll release it at the very end. But in between, you have a for loop that iterates over all the processes in `ptable`. + +- Specifically, it iterates over only the processes in `RUNNABLE` state; if a process isn't `RUNNABLE`, it just `continue`s on to the next one. (This is for the round-robin scheduling mechanism that's already in the code.) + +- So now it's gonna switch to the very first `RUNNABLE` process it finds. Like, switching to executing it. + +- So first, `c` represents the current CPU. so it sets the current CPU to run the process it found with `c->proc = p;`. + +- Then it calls this function, `switchuvm(p)`, which sets up the virtual memory address space for `p`. Then it sets the process's state to `RUNNING`. + +- And then `swtch` is where the magic happens: that one swaps out the register contents of the OS and scheduler content with the saved-in-memory register contents of the process `p`. + +- So as soon as `swtch` executes, the CPU will continue executing instructions, but now they're the process's instructions. So this scheduler function just hangs there. + +- Eventually, when a timer interrupt goes off, the processor will use another `swtch` call but with the arguments reversed to swap the scheduler's register contents from memory into the CPU's registers and save the process's register contents. At which point execution will continue at this exact point. + +- So now `switchkvm` will set up the kernel's virtual memory address space. + +- These 5 lines are the context switch: + + ```c + c->proc = p; + switchuvm(p); + p->state = RUNNING; + + swtch(&(c->scheduler), p->context); + switchkvm(); + ``` + +- So then we go on to the next iteration of the inner for loop, which finds the next `RUNNABLE` process and repeats. + +- Only once we've executed all the `RUNNABLE` processes do we exit the inner for loop and release the lock. + +- Original source code is structured like this (this is pseudocode): + + ```python + while (1) { + iterate over processes: + if not runnable: + continue + run it + ``` + +- New code is structured like this (this is pseudocode): + + ```python + while (1) { + count the total tickets allotted to all processes // one for loop here + get the winning ticket number + iterate over processes: // another for loop here + if not runnable: + continue + add its tickets to counter + if counter <= winning ticket number: + continue + run it + ``` + +- We ignore the tickets of non-RUNNABLE processes. + +- So the tickets aren't numbered; each process just has a set amount of tickets, and we just count up until we've passed `n` tickets, where `n` is the winner. + +- For example if proc A has 5 tickets and proc B has 7, proc C has 2. if the winning number is 3, then A would run; if it's 8, then B would run; if it's 12, then C would run. + +- A winner in 0-4 would be A, 5-11 would be B, and 12-13 would be C. + +- So `settickets` is pretty basic: you just acquire a lock, set the tickets for the process, release the lock. + +- For `getpinfo` basically it works like this: + +- `p` is a pointer a `struct pstat`, as defined in `pstat.h`. each of its members is an array, with one entry per process. + +- Check for a null pointer. + +- Iterate over the process table and set `proc_i` to the i-th process. + +- Set the i-th entry of each member of `p` to the value for this process. + +- One last bookkeeping piece: we need to add declarations for `struct pstat` and the `settickets` and `getpinfo` system calls in `defs.h`. + +- And then the last file is `ps.c`, which implements the `ps` program, similar to Linux's `ps`. it just calls `getpinfo` to fill a `struct pstat`, then prints out the info for each process in use. + +- And then you just modify the Makefile to include `ps.c` in the compilation, and we're done! + +- Oh and this is why we needed the ticks in the scheduler: `ps` will print out how long each process has run. + +- So it needs to time the number of ticks that it actually executed. + +- FINALLY run `make qemu` in the `/src` directory to make sure it's all working. diff --git a/coursepages/ostep/vm-xv6-intro.md b/coursepages/ostep/vm-xv6-intro.md new file mode 100644 index 000000000..c86d6355c --- /dev/null +++ b/coursepages/ostep/vm-xv6-intro.md @@ -0,0 +1,13 @@ +Credit goes to [palladian](https://github.com/palladian1) + +## Intro To xv6 Virtual Memory + +### WARNING: + +***The project doesn't match the currently available xv6 source code, which already has this project implemented in it!*** + +[palladian](https://github.com/palladian1) tracked down a different xv6 source from the Github page of a U of Wisconsin student. We had to edit the `Makefile` to find the QEMU executable correctly. We added `null.c` to the `user` folder (also edited `makefile.mk` there), which demonstrates the lack of memory safety. + +Start with the code in [`start.zip`](https://github.com/spamegg1/reviews/raw/master/courses/OSTEP/ostep-projects/vm-xv6-intro/start.zip). Extract it and run `make clean` and `make qemu-nox`. Then inside the xv6 system run `null` to see the lack of safety! If you want to compare the results of `null` with the actual machine code, you can run `objdump -d user/null.o`. + +You might have to manually run `make clean` and `make qemu-nox` every time you make a change to the code. diff --git a/coursepages/spd/README.md b/coursepages/spd/README.md new file mode 100644 index 000000000..9b37dce83 --- /dev/null +++ b/coursepages/spd/README.md @@ -0,0 +1,96 @@ +# Systematic Program Design + +This course has been developed by UBC and is available from Edx. We recommend you to do it from the archived version on Edx. + +> This programming course takes a unique approach, as it focuses on learning a systematic programming method rather than a programming language. This practical approach will help you channel your creativity so that you can program well in any language. + +**Course Link:** + +Alternative Links: + +- (Up to Week 6A) +- (Week 6B onwards) + +## Instructions + +**Note:** These instructions are for the archived version of the course on Edx, which we recommend. They don't apply to other versions of the course. + +- The course does not have a homepage on Edx, but don't worry about it. Open the [link](https://learning.edx.org/course/course-v1:UBCx+SPD1x+2T2015) given above, log in (if you are not logged in) and then enroll in the course. +- Work through Week 1A to Week 6A as given in the course overview. Watch the videos, do the exercises, and then solve the problems from the problem bank. +- After you complete, Week 6A, do the [space invaders problem](https://github.com/ossu/spd-starters/blob/main/final/space-invaders-starter.rkt). You can find further instructions here: [Space Invaders Instructions](space-invaders-instructions.png). You can watch a sample run of the game [here](https://www.youtube.com/shorts/wUg3psZl7vM). +- Then, work through Week 6B onwards. Watch the videos, do the exercises, and then solve the problems from the problem bank. +- After you complete all the modules in the course, do the [TA solver problem](https://github.com/ossu/spd-starters/blob/main/final/ta-solver-starter.rkt). You will find the instructions in the starter file. +- The problem bank tab has many additional problems. We suggest you to solve all of them to boost your understanding. +- Some links to starter files in the course are no longer working. You can download the starter files from this github repository: . You can download a zip file of all the starter files using [this link](https://github.com/ossu/spd-starters/archive/refs/heads/main.zip). +- You won't be able to submit your responses for the exercises, but you can see their answers by clicking on "Show Answer". Check your answers honestly. +- You won't be able to submit the problem bank problems, but they provide sample solutions. You can match your solution with it. +- While there are ways to do this course in other IDEs, we suggest you to use Dr. Racket, as configuring the problem starter files for other IDEs is not worth the effort. +- If you are stuck somewhere, feel free to ask questions. You can join the OSSU chat for this course here: + - Chat for discussions up to Week 6A: + - Chat for discussions from Week 6B onwards: + +## Notes + +- Dr. Racket defaults to using the newer notation `#true #false '()`. You can configure Dr. Racket to use the notation used by the course by clicking in menu bar on Language > Choose Language. Then choose the required language (BSL, ISL or other variants). Then click on "Show details" in the bottom left of the window. Then choose `true false empty` in "Constant Style" field. Run your file again to make sure it uses the new configuration. + +The language choosing dialog of Dr. Racket + +- You can enable automatic closing of parentheses, brackets, and quotes. Click on Edit in the Menu Bar > Preferences > Go to Editing Tab > Go to General Editing Sub-tab > Check the "Enable automatic parentheses, square brackets, and quotes" checkbox. + +Enable automatic closing of parentheses + +## FAQ + +### This course is boring. Can I skip it? + +**No.** This course may seem boring at first, but we suggest working though it. This is a great course, and it will probably change the way you think. Many students who found this course boring at first became a fan of the course by the time they completed it. Be very careful. The early parts (especially the rules about how evaluation works) plays a huge role in understanding how code works and gets executed for the rest of the course. + +### Why is this course taught using BSL? Would it not make more sense to teach it in an industry standard language? + +This is an intentional choice, and here's why: + +1. Lisp is the lingua franca of computer scientists -- by which we mean, PhD algorithm researchers. There are some good and some merely historical reasons for this, but it's a fact of life, so if you want to read white papers you're going to want to read Lisp. BSL is a good introduction, and frankly once you get over the parenthesis hell and once you know any Lisp you know how to read them all. + +2. This is the first computer science course in most people's curricula that isn't centered around teaching you how to use a language. Because the point of computer science isn't to teach you a language. Or to teach you to code. Or to teach you to be a fullstack software engineer. Computer Science is a very narrowly-applied applied math with wide-ranging practical usage. But if you strip away all the qualifying language, it's math. Which means it has certain overarching rules that are completely, totally independent of your implementation language. + +This course is built in a throwaway student language, specifically so you don't focus on the language and instead focus on what you're doing with the language. We don't care about public static void main or PEP8 style. We want to see ways to structure a program in any language. So we focus not on the things that make Java unique, and not on the things that make Python unique, and instead focus on the things that make code better. + +It might seem rough to learn a new language just to take this course, but BSL frees you from having to worry about style linting or runtime issues or code compartmentalization or compiling or coding environment. It's a gift. Take it. The design patterns are hard enough. + +### Why there are different course versions, HTC, SPD? Why do you recommend the archived version? + +There are two reasons people do these courses: + +- The Knowledge +- The Certificate + +OSSU assumes you're in it for the knowledge. You can have that for free. If you're doing it for the knowledge you don't need to submit your homework. You just need to do the homework. + +If you want the recognition that you've done the thing, then you're in it for the certificate. You can't have the certificate for free. You have to pay for that. + +There's no reason for you to submit homework sets unless you're doing it for the certificate -- If you're doing that, you can't actually get a certificate from the SPD course (because the course is expired) so you're in the wrong place. + +If you want a certificate, then you need to take How To Code and you need to pay for it. + +But you don't need to pay for anything in OSSU. We suggest you take SPD because the access to the information is better (because the course is expired) and it's more than sufficient for obtaining the knowledge. + +TL;DR: + + If you're in it for the knowledge, take SPD -- it's free but inactive + If you're in it for the certificate, take and pay for How To Code -- it's still an active course + +### Can I do this course is another programming language? + +This course has really integrated with the programming languages it uses. We suggest you to use the language specified by the course. While, the concepts you learn from this course are applicable anywhere, trying to do the course with another language is not really sensible, and would just lead to wastage of time. + +### Can I use another IDE? I don't like Dr. Racket. + +The programs in this course embed pictures and rich-text blocks in the code, which means, the files cannot be opened by other IDEs. While it is possible to prepare the starter files for use with other IDEs, you need Dr. Racket for that, and the time needed to do that can be better utilized in learning the concepts taught by the course. + +### How do I test functions which are supposed to output random values? + +You can use `check-random` to test those functions. You can [learn more about it here](https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#(form._((lib._lang%2Fhtdp-beginner-abbr..rkt)._check-random))). It is needed for the Space Invaders project. + +## Credits + +The problem starter files and the space invaders instructions were taken from the course ["Systematic Program Design" on Edx](https://learning.edx.org/course/course-v1:UBCx+SPD1x+2T2015), licensed under [CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/) license. diff --git a/coursepages/spd/automatic-parentheses.png b/coursepages/spd/automatic-parentheses.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d5209b25f2b4ece7d1d988d57a379e12f65852 GIT binary patch literal 75340 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

|5PYTi0eGr+n0 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 literal 0 HcmV?d00001 diff --git a/coursepages/spd/change-dr-racket-notation.png b/coursepages/spd/change-dr-racket-notation.png new file mode 100644 index 0000000000000000000000000000000000000000..65d8ccbe208385b2079c042a45a79862982e6585 GIT binary patch literal 106172 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 w>nP#NV0Fvt6%Z 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%0D1v<+!+X&#fLstYDe=&qX3) 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 GVgCRGN5oA4 literal 0 HcmV?d00001 diff --git a/extras/articles.md b/extras/articles.md deleted file mode 100644 index d3fa87cb5..000000000 --- a/extras/articles.md +++ /dev/null @@ -1,96 +0,0 @@ -# Computer Science - Extra Resources - -## Articles - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Discrete Math)](#math-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) - ---- - -### Introduction to Computer Science - -### Math (Mathematical Thinking) - -### Program Design - -### Math (Discrete Math) - -### Algorithms - -### Programming Paradigms - -### Software Testing - -### Math (Calculus) - -### Software Architecture - -### Theory - -### Software Engineering - -### Math (Probability) - -### Computer Architecture - -### Operating Systems - -### Computer Networks - -### Databases - -### Cloud Computing - -### Math (Linear Algebra) - -### Cryptography - -### Security - -### Compilers - -### Parallel Computing - -### UX Design - -### Computer Graphics - -### Artificial Intelligence - -### Machine Learning - -### Natural Language Processing - -### Big Data - -### Data Mining - -### Internet of Things diff --git a/extras/courses.md b/extras/courses.md new file mode 100644 index 000000000..88d845c31 --- /dev/null +++ b/extras/courses.md @@ -0,0 +1,102 @@ +# Computer Science - Great Courses + +This is a list of high-quality courses that, for one reason or another, didn't make it into the curriculum. +The most common reasons are that the course isn't available often enough, +or that there was an alternative that fit better into the curriculum. + +## Programming + +Courses | Duration | Effort +:-- | :--: | :--: +[Introduction to Computational Thinking and Data Science](https://www.edx.org/course/introduction-computational-thinking-data-mitx-6-00-2x-2#!)([alt](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0002-introduction-to-computational-thinking-and-data-science-fall-2016/))| 10 weeks | 15 hours/week +[Introduction to Computer Science - CS50](https://www.edx.org/course/introduction-computer-science-harvardx-cs50x#!) ([alt](https://cs50.harvard.edu/x/)) | 12 weeks | 10-20 hours/week +[Introduction to Computer Science (Udacity)](https://www.udacity.com/course/intro-to-computer-science--cs101)| 7 weeks | 10-20 hours/week +[An Introduction to Interactive Programming in Python (Part 1)](https://www.coursera.org/learn/interactive-python-1)| 5 weeks | - +[An Introduction to Interactive Programming in Python (Part 2)](https://www.coursera.org/learn/interactive-python-2)| - | - +[Computing In Python, Part I: Fundamentals and Procedural Programming](https://www.edx.org/course/computing-in-python-i-fundamentals-and-procedural-programming-0) | 5 weeks | 10 hours/week +[Computing In Python, Part II: Control Structures](https://www.edx.org/course/computing-in-python-ii-control-structures-0) | 5 weeks | 10 hours/week +[Computing In Python, Part III: Data Structures](https://www.edx.org/course/computing-in-python-iii-data-structures-0) | 5 weeks | 10 hours/week +[Computing In Python, Part IV: Objects & Algorithms](https://www.edx.org/course/computing-in-python-iv-objects-algorithms-0) | 5 weeks | 10 hours/week +[Programming Basics](https://www.edx.org/course/programming-basics-iitbombayx-cs101-1x)| 9 weeks | 8 hours/week +[Object-Oriented Programming with Java](https://java-programming.mooc.fi/)| 14 weeks | 10 hours/week +[Introduction to Programming with MATLAB](https://www.coursera.org/learn/matlab)| - | - +[Introduction to Functional Programming](https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0)| 7 weeks | 4-6 hours/week +[The Structure and Interpretation of Computer Programs (2022, Python)](http://cs61a.org/) | - | - +[The Structure and Interpretation of Computer Programs (2011, Scheme)](https://romanbird.github.io/sicp/) | - | - +[Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/) | 14 weeks | 4 hours/week + +## Math + +Courses | Duration | Effort +:-- | :--: | :--: +[Effective Thinking Through Mathematics](https://www.edx.org/course/effective-thinking-through-mathematics-2) | 4 weeks | 2 hours/week +[Introduction to Mathematical Thinking](https://www.coursera.org/learn/mathematical-thinking) | 10 weeks | 10 hours/week +[High School Math](https://www.khanacademy.org/math/high-school-math) | - | - +[Precalculus](https://www.futurelearn.com/courses/precalculus) | 5 weeks | 6 hours/week +[Advanced Precalculus](https://www.futurelearn.com/courses/advanced-precalculus) | 4 weeks | 5 hours/week +[Calculus Applied!](https://www.edx.org/course/calculus-applied) | 10 Weeks | 6hours/week +[Introduction to Probability and Data](https://www.coursera.org/learn/probability-intro)| - | - +[Linear Algebra (Strang)](https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/index.htm) | - | - +[Introduction to Computational Thinking](https://computationalthinking.mit.edu/Spring21/#introduction_to_computational_thinking) | - | - +[Multivariable Calculus](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/index.htm) | 13 weeks | 12 hours/week +[Introduction to Probability - The Science of Uncertainty](https://www.edx.org/course/introduction-probability-science-mitx-6-041x-2) | 18 weeks | 12 hours/week | [Multivariable Calculus](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/index.htm) +[Matrix Methods In Data Analysis, Signal Processing, And Machine Learning](https://ocw.mit.edu/courses/18-065-matrix-methods-in-data-analysis-signal-processing-and-machine-learning-spring-2018/) | - | - + +## Systems + +Courses | Duration | Effort +:-- | :--: | :--: +[Cloud Computing / Distributed Programming](https://www.coursera.org/learn/cloud-computing) | 5 weeks | 5-10 hours/week +[Introduction to Parallel Programming](https://classroom.udacity.com/courses/cs344) ([alt](https://www.youtube.com/playlist?list=PLGvfHSgImk4aweyWlhBXNF6XISY3um82_)) ([HW](https://colab.research.google.com/github/depctg/udacity-cs344-colab))| 12 weeks | 8-10 hours/week +[Intro to Computer Systems](http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15213-f15/www/) ([Labs](http://csapp.cs.cmu.edu/3e/labs.html)) | 15 weeks | 12 hours/week +[Great Ideas in Computer Architecture (Machine Structures)](https://inst.eecs.berkeley.edu/~cs61c/fa14/) ([Lectures](https://archive.org/details/ucberkeley_webcast_itunesu_915550404)) | 15 weeks | 12 hours/week +[Computer Architecture](https://www.coursera.org/learn/comparch) | - | 5-8 hours/week +[Operating System Engineering](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/) | - | - +[Introduction to Operating Systems](https://www.udacity.com/course/introduction-to-operating-systems--ud923)| 8 weeks | 5-8 hours/week +[Advanced Operating Systems](https://www.udacity.com/course/advanced-operating-systems--ud189)| 5 weeks | 5-8 hours/week +[Computer Networking](https://www.udacity.com/course/computer-networking--ud436) | 12 weeks | 5-8 hours/week +Distributed Systems - [Playlist](https://www.youtube.com/playlist?list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB), [Course site](http://nil.csail.mit.edu/6.824/2020/schedule.html), [Self-studying 6.824](https://lieuzhenghong.com/mit_6.824_self_study/) [6.824 Discord group for further help](https://discord.gg/KbhkEqpBqC) | - | - + +## Theory + +Courses | Duration | Effort +:-- | :--: | :--: +[Algorithms, Part I](https://www.coursera.org/learn/algorithms-part1) | 6 weeks | 6-12 hours/week +[Algorithms, Part II](https://www.coursera.org/learn/algorithms-part2) | 6 weeks | 6-12 hours/week +[Analysis of Algorithms (Sedgewick)](https://www.coursera.org/learn/analysis-of-algorithms) | 6 weeks | 6-8 hours/week +[Analysis of Algorithms (Skiena)](http://www3.cs.stonybrook.edu/~skiena/373/) | 15 weeks | 6-8 hours/week +[Programming Challenges (Skiena)](http://www3.cs.stonybrook.edu/~skiena/392/) | 14 weeks | 6-8 hours/week +[Data Structures and Algorithms (Specialization)](https://www.coursera.org/specializations/data-structures-algorithms) | 25 weeks | 3-10 hours/week +[Algorithmic Thinking (Part 1)](https://www.coursera.org/learn/algorithmic-thinking-1/) | - | - +[Algorithmic Thinking (Part 2)](https://www.coursera.org/learn/algorithmic-thinking-2/) | - | - +[Statistical Mechanics: Algorithms and Computations](https://www.coursera.org/learn/statistical-mechanics/) | - | - +[Approximation Algorithms Part I](https://www.coursera.org/learn/approximation-algorithms-part-1/) | - | - +[Approximation Algorithms Part II](https://www.coursera.org/learn/approximation-algorithms-part-2/) | - | - +[Design And Analysis Of Algorithms](https://ocw.mit.edu/courses/6-046j-design-and-analysis-of-algorithms-spring-2015/) | - | - + +## Applications + +Courses | Duration | Effort +:-- | :--: | :--: +[Using Databases with Python](https://www.coursera.org/learn/python-databases) | 5 weeks | 2-3 hours/week +[Database Systems](https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22ed2ee867-9610-4bad-94af-5d12c2ea47cd%22) | - | 27 hours +[Database Management Essentials](https://www.coursera.org/learn/database-management) | 7 weeks | 4-6 hours/week +[Intro to Artificial Intelligence](https://www.udacity.com/course/intro-to-artificial-intelligence--cs271)| 16 weeks | 6-10 hours/week +[Intro to Machine Learning](https://www.udacity.com/course/intro-to-machine-learning--ud120)| 10 weeks | 6-10 hours/week +[Machine Learning for Data Science and Analytics](https://www.edx.org/course/machine-learning-data-science-analytics-columbiax-ds102x-0)| 5 weeks | 7-10 hours/week +[Big Data Science with the BD2K-LINCS Data Coordination and Integration Center](https://www.coursera.org/course/bd2klincs)| 7 weeks | 4-5 hours/week + +## Tools + +Courses | Duration | Effort +:-- | :--: | :--: +[How to Use Git and GitHub](https://www.udacity.com/blog/2015/06/a-beginners-git-github-tutorial.html) | 3 weeks | 2-3 hours/week +[Kubernetes Certified Application Developer](https://www.udemy.com/course/certified-kubernetes-application-developer/) | 5 weeks | 2 hours/week + + +# Online Learning - Great Courses + +Courses | Duration | Effort +:-- | :--: | :--: +[Learning How to Learn](https://www.coursera.org/learn/learning-how-to-learn) | 4 weeks | 2 hours/week +[Mindshift](https://www.coursera.org/learn/mindshift) | 4 weeks | 2 hours/week diff --git a/extras/free-books.md b/extras/free-books.md deleted file mode 100644 index ab172c392..000000000 --- a/extras/free-books.md +++ /dev/null @@ -1,123 +0,0 @@ -# Computer Science - Extra Resources - -## Free Books - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Discrete Math)](#math-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) - ---- - -### Introduction to Computer Science - -Name | Author(s) -:-- | :--: -[Structure and Interpretation of Computer Programs](https://mitpress.mit.edu/sicp/full-text/book/book.html) | Hal Abelson, Jerry Sussman, Julie Sussman -[Introduction to Computing: Explorations in Language, Logic, and Machines](http://www.computingbook.org/) | David Evans - -### Math (Mathematical Thinking) - -### Program Design - -### Math (Discrete Math) - -Name | Author(s) -:-- | :--: -[Applied Discrete Structures](http://faculty.uml.edu/klevasseur/ads2/) | Alan Doerr, Ken Levasseur - -### Algorithms - -### Programming Paradigms - -### Software Testing - -### Math (Calculus) - -Name | Author(s) -:-- | :--: -[Calculus Made Easy](http://www.gutenberg.org/ebooks/33283) | Silvanus P. Thompson - -### Software Architecture - -### Theory - -### Software Engineering - -### Math (Probability) - -Name | Author(s) -:-- | :--: -[Grinstead and Snell’s Introduction to Probability](https://math.dartmouth.edu/~prob/prob/prob.pdf) |Charles M. Grinstead, J. Laurie Snell - -### Computer Architecture - -### Operating Systems - -### Computer Networks - -### Databases - -### Cloud Computing - -### Math (Linear Algebra) - -### Cryptography - -### Security - -### Compilers - -Name | Author(s) -:-- | :--: -[Compiler Construction](http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf) | Niklaus Wirth - - -### Parallel Computing - -### UX Design - -### Computer Graphics - -### Artificial Intelligence - -### Machine Learning - -Name | Author(s) -:-- | :--: -[Deep Learning](http://www.deeplearningbook.org/) | Ian Goodfellow, Yoshua Bengio and Aaron Courville -[Bayesian Reasoning and Machine Learning](http://web4.cs.ucl.ac.uk/staff/D.Barber/pmwiki/pmwiki.php?n=Brml.HomePage) | David Barber - -### Natural Language Processing - -### Big Data - -### Data Mining - -### Internet of Things diff --git a/extras/free-courses.md b/extras/free-courses.md deleted file mode 100644 index 82e90142e..000000000 --- a/extras/free-courses.md +++ /dev/null @@ -1,245 +0,0 @@ -# Computer Science - Extra Resources - -## Free Courses - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Discrete Math)](#math-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) - ---- - -### Introduction to Computer Science - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Computer Science and Programming Using Python](https://www.edx.org/course/introduction-computer-science-mitx-6-00-1x-5#!)| 9 weeks | 15 hours/week -[From Nand to Tetris (Part 1) ](https://www.coursera.org/learn/build-a-computer) | 6 weeks | 5-10 hours/week -[Introduction to Computer Science (Udacity)](https://www.udacity.com/course/intro-to-computer-science--cs101)| 7 weeks | 10-20 hours/week -[An Introduction to Interactive Programming in Python (Part 1)](https://www.coursera.org/learn/interactive-python-1)| 5 weeks | - -[An Introduction to Interactive Programming in Python (Part 2)](https://www.coursera.org/learn/interactive-python-2)| - | - -[Introduction to Computational Thinking and Data Science](https://www.edx.org/course/introduction-computational-thinking-data-mitx-6-00-2x-2#!)| 10 weeks | 15 hours/week -[Introduction to Programming with Java Part 1: Starting to Code with Java](https://prod-edx-mktg-edit.edx.org/course/introduction-programming-java-part-1-uc3mx-it-1-1x-0)| 5 weeks | 5-7 hours/week -[Introduction to Programming with Java Part 2: Writing Good Code](https://prod-edx-mktg-edit.edx.org/course/introduction-programming-java-part-2-uc3mx-it-1-2x)| 5 weeks | 5-7 hours/week -[CS For All: Introduction to Computer Science and Python Programming](https://www.edx.org/course/cs-all-introduction-computer-science-harveymuddx-cs005x-0)| 14 weeks | 5-7 hours/week -[Programming Basics](https://www.edx.org/course/programming-basics-iitbombayx-cs101-1x)| 9 weeks | 8 hours/week -[Introduction to Logic](https://www.coursera.org/course/intrologic)| 8 weeks | 4-10 hours/week -[Introduction to Programming with MATLAB](https://www.coursera.org/learn/matlab)| - | - - -### Math (Mathematical Thinking) - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Mathematical Thinking](https://www.coursera.org/course/maththink)| 10 weeks | 8-10 hours/week - -### Program Design - -### Math (Discrete Math) - -### Algorithms - -Courses | Duration | Effort -:-- | :--: | :--: -[Analysis of Algorithms (Skiena)](http://www3.cs.stonybrook.edu/~skiena/373/) | 15 weeks | 6-8 hours/week -[Analysis of Algorithms (Sedgewick)](https://www.coursera.org/course/aofa)| 6 weeks | 6-8 hours/week -[Programming Challenges (Skiena)](http://www3.cs.stonybrook.edu/~skiena/392/) | 14 weeks | 6-8 hours/week -[Mathematical Logic and Algorithms Theory](https://iversity.org/en/courses/mathematical-logic-and-algorithms-theory) | 7 weeks | 3-4 hours/week -[Algorithmic Toolbox](https://www.coursera.org/learn/algorithmic-toolbox/) | 5 weeks | 4-8 hours/week -[Algorithms on Graphs and Trees](https://www.coursera.org/learn/algorithms-on-graphs-and-trees/) | - | - -[Algorithms on Strings](https://www.coursera.org/learn/algorithms-on-strings/) | - | - -[Advanced Algorithms and Complexity](https://www.coursera.org/learn/advanced-algorithms-and-complexity/) | - | - -[Algorithmic Thinking (Part 1)](https://www.coursera.org/learn/algorithmic-thinking-1/) | - | - -[Algorithmic Thinking (Part 2)](https://www.coursera.org/learn/algorithmic-thinking-2/) | - | - -[Statistical Mechanics: Algorithms and Computations](https://www.coursera.org/learn/statistical-mechanics/) | - | - -[Approximation Algorithms Part I](https://www.coursera.org/learn/approximation-algorithms-part-1/) | - | - -[Approximation Algorithms Part II](https://www.coursera.org/learn/approximation-algorithms-part-2/) | - | - -[Algorithms: Design and Analysis, Part 1](https://www.coursera.org/course/algo) | 6 weeks | 5-7 hours/week -[Algorithms: Design and Analysis, Part 2](https://www.coursera.org/course/algo2) | 6 weeks | 6-10 hours/week - -### Programming Paradigms - -Courses | Duration | Effort -:-- | :--: | :--: -[Principles of Reactive Programming](https://www.coursera.org/course/reactive)| 7 weeks | 5-7 hours/week -[Object-Oriented Programming](https://www.edx.org/course/object-oriented-programming-iitbombayx-cs101-2x)| 4 weeks | 8 hours/week -[Introduction to Functional Programming](https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0)| 7 weeks | 4-6 hours/week -### Software Testing - -### Math (Calculus) - -Courses | Duration | Effort -:-- | :--: | :--: -[Pre-Calculus](https://www.coursera.org/course/precalculus)| 10 weeks | 10-12 hours/week -[Multivariable Calculus](https://www.coursera.org/course/m2o2c2)| 6 weeks | 5-7 hours/week - -### Software Architecture - -Courses | Duration | Effort -:-- | :--: | :--: -[Web Application Architectures](https://www.coursera.org/course/webapplications)| 6 weeks | 6-9 hours/week - -### Theory - -### Software Engineering - -Courses | Duration | Effort -:-- | :--: | :--: -[Agile Development Using Ruby on Rails - Basics](https://www.edx.org/course/agile-development-using-ruby-rails-uc-berkeleyx-cs169-1x)| 9 weeks | 12 hours/week -[Agile Development Using Ruby on Rails - Advanced](https://www.edx.org/course/agile-development-using-ruby-rails-uc-berkeleyx-cs169-2x)| 8 weeks | 12 hours/week -[Startup Engineering](https://www.coursera.org/course/startup) | 12 weeks | 2-20 hours/week - -### Math (Probability) - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Probability and Data](https://www.coursera.org/learn/probability-intro)| - | - - -### Computer Architecture - -Courses | Duration | Effort -:-- | :--: | :--: -[Certified Information Systems Auditor](https://www.cybrary.it/course/cisa/#)| - | 8.5 hours -[The Hardware/Software Interface](https://www.coursera.org/course/hwswinterface)| 8 weeks | 10-15 hours/week - -### Operating Systems - -Courses | Duration | Effort -:-- | :--: | :--: -[Operating System Engineering](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/)| - | - -[Introduction to Linux](https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-0)| 8 weeks | 5-8 hours/week -[CompTIA Linux+](https://www.cybrary.it/course/comptia-linux-plus/)| - | 5.25 hours -[Introduction to Operating Systems](https://www.udacity.com/course/introduction-to-operating-systems--ud923)| 8 weeks | 5-8 hours/week -[Advanced Operating Systems](https://www.udacity.com/course/advanced-operating-systems--ud189)| 5 weeks | 5-8 hours/week -[Advanced Operating Systems: Structures And Implementation](https://www.youtube.com/playlist?list=PL-XXv-cvA_iB_5Q8G8kW5idSwNmXypmQE)| 10 weeks | 2-3 hours/week - -### Computer Networks - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to Computer Networking](https://lagunita.stanford.edu/courses/Engineering/Networking-SP/SelfPaced/about) | - | 5-10 hours/week -[CompTIA Network+](https://www.cybrary.it/course/comptia-network-plus/) | - | 32 hours -[Cisco CCNA](https://www.cybrary.it/course/cisco-ccna/) | - | 15.5 hours -[Networking for Web Developers](https://www.udacity.com/course/networking-for-web-developers--ud256) | - | 12 hours -[Computer Networking](https://www.udacity.com/course/computer-networking--ud436) | 12 weeks | 5-8 hours/week - -### Databases - -Courses | Duration | Effort -:-- | :--: | :--: -[Using Databases with Python](https://www.coursera.org/learn/python-databases) | 5 weeks | 2-3 hours/week -[Database Systems](https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22ed2ee867-9610-4bad-94af-5d12c2ea47cd%22) | - | 27 hours -[Database Management Essentials](https://www.coursera.org/learn/database-management) | 7 weeks | 4-6 hours/week - -### Cloud Computing - -Courses | Duration | Effort -:-- | :--: | :--: -[CompTIA Cloud+](https://www.cybrary.it/course/comptia-cloud-plus/) | - | 2.5 hours -[Cloud Computing Concepts](https://www.coursera.org/course/cloudcomputing) | 5 weeks | 4-8 hours/week -[Cloud Computing Concepts: Part 2](https://www.coursera.org/course/cloudcomputing2) | 5 weeks | 4-8 hours/week -[Cloud Computing Applications](https://www.coursera.org/course/cloudapplications) | 5 weeks | 10-15 hours/week - -### Math (Linear Algebra) - -Courses | Duration | Effort -:-- | :--: | :--: -[Linear Algebra - Foundations to Frontiers (LAFF)](https://www.edx.org/course/linear-algebra-foundations-frontiers-utaustinx-ut-5-03x)| 15 weeks | 8 hours/week - -### Cryptography - -Courses | Duration | Effort -:-- | :--: | :--: -[Applied Cryptography](https://www.udacity.com/course/applied-cryptography--cs387)| 8 weeks | 6 hours/week -[Cryptography](https://www.coursera.org/learn/cryptography/)| 7 weeks | 4-7 hours/week -[Cryptography](https://www.cybrary.it/course/cryptography/)| - | 2.9 hours - -### Security - -Courses | Duration | Effort -:-- | :--: | :--: -[Usable Security](https://www.coursera.org/learn/usable-security/)| 7 weeks | 5-8 hours/week -[Software Security](https://www.coursera.org/learn/software-security/)| 6 weeks | 3-5 hours/week -[Cybersecurity and Its Ten Domains](https://www.coursera.org/learn/cyber-security-domain/)| 7 weeks | 4-7 hours/week -[Designing and Executing Information Security Strategies](https://www.coursera.org/course/infosec)| 10 weeks | 4-6 hours/week -[CompTIA Security+](https://www.cybrary.it/course/comptia-security-plus/)| - | 9.5 hours -[Cyberwar, Surveillance and Security](https://www.edx.org/course/cyberwar-surveillance-security-adelaidex-cyber101x-0)| 6 weeks | 2-3 hours/week -[Computer and Hacking Forensics](https://www.cybrary.it/course/computer-hacking-forensics-analyst/)| - | 7.1 hours -[Secure Coding](https://www.cybrary.it/course/secure-coding/)| - | 9.5 hours - -### Compilers - -### Parallel Computing - -### UX Design - -### Computer Graphics - -### Artificial Intelligence - -Courses | Duration | Effort -:-- | :--: | :--: -[Discrete Optimization](https://www.coursera.org/course/optimization)| 9 weeks | 10-20 hours/week -[Intro to Artificial Intelligence](https://www.udacity.com/course/intro-to-artificial-intelligence--cs271)| 16 weeks | 6-10 hours/week - -### Machine Learning - -Courses | Duration | Effort -:-- | :--: | :--: -[Intro to Machine Learning](https://www.udacity.com/course/intro-to-machine-learning--ud120)| 10 weeks | 6-10 hours/week -[Machine Learning for Data Science and Analytics](https://www.edx.org/course/machine-learning-data-science-analytics-columbiax-ds102x-0)| 5 weeks | 7-10 hours/week - -### Natural Language Processing - -### Big Data - -Courses | Duration | Effort -:-- | :--: | :--: -[Big Data for Smart Cities](https://www.edx.org/course/big-data-smart-cities-ieeex-introdatax)| 4 weeks | 3-5 hours/week -[Processing Big Data with Azure HDInsight](https://www.edx.org/course/processing-big-data-azure-hdinsight-microsoft-dat202-1x-0)| 5 weeks | 3-4 hours/week -[Big Data Science with the BD2K-LINCS Data Coordination and Integration Center](https://www.coursera.org/course/bd2klincs)| 7 weeks | 4-5 hours/week - -### Data Mining - -Courses | Duration | Effort -:-- | :--: | :--: -[Mining Massive Datasets](https://www.coursera.org/course/mmds)| 7 weeks | 8-10 hours/week -[Text Retrieval and Search Engines](https://www.coursera.org/learn/text-retrieval)| - | - -[Text Mining and Analytics](https://www.coursera.org/learn/text-mining)| - | - -[Cluster Analysis in Data Mining](https://www.coursera.org/learn/cluster-analysis)| - | - - -### Internet of Things - -Courses | Duration | Effort -:-- | :--: | :--: -[Introduction to the Internet of Things and Embedded Systems](https://www.coursera.org/learn/iot/?source=phoenixCdp2016AbTest)| 4 weeks | 1-3 hours/week -[Internet of Things: How did we get here?](https://www.coursera.org/learn/internet-of-things-history/)| 2 weeks | 2-3 hours/week -[Internet of Things: Setting Up Your DragonBoard™ Development Platform](https://www.coursera.org/learn/internet-of-things-dragonboard/)| 10 weeks | 2-3 hours/week -[Internet of Things: Sensing and Actuation From Devices](https://www.coursera.org/learn/internet-of-things-sensing-actuation)| 6 weeks | 3-5 hours/week -[Internet of Things: Communication Technologies](https://www.coursera.org/learn/internet-of-things-communication)| 4 weeks | 1 hours/week -[Internet of Things: MultimediaTechnologies](https://www.coursera.org/learn/internet-of-things-multimedia)| 3 weeks | 1-2 hours/week diff --git a/extras/other_curricula.md b/extras/other_curricula.md new file mode 100644 index 000000000..2840ba409 --- /dev/null +++ b/extras/other_curricula.md @@ -0,0 +1,13 @@ +# Other curricula + +OSSU is one of a few efforts to inform learners how they can pursue computer science independently. Below are a few other such efforts. + +- [Google - Guide for Technical Development](https://www.google.com/about/careers/students/guide-to-technical-development.html) +- [Teach Yourself Computer Science](https://teachyourselfcs.com/) +- [Obtaining a Thorough CS Background Online](http://spin.atomicobject.com/2015/05/15/obtaining-thorough-cs-background-online/) +- [P1xt](https://github.com/P1xt/p1xt-guides) +- [Functional CS](https://functionalcs.github.io/curriculum/) + +What differentiates OSSU? OSSU is dedicated to how an individual can learn the undergraduate CS curriculum. This is why we use the [CS2013](../CURRICULAR_GUIDELINES.md) as our curricular guidelines. These guidelines are written by the two foremost professional organizations in computing. + +This approach has the benefit of clarifying to others the extent of a student's study and understanding. Students have gone from OSSU study into both tech industry employment and into Computer Science graduate school. We look forward to helping you do the same. diff --git a/extras/paid-books.md b/extras/paid-books.md deleted file mode 100644 index cdee8758f..000000000 --- a/extras/paid-books.md +++ /dev/null @@ -1,121 +0,0 @@ -# Computer Science - Extra Resources - -## Paid Books - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Discrete Math)](#math-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) - ---- - -### Introduction to Computer Science - -Name | Author | ISBN -:-- | :--: | :--: -[Introduction to Computation and Programming Using Python](https://www.amazon.com/Introduction-Computation-Programming-Using-Python/dp/0262525003/) | John V. Guttag | 978-0262525008 - -### Math (Mathematical Thinking) - -### Program Design - -### Math (Discrete Math) - -Name | Author | ISBN -:-- | :--: | :--: -[Discrete Mathematics with Applications(4th Edition)](http://www.amazon.com/Discrete-Mathematics-Applications-Susanna-Epp/dp/0495391328/) | Susanna S. Epp | 9780495391326 - -### Algorithms - -Name | Author | ISBN -:-- | :--: | :--: -[Introduction to Algorithms(3rd Edition)](http://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844/) | Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein | 9780262033848 - -### Programming Paradigms - -### Software Testing - -### Math (Calculus) - -### Software Architecture - -### Theory - -### Software Engineering - -### Math (Probability) - -### Computer Architecture - -### Operating Systems - -Name | Author | ISBN -:-- | :--: | :--: -[Modern Operating Systems(4th Edition)](http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X/) | Andrew S. Tanenbaum, Herbert Bos | 9780133591620 - -### Computer Networks - -Name | Author | ISBN -:-- | :--: | :--: -[Computer Networking: A Top-Down Approach (6th Edition)](http://www.chegg.com/textbooks/computer-networking-6th-edition-9780132856201-0132856204) | James F Kurose, Keith W Ross | 9780132856201 -[Computer Networks (5th Edition)](http://www.amazon.com/Computer-Networks-5th-Andrew-Tanenbaum/dp/0132126958/) | Andrew S. Tanenbaum, David J. Wetherall| 9780132126953 - -### Databases - -### Cloud Computing - -### Math (Linear Algebra) - -### Cryptography - -### Security - -### Compilers - -Name | Author | ISBN -:-- | :--: | :--: -[Compilers: Principles, Techniques, and Tools (2nd Edition)](http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/) | Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman | 9780321486813 - -### Parallel Computing - -### UX Design - -### Computer Graphics - -### Artificial Intelligence - -### Machine Learning - -### Natural Language Processing - -### Big Data - -### Data Mining - -### Internet of Things diff --git a/extras/paid-courses.md b/extras/paid-courses.md deleted file mode 100644 index 89e08bfcc..000000000 --- a/extras/paid-courses.md +++ /dev/null @@ -1,96 +0,0 @@ -# Computer Science - Extra Resources - -## Paid Courses - -- [Introduction to Computer Science](#introduction-to-computer-science) -- [Math (Mathematical Thinking)](#math-mathematical-thinking) -- [Program Design](#program-design) -- [Math (Discrete Math)](#math-discrete-math) -- [Algorithms](#algorithms) -- [Programming Paradigms](#programming-paradigms) -- [Software Testing](#software-testing) -- [Math (Calculus)](#math-calculus) -- [Software Architecture](#software-architecture) -- [Theory](#theory) -- [Software Engineering](#software-engineering) -- [Math (Probability)](#math-probability) -- [Computer Architecture](#computer-architecture) -- [Operating Systems](#operating-systems) -- [Computer Networks](#computer-networks) -- [Databases](#databases) -- [Cloud Computing](#cloud-computing) -- [Math (Linear Algebra)](#math-linear-algebra) -- [Cryptography](#cryptography) -- [Security](#security) -- [Compilers](#compilers) -- [Parallel Computing](#parallel-computing) -- [UX Design](#ux-design) -- [Computer Graphics](#computer-graphics) -- [Artificial Intelligence](#artificial-intelligence) -- [Machine Learning](#machine-learning) -- [Natural Language Processing](#natural-language-processing) -- [Big Data](#big-data) -- [Data Mining](#data-mining) -- [Internet of Things](#internet-of-things) - ---- - -### Introduction to Computer Science - -### Math (Mathematical Thinking) - -### Program Design - -### Math (Discrete Math) - -### Algorithms - -### Programming Paradigms - -### Software Testing - -### Math (Calculus) - -### Software Architecture - -### Theory - -### Software Engineering - -### Math (Probability) - -### Computer Architecture - -### Operating Systems - -### Computer Networks - -### Databases - -### Cloud Computing - -### Math (Linear Algebra) - -### Cryptography - -### Security - -### Compilers - -### Parallel Computing - -### UX Design - -### Computer Graphics - -### Artificial Intelligence - -### Machine Learning - -### Natural Language Processing - -### Big Data - -### Data Mining - -### Internet of Things diff --git a/extras/puzzles-practice-plods.md b/extras/puzzles-practice-plods.md new file mode 100644 index 000000000..28f6d1af5 --- /dev/null +++ b/extras/puzzles-practice-plods.md @@ -0,0 +1,49 @@ +# Computer Science - Puzzles, Practice and Plods + +**Some OSSUnians value sites that allow them to practice coding problems disconnected from a course.** + +> Solving "textbook" problems is easy because we've been prepped for them by the course. Solving a "real world" example is much more difficult because there is no hand-holding. + +[link](https://github.com/ossu/computer-science/issues/783#issuecomment-694187743) + +> So give us a problem where the parameters are laid out in x,y fashion, and we'll be able to code for it. But confront us with another problem, and it might stump us since we're still not practiced with thinking algorithmically or what have you. + +[link](https://github.com/ossu/computer-science/issues/783#issuecomment-694176898) + +**Others feel that its important not to get distracted by anxieties and puzzles.** + +> Consider this a love letter to all the beginners out there. + +> I think that when you are still in the beginner stages, it FEELS like you do not have enough competence to contributing to a project. + It FEELS like taking classes, doing programming assignments etc. are not good enough in your eyes to be considered worthy of a "project". + They feel too small and insignificant. You're not quite satisfied. + (Part of the reason might be that early stuff is too easy for you, and you haven't taken a course that kicked your ass and wiped the floor with you yet.) + Since this is online learning and there is nobody/nothing holding you back, the natural tendency is to spread wide and try to do many things all at once, get distracted. + I'VE BEEN THERE, trust me. + And naturally you are in a rush to become competent as fast as possible. + You keep thinking, "when will I be ready to do something BIG?" And you don't want to wait. + Similar to how children always seem like they are in a hurry to grow up and start imitating adults. + The dissatisfaction and the impatience make for an uncomfortable combination. + Let's call this: beginner's mind. + +> The fact is, you have to be patient. + I would argue that early on in your studies, arguably, is NOT when it is most critical for you to contribute to a project... + +> I would recommend the slow, steady and patient approach of OSSU over the distracted, all over the place style of learning lots of others use, with various uncoordinated resources on the internet. + Looking for a project? How about THE NEXT COURSE? + +> So I think that the problem is not really a problem, but a need to adjust expectations. + I would recommend a shift in thinking, away from beginner's mind. + Think long term, so that those small, insignificant exercises and programming assignments in each course should feel like they are crucial parts of your biggest, long-term project: YOU + +[link](https://github.com/ossu/computer-science/issues/783#issuecomment-690023645) + +So OSSUnian, read the above and then consider how much time you wish to put into these resources: +- [Exercism](https://exercism.io/) +- [LeetCode](https://leetcode.com/) +- [HackerRank](https://www.hackerrank.com/) +- [CodeWars](https://www.codewars.com/) +- [100+ Python Coding Problems with Solutions](https://github.com/ProgrammingHero1/100-plus-python-coding-problems-with-solutions) +- [Rosalind](http://rosalind.info/problems/locations/) +- [Advent of Code](https://adventofcode.com/) +- [GitHub projects for beginners](https://github.com/MunGell/awesome-for-beginners) - Projects that are specifically geared towards beginners to GitHub. Possibly intermediate to advanced coding issues to be solved. diff --git a/extras/readings.md b/extras/readings.md new file mode 100644 index 000000000..80e6410c1 --- /dev/null +++ b/extras/readings.md @@ -0,0 +1,100 @@ +# Computer Science - Great Readings + +This document consists of great books or articles on computer science. +Some are here because there is a course covering the same material; +some are just great books that you should read at some point in your career. + +Once you have made it through most of the curriculum, knowing whether a book is worth your time will become easier. +Or, if you are struggling in one of the courses, perhaps reading a book on the subject will help. + +## Programming + +Name | Author(s) +:-- | :--: +[Introduction to Computation and Programming Using Python 3e](https://mitpress.mit.edu/books/introduction-computation-and-programming-using-python-third-edition) | John V. Guttag +[Think Python 2e](http://greenteapress.com/wp/think-python-2e/) | Allen B. Downey +[How to Design Programs 2e](https://www.htdp.org/) | Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi +[Structure and Interpretation of Computer Programs 2e](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html) | Hal Abelson, Jerry Sussman, Julie Sussman +[The Structure and Interpretation of Computer Programs (2021, JavaScript)](https://sourceacademy.org/sicpjs/index) | Harold Abelson, Gerald Jay Sussman, Julie Sussman, Martin Henz, Tobias Wrigstad and Samuel Fang +[Concepts, Techniques, and Models of Computer Programming](https://www.amazon.com/gp/product/0262220695) | Peter Van Roy, Seif Haridi +[Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) | Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides +[Refactoring](https://www.refactoring.com/) | Martin Fowler +[Clean Code](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) | Robert Martin +[Code Complete 2e](https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670) | Steve McConnell +[The Pragmatic Programmer 2e](https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/) | Andrew Hunt, David Thomas +[Programming Languages: Application and Interpretation](http://cs.brown.edu/~sk/Publications/Books/ProgLangs/) | Shriram Krishnamurthi +[Programming and Programming Languages](https://papl.cs.brown.edu/2018/) | Shriram Krishnamurthi, Benjamin S. Lerner, Joe Gibbs Politz +[Competitive Programming](https://cpbook.net/) | Steven Halim, Felix Halim +[Introduction to computing in Java](https://introcs.cs.princeton.edu/java/home/) | Robert Sedgewick, Kevin Wayne +[How to Design Programs, Second Edition](https://htdp.org/2023-8-14/Book/index.html) | Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi + +## Math + +Name | Author(s) +:-- | :--: +[Calculus Made Easy](http://www.gutenberg.org/ebooks/33283) | Silvanus P. Thompson +[Ximera: Interactive Calculus Textbooks](https://ximera.osu.edu/) | [Ximera team](https://ximera.osu.edu/about/team) +[Discrete Mathematics with Applications (4th Edition)](http://www.amazon.com/Discrete-Mathematics-Applications-Susanna-Epp/dp/0495391328/) | Susanna S. Epp +[Discrete Mathematics: An Open Introduction](http://discrete.openmathbooks.org/dmoi/) | Oscar Levin +[Applied Discrete Structures](http://faculty.uml.edu/klevasseur/ads2/) | Alan Doerr, Ken Levasseur +[Grinstead and Snell’s Introduction to Probability](https://math.dartmouth.edu/~prob/prob/prob.pdf) | Charles M. Grinstead, J. Laurie Snell +[Linear Algebra for Everyone](https://math.mit.edu/~gs/everyone/) | Gilbert Strang +[The Art of Linear Algebra](https://github.com/kenjihiranabe/The-Art-of-Linear-Algebra) | Kenji Hiranabe, Gilbert Strang + +## Systems + +Name | Author(s) +:-- | :--: +[But How Do It Know?](http://www.buthowdoitknow.com/) | J. Clark Scott +[Computer Systems: A Programmer's Perspective (3rd Edition)](http://csapp.cs.cmu.edu/) | Randal E. Bryant, David R. O'Hallaron +[Modern Operating Systems (4th Edition)](http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X/) | Andrew S. Tanenbaum, Herbert Bos +[Computer Organization and Design: The Hardware/Software Interface (6th Edition)](https://www.amazon.com/Computer-Organization-Design-MIPS-Architecture/dp/0128201096/) | David Patternson, John Hennessy +[Computer Networks (5th Edition)](http://www.amazon.com/Computer-Networks-5th-Andrew-Tanenbaum/dp/0132126958/) | Andrew S. Tanenbaum, David J. Wetherall +[Computer Networking: A Top-Down Approach (8th Edition)](https://gaia.cs.umass.edu/kurose_ross/index.html) | James F Kurose, Keith W Ross +[Distributed Systems: Principles and Paradigms](https://www.amazon.com/Distributed-Systems-Principles-Andrew-Tanenbaum/dp/153028175X) | Andrew Tanenbaum +[Operating Systems Design and Implementation](https://www.amazon.com/Operating-Systems-Design-Implementation-3rd/dp/0131429388) | Andrew S. Tanenbaum, Albert S. Woodhull +[Crafting Interpreters](https://www.craftinginterpreters.com/contents.html) | Robert Nystrom +[Principles of Compiler Design](https://www.amazon.com/Principles-Compiler-Addison-Wesley-information-processing/dp/0201000229) | Alfred Aho, Jeffrey Ullman +[Distributed Systems Reading Group](http://dsrg.pdos.csail.mit.edu/papers/) | Various +[System Design: Design large-scale systems](https://github.com/donnemartin/system-design-primer) | Various + +## Theory + +Name | Author(s) +:-- | :--: +[Introduction to Computing: Explorations in Language, Logic, and Machines](http://www.computingbook.org/) | David Evans +[Introduction to the Theory of Computation (3rd Edition)](https://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X) | Michael Sipser +[Introduction to Algorithms (3rd Edition)](http://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844/) | Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein +[The Algorithm Design Manual (3rd Edition)](https://www.algorist.com/) | Steven Skiena +[Algorithms (4th Edition)](https://algs4.cs.princeton.edu/home/) | Robert Sedgewick +[Category Theory: A Gentle Introduction](http://www.logicmatters.net/resources/pdfs/GentleIntro.pdf) | Peter Smith +[Category Theory for Programmers: The Preface](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/) | Bartosz Milewski +[An Introduction to Information Retrieval](https://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf) | Christopher D. Manning, Prabhakar Raghavan, Hinrich Schütze +[Computer Science: An interdisciplinary approach](https://introcs.cs.princeton.edu/java/cs/) | Robert Sedgewick, Kevin Wayne +[DSA CS3: Data Structures & Algorithms](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3/html/) ([Coursenotes](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3notes/html/) - [Slides](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3slides/html/)) | The OpenDSA Project (supported by National Science Foundation) + +## Applications + +Name | Author(s) +:-- | :--: +[Architecture of a Database System](http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf) | Joseph M. Hellerstein, Michael Stonebraker, James Hamilton +[Readings in Database Systems (5th Edition)](http://www.redbook.io/) | Peter Bailis, Joseph M. Hellerstein, Michael Stonebraker, editors +[Database Management Systems (3rd Edition)](https://www.amazon.com/gp/product/0072465638) | Raghu Ramakrishnan, Johannes Gehrke +[Transaction Processing: Concepts and Techniques](https://www.amazon.com/Transaction-Processing-Concepts-Techniques-Management/dp/1558601902) | Jim Gray, Andreas Reuter +[Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World (3rd Edition)](https://www.amazon.com/Data-Reality-Perspective-Perceiving-Information/dp/1935504215) | William Kent +[The Architecture of Open Source Applications](http://aosabook.org/en/) | Michael DiBernardo (editor) +[An Introduction to Statistical Learning](https://www-bcf.usc.edu/~gareth/ISL/) | Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani +[Deep Learning](http://www.deeplearningbook.org/) | Ian Goodfellow, Yoshua Bengio and Aaron Courville +[Bayesian Reasoning and Machine Learning](http://web4.cs.ucl.ac.uk/staff/D.Barber/pmwiki/pmwiki.php?n=Brml.HomePage) | David Barber +[Language Implementation Patterns](https://www.amazon.com/gp/product/193435645X) | Terence Parr +[Compilers: Principles, Techniques, and Tools (2nd Edition)](http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/) | Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman +[Compiler Construction](https://inf.ethz.ch/personal/wirth/CompilerConstruction/index.html) | Niklaus Wirth +[The Mythical Man-Month](https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/) | Fred Brooks, Jr. +[Physically Based Rendering: From Theory To Implementation](http://www.pbr-book.org/) | Matt Pharr, Wenzel Jakob, and Greg Humphreys + + +## Tools + +Name | Author(s) +:-- | :--: +[The Linux Command Line](https://linuxcommand.org/tlcl.php) | by William Shotts