浅谈成为程序猿的心路历程

—-记录大学生涯第六学期的点滴

我不是科班出身,但我在大学的第六学期开始转型为程序猿(可能还算不上)
站在人生的十字路口,再一次面临抉择,考研 or 就业,我选择了后者
这是篇长文,能看完的一定是真爱

作为班上唯二选择就业的人,我心里有很多想说,下面扯了不少这学期我干的事,当然也包含了不少我丰富的心里世界。同时也分享了一些我的面试经历和学习过程,哈哈,希望大家能耐心的看完我的扯淡。(电脑端看文效果更好哦~~)

二月

可能要从上学期的寒假说起。结束完半个月的国际大学生数学建模竞赛的集训和比赛后,回到家后我开始学习数据结构。(有点血亏,只拿了个s奖)

由于MCM已经耗去了半个月,再加上过年一些必须走的流程,实际上数据结构我只学了半个多月,主要就是为了3月4日的PAT甲级考试。(我竟然还能清楚的记得日期,毕竟200块一次)然后,让我重现一下第一次考PAT的场景…

三月

为了避免使用坑爹的VC++,我没有选择同在下沙的浙传考点,特意花了2个小时的路去浙中医考试。原本以为考场里的IDE是网上说的CFree,结果意外之喜,有我最熟悉的codeblocks,然而没想到,考场里的codeblocks竟然不能建工程,只能直接建cpp文件(尼玛还有这种情况)导致的结果就是不能调试。PAT的甲级题一共4道题,分值分别为20分,25分,25分和30分,时间为3个小时。考试开始,很快把第一题A掉,继续往下做,第二题和第三题虽然没拿到满分,但前70分的题目已经拿到了61分,可能有一些特殊情况没想到,我决定先把最重要的最后一题做了再完善这2题。看到最后一题,第一反应就是90分稳了,一道二叉树,题目就是给了中序和后序,然后自己建树,层序遍历输出,复杂在不是普通的层序遍历,而是Z型输出,一行从左遍历,下一行从右遍历,再下一行继续从左遍历,以此类推。然而,前2题我一共花了45min不到,空出了2个多小时竟然都没有最后一题搞定。。因为是闭卷,我有点忘记建树的模板代码,只能现场自己编出建树的代码(因为无法调试,各种报错)花了2个小时左右才建好(数据结构掌握的还不熟练,基础很一般)。最后10多分钟硬是没完成Z型的层序输出(心态已经不行了),导致第四题一分没得,最终仅仅拿了61分。

如此低的分数让我甚是痛心,2天没有写代码。2天后回到实验室,翻出PAT考试的题目,先重新做了第4题,不到半小时就A了出来。然后又去看第二题,多提交了几次也满分通过,原来是题目有歧义,没写清,2种情况都试下就行(考试时时间太紧,就想着先往下做,没注意,况且测试样例的分数分布也不合理,一个明显存在不小误差的算法得到的分数也能接近满分)第三题做了一会还是没有A掉,就上网看了网友的题解,发现原来只要一开始再加个并查集判断一下图的连通性,就能得到满分。总的来说,这次的PAT甲级题很简单,可能是准备不充分或是心态啥的最后没得到好的成绩。

可能很多人不知道PAT是什么,其实它是浙大组织的计算机程序设计能力考试,分为顶级(T),甲级(A),和乙级(B)。考出甲级及顶级的证书对浙大计算机考研或就业有很大好处,列了部分名单如下:

接下来我就开始重学C++了。(因为大二的时候上这门课不是很认真,只是水过了)实验室里刚好有C++primer和c++primer plus这2本书,因为是英文版的,且都厚的吓人,最后我还是用了慕课网的视频来学习。视频讲的真心是蛮好的,从最基础的语法到封装,继承,多态,还讲了友元,模板等。当然,对于数据结构算法的知识我也没落下,每天都要刷几道ACM的题,掌握新的题型。三月份期间,随学校参加了一次浙大举办的团体程序设计天梯赛,拿了华东赛区三等奖,之后我们实验室又举办了ACM校赛,选拔省赛队伍。(我作为命题组默认拥有省赛资格)

四月

四月上旬,某集团到我们学校举办宣讲会顺便招聘(我一直以为它是卖空调的,后来才知道空调只是它的五大产业之一…)。笔试很水,只是一些检查综合能力的题和一些找规律的数学题,跟阿里巴巴,海康的线上自测题里的能力测试题差不多,都不涉及专业知识。原本以为有第二次笔试考专业知识的题,没想到直接进行了面试,随意说了一些自己掌握的东西,做过的比赛和项目,晚上就收到了offer。这算是我收到的第一个大公司的offer了,但是考虑到它并不是一个互联网公司,且整个面试笔试的流程并不严谨,所以把它暂时作为后备,还是打算多找几家公司面试去。

哦,对了,三四月份,还不止,应该是从去年9月份开始一直在做一个挑战杯项目,狗屎的冲进了省赛,又在意料之内的血崩,哎,说多了都是泪。

四月上旬我差不多把C++的基础知识学习完毕,便开始学习Linux系统。刚好实验室有台作为ACMOJ的服务器是Linux,所以我并没有装双系统或虚拟机来配置Linux,下了个SSH连接器MobaXterm,通过远程登录操作有Linux的那台电脑。同样,我还是选择了慕课网上的教学视频开始学习,感觉慕课网对基础知识讲解的真的蛮好,虽然进度慢了点,但是很清楚,不过一些高水平的实战项目还是得到github上找。从刚开始的系统安装,到一些基本命令,文件系统,网络管理,权限管理,shell编程等都有涉及。学到网络管理的时候顺便把计算机的专业课《网络原理》的一些基础知识也讲了,对了前面也提到我不是计算机专业的,我是自动化的。

PS:这里一定要吐槽一下自动化。不是说这个专业不好,说实话也是可以当做工业上的万金油专业了。主要是针对我个人来说,大二学院开了门单片机,老师不讲课,直接让我们做例程,从头到尾都是自学,期末再交个简单项目就行。然后分到自动化后也没有选择微机原理这门课,所以对硬件原理基本不懂,只是会写了几个简单例程。而我个人感觉本科自动化最重要的就是会单片机,从51到32,再可以到DSP。反正我是不懂。剩下的就都是理论课,自控,现控,运控,过控等等。这些基本就是为考研做准备的。所以自动化还是比较推荐考研,否则单片机一定要好,刚好我两者都扯不上,就转而搞起了IT。

四月下旬,浙江省ACM大赛意外的遭遇滑铁卢后(以后可能会写一篇blog复盘下那次比赛,前面2小时发挥很好,后面三个小时,哎,太可惜了),接到了一个公司的面试短信,地处天堂软件园,百度一查,竟是个跨国的金融IT公司,还是很合我胃口的。周末跑过去招聘,意外的发现已经被免掉了笔试,我看了笔试试卷,除了C语言外,还有不少牵扯到数据结构的编程题,后面还有英文的阅读理解。。一个小时做完,压力还是很大的。后来一问HR,原来是PAT甲级过了50分,直接免掉笔试(没想到这么低的分数还派上了用场,暗自庆幸)

面试感觉比较正式,先是一段自我介绍,然后说了下我做的比赛和项目,接下来面试官就问了一些技术上的问题。首先他们对我做了ACM比较感兴趣,但貌似自身不是很了解,让我讲了道题先说了思路,后来又让我现场写出代码。接下来问了我一些Linux的东西,让我详细地讲下用户权限(尴尬,当初还没学到这一块内容),我就讲了下用户分为root用户和普通用户,还有知道的一些文件的读写执行权限,以及sudo权限的用处。在后面学习Linux过程中,才发现还有好多特殊权限(ACL权限,suid,sgid,sbit,不可改变位权限等)。感觉面试官已经不是很满意了,然后问我数据库的东西,我更慌了,因为压根没学过,让我写一个很简单的sql语句,从一堆产品里选出价格第二高的产品。然后我不会,再次gg。最后,面试官问我英文咋样,又让我用英文自我介绍并说点感兴趣的东西,哎,我大一过完6级后就没怎么学过英语,更别提口语,两个字,血崩。。。

ACM的失利和面试的失败压的我有点喘不过气,刚好五一到了,就趁着假期回家修整了三天,彻彻底底放松了下。

五月

五一回来,我先放下了Linux的学习,花了大约一周的时间学习了sql的语法,并熟悉了MYSQL数据库,接着又开始继续学习Linux。这段时间,我边学习也边在网上投简历,没想到简历的反馈很差,我仔细一斟酌,感觉就是关于计算机的项目基本没有的原因。那个时候能拿的出手的除了数模的省一,ACM的省三,剩下的项目比如墙内导线,智买家居等都是挑战杯的,跟机械电子方向更有关联,与计算机基本没啥关系。于是到了中下旬时,Linux学到shell编程时,掌握了基本的shell语法后,我就暂时停止学习Linux了,毕竟以后不搞运维。刚好实验室有个学长正在重写本校的ACMOJ,其中判题端就是用C++来写的,他打算让我搞下,我也正缺项目,所以一拍即合。

先注册了github(世界上最大的代码存放软件和开源社区),因为代码都是开源的,且上面有无数大神,所以可以研究他人的代码。然后学习了git的版本控制,和github的基础操作,之后就开始研读南京理工大学ACMOJ的判题端代码。看了没多少,就发现有很多自己不懂的,网上一查,发现大量涉及计算机另一门专业课《操作系统》。马上跑到图书馆借了几本操作系统的书开始研读,主要看的就是进程管理和系统调用(主要感觉这门课好难,也没有足够的时间都学完)。

在学习判题端的过程我也同时参加了几次招聘,其中有家搞图像算法的大公司(技术很厉害),进行了笔试,因为我选择的是c++开发,所以没有涉及图像算法,笔试题竟然都是c语言的知识,我个人感觉还是很简单的,很快做完就交了卷,然后,就没有然后了。。杳无音信,看来是没过笔试了。。接着又参加了某金融IT公司(属于阿里系)的笔试,试题先是c语言的知识,然后c++和JAVA二选一,接着是数据库sql的编写,然后2道编程题,一道设计数据结构的算法,最后是惯例的能力测试题。做下来感觉一般,编程题都差不多写出来,前面选择题有几道不清楚,数据库的有一道不会,2道写了特别长(套了3层select语句,估计会被判错,主要有几个函数用法不熟悉。。)最后留下来改卷,因为是学生改卷,我负责选择题,发现自己错了不少多选题,数据库那几道答案特别精炼,估计都gg了。

笔试完这2家,一直没有音讯,因为我一直优先往大公司投简历,看来只能往小公司投上简历了。我边学习判题端的时候开始边向小公司下手,没几天就收到了四五家公司的面试请求。就在我打算一个个去面试时,突然收到了之前笔试的那家金融IT公司的面试电话,真的有点喜出望外,毕竟离笔试差不多有快一周了。这时候刚好是五月底,就在端午之前,周末我做了两个小时的车赶去面试。

到了目的地,我首先拿到了自己的笔试试卷,成绩并不高,看了下具体的题目,发现一道链表的算法题竟然多扣了10分(当初考完对过答案,一点没错),数据库的题是果不其然的扣了很多,后来想想毕竟是学生改的。。之后拿着笔试试卷和简历就开始面试了。面试是群面,我这一批6个人,有两个面试官。照常的是每个人分别2分钟自我介绍,然后面试官一个个问问题。自我介绍后,我是第一个被提问的,首先问了我数组和指针的问题,我解释了它们本身的含义,并引入了堆和栈来阐述它们的结构和特点,然后让我全面的说下线程和进程的区别。刚好之前研究的判题端,就需要fork子进程,用父进程来监测。我就先说了二者的主要区别和一些性能上的区分,再引入我项目中为什么用到进程而不用线程。第三个问题是问我tcp有几次握手,分别是什么(感觉好水,幸亏我之前补过网络原理的知识),还有几个问题忘记了,但差不多是回答出了。最后问我有没有做过跟数据库相关的项目,我很尴尬的回答了没有。

面试结束后,自我感觉还行,果然第二天收到了hr的电话,被成功录用了。

六月

六月初结束完最后一门专业课的考试后,我的大学自动化生涯终于是暂告一段落了(下学期只剩一个课程设计和生产实习以及第八学期的毕业设计)。由于实习是从七月初开始,我也刚好了空了差不多一个月时间再来充实自己。在实验室SLJ学长的推荐下,看了篇互联网的快餐指引 (一份连自己在说什么都不知道的快餐指引) ,大为触动。如何从事互联网,需要具备多少技能和知识储备。

准备工作

  • 学好英语
  • 学会使用Google
  • 学会写邮件

理论知识

  • 计算机体系结构
  • 操作系统
  • 通信原理和计算机网络
  • 数据结构和常见算法

实用性技术

  • GNU/Linux 操作系统,命令行和 shell 脚本
  • 一门弱类型的脚本语言
  • 正则表达式
  • 常见系统的架构
  • 一套熟悉的工具链
  • (可选) 一门 Lisp 方言

还有很多

  • Linux 操作系统的运用和基本运维能力
  • Web 应用开发技术
  • 简单的前端页面开发能力
  • 基本数据库操作
  • 版本控制(Git)的运用能力
  • 文档阅读和编写能力
  • 常见安全审计技能
  • 移动端开发技术
  • 从以上技术运用和学习中延伸的各类知识

所以我先从自己缺乏的一项来补充,学习一门脚本语言。包括了Python,Ruby, Javascript, PHP,还有好多,我选择了最近火了好几年的Javascript。 首先实验室里的大佬们都会,毕竟ES6出来后,大大提高了JS的开发效率,而且考虑到Node用的也是js语言,所以如果学好了js,可以从前端搞到后端,成为一个全栈工程师!(就爱白日做梦^^)

话不多说,我先学习了HTML和CSS的基础知识,接着按照知乎大神的推荐,淘了几本Javascript入门的经典书籍。于是花了半个多月的时间读了《Javascript高级程序设计(第三版)》,同时看完了《Javascript+DOM编程艺术》。虽然这两本书已经有点老了,但是毕竟是经典,用来入门最好不过。之后又看完了《Javascript语言精粹》,也挺老的。然后是重头戏,阮一峰老师的《ECMAScript 6 入门》,JS凭借着ES6的新标准又火了一把,大大提高了开发效率。

学的时候也做了几个水水的小项目,比如DOM编程书里自带的网页项目,还有经典的todolist。写项目的时候不可避免地要用到编辑器,在SLJ的推荐下,用了Atom。Atom是一个很强大的文本编辑器,只要安装好需要的库,再辅以特定的插件,完全可以成为多种语言的IDE,C++,JAVA,Python,Javascript等都不在话下。不仅如此,社区里还开发出了很多功能强大的插件,我就不一一阐述了,附上效果图。

再随便附上一个装逼插件 (Activate Power Mode)

七月

经过一番波折,也算是成功入住到公司旁了。俗话说不懂后端的前端肯定不是一个好的Web工程师,最近又开始学起了node,当然它所用的语言就是js,学起来也比较轻松。(是不是感觉我有点急于求成,我也发现了,主要马上要入职了,不知道被分到啥岗位。等这段时间恶补完前后端的知识,再到github上看点项目写写)

看知乎黑我那家公司蛮多的,希望别被分到delphi岗位上。今天趁着还没上班跑去观摩了下阿里巴巴,还有它的邻居网易。

哈哈,相信没有程序员会不想要它们的offer的,继续加油吧!Kerminate!

能看到这的朋友们相信大多还是看完了我的扯淡,码了五千多字(这扯淡也是蛮会扯的),谢谢你们的阅读,共勉!