生活工程学(一):多轮次拆解

工程实践 代码维护 数据处理技巧 学习方法 注意力管理
生活工程学(一):多轮次拆解探讨了将复杂任务分解为多个步骤的理念,适用于编程、翻译、阅读等多个领域。文章指出,一次性完成复杂任务往往效率低下,而通过多轮次拆解,每个步骤逻辑更清晰,维护和理解也更容易。例如,在编程中,将多层嵌套的循环拆分为多个简单循环或函数,能提升代码的可维护性;在翻译或阅读时,采用逐层打磨或三遍阅读法,能提高效率和理解深度。文章强调,人的注意力和认知能力有限,分步骤处理任务更符合人类认知特点,有助于提高效率和成果质量。
文章内容
思维导图
常见问题
社交分享

我们在工程实践中,有些构建代码的小技巧,其背后所体现的思想,生活中也常常可见。本系列便是这样一组跨越生活和工程的奇怪联想。这是第一篇:多轮次拆解,也即,很多我们习惯一遍完成的事情,有时候拆成多个轮次完成,会简单、高效很多。

我在进行 code review 时,有时会看到一些新手同学在一个 for 循环中干太多事情。这常会造成多层嵌套,或者 for 循环内容巨大无比。此时,如果不损失太多性能,我通常建议同学将要干的事情拆成多少个步骤,每个步骤一个 for 循环。甚至,可以每个步骤一个函数。

当然,这些全是从维护角度着眼的。因为人一下总是记不了太多事情,一步步来,而不是揉在一块来,会让每个步骤逻辑清晰很多。后者,我通常称之为”摊大饼“式代码,这种代码的特点是写时很自然,但是维护起来很费劲——细节揉在一起总会让复杂度爆炸。软件工程中的最小可用原型,也是类似的理念。

这种理念,其实在”函数式“编程中也随处可见,即对一个数据集操作时,我们会链式的应用一系列变换函数,从而让数据流清晰的展示出来。在大数据处理中,这种范式就更常见了,比如 spark 论文中提到的:

errors.filter(_.contains("HDFS"))
      .map(_.split(’\\t’)(3))
      .collect()

SQL 查询引擎在实现时也是用的类似机制,即将一个查询语句,转换成对一个行列组成的二维数据集,施加多轮次的算子变换。如下图所示。

图源:CMU15445,查询引擎讲义

我高中时学过一点点素描,虽然没有入门,但其多轮次的做图技法给我印象很深:先勾轮廓,再逐层完善。打线的时候也是一层层的打,而非一个地方画完再画另一个地方。我最近常常翻译文章,开始时,我总是务求一遍翻译好。但结果就是非常慢,且很容易放弃。后面开始使用多轮次、逐层打磨法。一开始用 ChatGPT 帮忙翻译一遍,然后自己再对照原文订正语义,最后扫一遍调换语序理顺词句等等。常言道,好文章是改出来的,应该也是这个道理。

滑铁卢大学教授 Srinivasan Keshav 在其 ”How to Read a Paper“ 中阐述了经典的”三遍(three-pas approach)读论文“方法,也是类似的思想:

  1. The first pass:鸟瞰式略读,抓摘要、章节标题、结论等重点内容。
  2. The second pass:稍微细一些,但不要陷入细节。
  3. The third pass:细读,完全理解。

其中任何一步都可以及时停止:这可能不是你需要的论文。但我之前读论文就长陷入一个误区,我愿称之为”地毯式读法“——逐字句过每一个细节。包括我刚开始进行 code review 时,也常常陷入这个误区。

一次性的、按顺序把事情做完,是大部分人的天性,但这种天性往往是低效的,我们要通过不断地训练来克服。说起来,我出去点菜的时候,也常用两遍法——第一遍把想吃的都加上,第二遍考虑各种约束(偏好强弱、价格高低、吃过与否等等)来将菜品去到一个合理的范围内。

我想背后的原因是:

  1. 人的注意力是有限的,因此只擅长一次专注的做好一件事情。
  2. 人的认知也是一个由浅入深的过程,一层层细化便是利用了这个特点。

思维导图生成中,请稍候...

问题 1: 什么是“多轮次拆解”? 回答: 多轮次拆解是指将一次性完成的任务拆分成多个步骤或轮次,以简化流程、提高效率并降低复杂度。

问题 2: 为什么在代码审查中建议将复杂的 for 循环拆分成多个步骤? 回答: 拆分复杂的 for 循环可以使每个步骤的逻辑更清晰,减少嵌套和代码量,从而降低维护难度。

问题 3: “摊大饼”式代码有什么特点? 回答: “摊大饼”式代码在编写时看似自然,但维护起来非常困难,因为细节混杂在一起导致复杂度爆炸。

问题 4: 函数式编程中如何体现多轮次拆解的思想? 回答: 函数式编程中,通过对数据集链式应用一系列变换函数,清晰地展示数据流,体现了多轮次拆解的思想。

问题 5: 素描中的多轮次做图技法如何体现多轮次拆解? 回答: 素描中先勾轮廓,再逐层完善,打线时也是一层层进行,而不是一次性完成,体现了多轮次拆解的思想。

问题 6: 翻译文章时如何应用多轮次拆解的方法? 回答: 翻译时先使用工具进行初步翻译,然后逐层订正语义、调整语序和理顺词句,通过多轮次打磨提高翻译质量。

问题 7: “三遍读论文”方法的具体步骤是什么? 回答: 第一遍鸟瞰式略读,抓重点内容;第二遍稍微细读,不陷入细节;第三遍细读,完全理解。任何一步都可以及时停止。

问题 8: 为什么一次性按顺序完成事情往往是低效的? 回答: 人的注意力有限,一次性完成复杂任务容易导致效率低下,而多轮次拆解可以更好地利用人的认知特点,逐步细化任务。

问题 9: 在点菜时如何应用多轮次拆解的方法? 回答: 第一遍将想吃的菜品都加上,第二遍根据偏好、价格和是否吃过等约束条件进行筛选,最终确定合理的菜品范围。

问题 10: 多轮次拆解背后的原因是什么? 回答: 人的注意力有限,擅长一次专注做好一件事情;同时,人的认知是由浅入深的过程,多轮次拆解利用了这一特点。