惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 宝玉

如何训练你自己的大型语言模型 设计系统(Design System),设计和开发之间的“DevOps” 如何写好绩效考核中的年终总结? 从技术高手转型做技术管理,不敢放手把事情给别人做怎么办? 从两周发布上线到一周发布上线,如何做到高效稳定? 项目一再跳票?试试这一招:用Deadline倒逼生产力 如何对Code Review的评论进行分级 Code Review最佳实践 - 宝玉 你的大学会有模拟面试吗?一些常见面试问题背后的逻辑是什么? 从软件工程的角度解读任正非的新年公开信 记在美国的一次校园招聘 有关技术分享 程序员也可以懂一点期望值管理 Make it run, make it right, make it fast 南通大学《构建之法》课程助教总结 如何高效的学习掌握新技术 Nodejs开源项目推荐 iOS客户端的在线安装和更新——针对ADHoc证书 AzureDirectory Library for Lucene.Net(续)
为什么软件工程教科书上的内容和现实的软件项目之间存在着一定差异? - 宝玉 - 博客园
宝玉 · 2018-04-04 · via 博客园 - 宝玉

前些天,有位同学软件工程课的作业上,对于读完《构建之法》之后问了几个问题,其中两个问题我印象比较深刻:一个问题是关于单元测试的,是不是必须所有分支,覆盖率达到100%;另一个问题是关于如何结对编程的。

在读2.1.2 好的单元测试的标准时,在P27中读到了上文,作者说代码覆盖率需要考虑到每个模块是否覆盖到了每个函数,是否覆盖到了每个语句,是否覆盖到了每个条件分支,是否覆盖到了每个布尔表达式的TURE|FALSE。但是在实际的软件工程中,在进行单元测试时,我们真的要保证有100%的代码覆盖率吗?是否只要保证了单元测试覆盖了所有的代码路径之后,像是语句覆盖之类的就可以不用全部代码覆盖了呢?就像如果出现了《100%代码覆盖率的悲剧》中提到的情况那样,某段代码功能看起来很简单,没有条件,没有循环,没有转换,没有任何复杂的东西,只是一段简单的老胶水代码。那么这时候我们也需要对它们进行代码覆盖,进行测试吗?这类的代码我们是否也要对它们保证完全覆盖呢?

在读4.5.2 为什么要结对编程时,在P85页读到了上文的内容,作者说两人结对编程时,程序的质量将取决于水平较高的一位,也就是说在编程过程中是由水平较高的程序员作为主导。但是这样的话,在进行编程的过程中,是否会出现水平较高的程序员长时间的掌控着键盘,而水平较低的程序员是否也会觉得由水平高的写代码能够更好地完成项目或者课设,然后自己基本上没有做什么核心任务这种情况呢?那么到项目结束时,就会出现不会的人还是不会,会的人更加会了的情况。像这样的情况在我们的课设中也是可以看到的。如果我们想要避免出现这样的情况,那么在编程初期我们应该怎么样分配工作才能够保证即有质有量地完成编程任务,不会出现代码来不及写的情况,又能够让两个人都能够都参与到主要代码的编程中?怎么样的工作量才能够让结对编程的两个人都能够有所收获呢?

我上学时也有过类似的困惑。当年因为自学了一些编程技术,所以有机会在学校的网络中心兼职,负责维护、改版学校的网站。日常的网站开发,也没有用啥软件项目管理知识,纯粹就是小作坊式开发,毕竟网站也不算复杂,也还运行的不错。

大三的时候我和另一个兼职的同学都转到软件学院去了,第一学期学的就是软件工程,一学期课程上完,觉得软件工程讲的太好了,以前的做法简直是土到家了,一点不科学。恰逢网站要改版,和同学一商量,都觉得项目开发,要文档先行,一定要按照软件项目管理的流程,先把需求分析文档、设计文档写好,再着手开发!

关于文档的重要性那是记得滚瓜烂熟,毕竟考试前刚背过,但是对于如何写需求分析文档和设计文档,却是两眼一抹黑,那时候网上资源也不算太丰富,源代码到处都是,偏偏文档找不到可以借鉴参考的,于是整天都在琢磨如何写文档。结果到我们毕业的时候,文档也没憋出来,那次网站改版也宣告流产了!

这让我对软件工程产生了怀疑,为什么我按照软件工程讲的反而做不出项目来了?

随着时间推移,项目经验的丰富,已经把这事都快忘记了,这两个问题倒是让我又有机会去反思一下:为什么实际的项目和书本的介绍总是会有些出入?完全按照书本去做有时候反而画虎不成反类犬?

如果只看单元测试问题:

  • 单元测试,重要吗?
    当然重要!
  • 单元测试覆盖率100%好不好?
    当然好!
  • 既然如此我们以后项目必须要单元测试,所有代码分支的覆盖率必须100%
    这样的规定就有问题了,因为它只是孤立的考虑了单元测试的重要性,而忽略了它对时间和成本的影响,也忽视了不同项目对单元测试要求的差异性。

单元测试的目的是什么?保障代码质量。换个角度说,就是单元测试是保障代码质量的手段之一。再回想下软件项目管理里面的铁三角,四个要素:时间、范围、成本和质量之间是相互影响和制约的。

单元测试写得好,可以提高代码质量,但是需要更多的时间和成本,到底要把单元测试写到什么程度,完全取决于要如何平衡这几个要素之间的关系。

一味的追求单元测试的覆盖率,就陷入了教条主义的陷阱,错把手段当目的!

再看结对编程和文档的例子,也是类似的问题,结对编程和写文档,都是提高项目质量可以应用的手段,但并不是最终的目的。

在教科书上,各个章节都是相对独立的,都是一个个的知识点,而现实的软件项目是立体的,是需要将各个知识点组合在一起的。在学习这些知识点时,如果不能站在更高的角度去综合看待,而是孤立的只看这一个知识点,就容易陷入教条主义之中,错把手段当目的。

要对这类问题不困惑,总还是离不开做中学(Learning by Doing),在实际的项目积累经验,对课本上理论知识进行印证。这样遇到各种不同的项目场景的时候,能抓住重点和本质,采用适合的手段来达到项目的目标。Make it run, make it right, make it fast!