程序员技术练级攻略

从我升入大学开始接触编程到现在,已经有 5 个年头了。这期间,有过第一次写出 hello world 的喜悦,也有过一段不知所措的迷茫期。作为一名初学者,我迫切期望能有人出来告诉我,你应该怎么去学,应该学什么,怎样才能把基础打好。但是,大学四年并没有这样的人来拯救我,我也一路跌跌撞撞地走到现在。

后来在发现了酷壳这个网站,并阅读到了陈皓老师写的程序员技术练级攻略一文,很是受用。那我想,不如照猫画虎,我也从校园招聘的角度写一篇初级入门指南,以期给后来者能够提供一些帮助。于是便有了此文。

基础储备

对于打算从事编程工作的同学来说,基础真的很重要!包括语言、数据结构、算法、操作系统和计算机网络等方面。而这些东西是不可能在短期之内速成的,必须要日复一日地持续输入,理解,再到整合所有的知识体系。

在学校时,只是学过简单的 C/C++ 语言入门,自己也很感兴趣,但并没有自发地去深入理解背后的东西,比如堆栈、指针等。但后来经过老师的指点,终于意识到:虽然广度很重要,但深度也不能丢!

之后,我每节课后,都会自己去看相关的知识点,去敲老师讲过的代码和作业。不要怕浪费时间,只要你上课听了,肯定能很快回忆起来。另一方面,计算机领域的经典书,比如《C和指针》,《Effective C++》,《C++ Primer》,《深入理解计算机系统》,《Linux高性能服务器编程》,《剑指offer》等,这些书一定要自己踏踏实实地看完,否则会毫无效果,还不如不看。而且一定要在 C/C++ 语言、/*数据结构*/、 算法、操作系统、网络和数据库每个领域至少看两本经典的书。我除了 CPPP(《C Plus Plus Primer》) 这个大块头看了一半放弃之外,其他书都一本不落地看完了。

我看书的速度比较慢,所以需要花费较多的时间,我的方法是:在学校上课的时候看。学校的课程比较无聊,很多老师我感觉也就是走个过场,同学们在上课时也都在玩手机。但我很少逃课,所以经常去上课时带着正在看的那本书,有时候一节课只能翻两三页,没关系,但一定要理解!并且看的时候自己觉得是重点的、不懂的都可以写上你的理解,至于原因,下面会说到。我曾经看深入理解那本书用了两个多月,虽然慢,这本书让我对计算机的运行原理有了非常深刻的认识!

理论性的东西自己看书,数据结构这部分主要是代码,所以这部分一定要多动手,多敲代码,比如我曾经自己实现的一小部分数据结构:这里

当然,不管是看书还是写代码,肯定会遇到疑惑的地方。我的做法是:遇到以前学过但忘了的知识时,不会只回去看这一个知识点,而是这一整个章节。除此之外,上面提到的书,我少则看了两遍,多则看四遍;部分代码都至少自己写了3遍!(这一点不一定对每个人都适用,只是我的做法,供参考)每次重新开始时,都会有不同深度的理解,这也就是看书时要写笔记的原因,你可以对比上次的理解和这次有什么不同,这样绝对可以大大加深对这一部分的记忆。

总结:

  1. 良好的自我约束。男生少玩游戏,女生少追点剧,为看书和敲代码让路!
  2. 踏踏实实看书,这一点没有捷径。
  3. 踏踏实实敲代码,原因见面试指南部分。
  4. 重复以上事情。我自己不属于天资聪慧的那部分人,只能用不断的重复来弥补。当你代码写的多了,面试官让你写一个快速排序只是分分钟的事情,无他,唯手熟尔。

总之,良好的基础可以让你打败 80% 的人,在此之上,如果你能再去了解一些如 MySQL,redis,HTTP,MapReduce,一致性哈希,倒排索引等在大多数人不知道且面试中可能会问到的东西,真是再好不过了!

准备求职

如果你想要找更好的工作,拿更高的薪水,仅仅掌握基础是远远不够的,你还需要有自己的核心竞争力!你想,每年毕业生有那么多,其中绝对不乏名校的优秀学生。那么在同等水平条件下,面试官为什么要选择你而不是他们呢?

那什么才会成为你的核心竞争力?我的观点是:计算机领域的前沿知识,博客,项目,github 和代码量

比如我在面试深信服的时候,面试官问到我的 web 服务器如何优化,我就说了缓存、池化技术和分布式,看得出来他很满意,这一点为我加了不少的分。面好未来也问到了分布式。其实我之前看过一篇关于 nginx 的博客,借鉴了其中 master-slave 的思想。其他的前沿知识如云计算,大数据,网络安全,人工智能,虚拟现实等等,就需要你自己平时多关注留意科技新闻。但不必专门花时间去学习,让面试官了解到就好。

博客。最初我还没意识到博客的重要性,加上看书占用了不少时间,并没有重视这件事。但今年的上半年,我进入了一个瓶颈期,感觉特别迷茫,心里特别焦虑特别想学习,但就是不知道该学什么,怎么学。于是今年暑假我选择了留校复习。静下心来,40天的时间,从前往后每天一个知识点,并发表到博客。这也是一个自我梳理和知识糅合的过程,对我后面的求职起了非常大的作用。

项目。在复习后期,自己是需要做几个小项目。我只详细做了一个 http web 服务器。我从中学到的东西是:web 服务器的工作原理,复习了网络编程知识和学习到一个项目的框架,比如需要有配置文件,日志等。还有一定要去优化你的项目,具体怎么优化就见仁见智了,比如可以将单线程的改成多线程的,I/O 多路复用的版本,也可以加 memcached 等,或者一些小的功能比如用正则去匹配 IP 等。总之一定要让你的项目跟别人不同!但最好的是自己独立做一个项目,网上找的项目很容易跟别人冲突。比如我在8月份的时候,已经投了很多的简历,下次再看到某个招聘信息,不知道有没有投过简历,再投一次会浪费很多时间。所以自己写了一个“校招管理系统”(类似一个简化版的拉勾),虽然很简陋,解决了自己的需求,也会让面试官感受到你用编程解决实际问题的能力。

github 和代码量如果做好了,绝对能让面试官对你刮目相看。我的简历上写着 github 和博客地址,面试时自我介绍里也会提到代码量,会被面试官用笔标出来。但前提是你的代码有一定分量,github 上不是空无一物。

还有一点,就是刷题,可以提高你在笔试中的通过率。要是在求职中连笔试都过不了,后面的环节就不用说了。刷题开始时间越早越好。4 月份的时候,我正处于学习的低谷,就找来《剑指offer》这本书,一天一道题的节奏,没想到就坚持了两个多月!做完了上面的67道题目,地址在这里。直到现在,每想起这件事,我都会由衷地感谢当时的自己!当然,你也可以去牛客网、LeetCode、Project Euler 上找题目来做,但《剑指offer》是一定要做过去的!

面试指南

简历怎么写

我个人认为简历至少应该提前半年就开始写,因为不可能一次性就写出非常完整的简历,还需要一个不断完善的过程。可能一开始你的简历上只有寥寥数个专业技能,但通过半年的时间,完全可以一点一点添加上来的。同时在复习阶段,还需要不断地以简历来指导自己的复习方向,再以复习来完善简历。我在简历做的比较完善的时候就去挨个复习上面的知识点,但一定要扩充,和其他的知识联系起来,最好可以写在对应的简历条目下面,在面试前看一遍,非常有用。

同时,简历和自我介绍一定要突出上面提到的核心竞争力!比如可以在个人信息部分写上自己的博客和 github 地址,在自我评价部分写『我本科的代码量是 6W 行』就比『我非常热爱编程』好得多。自我介绍时可以提一下你看过的书籍,代码量,博客等等。

笔试+面试

基本到 9 月中旬,各大公司的校园招聘就开始了,接下来就要靠自己的行动力了。多出去跑宣讲会,多参加笔试,如果时间来不及可以在网吧或者带自己电脑去咖啡厅做笔试。经常早上宿舍还没通电就起床,晚上已经熄灯了才回来,一天能吃上一顿饭就感觉特别幸福,而且还会因为各种原因错过很多的笔试面试。整个人的感觉就一个字:累!但不管是身体上还是心理上的,适当要鼓励自己,想想自己以后的 XXX 万年薪,也许会笑的合不拢腿,哦不,合不拢嘴呢!

如果你基础好的话,这段时间就不用再看书了,也没时间。但不管基础好与不好,在笔试和面试中遇到的问题一定要记录下来,并立马解决!现场面试可以用手机录音,在线笔试面试可以录屏。总之,这段时间就是一个不断发现问题并解决问题的时期,一定要重视。

实习

关于实习,个人建议可以去参加一下每年 2-3 月份的笔面试。如果过不了,可以提前体验一下招聘的流程,找到面试的感觉。如果通过了,一般到 6 月份就实习结束了,回来正好做一个完整的复习,把这段实习经历写到简历上,一举两得。

彩蛋

这里是一些好的习惯,没做到不要紧,做好了绝对助你锦上添花,如虎添翼!(我才不会说我是为了凑字数的~)

最后,希望这些文字对你们有所帮助!