一个程序员的自我反思
作为一个热爱计算机技术、较努力、急于求成、还算是懂事的软件专业学生,我觉得我大学四年的学习历程可以拿出来,作为一个反例供大家参考。
虽说是反例,但由于我的努力和热爱,我的结局(毕业后的状况)并不是这一届里最差的。
exciting
我从小学三年级开始上网吧,初中有了微机课之后被选为课代表,可惜当时只是教一些计算机基本操作的知识。上高中家里买了电脑,闲下来在家的那段时间,我接触到了黑客知识。4399、1433抓鸡,啊D、明小子学会了最简单的扫描,那个时候还是能找到不少肉鸡,改一些没人管理的站点主页。
那个时候有个黑客网站在YY上组织了C语言免费培训,我去听了一节课,印象中听了10分钟不到,完全听不懂就再也没参加过。绝大部分时间,还是打CS去了。
之后直到收到大学入取通知书,买了一本谭浩强来看,勉强把基础语法看完,然后在这个暑假入了英雄联盟的坑。
urge
我应该是班级中极少几个,是真的因为想学计算机所以报的这个专业。其他不是调剂古来的,就是班主任说这个专业热门才报的。
可能是因为看了几遍《社交网络》,我当时一心想的就是做项目、实习,然后赚钱。除了C语言、C++,我翘了所有的课,其中包括各种数学、算法和数据结构。学校的软件工程专业是和某公司合作,主要科目都是.NET的知识,并且没有计科的操作系统原理课程,编译原理、计算机组成都是限选课。
基本上所有的东西,我都是自学的,但这也让我陷入了初学者的恶性循环。学Linux的时候,挑选各种发行版,从Fedora到Gentoo;学语言的时候,比较各种IDE和编辑器,挑选好看的配色;纠结到底该学哪种语言,PHP、Java、Python比较了一通……但这个过程还是让我学会了很多东西:Linux的编译过程、窗口管理器原来只是一个软件,当然最后还是一直用Ubuntu;Vim的操作,多行编辑、宏;学语言只是学点语法真的没什么差别,然后最终选了Python。
从大一开始,就到处寻找项目,找学长找老师。那时信奉一个道理:技术才是王道,鄙视那些只知道冲绩点,学数据结构算法只能画图不能动手实现的尖子生。
我比别人更早地学会了Linux的各种命令,却根本不懂什么是进程调度、什么是死锁;我比别人更早地学会了web开发、socket编程,却根本不懂什么是并发、什么是设计模式;我比别人更早地懂得了模块化、各种库的接口使用,却根本不懂面相对象、算法复杂度。
consequence
因为处在一个其他人甚至还没搞清楚自己兴趣的班级,我一度算是个大神。他们问我的问题,在我折腾的历程中,基本上都遇见过。
直到大二下学期左右,我了解到GSOC。我希望去为Nmap贡献源码,我尝试去阅读它的源码,才发现里面用到了双向链表、最小堆等各种算法和数据结构,我根本买办法去看懂。
然后我了解到各大公司暑期实习生招聘的日期,我去看笔试题目,去oj网站练习,two sum是我唯一能做出来的题目。
高中开始下降的数学水平,到了大学甚至连求导都不太记得。现在的各种机器学习算法,对我来说和天书没什么分别。在我做邮迹时,想要破解简单的正方验证码,可网络上的文章只要一提到各种算法,就变得无从下手,最后只能用打码平台搞定……
redemption
当然,我是下定很多次决心来恶补下基础的。Leetcode我总共做了7题,《CSAPP》从第二版买到了第三版……每次焦灼着稍微困难一点的算法后,我都会被其他的东西吸引:web前端、安卓开发、机器学习框架,这些东西显得那么有意思。可每次学习一段时间后又发现,想要学得好,最后又落回了那些基础知识,没有这些基础,只能停留在“试用”层面。
所以,此文的目的则是为了再一次下定决定,公开出来,当做是个对自己的监督。
由于工作的原因,我没有办法全部时间投入来弥补这些基础知识,所以大部分的时间我还是需要去学习工作相关的内容。
我也并不想制定一个严格的计划,谨以此文,希望自己能摒弃浮躁,踏实学习。