本文转载自公众号《读书芯》(ID:AI_Discovery)。网上有很多“Don’t...”的文章:不要用继承(inheritance),不要用单例模式(singleton),scrum会被淘汰。这些真的不能用吗?如果语法真的很糟糕,我们怎么知道哪些建议是好的?没有完美的编程语言,也没有最好的编码方式,只有指南(又名已知缺陷)。很多编程建议都被夸大了,每个人都告诉你停止这样做或那样做。按照这个速度,每条指令都是失败的根源,我们很快就会用完指令。正如人们不期望开着卡车穿过木桥到达对岸一样,这并不意味着木桥没有承载能力,也不意味着人们不应该开卡车。编程语言只是工具。我们何时、为何以及如何使用它取决于我们。我们不能因为噎住而停止进食,我们应该改进的是使用方式。你如何发现坏建议?好的建议包含三个组成部分。第一,信息本身;第二,什么时候使用它;第三,什么时候不使用它。糟糕的建议通常缺少第二部分和第三部分——通常表现出永久适用的特征。一个常见的说法是:“不惜一切代价避免继承”。如果没有适用和不适用的条件,您可能会盲目听从建议而放弃面向对象系统(OO系统)最关键的工具。如果建议变成:“继承是一个很棒的工具,但深层次的制度(deephierarcies)往往是有害的。”这次的问题分明是“深”,解说准确有见地——浅社就好。另一个需要注意的是语言。许多作者倾向于“肆意写作,从不纠正”,这种语气充斥着网络。为写“狂”而“狂”写是极其有害的,作者不会说他的建议不是放之四海而皆准的。为了避免失调,他们通常不指定不适用的条件。好的建议应该是友好的,而不是强硬的。真心帮助过你的人,都不会生气。来源:Unsplash的经验谈在编码方面,有两个教训特别适用:(1)创建和维护语言非常昂贵。如果一种机制不断被添加到新的语言中,它就很重要。这就是为什么全局作用域、继承机制和if语句仍然存在的原因。任何声称取消它们的文章都忽略了这些机制的重要性。举一个很好的例子:类型系统。Python和JavaScript吸引了很多开发者,因为它们不需要分类,后来后悔用非结构化语言写了数千行代码。“过时的”Java和C#没有这个问题(并不是说它们没有缺点)。难怪TypeScript在这里。类型系统会返回弱类型语言——你输入一些,编译器会补上剩下的。这个想法非常成功,以至于它分别通过var和auto关键字闯入了C#和C++的世界,甚至Python现在也引入了类型系统。(2)相反,第二个教训是现代语言通过设计来消除混淆。这就是宏、goto语句和显式内存管理消失的原因。Java的垃圾收集(GC)过去饱受诟病,但几乎所有现代语言中的GC都不再需要Java虚拟机(JVM)。最近删除的是空指针异常。像Kotlin和Swift这样的现代语言通过设计实现了空值检查,C#8也是如此,Raw线程和异步回调有它们自己的问题。现在,我们可以在编写异步程序时使用方便的async/await语法。来源:unsplash这一切都表明:要成为更好的程序员,您需要了解编程语言的历史。大多数语言都是由有工具意识的人创造的,它们的发展是在社区的指导下进行的。每增加一个新元素,整个小组都会集中讨论这个元素的相关性及其对小组的价值,包括如何改进元素设计。更改和删除元素时也是如此,Python3进行了许多显着的破坏性更改,所有这些更改都是有效的。太多糟糕的代码我们使用了数十年的创新和失败的设计。只有专注于“糟糕”的C/C++代码,才能真正体会到垃圾堆语言的美妙之处。在那之前你只要想象一下过去编码是多么痛苦,那些写过单例模式并遭受过它(有很多问题,比如写测试)的人才能真正理解这种仇恨。课本上的例子和实际操作有很大的不同。前者只是一个提示,后者将真正改变你编码的方式。大多数人不会从Git或单元测试开始编码。这些项目经常有bug,经常无法运行。如果没有Git,您将无法知道是否不小心更改了某些内容。如果没有测试,您的代码在某个失败后就会停止工作。这些经历促使我们每天使用这些工具。要真正了解如何编写好的代码,您首先必须能够编写糟糕的代码。有几种方法可以迫使自己编写糟糕的代码(或在现有代码中查找错误),但这都归结为一件事:尝试以不同的方式编码,看看你的解决方案有多好或有多糟糕过去的。下面是你可以在业余时间做的事情:学习一门母语:比如Kotlin的母语是Scala,像Swift这样的语言就是为了解决Objective-C的问题而诞生的,C#取代了Java。学习重男轻女的语言,可以让你看到过去没有的“今天拥有”,也可以让人欣赏到很多今天被人们鄙视的工具。学习一种“继承”语言:C++开发人员应该尝试Rust,Java开发人员应该尝试Go,Python用于Julia或Nim,JavaScript用于TypeScript或Dart。与学习母语不同,学习继承的语言将揭示现有的缺陷以及如何解决这些缺陷。学习LISP:很多人认为这门语言很奇怪。LISP没有变量,它是一种纯函数式编程语言(比Haskell更简单)。你不需要精通这门语言,只要试着写一些像斐波那契、快速排序或哈夫曼编码这样的算法就可以了。如果你静下心来慢慢去做,你会发现很多时候变量并不重要。用纯C写一个文本处理器:设置一个文本文件的路径,打开它并去掉所有的换行符,在每个句点(.)之后添加换行符,然后重新组合每个单词,保持第一个和最后一个不变。如果每行在处理后保持平行,那将是值得称赞的。它迅速反映了字符串处理中的巨变。查找设计模式:准备一份设计模式列表和您正在从事或已经完成的开放项目。花时间阅读每个模式并找到特定模式适用的地方。想象每个模式在这个项目中会有多干净是将设计模式集成到项目中的最佳方式。来源:unsplash这些技巧将改变您编码的方式,或帮助您查看完成的代码。无论哪种方式,它都会让你意识到一切并不像看起来那么美好。我不是在谈论对与错,也不是在谈论如何编码,而是邀请您进行大量编码。代码是一种新的语言。尝试以两种方式完成同一件事。编写更多代码是编码人员进步的最终途径。
