怎么样才算是精通 C++?

C++是一门很神奇的语言,让人又爱又恨。

在知乎上看到的一个帖子,怎么样才算是精通C++,这里节选一些精彩的回复。

链接:http://www.zhihu.com/question/20201972/answer/23454845

来源:知乎

1

精通C++是一个艰巨的任务。为什么C++比别的语言难学这么多?其实这基本上是因为C++他爹Bjarne Stroustrup说过的一句话“我特别讨厌语言的设计者把自己的喜好强加给用户”(看向go)。结果C++为了不限制你的想法,于是也就变成了现在这个样子——包含若干范式,大概有面向对象(灵活应用virtual继承+shared_ptr可以达到java/C#的效果)模板(这里分两类,分别为type rich programming和meta programming,区别很大)函数式编程(如今有了lambda,配合文件,简直无敌了)过程式但是难能可贵的是,这几种东西在C++混在一起用也是多么的自然。不过,这需要你花时间去掌控他。那到底有没有必要真的学到这个地步呢,我觉得跟你的领域是有关系的。譬如说我,基本上算是人格分裂的,因为:当我搞语言设计和编译器的时候,我总是会倾向于创造各种小DSL来给自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,虽然我不用它),尽量让跟我有同样背景的人一眼能看懂我代码的意思。当我做我那个GUI库(www.gaclib.net)的时候,纯粹是用OO和IoC那一套。当我写3D渲染程序的时候,我会变成一个为了性能不惜牺牲可读性的人。当我是不同的我的时候,我当然只会用C++的一部分来完成我当前的这个任务。这好像是多重标准,但是实际上是由于项目本身的性质而定的。到了这个时候你会觉得,C++真是一门好语言。当你需要为了你的项目放弃不同的部分的时候,C++都能帮你做到。当你需要不同的抽象层次需要不同的性能要求的是,C++还是能够帮你做到。如果你用别的语言,你最终会发现那个语言只能做某几类的项目。这是因为,C++能够自由的让你放弃某些部分,而别的语言会阻止你放弃某些部分。为了达到这个层次,你必须进入一个无限接近于精通C++的状态里,这个时候你才能收放自如,不被C++社区的各种不同的价值观所捆绑。倘若你的项目非常大,不同的部分有不同的特征的时候(什么,一个没有遍布全世界的一两千人写了20年的程序能叫程序吗?),就更加需要你有这种本事了。说到这里,大家大概都明白精通C++大概是个什么感觉了吧——大丈夫能屈能伸。

2

谷歌工程师对C++的掌握有两个级别:

  1. 拥有C++的readability(可读性)认证。通过这个认证需要在实际工作中写出一个比较复杂的完整的类,然后将这个类提交到一个委员会进行审查,委员会会帮你纠正常见的错误,如果你的这个类满足style guide[1]的所有要求,一两个星期之后你就可以拿到可读性认证。一般来说,你需要在实际工作中写过至少几千行代码才能达到这个要求。C++的readability对工程师的意义主要有两个,一个是熟悉并避免C++的缺陷(比如不要使用iostream和exception),另一个是熟悉一些常用的库函数(比如string的各种操作,hash_map和smart pointer的使用等)。通过这个认证之后,工程师就有权利在code review中审阅其他人写的C++程序(注意这个不是readability review)。绝大多数工程师对C++的掌握处在这个水平。
  2. 顾问级C++程序员。一般需要写过数万行C++代码,用C++实现过比较复杂的系统,熟悉常见的设计模式并在实际工作中应用,对代码重构有丰富经验,最重要的是,成为小组以及周围同事的C++顾问,是同事有C++使用问题时最先想到询问的人。顾问级C++程序员通常是高级工程师(senior engineer)及以上级别,不仅对某种程序语言,对工作中的各种工程问题也经验丰富。其实“精通C++”并不仅仅是熟悉C++本身,你需要对C++需要实现的工程问题和周边问题同样精通;而且“精通C++”这种说法是相对的,如果你能成为组里的C++顾问,能够帮助同事正确使用这种语言有效率地解决工程问题并避免C++的误区,你就算是精通C++的那个人。

3

Never trust a programmer who says he knows C++

4

精通C++,个人的理解是:1、能用C++的面向对像设计,分解,开发一个模块或小系统2、在出现BUG的情况下能调试3、熟悉对像,继承,模板,能使用STL,BOOST4、能熟悉几个常用的设计模式5、在此基础上,在GOOGLE大神的帮助下,能阅读开源或闭源的源码。其它的,我觉得实用性不强了,去抠语言的细节,语言的实现等,那不叫精通了。那是神通了,反正我认识的技术牛人,人家是去抠系统,原理上的细节,很少去扣语言的,本来语言就是一个工具,用好他,坏了能简单的维护,管他是怎么实现的。

5

时间: 2024-10-05 15:23:21

怎么样才算是精通 C++?的相关文章

祖坟风水怎么看 怎样的祖坟才算是好风水

祖坟风水 上一篇文章我们已经告诉大家祖坟风水对于后代运势的重要影响.那么这一篇就告诉大家如何判断自己家祖坟的风水是否是好风水. 有关祖坟选址和风水堪舆方法: 1.要有阳光 墓地选址属于阴极,如果选在阴暗的地方或者说风口和潮湿的地方,则会让祖坟的风水长期处于一种见不到阳光的形势,时间长了,积累的煞气越来越重.对后世的影响是非常不好的.可能导致子孙后代体弱多病,或者患有慢性疾病,对于事业上来说,也很难成功. 2.地贵平坦 中国古代选穴讲究背靠大山,面朝河流,左右抱穴.而大山前的平坦开阔地,无疑是最好

“整洁可用”的代码才算是好代码

之前有人问我,什么样的代码才算是好代码?一时语塞,百度后,我觉得这个是我觉得我想要的结果,来源https://wenku.baidu.com/view/8646287bf56527d3240c844769eae009581ba2e8.html 原文地址:https://www.cnblogs.com/suola/p/9546682.html

究竟多大才算是大数据,大数据怎么学习?

大数据,什么是大数据呢?多大的数据叫大数据?红火一时的数据分析走向了我们,纷纷称不分析数据企业将长久不了,可是究竟什么样的数据才是大数据呢,什么样的数据才是最大的呢? 如果你没有接触过大数据,那么你就不知道大数据究竟有多大,大到什么样的数据才能称之为大数据.那么,根据数据收集的端口,企业端与个人端之间,大数据的数量级别是不同的. 大数据开发学习有一定难度,零基础入门首先要学习Java语言打基础,一般而言,Java学习SE.EE,需要约3个月的时间:然后进入大数据技术体系的学习,主要学习Hadoo

转.要会哪些东西,才算是熟 ASP.NET 3.5 ?

摘要:转.要会哪些东西,才算是熟 ASP.NET 3.5 ? 原文来自于小朱大的Blog:http://blog.xuite.net/regionbbs/techlogs/16206947 你想要知道你要达到什么样的程度,才可以算是你对 ASP.NET 3.5 够了解吗?我们可以由微软所公布的 MCTS Exam 70-562: TS: Microsoft .NET Framework 3.5: ASP.NET 3.5 Application Development 的技能测验目标清单来看出端倪

怎样的项目才算是一个成功的项目 于病视神,未有形而除之

http://www.nowamagic.net/librarys/veda/detail/2466参与各种项目已经好几年了,大大小小的项目也做过了很多.经历了很多,也明白了很多.现在反思下,什么样的项目才是成功的项目? 是把项目按照必要的约束(时间,成本,质量)条件完成? 还仅仅只是按照需求将对应的功能实现就好了呢? 抑或这些都不是,而仅仅判断一个项目的成败的是否能达到客户满意? …… 当然这里的客户是指的是宽泛意义的客户,任何项目的发起人都可以是你的客户.说白了就是谁为这个项目买单谁就是客户

究竟怎样写代码才算是好代码

今天让我们来谈谈代码吧.代码重要吗?当然,代码就是设计(Jack W.Reeves, 1992):代码是最有价值的交付物.我们需要好代码吗?在给"好代码"下个定义之前,这个问题无法回答.那么,究竟什么是好代码? 看下面这段英文解释: 'Good code' is code that works, is bug free, and is readable and maintainable. Some organizations have coding 'standards' that a

怎样才算精通javascript

任何一门编程语言都是人去创造的,不管是javascript还是php或者是c 那么,到底什么是精通javascript,什么又是精通php呢? 试问,我理解了js里面对象的概念,理解了各种逻辑运算符,我精通么? 显然,另外的同学会说,不,你还要学习面向对象或者函数式编程,你要试图用js去模拟一个类,然后让它具备重载以及多态等等特性.好了,我都学会了,精通了么? 其它同学说,不不不,你需要让你的js写的更高效,还要考虑各种浏览器下对某些方法的支持与否,我们要保证这个js具备较好的兼容性.好了,你又

C# 方法签名以及怎样的两个方法才算是不同的方法

方法签名由方法名称和一个参数列表(方法的参数个数.顺序和类型)组成. 注意:方法的签名并不包括方法的返回值和修饰符. 在C#中,同一个类中的两个或两个以上的方法可以相同的名字,只要他们的参数列表声明不同即可.在这种情况下,该方法就被称为重载(overload),这个过程称为方法重载(method overloading).方法重载是C#最有用的特性之一. 当一个方法被调用时,C#用方法签名确定调用哪一个方法.因此,每个重载方法的参数列表必须是不同的.虽然每个重载方法可以有不同的返回类型,但是返回

怎么样的制度才算是好制度

制度的目的是解决问题,或者缓解问题. 大部分人追求的都是绝对的平等,而绝对的平等就是物尽其用,人尽其责. 共产主义,最终目的就是实现绝对的平等.它要求的是每个人都尽职尽责,但是创造出来的结果,大家一起享受.例如一个能力差的,跟一个能力优秀的,能力优秀的,一年可以产1000斤粮食,而能力差的一年只可以产500斤粮食,在同一个集体绝对公平的条件下,两个人付出了100%的努力,都尽职尽责,相对于他们自己付出了同样多的汗水,最终的差别只是能力上的差别,在绝对平等下就应该每人领取到750斤粮食.而实际现实