我是2017年加入到阿里巴巴中间件技术部,我本科实际上是合肥一个不入流的三本,后来考研到西安邮电,2016年的这个时候我也和大家同样处处面试,投简历。node
幸运的是我收获了网易的实习Offer、腾讯的是实习Offer还有阿里巴巴的实习Offer。经过实习我顺利进入了阿里巴巴,在阿里巴巴这个舞台下我收获了不少。去年的时候我在gitchat上分享了一篇文章,大体就是讲了一下个人求职和学习的经历。帮助了很多人树立求职的自信,学校的好坏不是最重要的。linux
简介git
本科的时候对 Linux 特别感兴趣,心中向往成为一名运维工程师,就开始没日没夜的看相关的书籍,到了大约2013年先后的时候发现 DevOps 开始流行起来了,就开始学习 Python 但愿成为一名 DevOps 工程师,后来出去实习发现从事运维相关的工做并非个人追求,苦于在合肥这样的城市真的很难找到一份专职作 DevOps 的地方(当时在科大讯飞的时候,作的就是纯运维的工做,该公司的 DevOps 也才有个雏形)。程序员
因此我萌生了考研的想法,但愿在Linux内核这个层面作深造, 我选择了西安邮电大学,由于该校的陈莉君老师是我比较崇拜的对象,一直在拜读她的《深刻理解Linux内核》一书。web
后来上了研究生后我开始专一Linux内核、C/C++服务端开发等工做。至于为什么选择C/C++,个人理由很简单,你们都去学Java了,我要是也去学Java,那么个人优点何在,并且C/C++也更偏向底层是我比较感兴趣的地方, 因此我选择了C/C++。个人研究生三年全部的心思都投入到了C/C++还有Linux内核,不敢说对C/C++有什么独特的看法,至少我以为个人学习经历仍是能够给你们做为一个参考。面试
Linux从运维到DevOps算法
先简单花一些篇幅介绍下个人这段学习经历吧,个人Linux启蒙老师,仍是要源于一些培训公司在学习作的免费培训,大学那会常常有一些培训公司会来咱们学习作免费培训,想让咱们花钱去培训。docker
我记得当时最流行的两个证书一个是RHCE(RedHat相关的认证),另一个则是CCNA、CCNP(思科网络相关的认证),当时的我深深被Linux吸引,opensource深深吸引了我,Linux那酷炫的黑框框吸引了我。我理想中的Hacker应该就是成天在黑框框中瞧着一堆看不懂的字符。shell
就这样我开始一头扎到Linux的世界中,个人第一本入门书是大学图书馆借的一本linux用户指南,具体的书名已经记不起来了。后来开始读鸟哥的私房菜,这本书在当时真的很好,我没有想太多,只知道疯狂的读完整本书,一遍、二遍……,就这样我读了五遍,上面的实验不停的练习、命令不停的练习。编程
就这样个人Linux入门了,入门后个人开始迷茫,由于不知道下一步该学什么了,我又疯狂的开始寻找下一个目标“西安鹏程 Linux 网络服务视频“这个是带领我进入Linux最神秘的世界,在这里我发现Linux能作不少不少有趣的事情,我开始搭建Apache服务器了,我竟然能够运行一个网站了,我还学会了用Linux作DHCP服务器、DNS 服务器、VSFTP服务器,一时间我以为我打开了一个新世界,后来开始接触网络、搭建路由器、防火墙等等。以为Linux真的很奇妙,当时我还利用 Linux搭建http代理服务器,而后在宿舍经过学校实验室部署的http代理服务器来免费上网。
后来开始出去实习我就已经能够实现不看任何文档,从头源码编译LNMP,并搭建discuz论坛,就靠这个本事我找到了个人第一份实习,工资是1800块。
后来发现工做了,就没有心思学习了,因此又回到了学校再好好巩固本身的基础,并下定决心开始考研深刻学习Linux,在考研的期间我发现了马哥 Linux,这又是我人生中另一个起点,马老师讲课注重原理和实践,七分原理三分实践,经过他的课程个人 linux 水平提高了一个很大的档次,他的全套课程我完整的听过三遍,每个课程上的实验我都作了至少五遍以上,这奠基了个人 Linux 基础和shell脚本的基础,此后在个人职业生涯中shell脚本一直是我最强有力的助手。在研究生阶段我还专门作过shell脚本相关的分享。
在2013到2014年这段时间开始流行自动化运维、Python,这个阶段我开始学Python,还有如今比较流行的Flask框架,我自认为我应该是最先的一批Flask框架的用户了,当时国外人出的一本《Flask Web开发:基于Python的Web应用开发实战》书,我也是第一时间从某宝上买到并阅读,只惋惜后面转到C++后就没再看过了,这期间用Flask作过一个博客。在研究生阶段还帮同窗和一些朋友运维过一些网站,作一些简单的调优和加固。到此为止个人DevOps之路终结了,今后走向了Linux C/C++的路上。
经过上面个人这些经历我给你们简单的总结下:我以为学好Linux运维须要作到如下几点:
C++从小白到入门
C++我是从研究生入学前的二个月开始学习,基本算是零基础吧,就大学那会学了一些C的知识,常常写一个程序一堆”烫烫烫”,真的是到了本科毕业还没搞懂C语言。而后在这个二个月我开窍了,忽然发现对C语言融汇贯通了, 而这一切要归功于《C和指针》这本书,总结一下,我认为C语言要学好必须理解三个概念。
真心不推荐在Windows上来学习C语言,由于它屏蔽了太多的细节,而这些细节却又是C程序员不可或缺的一部分。C语言这个阶段过去后,我开始学习Linux C系统编程这个部分,最开始接触的一本书就是《Unix/Linux编程实践教程》强力推荐给你们,这本书会给你介绍如何经过man手册来帮助编程,如何去实现who、cat、ls、ps等系统命令。经过这本书的学习会让你对Linux上不少的原理有一个深入的认识。
这本书学完后我就开始看UNP和APUE,其中APUE我并不推荐给你们,我推荐给你们的是《Linux/UNIX系统编程手册》这本书的内容更全面,更新。建议你们在看这些书的时候能够作详细的笔记和代码练习,在个人博客上就有我总结的文章。系统编程ok后,就要重点看UNP了,看这本书的时候要找重点看,里面有的章节已通过时了,还有一些章节对于咱们目前来讲用途并不大,好比STCP的部分。对于这本书重点有三个部分。
在个人博客上也有一篇文章介绍了相关的内容,学完这个后,剩下的就靠多实践和多读一些开源的项目来积累本身的经验了,这里推荐cjson、webbench、Tinyhttpd等,代码量都不大,很容易读懂,在读懂的基础上能够进行适当的改造和重写。
C语言和Linux系统编程这个部分结束后,就要开始踏入C++的世界了,自从C++11出来后,我以为C++易学了,可是苦于现存的老的C++代码仍是有不少,因此咱们不得不去学习C++98相关的知识,这里我推荐《C++ primer》一书,注意是C++ primer,不是《C++ primer plus》我看书的方法都比较老套,第一遍力求看懂,第二遍开始抄代码,练习,第三遍开始总结写博客。因此这本书我前先后后看了大半年, 后面又看了C++编程思想上册,Effective C++、深度理解C++对象模型、Exceptional C++、深刻理解C++11等经典书籍,看书的模式基本上都是二到三遍,经过抄书上的代码和写博客来加深记忆。看完这些书说真的,我以为个人C++还只是一个小白,我真正蜕变要从读《Linux C++服务端编程》陈硕的这本书开始,经过这本书我以为个人C++水平有了一个质的飞跃。
我理解C++有如下几个要点(只是部分):
到了这个阶段后我就开始找工做了,上面的所有过程花费了研究生二年的时间,后来找到了某BAT实习的工做后,我就一边实习,一边读《Effective Modern C++》,这本书我重点推荐给你们,在个人博客上也有所有的总结,这本书讲了不少C++11种的一些实现细节、坑以及建议。
最后推荐一些linux内核相关的书籍和学习方法
网络上有不少从头开始编写一个内存文件系统的文章,在个人博客上也有一个系列讲解Linux内核模块编程入门的文章,经过编写Linux内核模块能够作不少有趣的事情,好比系统调用拦截、网络拦截、作安全审计等等,经过编写内核模块能够提升对Linux内核学习的兴趣。
BAT求职之路
研究生阶段我主要面试了阿里巴巴、腾讯、网易都是C++研发工程师,只有网易拿到的是实习的Offer,其余的都是拿到了实习和正式的Offer,就C++这个岗位来讲,阿里巴巴的要求明显高于腾讯和网易,网易的C++面试相对容易一些,问的很基础,感受就是走个过场,都没问什么太难的问题,多是由于是招实习吧,腾讯的C++面试偏基础从OS、网络、编译原理、算法等。问题都不太难,问的比较广,阿里巴巴更侧重知识面、底层原理、解决问题的能力等。我阿里巴巴一共面了五面,问了不少C++、算法、Linux内核等知识。
在整个求职过程当中,我作了如下几件事:
整理面试题和学习一些底层的OS知识对我整个面试过程当中帮助很大,正常状况下若是你只学习Java或者C++是很难拿到阿里巴巴的Offer,阿里巴巴对应届生的知识面、知识的理解程度要求仍是比较高的,在个人整个C++面试过程当中,问的最多的就是IO复用、智能指针、内存泄漏的问题如何解决、如何排查Load高的问题、Linux内核相关的知识等,而这些问题对我来讲早已驾轻就熟,在搜集面试题的时候不少问题都是反复被说起到的,我只须要好好总结便可。
另一点就是你们在准备面试题的时候不能只记一个结论,多问问为何,举个例子,TCP/IP的三次握手和四次挥手的过程是什么样的,咱们不光光要知道这个问题的结论,还要知道为何是三次握手,四次挥手,为何不是二次?当被问及到epoll、select的区别时,你应该从使用方法、可移植性、性能、优缺点、内核实现等多个方面分析和总结。而不是简简单单的就说起一个优缺点就完事了。 你擅长的地方你应该多多引导你的面试官去问。
工做心得
在公司实习了大约1年,今年七月份正式入职,在这整个过程当中我也零散的作了不少小需求,对C++的理解更加深入,尤为是对软件工程有了一个新的理解,在此我想分享给你们。
可能对于不少人来讲编码规范、CodeReview、UML、单测好像都是说说而已,我起初也是这么认为,感触并非很深入,直到个人同事开始带个人时候,我本身亲身去体验的时候才发现这其中奥妙无穷, 咱们团队使用Chromium的base库做为本身的基础库,编码规范、全都follow Chromium,至于为何不用boost,个人理由则是,boost是一个我没法驾驭的怪兽,而chromium的base库是我能够驾驭的,能够打组合拳,代码的稳定性已经通过上亿人的考验,值得咱们信赖。推荐你们看看chromium的base库,源代码很易读。经过阅读它的代码能够学习到不少知识。推荐一本书给你们《C++ API设计》,讲解了不少软件工程、设计层面的知识。
总结
上面说了不少,更侧重分享了个人学习经历,和一些感悟,可能我说的比较简单,实际上理解上面这些东西,是存在一个过程的,是一个从量变到质变的过程,在整个过程当中我理解到,学习要坚持,不是一蹴而就的,要经历量变到质变的过程。