第一部分:结缘计算机
我在高考完了以后没有考虑过任何其他的选择,五个平行志愿的第一志愿都填了计算机。我对计算机的热爱,最早起源于小时候玩的flash游戏。即使在没有flash小游戏的时候,捣鼓Windows系统也是兴趣之一。比如去翻看Windows里面隐藏的目录,还接触了一些批处理语言。后来家里请了一个老师,教我写flash游戏,编写Actionscript 2,从此走上编程之路。之后编写了一些非常naive的小游戏并且上传到“闪吧”上面,有一定的点击量。(现在其中的一个游戏居然还能搜到,http://www.onlinedown.net/soft/186636.htm)之后在初中接触了《帝国时代3》,在苦心磨炼技术之余,也自己写过MOD(主要是修改XML)。
上了高中以后,由于当时目光比较狭窄,也没有参加信息学竞赛之类的培训,加上学习的压力和个人的惰性,就没有学习什么新东西。课余用Flash写了一个棋类游戏(主要是为了测试自己创想的桌游)还有一个塔防类游戏。计算机依然给我很多快乐和成就感。结束一周学习回到家,计算机不仅给我游戏和动漫的放松,也给我一个平台去设计、创想、实现自己的想法。高中在计算机之外对于数理世界有了更多接触,而这些接触让计算机更有魅力。比如,当时学习了函数,我就自己写了一个利用二分法求零点的程序;学习了万有引力,我就用程序模拟有重力的粒子的运动。这些程序非常简单,甚至非常naive,因为完全没考虑数值的误差,但是却让课内和计算机联系起来,让我对课内和计算机知识都有提升。更重要的是,高中接触到了科学的方法和理论,让我看到了逻辑推理的力量,这让我看到了计算机除了写写游戏让人开心之外,还有无穷无尽的推理能力,能创造知识。高中的时候,人工智能和比特币开始火爆,我上网了解了相关的知识,出于想研究机器学习的目的,填报了计算机志愿。
我觉得对比这些博主,其实我在大学之前,并没有学习很多计算机知识,只是有编程经验而已。尤其是在那个洪荒年代,大学之前能够熟悉命令行界面、熟悉计算机架构、写汇编的人,无论从计算机知识还是编程能力来看,都比我牛太多了。总结一下大学之前的计算机知识:1、基本的编程知识,而且可以说只会已经过气的Actionscript 2。2、开发比较大的项目的经验。当时写的游戏还是比较复杂的,且不说性能如何,很多模块化、层次化的编程方法,都是当时自己悟出来的。来到大学,来到计算机专业,这些知识首先作用于任何需要编程的科目。我学习C语言会比别人接受起来快很多。但其实,写惯了AS这种动态语言,对C这种贴近底层的语言具体如何运作的理解,还是要到学习了计组之后。
谈到对计算机的热爱,我觉得是发自真心的。首先,还是基于童年的那个理由,计算机给我一个平台去设计、创想、实现自己的想法。你有一个游戏想去写,有一个算法想去实现,有一个网站想要去搭建,打开电脑就可以实现。第二,计算机很快,改一行代码,立即就可以编译/解释并运行,立即就能看到效果,这种即时反馈的活跃性让人开始编程就很难脱手(当然,需要增量编译2h的项目,我还没写过)。哪怕是更大的项目,要运算更长的时间,我们得到反馈的速度也比一般工科要来的快。第三,计算机蕴含了丰富的哲学。接触了操作系统,让我们看到如何在复杂性和效率上作出妥协;接触了Git,我们看到了程序员怎么做事,怎么去管理项目,怎么去高效协作;接触了C和Python,我们看到了在不同领域用不同的武器,看到了开发效率和运行效率的取舍,看到了无穷无尽的轮子;接触了Linux,我们看到了自由软件的分享精神与计算机界的一批伟大而优秀的理想主义者。
计算机拥有无穷无尽的魅力。我们抱怨大二肝计组肝到凌晨三点,其实如果不是计组,而是自己想写的一个项目,在bug调试不好的时候,谁都不愿意去睡觉吧?我曾经通宵用C语言写了一个背单词的软件。实际上没有必要通宵的,但是计算机强大的性能、即时反馈的效率就是把人死死的锁在座位上。
第二部分:在计算机系里学习
1. 我觉得我的大学生活应该大体是满意的。我觉得理想中的大学教育就是大一打好数理基础,大二开始学习专业知识,并且一整个本科都有写项目的机会。我觉得实际的大学教育和理想的大学教育最大的落差就是一部分老师对学生的关注度不够。首先,讲课的时候没有重点,对着幻灯片念,难的概念不给时间课上消化理解,听课非常吃力;第二,作业布置随意,无论是数量还是题目的选择都没有一个把握,不能很好锻炼能力。至于课堂实践的机会,我觉得计算机系是比较多的,做的也是比较好的,比如大一C语言的课下OJ,大二计组的实验、OS的实验、算法课的项目,都对个人能力和团队协作有很大的提升。但是,我感觉计组的实验和OS的实验基本上都是助教在管,教授管的不是很多。我们的本科生教育水平参差不齐,我觉得究其原因,还是我们的大学的经费都完全依赖政府,评价依赖政府的指标。政府固然可以起到统筹协调大学和社会的作用,但是大学的办学就会完全按政府给出的指标来,如果政府强调科研成果,那么本科生的教育就会受到冷落。作为一个学生,我感觉在很多课堂上,都没有受到足够用心的教育。我的观点是让大学企业化,让市场来评价大学,同时政府直接对学生进行补助或者鼓励银行对学生进行助学贷款,保证高等教育的大门对所有人打开。这样,大学直接受到市场的监督,无论教学还是科研都不能偏废,这才是我们期待的高等学府。
2. 我迄今为止写过的代码应该是10,000行左右。写过几个比较大的项目都是500到600行代码,加上杂七杂八的OJ程序和玩具程序,应该有这个数量级。我觉得我写过的最复杂的代码莫过于高中的时候编写的一个塔防游戏,具体的实现包括美工和脚本。美工基本是自己画的。脚本包括前端和后端,前端主要是配合美工实现的,包括显示游戏状态、框选单位、命令单位、播放音效等等;后端包括兵种信息、兵种行为(编队时的站位、自动寻找敌人、攻击和死亡行为等)、敌人兵种的行为逻辑等。当然,由于是高中的时候写的,并不懂时间复杂度这些概念,也不懂去优化,最后单位比较多的时候就会卡顿;游戏设计的理念也没有学习过,都是凭空去想的,所以玩家大概就我一个吧:(。当提到这个问题的时候我也想过大二计组写出来的MIPS CPU,后来想了想其实不如这个游戏来得复杂,更何况这种课内的东西都是跟着蓝图走,即使实现起来有难度,它的复杂性也不是我去控制的(我只能控制实现起来的复杂性,而不是整体架构的复杂性),因此我就没有选择介绍这个课内项目。
3. 科班出身最大的优势是懂算法、懂底层和有更强的学习能力。当实现同样一个功能,科班出身的人思维是多维的:
1. 如何平衡开发复杂度和效率?2. 如何模块化和层次化编程?3. 如何评价程序的时间复杂度和空间复杂度?4. 如何写出可维护的程序?
实际上,科班出身的人,会把写程序看做一个数学问题和一个工程问题,从多个角度去思考程序怎么写。而非科班出身的人,只是懂编程语言而已,他们也会写程序,也会实现同样的功能,但是有三个地方不如科班出身:1. 程序的质量。不会正确计算时间空间复杂度,程序效率低下;不懂操作系统和编译技术,不知道如何让程序配合操作系统。2. 开发效率低下,由于不懂底层原理,当出现bug时不知道原因;3. 对软件工程理解不够深刻,代码难以阅读和维护。
4. 我认为大学教育相比速成的培训班和MOOC是绝对有区别的。首先和培训班对比,我们的计算机教育不是编程教育,培养的是对计算机软硬件都有洞察的计算机科学工作者;对比MOOC,我们的实体教育中学生有更多的合作机会和与教授交流的机会,有更严格的考核,也有更多的实践机会,许多现实中能干的事情,都不是网络能代替的。
5. 我学习线性代数和概率论的时候,并不怀疑它对计算机的作用。正如我前面所说的,用计算机解决问题,实际上都是数学问题,学习数学首先有助于我们处理数学问题,比如用高斯消元法解线性方程组的问题;第二有助于我们分析算法,比如用概率的方式分析快速排序的时间复杂度,比如用矩阵的工具分析图等等。其他的一些学科对我们学习计算机也是非常有帮助的。比如基础物理,直接的影响是学会如何模拟物理过程,此外有助于我们理解计算机的原理,比如门电路的工作。
第三部分:未来规划
1. 我现在还不是很确定以后会从事research还是engineering,如果选择了engineering,我希望我能开始从事后端的工程,比如负责一个app的服务器后台的一个模块的开发,然后逐步提高自己技能的深度的广度,最后能成为一个大型工程的架构师,做大型工程的架构设计。我有兴趣的领域是互联网金融、游戏。
2. 为了实现梦想,首先我在课内兢兢业业,把GPA搞上去,比如认真完成这份作业;然后积攒实习的经验,现在我参与了2017年计组的助教,以后准备参加实验室的工作;为了去美国留学,学习托福,本学习开始学习GRE;课外拓展知识,这个暑期自学了python, docker, 实现了一个OJ的评测机。
3. 我觉得对于我这样对于开发感兴趣的学生来说,企业实习毫无疑问是学习更多实用互联网技术的绝佳机会,去实验室的话学习研究方向的知识会比较多,但是必定少不了企业和学界都通用的技术。我现在可能倾向于开发的知识的学习,倾向于去企业实习。
4. 实习的经验我觉得非常重要。计组助教的开发工作是我接触的第一份简单的实习,我花了很多时间学习开发必要的知识,深感课内虽然学习了很多理论,但是实践中也有很多知识需要去学习。这次开发工作对我最直接的影响就是熟悉了Linux的命令行, Python,Git,接触到了如何用Python编写一个比较复杂的工程,用Git实现多人合作和项目管理。现在我正在用Python实现一个简单的compiler,深感Python的便利 : https://github.com/hanayashiki/mars_compiler. 除了技术的提升,还有就是通过实习的经历,得到别人的认可,这对就业非常有帮助。这次助教实习不仅让我学到了开发经验,赚到了钱,还是“对计算机底层有一定了解”的硬证明,这对于以后申请大学和找工作应该有一定帮助。