经常看我博客的朋友应该知道,我一开始自学时候是学了一点C语言,但是不得章法,后来找了一些培训班的视频看Python + Django,加上自己琢磨,终于搞明白了一些Web开发的内容,感觉已经算入门了。

后来在2018年底碰到朋友推荐左耳听风的这一套讲座,看完之后发现只能算启蒙,离入门还差一些距离。

于是又花了半年多的时间,根据讲座其中的要求学习Java语言和Spring框架以及Web的前后端分离技术,还附带比左耳大佬要求的更彻底,用Vue做了前后端分离。

直到这个夏天来临,才敢说自己总算入门了,初步有了超能力。

俗话说,师傅领进门,修行在个人;我自己摸爬滚打让计算机之神稍稍眷顾我,让我懂了什么是编程。但是入门才是刚刚开始,看看左耳的原话:


你可能已经沉醉在沾沾自喜的骄傲的情绪中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的开发,成为一个搬砖的码农。你也可以开始选择一个方向开始深入。

我给你的建议是选择一个方向开始深入。因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?

后面,我们就开始非常专业的程序员之路了。这也是一般程序员和高级程序员的分水岭了,能不能过去就看你的了。
正好处在6月末,需要订立一下下半年的学习计划。

我把左耳大佬的后边的要求整理了一下,大概有如下几个方面:

通用型能力

一些需要的阅读:

  1. 97 Things Every Programmer Should Know
  2. How To Ask Questions The Smart Way。中文版:提问的智慧
  3. 重构:改善既有代码的设计
  4. 修改代码的艺术(已绝版)
  5. 代码整洁之道
  6. 程序员的职业素养
  7. JUNIT文档

安全和测试方面的东西我暂时先放放。这些东西结合前边的代码大全,其实是在用各种方式告诉你写程序的智慧。

程序语言

Java, Python? 不好意思,远远不够。至少还需要学习C, C++ 和 Go。

一些推荐的书如下:

  1. C语言程序设计现代方法
  2. C陷阱与缺陷
  3. C++ Primer中文版
  4. Effective C++:改善程序与设计的55个具体做法(第3版 中文版)
  5. More Effective C++:35个改善编程与设计的有效方法(中文版)
  6. 深度探索C++对象模型

看完大佬的推荐书目,真的是心头一紧,不愧大佬什么都会,学过C的我知道,如果掉进C和C++的大坑里肯定是爬不出来了。

理论学科

理论学科的核心就是算法:

  1. 算法
  2. 算法图解
  3. 算法导论
  4. 编程珠玑
  5. List_of_algorithms
  6. 算法视觉化

然后是一些其他理论知识的书:

  1. 数据结构与算法分析 c语言描述
  2. 数据库系统概念
  3. 现代操作系统
  4. 计算机网络 自顶向下方法
  5. SICP 神书
  6. 编译原理

系统知识

系统级知识都是底层的了:

  1. 深入理解计算机系统
  2. UNIX环境高级编程
  3. UNIX网络编程1+2
  4. TCP/IP 详解

如果上边比较难懂,可以看下边的书。当然上边能啃下来的话,就不用看下边的了,下边看完还是要看上边的。

  1. LINUX C一站式编程 已绝版的国产神书
  2. TCP/IP网络编程
  3. 图解TCP/IP 第5版
  4. THE TCP/IP GUIDE

把上边看完之后,就可以看:

  1. Linux UNIX系统编程手册 套装上下册
  2. http://igm.univ-mlv.fr/~yahya/progsys/linux.pdf
  3. Linux 系统编程

之后是一些作业要求:

  • 用这些系统知识操作一下文件系统,实现一个可以拷贝目录树的小程序。
  • 用fork / wait / waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。比如,多进程购票的程序。
  • 用signal / kill / raise / alarm / pause / sigprocmask实现一个多进程间的信号量通信的程序。
  • 学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序)。
  • 学会使用makefile来编译程序(参看我的《跟我一起写makefile十一十二十三十四)。
  • Socket的进程间通信。用C语言写一个1对1的聊天小程序,或是一个简单的HTTP服务器。

实践项目

最后是作业要求:

实践项目
我们已经学习完了编程语言、理论学科和系统知识三部分内容,下面就来做几个实践项目,小试牛刀一下。实现语言可以用C、C++或Java。

实现一个telnet版本的聊天服务器,主要有以下需求。

每个客户端可以用使用telnet ip:port的方式连接到服务器上。
新连接需要用用户名和密码登录,如果没有,则需要注册一个。
然后可以选择一个聊天室加入聊天。
管理员有权创建或删除聊天室,普通人员只有加入、退出、查询聊天室的权力。
聊天室需要有人数限制,每个人发出来的话,其它所有的人都要能看得到。
实现一个简单的HTTP服务器,主要有以下需求。

解释浏览器传来的HTTP协议,只需要处理URL path。
然后把所代理的目录列出来。
在浏览器上可以浏览目录里的文件和下级目录。
如果点击文件,则把文件打开传给浏览器(浏览器能够自动显示图片、PDF,或HTML、CSS、JavaScript以及文本文件)。
如果点击子目录,则进入到子目录中,并把子目录中的文件列出来。
实现一个生产者/消费者消息队列服务,主要有以下需求。

消息队列采用一个Ring-buffer的数据结构。
可以有多个topic供生产者写入消息及消费者取出消息。
需要支持多个生产者并发写。
需要支持多个消费者消费消息(只要有一个消费者成功处理消息就可以删除消息)。
消息队列要做到不丢数据(要把消息持久化下来)。
能做到性能很高。

我看完之后感觉,只要你打算学计算机,这些书貌似是绕不过去的。想要成为程序员,而不是API调用师,没有什么捷径可以走了。

好了,话不多说,先把书单整理出来,对照一下手头的书看看还差哪些。根据进度开始把要看的书买齐,首先是一些关于修养的书,可以在放松脑子的时候看。

然后就从C语言再搞起了。一年半之前对于C虽然能看懂,但是显然对指针之类的东西不如现在理解深刻。上吧!