【BUAA 软工热身作业】继往开来,勇攀高峰

项目 内容
课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接
作业:热身作业,阅读并撰写博客 作业要求
课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力
作业目标 学习前辈经验,了解自己,思考未来计划
参考博客 博客I博客M博客F博客C博客K

Part I

问:你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?

我选择计算机专业的原因很简单,因为感兴趣,挺喜欢的。

我跟计算机结缘得比较晚,是在高一的时候,当时学校的OI竞赛班正在招新宣传,毕竟初生牛犊啥都想试试,就报名参加了选拔考试,加入了竞赛班。跟我一样啥基础都没有就这样加入竞赛班的人有很多,老师也没有怎么细致地教,就是发发ppt,稍微讲讲几个算法实例,剩下的靠自己自学刷题。第一学期的我学得很起劲,当时学的是Pascal,感觉编程挺好玩的,在学校的oj网站上疯狂地刷题,远远超过我身边的跟我同时加入竞赛班的同学。在期末的进阶淘汰考试里,很荣幸拿到了第三的位置。在得到老师的赏识之后,我有幸认识到了几位从小学就开始学编程的大佬,听着他们互相争论着问题,分享着自己的学习经历,开始感受到,自己离他们还很远很远。

高一下学期初在学校举办的市队选拔赛,当时以贪心的策略歪打正着骗到了比较好的成绩,成功入选市队。老师为了让我们历练点竞赛经验,就带我们报名参加了省队选拔赛。省队选拔赛期间状态并不好,最后也只是拿了一个基本垫底的成绩就回来了。那段时间的心态非常不好,回来后的期中考试成绩也是一落千丈,在机房刷题也总是WA得不明不白,心态完全崩溃,过几天就自己申请退出竞赛班了。当时我想,自己跟编程的缘分可能就到此了吧,之后应该不会再见了吧。

等到了高考后进大学,当时的高考成绩处于一个比较尴尬的位置,往上进浙大中科大基本没有希望,仅比南大投档线高不到几分怕被调剂专业,因此就来到了北航。到了北航后,大学第一年重新学习了编程,跟学长探讨经验,再一次激起了我对编程的热情,大一时候所有课里只对编程感兴趣,每一次程序设计课程作业都是第一时间去完成的,自己也尝试着去跟擅长编程的同学交朋友交流,而对于其他课程的热情远不如对编程的热情。再跟学长了解了计算机专业的课程后,感觉对其他专业的课程都并不是特别感兴趣,再一次坚定了我要选择计算机专业这个决定。因此我选择了计算机专业。

在读完博客I后我自认为我的条件非常一般,和博主相比简直差了个十万八千里。高中时候接触编程也就只有一个多学期,而且也没有取得什么特别的成绩,甚至连NOIP复赛都没打过就退竞赛班了。在当时的我的水平顶多只能完成几道中等难度的算法题,而并不能说去编写一些小程序来完成什么功能。对于计算机的喜爱程度,也远不及博主。

问:计算机是你喜欢的领域吗?是你擅长的领域吗?

计算机确实是我喜欢的领域,每一个新学期选课时候,看到那些专业课时,都忍不住想要选一遍。在每一次完成大作业编写较大规格的程序时,我都挺享受其中的。我觉得计算机可以完成很多很多的事情,不管是在现实领域还是在虚拟领域。我个人认为计算机是我比较擅长的领域,每一个专业课程我都可以以较优的成绩去完成,但我也缺少很多的实践经验和自学能力。在课外时间,我很少应用自己所学的知识,我也没有任何的实习经验,在课外我完全是一个什么都不懂的小白。

问:你热爱这一专业吗?你对计算机的热爱是怎样的?仅仅是口头的吗?

我觉得我配不上热爱这个词,我对于计算机的感情仅仅停留在感兴趣而已,让我干计算机专业的活我愿意干,并且我会越干越起劲,也喜欢也愿意去学习一些新东西尝试一些新技术,但我觉得我谈不上热爱计算机。我并没有像博客I博主一样那种非计算机不可的热情,很多时候我更多的是把计算机看成是一门技术,一门很有前景可以赚钱(bushi)的技术,而我对这门技术的学习不感到枯燥并且颇有兴趣,但是如果要我自己课下学习一些新的关于计算机的知识,或者是自己捣鼓点什么其他的东西,基本上不太可能(可能大部分原因是因为我比较懒吧)

Part II

问:你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。

看完大佬的博客后,回顾起来,我感觉自己过去的这大学三年基本上都是白过了。我的大学生活很大程度上只不过是一个高中生活的升级版,每天的事情不过是,上课,复习,完成作业。每个学期我最努力的事情不过是尽自己最好的能力去完成课程布置的种种大作业。然而相比博客M的博主而言,博主曾在自己的大一,大二,大三,花费自己的课余时间,去开发各种脚本语言编译器,这完全凭借着自己的热情去做的。但我觉得我很少有这种觉悟,这种热情去完成这种事情,这是我觉得我的大学生活过得很不如意的其中一个地方。

我理想中的大学生活应该得是,老师在课上传授学科概述,学科之美,讲授一些方法论和简单的技术入门,而剩下的细节和工具使用都需要学生自己去探寻和学习。而不应该手把手地教学生技术,从头到尾教一个学生该如何写hello world,这应该是北大青鸟这些注重速成技术的学院才干的事。当然我感觉授课方面,我的大学老师在授课上基本和我理想中的相近。但为什么这三年来我仍感觉过的并不顺意呢,仔细一想,大学教育不仅仅包含老师授课,也包含着各种其他的环境因素,比如教学环境和个人因素。这三年来,我感觉自己是在为成绩而争为成绩而活,每次选课都会再三斟酌这个老师给分到底好不好,会不会拖我的GPA,会不会太硬核影响到我其他课程的学习。似乎一切学习都只是为了成绩,而不是说为了兴趣而去选修。身边的同学也有不少为着成绩而拼死拼活地去争取,感觉大学生活似乎和想象中的完全变了味,更多的是为了成绩而去学习,而不是为了热爱为了兴趣。当然,这不如意中也有个人因素存在。相比那些大佬,我不仅在技术层面上与他们相差甚多,在心态方面也相差不少。读完博客F后,我感觉我的心态在很大程度上和博主十分相似,浮躁,仅想快点学完这门技术,感觉学完了就似乎是更近一层了似的,但实际上其实差得远。仅仅在理论上学会了,却懒得去实践懒得去实现,其实和没学过的人差不了多少。如果仅仅以功利的心态去看待计算机专业技术的学习,那很难在这方面能有所造诣。当然功利不可少,但在功利的同时更多的是要注重兴趣的培养耐心的培养。没有实践上又怎能证明自己是否真的懂了呢。

我接触国外教育的机会并不是很多,比较中国大学的老师和国外的老师可能并不能十分准确。但凭借自己的那一点了解,我觉得国外的老师注重培养学生的自学创新能力,希望学生能够自己去提出问题,解决问题。我们学校的老师在这方面上也很努力地去达到这点要求,希望学生能拥有自己的创新,而不是仅仅机械地完成老师布置的任务。但我觉得要完全做到跟国外完全放开的模式并不是一件简单的事情,毕竟在进入大学之前,所有学生基本都要经过高考的洗礼。不少同学高中接触的都是应试教育,比如我,每天大部分都是老师让你学什么,你就学什么,听老师的话就肯定可以取得好成绩考个好大学。在进入大学后要从他教的模式逐步转变的自学的模式需要一定的时间,从自学再转别到创新更是需要一定的历练,需要去花费努力改变自己的思维模式,让自己拥有自己对问题的独特见解。要让国内的大学教育做到和国外教育完全放开不仅仅是需要老师的努力,也需要学生自己去努力改变自己的思维模式,拥有自己的创新点。

问:迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。

没有对自己写过的代码做过具体的统计。从进入计算机专业至今基本每个学期保持差不多两万行左右的代码量吧。除了完成课业上的作业大概每学期一万五行左右的代码之外,弄点自己杂七杂八的事情大概五千行左右。目前做过的最复杂的需要慢慢迭代的作业应该是上个学期编译课设的编译器。从第一次作业开始,每一次作业的功能迭代大概需要增加一千行左右的代码,这其中还需要删减更改优化上一次作业实现得有问题的部分。最终实现的编译器大概有六千多行的代码。

编译器的实现从最开始的词法分析语法分析,这些功能的迭代过程中代码重构并不复杂,但到了后面的错误处理,代码生成,就开始需要对前面部分的部分代码进行删减优化,项目结构开始变得有些错乱。到后面的代码生成和代码优化时,每做一次新的优化,就很有可能需要对原有的优化进行一定程度的修改,比如一开始的寄存器分配只考虑了临时寄存器的分配,在完成活跃变量分析后,需要对全局寄存器也进行一次分配,这其中涉及到的寄存器使用释放问题可能就存在着冲突,需要对之前的代码做不小的改动。再者当时为了图修改方便,把大部分的后端优化都集中在了一个函数当中,使得代码结构变得冗余而复杂。现在回头看感觉就是一坨又一坨的屎山堆出来的结果。希望通过软件工程这门课之后,在以后编写大型项目时,能够对自己的代码结构做一定的优化。

问:科班出身和北大青鸟有什么区别?速成的培训班和打基础的大学教育还有mooc之间有区别吗?

在看完博客C博客F后,感觉有很大的区别。科班出身的同学大部分是有着极大的兴趣和极大的斗志,并且有耐心去学好每一个课程。对于博客C的博主,尽管觉得自己专业选得略有失意,成绩并不出色,但仍是很有耐心地去啃经典编程教程,一遍一遍用心的去啃,在学习理论的同时,也不忘应用到实践中,和同学开发小软件。而博客F的博主,更多的是重视理论知识的摄取,并且比较注重与速成。怎么说呢,各个学科都有其各自的学科之美,耐心汲取才能慢慢地领悟到其中的精髓,并且注重实践能够帮助你在现实中找到学科的魅力与内涵。这些都是功利追求技术所学不来的东西,毕竟博客C博主谈到:

书到用时,无心插柳

博主在面试时碰到的问题都是在自己所读到的书籍之中,博主也用他的经历来告诉我们,深入地积累,耐心的深造,肯定会有用到的地方。

因此我觉得科班出身和北大青鸟区别就相当明显了,科班注重各种细节知识的摄取,注重实践,而北大青鸟则以速成技术的功利方式为主。这两者培养出来的人,不仅是理论方面的理解还是实践方面的感悟,都会有较大的区别。

速成的培训班可能注重的是技术上的培养,mooc注重的是理论方面的教学,而打基础的大学教育,不仅仅在这两者间均有涉及,也注重培养学生自己独立思考,有所创新,能够运用理论和实践知识创造出更有意思的东西。我之前曾在mooc网上了解过几个课程,比如程序设计课,mooc由于没有办法和老师面对面交流,老师更多的是放出他讲授课程的资料,供学习者自己去学习。既然是资料,那更多的都是理论上的纸上谈兵,老师也没有实质性的方法来检查学生是否有进行相应的实践。因此mooc注重的是理论教学。我认识几个非理工科大学的同学选修关于计算机的课程,比如网页编程,swift程序设计之类。当时听他们讲老师上来就直接讲相关语言的语法,布置各种小实验作为作业,下发的资料也基本是手把手教他们怎么完成实践,而对于这些语言的编程思想,方法论则很少涉及。对于我们这样的打基础的大学,在教学上就显然很前两者有明显的不同,举个最简单的例子,在之前的面向对象设计课程上,老师并不是简单的介绍面向对象语言的原理,那样就完全变成JAVA程序设计课了。老师在讲解语言的特性的同时,也介绍了各种面向对象程序设计的方法论,规范化方法,也讲授了各种各样工具的应用,不仅仅针对于课程本身,也对课程的范围做了适当的扩展。

问:学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?

在当时刚刚学习线性代数时和概率论时,确实有相关的疑问。当时会想线性代数这样定义出来矩阵,定义出矩阵的运算到底有什么意义呢,不就是个方程组吗,写成方程组就好为什么还要专门叫矩阵呢。但现在我觉得这个问题的答案已经很明显了。计算机的内存排布就很像矩阵的构造,最简单的C语言的二维数组就是一个矩阵。用矩阵的定义来描述一个多元方程组,就相当于可以用现有计算机的构造来描述一个方程组,研究矩阵的特性矩阵的算法就相当于在研究如何用计算机高效的计算一些复杂的问题,这样用计算机解决各种问题就很方便了。概率论也同理,利用概率可以对现实世界的众多事情做出预测,但一旦要对一些因素较多的复杂问题进行预测,计算量会显得相当的庞大,而计算机正好就解决了计算量庞大这个问题。利用计算机来模拟概率论计算的模型,来完成对现实世界的事情进行预测。

其他学科也类似,比如在大二的时候,挺不理解为何要让我们学习物理,一个计算机专业的学生为什么要学习基础物理这种看似和编程没有关系的学科。到现在,我渐渐明白,计算机并不是简单的编程,如果仅会编程,那么又能完成什么事情。现在的学科更多倾向于发展交叉学科,一旦学科进行交叉,那么便可以扩展当前学科的业务,效用性更高。那么对于和现实生活进行交叉的学科,如果不摄取基本的物理知识,那上手起来便会显得十分地困难。只有充分了解用户的需求,去为用户完成更多的功能的软件,才有机会成为长寿并且受人欢迎的软件。那么在完成用户各种各样的需求的同时,就需要了解各种各样的学科知识,否则无从下手。举个最简单的例子,飞机的自动安全控制系统,如果要让系统能够具有一定的自动安全控制能力,那开发者必须要了解关于各种飞行控制原理,飞行安全的知识,才能设计出具有高安全的软件。

Part III

问:对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?你对于实现自己的梦想已经做了或者计划做什么样的准备?你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?

在未来的IT行业里,我更倾向与做一个软件开发者和维护者,在应用方面做贡献。和很多读计算机专业的同学不一样,我并不喜欢做学术研究,一方面我觉得我觉得我的造诣并不高,在研究方面可能不能做到很好的突破性效果。从小学到现在,我的成绩虽然挺不错的,读书读得好,但是不代表我很拔尖。我能很好的解决一个问题,但我并不善于对于问题的钻研,不善于在更加精细的地方钻研出出色的东西。因此我觉得我在研究方面可能得不到较高的成果。另一方面,我的心态较于漂浮,很难在如此深的研究环境里静下心来研究学术。虽然我有能力让自己专心下来,沉稳地研究一些技术,但是学术研究显然是更加枯燥的,短时间的沉稳并不能促成深刻的成果。

对于未来的发展,我觉得我需要做好以下几点,其中之一是善于去摸索去探讨,另外是多实践多尝试多学习。在博客K里,博主提及到:

在这个过程中,迷茫的摸索可能是很难避免的。能够及时得到前人的指点可能会是一个捷径,征求前人的建议可以起到参考的作用,快速原型(快速尝试)或许也是好的办法。

确实,都说不听老人言,吃亏在眼前,既然前人已经为我们探寻了道路,他们的经历足以告诉我们哪些路是弯路,哪些路有危险,为我们排好了雷,那我们就要好好汲取他们得到的经验教训,参考意见,少走弯路,快速发展。此外,在前面也多次提到,仅有理论完全不够,需要加上实践才能更好地理解计算机之美,更好地历练自己学习到更多的知识得到赏识,才能更好的发展。

既然决定了自己未来的道路是在技术职场里拼出自己的一番事业,那就要有决心去学习各种各样的知识。计算机行业的更新换代是迅速的,必然不能满足于当前所学的知识,要不断地随着发展给自己更新换代,为自己创造更好的竞争力。在大三上学期担任了计组课程的助教,认识了助教团队里开发组的同学后,初步了解了他们在大学的个人经历后,感觉自己已经比别人慢了好多步了,目前尚没有进入各个实验室做过实习。因此为了锻炼自己的实践能力,在大三下需要为自己找一个实验室实习,初步锻炼自己的项目能力。在大三上学期接触了机器学习之后,对于图像处理以及图像识别方面颇有兴趣,计划寻找研究人工智能和深度学习方面的实验室做实习,培养下科研经验。另外在大三的暑假,考虑去找一些较大的企业做实习,进一步锻炼自己的项目能力,包括但不限于大型项目的设计与开发,测试方面的一些经验。进一步我计划保研,目前我的成绩尚处于保研线边缘,因此在保研前最后一个学期,我需要稳住成绩,稳住自己的保研资格。

posted @ 2020-02-29 15:19  PX_L  阅读(263)  评论(3编辑  收藏  举报