Learning materials
Languages
- Java
- In course Stanford: Programming Methodology, the lecturer explains everything you need to know about Java, as well as the approach to design your project, such as writing your code in a systematical sytle, best-practice of design and how to validate whether the project is designed appropriately. The lecturer explains both the concept and code examples in the course, in order to make you understood better. And you will find the lecturer is very motivating to encourage students.
- C and C++
- Cprogramming contains quite complete resources in
CandC++, you can use it as reference and self-learning material. - In course Stanford: Programming Abstractions,
C++as a language itself is so well explained, as well as the abstraction idea of software engineering. The content of this course is rich both in information level and knowledge level. You will enjoy the course very much since the lecturer is also excited to encourage the students.
- Cprogramming contains quite complete resources in
- Python
- Golang
- JS
Unfortunately, in some of these language courses, the lecturer may not explain the how compiler and interpretor work, or how to use them to build your own toolchain, I am here seriously emphasize that you HAVE TO set your own building environment, it is very very IMPORTANT in the sense that the language is a material of a product and the product pipeline should be mastered as well if you are an engineer.
If you are interested in how the machine understand the project we write, you definitely should learn the course about compiler.
Compiler
The whole pipeline of programming language processing are well explained in the course Stanford: Compilers. If you have math problems with it, you could check Stanford: Automata Theory as prerequisite. If you think the compiler course is a piece of cake, you should definitely learn Theory of computation.
Programming philosophy
Don't be scared about the the title written above. I will not say this topic is hard, not because it is not hard, I prefer to consider it as fundamental kernel. In my opinion, every software engineer should understand this topic in order to achieve more. First of all, the computer science is NOT science, it is not like biology, physics, already there before human existence, we observe the world and analyze the phenomenon, reach conclusion as theory and apply them in engineer project. Computer science is a whole architecture designed and built by us human-being. The whole philosophy behind it is how we think and descibe the real world, representing in the virtual world. To learn programming philosophy is actually to learn how we think.
That is why it is so fundamental, once you know that, you are able to learn other different subjects very systematically and fast. And here are some courses I strongly recommend.
- If you have curiosity about how programming can solve the real problems, MIT: Programming for the Puzzled is a very motivating course. The importance of the course is not only about the programming language, but how to express and translate the idea in mind into different language sets.
- If you want to get the idea of why there are so many languages and what the core differences among them. You should choose Stanford: Programming Paradigms as a start. Once you are addicted to this topic, you will search paper to read, taste more languages and of course, take the most amazing course MIT: Structure and interpretation of computer program. Even it is made in 1986, but that is the CORE, the master work. You will find how we try to use different perspectives to observe and explain our world, formalize them by designing formal languages to describe them.

This work is licensed under a Creative Commons Attribution 4.0 International License.