- 相关推荐
程序员面试宝典及攻略
猛批烂书 程序员面试宝典 上
最近看到一本烂书,本来忽略过去就是了,可惜这本烂书还挺流行,为了阻止它继续误人子弟,我不得不花点时间出来,猛批此书,请大家不要上当,买了此书的赶快销毁不要扔掉,以免别人捡去上当,打算买的先来看看我的意见再做决定,把此书借给别人的赶快要回来销毁,从别人那里借了此书的赶快还回并且告诉人家我的意见。
我自己在面试和被面试上都有一些经验,在本文最后,我会给出自己在这方面的建议,希望能对大家有所帮助,尤其是那些因为我的文章而放弃了这本烂书的同学,我希望我的建议能填补你这方面的需要。
烂书的书名
中文名:程序员面试宝典
英文名:BEST PRACTICE FOR PROGRAMMER INTERVIEW
(小沈阳:我的中文名字是 小沈阳,英文名字是 Xiao Shen Yang)
烂的原因
这本书的目的是赚钱,完全不是为了提高大家的面试笔试水平,所以出现下面的情况,也是理所当然的了:首先,这本书名字起的好,营销也做的好,否则不会这么流行;可惜内容不好,属于有能力没道德类型的坏人,能力越大,破坏越大。其次,这本书基本上是以一种应对考试的方式来应对找工作的笔试和面试,刚刚从学校出来的同学们正是考试的好手,如果还以这种心态来应对笔试面试后果是很不妙的。最后,这本书当中讲解的东西大部分基础简单的内容都是对的,比较高级的内容偏偏是错的,属于隐蔽的很深的坏人,倒霉了还不知道是谁干的,最坏。
这本书我随便翻了翻,几乎气死,哪里有这样介绍东西的?自己都是一知半解,就来编制宝典,真个是以己之昏昏明人之昭昭啊。还忽悠那么多刚刚或者即将步出校门的同学从微薄的生活费里挤出三十九块钱买来上当。编书的赚到钱了,同学们找不到工作他们可不管本来我也不用管,可是我的女朋友也在找工作,也买了这本烂书(可以吃多少个排骨啊!),我就不能不管了!
下面,我会把这本书当中的错误、混乱、语无伦次、蒙混过关之处,只选择我随便翻翻出来的一小部分罗列出来,让大家看看这本书的真面目是如何的烂。这并不是说这本书就只有我列出来的这些问题,还有更多我看到了没有写(没功夫,也不想把他们教聪明了),更多更多的是我没发现的。另外,我个人只对C/C++/STL有深入的认识,所以,我也只对这方面揭批一下,请对其他方面精通的好同志在其他地方揭批其他方面,也请精通C/C++/STL的好同志对我的错误不吝赐教。
烂的方面
对第六章到第九章,我随手翻了翻,第十章我看的比较仔细,因为我对C++面向对象很感兴趣。后面的,由于第十章里面错误太多,我没有看以免气到自己(很多地方写的,态度非常成问题!完全是在敷衍,我真怀疑他们写这么一厚本书花的心思,有没有我写这篇短文的心思多?)
6.4 内联函数和宏定义,在这一个小节当中的问题如下:
首先,这个小节的写作态度不认真水平很马虎:这个小节大概是在网上搜了搜关于inline和宏就写完了,所以只是语无伦次的介绍了基本概念,但是没有涉及任何高级特性他们绝对不是为了避免读者无法理解而不涉及高级特性的,而是他们自己不懂,否则的话,我不相信这帮人会不抓紧卖弄一下自己的“学识”。如果你想知道这个小节有多垃圾,就去看看msdn上关于inline的介绍,或者TPCL当中对inline的介绍就可以了。
其次,罗嗦得语无伦次且不着重点:内联函数和宏定义的区别,大概只要几句话就可以说清楚,这本书用了几段话反而说糊涂了,而且最重要的一句话,没说(参见第五)。
第三,把清楚的解释糊涂了:原文当中有这样一句“对于短小的代码来说,inline可以带来一定的效率提升,而且和C时代的宏函数相比,inline更安全可靠。可是这个是以增加空间消耗为代价的。”按照这两句话的意思,inline增加空间消耗换来的是比宏更加安全?知道的自然明白是书上漏了一句话,不知道这不就被蒙了?读烂书还是马虎点好,不是被蒙就是被气。实际情况是,inline增加空间消耗换来的是效率提高,这方面和宏是一模一样的,但是inline在和宏相比没有付出任何额外代价的情况下更安全。
第四、例子像浆糊一样,注释像例子一样:唯一的一个例子,我不厌其烦的抄录如下、
inline fac(float i) {return i * i};//没有写返回值
printf("bb = %d", fact(8));//调用时就是执行printf("bb = %d", 8 * 8);
这个例子和其中的注释,想说明什么问题?能说明什么问题?
我估计,想说明的问题是inline和宏一样可以展开,但是那个自作聪明的注释,实在费解,干嘛不写返回值?在华为这样写函数连看门的大爷都会上来鄙视一下,这本书里还当例子拿出来。我估计写这个例子的作者,根本不知道如果一个函数不写返回值的话编译器是如何处理的(本科二年级C语言80分以上的都应该知道),他的意图是向读者展示inline函数确实仅仅是扩展开,即使没有返回值也没有关系,因为inline函数仅仅扩展开就可以了,不需要返回值他的意图完全错误。而且,调用时候执行的根本不可能是注释当中写的那样,也根本不是例子里面展示的那样会展开,具体如何,请看第五条罪状。
第五、inlinle函数最重要的一个特性没有说到:这个特性是什么?请你自己先写一个程序(或者复制我的):
#include
inline int fact(int i) { return i * i;}
int main()
{
printf("%d", fact(8));
}
把这个程序在VS2003当中编译一下,然后分别在Debug和Release模式下进行调试,断点放在printf那一行,程序暂停以后点击右键,选择“Go to disassemlby”,进入到汇编码,在Debug模式下,你会看到这样的情况:、
printf("%d", fac(8));
00411D3E push 8
00411D40 call fact (41168Bh)
00411D45 add esp,4
00411D48 push eax
00411D49 push offset string "%d" (42B01Ch)
00411D4E call @ILT+1500(_printf) (4115E1h)
00411D53 add esp,8
在release下你会看到这样的情况:
printf("%d", fac(8));
00401000 push 40h
00401002 push offset string "%d" (4060FCh)
00401007 call printf (401012h)
0040100C add esp,8
如果你还没有体会出来,提示一下,在debug模式下有一个call fact,fact?怎么那个inline函数被调用了?不是说展开么?但是在release模式下,你看到8 * 8了没?只有一个40h,把这个十六进制的数字换算成十进制同样,为什么也没有展开呢?总之,是没有按照那本书例子当中注释说的执行,为什么呢?
原因在msdn里说的很清楚:The ion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. 编译器只在计算之后认为值得的时候才会扩展inline函数。
这么小一个知识点就能犯这么多错误,也只有这本烂书能做到了。
7.1节 面试例题3
这只是一道例题,但是非常典型的展示了这本书是如何的避重就轻的解释问题和作者自己的C++真实水平。题目如下:
Which of the following is NOT true about the "this" pointer of class X?
A. It lets each object of class X to access its address. (让X类的每一个对象指向它的地址)
B. It will be implicitly passed as argument of every non-static member function of class X. (可以隐性传递this指针)
C. It can not be used explicitly in memeber function of class X. (不能在类的成员函数里明确的声明)
D. Its type is const X* in const member function of class X. (它是常量函数中的一个常量指针)
答案是C,原书的解释我就不抄了,仅仅解释了this的用法,还给出了一段完全不着调的例程,对于问题当中考察的四个要点,都没有介绍原因,仅仅解释了一下this的用法,就算解析完成了?这和告诉读者,this指针的拼写是t-h-i-s有什么区别?这还不是最大的问题。
最大的问题在于添加的那些翻译,这些翻译是书的作者添加的,不是我加的。如果对着那些翻译,你能选出C来吗?ACD都可以选,B之所以不选是因为不知所云。我来给个翻译:
A. this指针让X类的对象能够访问自己的地址(关键点:every和each的区别,access的词义)
B. this指针会被隐性的当作一个参数传递给X类的每一个非静态函数(关键点:翻译以前要看懂原文)
C. this指针不能在X类的成员函数里显式声明(关键点:恰当使用专业术语,汉语可以没有宾语但是不能没有主语)
D. 在X类的经过const修饰的成员函数里,this指针的类型是const X*(关键点:翻译以前不可以误解原文)
想到6.4节里那个莫名其妙的注释,这里出现歪曲原意的翻译也是很自然的了,这帮人莫非是用金山快译翻译的?还是盗版的?
8.1节 面试例题1
这个题目给出了一个计算阶乘的例子程序,是错的,首先编译无法通过,有语法错误;其次逻辑有错误,没人能预料到它的输出是什么;最后编码风格很烂,这样写代码的人,只能去此书编辑部上班,其他公司都不会要的总之错的我很无语,这还是示例,我看这是典型错误示例还差不多!写出这样程序的人,需要回炉重造,从if-else开始重学四年编程再说;而把这样程序当例子做示范的人么,只能去编书,对,就是编一本英文名字是“BEST PRACTICE FOR PROGRAMMER INTERVIEW”的书。
来吧,买书了的请把书翻到83页,看“答案”两个字下面的东西;没书的看这里,我抄上来了:
int n,t;
int find(int n);
{
if (n=1) t=1;
else
{
return find (n-1) * n;
}
}
main()
{
cin >> n;
find(n);
printf('N!=', t:1:0)
【程序员面试宝典及攻略】相关文章:
程序员面试宝典07-09
程序员笔试面试宝典07-13
面试宝典07-13
unity 面试宝典07-11
高效面试技巧宝典06-23
面试攻略之面试心理攻略07-11
职场女性英语面试宝典06-29
英语面试宝典在校表现06-29
英语面试宝典求职理由06-29
职场攻略宝典:工作中如何调整心态07-12