文学编程基于三个简单的语句:
- 程序员必须编写计算机可以理解的代码
- 程序员应该写文档,人们可以理解
- 如果这些是单独的文档,它们将不可避免地不同步
事实上,根据我的经验,#2 通常会受到冷遇。我已经记不清有多少次 QA 告诉我“文档是这样说的,但代码是这样的;是代码不正确还是文档过时了?” 在这方面,我不希望我的工作场所与众不同。此外,在我早期的一个项目中,我试图使文档保持最新,因为与利益相关者的反复交流导致了需求的变化。这非常耗时,管理层告诉我不要再弄乱文档,让项目正常运行。从那时起,我们就进入了不那么繁琐的文档流程(感谢上帝!)。
我们有代码审查工具,当我们对代码进行更改时,多个人可以看到更改,清楚地描述,并且可以进行评论,提出问题,解释内容,提供改进。如果代码是用文学编程技术编写的,那么这个问题/答案的大部分内容都是多余的,因为其中包含了解释。
现代编程的大部分心态是您的代码应该是它自己的文档。许多专家认为,如果您发现自己需要在注释中解释代码,您可能应该重新格式化代码(更改变量/函数名称等),以便不需要注释。我觉得这在理论上很好,在现实中不太实用。我的意思是,当我使用由其他人创建/维护的库时,他们对方法/函数名称的选择对我来说并不总是直观的。例如:
Set<String> statesWeCareABout = new HashSet<String>(Arrays.asList(new String[] { "one", "two", "three" }));
Set<String> statesWeFound = <some function>;
statesWeFound.retainAll(statesWeCareAbout);
如果你不熟悉 Set<> 或 HashSet<>,你可能不知道 .retainAll() 意味着给我两者的交集,结果在修改后的 Set<> 中。
最后,文学编程通常让您分解事物,以便您可以单独解释这段代码,然后将其嵌入到另一段代码中。这更符合人类理解的工作方式。向我解释这是如何工作的,然后在这种理解的基础上解释更大的图景。计算机并不真正关心;你可以用 1000 行代码编写一个函数,并且理解整个事情没有问题。如果您作为开发人员必须保持这一点,那么上帝会帮助您。
这就是文学编程背后的原因。代码需要维护,无论是修复错误还是添加功能。如果它不能被其他人理解,那么稍后,它会以一种有效的方式被替换。这个世界上有很多“只写”代码。文学编程使其更易于阅读和理解,这使其更有可能长期保存和使用。
我们真的有时间不断重新发明轮子吗?