那年校招,我去霸笔了!
知乎上的这个问题相当热门,不少大佬都回答过了,今天我也来聊聊。
编程不是坐火箭,可以一飞冲天。
但确实积累到一定阶段,会隐约觉得自己好像有了涡轮增压,开始突飞猛进了。
这个涡轮,来自不断涉猎积累起来的知识广度,来自大量Coding锤炼出来的编程经验,来自长期学习总结下来的方法与思想。
当你经历和拥有了这些,即便你仍然有很多未曾涉猎的计算机领域,许多不曾掌握的计算机知识,但你也不再迷茫和恐惧,因为在你的大脑里,已经构建起强大的学习能力和知识体系,在未来的学习道路上,你要做的只是添砖加瓦,不断完善而已。
下面说说我自己的经历。
先提醒下,篇幅很长,知识很硬,建议先收藏再慢慢看。
高中在四川下面一个普通的不能再普通的县城,从小身边人给我灌输的思想就是:电脑、上网这些词,和黄赌毒是并列的,一旦接触就戒不掉,无数孩子都是因为上网前途尽毁,辍学打工。你知道的,这种思想在广大的农村地区应该非常有市场的。
所以,一直以来,我跟计算机这个东西就没什么交集。高考完在选择专业的时候,曾经想报考计算机,但同村唯一的一个大学生告诉我:计算机专业满大街都是,你没看到电视里什么新东方、五月花、蓝翔、北大青鸟都在招计算机的人吗,出来竞争大,根本找不到工作。
年轻的我居然信了!!!
最后报考了一个偏硬件的通信工程专业,当年手里的那本报考指南,把这专业都夸上了天了。
大一:迷茫中摸索
后来入学以后,我很快发现,就我们学校的师资力量平台以及当下的就业行情,搞硬件这条路太难了。
经过一个学期的折腾,我自己下了决心:走软件这条路。
大学那几年,都流行考证,也不管这个证考来有没有用,考来干嘛,反正别人考,跟着考就对了!
大一的第一个学期,我们非计算机专业的同学流行考计算机二级证书,说是以后毕业找工作加分项,我也没有免俗,跟着交钱去学吧。
那时候也不知道计算机二级证书是什么,要学哪些东西,没想到学校统一报名学的竟然是个早已作古了的数据库编程语言:Visual FoxPro。
不过,第一次接触计算机编程,还是很兴奋的,从表的字段、结构、索引、视图到SQL语言,然后到程序设计的循环、分支、函数等等基础概念的第一次接触,都在当时一张白纸的我脑子里留下了深深的印象,我学的也特别认真,这一点从当时做的学习笔记就能看得出来:
通过这个计算机二级的考试,算是正式点燃了我对计算机和编程的兴趣。考完了计算机二级之后,我没有停下,继续用这个VFP自己做了一些程序,各种XX管理系统。
那时候刚刚进入大一下学期,开始教授C语言了,我却没有意识到这门课的重要性,还在研究VFP的高级用法。直到当我拿着写出来的软件给网友晒的时候,却被泼了一盆冷水:这年头谁还用这语言啊,连C语言都不会吗?就这?
那时候开始,我调整精力,开始全面学习C语言。
但老师拿着上个世纪流传至今的PPT,像个PPT阅读机器人一样的教学方式让我意识到靠上课学习C语言不现实。
我开始尝试自学,很多跟计算机关系不大的课程,能不去就不去,自己看书学习,期末考试确保不挂科就行。
但是编程这东西,三分靠看书,七分靠实践,得要上机练习才行!实验课每周次数有限,不能做到随时想练就练。于是自己淘宝淘了一个二手笔记本电脑,就在那台1G内存,慢如牛的笔记本上,使用TurboC2.0这样古老的IDE开启了我的C语言编程之旅。
当时的教材是著名的清华大学谭浩强的《C程序设计》,这本书你懂得,一个多月学完后,我的E盘里塞满了练习编程的程序,有一两百多个吧,但感觉这东西好像没啥用,都是在一些黑乎乎的窗口写一点数学运算之类的题目,什么九九乘法表,最大公约数,质数,水仙花数,阶乘,椭圆等等,感觉实用性不高啊。
两个月后,我加入了一个信息安全协会,里面有很多喜欢计算机、编程、网络安全的同学,而且一进去发现,大家的段位明显高出了我不少,这使得我一下有了紧迫感,自己只会的那点C语言菜鸟级功底根本不够看。
协会里会定期举办编程比赛,看着别人展示出来的作品,我开始更加努力,也在那时,知道了C语言后面还有个C++,知道了除了黑乎乎的控制台程序,还能开发好看的有界面的Windows程序出来。
经过一段时间的疯狂学习,提前一个学期把C++给啃下来了,还学会了VC++开发,写了一些稍微复杂的程序,像是socket聊天程序,五子棋程序,贪吃蛇游戏等等,这个时候,感觉自己对语言的掌握基本到位了,能熟练使用C和C++实现自己想要的功能逻辑。
大二:打基础
进入大二,加入了学校的网络安全研究所,进入研究所的第一份工作,就是一个跟网络数据包打交道的项目:将网络数据包实时抓取下来并进行数据还原,我负责HTTP协议部分,这难度对当时的我来说算是陡增。
印象最深的是,第一次看到了网络数据包长的是什么样的。之前学计算机网络时,总把数据包挂在嘴边,什么TCP/IP几层协议,张口就来,却连真正的数据包都没见过。
学习计算机网络,一定得抓个包来看看,看看课本里的一层层协议,一个个字段,在网络中真实的样子。我们当时没有使用wireshark,而是一个非常不错的国产软件——科来网络分析系统:
通过这个项目,算是真正把计算机网络学到肚子里去了,要做到网络数据还原,涉及到数据捕获、文件处理、协议识别、TCP会话重组、应用层协议识别、数据提取并还原等等一系列工作,无论是对于计算机网络的学习还是对于编程能力的锤炼都是非常好的机会。
也正是在这个时候,我明显感觉到自己的知识不够用了。
一方面,我开始接触几万行,十几万行代码的项目工程,怎么设计和架构,完全抓瞎,设计模式、数据结构与算法的短板开始暴露。
另一方面,C/C++底层软件开发,需要非常扎实的系统编程能力和操作系统知识,进程线程原理,堆栈原理,进程间通信,多线程同步,内存映射,内存对齐,虚拟内存等等基础知识的缺乏,也暴露了这方面的弱势。
光会一个C/C++哪里够啊,开始一边做项目,一边恶补学习这些知识,没办法,咱们专业他不讲这些啊,那时候看了许多开发的书,一边看书一边项目中编程实践,消化的特别快。
《Windows核心编程》 《数据结构与算法》 《大话设计模式》 《Linux服务器开发实战》 《TCP/IP详解·协议》 《STL源码剖析》 《Effective C++》 《深度探索C++对象模型》
学一个知识点,就建一个工程项目,实际去写点代码验证,后来的经历告诉我,只有一行行敲入编译器进行验证过的知识,面试笔试的时候才会回答的更有底气,光从书本上看来的东西都不会牢靠。
这段日子,是编程能力快速提升的时期,之前都是自己跟着书瞎练习,现在有了实验室师兄们过来人指导,跟着项目走,避免了很多弯路。
记得研究所老师说过一句话:什么时候觉得自己编程能力入门了?就是当你能够独自编写超过1万行代码软件的时候。
进入研究所之前,自己写的软件,每个工程也就一两千行代码的水平。而接触真实的项目后,一下就被十几万行代码的巨大工程震撼到了,由衷的佩服师兄们是怎么完成这么浩大的工程的。
除了上面的网络数据还原项目,还做了一个Windows日志擦除项目,可以将网络入侵后在系统事件中记录的痕迹给抹掉:
在学校举办的信息安全比赛上,我还开发了一个监控软件,用于同时监控多个人的电脑桌面,投在大屏上进行比赛实况转播。
这一年,还参加省网络安全大赛,拿了个二等奖。
检验知识是否掌握到位最好的方法就是输出。 这期间,我开始担任协会里面的技术部长,进行一些输出,给新会员做技术培训,讲过C语言,讲过计算机网络,讲过网络安全。
甚至,我还通过QQ语音+远程桌面共享的方式,给一个学习经济学专业的同学远程上课,帮助他考过了C语言的计算机二级考试,拿到了证书。
这段故事,有兴趣的可以看看这个:那年,我用QQ帮他考过了计算机二级
码字不易,午觉都没睡,大家觉得有帮助的话,帮忙给个赞哦~
因为是网络安全研究所,除了软件开发、编程这些东西,还会学习接触很多网络安全技术。
那时候看了一本神书:《0day安全·软件漏洞分析技术》
通过这本书,我才透过C/C++高级语言的表象,看到了计算机执行代码的本质,CPU是如何执行指令,函数栈帧里的布局,函数的调用是如何进行的,用户态与内核态又是如何切换的,进程的地址空间到底有什么,操作系统又是如何构建出一个虚拟的进程地址空间的。
这本书,我强烈推荐,就算你不是做网络安全的,也值得一看,尤其是面向系统编程的C/C++程序员,它可以帮助你理解程序的运行原理,不是假大空的概述性描述,而是那种直接落地的二进制指令级别的理解。
大三:全面提升
大二的这一年,是打下基础的一年,而真正突飞猛进,则是在大三这一年。
这一年有几个新的变化。
第一,技术栈的拓展。 研究所进来了新的同学,有不少是计算机专业的科班生,科班的同学果然还是会跟我们不一样,他们的技术栈和知识面要比我们广的多。在他们的帮助下,我开始接触了Java、SSM、J2EE那一套开发体系,了解到不同语言适合的领域,各自的差异,开始抛弃语言的成见,不再觉得底层语言就牛逼,而是博采众长,广泛涉猎,除了Java,Python也是这个时期开始接触的。
第二,视野的开阔。 进入大三后,大四的师兄师姐们开始校招找工作了,也会给我们分享很多见闻,各种笔试面试的题目经验等等。那时候发现自己很多问题都答不上来,毕竟不是科班出身的,之前的积累更多面向开发和编程,但对计算机基础知识体系没有很好的构建。再加上眼光没有跳出去,写了两年C++,竟然连C++11都不知道,真是没脸见人了。
第三,技术深度加深。 自己参与的项目技术深度越来越深,很多需要涉及操作系统内核的知识,但对计算机底层原理的知识一直没有很好的掌握。
因为这些变化,在大三这一年,从原来的面向项目开发的学习,开始转向系统化学习,向计算机科班学生看齐,把没学的都给补上。另外,开始学习Windows、Linux源码,刚好专业课有学微机原理和单片机,也是掌握底层知识的好机会。同时开始关注校招,对自己的知识体系查漏补缺,学习业界在使用的一些开发技术和开源组件。在算法方面,我们那时候还没有LeetCode,更没有牛客网,算法面试准备基本上只有三招:看书、写代码、看面经。
这一年,我又看了不少书:
《Java核心技术》 《Windows内核原理与实现》 《Linux内核设计与实现》 《软件调试》 《计算机组成原理》 《深入解析Windows操作系统·第六版》 《Boost程序库完全开发指南》 《剑指offer》 《编程之美》 《程序员面试宝典》
伴随着视野的开阔,知识面的丰富,再加上两年的项目开发实战经验,到了大三的下学期,突飞猛进的感觉真的来了,感觉编程什么的就那回事,经常还对各种语言和技术栈指点江山。现在回想起来,那时候的自己多少有些年少轻狂,不知山外有山,人外有人。
大三结束后,就开始忙着校招了,虽然做过不少项目,看了不少书,但总觉得自己不是科班的,心里欠了一些底气,面试的时候怯场。
为了克服这个问题,在大三的暑假,大四之前,我在成都找了五六家公司面试,我去面试不为工作,只为积累面试经验,锻炼自己胆量。你还别说,这一招真好使,几场面试下来,已经做到脸不红心不跳,侃侃而谈了。
8月底正式校招打响了,当时的C++开发方向,腾讯和百度都有岗位,看了下招聘要求,发现就是我们平时项目中搞的那么点东西,问题不大,胸有成竹。
我先投的腾讯,但很遗憾,不知道是不是因为学校的原因,简历就被刷了,直接不给笔试的机会,郁闷惨了。
心有不甘,去网上各个论坛贴吧打听了一通消息,听说可以霸笔,于是在笔试那一天,我还是去到了川大的笔试现场,希望能有机会进去答题。
很无奈,那天的管理非常严格,笔试开场后,很多和我一样的人都被挡在考场外面,都希望能获得一个证明自己的机会,可那看守的死活不让进,渐渐地,围观的人就三三两两的散了,只留了很少些人还在坚持。
在笔试最后十几分钟左右,考官终于心软了,总算同意放我们进去了,不过时间太短,无力回天,只做了第一页的填空选择题,收卷铃声就响起了,不过看了一下试题,没有想象中难,大都是基础知识,只要平时学习认真了,基本都能答得上来。
腾讯之后,我又投了百度,这一次成功收到了笔试通知。
笔试是在成都七中旁边的一个大礼堂进行的,来了有很多人,颇有种群雄逐鹿的感觉。笔试的题目对我很简单,都是平时项目中做过的内容,一气呵成,我甚至还提前交了卷。
当天下午就通知我通过了笔试,在面试环节,得益于之前的练习准备,也是对答如流,项目经验部分都差不多能背下来了,接下来都比较顺利了,一面、二面、三面都很快通过了,并拿到了最终的Offer。
后来我才知道,那一年,腾讯和百度总共在我们学校收了6个人,而我们学院,只有我一个。
后来又去参加了360、新浪的校园招聘,不过笔试通过后,我就不想去面试,开始去浪了~浪完就得去实习,大学生涯也差不多结束了。
最后,回到题主的问题上来,我的编程能力从什么时候开始突飞猛进?
我想,是在几百个夜晚,舍友在组队打穿越火线,而我在玩IDE之后(其实我也有打了,但老是打不过他们,手动捂脸)。
是在啃完了几十本计算机编程经典书籍之后(其实也没全部啃完过,选择性的啃),是在写下了一行又一行代码,完成一个又一个项目之后(这个是实打实的,没有水分)。
勤学+多练+刷题,只要做到这三个方面,就稳了!
最后的最后,我之前把C/C++自学过程线路图和这个过程中的资料书籍都整理好了,需要的朋友点下面这个自取吧:
码字不易,如果觉得有点帮助,欢迎给我一个赞呀~