Where Can I Learn Computer Science Theory
Teach Yourself Calculator 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, y'all owe it to yourself to learn computer science. Thankfully, yous tin can requite yourself a world-grade CS instruction without investing years and a modest fortune in a degree program 💸.
There are plenty of resources out there, but some are better than others. Yous don't need however another "200+ Free Online Courses" listicle. You need answers to these questions:
- Which subjects should you larn, and why?
- What is the best book or video lecture serial for each subject field?
This guide is our attempt to definitively answer these questions.
Thanks to the post-obit volunteers for translations:
- 中文翻译见此 (Chinese) by Wu Zhengke
- Tradução em português (Portugese) past Clemens Schrage
- Перевод на Русском (Russian) by Ilja Moisejevs and Stepan Rakitin
- Bản dịch tiếng Việt (Vietnamese) by Dat Hoang
- Traducción en Español (Latinoamerica) (Castilian) by James Archbold
- 컴퓨터과학 스스로 학습하기 (Korean) past Minjeong Kim
- 日本語に翻訳 (Japanese) by Ralph Plumley
- Türkçe çevirisi (Turkish) by Tolga Barış Pınar
- ﺗﺮﺟﻤﻪ ﺭﺍﻫﻨﻤﺎ ﺑﻪ ﻓﺎﺭﺳﯽ (Persian) by Faran Taghavi
- Traduzione in Italiano (Italian) by Fabio Cicerchia
- Traduction en français (French) by Aurore Amrit
- Terjemahan bahasa Indonesia (Indonesian) past Ananda Umamil
- الترجمة العربية (Standard arabic) past Ounissi Zakaria
TL;DR:
Study all 9 subjects below, in roughly the presented order, using either the suggested textbook or video lecture serial, simply ideally both. Aim for 100-200 hours of study of each topic, then revisit favorites throughout your career 🚀.
Subject | Why report? | Volume | Videos |
---|---|---|---|
Programming | Don't be the person who "never quite understood" something like recursion. | Structure and Interpretation of Computer Programs | Brian Harvey'southward Berkeley CS 61A |
Figurer Architecture | If you don't have a solid mental model of how a computer actually works, all of your higher-level abstractions volition be brittle. | Computer Systems: A Programmer's Perspective | Berkeley CS 61C |
Algorithms and Information Structures | If you don't know how to apply ubiquitous data structures like stacks, queues, trees, and graphs, you won't be able to solve challenging problems. | The Algorithm Design Manual | Steven Skiena'south lectures |
Math for CS | CS is basically a runaway co-operative of applied math, so learning math will give y'all a competitive reward. | Mathematics for Computer science | Tom Leighton's MIT half dozen.042J |
Operating Systems | Nigh of the lawmaking you lot write is run by an operating arrangement, so y'all should know how those interact. | Operating Systems: Three Easy Pieces | Berkeley CS 162 |
Computer Networking | The Internet turned out to be a big bargain: understand how information technology works to unlock its total potential. | Figurer Networking: A Peak-Down Arroyo | Stanford CS 144 |
Databases | Data is at the center of about significant programs, but few sympathize how database systems actually work. | Readings in Database Systems | Joe Hellerstein's Berkeley CS 186 |
Languages and Compilers | If you sympathise how languages and compilers really work, you'll write better code and learn new languages more hands. | Crafting Interpreters | Alex Aiken'south course on edX |
Distributed Systems | These days, most systems are distributed systems. | Designing Data-Intensive Applications by Martin Kleppmann | MIT half dozen.824 |
Still too much?
If the idea of self-studying 9 topics over multiple years feels overwhelming, nosotros suggest y'all focus on just 2 books: Computer Systems: A Developer's Perspective and Designing Information-Intensive Applications. In our experience, these 2 books provide incredibly loftier render on time invested, specially for self-taught engineers and bootcamp grads working on networked applications. They may as well serve as a "gateway drug" for the other topics and resource listed above.
Why learn computer science?
There are 2 types of software engineer: those who understand computer scientific discipline well enough to do challenging, innovative piece of work, and those who simply get by considering they're familiar with a few high level tools.
Both call themselves software engineers, and both tend to earn similar salaries in their early on careers. But Type 1 engineers progress toward more fulfilling and well-remunerated work over time, whether that's valuable commercial piece of work or breakthrough open-source projects, technical leadership or loftier-quality individual contributions.
Type one engineers discover 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 upward new skills when the winds of technical way change.
Currently, the number of people entering the manufacture 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 go on them out of the industry's more than fulfilling piece of work. Whether you lot're striving to get a Type 1 engineer or merely looking for more job security, learning computer science is the just reliable path.
Subject guides
Programming
Virtually undergraduate CS programs beginning with an "introduction" to reckoner programming. The best versions of these courses cater not just to novices, only also to those who missed beneficial concepts and programming models while start learning to code.
Our standard recommendation for this content is the classic Structure and Estimation of Computer Programs, which is available online for free both as a book, and every bit a ready of MIT video lectures. While those lectures are great, our video suggestion is really Brian Harvey's SICP lectures (for the 61A class at Berkeley) instead. These are more refined and amend targeted at new students than are the MIT lectures.
We recommend working through at least the showtime three chapters of SICP and doing the exercises. For boosted practice, piece of work through a set up of small programming problems like those on exercism.
Since this guide was first published in 2016, i 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. Nosotros call up the DeNero resources are besides bang-up, and some students may end up preferring them, but we notwithstanding suggest SICP, Scheme, and Brian Harvey'due south lectures as the first gear up of resources to effort.
Why? Because SICP is unique in its ability—at to the lowest degree potentially—to alter your fundamental beliefs about computers and programming. Not everybody will experience this. Some will detest the book, others won't go past the first few pages. But the potential reward makes it worth trying.
If you don't enjoy SICP, try Composing Programs. If that withal doesn't accommodate, try How to Design Programs. If none of these seem to exist rewarding your effort, possibly that'south a sign that you lot should focus on other topics for some time, and revisit the field of study of programming in some other year or two.
Finally, a point of clarification: this guide is NOT designed for those who are entirely new to programming. Nosotros 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 at that place may exist more to larn. For those who've never coded before, but who'd like to, you might prefer a guide like this one.
Calculator Compages
Computer Architecture—sometimes called "computer systems" or "computer system"—is an important first look at calculating below the surface of software. In our experience, it'southward the nigh 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 comprehend most of chapters 1-6.
We love CS:APP for the applied, developer-oriented arroyo. While there'south much more to computer architecture than what'southward covered in the book, it serves as a great starting indicate for those who'd like to understand computer systems primarily in gild 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, too known as "Nand2Tetris". This is an aggressive book attempting to give you a cohesive understanding of how everything in a computer works. Each chapter involves edifice a small slice of the overall system, from writing simple 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 starting time 6 chapters of the book and completing the associated projects. This will develop your agreement of the relationship between the compages of the machine and the software that runs on it.
The first one-half of the book (and all of its projects), are available for gratis from the Nand2Tetris website. It'south besides bachelor every bit a Coursera course with accompanying videos.
In seeking simplicity and cohesiveness, Nand2Tetris trades off depth. In detail, two very of import concepts in modern estimator architectures are pipelining and memory hierarchy, but both are mostly absent from the text.
Once you feel comfortable with the content of Nand2Tetris, we advise either returning to CS:APP, or considering Patterson and Hennessy'southward Computer Organization and Design, an first-class and now archetype text. Not every section in the book is essential; we suggest following Berkeley'due south 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 Information Structures
We agree with decades of common wisdom that familiarity with common algorithms and information structures is one of the nigh empowering aspects of a information science pedagogy. This is too a great place to train one'south general problem-solving abilities, which will pay off in every other area of written report.
In that location 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 than commonly suggested texts (CLRS and Sedgewick) tend to be a little as well proof-heavy for those learning the fabric primarily to help with applied problem solving.
For those who prefer video lectures, Skiena generously provides his online. We too 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 y'all like, we encourage you to stick with it!
For practise, our preferred approach is for students to solve bug on Leetcode. These tend to be interesting problems with decent accompanying solutions and discussions. They too help yous test progress against questions that are commonly used in technical interviews at the more competitive software companies. We suggest solving effectually 100 random leetcode problems every bit office of your studies.
Finally, we strongly recommend How to Solve It every bit an excellent and unique guide to general problem solving; it's equally applicative to reckoner scientific discipline as it is to mathematics.
I have only one method that I recommend extensively—it'due south called think before you write.
— Richard Hamming
Mathematics for Computer Scientific discipline
In some ways, reckoner science is an overgrown branch of applied mathematics. While many software engineers try—and to varying degrees succeed—at ignoring this, nosotros encourage you to embrace it with direct study. Doing so successfully volition give you an enormous competitive reward 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 drove of interesting applied math topics exterior of calculus. Given the vague definition, it's not meaningful to endeavor to comprehend the entire latitude 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 calculator graphics and automobile learning.
Our suggested starting bespeak for discrete mathematics is the gear up of lecture notes past László Lovász. Professor Lovász did a good chore of making the content approachable and intuitive, and then this serves as a better starting indicate than more formal texts.
For a more advanced treatment, we suggest Mathematics for Reckoner Science, the book-length lecture notes for the MIT course of the same name. That form'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 volume and video lectures.
If people practice not believe that mathematics is simple, it is only because they do non realize how complicated life is.
— John von Neumann
Operating Systems
Computer Networking
Given that then much of software engineering is on web servers and clients, i of the most immediately valuable areas of estimator 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-Downwards Arroyo. The small projects and exercises in the book are well worth doing, and we especially like the "Wireshark labs", which they take 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 just available as unofficial playlists on Youtube.
Yous can't gaze in the crystal brawl and see the future. What the Internet is going to exist in the time to come is what social club makes information technology.
— Bob Kahn
Databases
Information technology takes more piece of work to self-larn about database systems than information technology does with most other topics. It's a relatively new (i.e. post 1970s) subject field with stiff commercial incentives for ideas to stay behind closed doors. Additionally, many potentially excellent textbook authors have preferred to join or first companies instead.
Given the circumstances, we encourage self-learners to by and large avoid textbooks and start with recordings of CS 186, Joe Hellerstein's databases course at Berkeley, and to progress to reading papers afterward.
1 paper especially 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, meliorate known as the databases "Red Volume", is a collection of papers compiled and edited by Peter Bailis, Joe Hellerstein and Michael Stonebraker. For those who have progressed across the level of the CS 186 content, the Reddish Book should be your next stop.
If yous're adamant about using an introductory textbook, we suggest Database Management Systems by Ramakrishnan and Gehrke. For more advanced students, Jim Gray'due south classic Transaction Processing: Concepts and Techniques is worthwhile, but we don't encourage using this equally 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
Almost programmers learn languages, whereas almost estimator scientists learn about languages. This gives the calculator scientist a distinct reward over the programmer, fifty-fifty in the domain of programming! Their knowledge generalizes; they are able to empathize the functioning of a new language more deeply and apace than those who have just learned specific languages.
Our suggested introductory text is the first-class Crafting Interpreters by Bob Nystrom, available for complimentary online. Information technology'southward well organized, highly entertaining, and well suited to those whose primary goal is just to better empathize their languages and linguistic communication 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, normally chosen "the Dragon Book". Unfortunately, it's non 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'south almost essential that you cherry-pick the topics, ideally with the help of a mentor. In fact, our suggested style to utilize the Dragon Volume, if you so cull, is as a supplementary reference for a video lecture serial. Our recommended one is Alex Aiken'due south, on edX.
Don't be a average developer. 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 beginning of his compilers grade
Distributed Systems
Equally computers have increased in number, they have also spread. Whereas businesses would previously purchase larger and larger mainframes, information technology's typical now for even very minor applications to run beyond multiple machines. Distributed systems is the study of how to reason well-nigh the merchandise-offs involved in doing so.
Our suggested book for cocky-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 i that'due south bachelor for gratis online, nosotros advise Maarten van Steen and Andrew Tanenbaum's Distributed Systems, 3rd Edition.
For those who prefer video, an fantabulous course with videos available online is MIT'south 6.824, a graduate course taught past Robert Morris with readings available hither.
No affair the choice of textbook or other secondary resources, report of distributed systems absolutely mandates reading papers. A good listing is here, and we would highly encourage attending your local Papers We Dear chapter.
Ofttimes asked questions
Who is the target audience for this guide?
Nosotros accept in mind that you are a self-taught software engineer, bootcamp grad or precocious high school student, or a higher student looking to supplement your formal education with some self-study. The question of when to commence upon this journey is an entirely personal one, just most people tend to benefit from having some professional person feel before diving too deep into CS theory. For example, we discover that students honey learning about database systems if they accept already worked with databases professionally, or about calculator networking if they've worked on a web project or two.
What nearly AI/graphics/pet-topic-X?
Nosotros've tried to limit our listing to informatics topics that we experience every practicing software engineer should know, irrespective of specialty or manufacture, only 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. After, you lot'll be in a much better position to choice up textbooks or papers and learn the core concepts without much guidance. Here are our suggested starting points for a couple of common "electives":
- For artificial intelligence: practise Berkeley'due south intro to AI course past watching the videos and completing the excellent Pacman projects. As a textbook, use Russell and Norvig's Artificial Intelligence: A Modern Arroyo.
- For machine learning: do Andrew Ng's Coursera form. Be patient, and make sure y'all understand the fundamentals before racing off to shiny new topics like deep learning.
- For computer graphics: work through Berkeley's CS 184 textile, and use Estimator Graphics: Principles and Practice as a textbook.
How strict is the suggested sequencing?
Realistically, all of these subjects have a pregnant amount of overlap, and refer to 1 another cyclically. Take for instance the human relationship betwixt 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, yous'd revisit both of these topics many times throughout your career.
As such, our suggested sequencing is mostly there to help you just go started… if you lot accept a compelling reason to prefer a unlike sequence, then become for it. The most significant "pre-requisites" in our opinion are: computer architecture before operating systems or databases, and networking and operating systems earlier distributed systems.
How does this compare to Open Source Club or freeCodeCamp curricula?
When this guide was starting time 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 equally a software engineer, irrespective of your specialty, and to assistance you lot understand why each course is included. In the subsequent years, the OSS guide has improved, but we withal recollect that this i provides a clearer, more than cohesive path.
freeCodeCamp is focused by and large on programming, not figurer science. For why you lot might want to larn informatics, run into above. If you are new to programming, we suggest prioritizing that, and returning to this guide in a twelvemonth or two.
What about language X?
Learning a detail programming language is on a totally different airplane to learning about an area of figurer scientific discipline — learning a language is much easier and much less valuable. If you already know a couple of languages, we strongly propose but following our guide and plumbing fixtures language acquisition in the gaps, or leaving it for later on. If you lot've learned programming well (such every bit through Construction and Interpretation of Computer Programs), and especially if yous have learned compilers, information technology should take yous petty more a weekend to larn the essentials of a new language, later on which yous tin learn about the libraries/tooling/ecosystem on the task.
What about trendy technology 10?
No single technology is of import enough that learning to use it should be a core role of your education. On the other hand, it's keen that you're excited to learn near that thing. The trick is to work backwards from the detail engineering 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?
Await, only try it. Some people find SICP heed blowing, a characteristic shared by very few other books. If you don't like it, y'all can always effort something else and perhaps return to SICP later.
Why are you even so recommending the Dragon book?
The Dragon book is however the about complete single resource for compilers. Information technology gets a bad rap, typically for overemphasizing certain topics that are less fashionable to embrace in particular these days, such as parsing. The thing is, the book was never intended to be studied comprehend to cover, but to provide plenty material for an instructor to put together a course. Similarly, a self-learner tin can choose their own adventure through the book, or ameliorate however follow the suggestions that lecturers of public courses have fabricated in their form outlines.
How tin I get textbooks cheaply?
Many of the textbooks we suggest are freely available online, cheers to the generosity of their authors. For those that aren't, nosotros advise ownership used copies of older editions. Equally a general dominion, if there has been more than a couple of editions of a textbook, it'due south quite likely that an older edition is perfectly adequate. It'south certainly unlikely that the newest version is 10x improve than an older one, even if that's what the price departure is!
Who made this?
This guide was originally written by Oz Nova and Myles Byrne, with 2020 updates by Oz. Information technology is based on our experience pedagogy foundational computer science to over thou generally self-taught engineers and bootcamp grads in minor grouping settings in San Francisco and live online. Cheers to all of our students for your connected feedback on self-teaching resources.
We're very confident that yous could teach yourself everything above, given enough time and motivation. But if you'd prefer an intensive, structured, instructor-led program, yous might exist interested in our Computer Science Intensive. We DON'T suggest pursuing a primary's degree.
For updates to this guide and general reckoner science news and resources, yous may also like to join Bradfield's mailing list:
Where Can I Learn Computer Science Theory,
Source: https://teachyourselfcs.com/
Posted by: doylecamble.blogspot.com
0 Response to "Where Can I Learn Computer Science Theory"
Post a Comment