[2020 BUAA 软件工程]第 1 次个人作业
项目 | 内容 |
这个作业属于哪个课程 | 2020春北航计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 第一次个人作业 |
我在这个课程的目标是 | 系统学习软件工程相关知识,培养自己的软件开发能力与团队协作能力,接受一定的实战锻炼 |
这个作业在哪个具体方面帮助我实现目标 | 回顾走到现在所经历的坎坷与弯路,反思自己的抉择与过错,重新上路 |
作业正文...... | 见下 |
其他参考文献... | 博客H,博客I,博客M,博客O,博客Q,博客U |
第一部分:结缘计算机
你为什么选择计算机专业?
一开始接触计算机的目的非常纯粹,就是为了玩游戏。
- 那个时候伴随着我的,是《红色警戒2》,是《孤胆枪手》。除此之外,计算机对我来说并没有更多的用处。
真正与计算机结缘,其实还是因为摄影。
- 初中毕业的时候,我沉迷于手中的单反, 想着给大家拍个毕业影集,就一个人背着单反三脚架上路了。那时候哪会什么Pr(而且电脑也带不起来),弄了个格式工厂和 Audition,就敢硬上。从这以后,我感受到原来计算机可以有那么强大的能力,可以让你的照片、视频焕然一新。我开始学习 Ps,学习 Lr,可以说那时我的计算机是为摄影服务的。
上了高中之后,跟着学校的老师学习电脑维修(清灰、接线等苦力),从此变成学校的临时工,会去帮着解决小毛病,自然而然接触到了编程。
- 我的第一本编程书,是这本《21天学通C语言》,当时还是第 6 版。那个时候在新华书店看到就买了,也没想那么多,还觉得21天这个名字看起来很厉害,结果就是一头雾水。这本书没有介绍编辑器与编译器,没有告诉我什么是 IDE,导致我之后很长一段时间都在纠结于如何跑通 Hello World!。后来的事情就简单多了,学完了基本语法之后玩了一段时间就进入了高三,没有更深入的学习,这也使得我在大一之前的编程基础近乎为零。
高考之前,我很早就决定了大学专业就在 数学 与 计算机 之间选择。成绩出来后看着南开与北航,考虑了很久,还是不能割舍这种工科实践产生的快感,来了信息类。在大二也比较自然的进入了 6 系。
你认为你的条件如何?和这些博主比呢?
和这篇博客 我的软件开发生涯 (10年开发经验总结和爆栈人生) 的作者相比,我接触编程非常的晚,自己的基础也近乎为零。
我不像他身边有着一群优秀的领路人:
- 在电脑课中认识了几个志同道合的人,我们平时会常常交流技术。
也没有那么深沉的热爱:
- 我把所有课余时间都放到学习电脑和编程中了。很少玩游戏,而且比较少参与课外活动,周末和假期都把所有时间都投入到学习编程中。
如果不是那时对创造的激情盖过了对数学的情愫,我很可能踏上一条截然不同的道路。但到现在为止,我仍然感激于当初的选择。
计算机是你喜欢的领域吗?是你擅长的领域吗?
计算机是我喜欢的领域吗?答案是肯定的。
- 这个领域很大,大到现在我只能看到冰山一角,但就这一角,依然让我神往。
计算机是我擅长的领域吗?答案是怀疑的。
- 就这三年的学习来说,我能保证达到每一门课的基本要求,这对我来说很容易,但是再往上走一步,有时候需要我付出很大的努力。计算机的很多知识,我学起来其实有些慢热,往往在整个课程进行了 (frac{2}{3}) 时候,我才能真正进入这门课程的核心。
- 而且,我现在的技术能力并不能给我打上“擅长”的标签。除了专业课的系统学习外,其他一些领域的学习我都仅仅只能算得上入门。
- 大一上的《C 语言程序设计》刚开始的时候,每次上机都是我与 OJ 的斗争,有时这种斗争更像是折磨,在浏览身边同学写出的代码时,不断质疑自己是否能力有缺。
- 大二上的《计算机组成课程设计》,在我跪在 P3 的时候,那一周不断的自我质疑与自我反思充斥了我的生活。
- 大三上的《编译器课程设计》,期末模拟考试时的测试点全挂,当我课下发现 bug 源于本身架构很难修改时,在同学们进一步做着窥孔优化时,我在重构代码生成部分的代码。
你热爱这一专业吗?
你对计算机的热爱是怎样的?仅仅是口头的吗?
虽然不断被高难度的课程打击着,我仍然热爱着这个专业。
热爱的理由可以是 AC 的喜悦,可以是看着 Logisim 随时钟跳动的美感,是自己的 C0 编译器翻译代码的兴奋。热爱的理由甚至仅仅是在第一次接触 Git 后就惊叹于它的精巧,对版本维护乐此不疲。
我对计算机的热爱不仅仅局限于口头,因为一开始选择计算机的原因就在于创造的乐趣,而且课程的打击也让我从学习计算机的一开始就时刻保持谦卑,不固步自封、沾沾自喜。
第二部分:在计算机系里学习
你对你的大学生活有什么想要吐槽的地方吗?
要吐槽的地方不少。
从大纲来看,6 系的总体课程体系其实挺好的,两条线:
- 编程能力:程序设计->数据结构->面向对象->算法->软件工程
- 体系结构:计算机组成->操作系统->编译技术->计算机网络
但是实际学习下来,课程方面最大的问题是理论课与课设之间的矛盾:
- 课设的学分只有理论课的一半,而实际付出却是数倍于理论。
- 这是所有课设的通病,理论应用与工程锻炼的难度大于理论学习的难度,而我们的付出却远小于回报。
- 理论课和课设过于独立,没有起到很好的指导作用。
- 我认为唯一做得比较好的是编译技术,当然也可能是课程知识本身的原因。理论课的知识不能支撑起课设,导致我们在平时对理论课提不起兴趣,同时又为课设发愁。
- 课设的课程体验完全取决于老师助教的指导书与答疑。
- 我认为计组 >> 其他课。计组虽然是体系结构的第一门课,课程难度也远大于之前,我虽然学得很痛苦,但是可以说这种痛苦是源于课程知识本身,而不是客观环境。优秀的指导书,完善的线上测试与和谐的讨论区和助教团队为我们提供了充足的保障。而操作系统可以说让我难以接受,可能是我的个人能力问题,操作系统课设整个学习过程,课程组的帮助几乎为零,指导书不能起到指导功能,测评体系没有足够的反馈,做错了很迷茫,不知道哪里错了;做对了也很迷茫,不知道哪里对了。
- 课设按照天梯制度给分。
- 计组(P0-P8)和操作系统(Lab0 - Lab6)以过关式为主,你的分数取决于你最终所在的位置。而编译器设计在完成课程要求后最高成绩只能是 89 分,进一步的得分取决于所有人进行竞速排行。同样的恶性内卷还在面向对象程序设计中有一定的体现。
你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?
比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。
我理想中的大学教育,应该是理论与实践密切相关,用理论作为实践基础,用实践促进理论学习。不以天梯排行导向成绩,而是按照课程完成度评判分数。我会在实现所学理论而创造的项目中收获远大于考出多少分、排到多少名的乐趣。课程成绩与学分应该基于知识和投入,而不是博弈与内卷。我的成绩取决于我的同学,而不是我自己的努力,这就很难让人心平气和地接受。
这两篇博客 分享下在美国读研期间的一些计算机课程作业 和 软件工程资料 - 优秀的大学怎么教程序开发和软件工程课 中展现的课程教学过程,是我所向往的。对实践的重视,合理的作业设置,自由的课程选择,会有更多由内而外的学习动力,而不是由外而内的学习压迫。
就目前而言,我们的老师可能没有办法完全做到与国外一致,其中最重要的原因就是教育资源的匮乏。无论是师资力量、财政投入,还是硬件设施,都没有办法支撑国外大学的那种教育模式。但是我们依然可能靠近国外的教育模式,计组课设就是非常好的例子。通过 14 年到 19 年的不断学习、改革与创新,这门课的质量可以说是非常高的,既让我们学到了大量理论知识,也锻炼了我们的工程能力。所以,虽然有着现实因素的制约,我们依然可以设计出符合我们情况的精品课。
迄今为止,你写了多少代码?
与这位学长类似 第0次个人作业,目前我做过软件项目基本都是学校的课程设计。
粗略算一算,计组 1000 行,面向对象 2000 行,编译器设计 4000 行,其他的程序设计数据结构什么的打个包 500 行,课外的小项目 500 行。
描述你做的最复杂的软件项目/作业。
最复杂的项目,就是《编译器课程设计》中的 C0 编译器了,它是一个支持类 C 文法的、优化后生成 MIPS 汇编代码的 C++ 实现的编译器 ,经历了 词法分析 -> 语法分析 -> 错误处理 -> 代码生成 -> 代码优化 五个阶段的开发。
如同 进入2012 -- 回顾我走过的编程之路 写到的:
- 设计模式的存在就是为了抵御需求变更,这个真理我直到工作之后才能明白。你必须把一个软件的架构设计得如此之好,才能在需求大规模变更之后,还能在整体上让你的代码是漂亮的、易于修改的、高性能的、并且是安全的。每一次改动都不能是打补丁,你总是需要重构来使得你的代码在任何一刻都在整体上是好的。为了达到这个目标,就需要熟练掌握并使用设计模式来开发项目。
错误处理 让我重构了 词法分析 的代码,期末模拟考试又让我重构了 代码生成 -> 代码优化 这两个阶段的代码。功能的不断扩展,项目的逐层递进,都让我的开发能力面临很大的挑战,也暴露了我在架构设计中的能力缺陷,两次重构让我痛苦地意识到了可维护性的重要性,而不是从屎山到更高的屎山。
科班出身和北大青鸟有什么区别?
速成的培训班和打基础的大学教育还有 mooc 之间有区别吗?
无论是北大青鸟,还是速成的培训班,我都没有太大的发言权,毕竟没有切实的亲身经历。
但是我并不认同 【野生程序员】:优先招聘 中对科班教育的评价:
- 中国目前的大学教育就一个字:渣。
就像 6 系的课程体系虽然存在着很多问题,但它们也给我带来了很多正面影响。每一个课设的实现,都在锻炼着我的完整的技术能力,从架构设计、代码编写到文档撰写,都有很大的促进作用。同时,这里有着很多优秀的老师,他们也带给了我很多正面的影响。这些显然不能用一个”渣“字概括。
mooc 作为一种新的知识获取渠道,我认为是大学教育很好的补充。它打破了时空界限,让我们可以自由的学习。但同时,这种学习也对个人的要求比较高。没有监督,更多的是靠自律。同时,mooc 对于理论是很好的学习方式,但对于实践却缺乏交流与讲解,实验平台也有很多限制。
学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?
就像我一开头提到的,我曾在数学与计算机之间徘徊,所以我一开始对数学的学习没有那么多的疑问,无论是数学分析、线性代数还是概率论,学习的动力都源于这种纯粹的热爱。而当不断深入计算机这门学科时,我才确切的体会到数学的重要性,明白线性代数和概率论,是计算机的最基本的理论支撑之二。
在大一下数学学院的应用数学二学位开发报名之后,我毫不犹豫地就填了申请表。这不仅是因为我喜欢学习数学的乐趣,也是我想要更好学习计算机的需求。当时我还在知乎上提了一个问题来帮助我进行选课:计算机专业对数学双学位课程的选择?
刚开始学习《抽象代数》的时候,我一边想着:这不就是离散数学吗(当然后面就不这样想了),一边看着老师在黑板上的推导。数学系的授课是与我们不同的,滑动的黑板、消逝的粉笔取代了不断切换的 PPT。在做工程的时候,我们往往关注于某个理论的结果,而且使用这个理论时更多考虑的是理想状态。而在学习《抽象代数》时,我才真正体会到所谓的数学抽象是什么,它的意义于我更多在于那套思维方法。
我认为,学习数学不在于自己要把所有的理论都搞的那么明白,而在于知识积累。我可能做不出来非常难的数学问题,但这些学习依然能帮助我快速提高自己。
第三部分:未来规划
对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?
目前最近的规划是希望能前往欧洲留学。
- 最重要的原因是经济因素。欧洲的留学花费相对比较小,学费远低于英美,而我自己的生活比较朴素,所以也能保持一个不高的生活花费。
- 其次是因为我想深入学习医学工程,学习如何将计算机技术应用到医学领域,而欧洲有很多顶尖的医学工程研究大学。
- 最后是对宁静慢节奏生活的向往。我不想长时间保持高强度的压力,欧洲更轻松的学术氛围和生活氛围正好适合我,可以让我放松地学习最前沿的知识。
更长远的规划是希望能学成归国。
- 希望加入医疗大军,为祖国的医疗事业做出贡献。既愿意深入研究领域,不断探索前沿技术;也想投身业界,做一颗工程上的螺丝钉。
你对于实现自己的梦想已经做了或者计划做什么样的准备?
- 在学校认真上课,体会课程设计带来的知识与经验。
- 做一些小的项目,感受团队开发的合作协同与实际工程。
- 进行企业实习,经历真实的业界研究流程。
- 认真学习英语,拟补自己的短板,为留学打基础。
你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?
企业实习,希望能接触更加真实的使用环境,了解业界开发流程,锻炼自己的工程能力,脚踏实地,完善自己的技术能力。
写在最后
感谢课程组的这次作业,给我一次系统梳理自己三年来的学习经历与问题反思的机会。
同时我也看到了身边无数的优秀的同学,他们的经历与思考不断鞭策着我。
未来充满无限可能,我希望能与大家并肩。