BUAA 2020 软件工程 热身作业
Author: 17373051 郭骏
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 第一次作业-热身! |
我在这个课程的目标是 | 学习软件工程的开发知识,培养工程化开发能力 |
这个作业在哪个具体方面帮助我实现目标 | 从过去、现在和将来剖析自己,更加了解自己 |
作业正文...... | 见下 |
其他参考文献... | 博客1 博客2 博客3 博客4 |
第一部分 结缘计算机
-
你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?
我认为,我能够在大学选择计算机专业,是兴趣使然,也是赶上了机遇的浪尖。
在上大学之前,我从来没有学过像样的编程,也没有想过将计算机当做专业来学习、当做工作来看待。我在小县城长大,那里没有适当的计算机教育,人们也对计算机没有足够的了解。那里只有大量的黑网吧,不分年龄地接受着各种游戏玩家。家长们只是觉得“电脑”是玩具,是会耽误学习的“电子海洛因”,而我却偏爱电脑游戏,因而经常会受到家长的唠叨。
不过,每次在我沉迷于电脑游戏时,我的父亲对我说的最多的一句话就是:“只会玩游戏不算本事,要能够做出游戏给别人玩,这才有意义。”我深以为然。因而在玩游戏之余,我也经常研究如何做游戏。我会思考,为什么按下键盘角色会动,为什么能够做到动画播放和事件判断,为什么网络游戏可以将大家连接起来一起游玩……我甚至会思考,有些功能游戏策划为什么没有实现,是技术上无法实现还是别的原因?我自己能不能想到逻辑上的办法进行实现?越是思考,我就越享受这种进行逻辑思考的过程,和得到答案的成就感。
后来我渐渐发现,只是去思考的意义远不如实践来的大。我开始接触日本的傻瓜式游戏制作工具RPG Maker,也是当时国内有名的游戏创作论坛66rpg的老站民之一。虽然现在66rpg已经成为了文字游戏制作工具“橙光”的土壤,但之前我在站里学到的游戏制作经验让我终身受益。那款工具虽然是可视化界面操作,但让我学到了很多逻辑判断的思想,对一款好的游戏和软件都有了更深刻的认识。
这款傻瓜制作工具的功能必然局限,但也为制作者们预留了自由编程的接口,即RGSS脚本语言,基于Ruby语言的语法,让制作者能够实现更多的功能。可惜我当时英语能力不足,看见铺天盖地的代码就放弃了。最终,我并没有写属于自己的RGSS脚本,只是复制粘贴了论坛上的现成代码。
在学习这款工具一年多后我发现,这款工具能够让我自由发挥的空间太少了。人物甚至不能任意走动,只能向上下左右四个方向按格子进行走动。并且游戏自带的素材偏像素风格,战斗系统也只有RPG,已经渐渐和当时的主流游戏市场脱节。机缘巧合之下,我接触了另一款游戏开发软件Edgame Maker。这是一个非常小众的软件,基于Lua语言制作,但没有可视化界面,只有类似于易语言的中文编程语言系统。比起之前的RPG Maker,这款软件更像是一款IDE,开发过程也非常接近于正常的游戏开发。可惜EM过于小众,学习资源也太少,甚至没有规范的语法文档。好多东西都只能靠自学,没有教程就只能靠理解和实践,甚至需要靠猜测。
现在看来,那是我第一次经历面向对象编程,甚至是第一次接触编程。编写代码、编译运行、调试勘误等,对我现在的编程习惯都有很大的影响。在我上大学之后,我才接触到pygame这种基于大众编程语言的游戏制作工具,也发现EM和pygame有很多相同相似之处。我也是在这款工具中学到,所谓的显示图片和播放动画,只不过是事件逻辑判断+画面刷新的
while True
循环,事件判断也是靠维护事件队列来实现。我不仅使用EM开发了供自己消遣的小游戏,更是试图用其去制作常规软件——当然,这样只是在把事情变得复杂,疯狂造轮子,最终没有成型。在高考出分填报志愿的时候,我在北航和同济之间选择了北航,进入了北航士谔书院。最开始由于高中学科的影响,我是奔着2系去的。但是当我在大学中学习C语言的时候,儿时那些编程的记忆喷涌而出,带我回忆起了自己的初心。大一在计算机学科专业的分数也给了我信心,让我相信自己可以在这条路上走的更远。选专业时,考量到可选择系的师资力量,加上自己对编程的兴趣,以及计算机专业良好的就业前景,我选择了北航6系。这就是我和计算机系、和编程的结缘之路。
其实我的条件和博客1比起来根本算不上好,甚至和同年级的许多同学比起来都算不上有经验。我只是对编程思想有所涉猎,没有学习过相关知识,更是在编程的大门前一度退缩。我想,如果不是高考分数恰好在北航,或者不是北航的计算机如此知名,或者不是计算机的就业前景可观,我可能就在之前的某一步,由于家长或是生活环境的原因,进入别的专业学习,走上一条完全不同的道路。但想来,我现在走着的路,才是那条之前未曾设想的道路,而我在这条路上的酸甜苦辣,已足够让我感到幸福和值得。
-
计算机是你喜欢的领域吗?是你擅长的领域吗?你热爱这一专业吗?你对计算机的热爱是怎样的?仅仅是口头的吗?
容我将这两个问题合并回答。其实在上面的文字中,我已介绍了很多。
计算机是否是我擅长的领域?我没有很长时间的学习经历,但是大学近三年的计算机学习生涯告诉我,我在计算机领域的能力并不算差。计算机系的所有专业课,我在学习的过程中都不觉得十分困难和吃力。虽然在很多竞速赛、天梯赛上我没有做到拔尖,但是对于大部分课程要求,我能够完成。同时,我在高中养成的自学能力也能够帮助我更好掌握计算机领域的知识。
计算机是否是我喜欢的领域?之前业余制作游戏时的经历告诉我,我能够在软件编程中有所收获,也能够乐在其中,同时享受过程和结果。而现今大学的学习生涯告诉我,我并不觉得任何一门核心专业课的课程设计内容枯燥,也十分享受用自己的程序去挑战测试样例的过程。编程过程中收获AC的喜悦,也远超过我解出一道数学题、完成一篇语文作文的乐趣。
我认为我对计算机的热爱并不仅限于口头,而是实实在在乐在其中。但是,计算机领域是一个非常大的领域,或许我的热爱并不能涉及到该领域的方方面面,更像是一种“偏爱”。我无意宣扬或是夸大自己对计算机领域的情感,也没有天真的以为现在所学的内容就是计算机的一切。但我有此般信念,相信自己能从中品尝出属于自己的乐趣,也相信计算机领域的未来发展能够让我不觉得枯燥乏味。永远新鲜、有活力、提供成就感,这或许就是我眼中的计算机领域吧。
第二部分 在计算机系里学习
-
你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。
在被问到这个问题之前,或许我曾不止一次地想要去回答这个问题。虽然现在大学生活让我感到整体满意,但是总有些问题让我不时想要吐槽。比如,核心专业课的课程设计,学分数是理论课的一半,而需要耗费的时间却绝不亚于理论课。有好多同学理论课期末突击复习就能够获得很高的分数,而实验课无论怎么为其付出,都无法取得满意的成绩。我切实地感觉到不公平。首先,我以为研究机构和企业都更加欢迎实操强者而非偏科理论的纸上谈兵者,更不用说理论课更多的是基础概念而不是解决问题。其次,按学分学时而言,按耗费精力而言,都不该是实验课的学分占比如此之低。最后,实验课的评分制度和理论课大相径庭,实验课不及格很容易,理论课不及格,除非期末不复习,否则真的很难。
还有实验课总想采用的天梯制度,让同学们打榜按排名给分,且不谈优秀学生的内卷化会给课程考核标准带来多大的变化,光是这种使用“相对标准”来给人打分的制度,在我眼中就不够科学。我认为不科学的原因,不是不应该用相对标准给人打分,毕竟社会在进步,课程也有自己的“摩尔定律”;而是在实验课标准不断提高的同时,理论课还在原地踏步,用那亘古不变的一张卷子、用绝对标准,不断地创造着一波又一波的高分。这导致的结果就是,会背书的人总能够在学院排名靠前,而热爱实践、着重实践的人总会得不到这种决策所应得的收益。
比如上学期的“编译技术课程设计”课程,最开始制定的评分标准会让70%的人分数集中在8590之间,而30%的门槛又极难突破,需要花费大量的时间,增加两千行以上的代码,还不能在期末复查中出错。这样导致很多人愿意牺牲课设的45分,去背理论课教材,只要多考到2~3分,就是赚到,分数就会更高。私以为,在大学学习过程中,需要让学生做出这种博弈似的决策,通过放弃一部分知识和经历,去换得分数的提升,是一种失败。
我理想中的大学教育显然应该是更加注重实践的,更不用说计算机系这种工科。但学校给我的,只是这种重视理论和基础概念,轻视实践的教育方式。诚然,在保研的时候有竞赛加分,弥补了一些GPA不够的学生的痛,但是据我所知,咱们学院的GPA排名所体现出的等级秩序,是理论实践双优者为一等、理论单优者为二等、实践单优者为三等。或许是我眼界过于狭隘,看不透学校这番制度的制定缘由,但我更希望能让理论和实践不要如此剥离,这才是我理想中的大学教育。
以上只是我所认为的缺陷,也只是缺陷的冰山一角。当我拜读完博客2,体味了其中所提到的美国教育之后,我愈发觉得自己的眼界狭隘,仅仅只是在学分分配上斤斤计较。国外的大学教育,因为未曾见过,所以未曾想过。我未曾想象课堂理论教学紧贴前沿工业界的样子,未曾想象学生们不“唯分数论”而追求自己喜好特长的样子,未曾想象所有人都能得到个性化培养的样子。那些想不到、没去想的东西,正如博客所说,更像是国内外教育理念的差距使然。有些东西国情、国家经济水平不足以让国内大学做到,也没有这样一种大环境去促使学校这样做,可能这种风气与国家多年来追求发展,紧追发达国家的大环境紧密相关。当然,现在北航为此也在做出很多改变,比如从未停下的课程改革,以及请行业大牛教授来北航进行课堂讲座等。我相信学校和国家会正视差距和不足,也将有能力做得更好。这是一条任重道远的路。
-
迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。
在大学里,我写的代码主要还是限于课程所要求的内容。我从来没有数过自己写了多少代码,但我可以将自己写的代码分为如下几块:
- 课程要求必须完成的代码。比如C语言/数据结构/面向对象的小题,计组的CPU和操作系统的MIPS-OS,编译的编译器,数学建模课的模型仿真等。这一部分是全系的大家都写了的,我也不一定比谁写得多。
- 对完成课程要求有帮助的代码。比如面向对象课程的自动测试数据生成+自动对拍+自动编译多份工程文件,使用python语言实现,可以做到互测时“一键互测”找bug。这种提供便利性的代码写的并不多,可能是课程要求代码的十分之一,毕竟这些东西做不到喧宾夺主。(当然我了解在工程生产中测试代码会远超源码,但课程并未要求鲁棒性)
- 课外工程。曾经参加计组助教工作,写过一个近千行的Django后端,以完成课程组所需的微信身份验证、消息推送、数据统计等功能。
- 兴趣使然的小玩具。或许可以算上自己儿时写的游戏代码,我在大一也用C语言实现了赛马竞猜小游戏,大二开始接触pygame,开发了一些简单的游戏。我终究还是热爱自己的初心,此等尝试从未停止,当然也没有成规模,毕竟学业压力过大。
这些代码粗略算起来,已然过万,当然不可能到十万的数量级。我肯定自己的代码量过万的一个重要原因是,我实现的最复杂的项目代码就已经占到了万字的一半。
这是我大三上学期“编译技术课程设计”的编译器总代码行数,已然有五千行。之所以体积这么大,是在实现了书中所提到的所有常规优化以外,还做了许多窥孔优化。这些窥孔优化更像是一些取巧的手法,但我也成功因为这样的代码规模,进入了期末竞速的前20名。这也是我第一次有意识的去统计并保存自己的代码行数,因为工作量实在太大,其中所经历的困难也是刻骨铭心。随着代码行数的增长,出现bug时需要查找的地方也剧增,总测试数可能是指数级别的增长。
这个编译器,虽然最终的分数可能是可观的,但作为一款软件来说,他是失败的。显然它不具有可维护性,只是屎山的堆积而已。如果其中的环节出现错误,则需要修改大量的代码,甚至可能直接导致重构。事到如今,我依然不敢将自己的这些代码上传到Github,因为这些代码的参考价值不高,只能给自己留个纪念,但已没有复读的必要和可能。我希望在软件工程这门课中,能够学到更多代码管理的知识,让自己的代码确确实实成为一款“软件”。
-
学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?
诚然,这个疑问我之前有过。在对计算机领域了解不够深刻的时候,非常容易产生这种思想。毕竟编程而已,为什么要学这些数学物理专业学习的东西呢?
我认为这个问题犹如“奥数无用论”,学那么多奥数能帮助你在菜市场买菜算钱吗?显然在最基础入门的部分,这些数学知识和计算机看起来确实没有关系。但不代表这个领域就局限于此。虽然我对计算机领域的涉猎也不算非常深刻,但作为一个普通大三学生而言,我认为计算机系的学生学习数学的理由有如下两个:
- 在计算机的前沿分支领域,研究和数学紧密相关。无论是神经网络还是大数据分析,本质上都是算法。而算法的基础就是数学。学过神经网络之后会发现,其本质上就是函数映射的组合,而求出其值需要我们用线性代数。大数据分析更是需要我们有统计学思想,概率统计课程的帮助也非常大。学习这些课程会让我们更加深刻地了解其背后的原理,有助于我们对算法进行选择和优化。
- 学习数学知识有助于我们进行跨专业研究。我们未必需要一头扎死在计算机行业的大流中,编程和数学本质上都是工具,有助于我们进行其他的研究。有了数学知识,我们可以分析宏观经济,可以用于证明数学猜想等。而若我们能学习到其他的学科知识,更是可以让我们在其他行业使用计算机技能大显身手。
诚然现在有许多方便的第三方包,可以让没有这些知识的人也能写出程序。但大学培养绝不是为了培养只会调包的人,而是为了培养会写包和优化包的人。大量的程序包只是为了给同行提供方便,而绝不是让大家沉溺在调用的温床中停滞不前。学习背后的原理和知识,行业才会有创新、有突破、有活力。
第三部分 未来规划
-
对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?
当我看到这个问题的时候,一直没停下来的敲键盘的手突然放空,思维陷入了迷茫。有时候,心中的梦想和现实有些背道而驰。往大了远了想,我想要拿到高学历,找一份高薪的工作,将来不用为生活发愁。这也是一直以来家长对我强调的。但是将这种事情作为我的目标,现在看来有些眼高手低。我不确定自己的研究能力是否足够,所积累的课外经验、跨专业知识非常少,没有实习,没有优秀的英语水平,认为发表论文高不可攀。而且,在追求高学历的路上,我没有足够的动力去这样做。带来的结果就是,在身边的同学都或多或少的完成了大量的竞赛、实习、论文的时候,我却还在原地踏步,只是完成着课程要求——这些课程的高要求也许是梦想职业所需的最低要求。
相反,在兴趣使然选择的计算机行业里,我的兴趣更多在开发软件,制作游戏上,也时不时会自己选择了解这方面的知识,哪怕学校没有任何一门课传授游戏开发。但我依然下意识地认为,进行游戏开发岗的从业是相对低廉,没有前途的工作。既然已经进入北航这所国内顶尖985大学进修,就不应该将目标设成这样。
但这样迷茫下去的结果呢?只能是两手空空,错失一个又一个的机会。我希望我将来还是能够获得尽量高的学历,技术道路可能会往计算机视觉方向发展,现阶段,主要的努力工作可能是阅读相关论文,了解领域的最新进展,同时也要打好该领域的入门基础,可能是认真学习相关课程,阅读相关书籍。
职业道路和社会道路上,我可能会考虑进入一些大型企业工作,积累足够的工作经验,在保证自己不丢失对行业热情的情况下,尽可能的追求发展,不掉队,紧跟行业前沿。我可能想的不够仔细缜密,但我会实时更新我的目标,尽量让自己的未来能够更加顺心。
阅读博客3之后,我体会到,可能未必需要那么多的考虑,先打好自身的基础,进行“练功”,才是最重要的。包括博客4也建议我们,毕业后5年内要踏踏实实钻研技术,不要被其他东西所干扰吸引。听上去有点像在为自己的欠考虑找理由,但我同样认为,先打好自身的基础,学有所成之后,再去追求一些有的没的,或许比现在一无所有时的空想更加切实。