带着新人刷《Unix环境高级编程》

背景

团队内来了不少年轻人,水平参差不齐,有些干了好几个年头还不知道什么是 进程间通信IPC )。

当时在讨论一个后台服务的设计,它内部由若干协程组成,协程间需要传递一些数据,他想用 Redis 来做队列……我表示不解,在同一个程序内的通信,为什么要通过一个外部的 Redis 来进行呢?

我很好奇,问他:你没学过 进程间通信IPC )吗?同一台主机下的进程进行通信,当然是首选操作系统提供的进程间通信机制,除非应用进程可能跨机器协作。但他一脸懵逼,表示没听过进程间通信……

我当时有点震惊,一个干了好几年的后端,居然没听过进程间通信!这不是校招必考题吗?

想当年没读《Unix环境高级编程》都不好意思去面试,而进程间通信就是其中一个主题。但他们可能起点较低,没认真学好这些基础课,也没经历过大厂面试的洗礼,因而功底比较薄弱。

目的

虽然他们平时做业务开发,增删改查都可以,但我总觉得缺点意思。想着做点什么帮他们提高技术水平,但一直找不到好的方式。这段对话刚好给我一个灵感,何不带他们读一本书?

那为什么选《Unix环境高级编程》这本书呢?主要有这几点考虑:

  • 后端必读经典
  • 理解 Unix/Linux 操作系统,特别是系统调用,不被高层 API 蒙住眼睛
  • C 语言视角审视程序,更接近计算机执行本质

方式

我在群里问了一下,谁有读过《Unix环境高级编程》?结果你猜咋滴,四个人中没一个有读过这本书!然后事情就愉快地决定了:每周轮流由一个人读书中的某些章节,然后分享给大家,顺序由几行代码随机决定。

1
2
3
4
5
>>> names = ['wxlinjunhao', 'wxliaoyangtao', 'wxchentaihua', 'wxhuangjuguan']
>>> import random
>>> random.shuffle(names)
>>> names
['wxliaoyangtao', 'wxlinjunhao', 'wxchentaihua', 'wxhuangjuguan']

课前作业

为了让每个人都参与其中,我要求每次分享都有一个简单的课前作业。

每个人都需要先做课前作业,然后带着问题参与分享。免得讲的人在上面讲,而听的人在下面昏昏欲睡。如果时间允许,分享课上还可以做下作业点评,课后再根据分享学到的新知识对作业进行完善。

作业的内容就比较简单,根据分享主题用 C 语言实现一些小工具。举个例子,第一次分享应该是 Unix/Linux 文件操作相关系统调用介绍,我留下的作业就是用 C 语言实现一个自己的 cat 命令。

你可能会觉得,cat 命令不是现成的吗?为什么还要自己搞一个呢?其实模仿是最好的学习方式,将 cat 命令山寨一遍,你对它涉及的文件 IO 相关操作也就牢固掌握了。我当前还是初学者的时候,也经常自己造轮子。

再往后学习目录相关接口时,我应该会选择自制 find 命令作为课前作业。学习没有止境,折腾不息,哈哈~

大作业

那刷完这本书,是不是也可以做点有趣的玩意练练手呢?

我想到大三当年在腾讯实习时的第一个任务——用 C 语言开发一个 ftp 服务器。当时还有个研究生师兄跟我一起实习,他的作业也是用 C 语言开发一个 http 服务器。

你可能会很诧异,不是有很多 ftp 服务器吗?为什么要自己折腾呢?

其实这个任务是一个考核型任务,更准确说是一个作业。团队布置这个任务,目的应该是想考察我们几个实习生的编程功底,考察对 Linux 系统调用的熟悉程度,对网络协议的理解以及在网络编程方面的造诣。

当时导师提的要求就 高并发 三个字,我提的多线程方案被否决,然后就全靠自己折腾。我大概用了两周的时间,撸了 5000 多行 C 语言代码,搞定了这个 ftp 服务器。麻雀虽小,五脏俱全。

完成 ftp 服务器开发后,感觉对 epoll 的理解更加到位。于此同时,也领悟了一些新的开发技巧:

  • 连接会话管理
  • 多连接协同( ftp 服务有控制连接和数据连接)
  • 网络错误处理技巧
  • etc

像腾讯这样的大厂,有很多资源可以培养新人。他们不会让新来的人立马干活,而是先做一些有趣的东西练练手。当然了,如果考核作业没达标,肯定是直接 Go Home 了。

因此,我也想效仿这种做法,让每位童鞋在最后都开发一个简单的网络服务器。团队总共有四个年轻人,因此我想了四种网络服务,分别是:

  • http 服务器
  • ftp 服务器
  • socks5 代理服务器
  • vpn 服务(ip over udp

这样一来,每个人的作业各不相同,可以交流但无法复制粘贴,哈哈~有位童鞋提出疑问,表示不同的服务难度也不一样。这个好办,交给随机数来决定呗。

思路已经有了,坐等实施。本周会开启第一次分享,内容应该是 Unix/Linux 文件操作 。第一次课前作业自己动手实现 cat 命令,有兴趣的同学也可以跟我们一起做。

作业说明

C 语言实现 cat 命令,要求基本用法如下:

1
cat file1 file2 file3 ...

具体可以参考系统自带的 cat 命令,查看 man 文档:

1
man cat

PS:几位同学基本都能完成作业,但编写的 cat 程序,性能却有天壤之别!想不想知道您自己写得如何?快动手试试吧!

欲知后事如何,请听下回分解!

《Unix环境高级编程》是后端工程师的必读经典,有兴趣也可以了解一下,跟我们刷起来:

订阅更新,获取更多学习资料,请关注我们的公众号:

【随笔】系列文章首发于公众号【小菜学编程】,敬请关注: