现状:C++基础知道,书籍读过:C++Primer、C++对象模型、unix网路编程1和2,用muduo C++网路库等(因为是计算机专业,计算机基础是有的);相关项目并没有,只是模仿著muduo写过简化版的网路库,所以项目经验如何弥补?其它项目有涉及多线程相关内容(但不是基于linux的)

注:打算参加今年秋招


我也不知道有啥套路,我做了十几年也没成专家。但是我可以从数据上给你一个参考。

我厂的原T4(现在的12级以上)可以勉强称为专家,来算算概率吧。我没有统计12级以上具体有多少人,和我相互认识的只有两三个,占员工的比例应该是几百分之一,假设是1/400吧。

然后我们招聘的要求大概是本科以上前20%,这样就可以算出专家的概率:0.2/400=0.0005。

对比一下每年高考录取学生中清北的概率,清北大概每年录取6000,大专以上每年录取总人数大概8000000,所以清北的概率是:6000/8000000=0.00075。

结论:0.0005&<0.00075。要成为专家,比考清北还难。

当然,光有能力和决心是不够的,天时地利人和一样不能少。

不知道这样回答对你有没有用。


秋招,应届生?专家

之前还看到脉脉有人吐槽,现在找 C++ 工作的人手 muduo 了,就像隔壁找 Java 的人手秒杀系统一样。不过就算网路库再简单,也不可能连多线程都没用吧?

顺便,应届生太高估项目经验的重要性了,实际上还是看基础,你面试时说你看了那几本书,那么书上相关的知识点应该都很熟悉吧,尤其是腾讯流行 APUE / UNP 那套,其他公司主要也是针对项目提问相关的基础,而不是问你项目怎么做的。如果手撕演算法厉害的话,也比临时找个项目要强。学历也能起到一定弥补作用。


评论无意中说了 APUE / UNP 只用看几章,实际上我也只是随口一说,毕竟,有些知识点,明显没人用嘛,说是这么说,我这么一说,要是有人用了,不是说我误人子弟了?那不还把我批判一番?

完全不负责任的回答:

UNP:

  • Chapter 12~13:IPv6 猴年马月。守护进程,和 APUE 重复了。
  • Chapter 15:不同其他的,这章我是推荐的,但是其实只是用于本机进程间通信,
  • Chapter 18~23:UDP / SCTP,爱看看。XX 套接字,那是啥。广播多播,哎呀,我以前课程设计还用了这个,然而并没什么好看的。
  • Chapter 24:我只是感兴趣看的,带外数据,能了解下 URG 位从而在和面试官侃侃时脱颖而出?然而并没什么好看的。
  • Chapter 26:线程,和 APUE 重复了。
  • Chapter 28~29:除了让我知道有个 SOCKET_RAW 宏外不知道有什么用。
  • Chapter 31:那是啥?有人还在用吗?

说白了,实际使用大多的套接字都是 TCP 套接字。重要的就前 7 章,加上第 30 章的总结,但到这里,其实我觉得不如过一遍前 7 章后直接看陈硕的书或者 muduo 库。看书的话,个人觉得容易被更多有趣的东西吸引,不符合应届生急功近利找工作的需求。

APUE 的话,第 18 章开始就没必要看了。其实就算排除了一些,真正要啃下来也挺多的。许可权相关的没必要太深究,想当年我看 TLPI / APUE,纠结那个 Set UID,花了很多时间,感觉很神奇,然而基本用不著,现在早忘了。又不是做许可权管理的,没啥用。大致浏览一遍系统调用有哪些就行了。像 Shell / Python 都提供了很多系统调用的包装,如果只是做一些管理操作,没必要去用裸调 C 函数。

相对而言,文件 / 进程 / 线程那块的理论部分都还挺有用吧,不过其实真正看下去,书上讲得不深,有些地方浅尝辄止。APUE 经典的还是把整个系统编程串了一遍。另外 APUE / UNP 除了介绍编程本身,还介绍了一些实用命令。这点 TLPI (Linux / Unix 系统编程手册)我觉得做得更好。然而比 APUE / UNP 加起来还厚,但对新手而言,UNP 几乎没讲的 epoll 也讲了,还讲得不错。现在哪个不问下 epoll 的?

PS:我也不是腾讯的,现在从事的也算不上这方面,所以,还是那句话,不负责任瞎吹。


想成为linux服务端C++开发专家,只能自己慢慢学,在实践中摸索,没什么快捷的途径,祝早日成为专家。

如果题主基础有了的话,可以找项目来实践下,怎么找项目

推荐几个值得学习的C++开源项目

LevelDb

LevelDb是谷歌两位大神级别的工程师发起的开源项目,简而言之,LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库。

它是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁碟上。

  其次,LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDb会按照用户定义的比较函数依序存储这些记录。

主页:

google/leveldb?

github.com图标

Boost.Asio

它是非同步输入输出的核心。 名字本身就说明了一切:Asio 意即非同步输入/输出。该库可以让 C++ 非同步地处理数据,且平台独立。非同步数据处理就是指,任务触发后不需要等待它们完成。相反,Boost.Asio 会在任务完成时触发一个应用。非同步任务的主要优点在于,在等待任务完成时不需要阻塞应用程序,可以去执行其它任务。

非同步任务的典型例子是网路应用。如果数据被发送出去了,比如发送至 Internet,通常需要知道数据是否发送成功。 如果没有一个象 Boost.Asio 这样的库,就必须对函数的返回值进行求值。但是,这样就要求待至所有数据发送完毕,并得到一个确认或是错误代码。而使用 Boost.Asio,这个过程被分为两个单独的步骤:第一步是作为一个非同步任务开始数据传输。 一旦传输完成,不论成功或是错误,应用程序都会在第二步中得到关于相应的结果通知.主要的区别在于,应用程序无需阻塞至传输完成,而可以在这段时间里执行其它操作。

主页:

Boost.Asio - 1.58.0?

www.boost.org

SGI STL

SGI STL是STL代码的经典实现版本,虽然很多编译器不直接使用这个版本,但是很多却在此基础之上进行改进的。比如GNU C++的标准库就是在此基础之上改进的。这份代码还有一个好处是有注释,代码书写非常规范,只要花些时间读懂它并非难事。

主页:

SGI.com Tech Archive Resources now retired?

www.sgi.com图标

Muduo

muduo 是一个基于 Reactor 模式的现代 C++ 网路库,它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网路应用程序。

主页:

chenshuo/muduo?

github.com


首先你要成为linux服务端C开发专家,然后你会对C++嗤之以鼻,再然后你写C多了就发现C++还是有很多优点的,你开始重新学习并使用C++,后来你C++写烦了就尝试Go或者Rust,甚至是Java,最后你回归到C,然后你C的写多了又发现C++还是有很多优点的,最后你疯了。

哈哈,以上纯属玩笑,但我的意思是其实没有什么Linux服务端C++开发专家,只有Liunx服务端开发专家。


  1. 读nng和百度的brpc,其中brpc的文档值得一读,会涉及到工业界真正想解决的问题。TCP通信部分了解到这个程度就够了,毕竟是早就成熟的领域。

2. 读完ddia和它附录里有意思的论文,读leveldb和redis,然后了解下lucene。这样对存储方面有初步认知。有空再去读innodb。

3. 读腾讯的inference框架ncnn,了解如何做计算优化。

4. 读intel tbb的work stealing用户级线程调度。

5. 我觉的应届生很难有时间写出有意义的完整项目,但可以写一些有意义的数据结构:可以用C++实现类似redis但又支持泛型的radix tree,用C++实现fit in内存且吞吐吊打lucene的倒排索引。


推荐阅读:
相关文章