c++装逼犯
因为C++之父的书特别不适合装逼犯。
《C++ Primer》在中国的泛滥,跟侯捷带货有关。我手头就有一本当年花了好几百人民币从台湾买的繁体版《C++ Primer》。非常后悔看了这本书,这书不是在教人C++编程,而是在教人C++语法。它事无巨细,用根本没必要知道的规则淹没你,就是本通俗版的C++标准文本。
《C++ Primer》的作者就是《Inside the C++ Object Model》的作者,没有比编译器实现者写的书更适合装逼犯的了(因为做一名C++人肉编译器,正是装逼犯的终极追求)。如果有,那一定是C++标准文本,哦,还有更装逼的生鲜proposal。
我遇到过好几个能把虚指针、虚表说得头头是道,但却连个虚函数都不会用的互联网大厂offer获得者。毫无疑问,他们的此类知识都来源于《Inside the C++ Object Model》,这种原本写给对C++不信任的C老手看的书,后来却成了C++面试装逼宝典,用复杂解释简单,用编译器知识指导应用程序员使用最简单的机制,真是本末倒置。
如果你解释虚函数需要用到虚指针、虚表这些词汇,那你肯定是没学会虚函数。你看人家Java程序员用这些词吗?Java里可每个方法都是虚函数。对于override,从is-a的角度讲讲就足够了。非要讲实现机制,只要说每个对象里都有隐藏字段记录该对象属于哪个类就行了。扯那么多编译器的实现细节,跟你个app编写者有什么关系?
《Modern C++ Design》这本书是C++社区装逼化的始作俑者,C++之父嫌弃这本书过于聪明,从这点你就可知C++之父的书特别不适合language lawyer们装逼。
装逼犯们说起来懂模板元编程,懂C++对象模型,懂STL内部代码,但实际上的编程水平,还不如一个2年的Java程序员。动不动就标准化委员会那帮老头如何如何,噗,你还真是少壮派装逼犯。C++社区的恶臭文化,有你一份。除了装逼,一件正事都不会干,因为他们从开始学编程就走上了漫漫装逼路。装逼多年,终有一天会发现自己其实除了装几个逼,啥都不会,此时就会变成C++反思党,再来黑C++。
C++的性格应该就是Stroustrup那样的,谦逊得像尘土,跟装逼完全是两个极端。Stroustrup创造C++是为了编写具体的程序杀猪宰羊的,不是为了脱离应用环境在空中挽剑花表演屠龙之技的。
要能从一开始就得到C++之父的书,怎么会走火入魔?
给大家看个例子,讲到函数重载那复杂的规则时,C++之父说:So, why bother? 所以,何苦呢?
重载本来就是个减轻程序员记忆负担的东西,结果你非要记住一堆编译器才该知道的规则,并不以为耻反以为荣,还要据此认为没人能精通C++。
c++社区装逼文化盛行的原因:
这源于c++社区的分裂状态,而c++社区的分裂状态与c++只是语言,而非平台有关。
Java isn't platform independent; it is a platform. Like Windows, it is a proprietary commercial platform.——Bjarne Stroustrup
因为c++自身不构成平台,一个non-trivial的c++程序,必然只能依赖底层操作系统平台提供的api。于是c++程序员根据所在的操作系统平台的不同,天然形成了不同的社区。我是Windows上的c++程序员,你是Linux上的c++程序员。
c++程序库的作者,如果想让自己的工作在更大的范围(所谓的c++社区)内被看到,他就必须让自己的库与特定的操作系统平台无关。于是那种与特定操作系统平台无关,只与c++语言本身相关的“语言功能增强型库”就成为了一个想出人头地的c++程序库作者的必然选择。
同时,由于c++语言本身提供的语法糖少(导致苦涩),而语言本身的建构能力又超强(提供了自己缓解苦味的可能性),导致通过“语言功能增强型库”来扩充c++语言自身功能成为刚需且具有可能。这种库的作者,必然会像编译器作者一样,考虑很多语法上的精微之处。
然而很多应用程序的开发者,甚至初学者,也被诱导着去学习这种语言功能增强型库的作者和编译器作者才需要掌握的知识。浪费了时间,损伤了自信,学了一大堆自己永远不会用到的“知识”。
就拿前面提到的重载机制来说吧,很多规则都是在处理int, long,double这种所谓基本类型间的转化带来的麻烦,但一个正经c++程序里,谁会用这么基本的类型来区分重载?大家都是用用户自定义类型——类来区分重载。为了完整性与兼容性,编译器作者当然需要搞懂基本类型的重载规则,语言功能增强库的作者也需要搞懂这些规则,但作为应用程序员的你真的需要搞懂吗?好好去编你的程序吧,如果你能遇到一次需要用到它们的地方算我输。你人生中需要用到这些规则的时间加起来乘以10,也不会有你学习这些规则所花的时间长。
这些玩意就是新时代的前加加、后加加。
搞清自己的定位, 你甚至可以一会是程序员, 一会是编译器作者, 但永远不要试图做一个同时扮演这两种角色的人. language lawyer说的就是这样的人——不把自己或他人变成人肉编译器就觉得没法编程序的人。
先学会c++设计这些机制要解决的问题。
有时间有兴趣了再去学习c++提供的机制。
作者:光追不上我
链接:https://www.zhihu.com/question/550407460/answer/2651230034
学习c++
看书的话,只看c++之父的。
三本,按顺序:
Programming Principles and Practice Using C++
The C++ Programming Language
The Design and Evolution of C++
看完中文版再看英文版,熟捻于心。
有人会推荐《c++ premier》,但我觉得这种重器轻道的大部头书就不要看了。与他等量齐观的TCPPPL(就是上面第二本)看了收获要大得多。
effective系列这种等你看完c++之父的书再说。
对象模型、模板元编程之流,往后再往后。
什么源码剖析之类,更不用看了。
学习c++,最重要的是学习“道”,而非“器”。这个只有c++之父的书能满足你。
把侧重点放在“器”上,最后你就成孔乙己了,会变成一个抱着c++标准文本还贼得意的傻逼。
记住一句话,c++它爹说的:
The first thing we do, let's kill all the language lawyers.
作者:光追不上我
链接:https://www.zhihu.com/question/335332327/answer/767666311