【软工】第一次作业-热身

项目 内容
作业所属的课程 2020春季计算机学院软件工程(罗杰 任健)
作业的要求 第一次作业-热身!
我在这门课程的目标是 学会使用软件工程的设计思想和方法,能够设计出高效并且可用性、可维护性、可拓展性较高的软件。
这个作业在哪些方面帮助我实现目标 反思自己过去的学习经历,通过博客学习借鉴他人经验,为本学期课程以及未来的规划提供思考。
参考博客 博客B 博客C 博客E 博客I 博客K 博客L

结缘计算机

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

博客I的博主俨然是很多人眼中的成功人士,读罢我也对博主心生敬意。最初在学校的一趟电脑课接触了计算机便产生了兴趣,从获得了第一台电脑后就开始不断学习与尝试,即便是在初中高中应试压力很重的时候,以及后来进入大学学习英语专业的时候,仍不忘牺牲自己的身体与休息时间换取学习计算机和设计软件的时间,最终凭借自己的努力海外就职。

与博主相比,在来到大学之前,我没有这番对计算机的热情,确切的说,在初中和高中的时候,除了用Office系列之外几乎没有碰过计算机,非常本分地学习课内的知识,准备升学的考试,情感的起伏完全来源于一次次模拟考试成绩的高低,除此之外过得平平淡淡。相比于纯粹的理科专业,我更想选择与现实生活联系更加紧密的工科。在我高三的那一年,谷歌的AlphaGO战胜了李世石,同时人工智能、大数据、5G等等也渐渐成为了新闻媒体的热词,我越来越感觉到在未来的一段时间,信息技术会充分地融入人们的生活中,学习信息技术便可以非常直接地作用于生活中,同时为其他学科的发展提供有力的支撑。

那是候我感觉能够通过自己的努力让自己看到实际效果的就是最快乐的。飞行器的设计以及的机械设计,确实能够通过自己动手设计画出零件的设计图,如果条件允许,还可以直接铸造零件,拿到实实在在的东西,但是在当时的我看来,这样不够“直接”。我可以设计一个零件,但是要想让这一个零件发挥作用,需要很多人合力,共同设计,同时需要使用专业的设备生产,组装,每一项工程都会消耗不少的时间与资源。而当时计算机给我的感觉是你不需要依赖太多特别的设备,更不需要消耗额外的资源,最简单的情况下,只需要一台普通的笔记本,就可以去写程序,并且让坐在电脑面前的自己看到实实在在的东西,而且带着电脑可以走到哪里写到哪里,直接而且自由。因此我最先选择了信息大类,然后专业分流时选择了计算机。

要说我的条件,毕竟生活的年代不同,在我还很小的时候,周围计算机就已经比较普遍,比起博客I的博主使用过的MS-DOS,我在小时候就已经见过了有一个相对比较漂亮的图形界面的Windows XP,电脑的性能也大幅提升。硬件条件可以,但是个人的软件条件严重不足。小学的时候曾经有一段时间很想知道电脑的程序是怎么回事,在网上找了一些之后,发现了一门叫Visual Basic的语言,跟着一些简单的视频教程学了一些,当时的教程大致是利用VB6的IDE提供的组件画出一个GUI,然后为这些组件写一定的方法。最初学了一句叫MsgBox,绑定到按钮上可以使用户在点击按钮时弹出消息提示框。看到自己做的一个极其简单但是是以.exe结尾的东西心里确实非常有成就感。但是很遗憾,小的时候理解能力比较差,到了后面的变量、函数之类的知识后边开始失去了兴趣,同时由于当时网游的风靡,VB没有学多久就放弃了。因此,对于我而言,小学时计算机是游戏机,中学时计算机是打字机,直到上大学为止没有碰过编程,更不用说其他计算机科学的知识。所以上大学的时候,第一次C语言程序设计上机,5道题只做出了第一道,后面的学习也栽了不少跟头。小时候我与电脑打的交道与大佬们相比自然是无法相提并论的,但是我也有些庆幸我在小时候曾似乎花了一两周的时间学习了一点点VB。虽然大学入学时已经忘得一干二净,没有任何基础,思维能力也很差,但是或许这一点短暂的经历曾帮我下定决心在中间空隔了很多年后继续去学习计算机。

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

经过了三年的学习,我庆幸当时选择了计算机。计组、操作系统和编译等等理论课的学习让我大致了解了计算机内部的一些基本的工作原理,而类似于数据结构、面向对象这样的课程让我真正去动手做了一些东西。我越来越感觉到,当时的选择是正确的,而且我相信只要继续去学习,我们可以用计算机做出很多丰富多彩的事情。我喜欢计算机。

但是要说“计算机是自己擅长的领域”,这绝对不敢当。但就软件设计思想就可以拓展成一个拥有庞大体系结构的知识体系,此外还有计算机体系结构、操作系统等等诸多的研究方向。而且要想真正深入学习并达到“擅长”的水平,还需要扎实的数学功底。再加之计算机学科发展速度之快,要想擅长,没有大量的精力投入以及长期坚持不懈的学习是不可能做到的。所以作为一个与计算机打交道才不到三年、同时又不是很卖命去认真学习的普通学生的我而言,现在绝对谈不上擅长。

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

可见博客I的博主对计算机是热爱的,不论自己现在的处境如何,都坚持学习计算机,可以为了计算机废寝忘食,自己的目标以及自我价值的实现都寄托在计算机上。至于我,我认为我现在并不是百分之百热爱的。我在计算机上付出的时间还不够,而且除了计算机这门专业之外,我也有别的喜好。但是正如前文所述,我是喜欢计算机的,然而喜欢与热爱之间相差着一份激情。非常惭愧,我现在可能还没有这份激情,确实也有时是被任务的要求逼迫而做。但是我相信随着学习的继续,喜欢会变成热爱,在接下来的一学期里,我也投入更多的激情,努力学好这门专业。

在计算机系里学习

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

对现在的大学生活我整体是很满意的。要真说吐槽的地方,除了日常一些琐碎的小事之外,我觉得可能是缺乏个人空间。我曾经在暑期参加了一个出国访学的项目,在英国剑桥上了两星期的课程。那里的学生公寓是一人一间,为每一位学生提供了能让自己“静一静”的空间。确实,学习计算机经常会有共同开发,而且多人讨论对学习很有帮助,也因此,那边的学生公寓在每一层提供一间厨房,同学们可以在这里讨论,做Group Work。这也是我理想的大学生活。但是对知识的消化总需要自己一个人抽时间静下来想一想的。博客C中,博主通过在大学学习中阅读了大量的书籍,才使得他在后来面试时比自己的同学更加顺利和轻松。阅读书籍是需要一个安静的环境的,一个个人的空间为读书的时间提供了保障。

而关于理想的大学教育,我更倾向于增加更多的小班授课,这样可以增大每一个学生与老师交流的机会,同时也能使一个小学生更加全身心地投入这门课的学习。我们有很多大班课,包括计组这样的核心专业课,但是类似于Seminar一样的小班授课在核心专业课中还是相对较少。其实对于核心专业而言,我认为学生应当获得更多于老师沟通交流的机会,一方面是因为知识比较难,同时也是学科的关键所在,另一方面,在与老师交流沟通的过程中,尤其是涉及到自己专业的领域的课程中,更有可能促进学生对尽早找到自己的感兴趣的方向,为自己将来的进一步学习和研究做好准备。

同时,我也很憧憬博客B中博主提到的他在IBM实习时的经历中所描述的一样,负责的主管注重效率。我理想的大学教育不在于时间或者课时的长短,而应当更加注重效率。首先是课堂效率,作为主讲老师,应当更多地考虑使用简洁的表述将概念解释清楚,避免在一个简单的概念上过多地重复,而在复杂的概念上缺乏进一步讲解,同时还应充分利用课堂时间,不仅仅讲授讲义上已有的,学生完全可以通过自学学到的知识,还应该充分发挥自己的专长,向学生讲授相关领域的发展以及研究现状。

当然,结合我们的情况,要想做到上面第一点点现阶段还是不现实的,但是第二点是完全可以的。对于第一点,我们学生数量庞大,资源有限,因此无法实施像国外一些高等学府的类似小班授课一样的教学方式。但其实我认为这倒并不一定是一件坏事,对于是真的热爱并且渴望去学习更多知识的同学而言,为了充分利用和获得有限的资源,就必须学会主动、学会在现有的条件下追求更好,这也是对个人的一种锻炼。对于第二点,北航的老师们有着各种各样的研究方向,并且在研究中取得了很多成果,虽然对于本科生课程而言主要还是以打好基础为主,但是老师可以从一些基础概念引申出去,结合自己的研究领域讲授更多的内容。

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

就总代码量而言,大一比较少,主要是C语言程序设计以及数据结构,再加上其他一些练习,可能合计只有1500行左右。大二稍微多了一些,上学期的计组主要是Verilog,估计有1000多行,下学期的面向对象每次作业累计起来有一些代码量,尤其是到了后期开始考虑一些设计,例如可拓展性,同时尝试用多个算法实现一个目的,合计应该有3000行左右。

大三上学期,编译技术实现类C文法的编译器,这是我做过的最复杂的作业,合计代码量大概在3000左右。其内容包括了编译器最基本的如词法分析、语法分析等功能以及对中间代码和目标代码的一些优化。对于这个大作业而言,其实整体逻辑并不复杂,尤其是在词法分析和语法分析部分,都是遵循特定的程式,实现起来并不是非常困难,但是到了后期代码量增加之后,发现程序出现了下面这样的问题:

  • 代码冗余,到了后面才发现一些没用的结构以及非常相似的结构,完全可以与其他进行合并和删除
  • 命名混乱,甚至又是自己看一眼都不知道这个结构体或者函数实现的是什么功能
  • 结构设计问题突出,尤其是在进行优化的时候,发现很多代码不合适需要重构

确实,每一部分的内容都是随着课程的推进分步完成的,所以一开始缺乏全局的感觉可能是原因的一部分。一开始就做好设计固然是重要的,但是发现问题,尽管只是萌芽阶段,及时重构是非常重要的。在刚开始写的时候也意识到了有些结构的问题,但是当时觉得对后面的影响不大,因此就置之不理,导致后面重构时工作量加重。

同时,这一学期,还与另一位同学合作,使用Ruby on Rails设计了一个电商网站,代码量大概也在3000左右。这也是我第一次和同学一起能够在比较有序的分工与高效的交流中完成的小项目,我也相信这段合作为我接下来的软工课程的项目提供了一定的经验。

综上所述,我现在编写的代码量整体还比较少,缺乏更大规模工程的设计实践,我也期待着能够在本学期的软工课程中加以训练。

速成的培训班和打基础的大学教育还有MOOC之间有区别吗?

当然是有区别的。速成的培训班我没有上过,但是一些培训机构教授一门编程语言是使用的教材我稍稍读过一些。在最初学Java的时候网上找了一本这样的pdf教程,仍记得当时大致读完之后的整体感觉是比较舒服,对于Java的基本概念以及常用的API,都使用一些有趣的小例子做了比较形象的说明,作为入门的学习教材真的很合适。但是现在来看,这样的速成教材或者速成培训班主要还是以简单的实用性为导向的,之所以说简单,是因为它对于语言的一些特性不够深入,它只教你如何用一个API以及用了这个能实现什么,但是不会教这个API本身是怎么实现的以及由其实现原理大致分析其有点和局限性,这一点我在大二的面向对象课程中因为使用的容器不合适而导致在测试数据量比较大时CPU时间被卡时很有体会。

至于MOOC,我认为这是一种很好的学习方式。我们可以针对性地进行选择,选择自己想要深入了解的方向,选择自己喜欢的老师和课程,并且可以免费或者花费较低的费用即可获得该课程的视频以及配套练习的全部资源。相比于传统的大学授课而言,增加了更多个性化定制的可能。但是与此同时也对MOOC的学习者提出了要求,因为没有传统课程的老师的监督以及集体的学习环境,为了取得较好的学习效果,还需要很好的自律。

至于打基础的大学教育,在博客E中博主对次进行了一番批评,但在我看来,博主的很多观点略显过激,有失偏颇。“大学本科的所有知识都可以自学获得。”诚然如此,而且博客C的博主自身也是通过阅读了大量的书籍在面试的时候展现出自己的优势的。读书是很重要的,但是并不代表大学教育是不重要的。看博客E中的博主所说的内容多数是技术方面的,包括一些前端的还有版本控制的,这些都只是技术的一部分。有时我也很迷惑,感觉虽然在大学上了很多课,但是很多内容(包括课内)是在课下自己学的。但是大学教育的意义并不仅是授课,更重要的是它教会我们该学什么,以及怎么学。一个人没有接触过一个领域之前,仅凭借自己的一点搜索与认识,是很难建立起一个学科的学习体系的,是短视的。比如我大学刚入学时,很不明白为什么计算机专业不花更多的时间在编程上,而是上来要学这么多数学的知识,直到现在大三我上了一些类似于机器学习这样学科前沿领域的课程,也读了几篇论文之后,才看到当初学的数学知识在计算机领域是多么重要。大学的教育体系是很多在一个领域有很深的造诣的老师或研究者共同协商讨论指定出来的,是前人经验的结晶,接受专业的大学教育,可以让我们眼界更加开阔,认识更加全面。同时,我认为“打基础”应当是大学教育的定位之一。经历了大学教育并不一定是要一个人一定能够具有很强的能力,但是至少是让一个人能够具有比没有经历过专业大学教育的人更强的学习能力。好比一个人非常系统地学习过C语言,那么通过找教程、看文档,他应该能够更快地学会C++和Java,一个人系统地学习过Ruby on Rails框架以及MVC的设计思想,那么他也能够更快地迁移到Django。

未来规划

对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?

博客K的博主说,“也许,最让一个人感到最有成就的事情,不是他做成了什么,而是他选择了什么。”博主在大三就凭借自己的能力获得了在银行工作的资格,但是实际加入工作后,发现其“效率低下,工作毫无激情,工作当中充满了相当复杂的人际关系和政治斗争。 ”面对着家人和朋友的不解与反对,选择了离职。

其实重要的不是身边的人如何看待自己的选择,而是自己有没有一个适合自己的职业规划并且自己能否按照这个规划走下去。至于我的梦想,正如我在第一部分说过的,我之所以选择计算机,就是因为想用计算机做出一些比较实用的应用,所以我希望能够尽早开始工作。我们专业的学科名是计算机科学与技术,但是我更偏向于技术,正如博客L的博主所说,“我并不这样觉得,因为我觉得技术是实实在在的东西,很实在,这让我很踏实,踏实的感觉得好。”所以,首先从程序员做起,在不断写代码,不断实践并且与周围的人交流的同时丰富自己的经验,积累足够的经验之后,希望能够进一步,做一名架构师,能够自己做一些统筹和设计的工作。

为了实现我的目标,我认为尽早地去接触、去实践来积累经验是非常重要的,因此,我没有在国内继续读研的打算诚然,继续读研首先可以通过考研这一关对大学学习的理论知识做一个更加系统的复习,同时还可以在不断学习的同时锻炼自己的科研能力,但是这对于一个想要尽早开始工作的人而言作用不够直接,比起用两三年的时间继续研究生的学习,我更希望用这段时间在实践中摸索,去积累真正有助于工作的实实在在的经验。

同时,“第一份工作并不决定你的人生。”(博客L)在选择想要进入的企业的时要前期做好对于企业的发展方向乃至企业文化等诸多方面做好调查,同时在真正入职工作后应当及时反思当前的工作是否适合我,如果工作一段时间后发现仍然不适合,那么应当尽早做好换工作的准备,避免想博客L中博主的朋友一样因为工作太久而难以转型。

你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?

这个问题我认为因人而异,选择去企业实习还是实验室实习,应当先确定自己将来的职业规划。对于我来说,我会选择企业实习。实验室实习的过程中,可以阅读很多顶会的论文,学习当前计算机领域的最新研究成果,同时还可以与身边学术造诣很高的老师和学长沟通交流,深入地了解科研的过程,并且在做好一些前期准备工作之后,可以真正的参与到科研项目,去设计模型,开展实验,发表论文。对于将来想要从事计算机领域的科学研究的同学而言自然是很好的选择。但是对于想要尽早进入企业工作的我而言,去企业实习能够帮助适应了学校的氛围的我去尽早地适应企业中的工作节奏与工作模式,为正式入职积累一些前期的经验,因此我会选择企业实习。

posted @ 2020-02-29 10:30  MagicJim  阅读(208)  评论(2编辑  收藏  举报