What knowledge should programmers learn in depth?
The curriculum of Ambo Zhiyuan is 1, C++/Java, which is object-oriented. Personally, I think learning C++ and Java is a breeze. But the learning curve of C++ is quite steep. However, I think C++ is the most important language to learn. Read two interesting articles, Confidence Map of Learning C++ and 2 1 Day Learning C++ (MIT free course). Read the books recommended in my book How to Learn C++ at least twice (if your understanding of C++ can go deep into the analysis of C++ virtual function table or C++ object memory as I wrote), you must learn it. Such as initialization, garbage collection, interfaces, exceptions, virtual functions and so on in Java. Actual task: to realize a BigInt with C++, which supports the addition, subtraction, multiplication and division of 128-bit shaping. Encapsulate the capacity of a data structure with C++, such as a hash table. Using C++ package to realize smart pointer (template must be used). Be sure to look at the "design pattern" once or twice. Think about the application scenarios of these 23 modes. There are two main points: 1) love composition rather than inheritance, and 2) love interface rather than implementation. (Simple design pattern is also recommended) Practical task: Implement a memory pool using factory pattern. Use strategy pattern to make a class that can center text files left and right. Use command mode to realize a command line calculator, and support undo and redo. Use the decoration mode to realize the pricing strategy of a hotel room price-peak season, service, VIP, tour group and other factors that affect the price. Learn the usage of STL and its design concepts-container, algorithm, iterator and functor. If possible, please read its source code. Practical task: Try to make a snake or Tetris game by using various skills of object-oriented, STL, design pattern and WindowsSDK graphic programming. Support different levels and difficulties. To be a file browser, you can browse the files in the directory and perform different operations on different files. You can open the text file for editing and execute the execution file at the same time. Mp3 or avi files can be played, and picture files can display pictures. It may be too difficult to learn the design of some class libraries in C++, such as MFC (see MFC Easy to Understand by Teacher Hou Jie), Boost, ACE, CPPUnit, STL (STL), but it would be great if you could understand the design pattern and design, and it would be great if you could go deep into my STL String Class Copy-on-Write Technology. ACE needs a powerful system. See "Strengthening the understanding of the system" later.) Java is a real object-oriented language, and there are too many design patterns in Java, which is also the best language for learning object-oriented design patterns (see design patterns in Java). It is recommended to read Effective Java and Java Puzzle to learn the framework of Java. There are many frameworks of Java, such as Spring, Hibernate, Struts and so on. , mainly to learn the design of Java, such as IoC. Java technology is also much worse, mainly focusing on J2EE architecture and JMS, RMI and other messaging and remote calling technologies. Learn to use Java as a Web service (the official tutorial is here). Exercise task: Try to build a remote calling program of Web Service with network under the framework of Spring or Hibernate, and pass messages through JMS in the two services. Neither C++ nor Java can be learned in a short time. C++ plays deeply, while Java plays widely. I suggest choosing one of them. My personal learning experience is: learning C++ (I have been learning C/C++ for more than ten years) and learning various design patterns of Java. 2. The importance of strengthening system understanding Read the following books: The Art of Unix Programming to understand the design and development concept, ideological and cultural system, principles and experience in the field of Unix systems. You must have a sober feeling. Unix network programming volume 1, Socket This is a book that you will understand network programming after reading it. Please pay attention to the differences between TCP, UDP and multiplex system call select/poll/epoll. TCP/IP Detailed Volume 1: Protocol-This is a book that can be used as a network hacker after reading it. Understand the working principle of Ethernet, understand the protocol and working principle of TCP/IP and how to tune TCP. Practical task: Understand what blocking (synchronous IO), non-blocking (asynchronous IO) and multiplexing (select, poll, epoll) IO technologies are. Write a network chat program with a chat server and multiple chat clients (the server uses UDP to multicast or broadcast some or all chat clients). Write a simple HTTP server. Unix Network Programming Volume 2, Inter-process communication, semaphore, pipeline, * * * memory sharing, messaging and other IPC…… ....................................................................................................................................... Practical task: mainly practice various IPC communication methods. Try to write a pipeline program through which father and son processes exchange data. Try to write a * * * memory sharing program, and two processes exchange a C structure array through * * * memory sharing. Learn the book Windows Core Programming. Master CreateProcess, Windows threads, thread scheduling, thread synchronization (events, semaphores, mutexes), asynchronous I/O, memory management and DLL. Actual task: Start Notepad or IE with CreateProcess to monitor the program running. Using thread pool to realize the simple HTTP service written earlier. Write a hook program of DLL to monitor the closing event of a specified window, or record the key of a window. With the foundation of multi-thread and multi-process communication, TCP/IP, sockets, C++ and design pattern, you can learn ACE. Rewrite the above chat program and HTTP server (with thread pool) with ACE to practice tasks: Through all the above knowledge, try to write a server to send large files to the client, and require that the bandwidth of 100M be used to more than 80%. Note that there may be problems with disk I/O and network I/O, so think about how to solve them. In addition, please note the maximum unit MTU of network transmission. ) Understand the working principle of BT download, and simulate the principle of BT download in a multi-process way. 3. System architecture load balancing. Hash type, pure dynamic type. (You can read some articles about load balancing in Google Academic) Multi-layer distributed system-client service node layer, computing node layer, data cache layer and data layer. J2EE is a typical multi-layer structure. CDN system-closed access, marginalized content. P2P system, learning the algorithm of BT and electric donkey. For example: DHT algorithm. Server backup, dual-machine backup system (Live-Standby and Live-Live system), how do two machines monitor each other through heartbeat? Backup of cluster master node. Virtualization technology, through which the operating system can be switched or reconfigured and deployed as an application. Learn Thrift, a binary high-performance communication middleware that supports data (object) serialization and various types of RPC services. Learn Hadoop. The core designs in Hadoop framework are MapReduce and HDFS. Google mentioned the idea of MapReduce in a paper and it was widely circulated. In a word, MapReduce is "the decomposition of tasks and the summary of results". HDFS is the abbreviation of Hadoop distributed file system, which provides the underlying support for distributed computing and storage. Know NoSQL database (some people say it may be an over-hyped technology). However, due to the increasingly mainstream of ultra-large-scale, highly concurrent pure dynamic websites and the rigid demand of SNS websites for real-time data access, NoSQL database has gradually become the focus of attention at present, and it is likely to replace relational databases and become the mainstream data storage method in the future. At present, there are many NoSQL databases, most of which are open source, among which the well-known ones are MemcacheDB, Redis, Tokyo Cabinet (upgraded version is Kyoto Cabinet), Flare, MongoDB, CouchDB, Cassandra, Voldemort and so on. After writing so much, looking back, I feel quite fulfilled. I hope you're not afraid. I have studied for ten years myself, and I am studying today. Life is a process of continuous learning and improvement. However, there must be some omissions and mistakes. Please make corrections. Keywords: Programmer Advanced Depth