程序员练级攻略:系统知识
进入专业的编程领域,学习系统知识是很是关键的一部分。html
- 《深刻理解计算机系统》,原书名为《Computer Systems A Programmer’s Perspective》。
本书的最大优势是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统。从最底层的数据在内存中的表示到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。经过掌握程序是如何映射到系统上,以及程序是如何执行的,你可以更好地理解程序的行为为何是这样的,以及效率低下是如何形成的。前端
网络编程知识
理查德·史蒂文斯(Richard Stevens) 的三套巨经典无比的书。大师的 我的主页 。linux
Linux网络编程与协议分析知识
学习网络协议不单只是看书,最好用个抓包工具看看这些网络包是什么样的。程序员
- 《Wireshark 数据包分析实战》。在这本书中,做者结合一些简单易懂的实际网络案例,图文并茂地演示使用 Wireshark 进行数据包分析的技术方法,可让咱们更好地了解和学习网络协议。固然,也拥有了必定的黑客的技能。
看完《Unix 高级环境编程》后,能够趁热打铁看看《Linux/Unix 系统编程手册》或是罗伯特·拉姆(Robert Love)的 Linux System Programming 英文电子版 。其中文翻译版Linux 系统编程 也值得一读,虽然和《Unix 高级环境编程》很像,不过其主要突出的是 Linux 的一些关键技术和相关的系统调用。算法
关于 TCP 相关文章。数据库
对于系统知识,主要有如下一些学习要点。编程
- 用这些系统知识操做一下文件系统,实现一个能够拷贝目录树的小程序。
- 用 fork / wait / waitpid 写一个多进程的程序,用 pthread 写一个多线程带同步或互斥的程序。好比,多进程购票的程序。
- 用 signal / kill / raise / alarm / pause / sigprocmask 实现一个多进程间的信号量通讯的程序。
- 学会使用 gcc 和 gdb 来编程和调试程序(参看个人《用 gdb 调试程序》一、二、三、四、五、六、七)。
- 学会使用 makefile 来编译程序(参看个人《跟我一块儿写 makefile》一、二、三、四、五、六、七、八、九、十、十一、十二、十三、十四)。
- Socket 的进程间通讯。用 C 语言写一个 1 对 1 的聊天小程序,或是一个简单的 HTTP 服务器。
C10K 问题
操做系统处理大并发请求的问题小程序
实践项目
实现语言能够用 C、C++ 或 Java。
实现一个 telnet 版本的聊天服务器,主要有如下需求。
- 每一个客户端能够用使用
telnet ip:port
的方式链接到服务器上。
- 新链接须要用用户名和密码登陆,若是没有,则须要注册一个。
- 而后能够选择一个聊天室加入聊天。
- 管理员有权建立或删除聊天室,普通人员只有加入、退出、查询聊天室的权力。
- 聊天室须要有人数限制,每一个人发出来的话,其它全部的人都要能看获得。
实现一个简单的 HTTP 服务器,主要有如下需求。
- 解释浏览器传来的 HTTP 协议,只须要处理 URL path。
- 而后把所代理的目录列出来。
- 在浏览器上能够浏览目录里的文件和下级目录。
- 若是点击文件,则把文件打开传给浏览器(浏览器可以自动显示图片、PDF,或 HTML、CSS、JavaScript 以及文本文件)。
- 若是点击子目录,则进入到子目录中,并把子目录中的文件列出来。
实现一个生产者 / 消费者消息队列服务,主要有如下需求。
- 消息队列采用一个 Ring-buffer 的数据结构。
- 能够有多个 topic 供生产者写入消息及消费者取出消息。
- 须要支持多个生产者并发写。
- 须要支持多个消费者消费消息(只要有一个消费者成功处理消息就能够删除消息)。
- 消息队列要作到不丢数据(要把消息持久化下来)。
- 能作到性能很高。
小结
编程语言。以工业级的 C、C++、Java 这三门语言为主,推荐学习 Go 语言。
算法和数据结构。尤为是最基础的算法和数据结构
计算机的相关系统。至少要掌握三个系统的基础知识,一个是操做系统,一个是网络系统,还有一个是数据库系统。它们分别表明着计算机基础构架的三大件——计算、存储、网络。
可是,日后面走,你须要开始须要术业有专攻了。下面给一些建议的方向。
- 底层方向:操做系统、文件系统、数据库、网络……
- 架构方向:分布式系统架构、微服务、DevOps、Cloud Native……
- 数据方向:大数据、机器学习、人工智能……
- 前端方向:你对用户体验或是交互更感兴趣,那么你走前端的路吧。
- 其它方向:好比,安全开发、运维开发、嵌入式开发……