尽人事,听天命。结束技术面后的思考与复盘。
投递的秋招技术面已经全部结束,分享一点机械狗转行路上的经历与思考。
背景。
本硕985机械,本科全在浪,和互联网0接触。转行是在读研时候开始决定的,到找工作大概一年半,期间有很一部分时间在给导师干活,导师是接项目的应该都懂,学习的时间那是真的靠挤出来的,可以说转行路道阻且长。
技术栈是cpp,面的都是后台岗,因为准备得比较早,所以春招和秋招bat都过了,也都给到了sp+的包。下面讲讲我这接近两年的经历。
初探。
这个阶段可以说是刚进实验室的半年。实验室是写单机工业软件的,最开始接触编程,学习了数据结构,设计模式,觉得很有意思,编程的魔力在于一个东西只需要动动手指和一些思考设计,最终就能出现一个产品,这种感觉是很奇妙的,快速的正反馈与打游戏的反馈机制极其类似,勾起了我对计算机的兴趣。
也是这段时间,让我对计算机有了一个比较感性的认识,积累了一定的编码基础和能力。
总结一下这段时间看过的书籍《essential c++》《大话数据结构》《设计模式》《effective c++》
自我否定。
半年之后,和找完工作的师兄师姐们聊天,大概了解了互联网需要学习的东西,于是开始了学习计算机网络,操作系统,数据库。由于万事开头难,实验室的工作和这也无关,所以学得有些慢,并且相对比较艰难,常常看了忘,忘了看,一度陷入自我怀疑,是否真的适合转行呢?
总结一下这段时间看过的书籍《CSAPP》《计算机网络-自顶向下》《数据库概论》
开始总结。
研一的暑假期间(实际并没有放假),我花了两个月挤时间阅读了深入理解Nginx那本书(当时出差晚上还在酒店看书也是辛酸),期间也自己下源码,实践和阅读了一点。当时的感觉是这本书写得真难读,当然也因为当时的我太菜了,下了重本看完这本书,却很多东西都已忘记,带着不甘的心情,我决定再读一次,并挑选重点进行摘录,写下自己的感想,问题和总结,这种整理读书笔记的有目的性的阅读大大加深了我的理解,并且产出总结文档时,也有足够的正反馈。在这种目的性强,正反馈强的阅读方式下,我开始读越来越多的书,也开通了我的博客,记录自己的总结。阅读Nginx对我来说是一个转折点吧,但这时候已经研二开学,留给我的时间并不多,一直到研二放寒假,可以说爆肝了半年,这段时间看完了《C++对象模型》《深入理解Nginx》《STL源码剖析》《设计模式》《redis设计与实现》《操作系统-设计精髓与原理》《Linux内核设计与实现》《计算机网络-自顶向下》《Linux多线程服务端编程》《UNP》《APUE》,这些书基本刷了两遍(这里详细说一下,《设计模式》和《计算机网络》是第二次看,上半年看过;《操作系统》不是《CSAPP》,是另一本较薄的黑皮书,而且上半年看过CSAPP,所以效率很高;《UNP》《APUE》我是当工具书看的;我个人看书的方法是第一遍速读,大概知道讲了啥,第二遍按前面说的整理读书笔记的方式阅读),而且因为之前一年无形中的积累,所以这段时间的学习并没有十分痛苦,效率很高,在前面提到的那种阅读方式下收获很大。同时这段时间lc刷了250题左右,包括了剑指offer,北大up主大雪菜带着刷的专题(收获很大,他的主站 https://www.acwing.com/),还有一些热题,刷完这些题花了大概一个半月,每天空闲时间基本全在刷题,肝到很晚。大概十二月份的时候,我开始写了自己的两个比较大的开源项目,一个是网络库,一个是协程库,具体的在下面说,为了写这两个库,看了一个cpp disruptor的源码,排第一的线程池项目源码,muduo的源码,使用和大致学习了libevent,看了云风的coroutine,tx的libco和魅族libgo的源码。另外和同学在linya大神面经的指导下还看了leveldb的源码,收获都非常的大。
项目。
找实习时除了写实验室的项目,还写了一个网络库和协程库(被问得最多的也是这两个)。
先说网络库,相信很多写cpp的都复刻过一波muduo,或者套了一层皮,不可否认,muduo用于学习确实非常的优秀,但是如果只是复刻一波,那么亮点,意义又在哪里呢?所以带着思考,我写了一个除reactor内核,基本都不一样的网络库,里面融入了我对STL中内存池的举一反三,融入了我对Disruptor思想的理解与实践,融入了我对面向对象和多态的理解,等等等等;coding过程更不用说,涉及到设计,多线程编程,死锁,测试,总而言之,收获非常的大。
再说协程库,协程这个东西是和网友聊天了解到的,刚接触给我的震撼非常大,原来多路复用还能这么玩,所以也写了一个。有意思的是,虎牙一面的面试官就是我看过的libgo的作者(三面面试官告诉我的),想起在他面其班门弄斧,也是缘分。
实习。
实习的收获很多,毕竟是第一次在互联网公司,接触到了很多以前没有接触到的东西,了解了实践中的一些玩法,但我认为给我最大的收获是:
工作了一些年的同事是一个风向标。他们的能力高于目前的自己,可以促使自己朝着一个明确的目标努力。
带来更多对业务上的反思。在学校更多的是学生思维,对行业没有太多的关注。
互联网工作的笃定。如果对去国企,银行还是去互联网公司纠结,那么最好的办法就是实际体验一下,目前来看,自己对互联网还是真爱。
另外实习期间看了《Mysql必知必会》《Mysql技术内幕--InnoDB》《Spring Cloud与Docker微服务架构实战》《大规模分布式存储系统-原理解析与架构实战》。
面试。
以我的面试经历来看,10%撕代码,20%问基础,35%问项目,25%开放问题,10%聊人生。
撕代码就靠刷lc了,面试中的代码题一般不会太难,毕竟基本需要秒杀,而且面试中的撕代码还有一个目的就是看你的代码风格和debug能力。
基础的话一个是广,一个是深,面试官大多希望学生理解得越深越好,一个问题你能涉及的相关知识越多越好,比如问线程和进程,你能扯到linux的pcb实现,lwp当然更好,之前还看到一个阿里云的老哥更加讲到了寄存器的层面。然后再就是可以多整理面经,我当时把牛客能看到的问题基本刷了一遍,自己整理的好处在于可以回忆以前学习的东西,自己有目的性地又梳理了一遍,不会的又可以扩展自己的知识面,用来以后吹牛逼。
下面是我整理的一个大概的目录。
开放问题和聊人生就比较玄学了,我自己的做法是尽量多类比自己了解的知识和项目,按模块分析,并表现得自信。
拥抱开源。
我对拥抱开源的理解分为两点:
一是写博客,玩github,把自己的想法和成果分享出来,今天写这个贴子也是这一类。另外我的github地址:https://github.com/YukangLiu,blog地址 www.liuyukang.com,欢迎交流讨论。