大多数人似乎认为我们只是把东西放在一起,大部分都是从网上捏出来的,就像一个预制棚。或者乐高。这份工作有点像带打字机的焊工。我永远无法很好地解释它有多么不同。我们写了很多独特的东西。装配在一起是复杂的,并且必须尊重现有代码、系统和标准施加的各种约束。这就像大规模的数独。但这不仅仅是将一些代码片段粘贴在一起。
只有一个?过程不对称。让 E(c) 指定进入编码的智力工作量,无论编码人员和非编码员的任何编码方式,让 E(d) 指定进入解码或调试的智力工作量。然后,在 UNIX 环境中使用 C/C++ 超过 25 年的专业经验之后,我可以自信地声明以下关系成立:E(d) > E(c) \tag{1}上述不等式是严格的,即不包含等号,这一事实至关重要。这在实践中意味着,如果在一个方向上过于聪明地使用键盘,那么有朝一日,完全有可能编写一段即使是作者也无法成功调试的代码。这可能听起来自相矛盾,但不幸的是,这是真的。解释。以双螺旋方式,至少有两种类型的知识进入您称为编码的过程 – 技术和部落。需要技术知识才能成功地从被删除的当前节点一直走到 AVL 树的根节点,并根据需要旋转中间成分,以通过确保没有一个节点的平衡因子大于一个单位。部落知识,也称为特定领域知识,需要了解为什么以及何时必须删除所述节点,以及如何将业务需求转化为具体的技术步骤。不幸的是,在当今这个时代,将上述两种类型的知识结合起来并将它们简化为一组众所周知的 malloc() 和 new() 散布在一组磁盘文件中,编译器将其视为翻译单元,是有损的。有损的意思是作者在写代码的时候可以得到的大部分周边视觉或者周边和卫星信息,让我们同意命名为Event C进行编码,在调试的时候已经不存在了代码,让我们同意由作者或非作者命名该事件 D 进行调试。事件 C 和 D 通常在时间上相隔 10、15 或 20 年(例如在我的情况下)。所以你有它 – 甚至调试你自己的代码也不是一件容易的事。调试别人编写的代码更具挑战性。也就是说,部分原因是为什么在编写新代码和调试现有代码这两个任务之间,迄今为止最受欢迎的选择是编写新代码。这个问题的部分直接补救措施可能是尝试编写非常简单的代码,无论这意味着什么。然而,直观地说,大量的小简单性具有这种集体变得相当复杂的特殊趋势——虽然每一行代码可能很简单,但20万或更多这样的代码行之后,整体可能会非常复杂和复杂。对这个问题的一个部分明确的补救措施是正确构建的注释,它不应该模仿代码,而是应该揭示和包含无法从直接环境逻辑推导出的关键信息。换句话说,我们不是盲目的,我们可以看到您正在执行 memset() 或类似的操作。我们想知道的是您为什么这样做,为什么在这里以及为什么以这种特定方式。此问题的部分隐含补救措施是正确编写的随附技术文档。但是即使使用简单的代码,正确构建的注释和正确编写的文档,该过程仍然是不对称的,并且在调试会话期间的可能性对我们不利。
边缘案例编写规范的非编码人员通常很清楚当一切顺利时会发生什么………并且通常惊讶于编码工作实际上是为了检查出现问题时应该做什么。我将过度简化,但考虑一个简单的例子——有人在 ATM 上想取出 20 美元。非程序员倾向于认为它应该像这样工作:1.查看余额2. 发行说明3. 过帐交易(减少余额)…