首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

大家能否分享下 C++的升级之路呀

  •  
  •   ihei · 352 天前 · 4257 次点击
    这是一个创建于 352 天前的主题,其中的信息可能已经有所发展或是发生改变。
    还有一年就要工作了,目前就是学校的项目是 C 语言项目算可以练手吧,读书读完了 C++Primer 和 EC,请大家指点接下来的方向和适合找什么类型的工作吧
    31 回复  |  直到 2019-03-05 20:37:12 +08:00
        1
    msg7086   352 天前
    嗯? C 还是 C++?
        2
    ihei   352 天前
    c
        3
    ihei   352 天前
    c 输入法没输上
        4
    ihei   352 天前
    cpp, sorry,输入法导致浪费版面了,不知道是不是前几天那个 xmind 客户端的 bug,++输入不让去
        5
    t6attack   352 天前
    嗯,↑输入法就是 C++开发的。
        6
    didilong   352 天前
    Qt 可以尝试用下。
    其实大可不必把工作后的语言限定在 C++,还有更多好的选择。核心是算法和项目经验,语言什么的都是浮云。
        7
    MeteorCat   352 天前
    游戏吧? Skyent 可以看下,源代码简洁易懂
        8
    Balloonwj   352 天前
    在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。我从学生时代开始接触 C/C++,工作以后先后担任过 C++ 客户端和服务器的开发经理并带队开发,至今已经有十多年了。虽然时至今日哪种编程语言对我来说已经不再重要(我目前主要从事 Java 开发),但 C/C++ 仍然是我最喜欢的编程语言,在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”一样,有了这个基础,您可以快速学习任何语言和编程技术。

    2018 年 11 月 14 日晚间,我将作一场主题为《如何成为一名合格的 C/C++ 开发者?》的技术直播分享, 将介绍 C/C++ 学习中的重难点和大多数学习者关心的问题,同时针对在校学生和社会人士两大群体因时间和精力的差别问题,就如何学好 C/C++ 给出我的建议和方法。内容包括如下栏目:

    1. 目前 C++ 的应用领域;
    2. Linux C++ 与 Windows C++ 之争;
    3. C++ 语言基础包括哪些;
    4. 如何看待 C++ 11/14/17 新标准;
    5. C++ 与操作系统平台;
    6. C++ 如何进阶;
    7. C++ 面试;
    8. 学生与社会人士学习 C++ 的方式的区别;
    9. 问答环节。

    届时会结合我自身的工作经验来介绍,我这里抛砖引玉,希望能对广大想成为合格的 C/C++ 开发的朋友有一些帮助和启示。

    有兴趣的朋友,可以点击下面的链接报名参加: https://mp.weixin.qq.com/s/eCv55gfNZRR4-ZG4_eBvGQ
        9
    BingoXuan   352 天前
    不妨试一下 qt,c++学几天就可以对着文档就开始写东西了。不过现在技术环境对于 qt 和 c++热度已经很低了,不如搞 javascript 写前端。
        10
    contmonad   352 天前 via iPhone
        11
    kwanCCC   352 天前
    走火入魔了
        12
    shijingshijing   352 天前 via iPhone
    我是进来诚心劝退的,转 java 吧
        13
    luckychenhaha   351 天前
    c++的话,走 cmake 或 qt 比较好
        14
    supuwoerc   351 天前
    底层大佬准备出发!
        15
    onlin   351 天前 via Android
    C++楼主看我发帖,咱两一个样,我目前卡在安全和程序员道路之间,不知如何抉择。
        16
    chanin   351 天前
    @onlin 不会写代码搞安全就是耍流氓!
        17
    LetFoxRun   351 天前
    学会基础语法后,就跟着项目走。。
        18
    hanxiV2EX   351 天前 via Android
    回到 c 吧,更简单
        19
    fuyufjh   351 天前 via Android
    很多应届生都以为 C++比 Java 厉害,说到底还是因为无知
        20
    trait   351 天前
    会语法了就快去找项目做,别去深究语言特性误入歧途。不小心搞成拿折腾 gtd 工具来实践时间管理的情况是很可怕的
        21
    feverzsj   351 天前
    c++是最复杂最深奥的高级语言,但是......工作不好找
        22
    Rainbowsix   351 天前 via Android
    推荐侯捷的两本书 深度探索 C++对象模型 和 STL 源码剖析 对我的 C++提升很大 对了 后来我做 Java 了
        23
    Mithril   351 天前
    这俩书能看透一半就不愁找不到工作了。
    毕竟面的一多半应届 C++们连反转链表都不会。。。
        24
    ihei   351 天前
    @didilong
    @luckychenhaha
    谢谢,qt 是做客户端吗
        25
    ihei   351 天前
    @shijingshijing
    @Rainbowsix

    这两个选择上就是根据老师擅长的方面选了 cpp,java 的岗位好多啊,倒是用了一下 go,读了几个库,不知道能不能算补充你们说的 java 有优势的地方吧,不太了解 java,全部的 java 经历就是读红皮那本算法书。
        26
    ihei   351 天前
    @Mithril 哈哈反转链表是我这两个干活还在用了一次,就是不太了解 cpp 到底公司用来做什么,因为校招大批集中在算法和后台开发上,好像都不是 cpp 插手的
        27
    didilong   351 天前
    @ihei Qt 也是用用 C++写的,不仅局限于客户端。你的视野可以更开阔一些,不要局限于某种语言。
        28
    shylockhg   351 天前
    c++找工作难,推荐 java
        29
    hatsuyuki   351 天前
    虽然大师兄跟我说过,不管你学的是什么语言,都是殊途同归。我们修真之人,都不要在乎这些差别,要参透的是程序的本质。

    然后他又说,不过,用 Java 的都是傻逼。

    怎么写出一本程序员风格的修真小说? - 李昭鸿的回答 - 知乎
    https://www.zhihu.com/question/32422838/answer/55775344
    @fuyufjh
        30
    janus77   351 天前
    算法人工智能岗位很多啊
    然后就是游戏 服务器 基础组件 音视频 操作系统 这种领域很需要专精人才
        31
    Balloonwj   226 天前
    今天晚上“高性能服务器开发” QQ 群(群号:**49114021**,有兴趣的读者可以加一下)里面一名叫“**成都-go-戒炸鸡**”的群友提出了他最近面试的一些面试题,面试题内容个人觉得非常典型、也非常有代表性和针对性,故拿出来与大家分享一下,也感谢他的分享。成都-go-戒炸鸡说:

    > “今天面试,我没答出来的有 redis 持久化机制,redis 销毁方式机制,mq 实现原理,c++虚函数,hash 冲突的解决,memcached 一致性哈希,socket 函数 select 的缺陷,epoll 模型,同步互斥,异步非阻塞,回调的概念,innodb 索引原理,单向图最短路径,动态规划算法。”

    为了避免问题有歧义,面试题略有修改。

    #### 思路分析

    从面试题的内容可以看出,这是一个后台开发的职位。

    除了关于 **c++ 虚函数**这个问题以外,其他的大多数问题都与哪种编程语言关系不大,大多数是原理性和基础性的问题,少数是工作经验问题,笔者试着给大家分析。

    ##### 语言基础

    **C++ 虚函数**这是面试初、中级 C ++ 职位一个概率 95%以上的面试题。一般有以下几种问法:

    1. 在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是怎样的?

    2. 在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样?

    3. 什么是 C++ 多态? C++ 多态的实现原理是什么?

    4. 什么是虚函数?虚函数的实现原理是什么?

    5. 什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?

    6. 菱形继承(类 D 同时继承 B 和 C,B 和 C 又继承自 A )体系下,虚表在各个类中的布局如何?如果类 B 和类 C 同时有一个成员变了 m,m 如何在 D 对象的内存地址上分布的?是否会相互覆盖?

    ##### 算法与数据结构基础

    说到算法和数据结构,对于社招人士和对于应届生一般是不一样的,对于大的互联网公司和一般的小的企业也是不一样的。下面根据我当面试官面试别人和找工作被别人面试经验来谈一谈。

    先说考察的内容,除了一些特殊的岗位,常见的算法和数据结构面试问题有如下:

    1. 排序(常考的排序按频率考排序为:快速排序 > 冒泡排序 > 归并排序 > 桶排序)

    一般对于对算法基础有要求的公司,如果你是应届生或者工作经验在一至三年内,以上算法如果写不出来,给面试官的影响会非常不好,甚至直接被 pass 掉。对于工作三年以上的社会人士,如果写不出来,但是能分析出其算法复杂度、最好和最坏的情况下的复杂度,说出算法大致原理,在多数面试官面前也可以过的。**注意,如果你是学生,写不出来或者写的不对,基本上面试过不了。**

    1. 二分查找

    二分查找的算法尽量要求写出来。当然,大多数面试官并不会直接问你二分查找,而是结合具体的场景,例如如何求一个数的平方根,这个时候你要能想到是二分查找。我在 2017 年年底,面试 agora 时,面试官问了一个问题:如何从所有很多的 ip 地址中快速找个某个 ip 地址。

    2. 链表

    无论是应届生还是工作年限不长的社会人士,琏表常见的操作一定要熟练写出来,如链表的查找、定位、反转、连接等等。还有一些经典的问题也经常被问到,如两个链表如何判断有环(我在 2017 年面试饿了么二面、上海黄金交易所一面被问过)。链表的问题一般不难,但是链表的问题存在非常多的“**坑**”,如很多人不注意边界检查、空链表、返回一个链表的函数应该返回链表的头指针等等。

    3. 队列与栈

    对于应届生来说一般这一类问的比较少,但是对于社会人士尤其是中高级岗位开发,会结合相关的问题问的比较多,例如让面试者利用队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题(下文介绍多线程面试题时详细地介绍)。

    栈一般对于基础要求高的面试,会结合函数调用实现来问。即函数如何实现的,包括函数的调用的几种常见调用方式、参数的入栈顺序、内存栈在地址从高向低扩展、栈帧指针和栈顶指针的位置、函数内局部变量在栈中的内存分布、函数调用结束后,调用者和被调用者谁和如何清理栈等等。某年面试京东一基础部门,面试官让写从 0 加到 100 这样一个求和算法,然后写其汇编代码。

    4. 哈希表

    哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的检测、让面试者写一个哈希插入函数等等。基本上一场面试下来不考察红黑树基本上就会问哈希表,而且问题可浅可深。我印象比较深刻的是,当年面试百度广告推荐部门时,二面问的一些关于哈希表的问题。当时面试官时先问的链表,接着问的哈希冲突的解决方案,后来让写一个哈希插入算法,这里需要注意的是,你的算法中插入的元素一定要是通用元素,所以对于 C++ 或者 Java 语言,一定要使用模板这一类参数作为哈希插入算法的对象。然后,就是哈希表中多个元素冲突时,某个位置的元素使用链表往后穿成一串的方案。最终考察 linux 下 malloc (下面的 ptmalloc ) 函数在频繁调用造成的内存碎片问题,以及开源方案解决方案 tcmalloc 和 jemalloc。总体下来,面试官是一步步引导你深入。(有兴趣的读者可以自行搜索,网上有很多相关资料)

    5. 树

    面试高频的树是红黑树,也有一部分是 B 树( B+树)。

    红黑树一般的问的深浅不一,大多数面试官只要能说出红黑树的概念、左旋右旋的方式、分析出查找和插入的平均算法复杂度和最好最坏时的算法复杂度,并不要写面试者写出具体代码实现。一般 C++ 面试问 stl 的 map,java 面试问 TreeMap 基本上就等于开始问你红黑树了,要有心里准备。笔者曾经面试爱奇艺被问过红黑树。

    B 树一般不会直接问,问的最多的形式是通过问 MySQL 索引实现原理(数据库知识点将在下文中讨论)。笔者面试腾讯看点部门二面被问到过。

    6. 图

    图的问题就我个人面试从来没遇到过,不过据我某位哥哥所说,他在进三星电子之前有一道面试题就是**深度优先**和**广度优先**问题。

    7. 其他的一些算法

    如 A*寻路、霍夫曼编码也偶尔会在某一个领域的公司的面试中被问到,如宝开(《植物大战僵尸》的母公司, 在上海人民广场附近有分公司)。

    ##### 编码基本功

    还有一类面试题不好分类,笔者姑且将其当作是考察编码基本功,这类问题既可以考察算法也可以考察你写代码基本素养,这些素养不仅包括编码风格、计算机英语水平、调试能力等,还包括你对细节的掌握和易错点理解,如有意识地对边界条件的检查和非法值的过滤。请读者看以下的代码执行结果是什么?(笔者 2011 年去北京中关村的鼎普面试的问题)

    ```
    for(char i = 0; i 256; ++i)
    {
    printf("%d\n", i);
    }
    ```

    下面再列举几个常见的编码题:

    1. 实现一个 memmov 函数

    这个题目考查点在于 memmov 函数与 memcpy 函数的区别,这两者对于源地址与目标地址内存有重叠的这一情况的处理方式是不一样的。

    2. 实现 strcpy 或 strncpy 函数

    这个函数写出来没啥难度,但是除了边界条件需要检查以外,还有一个容易被忽视的地方即其返回值一定要是目标内存地址,以支持所谓的链式拷贝。即:

    ```
    strcpy(dest3, strcpy(dest2, strcpy(dest1, src1)));
    ```
    3. 实现 atoi 函数

    这个函数的签名如下:

    ```
    int atoi(const char* p);
    ```

    容易疏忽的地方有如下几点:

    4. 小数点问题,如数字 0.123 和.123 都是合法的;

    5. 正负号问题,如+123 和-123 ;

    6. 考虑如何识别第一个非法字符问题,如 123Z89,则应转换成应该 123。

    我在面试掌门科技(无线万能钥匙那一家)就遇到过这样的问题。

    ##### 多线程开发基础

    现如今的多核 CPU 早已经是司空见惯,而多线程编程早已经是“飞入寻常百姓家”。对于大多数桌面应用(与 Web 开发相对),尤其是像后台开发这样的岗位,且**面试者是社会人员**(有一定的工作经验),如果面试者不熟悉多线程编程,那么一般会被直接 pass 掉。

    这里说的“**熟悉多线程编程**”到底熟悉到什么程度呢?一般包括:知道何种场合下需要新建新的线程、线程如何创建和等待、线程与进程的关系、线程局部存储( TLS 或者叫 thread local )、多线程访问资源产生竞态的原因和解决方案等等、熟练使用所在操作系统平台提供的线程同步的各种原语。

    对于 C++ 开发者,你需要:

    * 对于 Windows 开发者,你需要熟练使用 Interlock 系列函数、CriticalSection、Event、Mutex、Semphore 等 API 函数和两个重要的函数 WaitForSingleObject、WaitForMultipleObjects。

    * 对于 linux 开发者,你需要熟练使用 mutex、semphore、condition_variable、read-write-lock 等操作系统 API。

    对于 Java,你需要熟悉使用 synchronized 关键字、CountDownLatch、CyclicBarrier、Semaphore 以及 java.util.concurrent 等包中的大多数线程同步对象。

    ##### 数据库

    数据库知识一般在大的互联网企业对应届生不做硬性要求,对于小的互联网企业或社会人士一般有一定的要求。其要求一般包括:

    1. 熟悉基本 SQL 操作

    包括增删改查( insert、delete、update、select 语句),排序 order,条件查询( where 子语句),限制查询结果数量( LIMIT 语句)等

    2. 稍微高级一点的 SQL 操作(如 Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)

    3. 索引的概念、索引的原理、索引的创建技巧

    4. 数据库本身的操作,建库建表,数据的导入导出

    5. 数据库用户权限控制(权限机制)

    6. MySQL 的两种数据库引擎的区别

    7. SQL 优化技巧

    ##### 网络编程

    网络编程这一块,对于应届生或者初级岗位一般只会问一些基础网络通信原理(如三次握手和四次挥手)的 socket 基础 API 的使用,客户端与服务器端网络通信的流程(回答 [客户端创建 socket -> 连接 server ->收发数据;服务器端创建 socket -> 绑定 ip 和端口号 -> 启动侦听 ->接受客户端连接 ->与客户端通信收发数据] 即可)、TCP 与 UDP 的区别等等。

    对于工作经验三年以内的社会人士或者一些中级面试者一般会问一些稍微重难点问题,如 select 函数的用法,非阻塞 connect 函数的写法,epoll 的水平和边缘模式、阻塞 socket 与非阻塞 socket 的区别、send/recv 函数的返回值情形、reuse_addr 选项等等。Windows 平台可能还会问 WSAEventSelect 和 WSAAsyncSelect 函数的用法、完成端口( IOCP 模型)。

    对于三年以上尤其是“号称”自己设计过服务器、看过开源网络通信库代码的面试者,面试官一般会深入问一些问题,这类问题要么是实际项目中常见的难题或者网络通信细节,根据我的经验,一般有这样一些问题:

    1. nagle 算法;

    2. keepalive 选项;

    3. Linger 选项;

    4. 对于某一端出现大量 CLOSE_WAIT 或者 TIME_WAIT 如何解决;

    5. 通讯协议如何设计或如何解决数据包的粘包与分片问题;

    6. 心跳机制如何设计;(可能不会直接问问题本身,如问如何检查死链)

    7. 断线重连机制如何设计;

    8. 对 IO Multiplexing 技术的理解;

    9. 收发数据包正确的方式,收发缓冲区如何设计;

    10. 优雅关闭;

    11. 定时器如何设计;

    12. epoll 的实现原理。

    举个例子,让读者感受一下,笔者曾去 BiliBili 被问过这样一个问题:如果 A 机器与 B 机器网络 connect 成功后从未互发过数据,此时其中一机器突然断电,则另外一台机器与断电的机器之间的网络连接处于哪种状态?

    ##### 内存数据库技术

    时下以 NoSql key-value 为思想的内存数据库大行其道,广泛地用于各种后台项目开发。所以**熟悉一种或几种内存数据库程序已经是面试后台开发的基本要求**,而这当中以 redis 和 memcached 为最典型代表,这里以 redis 为例。

    * 第一层面一般是对 redis 的基础用法的考察

    如考察 redis 支持的基础数据类型、redis 的数据持久化、事务等。

    * 第二层面不仅考察 redis 的基础用法,还会深入到 redis 源码层面上,如 redis 的网络通信模型、redis 各种数据结构的实现等等。

    笔者以为,无论是从找工作应付面试还是从提高技术的角度,redis 是一个非常值得学习的开源软件,希望广大读者有意识地去了解、学习它。

    #### 项目经验

    除了社会招聘和一些小型的企业,一般的大型互联网公司对应届生不会做过多的项目经验要求,而是希望他们算法与数据结构等基础扎实、动手实践能力强即可。对于一般的小公司,对于应届生会要求其至少熟练使用一门编程语言以及相应的开发工具,号称熟悉 linux C++ 开发的面试者,不熟悉 GDB 调试基本上不是真正的熟悉 linux C++ 开发;号称熟悉汇编或者反汇编,不熟悉 IDA 或者 OllyDbg,基本上也是名不符实的;号称熟悉 VC++ 开发,连 F8、F9、F10、F11、F12 等快捷键不熟悉也是难以经得住面试官的提问的;号称熟悉 Java 开发的却对 IDEA 或 eclipse 陌生,这也是说不过去的。

    这里给一些学历不算好,学校不是非常有名,尤其是二本以下的广大想进入 IT 行业的同学一个建议,在大学期间除了要学好计算机专业基础知识以外,一定要熟练使用一门编程语言以及相应的开发工具。

    关于项目经验,许多面试者认为一定要是自己参与的项目,其实也可以来源于你学习和阅读他人源码或开源软件的源码,如果你能理解并掌握这些开源软件中的思想和技术,在面试的时候能够与面试官侃侃而谈,面试官也会非常满意的。笔者的一个学弟前段时间告诉我,他看懂了我公众号 [**easyserverdev**] 中《**服务器开发基础系列和进阶**》的文章后,成功拿到了网易的 offer,有兴趣的读者可以好好看一下。

    很多同学可能纠结大学或者研究生期间要不要跟着导师做一些项目。当然,如果这些项目是课程要求,那么你必须得参加;如果这些项目是可以选择性的,尤其是一些仅仅拿着第三方的库进行所谓的包装和加工,那么建议可以少参加一些。

    #### 思路总结

    不知道通过我上面的技术分析,聪明的读者是否已经明确本文开头“成都-go-戒炸鸡”同学提出的面试题中,哪些是**技术面试**重难点,哪些又是**技术开发**的重难点呢?

    #### 技术比重与薪资

    这里根据我自己招人的经验来谈一谈技术水平与薪资,就上面的面试题来看:

    * 第一层次:如果面试者能答出上面面试题中的 C++基础问题和算法与数据结构题目(如 C++ 函数与 hash 冲突的解决、innodb 索引原理,单向图最短路径,动态规划算法等),可以认为面试者是一个合格的初、中级开发者,薪资范围一般在 6 ~ 12k (注意:这里以我所在的上海为参考标准)。

    * 第二层次:在第一层次基础之上,如果面试者还能答出上述面试题中网络编程相关的或者多线程相关的问题(如 socket 函数 select 的缺陷,epoll 模型,同步互斥,异步非阻塞,回调的概念等),可以认为面试者是个基础不错的中级开发者,薪资范围一般在 14 ~ 22k 之间。

    * 第三层次:在前两个层次之间,如果面试者还能回答出上述问题中关于 redis、memcached 和 mq 实现原理,说明面试者是一个有着不错项目经验并且对一些常用开源项目也有一定的理解,薪资可以给到 22k +。

    #### 总结

    工资收入是每个人的秘密,一般不轻易对外人道也。这里笔者冒天下之大不韪,只想说明一点——对于普通开发人员,提高薪资最好的捷径就是提高自己的技术,无论是“面向搜索引擎编程”还是“面向工资编程”终将得不偿失,聪明的你一定会深谋远虑的。

    文章来源:[https://mp.weixin.qq.com/s?__biz=MzU2MTQ1MzI3NQ==&mid=2247486424&idx=1&sn=ad30fe4ed875023735a1d01e30086e93&chksm=fc79ca6ccb0e437a0d32eba037b58cdd2ccff4344f516b2aa13baee6002bd34db0285cd9a124&token=1887257674&lang=zh_CN#rd]( https://mp.weixin.qq.com/s?__biz=MzU2MTQ1MzI3NQ==&mid=2247486424&idx=1&sn=ad30fe4ed875023735a1d01e30086e93&chksm=fc79ca6ccb0e437a0d32eba037b58cdd2ccff4344f516b2aa13baee6002bd34db0285cd9a124&token=1887257674&lang=zh_CN#rd)

    作者公众号:高性能服务器开发


    ![]( https://user-gold-cdn.xitu.io/2018/11/17/167208ab2ab452be?w=424&h=248&f=jpeg&s=104286)
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4161 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 06:43 · PVG 14:43 · LAX 23:43 · JFK 02:43
    ♥ Do have faith in what you're doing.