当前位置: 首页 > news >正文

(ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)

原文发表在http://www.douban.com/review/2032438/

关于《程序员的自我修养》这本书,最初是在和博文的周筠老师MSN上谈起,当时听周老师提及这本书是一本关于链接和装载等系统软件知识的书籍,当时就很感兴趣,因为这方面的书在国内真的见得很少,一方面这种书似乎跟做应用开发的有距离,毕竟如果只是用用C#、Java,似乎没什么必要关心编译器、链接器在做些什么,特别是那么“老土”的C编译器、链接器,另一方面关于这块的知识水比较深,既要有理论深度(得对操作系统、编译原理等有一定了解和学习),又要有工程基础(得实实在在地去研究过GCC、OS,甚至得去读读它们的源码),同时还得有足够的开发经验,至少得有一定在linux上开发系统软件的基础,这样也就难怪很难见到这种“曲高和寡”的书了。


所以当周筠老师最初推荐我读一遍这本书稿,并告知这本书是两个在校读研的学生写出来的,所以第一感觉对这本书并不抱太大期望,担心这本书又会是一堆理论的堆垒。但在我初初翻看这本书、特别是翻到第二、第三部分时,很是惊讶于其中描写的细致,单是看中间用objdump/readelf分析ELF以及用实际案例来分析和解释符号解析和重定位,就会明白这本书绝不是一本只讲“理论”的形而上,于是决定静下心来仔细阅读,并完成周老师布置给我的“任务”(写些对此书的审阅意见)。


仔细阅读后,深感这本书是一本联系理论和工程的桥梁,本书深入浅出地对系统底层机制进行了拨丝抽茧,让读者清晰地洞悉程序的前世今生,作为程序员,作为喜欢刨根问题的程序员,读这本书我想至少有两个好处,其一自不必说,一本让你洞悉系统如何链接、装载的优秀图书总是可以让你学到很多东西的,其二则在于,本书作者在写作本书中反映出的认真、执着,以及从小处着手的分析阐述方法,委实让我等值得学习,看书中若干的实例和图表,就可以明白作者在写作过程中的心血(听周老师提及这本书是俞甲子等花费两年时间原创)

或许有人会说这本书有点太底层了,对于普通程序员的日常工作好像没什么价值,这里我想举个自己的例子来证明理解系统底层的概念是多么重要。当时我们项目(linux平台,gcc开发)中使用到一个第三方library(没有source code),我们的项目是在RHAS4(gcc3.4)上编译的,而library是在Redhat9(gcc2.96)上编译,但library的接口都是标准的C接口,而且按理说gcc的C++对象模型在不同版本间也没什么差异,所以应该可以安全地使用这个library,但结果很不幸地程序crash了,而且是crash在奇怪的STL string函数中,事后的分析证明了那是由于STL模板的弱符号导致符号解析错误,不同的STL库(主程序和library调用了不同的STL)中的函数被覆盖而导致。如果不对linux里弱符号(本书3.5.5,弱符号与强符号)、符号表(本书7.5.3,动态符号表)、符号解析(本书4.2.3,符号解析)等有足够的了解,遇到这样的crash我想一定会抓狂的。此外像soname、动态链接器等,这些对于在linux下开发都是些很必备的知识。


最后还是说点对这本书的一些负面意见吧;-)


首先就是书名了,个人不是太喜欢这个主标题,似乎有点太高了,其实我觉得周老师最初给我看的那个书名《深入理解计算机系统软件》要更贴切些,不太明白为什么最后会改名;-)


其次,从个人角度来看,我觉得这本书对windows部分的介绍不是太必要,其实我更希望这本书能够更深入更全面地对linux的链接和装载进行介绍,比如在多加些linux进程管理、C++及template对编译和链接的影响、gcc的c library更详尽的分析(本书第四部分的crt看起来还是更偏“教学”目的了)等等,可能这样会更专注,当然也可能会丢失一些windows读者,不过也可以把windows的内容另成一书;-)呵呵,这些说来容易,但那又是何等地心血。


好吧,从内容上,这本书一定值得你一翻,就算你不通读,把第二、第三部分仔细读读一定会很有收获,如果你对系统的机理感兴趣,特别是,如果你是linux C/C++程序员,我如是推荐。


此外,从书籍的装裱上,博文一贯的高标准让此书不论是封面、纸张,还是排版,都堪称一流,当属一本可撑台面的书架点缀;-)

相关文章:

  • 查看实时Mongodb query 命令
  • .Net 应用中使用dot trace进行性能诊断
  • 如何更改一台已经安装了SharePoint2007的服务器名称(转)
  • HTML上传文件的form enctype属性
  • BlockingCollection的使用
  • 配置本地IIS的证书访问的权限
  • 如何设置水晶报表(crystal reports)的字段自动换行
  • Xamarin nuget package update 错误
  • Xamarin部署时遇到错误: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  • CrystalReport显示HTML标记
  • Xamarin 编译错误: The file obj-Release-android-bin-package_resources does not exist
  • 一些.NET 项目中常用的类库
  • update-database 到azure sql database
  • 打印机
  • azure Machine learing studio 使用示例之 - 使用线性回归算法完成预测评估
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Apache Pulsar 2.1 重磅发布
  • AWS实战 - 利用IAM对S3做访问控制
  • docker python 配置
  • isset在php5.6-和php7.0+的一些差异
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java应用性能调优
  • mac修复ab及siege安装
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Rancher如何对接Ceph-RBD块存储
  • 阿里研究院入选中国企业智库系统影响力榜
  • 构建二叉树进行数值数组的去重及优化
  • 技术发展面试
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 区块链共识机制优缺点对比都是什么
  • 深入 Nginx 之配置篇
  • 实现菜单下拉伸展折叠效果demo
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 因为阿里,他们成了“杭漂”
  • 正则表达式
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​ssh免密码登录设置及问题总结
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (11)MATLAB PCA+SVM 人脸识别
  • (Forward) Music Player: From UI Proposal to Code
  • (js)循环条件满足时终止循环
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)Linux——Linux常用指令
  • (二)springcloud实战之config配置中心
  • (接口封装)
  • (转)编辑寄语:因为爱心,所以美丽
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调