最近在人人网上看见这篇文章:
http://mindhacks.cn/2012/08/27/modern-cpp-practices/
我觉得这篇文章名字起得有点大,实际上和C++11的关系也不太大,可以说 hard core的部分基本上就是在如何在C++里面进行错误处理。这方面应该说他 写的是很好,很完整的。
实际上我们的团队基本上也是(试图)按照这样去实践的。不过我们因为不能 过分的激进,所以像ScopedGuard这种东西,都是写个”临时类“,专门去利用 RAII来做类似finally的工作(实际上比finally好用),当然也可以用宏去进 一步简化,总之,本质上没有区别。只是我们目标环境受限,不能用某些新特 性。
一般来说,像刘未鹏这样的博客名人,博文下面基本是吹捧与互相吹捧,但是 这次二楼出来一个所谓的“神吐槽”,这也是这篇文章在 人人被转发的原因:
天天和这些妖孽特性作斗争,还有时间作设计?不可能。
我特别想就这个评论说一点,是因为这个评论在我看来代表了中文技术社区的 坏风气,就是那种所谓的酷评、吐槽文化,实际上胸无一物,乱发评论。
C++可能确实有一些妖孽特性,但刘未鹏这篇文章强调的那些特性,基本上不 在妖孽特性中间,相反,那些基本上都是大部分主流工业语言经过验证采用或 者正在采用的modern特性。
这里面讲到的主要的,比方异常、lambda,std::function,这些,有哪一个是 有一点点妖孽可言的?这里面异常是酒精考验的好特性(虽然有些用C++的地方 禁止异常,但那个问题比较复杂,基本可以说和该特性本身无关),剩下这俩 都是其他语言早就证明过实用好用的特性。非要追究到底,顶多能说C++的特性 不够多,因此有些妖孽,比方说异常没有语言级别的stacktrace支持,这算一 点点妖孽,但是用glibc或者libunwind轮一个是很容易的事情,做项目的时候 做这么一点点准备性的工作,就算是在和妖孽特性做斗争?
再进一步说,刘未鹏这篇文章里面,尤其是错误处理这方面的内容,属于所谓 的“本质性困难”,也就是说,你在任何语言中都会遇到的问题, **错误处理 是本质性困难** ,恰恰是C++的妖孽特性(RAII)使得其在错误处理上竟然比哪 些“现代语言(java, python, C#)”更加方便,RAII对于异常安全是至关 重要的,这就是为什么那些所谓的现代语言纷纷引入了类似的机制,比如java 的try-with,python的with,然而这些特性都是侵入式的,就是你必须为资源管 理者指定一个特别的接口,比方说python里面,with的东西必须是 contextable的,这就比C++的很不好用。可以说,不理解RAII的重要性很大程 度上意味着写过的严肃代码比较少,没有接受过在复杂流程中进行异常处理的 挑战,没有RAII,复杂流程中的异常安全是非常、非常困难的。
为什么这种无聊的吐槽这么流行?这是技术迷信的一个表现,很多人迷信微软, 那么就有相应的人迷信鄙视微软,看起来相反,其实是一样的。一个基本的常 识是,只要有钱,技术很容易牛逼起来。微软亚洲研究院有好十几个IEEE fellow,比很多中国所谓的顶尖工科大学整个学校的还多,这叫技术不牛?包 括C#的设计,就是小小的微软拼音输入法,在整句输入这方面还是没有能够超 越的。完全可以承认微软技术很牛。linux界搞了这么多年的输入法,现在的水 平可以说勉强可用,比sogou,google什么差得远,输入法并不是什么需要大兵 团作战的项目,类似数据库,通讯中间件这样的。
实际上没有必要这样,对于不了解的事情,就踏踏实实了解,不要神化它也不 要鄙视它。现在知识高度扩散,只要花功夫,完全不能了解的东西很少,完全 做不出来的也不是太多,然而真正要做一个东西出来,也不是那么容易的。这 就需要一个恰当的平衡。建立在平心静气的为了做事情的立场上,去理解、利 用别人的工作,顺便说说这个工作做的不错,或者哪个地方有点糟,这才是实 事求是的态度。为了所谓的“设计”,为了所谓的“信仰”,去做些无聊的事 情,比方说吐槽,比方说做一些根本无用只是符合了某些抽象原则的事情,根 本是误入歧途。同技术上具体的工作一样,技术上的争论也是为了更好的出活, 更长远的出活。