1. 引言
本文介绍了博主2014年校招期间应聘服务端开发岗位的准备工作和部分经验。希望通过本文能为即将找工作的童鞋们提供一点点参考,如果在阅读本文后,能对您有那么一点点帮助,那么博主就非常开心啦!
1.1 关于我
博主是华中科技大学计算机学院小硕一枚,读研期间抱着师兄大腿中过两篇论文(学生二作),由于平时比较爱折腾,所以会自娱自乐地造一些轮子,另外,博主对工业界的使用的一些技术比较好奇,所以挣扎着看过几个小开源项目的源码。
在2014年校招期间,博主拿到的offer情况如下:
- 亚马逊中国 SDE
- 网易游戏 游戏研发工程师
- 摩根士丹利IT 研发
- 百度 系统工程师
- 腾讯 后台开发工程师
- 阿里 研发工程师
- 美团 基础架构研发工程师
1.2 本文大纲
经过博主的梳理,认为在准备找技术工作的时候,以下几个方面比较重要,本文也将从这几个方向依次展开:
- 选择技术方向
- 准备所选技术方向的技能
- 基础知识
- 项目
- 语言
- 算法和数据结构
2. 选择技术方向
计算机是个很大的学科,里面涉及的技术方向很多,对于咱这种普通人肯定不可能同时深入多个方向,所以,博主认为在准备找工作之前,选择一个技术方向是非常有必要的。那么问题来了,如何选择技术方向呢?博主认为可能的途径有:
- 跟着实验室研究的技术方向走
- 如果对实验室方向不感兴趣,可以看看大公司校招JD页面所列的岗位,找找是否有感兴趣的
- 如果实在是没找到自己感兴趣的方向,那就选一个自己不讨厌的方向,而不是什么都不做
2.1 跟着实验室技术方向走
对于硕士生来讲,实验室一般会分配科研或者项目任务,其中做系统的时候会涉及到一些技术,如果您对这些技术感兴趣的话,那应该是再好不过的啦!这样无论是在读研时的工作时间或者业余时间,都可以深入地学习自己感兴趣的技术,这对于在该方向上个人的提升应该是非常有帮助的。
然而,人生一般都不会那么完美!很多硕士生在进入实验室后所研究的方向通常是导师指定的,可能自己并不是十分感兴趣,这时候在做好实验室研究工作的同时,就得自己寻找适合自己的技术方向了。
2.2 适合自己的技术方向
在找适合自己的技术方向的时候,我们首先得知道现在公司里一般是怎么对技术方向进行分类的,以腾讯的校招职位(传送门)为例,可以看出腾讯把技术方向分为软件开发,基础研究,技术运营,软件测试和安全技术共5个大方向。其中每个大方向又有几个小方向,以软件开发为例,包括:移动客户端开发,后台开发,PC客户端开发,应用开发,web前端开发,测试开发和运营开发。对于每个小方向,都会有详细的岗位要求描述,例如,后台开发(传送门)的要求如下:
- 2016年毕业,计算机软件相关专业本科及以上学历;
- 追求完美,对于创新及解决具有挑战性的问题充满激情;
- 具有良好的算法基础及系统分析能力;
- 善于与他人和团队合作,富有集体荣誉感;
- 具备良好的责任心与服务意识;
- 熟悉LINUX/UNIX操作和开发环境,熟悉TCP/IP协议相关知识,有C/C++开发和网络编程经验。
里面具体和技术相关就两项:具有良好的算法基础及系统分析能力和熟悉LINUX/UNIX操作和开发环境,熟悉TCP/IP协议相关知识,有C/C++开发和网络编程经验。这个时候我们就得问自己啦,根据平时对这些技术的接触,对这些技术有没有兴趣呢?如果有的话,那么恭喜你,可以试着选择这个方向继续学习下去。
但是,也有可能有童鞋看完这些所有方向的要求之后发现还是没有那么特别喜欢的方向,那么这个时候该怎么办呢?
2.3 选个不讨厌的方向
既然那些方向里面自己没有特别喜欢的,那么就我们可以试着从另一个角度来考虑,选一个自己不讨厌的方向。要选择不讨厌的方向,那么首先就得把自己讨厌的方向排除了,相信从这个角度入手会简单许多,在平时上课的时候,有的童鞋可能不喜欢算法,有的可能不喜欢网络编程等等,把自己讨厌的排除,在剩下的里面选一个就好了,总之是让自己有事可做,而不是停着什么都不做!
3. 准备所选技术方向的技能
确定了自己的技术方向之后,就需要调研改技术方向所需要的技术栈,然后各个击破。
3.1 调研技能栈
公司里面校招的页面的岗位要求一般是比较大概的要求,对岗位的技能栈一般不会详细而全面的列出来,这时候就得靠自己调研来确定了。这里推荐自己一般用的几种途径:
- 找认识的人了解
- 搜索引擎
- 去v2ex,知乎等提问
3.1.1 找认识的人了解
可以找该技术方向比较有经验的师兄等了解,不过从这种渠道了解的通常一般不够全面,毕竟个体的经验都是有局限性的。
3.1.2 善用搜索引擎
试着在搜索引擎中搜索该方向所需要的技能栈,然后前几页相关的文章全部看完并整理出来。
3.1.3 问答社区提问
在v2ex,知乎等问答社区有很多的大牛,可以试着提问等待或邀请大牛们回答,然后对他们的回答做一个整理。当然,也可以在这些搜索相关的提问,说不定就已经有很多不错的参考答案了呢。
下面是调研服务端开发(一般公司也叫服务端开发)时参考的部分知乎提问:
- Linux C++ 服务器端这条线怎么走?传送门
- 新人学习网络编程 apue unp等书看完后如何继续学习 例如怎样了解实际开发中的工作?传送门
- linux网络编程可以做些什么项目提高,还有网络编程可以继续往那方面工作发展?传送门
- 有什么适合提高 C/C++ 网络编程能力的开源项目推荐?传送门
- 要想进入互联网企业工作该学些什么呢,想做后台开发方面?传送门
- 如何根据招聘启示知道 Linux 后台开发岗位的具体要求?传送门
3.2 学习技能栈中的技能
我在调研了服务端开发方向所需要的技能栈之后,得出了下面的技能列表(可能不完整,欢迎大家补充):
- 了解Unix系统
- 熟悉一门脚本语言
- makefile或自动构建工具CMake等
- vim
- gdb
- valgrind
- git
- Unix系统下的编程
- Unix网络编程
- 工业界使用的一些技术
下面将简要的介绍一下我学习上面的技术用到的参考资料
3.2.1 了解Unix系统
3.2.2 熟悉一门脚本语言
这里我学的是python,看过的书有
3.2.3 Makefile或自动构建工具CMake
3.2.4 Vim
3.2.5 gdb
3.2.6 valgrind
3.2.7 git
3.2.8 Unix下的系统编程
无责任的推荐一本即将要看的书
3.2.9 Unix网络编程
3.2.10 工业界关注的一些技术
这块我主要是看一些开源项目,例如:
有些开源项目只看了部分感兴趣的组件,就不一一列举了
4. 基础知识
基础知识我觉得包含以下几个方面:
- 操作系统
- 体系结构
- 数据库
- 编译原理
建议读者先看看知乎的Linux C++ 服务器端这条线怎么走?
编译原理目前还没有特别学习过,所以就先不推荐资料了。
4.1 操作系统
- UCB操作系统课程 课程里也推荐了两本教材,可以参考
4.2 体系结构
4.3 数据库
5. 项目
项目方面我认为可以分为以下几个部分:
- 实验室的项目
- 个人的项目
- 参与过的开源项目
- 阅读过的开源项目
5.1 实验室的项目
校招面试前,对实验室的项目应该做一些整理,包括但不限于以下几个方面:
- 梳理整个项目开发过程
- 梳理项目中碰到的问题及自己的解决思路
- 梳理项目收获的东西
- 整理可能会问到的问题并给出解答
5.2 个人项目
在个人项目方面我主要是造轮子和实现自己的一些想法。有些硕士在读研期间可能做的事情偏向于科研,在项目实践方面可能比较少,那么可以通过做个人项目弥补,而且我一直觉得个人项目是提升个人技能的非常好的途径。
对于个人项目做什么,因人而异。你可能突发奇想,有个不错的idea,想做一个app;你可能没有那么多想法,那么可以造一些轮子。关于造什么轮子,这里推荐一个知乎的问题(传送门),其中有个回答我觉得不错,引用如下:
基础(1000行以下?) 实现String/Math等类 实现容器类 序列化/反序列化库 JSON/XML/..解析 贪吃蛇/俄罗斯方块(命令行) 几个机器学习分类算法。。
小型 贪吃蛇(GUI)并带AI Markdown编辑器 正则引擎 代码风格检查工具(简单的分析就行) 单元测试工具 Redis Client 小型HTTP Server
中型 实现Lua解释器 移植Memcached/Redis 代码编辑器 Reactor框架,乃至网络编程框架
具体选择做什么根据自己的兴趣、需求。各人都有所侧重,游戏、语言、网络、系统、机器学习。。
代码风格与规范 参考Google C++ Style,除了看文档外可以直接从Google开源项目中学习; 充分利用编译器,至少要0 warning; 用cpplint,cppchecker等工具检查
当然在校招前,个人项目也要按照上面的思路进行整理
5.3 参与过的开源项目
这里大概介绍一下如何参与开源项目吧。 我个人觉得对于那种很成熟的开源项目,新人会比较难加入,所以,我一般是按照下面的思路找项目的:
- github explore下找选择自己感兴趣的语言
- 每天去下面看看有没有值得参与的项目
我判断一个项目是否值得参与的标准是
- 是否和自己的技术方向相关
- 是否对自己的技能有提升(项目发起者的水平如何,项目要求的技能如何等等)
- 是否有机会加入(找刚刚开展没多久的开源项目往往更容易获得加入机会)
5.4 阅读过的开源项目
读开源的时候最好是做源码学习笔记,记下自己的分析思路和学习收获,在校招前再拿出来看看
6. 语言
这里主要推荐一下C和C++的资料
6.1 C
6.2 C++
7 算法和数据结构
还是推荐一些资料吧
8 总结
个人觉得准备校招技术面试是一项长期的工程,上面推荐的书可能很难在短短几个月看完,项目的积累也绝非短期可以完成的,大家可以挑选自己认为重要的来参考。所以,建议大家尽早开始积累知识和项目经验等!
9 联系我
如果您对本文内容有建议或意见,或者有其他需要讨论的问题,欢迎和我联系
- Email:
- Blog:Charles的技术博客
PS:
本博客更新会在第一时间推送到微信公众号,欢迎大家关注。