孟岩的一篇文章打击到我学C++的兴致了

war10811 2010-10-06 09:30:22
原文如下:
地址:http://blog.csdn.net/myan/archive/2010/09/14/5884695.aspx
这几天写了两篇博客,很多老朋友关切,问了一些问题。

比如说,怎么又有时间关心技术了?是不是没那么忙了?我说,其实一样的忙,只不过兴致所致,牺牲一些休息时间罢了。说不定一个猛子扎下去,又是长时间潜水。

再比如说,怎么还在搞C++?我说,我没搞C++,一直以来都是C++在搞我们,我只不过发表一点被搞以后的感想。

有人问,你要讲的那三个C++特性,网上资料一大堆,你就免了吧。我说,如果我有时间,我会写的跟网上所有人的写法都不一样。比如说,讲 function/bind/lambda/closure,我会从 callback 讲起,回顾一下 C++中的 virtual function和成员函数指针,MFC中的message mapping,Borland C++Builder中的event handling,WTL的 CRTP 模拟虚函数,然后谈谈为什么 Java 需要加入 inner class,为什么C#把 delegate 作为first class citizen,以及 Qt 是如何用 meta-object 系统打造出迄今为止C++最漂亮的GUI框架,以及所有以上一切,在简单的 C 前是多么的多余和废柴。比如说,如果讲 rvalue reference,我会从孤魂野鬼似的匿名临时对象讲起,从 const T&,讲到 RVO/NRVO,说不定还会触及 expression template。

但是,我知道我没那么多时间来把这些东西都写下来,写下来也用处不大。这些东西已经不是今天技术的主流。“why”现在越来越不重要,“how”压倒一切。

“既然如此,你怎么还在鼓吹C++的那些奇技淫巧?你没看到C++已经越来越边缘了吗?”

这个,得容我自辨几句。

首先,我现在只有在业余时间看看技术,所以当然选自己最熟悉的领域。

其次,我不认为C++就没有用武之地了。C++会长期存在下去,而且在一些特殊的领域里仍然充当主角。比如,我们不应该小看 Qt 在移动开发中的发展空间,而在一系列我称之为“对抗性应用”的领域,C++还将占据优势,直到出现真正的替代者——肯定不是D,比较有希望的是Go。只是希望Rob Pike老人家坚持到底,不要跟当年plan 9一样,easy come easy go.

第三,最重要的,我鼓吹的不是奇技淫巧。相反,我可能比那些没学过C++或者被C++难倒的人都更讨厌C++中那些奇技淫巧,因为它曾浪费了我大量的时间、精力和热情。

为了讲清楚这个问题,我得谈谈C++的风格,这个老掉牙的话题。

上周末跟老朋友聚会,谈到技术的时候,有一个共识,软件开发方面真正有价值的进步,应当是有利于用户、有利于项目管理、有利于解决领域问题,而不是有利于程序员。多年以来,主流语言和系统的很多改进,其目的都是为了让写程序的人感觉更爽,而与用户、管理和解决问题毫无关系。C++在这方面是带了一个很坏的头,又要追求强大的表达能力,又要追求不打折扣的效率,结果搞出一大堆诸如操作符重载,template meta-programming之类的东西。老实讲,我也觉得:

Matrix4f a, b, c; c = a * (b – a);

要比:

Matrix4f a, b, c; c = a.mul(b.sub(a));

更清爽,但是就算是第二种形式,又能怎么样呢?无非多敲几个字而已,能有多大不了的事?哪个合格的程序员敢说无法理解?可为了让程序员的视觉更清爽一点,C++花了n年时间,弄出来一大堆奇技淫巧,再与之前之后诸多特性相互干扰,复杂度成倍增加,

有人可能会跳出来反驳说,如果表达能力不重要,那么你干脆回去写汇编好了。

所以我得把话说全了。程序的表达能力,只有在反映了其抽象能力的提高时,才是重要的,否则就是自娱自乐。

抽象是程序开发的全部意义所在。之所以C比汇编是一个伟大的进步,是因为C建立了一个机器抽象,把诸如寄存器、cache、寻址方式、位对齐之类的细节都透明掉了,由此而带来的表达能力提升,当然是伟大的。但是你看看上面我举的那个例子,有抽象层次的提升吗?没有!有的只是YY暗爽值的提升。这种表达能力提升,如果得来全不费工夫,当然也无伤大雅,如果是呕心沥血,伤人一万,自损三千,窃以为大可不必也。

软件搞了60年,我认为真正被实践证明了的抽象,一共有四个半,分别是:

1. 机器抽象,或者称语言抽象,构造一台新的计算机或程序语言,使其能理解领域特定的语言,从而最妥帖地解决问题。这是最有力的抽象,是软件开发中的“火箭科技”。

2. 过程抽象,把一件事情看成是一系列嵌套和串接执行的标准化过程的总和,就像流水线一样。这是极为有力的抽象,因此C语言无所不能。但是层次偏低,规模增大以后带来一些挑战。

3. 函数抽象,最玄妙的一种,这个我不多说,有兴趣的去看 Structure and Interpretation of Computer Programs.

4. 面向对象抽象,把一件事情看成是一组各负其责的对象彼此之间相互收发消息,根据消息相互协作完成工作的过程。这个抽象也极为有力。

4.5 僵化的面向对象抽象,把世界看成是由层次分明、庞杂万端的类型体系“实例化”而出的对象组成的,把事情看成是这些对象之间互相收发消息、协作而成的过程。

问题出在这最后一个抽象上。由于面向对象早期的主要应用场合是 GUI 和仿真,是特别适合于建立类型体系的应用领域,结果人们误以为这种抽象模型可以应用于所有领域。成长于这个时期的C++受了这种思想的毒害,建立了一个极其严苛、吹毛求疵的类型系统,自以为这样可以在编译时发现更多错误,没想到其结果是在编码时和运行时引起更多麻烦。动态面向对象语言的实践已经证明,所谓没有严格的类型检查就无法有效地发现错误这一说法,在今天这个时代已经不符合实际了。

事实上,后来的实践表明,拿静态的类型系统去套多姿多彩、变化万千的现实世界,纯粹是人类的狂妄自大。除了在少数几个完全是人造出来的领域(典型的就是GUI,什么窗口、控件、菜单…,完全是人自造的)还是可以的,在很多其他领域则是无力的。所以只能算半个抽象。

C++就是被这个半吊子抽象所害,以至今天,积重难返。至于用template泛型去放松类型的约束,实属亡羊补牢。template可谓毁誉参半,其中的精妙之处固然令人激赏,其中诡异无聊之处也令人愤懑。现在boost和其他一些C++库之中,把template舞得虎虎生风,我也不知道抽象到几天云外去了,但是仔细看来,往往是自取其乐,跟实际效果并无干系,反而有碍管理与交流。

无论如何,C++已经走到了今天。作为一个提供了较强抽象能力,同时性能又不打折扣的语言,还是不失其地位。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/myan/archive/2010/09/14/5884695.aspx
...全文
2047 85 打赏 收藏 转发到动态 举报
写回复
用AI写文章
85 条回复
切换为时间正序
请发表友善的回复…
发表回复
progneo 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yutaooo 的回复:]
我认为,学C++一定要有个狂热期,而且狂热期一定要经快度过。最好是短阶段,高频率的,结合其它技术,时常高潮一下。。。协同推进,整体上升。尤其控制C++不要成为特别突兀的长板。

我发觉处于C++狂热期的朋友都会忽略,要解决问题其实需要完整的计算机科学,而不是计算机语言。然而,这两者通常都会被混淆。C++是非常非常庞大的语言,这个狂热期往往是一旦开始就不结束了。一个人的精力有限,哪里经的住这样折……
[/Quote]

强烈赞同
xflyrmiss 2010-10-10
  • 打赏
  • 举报
回复
没理解的这么透彻,不过感觉c++还是用的很多的
芳草天 2010-10-09
  • 打赏
  • 举报
回复
特性这东西,有必要时再用就好了。运算符重载,我都是尽量避免的。。除非用函数会让人很眼花。
蔡袅 2010-10-09
  • 打赏
  • 举报
回复
没学精,怎么知道有没有用?
cunsh 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 88 楼 a87222466 的回复:]
【∏。。、′上〈海‖静·∥安。‖小·姐‖上‖门—服‖务‖信‖息‖家‖政‖服‖务‖
[/Quote]

哈哈. csdn 真成床上等你缩写了?
cunsh 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 zhao4zhong1 的回复:]
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
[/Quote]

哪怕一行. 只要能用c++的我是不会用c的.
我觉得c太不自动化了. 而且纯手工的代码是非常不保险的.
光宇广贞 2010-10-08
  • 打赏
  • 举报
回复
我们都是一颗星……
cunsh 2010-10-08
  • 打赏
  • 举报
回复
如果说c++和中文都是语言. 就拿中文打比方.
模版等奇技淫巧就像是文言文. 学起来复杂. 写出来优雅.
显然是没有白话文实用.
湛卢VV 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hikaliv 的回复:]
深有同感……感觉语言发展到深了……很多东西变成了鸡肋。很多时候看到别人在一些奇巧方面手舞足蹈,心里痒痒,但真当拿到自己手里之后,又毫无了兴趣。彻头彻尾的鸡肋。我对 C++ 知之甚少,但依然不影响我的使用和开发。就好像我不必熟诵四书五经唐诗宋词,也并不影响我这一生在生活中对汉语的日常使用一样。
[/Quote]
是啊 说的好。。。。。。。。。。。有些东西是与自己关系不大的。。。。也不靠它吃饭。。
yshuise 2010-10-08
  • 打赏
  • 举报
回复
一个人想要取得成功是不那么容易的,c++也是。
c++能够成功的关键是在于其使用是否广泛?
而其广泛的根本原因就是在于其是否被大多数企业运用在项目当中?
而能否运用在项目当中的原因是各方面的权衡结果。
比如:其复杂性与java相比如何?他的库和java相比是否丰富?他的效率同java相比?以及现有的技术积累是java好还是c++好?等等各种因素。

如果选定了c++,而不是java这门语言的情况下,那么讨论的应该是c++,而不是java。
究竟在使用c++到什么程度,那是根据部门的技术情况决定的。不是说部门c++水平很好,偏要只能用面向对象,不准用泛型,这显然是不正确的。
boost库的使用我想还是给人提供一个可靠,方便的库。其接口使用根本算不上什么难,只要读一下文档或是手册即可。至于说实现这样的功能采用了复杂的技术,也许这是可以避免的,但是为什么不用其他的技术呢?不用c语言来封装呢?这说明这些复杂技术的必要性。我想这也是权衡利弊的结果。比如c语言的面向对象看起来就极为笨拙,不如c++简洁。java库不提供源码,windows API不提供源码,我们没有选择的余地,觉得顺其自然,很合理;而c++的stl,boost提供了源码,反而不安起来了,怀疑boost掌控不了,生怕闹出什么大乱子来?而只要读一读其源码,不仅能提高自己对c++的认识,还能提高技术水平。觉得这就是样的,自己能胜任的,不是不可战胜的,我还可以做得更好的。等等。谨慎固然是好品格,有胆量更值得称道。
look_back 2010-10-08
  • 打赏
  • 举报
回复
发不成吗?在试一下、、
你好小菜 2010-10-08
  • 打赏
  • 举报
回复
有道理。。那难道我转行么
光宇广贞 2010-10-08
  • 打赏
  • 举报
回复
64 楼呢?没有了?
你好小菜 2010-10-08
  • 打赏
  • 举报
回复
唉 。。。回帖 拿分
小峰 2010-10-08
  • 打赏
  • 举报
回复
君子尚非异也,而善假于物也。

什么C++ ,D++,都是浮云。

事在人为,只要能抓老鼠的就是好猫,管他C猫,D猫。
小峰 2010-10-08
  • 打赏
  • 举报
回复
君子尚非异也,而善假于物也。

什么C++ ,D++,都是浮云。

事在人为,只要能抓老鼠的就是好猫,管他C猫,D猫。
光宇广贞 2010-10-08
  • 打赏
  • 举报
回复
某一种语言的发展,无非是为了证明两个方面:1、你看,我也能这么做。2、你看,我还能这么做。前者是为了追赶,后者是为了超越。

C++ 在自身标准远远落后于时代的情况下,靠自身的体质追赶时代前沿,这本身就是它无敌的地方。很多语言没有平台和标准的进化和支撑,就只能原地踏步,或者成为废物,C++ 没有这个包袱。

就拿 BOOST 来说,它复杂,而实现。就这两个词儿成为了所有人的争论的核心——它虽然复杂,但毕竟它实现了,证明了 C++ 自身素质的无敌,这是人们赞美它的地方——它虽然实现了,但是却过于复杂,不仅过程,包括使用和调试,太需要经验和技巧(所谓的奇淫异巧),这便又成为了人们攻讦它的地方。

“务实”的人们,总会有一批是曾经的热血青年,对兴趣钻研起来忘乎所以,陶醉其中不以拔的。但最终他们的“意志”被一系列的挫折和压迫所消磨掉了——这在年轻人看来是一种退化,但其实这却是真真正正的进化。为什么说这叫“务实”?“务实”是在肯定还是在反讽?应该是肯定。环境造就人。我们这个大环境下,所有人必将走到这一步,走不到的必将为环境所淘汰,光喊“为什么不能”是没用的。为何别人可以我们不能——这不怪人,这在势。人只能顺势而为,不可与势斗。

如果人还年轻,年轻得不需要独立应事,无忧无虑,则抓紧时间去钻研一些东西,可能现在的钻研对未来的更好的应用是有帮助的——尽管事实上,我个人觉得几乎没有什么不可替代的积极的作用……我认为真正有价值的钻研应该是“务实”的,当需要的时候再去想办法,研究的目的是为了满足需要。

语言不是目的,语言不过是工具。

可以曾一时把语言当目的来学习——现在每一个问“我到底是学这个好还是学那个好”的人其实思想上都是幼稚地把语言当成目的来学习的,当然这个幼稚,每个人都躲不过,也必须要经历。

而把语言当工具的人,就要好好考虑“性价比”了。C++ 是很棒。但是很多地方“性价比”的确是很不怎么样。这不是对语言来说,也不是对人来说,而是对项目来说,也就是站在解决问题的角度上。作为工具,C++本身没有资格参与讨论。如果一个项目定死了要用 C++ 来写——这要么是工作岗位的特殊需求,要么就是项目经理应该滚蛋——这就无所谓什么语言的优劣了,这完全是人为错误。

C++ 最大的问题,其实是它太需要功力深厚的人来驾驭它——这简直成为了程序员用来抬高自己身价的光环:看,我能驾驭 C++ ——但这却事实上在“抬高”程序员自满的同时,摧毁了 C++ 的地位。这世上哪儿找这么多合格的 C++ 程序员去,就算能找到,又有几个人有能力把这些能人们都聚一起去。一般的,也是绝大多数的项目是不敢轻动 C++ 的,维护不起。这其实才是 C++ 受社会攻讦诋毁,以及其它语言得到大发展的根本原因。

语言不是目的,当你把它当成一个彻头彻尾的工具的时候,你就发现对于它的一切争论根本没有任何意义——还争论什么?现实已经把答案给出来了。摆在那里却不愿意看,这本身就不是一个研究者应有的姿态。
光宇广贞 2010-10-08
  • 打赏
  • 举报
回复
某一种语言的发展,无非是为了证明两个方面:1、你看,我也能这么做。2、你看,我还能这么做。前者是为了追赶,后者是为了超越。

C++ 在自身标准远远落后于时代的情况下,靠自身的体质追赶时代前沿,这本身就是它无敌的地方。很多语言没有平台和标准的进化和支撑,就只能原地踏步,或者成为废物,C++ 没有这个包袱。

就拿 BOOST 来说,它复杂,而实现。就这两个词儿成为了所有人的争论的核心——它虽然复杂,但毕竟它实现了,证明了 C++ 自身素质的无敌,这是人们赞美它的地方——它虽然实现了,但是却过于复杂,不仅过程,包括使用和调试,太需要经验和技巧(所谓的奇淫异巧),这便又成为了人们攻讦它的地方。

“务实”的人们,总会有一批是曾经的热血青年,对兴趣钻研起来忘乎所以,陶醉其中不以拔的。但最终他们的“意志”被一系列的挫折和压迫所消磨掉了——这在年轻人看来是一种退化,但其实这却是真真正正的进化。为什么说这叫“务实”?“务实”是在肯定还是在反讽?应该是肯定。环境造就人。我们这个大环境下,所有人必将走到这一步,走不到的必将为环境所淘汰,光喊“为什么不能”是没用的。为何别人可以我们不能——这不怪人,这在势。人只能顺势而为,不可与势斗。

如果人还年轻,年轻得不需要独立应事,无忧无虑,则抓紧时间去钻研一些东西,可能现在的钻研对未来的更好的应用是有帮助的——尽管事实上,我个人觉得几乎没有什么不可替代的积极的作用……我认为真正有价值的钻研应该是“务实”的,当需要的时候再去想办法,研究的目的是为了满足需要。

语言不是目的,语言不过是工具。

可以曾一时把语言当目的来学习——现在每一个问“我到底是学这个好还是学那个好”的人其实思想上都是幼稚地把语言当成目的来学习的,当然这个幼稚,每个人都躲不过,也必须要经历。

而把语言当工具的人,就要好好考虑“性价比”了。C++ 是很棒。但是很多地方“性价比”的确是很不怎么样。这不是对语言来说,也不是对人来说,而是对项目来说,也就是站在解决问题的角度上。作为工具,C++本身没有资格参与讨论。如果一个项目定死了要用 C++ 来写——这要么是工作岗位的特殊需求,要么就是项目经理应该滚蛋——这就无所谓什么语言的优劣了,这完全是人为错误。

C++ 最大的问题,其实是它太需要功力深厚的人来驾驭它——这简直成为了程序员用来抬高自己身价的光环:看,我能驾驭 C++ ——但这却事实上在“抬高”程序员自满的同时,摧毁了 C++ 的地位。这世上哪儿找这么多合格的 C++ 程序员去,就算能找到,又有几个人有能力把这些能人们都聚一起去。一般的,也是绝大多数的项目是不敢轻动 C++ 的,维护不起。这其实才是 C++ 受社会攻讦诋毁,以及其它语言得到大发展的根本原因。

语言不是目的,当你把它当成一个彻头彻尾的工具的时候,你就发现对于它的一切争论根本没有任何意义——还争论什么?现实已经把答案给出来了。摆在那里却不愿意看,这本身就不是一个研究者应有的姿态。
codesnail 2010-10-08
  • 打赏
  • 举报
回复
走过。。。。。。。。。。。。。。。。
ccltiancai 2010-10-08
  • 打赏
  • 举报
回复
只是自嘲罢了
程序员有几个不自嘲的
更何况搞c++的
加载更多回复(65)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧