As the New Year approaches, many people are writing 19-year summaries and 20-year outlooks. As I look back on 2019, I realize that I only finished a few ‘miscellaneous’ books and none of the really technical ones. Anxiety quietly came to mind, there is a kind of restlessness do not learn to retreat. Then I recalled a website I had seen earlier:

  • Teach Yourself Computer Science๏ผšteachyourselfcs.com/
  • GitHub: github.com/keithnull/T…

There are so many technical books out there, how can I find the best ones so that my time spent on them pays off? Which ones are worth my time to read more?

The following content is designed to solve the following two problems:

  • What subjects should you study and why?
  • What are the best learning materials (books, videos) for these subjects?

Next, you’ll get the answer. (๐Ÿ˜ here comes the list of books I’m looking for!)

A, an overview of

Study the following nine subjects in the order listed, using suggested books and video lessons. If you’re a self-taught engineer or a graduate of a programming class, it’s worth studying computer science.

(I fed Dota as an undergrad, so PROGRAMMING is self-taught. After working, I deeply realize the importance of these subjects ๐Ÿ˜ข.

Why study Computer science

Software engineers fall into two categories:

  • One understands computer science well enough to be able to tackle challenging creative work;
  • The other just gets by with familiarity with some advanced tools. (Direct and powerful, directly hit the heart ๐Ÿค”)

Both call themselves software engineers, and both earn similar salaries early in their careers. However, over time, the first type of engineer grows up to do more meaningful and well-paid work, whether it’s worthwhile commercial work, breakthrough open source projects, technical leadership, or high quality personal contributions.

With just 57 engineers, WhatsApp now sends and receives 42 billion messages a day, compared with about 20 billion messages a day across the global messaging system.

– Benedict Evans (@ BenedictEvans)

The first type of engineer is always looking for ways to get deeper into computer science, either by learning it the traditional way or by studying it endlessly throughout their careers.

The second type of engineer is usually superficial, learning specific tools and techniques without studying the underlying fundamentals, learning new skills only as the tide of technology shifts.

Today, the number of people pouring into the computer industry has soared, yet the number of computer science graduates has remained largely unchanged. The oversupply of engineers of the second kind is beginning to reduce their opportunities for more meaningful work in the industry. Whether you’re trying to become a first-generation engineer or just want to make your career safer, studying computer science is the only sure way to go.

To be indispensable talents, not skilled workers to be replaced ๐Ÿ’ช. My blood is boiling, I want to know how to become a real programmer!

Three, subject guidelines

Note: I have removed the recommendation of the video section due to the space problem. For those in need, click to read the original article.

3.1 programming

Most undergraduate computer science courses begin with an “introduction” to programming. The best versions of these courses cater not only to beginners, but also to those who have missed some useful concepts and programming patterns in their early programming years.

Our standard recommendation for this section is the classic book, The Construction and Interpretation of Computer Programs. The book is available for free online (in English)

We recommend that you complete at least the first three chapters of SICP and complete the accompanying exercises. If you need extra practice, work on a little programming problem like exercism.

(THIS book I read the prologue fell asleep, I want to dry saliva, help me up ๐Ÿ˜ฏ)

3.2 Computer Architecture

Computer architecture — sometimes referred to as a “computer system” or “computer composition” — is an important perspective into the underlying layers of software. In our experience, this is the most neglected area for self-taught software engineers.

Elements of Computer Systems, aka “Nand2Tetris”. The book is large enough to give the reader a complete idea of how all the parts of a computer work together. Each chapter of the book deals with how to build a small piece of the overall computer system, starting with writing basic logic gates in HDL (Hardware Description Language), through THE CPU and assembly, and eventually reaching applications the size of Tetris.

We recommend reading the first six chapters of the book and completing the corresponding project exercises. In doing so, you’ll gain a deeper understanding of the relationship between the architecture of a computer and the software that runs on it.

The first half of the book, including all corresponding projects, is available free of charge on the Nand2Tetris website.

The hardware is the platform.

— Mike Acton, Engine Director at Insomniac Games

(Don’t understand the rules of the game platform, it is difficult to become a super player ๐ŸŽฎ)

3.3 Algorithm and data structure

As has been the consensus for decades, we believe that the greatest power of computer science education is familiarity with common algorithms and data structures. In addition, it can also train one’s ability to solve various problems, which is conducive to learning in other fields.

There are hundreds of books available on algorithms and data structures, but our favorite is The Algorithm Design Manual by Steven Skiena. It was clear that he loved it and couldn’t wait to help others understand. In our opinion, this book is a refreshing experience, quite different from the more frequently recommended books.

As for exercises, we recommend that students solve problems on Leetcode. Problems on Leetcode tend to be interesting with good solutions and discussion. In addition, in the increasingly competitive software industry, these questions can help you assess your ability to respond to common questions in technical interviews. We recommend solving about 100 randomly selected Leetcode problems as part of the study.

Finally, we highly recommend how to Solve the Problem. This book is an excellent and unique guide to solving problems in a broad sense, so that it is as applicable to computer science as it is to mathematics.

There’s only one approach I can broadly recommend: Think before you write.

– Richard Hamming

(I this algorithm slag silently picked up “my first algorithm book”, above the recommended book next year to fight! ๐Ÿ‘€)

3.4 Mathematical knowledge

In some ways, computer science is an “overdeveloped” branch of applied mathematics. While many software engineers try — and with varying degrees of success — to ignore this, we encourage you to embrace math with your learning. If you succeed, you’ll have a huge competitive advantage over those who don’t.

For computer science, the most relevant area of mathematics is “discrete mathematics,” where “discrete” as opposed to “continuous” refers roughly to interesting topics in applied mathematics, rather than, say, calculus. Because of the vagueness of the definitions, there is no point in trying to master all of discrete mathematics. A realistic learning goal is to understand logic, permutations and combinations, probability theory, set theory, graph theory and some number theory related to cryptography. Given the importance of linear algebra in computer graphics and machine learning, this field is also worth studying.

To learn discrete mathematics, we recommend starting with Laszlo Lovasz’s course notes. Professor Lovasz has managed to make the content simple and intuitive, so it’s better for beginners than a formal textbook.

For more advanced study, we recommend “Mathematics in Computer Science,” a book-length course note from an MIT course of the same name (in fact, out now).

For linear algebra, we recommend starting with the Essence of Linear Algebra video series before heading to Gilbert Strang’s “Introduction to Linear Algebra.”

If people don’t believe that math is simple, it’s only because they don’t realize how complicated life is.

– John von Neumann

(Let me live ๐Ÿคฎ)

3.5 Operating System

“Operating System Concepts” (” dinosaur books “) and “Modern Operating Systems” are classic books in the operating system field. Both have drawn some criticism for their style of writing, their length of 1000 pages and their addition of content every few years to encourage people to buy the “latest edition.”

Operating Systems: Three Easy Pieces is a good alternative and is available free online. We particularly liked the structure of the book and thought the exercises were well worth doing.

After reading Introduction to Operating Systems, we encourage you to explore the design of a particular operating system. Use books in the “{OS name} Internals” style.

To solidify your understanding of the operating system, it’s a good idea to read the code of a small system kernel and add features to it.

(Writing a small system kernel is cool ๐Ÿ˜Ž)

3.6 Computer Network

Computer networking is one of the most “immediate” areas of computer science, given that there is so much software engineering about web servers and clients. Our students, systematically learning about computer networks, are finally able to understand the terms, concepts and protocols that have troubled them for years.

One of our favorite books on this topic is Computer Networking: A Top-down Approach. The small projects and exercises in the book are well worth practicing, especially the Wireshark LABS section (which is available online).

For computer network learning, doing projects is more beneficial than completing small exercises. Some possible projects are HTTP servers, UDP-based chat apps, mini-TCP stacks, proxies, load balancers, or distributed hash tables.

You can’t look into a crystal ball and see what the future holds for the Internet depends on society.

– Bob Kahn

(Someone recommended it to me before, but I didn’t buy it. But now I’m reading: delicious ~ ๐Ÿ˜„)

3.7 database

Learning about database systems requires more effort than any other topic. This is a relatively young field of research, and there are strong commercial incentives for researchers to keep ideas behind closed doors. In addition, many writers with the potential to write excellent textbooks instead join or start companies.

With that in mind, self-learners are encouraged to largely abandon the textbook and instead start with CS 186 (Joe Hellerstein’s database course at Berkeley) in the spring 2015 semester, and then head out to read the paper.

For beginners, there is a paper worth mentioning: “Architecture of a Database System”. This paper provides a unique high-level view of how a relational database management system (RDBMS) works and is a practical synopsis for subsequent learning.

Assignment In Database Systems, or The Database “redbook,” as it is better known, is a collection of papers by Peter Bailis, Joe Hellerstein, and Michael Stonebraker. “Redbook” should be the next step for those who want to take the next step at CS 186 level.

If you insist on an introductory textbook, we recommend Database Management Systems: Principles and Design by Ramakrishnan and Gehrke.

It is difficult to consolidate database theory without writing a sufficient amount of code. CS 186 students adding features to Spark is a good project, but we only recommend implementing a simple relational database management system from scratch. Naturally, it won’t have many features, but it will be quite enlightening to implement even the most basic features of every aspect of a typical relational database management system.

(More and more domestic companies do database, but THIS I still chew not put ๐Ÿฅบ)

3.8 Programming languages and compilers

Most programmers learn about programming languages, and most computer scientists learn about programming languages. This gives computer scientists a significant advantage over programmers, even in the field of programming! Because their knowledge is generalized: they can understand a new programming language more deeply and quickly than someone who has only studied a particular programming language.

The authoritative introductory book is The Principles of Compilation, commonly known as the “Dragon Book”. Unfortunately, this book is not designed for self-learners, but rather for teachers to pick and choose topics to teach in 1-2 semesters. It is therefore important that you select the topic, preferably with the help of a mentor.

For project exercises, we recommend writing a compiler for a simple teaching language such as COOL or for a subset of a language you are interested in. If such a project seems daunting, start by making a Lisp and walk through the project step by step.

Don’t be a programmer who just writes boilerplate code. Instead, create tools for users and other programmers. Learn historical lessons from the textile and steel industries: Do you want to make machines and tools, or operate them?

— Ras Bodik at the beginning of his compiler course

I said, “Why do you learn a language so fast?” ๐Ÿคซ)

3.9 Distributed System

As the number of computers increased, computers also began to disperse. While commercial companies used to be willing to buy larger and larger mainframes, it is now typical for even small applications to run on multiple machines simultaneously. Thinking about the pros and cons of doing this is an increasingly important skill in distributed systems.

For self-learners, we recommend Distributed Systems Principles and Paradigms by Maarten van Steen and Andrew Tanenbaum (2nd edition in Chinese, 3rd edition in English). The third edition is a huge improvement over the previous edition, and thanks to the generosity of its author, it is freely available online. Given that distributed systems is a rapidly changing field, no textbook can be a complete guidepost, but as far as we can see, this book is a solid overview of the best.

Regardless of the textbook or other supporting materials chosen, learning about distributed systems requires reading a paper. Here is a good list of papers.

(Encountered in work, arrangement on ๐Ÿฅณ)

Iv. FAQ

4.1 How about artificial intelligence/computer graphics /XX?

We try to limit our list of computer science topics to those that we think every software engineer should know, not just specialty or industry. Armed with these foundations, you’ll be able to pick a textbook or essay more easily, yet learn the core concepts without guidance. Here, we offer a starting point for self-study on some other common topics:

  • Artificial intelligence: Learn Berkeley’s AI course by watching videos and completing the Pacman project. For textbooks, use Artificial Intelligence: A Modern Approach by Russell and Norvig.
  • Machine learning: Take Ng’s Coursera course. Learn patiently, making sure you understand the basic concepts before moving on to attractive new topics like deep learning.
  • Computer Graphics: Take Berkeley CS 184 material, using Computer Graphics: Principles and Practice.

4.2 Is it necessary to strictly follow the recommended order of study?

In fact, all of the topics overlap to some degree and refer to each other in loops. Take the relationship between discrete mathematics and algorithms as an example: learning mathematics first can help you analyze and understand the algorithm more deeply, while learning the algorithm first can provide greater motivation and application background for learning discrete mathematics. Ideally, you’ll revisit both multiple times throughout your career.

So the order we recommend is primarily to help you get started… If you’re inclined to study in a different order for some strong reason, that’s ok, just get started! But in our view, the most important “prerequisites” are: learn architecture before operating systems or databases, and learn networking and operating systems before distributed systems.

4.3 Who is the target audience of this guidance?

We cater to self-taught software engineers, training students, “precocious” high school students, or college students who want to supplement their formal education by self-learning. It’s up to the individual to decide when to embark on this self-study journey, but most people would benefit from further study of computer science theory after some professional experience. For example, we noticed that students would enjoy a course on database systems if they had used databases in their work. If students have worked on a Web project or two, they will love learning about computer networks.

4.4 What about XX programming language?

Learning a particular programming language is not in the same dimension as learning an area of computer science — learning a language is easy and less valuable by comparison. If you already know a few languages, we strongly recommend following our guidelines and picking them up while you’re learning, or leaving them for later. If you’ve already done a good job of programming (such as Construction and Interpretation of Computer Programs), especially if you’ve studied compilers, you can learn the basics of a new language in little more than a weekend.

4.5 What about XX popular technology?

No technology is so important that the study and use of it should be a core part of computer science teaching. Still, it’s great that you’re passionate about learning that skill. The trick is to first step back from a particular technology to a basic domain or concept and determine where the popular technology fits in the big picture of technology before learning more about the technology.

Five, the last

Thanks to Ozan Onay and Myles Byrne, translator: keithnull.

That’s the list of recommended books for this article, and a 20-year reading schedule can be arranged. This article is not an advertisement, please find the way to buy the book, and when it comes to advertising, go scuba diving in HG group. When each e-commerce platform has a price reduction, there will be positive partners in the group to inform everyone, after all, technical books are not cheap, everyone is staring at ๐Ÿ’ฐ.

Finally, there’s one line in The Book of Codes that I like:

“As a beginner or advanced, there’s nothing wrong with that. There’s nothing wrong with being a competent programmer and not a leader. The real mistake is being a beginner when you know how to improve.”

Hopefully this list will light up your path to becoming a real programmer.

Fast food knowledge can be quickly accomplished, can quickly feel the pleasure of realization, the same threshold is relatively low. The real technology has a certain threshold, at the same time, it needs to pay many times the time, must sink the heart to endure loneliness.

Would you rather have a quick meal or a deep relationship? ๐Ÿคง