1. 阅读提问
我平时就很喜欢阅读,但我很少提出问题。我会习惯性的给作者提出的与我旧有知识体系矛盾的观点 添加定语,形象点描述的话,有个很知名的“亚洲最大的单体教学楼”的梗也许能表达我的思维方式,配图的文字是“当数据的维度增加时,数据将会变得特别稀疏”。因此除了明显的钓鱼或者是带有精准目标群体的内容,我都很难提出反驳来——因为在上下文情形下他说的确实是正确的。
所以在阅读《构建之法》时,提出问题对我来说就非常困难,比如代码规范中关于大括号换行(顺便一提,我是函数括号换行,控制语句括号不换行党)的论述、关于面向对象的思想的观点,这样的问题在不同的程序语言/项目中往往是不同的。最后我终于憋出来了一些虽然内心已经有答案的问题:
1.1 敏捷软工过去的团队项目后来怎样了?
“现代软件工程”这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下,并写一个博客: ·当时的项目有多少用户,给用户带来了多少价值?现在还有人用吗? ·这个项目能否给我们团队继续开发,源代码/文档还有么? ·项目开发有什么经验和教训? ·对学好软件工程有什么建议? ——《构建之法》1.3
在我大一大二时,曾有学长学姐在软工课程上开发了《航胥》等供北航同学使用的App(另一款名字忘了),这些App相比北航教务处提供的时而打不开的小程序,提供了更多直击用户痛点的功能:比如接入课程中心,可以很方便的管理待完 成的作业;将课表和空教室查询联系在一起,方便同学上课与寻找教室;本地缓存课程表,即使没有网络也可以放心查看课程……
与这些软件最开始的邂逅往往来自群组里学长学姐的安利,然而可能是服务器资源到期,也可能是课程评分结束,亦或者是教务对于非官方工具的限制,在逐渐习惯这些软件带来的便利后的某天,App便突然再也无法访问了,最后又回到了官方网站的怀抱。
当然,如果同学们的成果最后可以被官方所“招安”,比如集成的Course Center任务提醒功能,那么从结果上看也是好的,但是事实上教务的课程表除了访问超时的次数变少,似乎没有其他新增功能。这门课的助教很多都是去年敏捷软工的参与者,我想也许可以在这里问问《构建之法》中所提问的这几个问题。
1.2 单元测试由最熟悉代码的人(程序的作者)来写是否足够呢?
单元测试必须由最熟悉代码的人(程序的作者)来写。代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。 ——《构建之法》2.1.2
单元测试是一种白盒测试,对于编写这段代码的作者来说,代码的内部结构是完全透明的,所以单元测试当然应该由作者本人负责。然而,个人编写的单元测试是否足够呢?在我看来,单元测试的作用主要有两种:
- 作为CI的基础,确保模块在一次次的版本迭代中能够正确执行基本功能
- 为了写出单元测试,程序作者需要规范自己的代码,简化对外暴露的逻辑
如果说是一个不会继续迭代的模块(比如你在写前端的某个页面动画,这个时候似乎就没有单元测试的必要?),那么单元测试的重要性就有所削弱(虽然在你某天突然打算新增功能时就会拍大腿);但在业务需要快速迭代的情况下,单元测试与自动化集成部署是减少人力成本的有力方式。然而个人对于代码的理解具有局限性,在写出某段逻辑时,你可能很难意识到自己正引入了一个新的问题。
在现代的软件工程中,很多时候某个功能的设计者与实际的编码人员并不是相同的,单元测试是否更应该由模块的设计者进行?在结对编程中,两个人轮流进行功能开发和单元测试是否是既满足“最熟悉代码”又能够避免囿于个人视野的最佳方式?另外OO第三单元的Junit给我的体验并不好,相关的工具没有良好维护,配置环境就耗费了大量时间,那么又有那些降低程序员进行单元测试的时间成本,从而提高程序员进行单元测试的积极性的框架?我想这些问题在学完本学期的软工后应该能够得到解答。
1.3 2021年,“全栈工程师”们都去哪里了?
当我们谈论“全栈工程师”的时候,我们说的究竟是“交响乐作曲家写各个乐器的乐谱”,还是“演奏家满场奔走,操作各种乐器”呢?当工程师设计软 件的时候,工程师的设计、修改错误等活动大致等同于交响乐的谱写完善阶段,两个职业都假设一旦程序/乐谱写好,它们就会被正确地执行。当一个运维工程师在维护一套系统的时候,运维团队要了解各个模块的作用、维护知识,以及和硬件、商业模式相关的各种事件的需求。如果这大部分运维工作都是由一个运维工程师来完成,那么这位工程师的确是“全栈”。 ——《构建之法》3.3
在第一次作业阅读提供的往届优秀博客中,我看到很多学长的职业规划都是成为一名全栈工程师,然而这个词语如今似乎早已不再流行,提供的岗位也比职责更加明确的前端、后端少了不少。在网上搜索相关的问题,大部分回答都在劝退:一方面更加明确的分工是大势所趋,企业所需要的是可替换的人才;另一方面过多的领域也让全栈工程师难以深入钻研某一个方向。
《构建之法》中提出了疑问,你是更愿意倾听街头啥乐器都会一点的艺人的演奏,还是专精于某一种乐器的乐手。在各个职能都在进行减少组件之间的耦合,用更加先进的框架封装重复性操作的当下,交响乐已经谱写完毕,大多数人所能做的似乎只有演奏家,也就是维护一套系统,偶尔增加点新功能的工作。我想软件工程属于人的最好的时代已经过去,这种情形下“全栈”也就跌落神坛,成为了又一种重复性的劳作,个人的创新工作又将如何展开呢?