How to learn computer science
How to learn computer science
Teach Yourself Computer Science
Note: this guide was extensively updated in May 2020. For the prior version, see here.
If you’re a self-taught engineer or bootcamp grad, you owe it to yourself to learn computer science. Thankfully, you can give yourself a world-class CS education without investing years and a small fortune in a degree program 💸.
There are plenty of resources out there, but some are better than others. You don’t need yet another “200+ Free Online Courses” listicle. You need answers to these questions:
This guide is our attempt to definitively answer these questions.
Thank you to the following volunteers for translations:
Study all nine subjects below, in roughly the presented order, using either the suggested textbook or video lecture series, but ideally both. Aim for 100-200 hours of study of each topic, then revisit favorites throughout your career 🚀.
Subject | Why study? | Book | Videos |
---|---|---|---|
Programming | Don’t be the person who “never quite understood” something like recursion. | Structure and Interpretation of Computer Programs | Brian Harvey’s Berkeley CS 61A |
Computer Architecture | If you don’t have a solid mental model of how a computer actually works, all of your higher-level abstractions will be brittle. | Computer Systems: A Programmer’s Perspective | Berkeley CS 61C |
Algorithms and Data Structures | If you don’t know how to use ubiquitous data structures like stacks, queues, trees, and graphs, you won’t be able to solve challenging problems. | The Algorithm Design Manual | Steven Skiena’s lectures |
Math for CS | CS is basically a runaway branch of applied math, so learning math will give you a competitive advantage. | Mathematics for Computer Science | Tom Leighton’s MIT 6.042J |
Operating Systems | Most of the code you write is run by an operating system, so you should know how those interact. | Operating Systems: Three Easy Pieces | Berkeley CS 162 |
Computer Networking | The Internet turned out to be a big deal: understand how it works to unlock its full potential. | Computer Networking: A Top-Down Approach | Stanford CS 144 |
Databases | Data is at the heart of most significant programs, but few understand how database systems actually work. | Readings in Database Systems | Joe Hellerstein’s Berkeley CS 186 |
Languages and Compilers | If you understand how languages and compilers actually work, you’ll write better code and learn new languages more easily. | Crafting Interpreters | Alex Aiken’s course on edX |
Distributed Systems | These days, most systems are distributed systems. | Designing Data-Intensive Applications by Martin Kleppmann | MIT 6.824 |
Still too much?
If the idea of self-studying 9 topics over multiple years feels overwhelming, we suggest you focus on just two books: Computer Systems: A Programmer’s Perspective and Designing Data-Intensive Applications. In our experience, these two books provide incredibly high return on time invested, particularly for self-taught engineers and bootcamp grads working on networked applications. They may also serve as a «gateway drug» for the other topics and resources listed above.
Why learn computer science?
There are 2 types of software engineer: those who understand computer science well enough to do challenging, innovative work, and those who just get by because they’re familiar with a few high level tools.
Both call themselves software engineers, and both tend to earn similar salaries in their early careers. But Type 1 engineers progress toward more fulfilling and well-remunerated work over time, whether that’s valuable commercial work or breakthrough open-source projects, technical leadership or high-quality individual contributions.
The global SMS system does around 20bn messages a day. WhatsApp is now doing 42bn. With 57 engineers. pic.twitter.com/zZrtSIzhlR
Type 1 engineers find ways to learn computer science in depth, whether through conventional means or by relentlessly learning throughout their careers. Type 2 engineers typically stay at the surface, learning specific tools and technologies rather than their underlying foundations, only picking up new skills when the winds of technical fashion change.
Currently, the number of people entering the industry is rapidly increasing, while the number of CS grads is relatively static. This oversupply of Type 2 engineers is starting to reduce their employment opportunities and keep them out of the industry’s more fulfilling work. Whether you’re striving to become a Type 1 engineer or simply looking for more job security, learning computer science is the only reliable path.
Subject guides
Programming
Most undergraduate CS programs start with an “introduction” to computer programming. The best versions of these courses cater not just to novices, but also to those who missed beneficial concepts and programming models while first learning to code.
Our standard recommendation for this content is the classic Structure and Interpretation of Computer Programs, which is available online for free both as a book, and as a set of MIT video lectures. While those lectures are great, our video suggestion is actually Brian Harvey’s SICP lectures (for the 61A course at Berkeley) instead. These are more refined and better targeted at new students than are the MIT lectures.
We recommend working through at least the first three chapters of SICP and doing the exercises. For additional practice, work through a set of small programming problems like those on exercism.
Since this guide was first published in 2016, one of the most commonly asked questions has been whether we’d now recommend recordings of a more recent iteration of 61A taught by John DeNero, and/or the corresponding book Composing Programs, which is “in the tradition of SICP” but uses Python. We think the DeNero resources are also great, and some students may end up preferring them, but we still suggest SICP, Scheme, and Brian Harvey’s lectures as the first set of resources to try.
Why? Because SICP is unique in its ability—at least potentially—to alter your fundamental beliefs about computers and programming. Not everybody will experience this. Some will hate the book, others won’t get past the first few pages. But the potential reward makes it worth trying.
If you don’t enjoy SICP, try Composing Programs. If that still doesn’t suit, try How to Design Programs. If none of these seem to be rewarding your effort, perhaps that’s a sign that you should focus on other topics for some time, and revisit the discipline of programming in another year or two.
Finally, a point of clarification: this guide is NOT designed for those who are entirely new to programming. We assume that you are a competent programmer without a background in computer science, looking to fill in some knowledge gaps. The fact that we’ve included a section on «programming» is simply a reminder that there may be more to learn. For those who’ve never coded before, but who’d like to, you might prefer a guide like this one.
Computer Architecture
Computer Architecture—sometimes called “computer systems” or “computer organization”—is an important first look at computing below the surface of software. In our experience, it’s the most neglected area among self-taught software engineers.
Our favorite introductory book is Computer Systems: A Programmer’s Perspective, and a typical introductory computer architecture course using the book would cover most of chapters 1-6.
We love CS:APP for the practical, programmer-oriented approach. While there’s much more to computer architecture than what’s covered in the book, it serves as a great starting point for those who’d like to understand computer systems primarily in order to write faster, more efficient and more reliable software.
For those who’d prefer both a gentler introduction to the topic and a balance of hardware and software concerns, we suggest The Elements of Computing Systems, also known as “Nand2Tetris”. This is an ambitious book attempting to give you a cohesive understanding of how everything in a computer works. Each chapter involves building a small piece of the overall system, from writing elementary logic gates in HDL, through a CPU and assembler, all the way to an application the size of a Tetris game.
We recommend reading through the first six chapters of the book and completing the associated projects. This will develop your understanding of the relationship between the architecture of the machine and the software that runs on it.
The first half of the book (and all of its projects), are available for free from the Nand2Tetris website. It’s also available as a Coursera course with accompanying videos.
In seeking simplicity and cohesiveness, Nand2Tetris trades off depth. In particular, two very important concepts in modern computer architectures are pipelining and memory hierarchy, but both are mostly absent from the text.
Once you feel comfortable with the content of Nand2Tetris, we suggest either returning to CS:APP, or considering Patterson and Hennessy’s Computer Organization and Design, an excellent and now classic text. Not every section in the book is essential; we suggest following Berkeley’s CS61C course “Great Ideas in Computer Architecture” for specific readings. The lecture notes and labs are available online, and past lectures are on the Internet Archive.
Algorithms and Data Structures
We agree with decades of common wisdom that familiarity with common algorithms and data structures is one of the most empowering aspects of a computer science education. This is also a great place to train one’s general problem-solving abilities, which will pay off in every other area of study.
There are hundreds of books available, but our favorite is The Algorithm Design Manual by Steven Skiena. He clearly loves algorithmic problem solving and typically succeeds in fostering similar enthusiasm among his students and readers. In our opinion, the two more commonly suggested texts (CLRS and Sedgewick) tend to be a little too proof-heavy for those learning the material primarily to help with practical problem solving.
For those who prefer video lectures, Skiena generously provides his online. We also really like Tim Roughgarden’s course, available on Coursera and elsewhere. Whether you prefer Skiena’s or Roughgarden’s lecture style will be a matter of personal preference. In fact, there are dozens of good alternatives, so if you happen to find another that you like, we encourage you to stick with it!
For practice, our preferred approach is for students to solve problems on Leetcode. These tend to be interesting problems with decent accompanying solutions and discussions. They also help you test progress against questions that are commonly used in technical interviews at the more competitive software companies. We suggest solving around 100 random leetcode problems as part of your studies.
Finally, we strongly recommend How to Solve It as an excellent and unique guide to general problem solving; it’s as applicable to computer science as it is to mathematics.
I have only one method that I recommend extensively—it’s called think before you write.
Mathematics for Computer Science
In some ways, computer science is an overgrown branch of applied mathematics. While many software engineers try—and to varying degrees succeed—at ignoring this, we encourage you to embrace it with direct study. Doing so successfully will give you an enormous competitive advantage over those who don’t.
The most relevant area of math for CS is broadly called “discrete mathematics”, where “discrete” is the opposite of “continuous” and is loosely a collection of interesting applied math topics outside of calculus. Given the vague definition, it’s not meaningful to try to cover the entire breadth of “discrete mathematics”. A more realistic goal is to build a working understanding of logic, combinatorics and probability, set theory, graph theory, and a little of the number theory informing cryptography. Linear algebra is an additional worthwhile area of study, given its importance in computer graphics and machine learning.
Our suggested starting point for discrete mathematics is the set of lecture notes by László Lovász. Professor Lovász did a good job of making the content approachable and intuitive, so this serves as a better starting point than more formal texts.
For a more advanced treatment, we suggest Mathematics for Computer Science, the book-length lecture notes for the MIT course of the same name. That course’s video lectures are also freely available, and are our recommended video lectures for discrete math.
For linear algebra, we suggest starting with the Essence of linear algebra video series, followed by Gilbert Strang’s book and video lectures.
If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.
Operating Systems
Operating System Concepts (the “Dinosaur book”) and Modern Operating Systems are the “classic” books on operating systems. Both have attracted criticism for their lack of clarity and general student unfriendliness.
Operating Systems: Three Easy Pieces is a good alternative that’s freely available online. We particularly like the structure and readability of the book, and feel that the exercises are worthwhile.
After OSTEP, we encourage you to explore the design decisions of specific operating systems, through “
A great way to consolidate your understanding of operating systems is to read the code of a small kernel and add features. One choice is xv6, a port of Unix V6 to ANSI C and x86, maintained for a course at MIT. OSTEP has an appendix of potential xv6 labs full of great ideas for potential projects.
Computer Networking
Given that so much of software engineering is on web servers and clients, one of the most immediately valuable areas of computer science is computer networking. Our self-taught students who methodically study networking find that they finally understand terms, concepts and protocols they’d been surrounded by for years.
Our favorite book on the topic is Computer Networking: A Top-Down Approach. The small projects and exercises in the book are well worth doing, and we particularly like the “Wireshark labs”, which they have generously provided online.
For those who prefer video lectures, we suggest Stanford’s Introduction to Computer Networking course previously available via Stanford’s MOOC platform Lagunita, but sadly now only available as unofficial playlists on Youtube.
You can’t gaze in the crystal ball and see the future. What the Internet is going to be in the future is what society makes it.
Databases
It takes more work to self-learn about database systems than it does with most other topics. It’s a relatively new (i.e. post 1970s) field of study with strong commercial incentives for ideas to stay behind closed doors. Additionally, many potentially excellent textbook authors have preferred to join or start companies instead.
Given the circumstances, we encourage self-learners to generally avoid textbooks and start with recordings of CS 186, Joe Hellerstein’s databases course at Berkeley, and to progress to reading papers after.
One paper particularly worth mentioning for new students is “Architecture of a Database System”, which uniquely provides a high-level view of how relational database management systems (RDBMS) work. This will serve as a useful skeleton for further study.
Readings in Database Systems, better known as the databases “Red Book”, is a collection of papers compiled and edited by Peter Bailis, Joe Hellerstein and Michael Stonebraker. For those who have progressed beyond the level of the CS 186 content, the Red Book should be your next stop.
If you’re adamant about using an introductory textbook, we suggest Database Management Systems by Ramakrishnan and Gehrke. For more advanced students, Jim Gray’s classic Transaction Processing: Concepts and Techniques is worthwhile, but we don’t encourage using this as a first resource.
Finally, data modeling is a neglected and poorly taught aspect of working with databases. Our suggested book on the topic is Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.
Languages and Compilers
Most programmers learn languages, whereas most computer scientists learn about languages. This gives the computer scientist a distinct advantage over the programmer, even in the domain of programming! Their knowledge generalizes; they are able to understand the operation of a new language more deeply and quickly than those who have merely learned specific languages.
Our suggested introductory text is the excellent Crafting Interpreters by Bob Nystrom, available for free online. It’s well organized, highly entertaining, and well suited to those whose primary goal is simply to better understand their languages and language tools. We suggest taking the time to work through the whole thing, attempting whichever of the «challenges» sustain your interest.
A more traditional recommendation is Compilers: Principles, Techniques & Tools, commonly called “the Dragon Book”. Unfortunately, it’s not designed for self-study, but rather for instructors to pick out 1-2 semesters worth of topics for their courses.
If you elect to use the Dragon Book, it’s almost essential that you cherry-pick the topics, ideally with the help of a mentor. In fact, our suggested way to utilize the Dragon Book, if you so choose, is as a supplementary reference for a video lecture series. Our recommended one is Alex Aiken’s, on edX.
Don’t be a boilerplate programmer. Instead, build tools for users and other programmers. Take historical note of textile and steel industries: do you want to build machines and tools, or do you want to operate those machines?
— Ras Bodik at the start of his compilers course
Distributed Systems
As computers have increased in number, they have also spread. Whereas businesses would previously purchase larger and larger mainframes, it’s typical now for even very small applications to run across multiple machines. Distributed systems is the study of how to reason about the trade-offs involved in doing so.
Our suggested book for self-study is Martin Kleppmann’s Designing Data-Intensive Applications. Far better than a traditional textbook, DDIA is a highly readable book designed for practitioners, which somehow avoids sacrificing depth or rigor.
For those seeking a more traditional text, or who would prefer one that’s available for free online, we suggest Maarten van Steen and Andrew Tanenbaum’s Distributed Systems, 3rd Edition.
For those who prefer video, an excellent course with videos available online is MIT’s 6.824, a graduate course taught by Robert Morris with readings available here.
No matter the choice of textbook or other secondary resources, study of distributed systems absolutely mandates reading papers. A good list is here, and we would highly encourage attending your local Papers We Love chapter.
Frequently asked questions
Who is the target audience for this guide?
We have in mind that you are a self-taught software engineer, bootcamp grad or precocious high school student, or a college student looking to supplement your formal education with some self-study. The question of when to embark upon this journey is an entirely personal one, but most people tend to benefit from having some professional experience before diving too deep into CS theory. For instance, we notice that students love learning about database systems if they have already worked with databases professionally, or about computer networking if they’ve worked on a web project or two.
What about AI/graphics/pet-topic-X?
We’ve tried to limit our list to computer science topics that we feel every practicing software engineer should know, irrespective of specialty or industry, but with a focus on systems. In our experience, these will be the highest ROI topics for the overwhelming majority of self-taught engineers and bootcamp grads, and provide a solid foundation for further study. Subsequently, you’ll be in a much better position to pick up textbooks or papers and learn the core concepts without much guidance. Here are our suggested starting points for a couple of common “electives”:
How strict is the suggested sequencing?
Realistically, all of these subjects have a significant amount of overlap, and refer to one another cyclically. Take for instance the relationship between discrete math and algorithms: learning math first would help you analyze and understand your algorithms in greater depth, but learning algorithms first would provide greater motivation and context for discrete math. Ideally, you’d revisit both of these topics many times throughout your career.
As such, our suggested sequencing is mostly there to help you just get started… if you have a compelling reason to prefer a different sequence, then go for it. The most significant “pre-requisites” in our opinion are: computer architecture before operating systems or databases, and networking and operating systems before distributed systems.
How does this compare to Open Source Society or freeCodeCamp curricula?
When this guide was first written in 2016, the OSS guide had too many subjects, suggested inferior resources for many of them, and provided no rationale or guidance around why or what aspects of particular courses are valuable. We strove to limit our list of courses to those which you really should know as a software engineer, irrespective of your specialty, and to help you understand why each course is included. In the subsequent years, the OSS guide has improved, but we still think that this one provides a clearer, more cohesive path.
freeCodeCamp is focused mostly on programming, not computer science. For why you might want to learn computer science, see above. If you are new to programming, we suggest prioritizing that, and returning to this guide in a year or two.
What about language X?
Learning a particular programming language is on a totally different plane to learning about an area of computer science — learning a language is much easier and much less valuable. If you already know a couple of languages, we strongly suggest simply following our guide and fitting language acquisition in the gaps, or leaving it for afterwards. If you’ve learned programming well (such as through Structure and Interpretation of Computer Programs), and especially if you have learned compilers, it should take you little more than a weekend to learn the essentials of a new language, after which you can learn about the libraries/tooling/ecosystem on the job.
What about trendy technology X?
No single technology is important enough that learning to use it should be a core part of your education. On the other hand, it’s great that you’re excited to learn about that thing. The trick is to work backwards from the particular technology to the underlying field or concept, and learn that in depth before seeing how your trendy technology fits into the bigger picture.
Why are you still recommending SICP?
Look, just try it. Some people find SICP mind blowing, a characteristic shared by very few other books. If you don’t like it, you can always try something else and perhaps return to SICP later.
Why are you still recommending the Dragon book?
The Dragon book is still the most complete single resource for compilers. It gets a bad rap, typically for overemphasizing certain topics that are less fashionable to cover in detail these days, such as parsing. The thing is, the book was never intended to be studied cover to cover, only to provide enough material for an instructor to put together a course. Similarly, a self-learner can choose their own adventure through the book, or better yet follow the suggestions that lecturers of public courses have made in their course outlines.
How can I get textbooks cheaply?
Many of the textbooks we suggest are freely available online, thanks to the generosity of their authors. For those that aren’t, we suggest buying used copies of older editions. As a general rule, if there has been more than a couple of editions of a textbook, it’s quite likely that an older edition is perfectly adequate. It’s certainly unlikely that the newest version is 10x better than an older one, even if that’s what the price difference is!
Who made this?
This guide was originally written by Oz Nova and Myles Byrne, with 2020 updates by Oz. It is based on our experience teaching foundational computer science to over 1000 mostly self-taught engineers and bootcamp grads in small group settings in San Francisco and live online. Thank you to all of our students for your continued feedback on self-teaching resources.
We’re very confident that you could teach yourself everything above, given enough time and motivation. But if you’d prefer an intensive, structured, instructor-led program, you might be interested in our Computer Science Intensive. We DON’T suggest pursuing a master’s degree.
For updates to this guide and general computer science news and resources, you may also like to join Bradfield’s mailing list:
ossu/computer-science
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Open Source Society University
Path to a free self-taught education in Computer Science!
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:
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 or extras/readings.
Organization. The curriculum is designed as follows:
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 spread 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.
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 and edX 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.
Content policy. If you plan on showing off some of your coursework publicly, you must share only files that you are allowed to. Do NOT disrespect the code of conduct that you signed in the beginning of each course!
Getting help (Details about our FAQ and chatroom)
Curriculum version: 8.0.0 (see CHANGELOG)
Introduction to Programming
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.
Topics covered: simple programs simple data structures
Courses | Duration | Effort | Prerequisites | Discussion |
---|---|---|---|---|
Python for Everybody | 10 weeks | 10 hours/week | none | chat |
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!
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 (alt) | 9 weeks | 15 hours/week | high school algebra | chat |
All coursework under Core CS is required, unless otherwise indicated.
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
The How to Code courses are based on the textbook How to Design Programs. The First Edition is available for free online and includes problem sets and solutions. Students are encouraged to do these assignments.
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 (alt) | 13 weeks | 6-10 hours/week | The alternate covers this and the following 2 courses | high school math | chat |
Calculus 1B: Integration | 13 weeks | 5-10 hours/week | — | Calculus 1A | chat |
Calculus 1C: Coordinate Systems & Infinite Series | 6 weeks | 5-10 hours/week | — | Calculus 1B | chat |
Mathematics for Computer Science (alt) | 13 weeks | 5 hours/week | 2015/2019 solutions 2010 solutions 2005 solutions. | Calculus 1C | chat |
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 | 2 weeks | 12 hours/week | — | chat |
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 (alt) | 6 weeks | 7-13 hours/week | — | C-like programming language | chat |
Build a Modern Computer from First Principles: Nand to Tetris Part II | 6 weeks | 12-18 hours/week | — | one of these programming languages, From Nand to Tetris Part I | chat |
Operating Systems: Three Easy Pieces | 10-12 weeks | 6-10 hours/week | — | strong C programming | chat |
Computer Networking: a Top-Down Approach | 8 weeks | 4–12 hours/week | Wireshark Labs | algebra, probability, basic CS | chat |
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 | 4 weeks | 4-8 hours/week | any programming language, Mathematics for Computer Science | chat |
Graph Search, Shortest Paths, and Data Structures | 4 weeks | 4-8 hours/week | Divide and Conquer, Sorting and Searching, and Randomized Algorithms | chat |
Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming | 4 weeks | 4-8 hours/week | Graph Search, Shortest Paths, and Data Structures | chat |
Shortest Paths Revisited, NP-Complete Problems and What To Do About Them | 4 weeks | 4-8 hours/week | Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming | chat |
Topics covered Confidentiality, Integrity, Availability Secure Design Defensive Programming Threats and Attacks Network Security Cryptography and more
Courses | Duration | Effort | Prerequisites | Discussion |
---|---|---|---|---|
Cybersecurity Fundamentals | 8 weeks | 10-12 hours/week | — | chat |
Principles of Secure Coding | 4 weeks | 4 hours/week | — | chat |
Identifying Security Vulnerabilities | 4 weeks | 4 hours/week | — | chat |
Choose one of the following:
Courses | Duration | Effort | Prerequisites | Discussion |
---|---|---|---|---|
Identifying Security Vulnerabilities in C/C++Programming | 4 weeks | 5 hours/week | — | chat |
Exploiting and Securing Vulnerabilities in Java Applications | 4 weeks | 5 hours/week | — | chat |
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 | 2 weeks | 10 hours/week | core programming | chat |
Databases: Relational Databases and SQL | 2 weeks | 10 hours/week | core programming | chat |
Databases: Semistructured Data | 2 weeks | 10 hours/week | core programming | chat |
Machine Learning | 11 weeks | 4-6 hours/week | linear algebra | chat |
Computer Graphics | 6 weeks | 12 hours/week | C++ or Java, linear algebra | chat |
Software Engineering: Introduction | 6 weeks | 8-10 hours/week | Core Programming, and a sizable project | chat |
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 | 9 weeks | 2 hours/week | none | chat |
Introduction to Intellectual Property | 4 weeks | 2 hours/week | none | chat |
Data Privacy Fundamentals | 3 weeks | 3 hours/week | none | chat |
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.
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 | 4 weeks | 6-8 hours/week | Scala programming |
Compilers | 9 weeks | 6-8 hours/week | none |
Introduction to Haskell | 14 weeks | — | — |
Learn Prolog Now! (alt)* | 12 weeks | — | — |
Software Debugging | 8 weeks | 6 hours/week | Python, object-oriented programming |
Software Testing | 4 weeks | 6 hours/week | Python, programming experience |
(*) book by Blackburn, Bos, Striegnitz (compiled from source, redistributed under CC license)
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 alt1 alt2 | 10 weeks | 6 hours/week | Nand2Tetris II | Alternate links contain all 3 courses. |
Computation Structures 2: Computer Architecture | 10 weeks | 6 hours/week | Computation Structures 1 | |
Computation Structures 3: Computer Organization | 10 weeks | 6 hours/week | Computation Structures 2 |
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 (Lectures) | 8 weeks | 10 hours/week | discrete mathematics, logic, algorithms |
Computational Geometry | 16 weeks | 8 hours/week | algorithms, C++ |
Game Theory | 8 weeks | 3 hours/week | mathematical thinking, probability, calculus |
Advanced Information Security
Courses | Duration | Effort | Prerequisites |
---|---|---|---|
Web Security Fundamentals | 5 weeks | 4-6 hours/week | understanding basic web technologies |
Security Governance & Compliance | 3 weeks | 3 hours/week | — |
Digital Forensics Concepts | 3 weeks | 2-3 hours/week | Core Security |
Secure Software Development: Requirements, Design, and Reuse | 7 weeks | 1-2 hours/week | Core Programming and Core Security |
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 | 7 weeks | 1-2 hours/week | Secure Software Development: Implementation |
Courses | Duration | Effort | Prerequisites | Discussion |
---|---|---|---|---|
Essence of Linear Algebra | — | — | high school math | chat |
Linear Algebra | 14 weeks | 12 hours/week | corequisite: Essence of Linear Algebra | chat |
Introduction to Numerical Methods | 14 weeks | 12 hours/week | Linear Algebra | chat |
Introduction to Logic | 10 weeks | 4-8 hours/week | set theory | chat |
Probability | 24 weeks | 12 hours/week | Differentiation and Integration | chat |
OSS University is project-focused. The assignments and exams for each course are to prepare you to use your knowledge to solve real-world problems.
After you’ve gotten through all of Core CS and the parts of Advanced CS relevant to you, you should think about a problem that you can solve using the knowledge you’ve acquired. Not only does real project work look great on a resume, but the project will also validate and consolidate your knowledge. You can create something entirely new, or you can find an existing project that needs help via websites like CodeTriage or First Timers Only.
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 | 12 weeks | 15 hours/week | programming |
Modern Robotics (Specialization) | 26 weeks | 2-5 hours/week | freshman-level physics, linear algebra, calculus, linear ordinary differential equations |
Data Mining (Specialization) | 30 weeks | 2-5 hours/week | machine learning |
Big Data (Specialization) | 30 weeks | 3-5 hours/week | none |
Internet of Things (Specialization) | 30 weeks | 1-5 hours/week | strong programming |
Cloud Computing (Specialization) | 30 weeks | 2-6 hours/week | C++ programming |
Data Science (Specialization) | 43 weeks | 1-6 hours/week | none |
Functional Programming in Scala (Specialization) | 29 weeks | 4-5 hours/week | One year programming experience |
Game Design and Development with Unity 2020 (Specialization) | 6 months | 5 hours/week | programming, interactive design |
Upon completing your final project:
Submit your project’s information to PROJECTS via a pull request.
Put the OSSU-CS badge in the README of your repository!
Use our community channels to announce it to your fellow students.
Solicit feedback from your OSSU peers. You will not be «graded» in the traditional sense — everyone has their own measurements for what they consider a success. The purpose of the evaluation is to act as your first announcement to the world that you are a computer scientist and to get experience listening to feedback — both positive and negative.
The final project evaluation has a second purpose: to evaluate whether OSSU, through its community and curriculum, is successful in its mission to guide independent learners in obtaining a world-class computer science education.
You can create this project alone or with other students! We love cooperative work! Use our channels 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 final project.
The important thing is to internalize the core concepts and to be able to use them with whatever tool (programming language) that you wish.
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:
Code of conduct
How to show your progress
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:
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.
Как разобраться в Computer Science самостоятельно
Для большинства программистов Computer Science — факультет в зарубежных вузах, целиком и полностью посвящённый программированию, математике и всему, что связано с разработкой программного обеспечения. К счастью, в современном мире необязательно инвестировать тысячи долларов и 4 года своей жизни в образование, ведь существует бесчисленное множество онлайн-курсов, книг и других ресурсов для изучения компьютерных наук.
Приводить сотни всевозможных материалов для программистов-самоучек мы не будем, а лишь попытаемся ответить на два главных вопроса:
В качестве ответа приведём список материалов, опубликованный Озаном Онай (Ozan Onay) и Майлзом Бёрном (Myles Byrne) — инструкторами в школе компьютерных наук Брэдфилда в Сан-Франциско. Данная подборка литературы и курсов основана на личном опыте обучения сотен программистов-самоучек.
Зачем изучать компьютерные науки?
Существует два типа программистов: те, кто владеют компьютерными науками достаточно хорошо, чтобы совершать инновации, и те, кто вроде как что-то могут благодаря знанию пары-тройки высокоуровневых инструментов.
И те и другие называют себя программистами или инженерами программного обеспечения и имеют примерно одинаковые доходы в начале своей карьеры. Однако первые в итоге становятся более высокооплачиваемыми специалистами. Причём абсолютно неважно, работают они над известными, дорогими и большими коммерческими проектами или над инновационными open-source проектами различной сложности. Они становятся лидерами в своей области и привносят нечто большее и более качественное на рынок.
Они углубленно изучают компьютерные науки, читая книги, слушая лекции, практикуясь или же упорно поглощая материал на личном опыте в своей карьере. Вторые же обычно остаются на дне, изучая различные инструменты и технологии для своей работы, а не то, на чём эти технологии основаны. Для них причиной для изучения чего-то нового является появление новых инструментов и, следовательно, устаревание старых.
На данный момент число людей в индустрии постоянно растёт, а число выпускников с факультета компьютерных наук остаётся неизменным. Перенасыщение рынка инженерами второго типа в итоге приводит оных к безработице или к сравнительно дешевому трудоустройству. Вне зависимости от ваших стремлений: хотите вы стать инженером первого типа или просто ищете способ заработать немного денег, изучение Computer Science — единственный надёжный путь для этого.
Дисциплины
Программирование
Структура и интерпретация компьютерных программ
Львиная доля студентов Computer Science начинают с «вводных курсов» по программированию. Однако такие курсы будут полезны не только новичкам, но и вполне себе специалистам, которые по какой-либо причине пропустили некоторые базовые для программирования вещи.
Мы рекомендуем взять во внимание классическую «Структуру и интерпретацию компьютерных программ». Прочтите как минимум три главы приведенной выше книги, выполняя упражнения для практики. Для тех, кому данная книга кажется слишком сложной, рекомендуется «How to design programs». Тем же, кому она наоборот кажется слишком лёгкой, следует обратить внимание на «Concepts, Techniques, and Models of Computer Programming».
Можно также послушать лекции университета MIT по данной теме. Как альтернативу мы рекомендуем прослушать лекции Брайана Харви из университета Беркли, особенно, если для вас это в новинку.
Для дополнительной практики возьмите на заметку ресурс Exercism: на нём можно найти сотни интересных задачек по программированию, которые помогут вам в освоении синтаксиса разных языков программирования и прокачают ваше логическое мышление, которое необходимо программисту, как воздух.
Архитектура ЭВМ
Цифровая схемотехника и архитектура компьютера
Архитектура ЭВМ, также иногда называемая «компьютерными системами» или «организацией компьютера» — достаточно важная тема, описывающая работу аппаратного слоя, который лежит на уровень ниже, чем слой программного обеспечения. Пожалуй, самая недооцененная область среди инженеров-самоучек.
The elements of Computing Systems — амбициозная книга, которая даёт понимание того, как работает компьютер. Каждая глава — строение одной маленькой детали большой системы: от написания логики на HGL (языке описания аппаратуры) через центральный процессор к созданию тетриса.
Мы рекомендуем прочесть как минимум первые 6 глав книги и завершить указанный в ней проект. Это поможет лучше понять отношения между архитектурой компьютера и программным обеспечением, которое на ней работает.
Не ищите простого объяснения сложных вещей в этой книге — автор заходит издалека. Если конкретнее, то в книге, например, почти полностью отсутствуют два очень важных концепта в современной архитектуре ЭВМ — вычислительный конвейер и иерархия памяти.
Как только вы почувствуете себя в своей тарелке, читая эту книгу, смело переходите на Computer Organization And Design, отличный текст, который стал своего рода классикой. Также обратите внимание на курс CS61C, лекции которого доступны онлайн.
Алгоритмы и структуры данных
Алгоритмы Руководство По Разработке
Мы полностью согласны с народной мудростью, которая гласит, что знание алгоритмов и структур данных — один из важнейших аспектов изучения компьютерных наук. К тому же, это отличный способ потренироваться в способности решать разного рода задачи, которые пригодятся в любой области компьютерных наук.
Есть сотни книг для изучения алгоритмов, но наш фаворит — «Алгоритмы Руководство по разработке» от Стивена Скиена. Наш выбор пал именно на неё, потому что автор определенно любит то, что он делает и хочет донести свои знания до читателя.
Для тех же, кто предпочитает лекции в формате видео, Скиена предлагает свой онлайн-курс. Также следует обратить внимание на курс Тима Рафгардена, доступного на Lagunita (сервис от университета Стэнфорда) или на Coursera. Материал обоих авторов очень полезен и информативен и кому из них уделить внимание — решать вам.
Мы практикуемся, решая задачи на Leetcode, потому что их задачи кажутся нам наиболее интересными. К тому же у каждой задачи есть ветка обсуждения и прикрепленное решение для самопроверки. Стоит отметить, что подобного рода задачи могут являться вопросами на интервью и решение их может сыграть вам на руку в будущем трудоустройстве. Для проверки своего знания алгоритмов решите 100 случайных задач на Leetcode.
В завершение, мы настоятельно рекомендуем How to solve it — великолепный материал для практики решения задач. Подходит как тем, кто изучает компьютерные науки, так и математикам.
Математика для компьютерных наук
Mathematics for Computer Science
В каком-то смысле компьютерные науки — это лишь область прикладной математики. Пока некоторые программисты пытаются и возможно преуспевают в попытках оставаться вдали от математики, мы рекомендуем не уподобляться им и изучать её. Ведь знание математики даст вам значительную фору по сравнению с другими программистами, которые математику игнорируют.
В основе большая часть математики для компьютерных наук — дискретная математика, где слово «дискретная» — прямая противоположность слову «непрерывная» и, грубо говоря, является сборником интересных тем в прикладной математике, за пределами математического анализа. Немного расплывчато, согласны. Впрочем, это не так важно: можно поставить себе цель изучить базовую логику, комбинаторику, теорию вероятности, теорию графов, основы криптографии. Линейная алгебра не менее прочего заслуживает вашего внимания, особенно для изучения компьютерной графики или машинного обучения.
Хорошим началом изучения дискретной математики является сборник лекций от László Lovász. Профессор проделал хорошую работу, чтобы сделать математику понятной и интуитивной, так что его работы куда больше подойдут новичкам, чем формальные математические тексты.
Для большего погружения советуем Mathematics for Computer Science — записи с лекций по одноименному курсу MIT, которые по объёму тянут на полноценную книгу. Видео данных лекций, кстати, тоже в свободном доступе.
Для линейной алгебры мы предлагаем начать с плейлиста Основы линейной алгебры.
Операционные системы
Operating Systems: Three Easy Pieces
Operating System Concepts и Modern Operating Systems — классика в вопросе операционных систем. Обе довольно часто подвергались критике в основном за то, что не являются 1000-страничными быстроустаревающими энциклопедиями, новое издание которых приходится покупать каждые пару лет.
Существует ещё одна книга по операционным системам, которую мы также очень рекомендуем к ознакомлению. Three Easy Pieces: структура повествования книги делает её легкой к восприятию, а задания помогут закрепить полученные знания.
После прочтения указанных выше книг имеет смысл пройтись по конкретным операционным системам и прочесть следующее: A commentary on the unix operating system, The design and implementation of the freeBSD operating systems и Mac OS internals.
Идеальный способ закрепить полученные знания — это прочесть код небольшого ядра и внести в него свои изменения. Как вариант можно взять XV6 — современную реализацию 6 версии Unix для архитектуры x86, написанную на ANSI C. В приведённой выше Three Easy Pieces есть раздел с заданиями с XV6, полный интересных идей для потенциальных проектов.
Компьютерные сети
Computer Networking: A Top-Down Approach
Учитывая то, что львиная доля работы у программистов целиком и полностью опирается на веб-сервера, компьютерные сети — одна из самых важных областей компьютерных наук. Программисты-самоучки, которые методично изучают компьютерные сети, хвастают тем, что гораздо лучше многих понимают термины, концепты, протоколы, которыми постоянно окружены в своей карьере.
Наш фаворит в этом вопросе — Computer Networking: A Top-Down Approach. Небольшие проекты и задания для практики на протяжении всего материала весьма интересны и стоят вашего внимания. Также следует обратить внимание на Wireshark labs, любезно предоставленные автором книги.
Для тех же, кто предпочитает просмотр лекций чтению книг, мы рекомендуем серию лекций от университета Стэнфорд Stanford CS 144.
Небольшие проекты, как ни странно, более полезны для освоения компьютерных сетей, нежели задачки. Некоторые из них — HTTP сервер, чат-приложение на UDP, мини TCP stack или же распределённая таблица хэшей и т.д.
Базы данных
Readings in Database Systems
Изучение баз данных требует куда большего упорства, чем нужно для других тем, так как базы данных —относительно новая область компьютерных наук (с 1970-ых). Её основы скрыты от нас по вполне себе понятным коммерческим причинам. К тому же многие потенциальные авторы книг по базам данных предпочли сами стать разработчиками и основали свои компании.
Учитывая приведенные выше обстоятельства, мы настоятельно рекомендуем новичкам избегать книжек и начинать прямиком с записей CS186 весны 2015 от Джо Геллерштейна из университета Беркли. После данного курса уже можно переходить к книжкам.
Одна из них — это Architecture of a Database System от того же профессора из того же университета. Книга даст читателю углубленный взгляд на реляционные базы данных и послужит отличным скелетом для будущих знаний в этой области.
Readings in Database Systems, также известная как красная книга по базам данных (никто не вымирает), представляет собой сборник публикаций по данной теме. Для тех, кто осилил CS186, эта книга может стать следующей остановкой.
Если вы настаиваете на том, чтобы начинать изучение баз данных по книжкам, то советуем обратить внимание на Database management systems.
Сложно закрепить знания в этой области без практики. Студенты CS186 работают над дополнениями для Spark, однако лучшей практикой для начинающих будет всё же написание своей реляционной базы данных с нуля. Скорее всего, она поначалу не будет богата уникальными особенностями, но значительно укрепит ваше понимание темы.
Под конец, моделирование данных — один из самых пренебрегаемых аспектов в изучении баз данных. Здесь нашим фаворитом является Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.
Языки и компиляторы
Compilers: Principles, Techniques and Tools
Большинство программистов изучают языки программирования, в то время как специалисты компьютерных наук пытаются понять, как эти языки работают. Эти знания позволяют им опережать своих коллег по карьерной лестнице и быстрее схватывать новый материал.
Классикой в данном вопросе является Compilers: Principles, Techniques and Tools. К сожалению, этот материал больше подходит учителям, нежели самоучкам. Однако книга отлично подойдёт для непоследовательного чтения, для выхватывания отдельных кусков из материала и изучения по ним. К тому же, если у вас будет учитель, это лишь ускорит ваше обучение.
Если же вы решите учиться по данной книге без учителя, то настоятельно рекомендуем обратить внимание на серию лекций от Алекса Айкена из Стэнфордского университета.
Потенциальной альтернативой этой книге может стать Language Implementation Patterns. Она написана с упором на инженеров, которые собираются практиковаться на языках вроде DSL.
В качестве проекта для закрепления материала можно написать свой компилятор для простенького языка вроде COOL. Те, кому данный проект кажется невыполнимым, могут начать с чего-то вроде Make a Lisp.
Распределённые системы
Distributed Systems, 3rd Edition by Maarten van Steen
Число компьютеров и их разнообразие увеличилось за последние несколько десятков лет. Если раньше крупные компании закупали огромные сервера для обеспечения работы каких-либо программ, то сегодня нам кажется очевидным тот факт, что даже самые незначительные программы работают на нескольких компьютерах одновременно. Распределённые системы — наука о том, как это обеспечить.
Книга, которую мы хотим посоветовать, — Distributed Systems, третье издание которой служит прекрасным дополнением всем предыдущим. Учитывая то, что распределенные системы — область, которая достаточно часто меняется, нет уникальной книги, которая проведёт вас по этому тернистому пути. Приведённая же выше книга, по нашему мнению, наиболее близка к этому идеалу.
Можно также обратить внимание на серию лекций MIT 6.824, но, к сожалению, качество записи звука оставляет желать лучшего.
Не имеет значения, какую книгу или сторонний ресурс вы выбрали для изучения распределённых систем, погружение в эту область компьютерных наук требует от студента чтения большого количества литературы. Здесь вы можете найти список полезных книг.
Часто задаваемые вопросы
Что насчет искусственного интеллекта и графики?
Мы постарались ограничить наш материал списком дисциплин, которым, как нам кажется, любой практикующий инженер должен владеть вне зависимости от специальности и индустрии. С таким фундаментом знаний вы сможете гораздо быстрее схватывать новый материал из книг или сторонних ресурсов. Что касается ИИ и графики, вот наш список рекомендуемых материалов:
Насколько важно строго следовать порядку, приведенному в статье?
На самом деле, все 9 дисциплин достаточно часто пересекаются. К примеру, возьмите дискретную математику и алгоритмы: изучение математики поможет вам в освоении алгоритмов. Знание алгоритмов, в свою очередь, даст стимул погрузиться в дискретную математику. В идеальном сценарии программист достаточно часто повторяет данный материал в своей карьере.
По существу наша последовательность сконструирована таким образом, чтобы помочь вам начать. Если у вас есть непреодолимое желание следовать другой последовательности, мы не настаиваем. Однако мы считаем, что освоить архитектуру ЭВМ нужно перед освоением операционных систем и баз данных, а компьютерные сети и операционные системы перед распределёнными системами.
Что общего у данного списка с Open Source Society или FreeCodeCamp?
Первый содержит слишком много дисциплин для изучения, предлагает не самые лучшие материалы для большинства из них и не даёт понять, какие аспекты конкретной дисциплины наиболее ценны. Мы же попытались ограничить наш материал списком дисциплин, которые должен знать каждый инженер, вне зависимости от специальности.
Касательно FreeCodeCamp, данный ресурс сконцентрирован на программировании, а не на компьютерных науках.
А где же язык X?
Изучение конкретного языка программирования — совершенно другая плоскость, нежели изучение компьютерных наук. Изучение языка программирования — задача наиболее простая и менее ценная. Если вы уже знаете пару-тройку языков, то советуем просто следовать нашему списку дисциплин, оставляя языки на потом. Если вы знаете программирование в целом достаточно хорошо и знаете, как работают компиляторы, вам потребуется не больше недели, чтобы выучить новый язык программирования.
Почему вы до сих пор рекомендуете книжку с драконами (Compilers: Principles, Techniques and Tools)?
Потому что книжка с драконами до сих пор является полным и актуальным источником информации по компиляторам. Проблема в том, что никто и предположить не мог, что в итоге книга окажется инструкцией для преподавателей по составлению учебной программы. Вы же можете воспользоваться этим для составления своей собственной программы или следуя программе какого-либо преподавателя.
How to learn computer science basics
Computer science is basically about solving problems. It’s about understanding what computers can do for you, whereas programming itself is the practice of making computers do those things.
Do you like solving problems? If that’s the case, computer science might just be your thing.
Learning CS and coding will require skills in logical thinking and solving problems in various ways. Of course, you will also need quite a bit of patience, too, for those days when things don’t go the way you planned.
Luckily, there are plenty of great resources available for learning computer science basics online. I’ll be sharing my favourite ones with you in this chapter.
But first, let’s start by looking at a few crucial reasons for learning CS to begin with.
Free Guide: Contents
Why should you learn computer science?
What are CS skills good for with coding? If you’re just writing code for computer programs, why do you need to know what’s happening under the hood inside the computer?
Anyone without much knowledge in Computer Science will face quite a challenge when they start learning coding: they have to understand the terminology and dynamics around coding, which are closely related to the fundamentals of CS.
As I mentioned above, Computer Science is about understanding what computers can do for you and how they work. Knowing how your code actually works and is executed helps you write better, faster, and more efficient programs in the future.
Of course, when you’re just starting out by writing simple, one-file programs, worrying about writing perfectly efficient code is not your number one priority. However, the sooner you start being more aware of it, the easier it will be to learn the fundamentals of how to write “good” code in the long run.
“Learning coding without knowing much about CS is like learning how to drive but not knowing what happens when you turn the steering wheel.”
Since the more technical terms can sometimes become a bit overwhelming for a coding beginner, I’ve put together this chapter to get you started.
Understanding computer science helps you achieve your goals faster
When you start learning to code, you are bombarded with new technical terminology that gets your head spinning.
And if you are anything like me, you will spend tons of time looking for answers and explanations online.
That’s perfectly OK! We’ve all been there.
However, you can easily speed up your learning process by dedicating some time to learning computer science fundamentals before you start learning your first programming language.
Once you understand how computers work, you will feel more confident in writing your first programs and building projects on your own. Being familiar with the underlying technicalities of how computers “see” your code gives you a competitive advantage, too.
If you are just starting out with your tech journey, I strongly recommend taking a step back from your first coding course and learning at least a few fundamental concepts of computer science. It’s going to help you make progress faster in the long run, trust me.
Can you learn computer science while you learn to code?
Of course, everyone has a different way of learning. You might prefer to learn computer science basics while coding at the same time.
In fact, CS and coding overlap a lot in practice. Almost every computer science course includes practical exercises and small projects where you will apply your skills to writing code. So it’s not like you’d need to take a break from coding per se to learn CS.
My approach is simply a tip that worked for me and for hundreds of readers just like you.
Surely, you will learn the fundamentals of computer science along the way, eventually. But making an effort to understand them before really starting off with coding will speed things up later on, trust me.
Learning the basics of computer science right away will help you reach your goals with coding faster and more efficiently. You quite simply won’t get confused about terminology as often, saving you a lot of time.
Do I need to be good in math to learn computer science?
I’m often asked whether you need to be really good at math to become a programmer or in order to learn CS.
My answer is the same every time: it’s not about math at all.
Instead, it’s about the capability to understand how things work together. You know, understanding the bigger picture.
“Becoming good at coding is about being able to understand a specific problem and then working towards solving it in the best possible way.”
Hence, learning the basics of both computer science and coding will require skills in logical thinking and solving problems. You don’t necessarily need to be a math nerd. Knowing just basic arithmetics will get you far.
The best computer science courses for beginners
Ready to start learning? Awesome!
When it comes to finding a good computer science course for beginners, you want to start with the very basics.
Here are a couple of the best CS online courses to take a look at:
CS101 Bootcamp
CS101 Bootcamp is a short but extremely helpful beginner-level CS course on Udemy.
You don’t need any technical experience with computer science to start learning, so it’s perfect for newbies. As long as you know how to use the Internet, you’re all set.
During this course, you will write your own small programs and apps to practice your skills. You’ll learn how computer work on the inside, what software programming is all about, and much more. All this is packed into just 2 hours of intensive learning.
Computer Science 101
Computer Science 101 is a comprehensive and intensive computer science course for absolute beginners. If you are looking for the best all-in-one CS online course, I can’t recommend this one enough.
You will learn how to write more efficient programs from scratch. You will understand how to design your code so that it makes the most of the resources your computer offers. (And yes, I regret not having started this course any sooner…)
Final thoughts: Learning computer science fundamentals
All in all, understanding the basics of computer science is super helpful for anyone interested in learning to code.
When you start your first online coding course, you need to know what’s happening under the hood. You need to know to build your computer programs well so that they run fast on any device.
With the learning resources listed above, you can get a quick introduction to computer science. And even if it seems irrelevant at this point, it’s worth your time to get a basic understanding of it at this point.
What’s next?
In the next part of our guide, we’ll look at how you can choose the right programming language to learn.
Again, the guide is packed with heaps of helpful tips for helping you save time and achieve your coding goals faster. After all, if you want to start a career in tech, it only makes sense to pick a language with lucrative career opportunities, right?
Head over to the next part to find out which programming language to learn!
How To Teach Yourself Computer Science. What You Need To Know
Do you want to teach yourself computer science? Here’s everything you need to know to successfully learn computer science on your own.
So you want to teach yourself computer science, but you don’t know where to start. Don’t worry — by the end of this post, you’ll know exactly what you need to do to get started. Here’s an easy to follow step-by-step guide to becoming an expert in computer science completely on your own…plus some advice on an alternative option that can guarantee you learn everything you need to know without any of the guesswork.
Why learn Computer Science?
Before jumping into how to learn computer science, it’s important to know why you want to learn computer science. Turns out there’s a lot of great reasons to get into this vast and versatile field.
In the US alone, over half a million new computer science jobs are expected to open up over the next few years. That means those knowledgeable in this field are in very high demand, not just in the US, but all over the world.
In our increasingly technological and globalized world, computer scientists are vital to the functioning of pretty much every business and industry out there, and they’re only going to become more important over time, meaning high job security.
If you decide to learn computer science, a lot of new, exciting and lucrative doors could open up for you.
Some different CS subject areas
In order to get a well-rounded education and a holistic understanding of all things computer science, it will be important for you to learn about each of these subject areas as you go through your journey to become a computer scientist. Every good computer scientists has studied the following areas in some form.
It’s also a good idea to pick one or two that highly interest you and delve even deeper into these areas of study so you become an expert in a specific field. It’s impossible to be an expert in everything, so choosing a specialization is helpful.
Source: Unsplash
How to teach yourself computer science: Step-by-step guide
Step 1: Learn to code
Every computer scientist has to know how to code, and it’s the first place to start your journey of becoming a skilled computer scientist yourself. Knowing how to code allows you to know how to speak the language of computers and give them commands on how to function. You will be able to build new computer programs as well as fix issues in already existing ones. It’s a crucial skill to have in the computer science world.
There’s many different coding languages out there. First, start with the basics, which are HTML and CSS. Then you can soon move on to more complex languages, but are still relatively easy to get a hang of, like Python and Java. These are two very useful computer programming languages to know, as they will provide you with a very solid idea of programming concepts that you will need in every other programming language, and they are both heavily used in the industry.
Teaching yourself a new language sounds hard, right? Luckily, there’s a wide range of options available out there for teaching yourself how to code online, and many of them are free. Some of the most popular options are Codeacadamy, Codewars, Free Code Camp, and Khan Academy. Check some out and dive in!
Source: Unsplash
Step 2: Learn the ins and outs of programming
After you know how to code, it’s important to understand why and how your code works. There are a lot of layers underneath code, all the way down to the hardware.
To get a better understanding of all the layers of the stack, you’ll need to study the interactions of the hardware, software, compilers, and operating systems that make up computers. The Elements of Computing Systems is a good book to read to get a good feel for how computing systems function.
Once you feel you have a grasp on those concepts, it’s a good idea to start learning about algorithms and data structures. Knowing these concepts will help you write code that’s far more efficient. There’s lots of helpful books out there on this subject, as well as online courses. Find something that suits your learning style best.
You’ll also want to learn about how computer networks function, since most programs you will be working on will be communicating with other computers either through a local network or through the internet.
Once you’ve completed this step, congratulations! You are now a full-fledged computer programmer and you know a whole lot about computer science. You are now qualified for a wide range of in-demand jobs all over the world. If you want to go even further, however, continue onto step 3 to become a highly specialized computer science master.
Source: Unsplash
Step 3: Choose a specialization
It’s very hard to gain a deep understanding of every aspect of computer science since it’s such a huge and vast field of study.
That’s why it’s good to choose a specialization that really allows you to delve deep into and become an expert in a certain area. As you learn, you will probably find yourself gravitating towards certain subjects over others that interest you more.
Some specializations within computer science are:
In this field, you would be addressing software vulnerabilities and mitigating security risks. This is a very in-demand field to get into. To specialize in computer and network security, you would want to learn about database management, advanced operating systems, cryptography, and advanced encryption strategies.
Focuses specifically on the design and development of mobile devices (such as smartphones) and web-based applications. It would be smart to study interface design (UX/UI) for this field.
HCI focuses on user-centered design to develop computers and systems that are more user-friendly. As a result, you should focus on studying different aspects of design in particular for this field.
If you’re into biology and science, consider this specialization. You’ll be working on computer programs designed to mine and interpret biological data, like genome sequencing.
This wide field is focused on the design, development, management, and use of information in order to better understand and utilize the data in the real world. You’ll need to have a solid understanding of algorithms and database architecture in particular.
AI focuses on computer systems that are able to perform tasks that normally require human intelligence, such as decision-making, speech recognition, translation between languages, etc. You should focus on learning about robotics, machine learning, and probability and modeling.
Source: Unsplash
Step 4: Keep learning
A computer scientist’s education is never over, even once you’ve found a job. It’s important to always keep learning new things, especially in such a fast-paced field that’s constantly evolving. There’s always more to learn in the field of computer science. That’s what makes it such an exciting and challenging field to get into!
Alternative Option: Get an Associate or Bachelor’s Degree in Computer Science
While some people are able to succeed in teaching themselves computer science completely on their own, it’s a very tricky and complex subject to master without any guidance.
If learning computer science by yourself sounds overwhelming, and you’re not sure you want to go it alone, you may want to consider going to school for it and getting a degree in computer science. This would ensure you will learn everything you need to know without any guesswork on your part.
You would be taught by highly knowledgeable professors and be able to network and make connections with others in the field, which is always an important aspect during job hunting!
Having a degree also proves to the world that you have completed a rigorous training program and are highly qualified.
If you’re trying to teach yourself computer science, it may be because you don’t have the money to invest in an expensive university program, or you don’t have the time to dedicate to going to school on campus.
If that’s the case, enrolling in a computer science program at University of the People may be just what you need. UoPeople is tuition-free and 100% online, so you can study when and where you want, and you don’t have to take out giant student loans just to get your education. We offer both an associate program and a bachelor’s program in computer science.
With UoPeople, you will gain a strong academic foundation with real-life applications. We prepare our students for employment through plenty of hand-on experience, specialized internships, and mentoring programs. Choosing a computer science degree with UoPeople can set you up for a successful future in the computer science field of your dreams.
No matter which way you choose to learn computer science — on your own or through a university program — we wish you luck on your learning journey! It’s a long road to becoming a master in computer science, but a very interesting and rewarding one.