最近各大厂的春招已经陆续开始了,目前还是提前批,各位还没投简历的,一定要快速投起来。
最近朋友在帮组里做初筛面试,发现基础、算法、项目这三块有两块好的同学都比较少,很多本科三年都在打 ACM 算法不错,但是基本没怎么复习计算机基础的东西,项目也是随便找的那种,这种也没法继续往后面推。
还有的是基础八股文背得很熟悉,但是呢数据结构不扎实,算法也刷得不多,一两道简单级别的剑指offer原题都没做出来,这种也没法继续往后面推,因为微信面委算法会考察得更严。
还有更气人的一类,连语言基础都有问题,比如 sizeof 指针大小都能答错,char* 的长度怎么算也不知道。。。
这种就是根本就没复习就投简历来了,或者就是平常根本没怎么写代码。
但是呢,也有那种八股文和算法都不错的选手,问他大概复习了多久,人家说去年就在开始准备今年春招了,所以这就是准备得早的优势啊!
还有一点,就是发现现在很多 C++ 后台方向的同学简历高度同质化,基本上 50% 以上的同学都有一个项目:WebServer
但是大家不用太担心!
其实面试官都是知道的,知道学生阶段 C++ 本身没有太成熟的生态和框架,不像 Java,学完 Java Web 就有很多项目可做。
C++ 这块的确差一些,基本上每个用 C++ 的公司都是自己搞一套轮子,百度、腾讯、360、搜狗这些基本每家都不一样,像腾讯内部还有好几套 RPC 框架。
所以大家都做这个服务器项目也还好,但是呢!
前提是 代码一定是你自己写的,并且你搞懂了这个项目中的一些重点知识,比如IO线程和工作线程、线程池之间通信、并发的处理、epoll 等等。
其实除了 HTTP 服务器,还有很多可以做的,比如文件服务器、FTP服务器、代理服务器(模仿nginx代理功能)、聊天软件、RPC 框架、网络库等等,这一块都是和网络编程相关的。
除了网络编程呢,也可以写一些单机的小软件,比如 KV 存储引擎,这块可以去学习开源的 LevelDb,其代码总量在一万五左右,是谷歌两位大神级别的工程师发起的开源项目,LevelDb 是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库。
学完之后可以掌握 LSM-Tree 这种现在很流行的存储结构,自己也可以模仿简单实现,核心的就是几个打开文件、落盘文件、Put、Delete、Get 接口:
还有类似 文件压缩、加解密的工具,甚至是模仿实现 STL 里面的容器,这些对于在校的同学都是可以作为项目的。
另外,很多同学问网络编程如何学习?
在这分享学 C++ 的朋友北子哥的经验,我们知道有本网络编程圣经:《Unix网络编程》
但是建议不要直接上来就去看《Unix网络编程》,这本书里面很大的篇幅都在讲解 API 和 Unix Socket API 细节,很容易看不下去。
建议先去随便找菜鸟教程或者 man 手册熟悉常用的 socket api,先写几个网络聊天室这种小程序来,然后再去考虑进阶。
C++ 后台开发基本是离不开网络编程的,其实甚至整个后台开发也可以看做是在做网络编程。
只不过别人的框架帮我们做了协议解析、网络数据传输、解封包这些底层操作。
比如 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以至于我们开发业务只需要定义接收和返回包的数据格式,然后做逻辑处理就完了。
像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到。
但是网络编程技能还是很重要的,特别是对于 Linux C++ 开发来说。
Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:
推荐的书:
这两本是砖头书,虽然是网络编程和 Unix 系统编程方面的无出其右的圣经,但主要用途还是垫显示器(逃)
北子哥强烈推荐,这本书前半部分基本是在重复计网基础知识,但是后面几章关于高性能服务器程序框架、高性能IO、IO复用、定时器、多线程编程、线程池和进程池还是讲得非常全面到位的,值得一看,看完基本上对于整个网络编程就有了框架。
同样强烈推荐,这是陈硕大佬写的书,说实话第一部分:C++ 多线程系统编程都直接把人看蒙了,没有想到 C++ 里要做到线程安全这么难,第一章看了两三遍估计才能看懂吧。。。这是难得的讲解 C++ 多线程编程的书。
并且在书中,陈硕大佬用了一章讲解了 Muduo 网络库设计与实现,Muduo 比较适合学完基础的网络编程后继续进阶学习如何设计和写一个网络库,是一个高质量的 Reactor 网络库,采用 one loop per thread + thread pool 实现,代码比较简洁,书和源码搭配着看作为学习网络编程方面来说是非常不错。
推荐的阅读顺序:
《Linux高性能服务器编程》—> 《Unix网络编程》(注意,不是全看,而是学习高性能服务器编程这本书的时候需要某个Socket API 或者 IO 模型时再去查阅 UNP) -> 《Linux 多线程服务端编程》
学完网络编程就可以写点小项目练手了,这里列举几个项目:
https://github.com/imarvinle/WebServer
、 https://github.com/linyacool/WebServer
,HTTP 服务器看着挺简单的,但是可以扩展写的地方还是挺多的,比如可以加入代理功能、可以加入日志库、可以添加 CGI 支持等等。在这里在单独提一下 RPC,相比 HTTP 服务器更推荐大家现在有时间的情况下,去自学 RPC 并实现一个简易版的。因为目前公司内微服务基本都是基于 RPC构建的,做这个更加贴合业界。
推荐两个:
一个是搜狗开源的RPC:https://github.com/sogou/srpc
特点如下:
并且会有教程,教大家如何使用:
另外一个就是微信开源的 rpc:
https://github.com/Tencent/phxrpc
(PS: 以下信息皆来自网上公开内容,不涉及泄露~
众所周知,微信后台主要使用C++。后台服务使用Svrkit框架搭建,服务之间通过同步RPC进行通讯。
使用 Svrkit 构建了数以千计的服务模块,提供数万个服务接口,每天 RPC 调用次数达几十万亿次。
PhxRPC 就是微信后台团队推出的一个非常简洁小巧的 RPC 框架,编译生成的库只有450K:
Github 地址:
https://github.com/Tencent/phxrpc
但是这个开源的框架不是微信内部实际使用的,因为实际使用的版本有太多的内部依赖,已经不太好整理开源出来,所以这个是开源简化版。
PhxRPC 使用“协程” 来解决常规“异步 + 回调”方式存在的 IO 阻塞的问题,大大提高了整体性能。
它主要有以下几个特点:
用 PhxRPC 写一个服务非常简单,用 Protobuf 定义好接口协议后,直接就可以生成服务代码,你只需要关注业务逻辑实现即可,其它网络收发包、协议解析都由框架完成了:
如果要实现一个简单版本的 RPC 框架,拆解一下,大概需要以下步骤:
好了,就说到这里,还在找工作的同学加油!算法和八股文都要重视起来!
欢迎学编程的朋友们加入鱼皮的 编程知识星球 ,鱼皮会 1 对 1 解决你的问题,直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。求职季一起加油!
往期推荐