近期微博吐槽言论存档,涉及“性能优化”、C++陋习等

近期微吐槽博言论存档,涉及“性能优化”、C++陋习等

写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。前三个可能是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,现在还这么做就土了。C++的成员变量可用特殊命名格式,加下划线后缀即可(加下划线前缀是错的)。但在 Java 里不必模仿 C++ 的这种成员变量命名方式,IDE 可以让成员变量以不同的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把以前的编程经验不加区分地应用到新语言中,写成四不像,不地道。

知道禁用 copy-ctor/assign operator 是 C++ 程序员的试金石。在看到一个开源项目时,我一般会先查看其 RAII handle class 是否禁用了 copy-ctor/assign operator(例如 Thread、Mutex、CondVar、Connection),如果没有,对其第一印象就很差了。

关于 class 命名风格,Google、LLVM、Mozilla、muduo 都采用 Pascal 风格(LikeThis),例如 EventLoop、SudokuSolver 等等。正巧它们也都是用 2 格缩进的,可以用 clang-format 自动格式化代码。

顺便说说我不认同的两个 C++ 教条:1. 用nullptr替换NULL,2. 用cstdio头文件替换stdio.h。

因为例如 gettimeofday(&tv, NULL) 这种系统函数传个 nullptr 进去实在是违和,现在用 NULL 也能达到 nullptr 的好处,大不了在某个头文件里define一下就行。这条将来或许会变。

另外 ctime 头文件没定义 std::gmtime_r,而 time.h 定义了 ::gmtime_r。我可不想去背哪些函数是 C 语言的哪些是 Posix 的,哪些头文件是 C 语言的哪些是 Posix 的(在Linux下,二者基本不分家)。为了用几个系统函数(例如 fcntl() ),我该 include cfcntl 还是 fcntl.h?用线程是 cpthread 还是 pthread.h?我总是记不住 memset() 的参数顺序,因此一般用 bzero() 代替,但是 manpage 说 bzero() 声明于 strings.h,那我要不要考虑试试 cstrings 呢?何必给自己找麻烦,C++ 标准库之外的内容干脆统一用 .h 头文件好了。

性能优化?

有些人常常把“性能”挂在嘴边,而且其以“提高性能”为理由的“优化措施”往往不到点子上,只增加了复杂性和维护难度,降低了代码质量。这属于决策点找偏了。我发现初学者往往过分关注微观(语句级)性能,比方说关心 while(true) 和 for(;;) 哪个更快,++i 与 i=i+1 哪个更快,i/=16 和 i >>= 4 哪个快等等,而忽视了现代编译器的优化能力。

有的人谈性能优化,一是拿不出具体的合理的性能目标,只想越快越好,二是不能实际准确测量验证性能数据,凭感觉和过时经验行事。在编码的时候,遇到两种做法都可行,决策办法是凭感觉猜选“性能会更好”的一种,而忽视了其他更重要的因素。可读性和性能的典型关系如下图,有多少场合是值得为了性能而牺牲代码的可读性和可维护性呢?我希望自己的代码位于第 3 区,而一些人以为自己的代码是在第 4 区,其实是在第 1 区。

read-perf

能在第 4 区写代码的人属于凤毛麟角,有时候你费劲优化了半天,结果新CPU加了几条指令,直接在硬件层面把问题解决了。现在一些人动不动就要挽起袖子自己写内存池,号称能提高性能,真当 Ulrich Drepper 是水货?(书第 12.2.8 节“有必要自行定制内存分配器吗”)你打算如何测试内存分配器(malloc)的性能?有哪些指标?有哪些影响因素需要控制或模拟(比如线程数)?你的测试结果是否反映实际场景?

杂项

有人问为什么我说“poco不是服务端C++网络库”( http://www.oschina.net/question/12_120943 ),虽然它也提供了reactor?因为它的reactor用的是 Socket::select(),虽然后者包装了epoll,但看其实现就知道,它每次调用都会创建并销毁 epoll fd,然后重建整个watch list,没有哪个服务端网络库会这么做。

嗯,世界上有两种网络编程:网络编程和Windows网络编程。

阅读更多
换一批

C++之父B. Stroustrup近期言论(转载)

08-06

C++之父B. Stroustrup近期言论rn 翻译者 : myanrn [译者按] Bjarne Stroustrup博士,1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责人,AT&T、贝尔实验室和ACM成员。1979年,B. S开始开发一种语言,当时称为“C with Class”,后来演化为C++。1998年,ANSI/ISO C++标准建立,同年,B. S推出了其经典著作The C++ Programming Language的第三版。C++的标准化标志着B. S博士倾20年心血的伟大构想终于实现。但是,计算技术的发展一日千里,就在几年前人们还猜想C++最终将一统天下,然而随着Internet的爆炸性增长,类似Java、C#等新的、现代感十足的语言咄咄逼人,各种Script语言更是如雨后春笋纷纷涌现。在这种情况下,人们不禁有些惶恐不安。C++是不是已经过时了呢?其前景如何?标准C++有怎样的意义?应该如何学习?我们不妨看看B. S对这些问题的思考。以下文字是译者从Stroustrup1998年之后发表的若干文章、谈话笔记中精选出来的,由于出处不一,内容多有重复。为保持完整,亦一并译出。以下内容选自B. S在自己主页上发表的FAQ。.rn1、请谈谈C++书。rn没有,也不可能有一本书对于所有人来说都是最好的。不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的<The C++ Programming Language>, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立于平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这本书的重点在于概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什么C++会变成今天的模样,我的另一本书<The Design and Evolution of C++> 能给你满意的答案。理解设计的原则和限制能帮助你写出更好的程序。www.accu.com是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。rn2. 学习C++要花多长时间?rn这要看你说的“学习”是什么意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。那么是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这么长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻的变革,那又何苦呢?和成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的、不同的语言和编程风格还算是简单的。rn3. 了解C是学习C++的先决条件吗?rn否!C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。rn4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk?rn否。如果你想学Smalltalk,尽管去学。这种语言很有趣,而且学习新东西总是一个好主意。但是Smalltalk不是C++,而且把Smalltalk的编程风格用在C++里不会有什么好结果。如果你想成为一个出色的C++程序员,而且也没有几个月的时间百无聊赖,请你集中力量学好C++以及其背后的思想。rn5. 我如何开始学习C++?rn这取决于你的基础和学习动机。如果你是个初学者,我想你最好找个有经验的程序员来帮助你,要不然你在学习和实践中不可避免的犯下的种种错误会大大地打击你的积极性。另外,即使你的编译器配备了充足的文档资料,一本C++书籍也永远是必不可少的,毕竟文档资料不是学习编程思想的好教材。选择书籍时,务必注意该书是不是从一开始就讲授标准C++,并且矢志不渝地使用标准库机制。例如,从输入中读取一个字符串应该是这样的:rnstring s; // Standard C++ stylerncin >> s;rn而不是这样的:rnchar s[MAX]; /* Standard C style */rnscanf("%s",s);rn去看看那些扎实的C++程序员们推荐的书吧。记住,没有哪本书对所有人来说都是最好的。另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意义。(遗憾的是,目前在市面上的中文C++教材中,符合B. S的这个标准的可以说一本都没有,大家只好到网上找一些英文的资料来学习了。——译者)rn6. 怎样改进我的C++程序?rn不好说,这取决于你是怎么使用该语言的。大多数人低估了抽象类和模板的价值,反过来却肆无忌惮地使用造型机制(cast)和宏。这方面可以看看我的文章和书。抽象类和和模板的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们作为接口提供了简洁的、逻辑性的服务表示机制。rn7. 语言的选择是不是很重要?rn是,但也别指望奇迹。很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎所有问题,他们不断地去寻找完美的编程语言,然后一次次的失败,一次次的沮丧。另外一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上,他们永远都在用着COBOL, C和一些专有语言。一种优秀的语言,例如C++,能帮助设计者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。rn8. ANSI/ISO标准委员会是不是糟蹋了C++?rn当然不是!他们(我们)的工作很出色。你可以在一些细节上找些歪理来挑刺,但我个人对于这种语言以及新的标准库可是欣欣然。ISO C++较之C++的以前版本更出色更有条理。相对于标准化过程刚刚开始之初,你今天可以写出更优雅、更易于维护的C++程序。新的标准库也是一份真正的大礼。由于标准库提供了strings, lists, vectors, maps以及作用于其上的基本算法,使用C++的方式已经发生了巨大的变化。rn9. 你现在有没有想删除一些C++特性?rn没有,真的。问这些问题的人大概是希望我回答下面特性中的一个:多继承、异常、模板和RTTI。但是没有它们,C++就是不完整的。在过去的N年中,我已经反复考虑过它们的设计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。rn从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集,但又不能把它去掉,因为那样对于在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序员们至今受益良多。但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格中解脱出来。例如,使用标准库里的容器类,像vector, list, map, string等等,可以避免与底层的指针操作技巧混战不休。rn10. 如果不必和C兼容,你所创造的语言是不是就会是Java?rn不是,差得远。如果人们非要拿C++和Java来做比较,我建议他们去阅读<The Design and Evolution of C++>,看看C++为什么是今天这个样子,用我在设计C++时遵从的原则来检验这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按:我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的语法,与Smalltalk相似的语义,所以可以说Java与C++是貌合神离,与Smalltalk才是心有灵犀)。Java语言相对简单,这部分是一种错觉,部分是因为这种语言还不完整。随着时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路。随便分析一种你认为在很大范围内取得了成功的语言,我知道肯定是无有例外者,而且实际上这非常有道理。rn上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强对于固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要做很多小的改动,大部分是扩展。1998年秋,我从James Gosling(Java语言的创始人——译者)那里得到一份建议书,说是要在Java中增加固有类型、操作符重载以及数学计算支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的How Java’s Floating-Point Hurts Everyone Everywhere(“且看Java的浮点运算如何危害了普天下的芸芸众生”——译者),揭露了Java的一些秘密。我发现在电视和出版物中关于Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫嚣凡是非Java的代码都是垃圾,这是对程序员的侮辱;建议把所有的保留代码都用Java重写,这是丧心病狂,既不现实也不负责任。Sun和他的追随者似乎觉得为了对付微软罪恶的“帝国时代”,就必须如此自吹自擂。但是侮辱和欺诈只会把那些喜欢使用不同编程语言的程序员逼到微软阵营里去。rnJava并非平台无关,它本身就是平台。跟Windows一样,它也是一个专有的商业平台。也就是说,你可以为Windows/Intel编写代码,也可以为Java/JVM编写代码,在任何一种情况下,你都是在为一个属于某个公司的平台写代码,这些代码都是与该公司的商业利益扯在一起的。当然你可以使用任何一种语言,结合操作系统的机制来编写可供JVM执行的程序,但是JVM之类的东西是强烈地偏向于Java语言的。它一点也不像是通用的、公平的、语言中立的VM/OS。rn私下里,我会坚持使用可移植的C++作大部分工作,用不同的语言作余下的工作。(“Java is not platform-independent, it is the platform”,B. S的这句评语对于C++用户有着很大的影响,译者在国外的几个新闻组里看到,有些C++高手甚至把这句话作为自己的签名档,以表明对Java的态度和誓死捍卫C++的决心。实际上有很多程序员不光是把自己喜爱的语言当成一种工具,更当成一种信仰。——译者)rn11. 您怎么看待C#语言?rn就C#语言本身我没什么好说的。想让我相信这个世界还需要另外一个专有的语言可不是一件容易的事,而且这个语言还是专门针对0

吐槽近期面试 (.NET 上海 )

08-30

目前本人还在职(税后7.5K 包中餐 五险一金),10年4月份正式毕业参加工作。目前公司项目后期基本全是维护,而且是很少维护,所以,选择离职。(在那就是打酱油,为了以后着想可不能这么颓废了)。rnrn第一个公司:外包公司,没投他们简历,让我去盛大面试,然后过去了,一堆题做完后,和他们的技术人员谈了,感觉OK,回来后那外包公司就开始给我打电话让过去上班了,要的是税前 8.5K(13薪) + 五险一金 rnrn第二个公司:貌似叫什么南京邦臣,我投的都是那种大雨50人的公司,真的被小公司坑怕了。当然不排除有些小公司的制度和发展比较好,但是很少。没想到这个公司去了,一共才5个人,面试问的问题都回答完了,他们的主管问我要多少钱,由于我压根不想在那呆,就直接少了9K,想他们肯定也开不出来,所以....大家懂得。rnrn第三个公司:宝山区那边的一个叫斑马物联网的,面试的题目是那种思想题,问的都是一些比较男的概念,楼主基本悲剧了,然后他们一个小技术员过来面试一些一堆基本的.NET知识,大部分回答完毕,问到工资,楼主说税后 7.5K 不过可以根据公司福利增减. 然后就没有然后了。rnrn第四个公司:和他们在一层楼上,叫什么坤拓洗涤什么的,一个盛大工作5年的老员工面试,基本的ASP.NET方面的问题都回答完了,还有SQL上的,他丫的问我手机端开发啊,这个楼主真心不会,然后他就让我见人事。这个楼主必须要说下了,这个小人事看起来也就23 ,4 岁左右,那个屌啊,眼皮连看都没看我下,楼主依然要的是 7.5K 当然如果他能说出公司的状况或者福利,我可以接受下调,逼近这两家公司离我住的地方比较近。结果他回头和他的老板商量下和我说,他们是创业型公司,给不出这么多。楼主再次悲剧。rnrnrn第五个公司:上海鹏达,这个公司楼主特意查了一下,07年左右就有同行在网上吐槽这个公司了,这个公司是做教育放面的,而且也很有技术含量,相信去了也会有很大的提升,但是网上说他们的管理不怎么样。说下去了的感受吧,首先过去前台妹子很不专业,居然在那和一个男同事打闹调皮,给我拿笔试题居然还少拿一张。rn第二,做完题,11点钟,肚子饿的咕噜咕噜的,他们倒是去吃饭,叫外卖了,我和另外一个面试的就在那等啊,等了40分钟,楼主忍不住,出去吃饭去了。回来了,一个貌似主管的人和我谈了基本情况。然后就是一个技术人员过来和我问问题,而且很专业,面部无任何表情,我就感觉是一个机器在问我。问的倒是一些比较使用的,项目中会遇到的。比一些其他装B公司好很多。后来问道待遇,楼主说了和盛大那边一样的要求,然后就没有然后了。rnrnrn第六个公司:上海珍岛,这个公司在上海也算比较大的IT公司,可是坑爹的是面试我的那家伙,首先他们没有题目,面试我的家伙估计年龄也就24岁左右,看着很不成熟,进来后,拿着我的简历让我做自我介绍,然后说,你丫好像简历上没啥闪光点吗?我靠,你们发布的职位信息基本就那些,简历上的内容你们难道面试前不看?后来聊着聊着那家伙说他是 产品经理兼技术主管,好吧,这家伙很牛逼,至少比我牛逼,这么小年龄做技术主管了。没什么话说了,楼主走人。rnrnrn第七个公司:上海邦泰医院管理投资. 和他们的技术人员聊了一下,居他说对我非常满意,然后他去找他的主管,刚好出去了。回来和我说,他们公司招我目前就我一个做.NET的,其他都是PHP。唉...后面的不想说了,一个人做,能有多大提升,而且并不是专业的软件公司,估计也是维护一些他们平时用的系统。rnrn第八个公司:上海天凰国际,去了后,等了半个小时,一个帅哥带着我去见了他们的技术,问了一些很实际的问题,楼主基本都回答完了,很是满意,然后他去找人事。人事是个妹子,很老套的问我什么职业发展,什么未来规划,我规划你妹啊!然后,说你结婚了,那我们公司可能以后要经常加班你妻子会有意见怎么办,我说公司需要,我老婆会理解我的。然后她就一直纠结这个问题不放,大概意思我结婚了,没法加班,如果加班会有家庭矛盾。我那个X啊,尼玛你一个公司难道一个结婚的员工都没有,再说你他妈让我加班你还有理了。。。。rnrnrn总结:反正很操蛋,楼主不说自己技术多牛逼,技术不行工资可以少给,可是尼玛问一堆和以后项目不相关的技术问题就证明你们公司很牛逼了?就像开始一个公司问我AJAX调用WCF,楼主给他做了个例子,然后搞笑了,我问他如果我过来做什么,用到哪些技术,结果没有WCF相关的,连WebService都没用到,真心搞不懂这些人为啥都喜欢这么搞,其次,就是人事,有的时候和技术人员面试的很好,感觉很聊得来,一到人事哪里,尼玛立即就感觉你丫还是滚蛋吧,我们不需要你,或者你丫工资要这么高,你也配?rnrnrn好吧就说这么多,楼主知道自己也有缺点,欢迎大家指出。

没有更多推荐了,返回首页