2021软件工程-个人阅读作业#1
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021-春 软件工程(罗杰 任健) |
这个作业的要求在哪里 | 2021年软工-热身阅读作业 |
我在这个课程的目标是 | 在结对项目和多人团队项目中,更加系统地学习软件开发,培养工程化的思维 |
这个作业在哪个具体方面帮助我实现目标 | 回忆自己学习计算机的历程,从初心到未来的展望,以及自己之前参与的项目中感受软件开发。 |
引言——关于上课认真听讲的思辨
Scalers在博客中提出了大学生上课为什么要认真听讲的问题,并肯定地提出了自己的观点:”大学生上课就是要认真听讲。“
首先,个人比较认同的,作者在
1.认真听讲是一种能力
4.跟上老师的节奏,梳理你的思路,这是最快的进步
5.聚精会神在这个时代已经是稀缺能力,大学应该打好基础
三个观点中肯定认真听讲带来的好处。聚精会神作为一种能力,不仅仅是在求学方面给人带来益处,同时在人际交往中,认真倾听他人言语更有助于双方沟通;此外,大学中的专业课,对于作为初学者的我们而言,难度都是比较大的。也许一个人有足够的能力自学,但不可忽略老师可以提高效率。老师作为一个过来人,会在上课的时候,以自己的经验去整理课程的知识体系,从而简化课程理解难度,让人更好接受。相比自学,如果能跟上老师的节奏,梳理自己的思路,这样的学习方式更加高效,少走了不少弯路。所以我认为,对于高质量的课(不仅仅是难度,更是老师精心准备的程度),大学生都很有必要认真听讲。
但是,以个人经历而言,往往上课的情况比作者所设定的“是认真听讲,还是在聊天说话玩手机?”的两种情况还要复杂,有的学生会选择拿到PPT,自学内容(当然,现实中也有很多更功利的情况,这门课我只是为了学分,其内容我也不感兴趣,这里不讨论这种情况),关于这一情况,我不太同意作者的观点:其实我是不相信一个认为老师没水平的大学生,水平要高过老师的,老师站台讲台上,你就好好听讲。不可否认,在大学教室里的老师,尤其是在顶尖大学,他们的学术水平会远远高于我们,但是这不意味着他们一定会有很好的传授知识的能力。有的老师,在准备PPT上,摘录了书上的知识点,这一定程度上体现了老师们将知识点提炼起来从而为学生指引了方向。但上课时老师都是念PPT,并且毫无节奏感,这种低效率的重复PPT的内容,和学生自己看PPT差别在哪呢?这也许是一种极端的情况,但大多数水课的实际效果也大抵如此:老师重复着ppt的内容,并没有给出自己的见解或者给予学生思考问题的余地,这样的课,我认为,自学与认真听讲并无差异,反而自学可以让学生以自己的节奏去更高效完成任务。
总的来说,学生上课认真听讲,往往需要在认真听讲一两节之后,感受老师传授知识的能力,来确定自己认真听讲和自学所带来的收益,所幸,自己所遇到的绝大多数专业课老师的课都是值得自己认真去听的。
一. 缘结计算机,缘结北航
1.1 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?
对于计算机的印象,从小时候开始,跟普通人一样,也还是源于电脑游戏。小小的电脑,可以供我们使用这么多功能,很不可思议。但这些只是局限于认识表面,即使小学的时候有计算机课程,但也不曾认为计算机可以作为一门单独的学科。直到初高中,接触计算机软件的使用(初中时候接触到EXCEL和WORD的使用教学),接触到计算机编程(高中教学过VB语言),乃至最后高中参与到信息奥赛中(虽然只是打个酱油,但也是因为兴趣参与其中),总之,相比其他人,自己对计算机并不是很陌生,但也不是很熟悉。
回到为什么要选择计算机专业上。即使北航在专业选择上,给了我们一年的选择时间,但实际上,自己选择北航的时候,其实就是向着编程类的方向去了(所以当时目标定向了软件工程和计算机专业这两个专业)。为什么是编程类的?因为对于自己来说,一方面是过往对计算机的印象,一方面便是自己喜欢设计,设计属于自己的东西,所以自己想到了曾经的在电脑上出现的哪些小游戏,想着自己也能做一个游戏出来。同时,也不可否认的一点,便是计算机专业的热门和就业上的红利。所以在兴趣和功利的促使下,自己大一学年努力学习,最终如愿以偿考上了计算机学院。
对比博客I的作者条件,自己初高中对于编程的经历并没有作者那么丰富,周围也没有非常浓厚的学习氛围。但是对比博主大学的条件,作者英文专业与自己计算机专业一对比,很庆幸自己能够处于北航计算机学院这么一个优厚条件中,可以比较系统地学习计算机专业,对于计算机专业,能走的路,我相信会很远!
1.2 计算机是你喜欢的领域吗?是你擅长的领域吗?你热爱这一专业吗?
这个问题,在我进入大一学习的时候,就在问自己?对于计算机基础接近为零的自己,是否能够在这个领域找到自己的归属。当时我给出的答案便是因为有兴趣,我相信可以做好。
但是,通过大一C语言程序设计和数据结构的学习,作为初学者的自己,深深感受到了来自编程的恶意,同时由于当时编程是为了通过某些题目,让自己觉得,编程好像不是自己曾经认为的那种自由设计,反而是标准化的题解,这让我一度对编程产生了抗拒感,尤其是数据结构的竞速作业,仿佛最佳的方法就是那么几种,自己能掌握就能拿到高分,一下子浇灭了自己设计的热情。
所幸,自己来到了北航!大一下,自己在听了计算机学院和软件学院专业选择讲座,得知两系不同的培养方案。自己看中了计算机科学与技术那更注重体系结构的研究,并以体系结构为基础,产生的一些设计,例如计组实验的自己设计一个CPU;操作系统实验中,参与到一个小型OS的设计;和编译实验中设计一个C0编译器。这种将所学知识运用到设计上,而且又是这些在之前看起来非常高大上的设计,使自己对计算机专业有了更浓厚的兴趣。大二、大三,走过来的经历告诉我自己,即使上述实验非常让人头疼,即使最后得分并不高,但最后看到自己完成了设计,完成了一个属于自己的CPU/OS/编译器,成就感和喜悦感油然而生。
所以,对上述问题,我给出的答案便是,我喜欢计算机专业,但不是它的全部,我不喜欢为了解题而产生的各种编程题,但我喜欢研究体系结构的时参与其中的设计,以及如《JAVA程序设计》中小游戏的开发、数据库中Web网页的设计。同时,不可否认的是,即使有兴趣,但自己不能说自己擅长计算机专业,只能说,因为对计算机专业某些方面的热爱,它可以支持我走得更远,即使不擅长,也会努力去克服!
二、在计算机系里学习
2.1 你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。
- 吐槽的地方
北航的学习可以说是有多喜欢就有多失望。自己大学三年的学习过来,在课堂上的体验可以说是极好的,无论是大一负责任的数学分析老师薛玉梅、大学物理老师庞丹阳,还是大二大三拥有丰富专业知识的计组老师刘旭东老师、编译老师胡春明,他们的课都给自己留下了深刻的影响(虽然自己成绩不争气)。
自己苦于的是北航环境下的内卷环境(当然,内卷的情况是国内大学教育的趋势,因为教育资源的短缺,不可避免会出现竞争)。因为名额有限,为了能够选择计算机专业,自己大一开始就要去竞争。竞争过程中,也确实能提高自己的能力,但是在这一过程中,自己更多的是研究如何得分,而不是如何学习。在这种环境下,也就引申出了很多弊端,首先功利性的选课,周围的同学,也包括自己,选课不问兴趣,反而是哪门课给分高选哪门;一些通识课的选择,反而成了,这么课水不水,会不会影响自己的专业课。
另外要吐槽的就是培养方案。上个学期因为疫情原因,大二下(也就是我们)的一般专业课全部停了,而在大三上学期,学分要求没有降低,反而与上一届对比,将选修的数据库课程改成了必修,一下子多了4学分。这一顿操作下来,自己大三上学期变成了地狱模式(自己同时还参与了实验室项目的实习,更加雪上加霜),对比学长学姐,大约多出了8个学分的压力。
- 理想的大学教育和现在的区别
理想的大学教育,首先就是在成绩管理上,大致做到,如 美国视界(1):第一流的本科教学课堂该是什么样?中所提及的那样
没有达到盯着GPA不放,锱铢必较,非要争个分数高低的地步。成绩是完全保密的,也不会有各什么班级年级排名,教学系统会根据每次作业考试的分数情况随时加权算出最新得分,非常客观和实事求是,每周就会有邮件发给学生
成绩不是区分能力的标准,不用来比较,而是作为检验自己学习成果的标记,用来鞭策自己前进。正如
钱学森教育思想中“不鼓励学生拿100分,有个八十分就够了,把更多时间花在理解和思考上”
所言,自己理想的大学教育应该抛开成绩比较,没有成绩的束缚,让更多时间花在理解和思考上。以此为主要目的,在毕业要求上,减少限制性的学分要求,对于课程的选择可以按照自己的兴趣和需要去选择。而在传道授业方面,做到课堂上老师不是简单的知识点重复和知识点强调,而是做到能让学生理解,无论是通过自己独特的教学方式,还是让学生自己上手体验实践。并且在拥有足够思考之后,能够将知识点转换为科学研究。
对比北航的学习生活,竞争是很难避免的,但是在让学生理解知识点上,我觉得有一些课程设计很棒,像是编译技术理论指导实验,实验反过来促进理论点的理解,例如对符号表等作用的理解,自己便是更多建立在实验的设计上。同时,科研的环境,我个人认为北航还是给予学生足够的空间去研究的,学校也欢迎本科生参与到实验室之中(个人实验室经历,导师都很友善,也能给出比较明确的方向)。
- 能否做到国外那样?
正如上述引用的博客中所介绍的那样对成绩的处理,我认为在国内还是难以做到的,因为资源有限,而中国庞大的人口基数,即使通过层层选拔,顶尖高校的学生也难免面临着资源不足的问题,所以竞争不可避免。而竞争的目的,更多也是为了将来能够有好工作,丰富自己的物质生活,而对比国外,尤其是像美国这样的发达国家,顶尖高校中的学生,不少是已经拥有很好的物质水平,其文化、价值观会让他们更注重于探索发现,所以科研环境会较之国内好。
同时,在分享下在美国读研期间的一些计算机课程作业一文中,我也看到了北航老师在课程设计上,与文中的课程设计相似之处。尤其是软工课程的设计,不像是安排了一个任务之后,到最后才去验收,而是类似其中《面向对象》课程中,设置了几个阶段,去验收。同时,也能看到软工课程设计,模拟了一个产品开发的全过程,这样的划分,我觉得可以让我们更加清晰地了解软件开发的全过程,从而理解其中。在这一方面,我看到了,国内的教育,也绝不是一味的差,也未必要像国外一样,同样可以走出自己的一条路。
2.2 迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。
这里先笼统列一些数据吧
项目、作业 | 行数 | 备注 |
---|---|---|
C程序设计 | 3000+ | 主要解决问题,每次代码少,但题目数量多,包括作业和刷题 |
数据结构 | 2500+ | 同上,每次题目代码量有所提高,但是数量相对少了很多 |
计算机组成原理 | 2000+ | 最后实现到P7,单个项目有约1K行,但是包括其他一些练习的函数 |
JAVA程序设计 | 3000+ | 行数虽多,但复用程度比较高,自己设计了一个贪吃蛇游戏,设计了多个相似的玩法,所以代码行数较多 |
面向对象设计与构造 | 4000+ | 多个项目的合计 |
操作系统 | 1000+ | 整个OS的代码规模远超这个数,但OS是补全代码的形式 |
编译原理 | 2000+ | 最后作了较多的优化 |
数据库原理 | 2000+ | 前端网页开发,更多的运用架构,代码复用程度也比较大。 |
实验室项目 | 2000+ | 操作系统移植工作,代码更多是借鉴的 |
在这之前,并没感受到自己作为计算机专业的学生,有写过多少代码,当时当统计过后才发现这是多么惊人的数据。
在上述编写的过程中,自己也回顾了之前项目的经历。首先JAVA程序设计是自己完成的第一个完整项目。自己设计了贪吃蛇的运动逻辑,设计了GUI页面,以及行为的响应,虽然是在教程指导下完成的,难度不大,却是比较完整的项目经历,更是初体验。
计组和编译,是理论和实践结合的产物。在完整写出项目,并能通过一定强度的测试后,自己有一种设计的自豪感。但是论难度,虽有难度,但不是最难。
数据库项目是一次合作项目,第一次尝试团队开发,自己负责前端开发。采用了Vue+e-element组件设计和开发网页,并和后端进行交互。到了后期,和队友一起讨论设计的更改,功能的完善,更能体会到团队开发的感觉。项目经历还是比较难忘的,但是也比较遗憾当时没能进一步开发完善,系统也比较简单,希望能在软工上弥补遗憾。
难度最大的我认为还是操作系统的编写,首先是操作系统作为一个计算机体系结构中的一员,其设计的原理比较多,同时,从填空式的开发可以看出,操作系统的如果全部自己写,那是很难完成的。同时自己在实验室的实习经历,让我重新读了一遍操作系统的代码,发现其中不仅仅涉及程序的编写,还涉及行为响应,如陷入内核行为的响应(代码填空中涉及较少),还有整个交互逻辑,这些的难度,个人认为不是自己能够设计出来的。然而,仅仅是补全代码的部分,我们所作的也是比较简单的(但也还是带来痛苦的解答体验),更何况深层次的逻辑了。所以,我认为操作系统的项目是最难的,也正是操作系统编写过程,让我明确了自己未来的方向——计算机体系结构的深入理解和底层设计与开发。
学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?
在看到课表中出现了这些看似毫无相关课的时候,我便产生了这些疑问。所幸,在课程讲解的时候,老师都会提到其中的一些关联,例如线性代数中,会提及矩阵在计算机图形学中的运用。所以真正上过这些课,和更深入了解计算机之后,我自己给出的解答是,计算机作为后来兴起的学科,其理论不可能凭空产生,而是基于原先数学和物理学等等学科,到了学科交叉之后,计算机因为其可以模拟仿真,和其他一些因素,更是可以运用到医药学之中,所以,我不认为学习这些课无用,反而,通过这些课程的学习,更能强化我们对计算机的基础认识,从而更进一步了解计算机。
科班出身和北大青鸟有什么区别?速成的培训班和打基础的大学教育还有mooc之间有区别吗?
我想把这两个问题一起回答。我想说的是,科班出身,所学的不仅仅是编程这么简单的事情,同时还有计算机体系结构的知识,还有其他计算机前沿的知识。同时科班出身的我们,不单单是通过知识来训练计算机素养,还有与之配套的实验来强化。这种做出一个完整项目的经历,收获的远比北大青鸟、速成的培训班来的多。
其次,作者在我前妻的故事:一个北大青鸟出来的,如何从月薪800元到年薪40万?也这么强调:我看人从来不看起点,只看一个人是不是努力。并不是说科班出身就一定努力,但是我个人认为,科班的学习过程是一个比较困难的过程,能坚持下来并有所成就的都需要付出一点努力,而相比其他,都有着一点急于求成的感觉,缺少了磨练的过程,其中规范知识点,将知识点消化,转换成自己的思维都需要一定的过程和指导方法。一个人努力下,也许可以做到上述,但是需要自己去探索其中的方法,而科班的教育过程便蕴含着这种方法。
3.未来规划
对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?
很赞同作者在谈谈职业规划——CSDN对我的采访所给出的观点:
个人的职业规划就像软件工程。我们都知道软件项目最大的敌人是需求的不明确和需求的大面积变更,同样,在个人的职业规划中,自我需求的不明确和需求的变更也是非常危险的,尤其是在职业计划实施了四五年后需求的变动和改变。
职业规划,就需要对自己需求有明确的定位。对于需求的理解,我主要从两方面,一个是兴趣:做自己不喜欢的事情,最后会让自己越发反感;另一个就是技术定位:在自己所擅长的领域的做事情,可以使自己的未来道路上走得更远。
回到自身,对于自我需求的理解,自己现在也在探索的过程。对于喜好,自己无法明确自己喜欢什么,但是可以明确自己厌恶什么:自己不喜欢做题式的编程(纯粹为了某一个非常明确的目的而编程),相反自己更喜欢能有自己设计的编程。而在技术层面上,自己不擅长算法,所以尽量会避开这一方向。具体到自己未来的选择,因为自己的实习经历,让自己切实参与体验了底层的开发(操作系统移植)。在实习的过程,在不断调研知识的同时,完成一个使用OS的开发,这样的经历也让自己找到了一种归属感。所以自己梦想的工作就是,能加入到科研所,参与到底层的设计开发,即使这条道路很艰辛。
对于实现自己的梦想已经做了或者计划做什么样的准备?
做的准备的话,就是自己加入到校内的实验室项目实习。同时,因为自己深知自己要走的道路需要更深的知识,所以未来的计划就是进一步提高自己,成为研究生,向这一领域做更深的研究。
你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?实习经验究竟有多重要?是否需要马上开始积累实习经验?
这两个问题一起回答。自己有经历来回答这个问题,那就是自己实验室实习经历。
实验室实习经历给了我什么经验?首先是时间的规划,每周一次的组会,召开时间是固定的,这就要求自己如何在课业学习的时间之余安排出固定的时间用于实习,自己上学期把周末时间花在了实习上,而周中的时间就用来安排课内的学习,加上上个学期繁重的课业,如不过是自己的时间规划比较仅仅有条,自己很难度过那个学期。
其次就是提高自己能力。能力不仅仅是学术上的,更是学会总结工作的能力,和明确自己所面临的困难的能力,和规划未来方向的能力。后面三个是每次组会上所需要汇报的主要内容,所以在一次次组会汇报中,自己能更明确自己的问题和” did what and what to do”
最后,实验室实习,导师给出的指导非常有用,特别是一个在某领域特别精通的老师,能给自己给出特别明确的指导方向,和疑惑解答,这一点往往在公司实习之中难以实现。
总结以上三点,我认为很有必要开始积累实习经验。
写在最后的话
其实自己一度因为成绩不够保研从而对未来的方向不够明确,这篇博客也花了自己挺多时间去回忆和感悟的,自己收获很多,希望自己能不忘自己在其中所写,坚持下去!