打通这个关节,程序员可以干上三十年
引言
五十二年前,Unix操作系统在贝尔实验室诞生。Kenneth Thompson大神用三周时间就开发出Unix的初版,两年后Dennis Ritchie大神创造了C语言,Unix操作系统用C语言重写。
此后的IT世界就在Unix与C语言的基础上构建起来,Unix是平台,C语言是工具。时至今日,源自Unix的Apple Mac OS X和类Unix的Linux系统在个人终端、企业计算、图形工作站等领域如日中天。
这对于程序员来说,有一个重大的启示。即无论出现多少新语言、新框架,过去五十年的IT基础设施,仍然是在Unix及其衍生品的范围内。这一底层架构要出现颠覆式改变,也非一朝一夕之事。
系统编程方向,或许是程序员一个很好的选择。系统编程,就是需要熟悉系统调用,结合算法知识,开发出系统级应用工具。例如git、nginx、redis等。
可以说,在这个方向上,程序员想干个三十年也没问题。那么,要跨过这道门槛,就一定要先读一部圣经级著作——《UNIX环境高级编程》。
书写圣经的人
“神说:要有光。就有了光。”——《圣经》旧约·创世纪
三十年前,程序员们还在黑暗中摸索系统编程时,一道光照亮了前进之路,这就是出版于1992年的《UNIX环境高级编程》。其英文书名为《Advanced Programming in the UNIX Environment》,因此其首字母缩写APUE就成为程序员对此书的通称。
难以计数有多少程序员是读着这本书成长起来的,而“圣经”这一饱含情感的赞誉,实实在在地道出了APUE在程序员们心目中的地位。
书写“圣经”的大神有两位,W.Richard Stevens独自完成了第一版,Stephen A. Rago是第一版的技术审校者,并且续写了第二版与第三版。
Richard大神著作颇丰,APUE还只是得意作品之一,其它还有《TCP/IP详解》三卷本,《UNIX网络编程》两卷本。干网络开发的程序员,必都在案头摆着这两部书给自己压阵。
可惜天妒英才,酷爱极限运动的Richard在1999年意外离世,IT界痛失大神。好在Rago继承了Richard未竟的遗志,随着技术的发展,续写了新版,让传奇得以在世间继续流传。
Rago本就工作在Unix的诞生地——贝尔实验室,他参与过构建UNIX System V Release 4,是核心开发者之一。所以,要论对Unix系统的熟悉程度,Rago是当仁不让,由他来续写APUE,也是不二人选。
最新的第三版相比于之前的变更,涵盖了超过70个新的接口。更新了线程系统的说明,删除了一些弃用的接口。最重要的是去掉了STREAMS相关的内容。STREAMS是Unix system V提供的,构造内核设备驱动程序和网络协议包的一种通用方法。
随着Linux的兴起,socket接口更加通用。虽然Rago从感情上对STREAMS颇为不舍,但还是拥抱了变化。这就是一位技术人对待潮流发展的态度,也是APUE能够与进俱进的重要原因。
司机学开车
Linus Benedict Torvalds在赫尔辛基大学读书时,因为没有称手好用的Unix系统,于是愤而自己写了一个操作系统内核出来,把源代码也扔到了网上,这就是后来威震天下的Linux。
所以,Linus的初衷是想给自己整一个好用的Unix,所有能在Unix实现的操作,在Linux也应该能实现。这就需要遵循一个统一的标准,Linus就是依照POSIX(Portable Operating System Interface of UNIX,可移植操作系统接口)进行开发的。
我想用司机学开车为例,来说明POSIX的意义。
我们去驾校学开车,学会了起步、加速、上路行驶之后,考到驾照,那就意味着不管什么品牌的车,只要坐进驾驶位,我们都能把它开起来。
POSIX就是这样一套标准动作,APUE就是这套动作最优秀的说明书。
APUE的最新版本是基于Single UNIX Specification, Version 4(以下简称为SUSv4)更新的。SUSv4涵盖了POSIX.1-2008,也就是说SUSv4是POSIX的超集,在各个Unix/Linux环境中是通用的。
遵循标准暴露出来的操作系统接口,称为系统调用。理论上,任何Unix与类Unix系统上的系统调用,其行为都是一致的。也就是说同一段代码,无论是运行在MacOS上,还是Ubuntu上,结果应该都一样。
目前业界流行的Apple MacOS X、iOS系列是Unix系统;Redhat、Ubuntu则是Linux的各个发行版,Android内核是Linux;华为自研的HarmonyOS(鸿蒙)亦支持POSIX标准。
程序员只要摸透一本APUE,就可以横跨服务器、嵌入式、可穿戴等各种平台。反正底层逻辑尽在掌握,业务层面那想转型就可以转型,此即是一招先,吃遍天吧。
我的职业之路上,就曾经做过服务端的Linux开发,也做过嵌入式系统ucLinux的开发,还有iOS与Android的原生SDK开发。期间各种转换似乎全无窒碍,如今细细想来,原因竟是在此。
APUE在谁那儿呢
记得以前公司要求开列技术书单,我第一批就把APUE加了进去。后来事实也证明,APUE成了最抢手的品种。
经常有人在书架上找不到书,就在群里发问:“APUE在谁那儿呢?急用”,若是有人回复,还免不了加上一句“用完了记得拿回来,还没看完”。
我就有一次印象深刻的经历,当时是开发挂起进程后台运行的功能。APUE没在手边,就在网上搜索了一段现成的方法,但运行结果与预期不一致。
偷懒的想法还真是要不得,赶紧在群里找书,拿到手上翻到daemonize
相关章节细读。果然发现了问题,原来是一个参数使用不对。照书修改,通过,搞定。
很多人对APUE的定位是系统调用速查手册,一般是在调试程序卡壳的时候查找函数说明。这是一种很典型的使用场景,但我建议程序员有时间的话,也应该通读APUE。
SUSv4包含了1833个系统调用接口,而APUE从中精选了400多个出来,按照不同主题进行细说。其实这是有脉络可循的,从存储管理、进程管理、线程管理,到IO操作等,基本上就是操作系统的几大核心功能。
程序员通读的好处,就是能从整体上把握Unix类操作系统的功能特点,在头脑中建立起核心功能的知识索引。这样在开发过程中遇到问题,能够很快定位知识点,翻开书就能找到答案。
我在早期工作时,对很多概念模棱两可,拿着书总是从头到尾地查找,这样效率自然不高。我后来有空就会有意识地对APUE进行主题阅读,不仅高效解决问题,而且对操作系统的理解又加深了。
变与不变
我曾看到有程序员大呼“我就想一辈子写代码,不行吗?”
诚然,程序员都期望拥有长期且稳定的职业生涯,可是变幻莫测的现实总让人措手不及。我想一辈子写代码,是完全可以的,但要弄清楚变与不变的事物是什么。
如果只是掌握一种应用开发技术,希望在某个具体的业务上做一辈子,这就太难了。单说网络传输,就从最早的56k拨号上网,发展到现在的光纤入户、5G普及,要解决的问题肯定是不同的,新的业务也会不断出现。
但网络编程的基本方法,还是变化不大的,只是要处理数据的延迟更小,量级更大了。从这个角度看过去,只是问题在变化,核心技术还是那些。所以,掌握好系统编程的精髓,才是程序员的职业基本盘。
APUE就是程序员用来修炼不变之功的秘籍,你想在这行干个三十年吗?那还等什么,把APUE读起来吧。