Loading

放眼过去,展望未来——软工个人阅读作业#1

项目 内容
这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 个人阅读作业#1要求
我在这个课程的目标是 提升工程能力和团队意识,熟悉软件开发的流程
这个作业在哪个具体方面帮助我实现目标 根据前人的经历,对自己的过去进行总结,并规划未来

第一部分:结缘计算机

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

不同于各位早在初高中时期就的有了明确兴趣和目标的博主们,我选择计算机专业,完全是由于机缘巧合。

高一的时候,信息学竞赛培训,当时因为数学成绩比较好而被拉过去,一头雾水的学习 pascal,在语言还没搞懂在干啥的时候,人家已经在写什么“动态规划”之类听起来就很高端的题目了。于是,一个月之后,跟不上节奏、次次比赛签到题都做不出的我选择了退出,转而学习化竞。

接下的三年里,化竞本是学的一帆风顺,但由于化学这东西越学越深,从有趣的有现象的化学实验慢慢学到各种高级的符号都看不懂的高等数学和物理知识,逐渐对化学失去了兴趣。后来才逐渐意识到,这是因为自己的兴趣所在是动手实践,适合工科而非理科。

高考分出了之后,在能考上的学校中,化学专业好的学校分数线太低,不过北航也有口碑很好的信息类专业以及招牌的航空航天专业,于是就报考了北航,寻思一志愿录取不了去搞航空航天也算是能够延续化学之路吧。这说巧不巧,恰好一分不差,在信息类的最低分数线被录取了。

查到录取的那一刻,我心情很复杂。三年前被周围小伙伴们吊打的痛苦阴影一直笼罩着自己,甚至咨询了学长关于转专业的事情,在咨询之余闲着无聊买了台电脑学习 C 语言。这一学不打紧,不仅搞懂了程序究竟是用来干什么的,而且还能在洛谷上过一些题,AC 的愉悦相信每个人都懂得。于是我放弃了转专业的念头,决定用一个努力学习编程的暑假来弥补自己在语言上天赋的不足。

编程之路就从此开始了,在大一的专业分流阶段,我学习了不少算法、参加了学校 ACM 队的训练,对”计算机本身是怎么运行的“这个问题逐渐产生了好奇,于是选择了计算机专业

条件方面,我先天对于吸收的知识可以很容易的举一反三,但中学时代的好胜有时会阻碍我视野的拓宽。高一 OI 集训的时候我确实有一定的投入,却鲜有产出,也正是因此。但是至于后天条件,我更倾向说自己对未知充满好奇心和探索的欲望。虽然没有博客I博客M的几位博主一样从初中甚至更早就对计算机产生兴趣,自己更像博客C中的博主,抱着一个其他学科竞赛的奖牌,而对于计算机专业产生了足够的兴趣,进而想要对其进行更加深刻的研究。只要有浓厚的兴趣,我相信无论先天条件如何,只要肯投入精力和时间,总是能够学到的。

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

是的,计算机是我喜欢的领域,特别是算法方面。以前我更喜欢化学、生物,但逐渐发现自己的兴趣所在是能够动手实践,更适合工科而非理科。我将课外活动的几乎所有时间都投入在算法上,学习新的算法、并拿着学到的算法去解决问题、以及过一段时间对以前的算法进行更进一步的理解,成为了大学生活的主旋律。这种喜欢不仅仅来自于获得一个又一个绿色的 AC 带来的愉悦,更是对于一次又一次抓耳挠腮都理解不了的算法在某次拾遗中忽然理解的那种柳暗花明又一村的满足感。

至于擅长不擅长,其实对计算机的理解除了会写一些算法小题之外,对这个学科的其他理解也仅仅停留在课程上学习的“基本明确计算机是如何运行的”了,许多包括操作系统在内的课程自己都学的一知半解,“擅长”是远谈不上的。更何况我们只处在一个北航的圈子里,对于更加顶尖的学校里出来的大神了解并不多,“擅长”一词便更加无法判断了。从目前的社会应用来看,算法的应用会进一步提高,社会生活的各个方面都与此有密切的联系。虽然现在难以判断擅长与否,但在之后的学习生活中加强与各路同行的交流、与实战项目的对接,也能够逐步做到领域内的擅长。

第二部分:在计算机系里学习

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

其实上大学以前,我没有想到北航从士谔书院到计算机学院教育是如此优秀的。从士谔书院恪尽职守的数学分析薛玉梅老师、带病坚持上课的杨小远老师、党课都能够讲的绘声绘色的高宁老师、基物耐心细致的庞丹阳老师、一笔一划清晰严谨的工图刘静华老师、把经管当故事讲的张人千老师,到计算机系体系清晰的邢家省老师、幽默风趣的高小鹏老师、“体恤民情“的 OO 课程组、一针见血的王静远老师,在无论课程理解还是专业理解方面都带来了不可磨灭的影响。

但正所谓任何事情都不是白玉无瑕的,许多课程也确实有一些欠缺的地方。

首先是所谓”内卷“。从大一开始,许多以锻炼学生写作和展示能力为主要目标,或者通过写作来体现对课程理解的课程就变成了“内卷”的重灾区。从思修、毛概、马原、军理到计算机导论与伦理学、职业生涯与规划讲座,学习到内容与否未必是最重要的,但讲一两句话就能说明白的事情说得越复杂、分析的事例越多越好。这类课程,其实可以联系实际生活进行讲述,这样更加具有穿透力和说服力,学生也可以更加清晰地理解。最近中美对于抗击新冠的不同政策措施,就能充分说明很多问题,例如制度的优越性、是否关心人民群众的利益等等。

其次是关于考前突击。许多理论课都讲的枯燥无趣,或过于抽象难以理解,或过于简单而令人昏昏欲睡,总之让人不想听课,进行考前突击。简单的比如 C 语言、数分、高代、概统、离散和物理,五分钟能搞懂的道理老师总要讲一两个小时;困难的比如计组、操作系统,经常讲一半就讲到完全不懂的领域去了,尤其是操作系统,讲着讲着就莫名其妙出来一个不明所以的简写、没听说过的机型,让人感觉前后思维连贯不起来,难以跟上课程进度。好在去年操作系统是网课(疫情原因),许多内容听不懂可以回退重新听,也就能马马虎虎理解上某些部分的含义了。这些课我一般都会在自学做完作业的基础上进行考前突击,对往年题或者练习题进行拟合,还能取得不错的成绩。对此,我也常常反问自己:你上大学不听课是来干啥的?我想,大概是因为来适应一个社会环境,或者说寻找一个学术氛围罢。

在我看来,一个理想的大学教育是两方面的。一方面是能够让学生懂得如何获取知识并产生兴趣,另一方面是让学生能够对这个社会和自己的未来发展取得一些理解、并作出一些规划

把教学简单地理解为传授知识,是彻彻底底的不负责任的教学。这种教学往往会陷入把教材转化成 PPT ,转而成为“念 PPT ”的机械教学。这种刻板的教学往往有两个原因:一是对于知识体系的构建不够合理;二是对于知识体系的解构不够透彻。真正优秀的教学,更应该是体系的授业解惑,启发学生主动学习的兴趣,点燃创新的可能。

在构建一个课程的知识体系时,并不是要面面俱到、简单的堆砌知识点做加法,而是应当有的放矢地做减法。在做一些比较高级的复杂系统时,适当忽略掉过于底层的不必要细节是非常有必要的,否则会产生“知识黑洞”,学生在一个地方产生困惑后,往往会靠查资料进行深入学习,而这种深入学习往往偏离课本、偏离了主干知识,而且所查到的资料也不像课程主体内容一样在课程资料中那么具有权威性和完整性,这就会为课程带来无穷无尽的困惑,学生往往也止步于此再也没有继续下去的兴趣了。对于这些没有必要的知识,教学工作者在构建知识体系时应当做出相应的屏蔽,展开必须适可而止,或者不进行展开

受制于严谨性考虑以及篇幅,教材往往止步于对于实践情况的举例与延伸,而这正是教学工作者所要进行补充的。人对抽象事物的理解,往往都来自于“结合实际应用”的部分,仅仅靠记忆力背下的知识不仅是晦涩,更是难以长久的。毛主席在《实践论》中说过:“理性的东西所以靠得住,正是由于它来源于感性,否则理性的东西就成了无源之水,无本之木,而只是主观自生的靠不住的东西了。”对于知识体系的解构,务必要联系实际,这种联系实际不是有些老师为了符合课件要求特地开出的“实际应用”部分,而是应当在各种概念公式引出的时候就进行的一种阐释,一种更切合实际的理解。有的老师在理论层面造诣很高,但向同学解释的时候却让同学不知所云,难以理解;而同学之间相互讨论则往往能够”一语道破天机“,这是缘何?正是因为同学的理解是一个从无到有的、逐步构建起来知识体系的过程,再现了自己悟出问题所在的、彻底知识解构的过程。比如 C 语言讲解指针,同学们总是理解不了指针究竟是什么,老师往往解释到不耐烦都不能让同学理解,而这时候,画一个清晰的图解形式就能让同学马上明白,指针本身也是一个元素,它存储的数才是所指向元素的地址。

只有当一名教育工作者真正的投入到教育事业中,明白自己在讲什么、目的何在并且正确地建构知识体系的时候,这门课才是有意思、有意义的,学生的积极性才能够被调动起来。正因如此,例如计算机学院《数学建模》课程,是否仍为硬性要求、是否仍旧保留当前教学内容、是否仍旧采取当前的考核方式,非常有待商榷。类似地,士谔书院《数据结构》课程,课程内容与课程标题不符合的问题、是否考虑更名为《C语言程序设计与简单字符串处理》并设为非必修课,也是一个值得考虑的话题。

博客B中博主分享了一个他当年旁听朱仲涛老师《数据结构》课程的感受:

他的讲课风格非常独特,他只用1/5的时间简述一下要讲的内容,剩下的时间都是当场写程序。著名的约瑟夫环、Dijkstra算法、Prime算法、快速排序、堆排序、锦标赛排序、Tarjan强连通分量、Convex Hull等深的浅的,教材上有的没有的,全部在课堂上从0开始实现:每遇到一个算法,一边写程序,一边讲解,不懂就将程序的运行结构拿出来分析,并不时地穿插离散数学、概率论、内存管理、C语言、汇编语言等知识,几乎将我们学到的东西非常恰到好处地拿出来,让我们从心里面觉得原来所有的知识是连贯的,我们之前的积累都是有用的,并且富有成就感。

想想自己经历过的所谓《数据结构》课,这种课大概才是心目中一门课程所应有的理想样子吧。

至于国内外比较,很明显的问题就是教学资源的分配问题。中国作为一个上世纪才逐渐从乡村发展起来的人口大国,在优秀教学资源方面可谓需求大、供给小,人口基数大和优秀教学资源少的矛盾严重。目前来看,国外教育,至少在计算机专业领域,确实有肉眼可见的领先。包括服务器的数量,高质量论文期刊的阅读,以及对于学生创新性的培养等各方面。但随着中国的发展,城乡一体化和乡村振兴等政策的逐渐推行,无论是教学硬件、软件、还是师资密度,都会逐渐得到改善和解决的。

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

因为个人在大学两年半的绝大多数时间都用在了对于算法的学习和做题上,做一个大致估计

网站 题数 平均代码行数 总行数
洛谷 614 70 42980
Codeforces 259 70 18130
ACCoding 734 60 44040
牛客 320 100 32000
Vjudge 298 110 32780
总数 169930

加上一些杂七杂八的 OJ,大概的总数在 17-18 万行,有效代码量(去掉头文件等)大概有 15 万行左右。

计组 P7 的总代码量在 2500 行左右,有效代码量 1500 行左右;Java 大作业 1700 行,有效代码量 1500 行左右;python 与智能车大作业 500 行;OO 总行数 3600 行;数据库大作业 5000 行,其中参与的有效代码大概 1500 行;编译原理 2300 行;以及其他各种作业,加起来大概 17000 行,有效代码量 12000 行。

要说复杂程度,最复杂的应该是某个算法题目。但要说代码行数,最复杂的软件项目是数据库大作业,通过 Spring MVC 架构前后端靠 Ajax 乱传数据,后端面向对象设计,根据路由传到 Controller,对于不同请求对数据库进行查询、计算,前端写 jsp 进行动态显示、对增删查改提供一些接口,并做了一定量的测试。由于时间比较赶、主要侧重点在数据库和前端的选择,前后端交互以及后端都写的很粗,完全不像一个软件项目该有的样子。正因如此,我十分希望能够在《软件工程》这门课中得到实实在在的训练与提升

Q:科班出身和北大青鸟有什么区别?

对比博客C博客B博客D三名科班出身的博主和博客E博客F两名具有北大青鸟经历的博主,很明显的一点差距就是基础知识的扎实程度。

北大青鸟有个学士后课程,在线学习,那个课程学习者扮演一个角色,升级学习。后来我才明白,学编程如果没有老师,上来就学那种纯视频引导的课程容易走上歧途,进入死胡同,没有经验的人很容易就卡着学不下去了。我也不能幸免,我卡住了,我卡到了2012年底。

以上摘于博客F,博主提到自己从专科毕业到参加北大青鸟课程学习 C、C#、数据库、多线程等,由于非科班出身,对于这些内容的学习可谓千难万险,其实就算认为自己了解了也远远不如科班出身的理论基础扎实。科班有具有经验的教学团队、有开放思想的研讨课,对于这些内容的理解和掌握要远远高出一截,正所谓培养的是“计算机科学家”;而“北大青鸟”等培训班出来的人因为大都是从拼拼凑凑工程项目中学到的知识,项目的前端开发等有更强的经验

这其实也正是速成培训班和大学教育的区别,一个讲究“用”,但出了问题可能需要十倍的时间去理解、解决,而且引入新的 bug 也难以发现;一个讲究“会用”,正所谓磨刀不误砍柴工,打下坚实的基础。

同样这就是线性代数和概率论的问题,打下坚实的基础,才能够方便之后的运用。例如线性代数,在神经网络的数学推导中起着无比重要的作用,在图像处理和模式识别方面也是数学原理所在;概率论也不用讲,整个机器学习的大厦就来自于最大似然估计,许多近似算法也极大地涉及到概率统计中相关的知识,这都是计算机专业的基础学科。至于其他学科,数学建模对于计算机专业是一门十分重要的技能,我们只有通过合适模型的构建才能够更好的分析问题、让计算机解决问题;但计算机学院《数学建模》课程存疑。

第三部分:未来规划

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

希望自己能够做一些兴趣驱动型的工作,也就是自身感兴趣的工作。至于如何寻找自己感兴趣的方向?大一大二打了两年基础,大三上下学期每个学期都选了五六门一般专业课,目的不仅是拓展一下技术栈,更是看看自己最感兴趣的方面是哪里。

博客L博主的这句话很有启发意义:

兴趣和热情只能让你很执着,但并不一定能让你走好这条路,只有你的能力和你的强项才能让你走好这条路。希望大家能够清楚地认识到这其中的差别。

我认为能力与兴趣之间是正反馈的,也希望将来的工作能够在兴趣范围内提升自己的能力,那将是多么美好的事情。算法未来的广泛应用前景和对生活巨大的便捷,也加强了我在这个领域继续深耕的决心。

至于未来的道路,一是从当下的一般专业碰兴趣,看看有没有自己非常乐于钻研的方向;二是继续学习并应用算法(比如继续参加竞赛),我认为这不仅是一个技术,也能锻炼人的思维、应用能力,让大脑细胞不要死的过快(不是);三是之后在读研的过程中根据与导师的交流、对项目的理解去调整未来的职业生涯规划。

还有一个重要的问题就是表达。一个很致命的缺点就是不会表达,一句话要么斟酌半天才说出来,要么不经过脑子说出来就会后悔。正因如此自己还是挺怕答辩的,尤其是生怕说错了什么遭笑话(或许这听起来也挺好笑的,不是吗)。不过多练练,应该也会好一些。

至于 paper 和科研经历,感觉到了研究生再进行也不晚,毕竟本科如果没啥特别突出的想法的话,也无非就是水水论文、蹭一蹭项目组的研究成果,不一定会有太大的收获。

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

都要进行。大四看报考的学校情况考虑进行实验室实习,主要目的是做研究、为研究生打一个基础,毕竟之前也没去过实验室学过,没真正搞过科研,还是蛮期待的。之后要有实习机会的话考虑去企业,不仅是切身体验一下软件工程之类的学科在实际中到底是怎么应用的,更是为以后就业打个基础。

感觉无论是别人科研成果的论文还是自己码出来的比较 simple 的论文,看着都有一种说不出来很舒服的感觉,慢慢读起来(只要没有其他 DDL )研究论文里在研究什么问题还是比较享受的,希望这能让自己今后能在科研的道路上走的更远吧。

posted @ 2021-03-06 22:16  Potassium  阅读(471)  评论(8编辑  收藏  举报