向大学说拜拜——大学 > 兴趣 + 时间 + 思考 + 实践
【人物素描】
大学期间,担任过班委,加入过学生会,参加过社团,拿过奖学金......而印象最深刻的莫过于参加并组织过ACM集训,以及参加过导师的国家自然科学基金项目了。毕业时顺利拿到一波offer,并在腾讯SNG-PC客户端开发工程师岗和百度大数据部-机器学习数据挖掘工程师岗之间艰难抉择,最终放弃了企鹅,众里寻他签百度。
【兴趣是最好的老师】
2012年9月4日晚,刚来到大学的我对大学充满着好奇,憧憬着接下来的四年里丰富而美好的大学生活。当时我来得有点早,寝室还没分配好,就暂时住在学长们的寝室里。学长们很热情,对我说他们的书很多,可以随便翻看,就这样,我大学接触的第一本书便是《读大学,究竟读什么》,现在想来,里面的很多内容对我的大学成长还是颇大的(后面将会提到)。
大一,突然融入一个新的环境,新老师,新同学,新课程,而此时也正是培养兴趣点的重要时刻,毕竟大多数人对未来的四年还是懵懂的。大一里,我对C语言慢慢的产生了兴趣,从不喜欢提前预习的我总能提前一步预习完,甚至比老师上课的节奏快很多,一下课我就去向老师请教仍然不理解的点。课后也会主动把课后习题自己做出来。由于当时还没有电脑,便手写代码,人工检查。后来有只室友带了一个台式机到寝室,我就隔三差五在他电脑空闲时把我平时积累的手写代码敲出来,检查写得有没有问题,就这样我愉快地学完了C语言。大一下,学校又开设了数据结构和C++,此时我发现学校发的课本根本满足不了我了,错误多且讲的并不全,我便经常跑去图书馆借书来一起看,弥补课本上没有讲到的知识点。
大二,正值导师的项目招人,想着在项目中能够接触到更多新奇的东西,也许能更好地挖掘和培养自己的兴趣,我便抱着去试一试的心态加入了。没想到,一入项目深似海,余下三年成路人。在项目中我发现原来自己写的代码可以做这么多事,能读取和处理图像,能模仿神经网络的连接来实现机器的智能学习,能和人进行交互并归纳一些事物的规律......更激起了我对编程的兴趣,也促使着我更努力地去学习更多的知识来充实自己。
现在,我可以肯定的说,正是因为当初对编程建立起的兴趣才让我顺利地走上了编程的道路,在这条路上我没有感到艰辛亦或后悔,恰恰相反,编程的过程带给了我许多快乐!
【时间是最宝贵的财富】
大学相比高中,最明显的特点就是自己能掌握的空余时间变多了。高中,每天的时间都像已经被学校裁剪好的方格,吃饭、睡觉、玩耍靠后站,其余的便是一节节课程的学习时间了。而大学,我们对时间的分配有着绝对的主动权,却惊愕的发现身边很多人失去了高中的激情,更沉迷于打游戏,陶醉于看视频。有段时间我曾反复问自己:高中为什么要那么拼,难道就是为了现在在大学能随便消遣?不,我的内心告诉我:那时候,也许是为了自己心中的梦想,亦或是为了回报爸妈及老师的期待,亦或只是因为学校的制度,那时的我们必须珍惜时间用来学习,为考得一个好成绩,上一所好大学。而大学的我们,要为了自己!现在消遣的确是过得舒坦,但是几年后毕业的时候,是不是就会应了那句话“毕业即失业?”然后又在“最难就业季”中徘徊并迷茫着吗?
如果说世界上有一种东西是公平的,那一定是时间。人总会去仰望别人,为什么A那么牛?为什么B什么都会?而仔细观察他的生活就会发现,因为他能在别人玩耍的时刻抓紧时间学习,充实自己。当然,收获的多少并不一定与付出的时间成正比,还与学习的方法等有关,但我相信也许“天道不一定酬勤”,but“天道一定不酬懒”。所以我一直坚信,如果我做得不够好,一定是我专心做这个的时间还不够长,或是我的方法还不对。所以不管做什么事,我都尽量找到最适合自己的方法,充分利用自己的时间把它做到更好。
到了大四,课基本没了,空余时间更多了。当然要面临的也就更多了,艰辛地找工作或者是奋力地考研。找工作的时候就会发现出来混总是要还的,过去三年里没有认真上的课,没有记住的知识点,会在求职过程中显露无疑。身边不乏有这样的声音:“要是当时认真听一下**老师讲的课就好了”、“要是当时大一大二没那么贪睡贪玩,多学点东西就好了”“要是...就好了”,可是,过去的都已经过去,时间不会再给我们第二次机会让我们重新来过。所以,我们要做的,莫过于珍惜每一秒能够珍惜的时间,做自己想做的、该做的、要做的事。
《读大学...》中有说到一句:“草木可以在校园年复一年地生长,而我们却注定要很快被另一群人替代……”。大学四年一过,学校里的什么东西我们什么都带不走,我们唯一可能得到的就是这四年里收获的知识、经验以及人脉,所以当有人问我大学里最大的收获时,我想就是这些吧。校园生活中,经常可以听到类似于“老学长”的说法,我想,这个老不仅仅是说年龄上比学弟学妹们要大,还代表着另一种说法“老油条”吧,大一大二普遍比大三大四的更有激情。时间可以证明很多东西,同时,时间也可以带走很多东西。大学里我们能保证不被时间带走的就是已经扎根到我们大脑里的知识了,所以在大学这段时间里知识的积累便是最大的财富。
【思考是进步的必经之路】
“一个经过独立思考而坚持错误观点的人比一个不假思索而接受正确观点的人更值得肯定……”——《读大学...》。很多时候,不是我们不会学习,而是我们不会思考。我们可能已经习惯了被动的接受,而不是主动去思考。就拿我来说,才开始接触编程时,我也是记住书上的说法和写法,而当要记的越来越多时,或者是在做需要进行变通的题目时就发现,之前没有经过咀嚼的知识点变得一无是处。我就尝试着去理解而不是记忆,看到一个语句或者说法不能够完全理解,就仔细找前面有没有类似的铺垫,找不到再去其他书上找或者到网上搜别人的博客分享,再把仍然有疑问的记录下来,等课间时和老师探讨。比如在学习C++的时候,最开始只是在记忆书上的用法阶段,看了书上一个例子,就私以为C++不过是改了下头文件,改了下输入输出的方式。而在我深入思考之后才意识到这样的想法太幼稚了,因为这并解释不了为什么会多出一句使用命名空间。经过思考和查证后得知,std是C++里最大的作用域,其中包含了众多标准库里可用的标识符,就连用来输入和输出的cin,cout都是std里定义好了的全局唯一的不可被复制的标准输入输出流对象。<<和>>也不是当初C里的左移右移位运算,而是被重载了的运算符。每次当我认真思考的这些语句的时候,总会从一条语句中牵连出很多知识点,而每个知识点又会让我对一个未知的领域有新的认识,从而能够不断让自己学到新的东西,不断地进步。
以前我很相信书本上的东西,觉得书上的知识代表着权威,可在我慢慢学会思考并推敲细节后发现,基本上大多数书上都会有或多或少的错误,让我想起了那句“尽信书不如无书”,从此我便抱着怀疑的态度去看书,有比较迷糊的点,不是去记住它,而是去思考为什么是这样,自己实在想不明白就通过各种途径查证,有时候就是查着查着发现书上是错的。这里吐槽一下我们的数据结构教材,不知是出于什么原因,这么重要的课程竟然用的是我们学院自己编写的错误连篇的教材(希望学院在选书的时候慎重考虑,毕竟数据结构本来就比较难,对于编程人员来说重要性就更不用说了),当然这些错误也让我更加坚定地多去图书馆借书看,当多本书对某个知识点的说法不一致的时候,自然也是使用的人最容易理解错的地方。随着借书越来越多,我发现机械工业出版社和电子工业出版社出版的计算机相关书籍质量还是相对比较过硬的(插一句,想找到某一领域比较好的书籍途径有很多,比如去看豆瓣书评、各大在线卖书商城的销量和读者评价、网上大牛分享的经典书单等)。
不只是在读书和编程,在任何领域想要学习和进步,都离不开思考,只有真正思考并理解了其中的真谛,才能融会贯通到以后的学习和生活中。与大家共勉一句很有意蕴的话:“不把信息当作知识,不把收藏当作学习,不把阅读当作思考,不把储存当作掌握。”。分别代表我们需要:归纳总结、消化吸收、深入思考、应用实践。(当然每个人都有自己的理解)
【实践是检验真理的唯一标准】
这句话我们每个人应该都听过无数遍,我最开始听到这句话的时候,也觉得它像是一个空洞的口号,并不以为然。直到大二,我才慢慢领悟,只有自己亲自动手去实践了一些东西,才能快速地去理解、掌握并运用它。大学,不再是高中那样每天听着老师们的谆谆教导,做着那些为了应付考试的题目,更多地是通过自己去实践来不断地学习。就拿计算机学院都会学习的编程课程来说,只是上课听听讲,下课做几道老师布置的作业是远远不够的,只有自己课下主动去理解相关的知识点,同时多看其他的书,并多练习手写代码,敲到电脑调试运行看执行结果,才能真正熟悉然后慢慢熟练。不动手敲出来运行,我们永远也不会知道他们的运行过程,也不知道我们自己写的代码是不是真的可以运行,就算可以运行,也不知道到底是否能够得到想要的结果。还有很多书本上是无法教给我们的,如调试技巧,编译选项,开发环境设置选项,项目属性配置等,都需要不断地实践才能真正掌握。
在大一一次年级大会中,几位学长给我们来了一场ACM宣讲会,由于我对编程挺感兴趣,而且这也是一个国际性的编程赛事,我就被吸引了,去报了名,并参加了协会的各种专题讲解和线上练习。期间在学院组织的程序设计大赛中顺利过了初赛,又接连过了中级赛和高级赛,有幸获得与其他过了高级赛的小伙伴一起去中国地质大学参加华中赛区邀请赛。虽然很遗憾没有在这场比赛中突出重围获得奖项,但是在这个实践过程中让我收获了很多,开阔了眼界,结交了不少编程达人,还意识到了自己的不足。由于我自身原因,错过了接下来的一次重要的暑假集训,这次集训分专题讲解了很多比赛中出现的题目类型,并进行集中练习,后来的区域赛都是依据这次集训中的成绩表现安排参赛队伍。在后来一次针对下一届的暑假集训中,正好我留校,就与其他两位小伙伴龚细军和段先宇一起组织完成了暑期集训工作。经过ACM这种系统的专题训练,让我对算法和数据结构更加熟练,也更加锻炼了我思考问题时的严谨性,毕竟ACM的题目陷阱巨多,稍有疏忽,满盘皆输。
虽然大一我也有实践写书本课后习题的代码,并在电脑上调试执行,也参加了ACM训练。但我深刻感受到这样少量地实践只能让我熟悉这种语言的语法和数据结构相关知识,而不能让我学会去把它们运用到实际情况。因此我主动加入了导师的国家自然科学基金项目,希望能通过项目中的实践来提高自己的编码能力和综合运用能力,同时拓展自己的视野。从项目中的演化算法分析到实现、图像文件的读取到像素级处理、OpenCV的安装配置到辅助库的编写和打包发布、演化算法到交互式机器学习、人工神经网络到演化函数矩阵、卷积神经网络到卷积自动编码器、受限玻尔兹曼机到深度置信网络、松散代码的拼凑到大型项目解决方案的集成与部署、自制软件系统本地测试到租用独立ip服务器进行线上运作、写一些小说明文档到申请软件著作权再到发表论文......
通过这些实践,我不仅在编码能力和习惯上有了很大程度地提高,而且在与老师以及项目组其他成员一起讨论中让我的团队协作能力、表达和沟通能力都得到了提高。在项目进展中,还会经常遇到很多对我来说全新的问题,可能一开始是一无所知,从自己首先独立思考,到从网上搜集整理资料,再到与其他成员探讨,遇到的问题到最后都迎刃而解。现在回想大学生活,觉得项目中的学习是让我觉得最充实的一件事。并且很重要的一点是,这些实践是绝对不可能只通过课本来学到的,而必须是自己亲手去做,去思考,去探索。在找工作的面试中,这一点也体现地很明显,基本上都会考量应聘者的动手能力,最常见的就是当场手写代码了,相信这也是检验动手能力的普遍标准了。当然面试中的写代码,考验的不仅仅是写代码能力了,还有语言表达能力——向面试官表述自己的思路,沟通交流能力——与面试官交流题目的隐含条件和要求,思维能力——严谨性、创新性、发散性等。
除此之外,我还喜欢在空余时间自己写一些小程序小工具。凭借对算法的热爱,自己写代码实现了身份证号的真伪校验以及自动生成有效身份证号,实现了Luhn算法完成了银行卡号校验;凭借对数据库的相关性分析,写了一个快捷查分客户端;出于对QQ的好奇,动手编写了仿QQ的聊天软件;针对常用截图软件必须获取焦点并编辑才能保存,简单实现了一个能够通过全局快捷键在不获取焦点的情况下后台保存截图。
总之,实践是不可或缺的,只有实践才能讲它们内化为自己的知识储备,只有不断地实践才能在适当的时候将它们运用自如。
【决心,信心,恒心,是实现梦想的阶梯】
每个人或多或少都会有自己的梦想,要想实现他们,首先就必须坚定不移地去向那个方向奋斗,只有下定决心,才会让自己总是想着逃避或退缩。其次就是信心,这也是一个能够起很大决定性作用的东西,以加入项目为例,可能老师在招人时并不要求加入的人什么都会,直接去给他解决问题,而是希望带着一群有奋斗精神和学习能力的人一起来完成某项任务,如果是真的有兴趣,即使加入前什么都不会,相信在那种学习氛围下,以及老师的带领下,很快就能学到东西。再举个找工作时栗子,在互联网行业,国内企业中BAT阵营算是一线级巨头了,担心自己的学校出身不好,或专业不对口,或项目经验不足,或学业成绩不是很好都是多余的,在成为定局之前,所有的期望都是有可能实现的,而事实上很多这些担心都是无谓的担心。要相信一个个体还代表不了一个学校或者一个专业的水平,项目经验也不是唯一的录用准则,学业成绩对于工作并没有太大的相互关系。如果想去某个公司,或者某个职位,就大胆地去追求,当然也得有所准备,比如看对应的公司,相应的职位的招聘要求、基本技能的重视程度等。除了要自信,还得相信“机会只留给有准备的人”。最后还需要有的就是恒心,在编程这条路上,也许很漫长,也许很艰辛,即使只是学习一门语言,也不是几个月就能达到完全掌握的程度。若没有恒心,一切都是惘然。
【写在后面的话】
题解:大学要教给我们的远大于找到自己的兴趣、充分利用我们的时间、学会独立思考、学会自己动手实践。
下面说一下关于我笔试面试经历。由于在实习生招聘阶段(3月到4月)之前没有太留意,错过了一大批笔试,匆忙中面试了腾讯和阿里结果显而易见。之后便不断补习计算机基础知识,通过看书和看大牛博客,然后自己总结重点、难点和盲点知识。重点复习了语言基础(我的方向是C++开发,所以自然是C/C++语言相关特性)、数据结构和算法(泛型编程)、操作系统(并发编程)、计算机网络(网络编程)、数据库(数据库编程)。这些零散的知识点平时编程中可能没有频繁使用到印象也不深刻,但是在笔试和面试中很可能会考到,也是必须要掌握的知识,因此在笔试面试前要复习准备一下很有必要。
7月份开始就有一些公司开始了校招内推流程。我收到了阿里的电话面试(算法工程师岗),面了1个多小时,由于面试经验仍不足而且对于面试官提出的大数据量上的算法知识非常薄弱,就没了回音。之后专门花时间把大数据量相关的算法研究了一遍,并自己动手实现了部分算法。BAT这类大公司校招较早,在8月底9月初就开始了在线笔试,我顺利通过了百度腾讯的笔试,阿里今年出现了大量缩招现象,没有了后续环节。笔试中基本原理和计算类题目与课本知识相关性非常大,此外还有智力题,以及编程题和算法设计题。
笔试过了之后就不断看各种其他人分享的面经,了解面试中可能问到的问题以及需要注意的事项,当然还有一些礼仪问题。
面试环节通常会问到基础知识和项目经历以及遇到的问题和解决方案,这些最好提前能多整理整理,如果到了面试时才开始考虑的话如果一紧张就必定答不好了。基础知识的话问到最多的就是所报职位相关的语言基础(这个一定要拿手),然后就是算法和数据结构(不限职位的重点,会配合手写代码一起考)。由于我大一就经常在纸上手写代码,所以并没有觉得不适应,并且在百度三场面试中均有手写代码,最后面试官比较满意,给我的评价是动手能力(编码能力)很强。
面试过程也是一个学习和交流过程,毕竟每个人的知识结构也会有所不同,面试官可以通过不同应聘者的表现来审视哪些人值得录取,同样应聘者也可以通过不同公司的面试问题和体验来考量哪个公司更适合自己,而且还能找到自己知识结构上的短板,不断强大自己。总结一句就是:面试最重要的不是要求我们什么都会,而是尽最大努力去展现自己知道的东西,让面试官相信我们适合这个职位,适合这个公司。(ps:我自己总结的知识点汇总和面试过程细节可以百度“博客园 闻波”查看)。
最后,谢谢李老师的邀请,写了这篇自我总结。不知道读者能从这里收获到什么,暂且希望大学生活还没过完的亲们看到这个后能更加珍惜余下的时间,通过认真思考和不断实践去进步和成长,找到自己的兴趣点,拥有强大的决心、必胜的信心、持久的恒心,早日实现自己的梦想!
同时谢谢给我提供了这个项目机会并一直在项目中耐心指导的导师刘老师;一路上亦师亦友,给了我很大的动力和信心。