解锁编程智慧 | AI生成和翻译
问题:Wang Yin 的文章《编程的智慧》(The Wisdom of Programming),位于 GitHub 链接 https://github.com/AlexiaChen/YinWangBak/blob/master/编程的智慧.md 中,内容是什么?
答案:
概述
这个文件是 GitHub 仓库 YinWangBak 的一部分,该仓库收集了 Wang Yin (王垠) ——一位著名且有影响力的(尽管有争议的)中国计算机科学家的文章。这篇文章标题为 “编程的智慧” (The Wisdom of Programming),最初发布在他的博客上。下面是其内容的全面总结。
引言
编程被描述为一种创造性活动和艺术形式。掌握任何艺术都需要大量练习和洞见。标题中提到的“智慧”并不是奇迹般的捷径——它无法取代努力工作。然而,由于软件行业倾向于将简单的事情复杂化,本文旨在为困惑的人们指明正确方向,让他们少走弯路,少浪费精力。
1. 反复打磨你的代码
有些人吹嘘自己写了多少千行代码,仿佛数量就是编程技能的衡量标准。然而,如果你总是急于写代码,而不回去审视、修改和打磨它,你就无法真正进步。你会继续产生平庸甚至糟糕的代码。在这个意义上,许多人所谓的“工作经验”并不一定与代码质量相关。
优秀程序员删除的代码比保留的更多。如果有人写了大量代码却很少删除任何代码,他们的代码库很可能充满了垃圾。
如果你达到了一个平台期,打磨不再带来进步,就把代码搁置一边。几周或几个月后回来——往往会有新的灵感。经过许多这样的循环,你会积累智慧和直觉,从而更直接、更正确地处理新问题。
2. 编写优雅的代码
人们讨厌“spaghetti code”,因为它纠缠逻辑,让人无法跟随。相反,优雅的代码看起来像整齐堆叠、嵌套的盒子——有组织且层次分明。就像整理房间:不要把所有东西扔进一个大抽屉,而是用里面的小盒子来分类物品。
优雅的代码也具有树状结构。程序主要处理信息传递和分支。把代码想象成电路——电流通过导线,在节点处分流。这种思维方式会导致 if 语句几乎总是有两个分支(一个 if 和一个 else),从而创建清晰且严密的逻辑。
3. 编写模块化的代码
真正的模块化不是将代码分散到许多文件和目录中——那只是表面上的,往往适得其反。真正的模块化是逻辑上的。一个模块应该像电路芯片一样,具有明确定义的输入和输出。已存在的最好的模块化工具就是简单的 function:每个 function 有明确的输入(参数)和输出(返回值)。
模块化代码的关键原则:
- 保持 function 简短——理想情况下少于 40 行,这样整个 function 能在你的视野中完整显示而无需滚动。
- 创建小的实用/辅助 function——即使是一个两行的辅助函数也能大大简化主函数的逻辑。
- 每个 function 应该只做一件简单的事——避免根据条件在内部分支的多用途 function;相反,将它们拆分成单独的、专用的 function。
- 避免使用 global variables 或 class members 在 function 之间传递信息——改用 local variables 和参数,以保持清晰、隔离的 function 逻辑。
4. 编写可读的代码
真正优雅且可读的代码几乎不需要注释。如果你发现自己需要写很多注释,那很可能意味着你的代码逻辑不清晰。编程语言实际上比自然语言更强大、更精确——它们包含名词、动词、条件等等价物。如果你充分利用语言的表达能力,代码本身就会解释它在做什么。
可读代码的具体提示:
- 使用有意义的 function 和 variable 名称。
- 在变量使用位置附近声明 local variables。
- 保持 local variable 名称简短且特定于上下文。
- 不要为不同目的重复使用 local variables。
- 将复杂逻辑提取到有名称的辅助 function 中。
- 将复杂表达式提取到有有意义名称的中间变量中。
- 在合理的位置断行,以提高视觉清晰度。
5. 编写简单代码(避免过度工程)
本文警告不必要的复杂性:
- 避免深的继承层次和过度使用 design patterns。
- 不要在真正需要之前添加 abstractions 或 generalization。
- 抵制过早“未来证明”代码的诱惑——这通常会增加复杂性而无益处。
6. 正确处理错误
本文深入讨论了正确的错误处理。错误处理并非 Java 独有——即使在 C 中,也存在相同的基本问题,没有语言能让你逃避它。你必须理解 exceptions 的含义并正确处理它们,而不是盲目捕获所有 exceptions 或到处添加 throws Exception。
7. 避免 Null 并使用安全的替代方案
本文强烈批评将 null 用作返回值,称其是许多 bug 的根源。它推荐使用像 Optional 这样的构造(尽管也批评了 Java 8 冗长的实现)或其他安全的模式,这些模式使值的缺失显式化,并强制调用者处理它。
总体哲学
本文呈现了通过实践获得的编程知识和技术。它强调程序员应该知道每个阶段该做什么——以及不该做什么。这些不仅仅是个人偏好,而是良好编码的广泛共享原则。核心信息是:质量胜于数量,清晰胜于巧妙,不断打磨胜于仓促生产。
参考文献: