laoar
对
系统程序员成长计划
的书评
发表时间:2011-07-04 22:07:33
本着与人为善的原则,不打算作任何评论的。但是看到超过8分的评分,还有赞美之情溢于言表的众多书评,就有了忍不住想写的冲动。其实,我是希望有本事的人能够把自己所学写成书分享给大家,但是有句话说,长的丑不是你的错,出来吓人你就不对了!
先来看封面,请注意“编著”这两个字,技术类的书籍不使用“著”,而是在它前面加个“编”字,是有一定道理的。
再来看书名,什么是系统程序员?故名思议,从事系统软件的开发者谓之系统程序员。那么什么是系统软件?系统软件是和底层架构,操作系统,以及基础服务紧密关联的软件。例如操作系统,编译器,调试器,加载器,可执行文件解释器,反汇编工具等都属于系统软件。那么作者在这本书里描述了什么呢?well,请原谅我没有仔细阅读这本书,所以我也不知道这本书到底和系统软件有什么关系。不过我倒是看了它的目录,又大致翻了一下整本书。原来本书所谓的系统程序员,就是知道一些基本的数据结构,了解Makefile的基本应用,再加上TLS以及dumpstack这两个吓唬人的名词。oh,sorry,作者没说dumpstack,作者说的是backstrace。如果作者以为这就是系统软件,又或者让读者以为这就是系统软件,那我觉得中国出来几百个Bill Gates和Linus Tarvalds应该是小事一桩。
再来看作者简介。“有着10年linux开发经验,5年手机开发经验...致力于linux嵌入式系统的学习和研究”。ok,那就从作者最拿手的linux开始说起。
Linux开发者的圣经是什么?没错,linux内核,这是毋庸置疑的!linux内核发展到现在,已经积累了上千万行的代码,现在linux内核已经发布了3.0RC版,即将由2.6时代迈入3.0时代。那么从事linux开发的系统程序员他应该具备什么最基本的技能?毫无疑问,内存管理(mm)是每个linux开发者必须掌握的技能,而且内存管理也是linux最复杂的一部分,一旦你掌握了内存管理,再来看linux内核的其余部分,你会发现都是little case。那么作者在这里有什么心得体会要和读者分享哪?共享内存,内存分配器(貌似作者没有提到很重要的高速缓存分配器,比如slab),TLS(不明白作者为什么要把这个很少用到的技巧给在这薄薄的一本书中作为基础知识给罗列出来)。对于共享内存,不知道作者知不知道有POSIX和SHM。不仔细说了,毕竟作者自己也说了“这是写给应届生和业余爱好者的”。腾讯为什么能靠卖QQ币发大财?因为小学生的钱好骗。
有人批评郎咸平,说它只会挑毛病,不会给方法。我不想重蹈郎教授的覆辙被人骂,也在这里写写自己给系统程序员的建议,主要针对linux开发者吧。linux的经典书籍很多,你只要阅读了以下几本书,并尽量做到吃透,你就能够成为大神了,不吃透也没关系,掌握其中的一成就足矣让你在神州这片土地混饭吃了。
首先,阅读《unix环境高级编程》作为入门。接着,看《linux设备驱动程序》了解一下基本的模块。接着,看《深入理解linux内核》,重点学习内存管理,结合linux源码看。最后,搞linux的,网络是不得不接触的内容,你可以看《TCP/IP协议卷B》。还有一个国人写的书也挺不错的,比如《程序员的自我修养》可以用来学习连接器加载器以及ELF文件,比如《linux那些事儿之我是usb》。
@laoar 看到了你们的口水战,真的很搞笑。有啥好喷的呢?你不就被这本书的书名给误解了吗?看作者写的写作背景,人家已经写明了为什么是这样一个名称,以及作者要讲的内容,适合那些人,全部都说了。而且书名上带了“成长计划”,这已经说明了,只是指点一个方向,你非要啥深入的,那你不是看错书就是没事干纯个人癖好。对于你指出的ftk的代码bug,我觉得多余的return并非bug,这是某些程序员的个人习惯,而且这种习惯某种意义上来说可以避免很多bug。对于你贴出你的github,我真的上去看了,我只看的my-task-manager,直接打开task.c,第一个函数如下:
int get_allproc(struct allpid *pids)
{
int cnt;
int *pid_buffer;
// get the pid count in our Mac system.
if ((cnt = proc_listallpids(NULL, 0)) <= 0) {
perror("get_listpids");
return -1;
}
// apply mamory to store all these pids
if ((pid_buffer = (int *)malloc(cnt * sizeof(pid_t))) == NULL) {
perror("proc_pid malloc");
return -1;
}
// store all these pids to the buffer
if ((cnt = proc_listallpids(pid_buffer, cnt * sizeof(pid_t))) <= 0) {
perror("alloc pid buffer");
return -1;
}
pids->pid_list = pid_buffer;
pids->cnt = cnt;
}
你能否告诉我有没有bug?
其实我没去看你的代码用了啥高级算法,也没看你这东西要实现啥功能,能否告诉我函数要返回int,但结束却没返回任何东西,这么设计有啥过人之处?
看了里面6个函数有3个都是这样。
扯那么多有啥用?拿时间来喷还不如多用点时间写自己的代码。
我再贴几条你的装逼语录:
【如果你不幸面试成功进入华为,应该会跟我打交道。我是linux内核开发。】
但是后面又开始扯
【而且,我也无意去给你说我现在在哪里工作。】
大胆揣测一下,不就是从华为跳槽到Juniper了,工资从苦逼的8K涨了一倍到20K。
我打了几个错别字,你开始说我不懂signal了。
还喜欢再技术上喷别人,你可拉倒吧你。我是没看出来你哪里牛逼了。
再请楼主看看这个帖子:【程序员的困境】
http://blog.jobbole.
说的就是你们这些搞了点内核开发,写了几个驱动。编译了几个系统就自以为是,不知道天高地厚的所谓内核开发者。
>我有说20K很高? 游戏行业(这算不算IT?)起薪都是20K+好不?
不知道你的第一份工作是不是华为。如果是,你有啥装逼的?我也有华为的offer。
就你喜欢拿工资说事,并以此证明自己牛逼。那你说说,你工作几年了?
太自以为是了。微内核宏内核的区别。在《操作系统设计与实现》(介绍Minix的那本书)的那本书第二章就已经明确说了。你是不是以为别人都一无所知?
不过我怀疑你可能没看过这本书,更不用说minix源代码了。
jffs2和yaffs咱也看过,也写过代码。有些话题我不想扯的太远。但是楼主你不装逼好好说话会死是吧?
我移植的jffs代码:
https://github.com/p
我移植的yaffs代码:
https://github.com/p
你说你写过jffs2的代码。在联想到前面说自己build过gcc 的toolchain,我大胆设想一下,因为板子上是nand/nor的,所以需要这俩文件系统,而你不会在编译内核的时候修复了几个jffs/yaffs的编译错误吧?
你给出jffs2里你的commit,我立刻低头认输。
signal的问题还有啥可扯淡的?除了没完没了的扯皮还是没完没了的扯皮 。
还有你第一个所谓的 类型转换的问题呢? 强转就bug了? 又不是 32位转16位。你到是说说bug在哪里?
exit的问题,return是多余的,多余的是bug么? 顶多算是useless的代码。
20K不高,真心不高,我也这么觉得。我同事们的水平怎么样,我不管保证,薪水比我多多了去了,咱是新人。是否跳槽就不老你费心了。
>睡觉都没睡好
我只能说你这是装逼的资本还不够啊,还有点发虚。祝你在装逼的路上越走越远。
》装逼党们永远不会去试图看看那个宏到底是干啥的
我再重复一边, 首先这个文件是*linux.c文件,所以它的os是linux,不用再试图跟我扯什么其他的RTOS芭啦芭啦。linux的编译器,如果你们公司不是太碉堡,都会从gcc来做个交叉编译莲,所以这个文件名隐含的答案就是我们讨论的是gcc,所以别再傻逼呵呵的说这个编译器那个编译器。
》这个宏
你要让我跟你这个笨蛋说多少遍你才会明白,这个红不是linux的红,所以和我们讨论的signal函数没有半毛钱关系。
》到底是干啥的
你觉得我应该细细的看你们的代码,放着自己的事不做? 你付给我工资?
回应@prife :
你除了说这些没营养的话,还会说什么?
我希望你能够从技术上来反击我。
实在是不能忍了。还得跳出来回复一下
-----------------------------------------------------------------------------------
2013-12-19 22:41:39 prife
那个宏的问题。
从名字上来看,如果有启动高层次的exception处理机制,则屏蔽到系统的信号处理函数。不知道这个解释满意否
---------------------------------------------------------------------------
不知道没营养的话谁说的多,怕是阁下吧,拜托你自己回头浏览下我们相互回复。看看每一次话题分叉都是谁在推动。
这绝壁是最后一条了,我已经对你的逻辑不能忍了。
》这个system一定是Linux? 不能是RTOS?不能是其他OS?这个世界除了Linux没别的了?
你不清楚你自己的代码是干什么的。 请参考我们讨论的这个文件的名字。
【这不是我的代码,这是FTK的代码。拜托你搞清楚。目前那个项目里还没有我一行提交。】
》不知道所谓的内核程序的结论从何而来
还是那就话, 你没有理解signal这个系统调用。
这个打住吧,按照你这个讨论说下去也没啥意思了。你也说不出啥来了。
》很多C库函数都调用了内核程序,都算内核程序?
你不知道什么是内核。
【这里明显属于拼写错误,原文如下】
FTK顶多算个中间件,不知道所谓的内核程序的结论从何而来。调用了内核系统调用就算内核程序? 很多C库函数都调用了内核程序,都算内核程序?
可见我想说的是【很多C库函数都调用了<系统调用>,都算内核程序?】。这也是很多装逼党人士的另一个讨厌之处,随便看看就开始吐槽。你真正搞清楚了别人的思路了么?这就开始给我按了一个不知道什么是内核的帽子了。我要是再打几个错别字,你就要说我不知道什么是编程了。
系统程序员是什么? system programmer。
>>你不能说的更具体些。
嵌入式系统不是系统,硬件系统不是系统?所有的系统都是Linux内核? 这是什么狗屎逻辑。
我感觉再扯皮下去你就要跟我讨论哲学问题了。
楼主在炫耀自己薪资水平的时候,我得勇敢的表示的确比我目前多。这一点你成功了。不过我表示,难道我之后到不了这个薪资水平?
那个宏的问题。
从名字上来看,如果有启动高层次的exception处理机制,则屏蔽到系统的信号处理函数。不知道这个解释满意否?
【我写过dos代码,写过windows代码,写过linux代码,写过bsd代码,写过macintoash代码。
我写过linux内核代码和bsd内核代码,linux内核arch目录下的mips/ppc/x86我都有写过。】
我也想问你的是,这些有毛用?我不过是模仿你装逼的方式回答你而已。
全是GCC是吧?顶多再来个llvm。还是没听说过armcc, IAR是吧。CL是vs底层编译器。
>装自己的逼,让没实力装逼的人去骂吧。
既然如此,楼主保重,希望你能在华为长久装下去。
我试着从你的认知角度来给你解释,确保我们两个在同一个认知层面来讨论问题。
装逼适合而止,是不是觉得自己知道的特别多,别人啥都不知道。。。
做内核研发的人的优越感从哪里来的?我表示十分费解。
不喷了,我还有很多bug要fix。我也有很多书要看。
最后给励志做嵌入式软件开发或者内核软件研发的同学们提一点个人建议。
1. 不要过分迷恋内核和驱动,这些东西没有你想象的那么复杂。不要自己吓唬自己。
2. 个人推荐的看书思路是:
Begining Linux Programming。 重点把后面6章看完。
然后APUE(Unix 环境高级编程)随便翻翻就成了,需要的时候再看即可
再然看最好配合《操作系统设计与实现》,配合《计算机体系结. 构量化研究方法》把处理器流水线部分、cache、TLB部分看懂。
内核,可以看《Linux内核源码情景分析》一本就够了,反复看。
如果不局限系统软件,无所谓是驱动还是中间件还是应用。那么去看
《算法导论》
《设计模式》
一本C++书籍
然后征战各大公司经典笔试题目吧。
再弄个github帐号,多参加几个开源项目,多写代码。
考虑进入游戏行业或者大公司,挣得钱比所谓系统程序员的多得多。
> 2013年成都华为内核研发工程师
华为成研所不做linux内核开发, 目前华为只在甚至自研os。
》但最终没有选择华为
这是个明知的选择, 恭喜你。
》请先保证搞清楚了那些宏的含义在来看为什么那么实现。
这个宏不是linux内核的宏,但是,signal是内核的系统调用。 终归你这里有问题。
》(前面你说的一大坨东西以及后面这句-->)有毛用?!
用处就是, 我能直接指出你用的不对的地方, 但是,你不能给我正当合理的理由来解释。
另外, 如果你在上海月薪不到20K,就不要乱指责别人装逼。
》还有告诉他们,装逼适可而止。
装自己的逼,让没实力装逼的人去骂吧。
很不幸,我拿到了2013年成都华为内核研发工程师的offer,但最终没有选择华为。所以就无缘拜见大神了。目前在上海某软件公司做机顶盒类安卓系统的framework层软件开发,属于内核之上,应用之下的系统中间件。挣的不多,在上海也就是勉强生活吧。
handler的问题,之前我就说过了,那个用宏包了起来。请先保证搞清楚了那些宏的含义在来看为什么那么实现。不要问我,我也还不了解。
>在说别人装逼时,要想调查清楚别人的背景。
“想喷作者的人想看看人家写的代码,你以为你看的这几本书人家没看过?掂量下自己的水平再吐嘈吧"
“当然我不是说这些书不重要。这些书固然很重要,但是别以为看了一本牛逼的书自己就牛逼了,就我自己的感触来说,除了用来装逼之外,意义实在有限,个人的编程水平不见得提升多少。
软件领域不缺高深、牛逼的神书,缺少的正是简单、基础、务实的【用心】之作。”
既然你这么喜欢举例子,我也举个例子送给。
A:一年级的数学课本好SB啊,渣的要命。
B:你都三年级了。。。
我写51、msp430、dsp2812/28335,arm cortex M3、M4、A8的代码,少量汇编+大量C。
我还开发过DVB数据广播(C++),OTALoader代码(C)
我写过python程序,它可以在windows/linux/mac/bsd/unix 上跑(有毛用?!)。
这本书我会推荐给每个我认识的那些半路出家的程序员们,告诉他们,linux内核一点也不神秘,这本书可以引导他们进入编程世界。接下来,只要边读书边读代码就可以了,最重要的是要多思考,多写。
还有告诉他们,装逼适可而止。
我试着从你的认知角度来给你解释,确保我们两个在同一个认知层面来讨论问题。
〉说的好像我没用过signal似的
将signal的handler注册为NULL,意味着OS接受到这个信号后不会将其分发到任何handler里面,意味着行为不可控,这对os是极其危险的。
〉OS是linux,编译器就托不了GCC?GCC也分64位的,32位的,51版、ARM版、MIPS版,另外,除了GCC还有armcc, IAR, CL
gcc是gnu的一个开源项目,它支持多个架构,包括arm/ppc/x86/mips等,这些架构代码均在gcc的machine子目录里。你所说的这些编译器都属于gcc的交叉编译链。
现在主流的编译器是gnu的gcc, apple的llvm-gcc, 以及微软的编译器(未开源,前两者均开源)。
〉估计这么多你可能编译器你可能都没用过,只用过GCC。
我制作过arm的交叉编译链, 是很特殊的一种,在业界没有使用的,所以我要自己制作,它是数据段大端代码段小端。
我写过dos代码,写过windows代码,写过linux代码,写过bsd代码,写过macintoash代码。
我写过linux内核代码和bsd内核代码,linux内核arch目录下的mips/ppc/x86我都有写过。
〉把你的代码贴出来给咱瞻仰一下吧
我在公司里写的代码请谅解我不能外传。
我自己因为生活需要在周末写过几行代码放到了github上:https://github.com/l
其中有一个是围棋打谱软件,另一个是任务管理程序。 代码量都较小。
〉我很期待你找点真正的bug出来。
请在看一遍我的那个故事。 我精力有限,我自信我一天挣的钱比你多,所以我不会在你的项目上投入时间。
〉扯淡,文件系统你看过么?
我fix过linux2.6内核的jffs2和yaffs2的代码。
楼上正搞笑,说的好像我没用过signal似的。
https://github.com/p
看看git log,就知道这是不是我写的。(这个代码也是有bug的,就看你能不能fix掉了)
把你的代码贴出来给咱瞻仰一下吧?就这个时间size_t究竟哪里引起bug了?我真的很好奇。
OS是linux,编译器就托不了GCC?GCC也分64位的,32位的,51版、ARM版、MIPS版,另外,除了GCC还有armcc, IAR, CL。(估计这么多你可能编译器你可能都没用过,只用过GCC。)
我很期待你找点真正的bug出来。
回应@prife:
A承包了一座山头,上面种满了树,B经过的时候说,这山头其实可以整地更好些,A就接着说"你有能耐你帮我整好啊!你要是把我的山头给我弄好了我就朝你树大拇指"。 B:....
>size_t 是要看编译器的。一般来说 size_t 的宽度是32或者64.
OS是linux, 编译器脱不了GCC。
〉时间会是负值么? long转size_t就不会有任何问题
很多弱智bug都是这种想当然。
〉signal注册了NULL,自然是不想使用系统的handler机制
你没有清楚signal这个系统调用。或者说不知道我在问什么。
我现在在上班, 忙里偷闲回复你一下。 劝你沉下心来先把基础打好。
楼主现身了,不错。
signal注册了NULL,自然是不想使用系统的handler机制。并且这个地方是有个宏
HAVE_EXECINFO_H
你先整明白这个宏是干啥的,然后再来吐槽。
最后那个return是否多余要看 _exit是怎么实现的,FTK除了支持Linux,还支持 RTOS,如ucos等。ucos上的_exit的行为是啥? 也麻烦想搞明白再说。
FTK有bug,这是毋庸置疑的,麻烦找点真正的槽点,然后发pull request出来。 咱们github见真章。
光说不练有毛用?有毛用?
我可以写个帖子 (草稿如下)
https://github.com/p
介绍了如何用qemu 模拟arm板子,然后buildroot制作linux rootfs,如何编译内核。最后移植ftk。
所以楼主还有楼上众多准大神们可以大展身手,fix bug了。
来吧,欢迎来一发。
无意去看ftk的代码逻辑,瞅了两眼和linux相关的一个文件ftk_linux.c, bug如下:
1.
size_t ftk_get_relative_time(void) // size_t 是unsigned类型
{
...
return now.tv_sec*1000 + now.tv_usec/1000; // 这里的类型是long
}
2.
static void signal_handler(int sig)
{
...
//猜测作者的本意是想只让这个handler进入一次。 这里将系统调用signal()的handler注册为NULL想必定有什么难言之隐,盼解释。
signal(SIGABRT, NULL);
signal(SIGSEGV, NULL);
signal(SIGILL, NULL);
_exit(0);
return; // 这里是多余的。
}
楼主已经楼上众多不装逼会死星人应该去看编译原理,操作系统设计与实现,深入Linux内核架构,程序语言设计,The art of proramming,具体数学等等
我觉得这样才能成大神,接受我等屁民膜拜。
还有某些推荐SICP的装逼党们,请问一下,你自己看完了么?习题做了多少?你公司的实际项目里用到了么?
软件开发需要看很多经典书不假,但从来没听说光看书就能成为大神。多读优秀代码,多写代码才是成就大神的不二王道。没听说Thompson,Jim boy看了上述任何一本书人家依然是大神(实际上人家牛逼的时候大部分你所谓的神书还没写出来)。
当然我不是说这些书不重要。这些书固然很重要,但是别以为看了一本牛逼的书自己就牛逼了,就我自己的感触来说,除了用来装逼之外,意义实在有限,个人的编程水平不见得提升多少。
软件领域不缺高深、牛逼的神书,缺少的正是简单、基础、务实的【用心】之作。
吐嘈完了,说点其他的,本书作者李先静的开源项目:ftk
http://code.google.c
想喷作者的人想看看人家写的代码,你以为你看的这几本书人家没看过?掂量下自己的水平再吐嘈吧
PS:ftk项目已经停滞了(据了解因为李身体原因),所以我在github上将这个项目fork了,准备用在公司的项目里。
https://github.com/p
欢迎楼上的准大神们前来发pull request。
@ laoar
个人拙见:作者自己也说了“这是写给应届生和业余爱好者的”,像mvc,重构,多态等软件开发中的入门性东西,软件行业本来就千丝万缕,想要看的深入那还不如看一些《linker and loaders》《com本质论》《重构》等,即使一千多页的比较入门的《Computer Systems: A Programmer's Perspective》也都达不到你的要求,本书本来就定义的是入门书,建议您去别的书里找您要的银弹