【作业】2020年高等软件工程课程期望与笃信

【作业】期望与笃信

开头一些自己想说的

之前的话,不管怎么说,还算是顺利地本校保研了,而且与自己相性良好的软件工程专业,整体来说还算是顺利。此时选择了高等软件工程课程,在这刚开始当然难免有些想絮叨絮叨的,还望各位看官老爷们海涵😄。如果对此没有太多兴趣的话,可以直接跳转到下一节。

其实也没啥,不过就是老调重弹而已,此处是一点个人的过去履历,本文不作赘述,也没太多可说的。简单来说的话,笔者自认为可以算是有一定的代码和工程经验,对一些问题应该还算是勉勉强强有些理解

此外,笔者在本科期间,担任过2019年度的面向对象设计与构造课程的助教组长,做了点微小的贡献:

  • 分不同层次,调研了原有课程体系的问题表象
  • 基于问题表象,抽象了问题内涵,并理顺了相关的逻辑关系,找到了几点根本症结所在
  • 基于上述分析,重新设计了课程制度,构建了全新的分布式课程系统,课程内容也一定程度上进行了重构,并最终取得了阶段性成果
  • 此后,作为高阶助教指导下届助教的工作与进一步改革,并提供系统技术支持与指导
  • 再此后,卸任助教,担任课程组顾问,参与部分课程事务并负责持续提供系统技术支持与指导

关于对这个本科课程的一些思考和说明,可以参考下我知乎上的回答,以及其他的一些博客内容,此处不再赘述。其实说这些,主要是感觉如果是我的话,或许可以从一种不一样的视角来看待这门新的软件工程课程。

个人的一点碎碎念到此结束,接下来是个人针对课程的一些思考。

个人对课程的理解与期望

目前读了已经提交的几篇博客,能感觉到这些同学们不管怎么说,态度很认真,很值得钦佩。不过也不得不说,确实体现出来了一些实实在在的问题,或者更准确的说,是此类课程都普遍容易存在的实实在在的问题。

之前笔者作为助教实际上也普遍发现了类似的情况,并做过一些学生视角层面上的思考。此外,还和老师们有过一些交流了讨论,在此我作如下思考:

  • 软件工程课真的没有意义吗?NO!作为过来人,我的感觉是,不仅有意义,而且意义大了去了。有很多课程上教的理论内容和实践要求,恰恰在实际工作中是至关重要的。举例来说,面向对象的各种设计要求,看似很无谓,但实际上正是有了这些,大规模团队开发的质量才有可能得到保障。各种文档的撰写,看起来很无聊很累,但是只要项目一大,人数一多,对代码没有充分且规整的记录的话,那么团队协作将基本不可能,软件的后续开发与迭代效率将以肉眼可见的程序急速下降,这对于任何团队和组织而言都是绝对不可接受的。这些事情真正做过实际应用向工作的人应该没有谁不明白的。
  • 但是为什么这么多学生就是觉得这些事很无聊很没意义甚至很扯淡呢?恩,这是个好问题!其实生活中就有类似的场景——有相当一部分的中老年文学作者(当然普通人也大抵类似,只不过文笔不够好不能做到让自己的故事尽人皆知而已),回忆年轻的时候,都会发现自己的长辈某些劝告简直是至理的,可是还有更微妙的一点,那就是这些人普遍表示自己年轻的时候可不懂这些,而且大抵还都一意孤行过。其实这个道理类似——因为这些经验显然不是空穴来风,都是经验丰富的实践者们用自己双脚丈量出来的最好的路,可是这些都是建立在丰富实战经验的基础上的,对于缺乏经验的学生而言,这些就会很容易变得像是在单纯的灌输和说教,不仅起不到应有的效果甚至可能加剧反感
  • 那既然这样该怎么做呢?另一个好问题!私以为最根本也是最直接的解决方案就是将实践真真正正的引入课程中来。很多时候,光说不练不可能领悟到真正的内容,在计算机这个专业,尤其是软件工程这个方向上更是如此。理论终究还是为更好的实践而服务的,都是无数前人总结出来的干货。而没有充分的实践经验为基础的话,思想意识上首先就不可能达得到这一层。私以为这也正是北航六系的一个亮点所在,几乎所有的关键专业课的课程组,都在这一点上达成了高度共识。
  • 那应该怎样在课堂这样一个有限的周期内进行实践训练呢?这个问题问到点子上了。其实,不少类似实践类课程之所以效果欠佳,倒并不是因为平铺直叙,而是没有处理好无限的工程实践与有限的课程周期的这组矛盾。对于这个问题,比较容易想到的一种方式,就是加大工作量。实际上这毫无疑问是必要的,没有充分的实践经验培养,很多问题的理解根本无从谈起。但是另一个值得思考的问题在于——真的是越累越好,甚至于向辱而生么?我个人觉得实际上并不必要,最佳的一个状态,是强度保持较高且恰到好处的水平,并且课程本身需要具备充分的引导能力,将学生的付出引向正确的方向,简而言之——好钢用在刀刃上,让师生助教的时间都花在正确且高效的地方。
  • 此外,课程层面上还有另一个值得注意的地方,那就是是否适合直接将产业用技术、方法及其工具链(下文统称产业应用)直接引入课程教学中。这个问题我在之前的面向对象课程中也面对过,曾经使用的JSF是一个不算成熟且有颇多缺陷的实验型工具暂且不论,后续引入的是JML、UML相关工具链,这是都在严格软件工程领域有一定应用的,实际产业应用的推广足以证明其对于产业的价值。但是产业的应用场景和教学的应用场景依然有很大的差别。具体来说,产业应用重在提高产业开发与协作效率,并且常常有一个基本的前提与假设——使用者是在以提高开发效率为目的进行工作的(类似于no evil原则)。而这个假设对于课程应用来说,可能会造成致命的后果,因为学生常常并不能做到这一点,恰恰相反很多学生更像是在为了通过某种考核而工作。而产业应用常常因为其需求性质,而不具备对教育与考核相关功能的充分支持,于是就会造成很多钻空子甚至严重破坏教学与考核秩序的情况出现。当然,说这些不是说不应该引入产业应用,只是说不应该直接盲目地,生搬硬套地在课程中引入产业应用。为了解决这一问题有两种基本思路,其一是基于产业应用,自行设计教学考核用应用,这样可以做到量身定制但是对于课程组而言水平要求相当高;而另一种思路,则是进行充分调研分析后,设计出合理的教学内容与方法,辅助以完善的考核方法与制度,实现公平合理且引导性良好的考核

以上是本人对课程本身的期望,接下来说说我自己的。其实我自己的部分非常明确而简单:

  • 希望课程能在我原本的一些基础上,进一步强化理解与技能水平
  • 此外,希望这次带团队的经历能给我带来teamwork方面上的提高

大概就是这样。

个人对项目的理解

宏观理解——如何做好团队工作

在这里,实际上笔者也认真拜读了之前几位同学的博客作业,同样的,我觉得他态度很认真,很值得钦佩,就这一点而言比我这样十足的懒汉强的不知道到哪里去了。那接下来,我这边也尽可能结合过去的经历谈谈自己对项目这件事的宏观理解。

让我们回到这节的标题上来,如何做好一个项目,在宏观层面上我是这样的看的:

  • 认清形势。具体来说,这个团队的牵头者必须对行情有充分的了解,且具备冷静理性的头脑。不可陷入经验主义从而作出不合时宜的判断。
  • 具备合适的行动路线。基于上一点的准确认识,而规划出一条比较适合此时此地此些人的行动路线,尤为重要。切忌基于过去或者他人的某些所谓“成功经验”而全盘照搬,因为成功不可复制。
  • 合理统筹规划。事实证明,同样的一个班子,同样的一批资源以及类似的所处环境,不同的规划下实际做出的成果可能天差地别。作为计算机科班出身的人应该会知道一个问题,分布式系统的运行效率很大程度上取决于其内部的调度算法。团队工作也是类似的道理。
  • 充分的团队协作。这一点依然很重要,毕竟无论什么时代、去做什么,最关键的都不是几件纸面参数厉害的武器装备,而是使用它们的人。一个团队若是具备强大的凝聚力与行动力,那么在风雨飘摇之时可屹立不倒,在冲锋号响之时可重拳出击,战无不胜。

简而言之,以上问题,分别解决的是几个问题:

  • 我们是谁,我们在哪,我们有什么?
  • 我们该往哪里走,该去做什么?
  • 我们该怎么去做,该让谁去做?

这些看上去像废话一样很简单而又假大空对吧?但是实际上并不那么容易都做到,这是很真切的体会😢。不过如果能做得到这几点,那很 多事情基本上已经算是可以正常运转了,即便偶尔偏离航线也有充足的修正能力。某种意义上,宏观工作的优劣决定了项目成果的下限

微观理解——如何做好合作开发

在上述的基本面上,想要做好合作开发,依然需要更加微观层面上的一些注意点。此处我谈一些个人的理解。笔者在微观层面上是这样看的:

  • 基础要求
    • 全体人员的重视度与投入度。这一点毋庸置疑,也可以算是一个团队最最基础的,缺乏了这一点团队基本没什么能量可言。
    • 团队成员对整体技术栈的了解和把握。具体来说,就是需要对所需使用的技术栈与工具链等有充分的熟悉和了解,比如对java、git、对plantuml等工具的了解。这也属于非常基础的要求。
    • 团队领导者对情况的掌握能力。具体来说团队领导者需要对眼下的情况(包括成员内部关系情况,技术积累情况,资源积累情况等)有充分的认识和了解,并需要一定程度上具备抽象思维,将情况进行准确理解和描述。
  • 基本要求
    • 团队成员的技能水平与熟练度。这一点和上面类似,但是对技能的要求更高一些,需要做到熟练操作并完成任务,并能够形成一定的规范性,且保证质量可靠。
    • 团队领导者对情况的分析能力。在充分掌握情况的基础上,还需要做到对情况的分析,找出真正的成功关键,以及真正的失败原因在哪里,而不是人云亦云,或者头痛医头脚痛医脚。
    • 团队领导者对各类资源的调配能力。在充分掌握资源状态的基础上,还需要能做到合理配置资源,做到充分的物尽其用,并做到充分的并行化以提高效率(实际上,大多数的团队协作效率提高,其精髓都在于这并行二字)。
  • 进阶要求
    • 团队成员对大方向的充分了解与认可。实际上,一流团队拥有共同的信仰,二流团队拥有共同的利益,三流团队拥有共同的敌人,不入流的团队别名乌合之众。一个团队的大多数成员要是能做到很清楚自己究竟在做什么样的一个事业,并对此充分认可,而不是对某个领导者个人崇拜(这样的团队很脆弱)或者纯粹逐利(因利而聚的团队注定因利而散),那这样的团队将拥有前所未有的凝聚力和行动力,且坚不可摧。
    • 团队成员之间的相互信任与支持。同上,团队成员之间的充分信任,以及通力协作,可以极大减少团队内耗,提高效率。
    • 团队领导者的大方向把握能力。领导者需要对整个环境有充分认识,并基于此作出整个团队未来走向的决策。这是关键中的关键,甚至可以说,哪怕别的全有而这个没有,也八成会走向失败。

以上算是个人的一些简单总结,可能并不全面,还望指正😄。这些方面则是一些具体执行层面上的注意事项了,一般来说想要做到虽仍需修炼,但并非遥不可及。做得到这几点,意味着主线工作已经可以正常展开并有力推进了,能做到开足马力向目标前进。某种意义上,微观工作的优劣决定了项目成果的上限

提前分析——对自选项目的理解

我们组本次选择的项目是Program knowledge提取,需要完成的工作有需求、设计、实现与测试。个人感觉,这样的项目实际上说难也难,说简单也非常简单,难在一些前置的技术栈需要去充分了解,并且为了获取最佳学习体验,需要做足功课;简单在于在完成上述的准备工作后,接下来就是系统设计与实现,这些都是本人足够熟悉的领域。

实际上对我们这边来说,完成任务是稳得,所以我认为更需要关心的是如何让自己获得真正的提高,而完成任务只是手段而不是目的。

勤能补拙——自我拯救补课计划

考虑到笔者仍有较多不成熟的地方,所以笔者觉得自己实际上很需要进行一些补课,在此简单列举一下:

  • Java部分,笔者虽然有过一定的java开发经验,并熟悉maven等工具的使用,但是依然有一定的知识空白需要填补,以适应复杂的程序分析需求。其中包含:
    • jvm底层知识,需要可以基于指令进行一定行为分析的程度
    • java语法深层知识,需要达到可以对代码语义进行定量分析的程度
    • 相关java工具链的使用,用于支撑语义的定量分析
  • 建模相关部分,笔者虽有过感性体会与实际操作经历,但是并未太多深入研究过详细理论,这部分尤其需要恶补。其中包含:
    • UML及其相关工具链的使用与理解
    • 在上述基础上对建模这一概念本身的更深度理解
  • 团队协作及资源配置能力,这个自不必说,团队协作的成败与我这个团队leader有着重大关系。这个的话没办法很细致的罗列补课清单,大概只能实践中不断学习吧。

一点随意的总结和大量的胡言乱语

以上的部分算是我的一些思考,感觉自己还需要学习的东西还是太多了。而且,这注定不是一个轻松地过程,往往伴随着破,以及而后的立,人这种生物,思维永远带有一股子惯性,想打破原有的舒适区并不是件容易的事,需要充分的觉悟与执行力。具体来说,当你随便码代码,码习惯了码爽了,然后有一天正儿八经教你如何像个正经工程师一样的码代码,这时候很多人就开始不愿意了,也不为啥,就是不爱被管这管那,尤其青黄不接又不得不服从的那段时间,并不好受。但是当瓶颈过去了,才会明白,所做的这一切真的都是血赚的,关于这一点,懂的人都清楚。为此,我会拿出我的认真劲,并拿出学习的姿态来面对课程及其作业,因为我相信其意义,更相信自己。

此外,估计后续还会有选了这个课的人看到我的这篇博客。为此我个人比较想提醒一句,如果你真的想要有所收获的话,就请务必摆脱学生思维,以完全面向实战的心态进行学习与训练接下来的话可能会揭有些人的伤疤并引起不适,笔者对此表示遗憾并请玻璃心们主动绕行。首先我看到部分同学退选,而原因仅仅只是因为听说课程是硬核的,就立刻打了退堂鼓。关于这件事我不想过多揣测他人,我没这个德也没这个能,况且有些人总归是有自己的规划的,对于这样的人我们当然应该尊重,因为他们为了自己的信仰而去做了一件正确的事,这非常好。可是如果仅仅只是因为畏难就这么撤了,或者没有撤而选择消极应对,那真的有些令人费解。首先,逃避可以解决什么问题?逃避只能让你除了收获无底洞般的空虚和恐惧之外一无所获。然后,请问您真的觉得就可以一直这样下去么?还真别说,我在本科阶段遇到过不止一个这样想的人。这些人一个普遍的特点,就是认为现实社会和童话一样美好,其中一部分人觉得天下无贼岁月静好,另一部分人更简单,因为他们根本什么都没去想过,也压根不关心,今朝有酒今朝醉,哪管明天是与非。他们压根不明白,到了那个时候,自己的那点小确幸小尊严,以及引以为傲了十几二十年的考试分数,在现实面前一分钱都不值,哪怕是最被视为硬通货的文凭,在起到敲门砖作用后也和废纸没有本质区别。现实永远是最简单粗暴且不乏残酷的,没有那些奇异瑰丽的美景,取而代之只有——胜者与败者、王侯与匪寇、生存及毁灭。笔者曾被这些人反驳过“为什么课程要这么难?”、“为什么要和学生这么过不去?”、“学这些有什么意义?哪有一个用得上的?”、“我辛辛苦苦18年高考到这就是为了来被一门课为难的么?”等种种言论,简直无奇不有。对此,笔者的一个统一回复是——您和我在这掰扯没用,请您直接去找你未来的上司、未来的老板、未来的客户、未来的竞争对手,还有未来来基于各种或利益或其他动机的敌对势力去“友好商谈”一下,看看他们会不会因为你们不知道几年前曾经被叫做学霸会多考几分抑或长得有点帅,就给你们如此“水”,如此“轻松愉快”的环境。然而事实是,他们不仅不会放你一马,还会将你如同打猎般击溃后提着你的脑袋壳去领功。到那时候,曾经在学校高洁风雅不可一世的您,充其量不过只是他们碗里多出来的一块排骨而已,吃完肉剃干净骨头就被吐进垃圾桶,遂自仰天长啸曰“世道不公人心不古”、“时运不济怀才不遇”、“内卷之害甚矣”云云,嗤,止增笑耳,早知今日而又何必当初😆。笔者忍不住想起了某位伟大的北大教员,因为他的思想实际上从未过时,过去如此,现在如此,未来也必将如此。

说多了,扯回来,不管怎样,我个人是希望真刀真枪地再次强化自己的技术实力与技术理解。并且希望同组的小伙伴们也能完全以实战的心态面对这次集体协作,而不是只是为了完成课程甚至只是应付苦差事。这样无论对自己,还是对组员,都是更好的。

posted @ 2020-10-06 02:23  HansBug  阅读(2442)  评论(16编辑  收藏