发布网友 发布时间:2022-05-02 21:30
共1个回答
热心网友 时间:2022-06-27 10:12
原文如下:我从csdn学习大本营得到您的信息。不好意思打搅您。我现在用c++在linux下开发大型应用程序。我想请教是否值得深入学习linux kernel。我没有特别多的时间。另外我有多年Windows下开发应用程序的经验。我的回答:呵呵,我感觉这还是一个学习方向的问题。Linux这几年,发展越来越好了,至少在很多应用服务器市场,Linux已经取代Windows成为第一选择,另外,在嵌入式环境,Linux也是逐渐成为主流。这导致很多原本是Windows的程序员,由于工作需要,逐渐走向Linux开发,这中间当然涉及到一个学习的问题。我本人也算其中一份子吧。我本来一直做Windows开发,在这之前,在DOS下用过gcc开发,还翻译了djgpp的库函数手册,也算有点基础。不过,在07年公司安排我在Linux下正式开发商用服务器的时候,我心里还是很打鼓的。因为也面临着一个学习的问题。看看市场上的书籍,很乱,我当时花了一整天在汉唐书城,仔细分析Linux开发相关的书籍,我发现分几种,首先是shell编程,这个我看了有半个小时,就觉得没用,这貌似给网管员用的,我做传输服务器用不到,连带着,正则表达式,我觉得对我用处也不大。真的要做复杂条件筛选,我的习惯是写个词法分析程序,自己来分析,也花不了多少时间,所以,我一直就没学正则表达式,呵呵。然后是C和C++编程相关,我仔细看了,发现一说到开发,就讲到Linux kernel,这部分显然是操作系统的知识,我仔细想了想,发现自己的问题并没有得到解决。就算我知道了kernel怎么工作,里面有什么开发技巧,对我的工作并没有什么帮助。我当时做的是分布式数据库的传输服务器部分,这部分讲究多线程,高效能,但还是局限在应用层,并没有多少涉及到kernel的东东。我觉得用处不大。反而我觉得我有必要对socket编程重新补一补了。经过挑选,我给自己选了一本《UNIX网络编程》的第1卷网络通信篇,第2卷是进程间通讯,我觉得我的程序用多线程跑已经很好了,线程本身就是共享内存的,无需考虑太多异步通讯,而且,我的习惯,进程间通讯,一般直接使用socket,这个放之四海皆真理,而且,好处是我的进程可以跨机器随意部署,只要我提供IP地址,进程间就可以互相通信,协同工作。所以,我只买了第1卷,就是专门讲socket的,这是好书,我现在没事还要拿出来看一看。另外,我又给自己挑了一本《Unix编程艺术》,这本也是好书,我以前就发现,Dos程序员有Dos程序员的习惯,Windows的有Windows的习惯,这些方言,习惯,教科书是没有的,必须找有经验的程序员问,而这本书恰好就是专门讲这些问题的。比如DOS时代,硬盘通常很小,用户分盘又很乱,我们要是想向磁盘存个临时文件,最好找C盘,连D盘都是很多计算机没有的。而Windows下系统提供了服务,可以通过api查询系统临时文件目录,就好多了,而Linux下呢,是约定俗成,大家都用/var来做临时目录,这就是风俗。嗯,这本书我看了以后,遵守了一半,呵呵,也没全遵守,它强调程序都是过滤器,从信息流中过滤自己有用的信息,加以处理,但是,不准破坏信息流,并且强调信息流无缝流转到下家,这个我很同意,这也是我这几年逐渐领悟到的一个程序设计原则。不过,它强调搭积木我就不太同意了,Unix的程序员,有个坏习惯,对管道很滥用,这就造成了很多程序都是小程序,通过管道勾搭到一起,完成一个强大的功能,这个呢,见仁见智,在某些场合合用,但我的开发领域,我强调强大的系统分析能力,一体化的系统设计思考,强调从系统设计阶段就杜绝很多潜在的逻辑bug,简单说,我对系统各个模块之间的和谐性看得很重,因此,这条我就没有遵守。嗯,还有就是它强调简洁开发,我呢,也只同意一半,把程序写简洁,每个函数,每个类,都很简单,减少bug,这个我是同意的,不过,简介到变量名函数名都净是缩写,人都看不懂,就太离谱了。呵呵,我的习惯就这样,别人的东西好,对我有用,我就用,我觉得有异议,并且认为自己的理由更站得住脚,我就坚持自己的。并且,一切从实践中看,计算机是最公平的,乱写程序,就算是大师也照挂,小心翼翼地写程序,即使是刚入行的小弟,也能写出很漂亮的程序。就这样,我借着这两本书慢慢看,然后,大多数习惯还是Windows的,到现在我开发,都是VC下编辑程序,然后写个makefile,ftp到虚拟机去编译执行,也走到今天了。后来发现,我没有学习shell,我没有学习kernel,我没有学习很多教科书上规定必须学习的东东,我的程序居然也完成了,我们的工程在去年,9轮测试,只发现51个bug,属于C和C++这边的bug,只有7个,这就是我坚持我自己无错化程序设计方法的威力。