百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

很少有人会告诉你的5个编程名言,安排

zhezhongyun 2025-02-17 15:01 80 浏览


通过理解这些永恒的见解,你将成为更好的开发人员。

成为一名优秀的程序员,就是让你自己接受不断学习的生活(活到老,学到老)。包括新功能、新语言、新工具、新框架等优秀的源头——学习永不停息。但是,其实计算机科学也是一个令人惊讶的传统领域,这是基于久经考验的原则得出来的。我们已经添加了面向对象、现代硬件以及人工智能。然而,尽管发生了这么多的变化,许多上一代人提出来的见解在今天仍然适用(这点和我们现在的名言警句类似)。

在这篇文章中,我剖析了一些我最喜欢的关于计算机科学的引用。我设置的唯一条件就是,每个优秀的引用必须至少有20年的历史。因为古老的技术很快就会变得毫无用处,而我们编程祖先的古老戒律却有更强的持久力。

1. 关于Indirection

"计算机科学中的所有问题都可以通过另一种间接的方式来解决"。——David Wheeler

这里有一个很少被开发者愿意解释却又经常被复用的compsci的引用。但这是我最喜欢的编程真理之一,因为它触及了编码的核心。

开始考虑Indirection的最简单的方法是想像层次。例如,假设您有一个小项目,需要将组件A放入组件B:

两个都是标准的组件,因此你不能破坏他们并更改他们的工作方式。你可以构建一个全新的组件,但这需要大量的工作和不必要的重复。一个更好的方式就是这两个部分之间添加一层——一个适合于两个组件并在它们之间进行转化的适配器。(其实就是设计模式中的适配器模式)

现在,如果Indirection仅仅是添加一个新层来讲不兼容的部分组合在一起,这将是很好的,也确实很有用。但是围绕问题进行构建来解决问题的想法是一个从底层一直延伸到顶层的概念。当你试图将新的数据模型适配到旧的用户接口时,你就会看到它;当你试图将遗留应用安装到一个新的web后端服务器时,你就会看到它;当你需要绑定更好级别的特性(如日志和缓存)或协调更高级别的服务(如消息传递和事务)时,你就会看到它;在金字塔的顶端,你将会接触到像机器学习(当你不能为你需要的行为编码时,再写一层代码来帮你找出它)这样的少数主题。

很多人会告诉你,编程就是用一种即使电脑小白也能理解的语言写出明确的指令。但是大卫·惠勒的名言揭示了更好的见解:好的编程是要爬上抽象的阶梯才能到达最通用的解决方案。

相关引用

间接是强大的,但是复杂性是有代价的。人们很少引用惠勒关于间接的后续评论:

但通常会产生另一个问题——David Wheeler

从那时起,这一真理就一直让程序员在商业上如日中天。

2. 关于简单

“简单是可靠性的先决条件”。——Edsger Dijkstra

不少明智的程序员警告我们不要使代码过于复杂。但很少有人能比荷兰计算机科学先驱 Edsger Dijkstra 更清楚地说明复杂性的成本。

这里的见解是:你不会选择简单作为送给未来的礼物。你不做因为您正在期待机会重用您的代码,或者因为您希望在代码评审时让它看起来更整洁,或者是因为您想使其更易于修改(尽管所有这些好处都是宝贵的!)。您这样做因为简单是一个先决条件。如果没有简单性,就永远不可能有可以信赖的可靠代码来开展业务或处理您的数据。

要接受Dijkstra的观点,我们需要重新定义“好代码”的含义。不是最短的代码。它不一定是最快的代码。绝对不是最聪明的代码。可以信任的代码。

相关引用

保持代码简单的最佳方法之一就是记住少即是多。Dijkstra 提供了一个可帮助我们牢记这一点的指标:

“如果我们希望计算代码行,则不应将它们视为‘产生的行’,而是看作‘花费的行’”。——Edsger Dijkstra

3. 关于可读性和重写

“读代码比写代码难”。——Joel Spolsky

乍一看,这个引用来自软件传奇和StackOverflow共同创建者Joel Spolsky似乎是正确的,但看似肤浅。是的,代码可能很密集,简短而又冗长。这不仅仅是别人的代码。如果您看一年前的工作,您可能需要一些时间来整理一下您曾经非常了解的逻辑。

但是Spolsky 的洞察力却有所不同。您无法阅读的代码的危险不仅仅是显而易见(很难对其进行更改和改进)。相反,更大的危险是复杂的代码似乎比实际情况更糟。其实,尝试了解别人已经写好的代码是如此之好,以至于您可能会被吸引犯 Spolsky所说的最严重的错误-决定从头开重写该代码始。

并不是说重写不能改善系统的体系结构。他们绝对可以。但这些改进付出了巨大的代价。他们重置测试和调试错误的时间固定,两项活动比单纯的编码要花更长的时间。重写很诱人因为它们是软件开发中最常见的偏见之一:我们低估了做概念上简单的事情的努力。这就是为什么最终的5%项目需要50%的时间。简单的事情可能会非常耗时!和解决您已经解决的问题相比似乎没有比这容易的了。

因此,如果您不应该重写所有内容以使其完美,那么有什么更好的解决方案?答案是让每个开发人员都参与恒定大小的重构。这个为您提供小的,连续的代码改进-真正有回报,并且风险很小。您可以在编码的过程中提高可读性。

相关引用

如果您仍然不确定可读性的重要性,Martin Fowler可以帮助您解决这一问题角度来看:

“任何人都可以编写计算机可以理解的代码。优秀的程序员写的代码人类都可以理解。”——Martin Fowler

换句话说,程序员的工作不仅是写代码,更在于做有意义的事情。

4. 关于重复

“不要重复自己。每一项知识必须有一个单一的,明确的,权威的系统中的表示形式。”——Andy Hunt and Dave Thomas

每个自重的程序员都知道重复是万恶之源。如果您在不同的地方写相同的东西,你在做额外的工作,测试和调试。更糟糕的是,您正在引入不一致-例如,如果代码的一部分已更新,而其他类似的代码没有同步更新。程序不一致使您的程序存在偏差,而您存在偏差的程序不再是可行的解决方案。

但是,重复代码并不是造成严重破坏的唯一地方。这个版本的著名的“请勿重复自己”(DRY)规则将无重复原则扩展为覆盖其他可能隐藏矛盾之处。我们不再谈论代码重复。我们也在谈论系统中的重复-系统具有代码知识的许多不同方式。它们包括:

  • 代码声明
  • 代码注释
  • 开发人员或客户文档
  • 数据模式(例如,数据库表)
  • 其他规范,例如测试计划,工作流程文档和构建规则

所有这些层都可以彼此重叠。而当他们这样做时,他们就有可能引入同一现实的不同版本。例如,如果文档描述一种工作方式,但应用程序遵循另一种方式?谁拥有真相?如果数据库表与代码中的数据模型不匹配怎么办?或者注释描述了算法的操作,与实际的实施方式不符?每个系统都需要一个单一的、权威的,其他一切都必须高度统一。

顺便说一下,竞争版本的真相不仅是小规模项目中的问题或设计不良的代码。最好的例子之一是随着XHTML和HTML5之间的斗争。一个阵营认为规范是官方事实,需要对浏览器进行更正以遵循它。另一派声称浏览器行为是事实上的标准,因为这就是当设计师们写网页时已经想到了。最后,浏览器版本的真相获胜。从这一点上来说,HTML5的浏览器就是这么做的 -包括快捷键,他们允许和他们接受的错误.

相关引用

代码和注释彼此矛盾的可能性引发了关于注释是否弊大于利的激烈辩论。极限编程的支持者公开怀疑:

“代码永远不会说谎;代码注释有时会。”——Ron Jeffries

5. 关于难题

“计算机只有两件事科学:缓存失效以及命名事物。”——Phil Karlton

乍一看,这句话似乎很有趣,但却是普通的编程笑话。听起来很困难的内容(缓存无效)与听起来很轻松(为事物命名)的事物可以立即关联。每一个程序员投入了数小时的工作来解决一个荒谬的琐碎问题,例如参数传递顺序错误或大小写不一致的变量(感谢JavaScript)。只要人类需要与机器合作完成任务,编程将成为高级系统规划和琐碎输入错误的混搭。

但是,如果您再看一看Phil Karlton的引用,还有更多需要解决的问题。命名事情并不难,因为程序员的生活经常因小小的头痛而毁了。这也是因为命名问题实际上是每个程序员最关心的重要工作:软件设计。换句话说,您如何编写清晰的代码,干净,一致吗?

有很多方法可以使命名错误。我们都看到过以变量命名的数据类型(myString,obj),缩写(用于产品目录的pc),一些琐碎的实现细节(swappable_name,formUserInput),甚至什么都没有(ret_value,tempArray)。容易陷入基于以下方式命名变量的陷阱您当时正在使用它做什么,而不是其中包含什么。布尔值是特别棘手的-当 progress 标记进度开始,表明您需要在用户界面中显示进度信息,或完全标记某些内容不同?

但是变量名仅仅是开始。命名类提出了如何将代码分成独立部分的问题。命名 public 成员将影响您的工作方式显示允许应用程序的一部分与另一部分交互的界面。锁定这些名称不仅描述了一段代码可以做什么,而且确定它将做什么。

相关引用

“计算机科学有两件事:缓存失效,事物命名和一对一错误。”——Leon Bambrick

结语

很高兴,你和我一样坚持看到了最后,是不是对自己编程过程中有很多想改变的地方呢?比如简单行,可读性,DRY原则,是不是让你铭记在心,还有最后说的缓存失效很难,命名很简单的错觉。

推荐阅读

面试字节跳动java岗被算法吊打,60天苦修这些笔记,侥幸收获offer

五一后:阿里春招总结,当初按这个准备面试,可能已经P7了

太狠了!京东T8架构师建议吃透这40W字消息队列文档,涨薪15K不是梦

RocketMQ全貌解析,阿里不愧是阿里

相关推荐

DNF无色流派还在继续,重力之泉龙战八荒测评

作者:礁石22222前言本篇为115级套装天天鉴栏目,来帮助各位读者对于新版本的装备有一个更清晰的认知。115级套装分为了稀有到太初5个品级,所有套装的稀有品级属性是一致的,从神器开始出现分歧。通过积...

《暗黑破坏神2重制版》常用符文之语P3

大家好我是游戏小白,继续补充一下《暗黑破坏神2重制版》常用的符文之语,主要给大家总结一下前期过渡常用符文之语。没看过之前关于符文之语总结的小伙伴可以翻翻前面的文章。1、钢铁符文之语钢铁造价极低但性价比...

魔兽怀旧服:P1一款法系BIS披风,获取方式隐蔽,需完成875个任务

在魔兽怀旧服WLK版本,依旧存在许多实用的制造业装备,特别是在P1阶段,制造业装备的耐用性和性价比是最高的,不仅可以帮助玩家快速过渡到团本,甚至还有个别制造业装备超越了团本掉落的强度,除了玩家近期讨论...

分手类型——过渡阶段

过度阶段一.内涵:类似于反复期,在这个阶段儿可能会出现两种可能性。1.感性想分手,但理性上舍不得。感性上我完全不想跟他相处,但理性上我又觉得他身上有很多对我有利的,对我未来有机会有利的东西。二.理性...

《最后的信仰》新手开局保姆级指南职业选择、属性加点与开荒策略

《最后的信仰》作为类魂动作游戏,开局选择直接影响开荒体验。本文针对新手玩家,从职业特性、属性分配到武器过渡,提炼高效开荒公式,助你避开陷阱,快速掌握战斗节奏。一、职业选择:斗士/盗贼优先,法系/...

DNF回血秘方揭示,夏日前买必看篇

作者:辽宁吴彦祖前言(省流速览)夏日礼包购买理由:夏日礼包是DNF四大礼包之一(新春&耕耘&夏日&金秋),错过销售日期后续想获得部分道具难度极大。主打暖暖时装、特色补齐、海量打...

DNF手游:55级粉装有大作用!强化继承大法,可节省大量幸运符

55级粉装的自身属性,实际上比较一般,但它可以用来作为“过渡胚子”,能够帮大家节省很多幸运符和宇宙精华!1、强化继承大法因为不断有玩家翻出了55级团本武器,这把武器肯定是当前版本毋庸置疑的版本答案,但...

魔兽世界50级职业任务装备如何选择,手把手教学

魔兽世界50级职业任务,我们装备应该如何选择,今天分身一个文章告诉你,我们知道BWL开放,也会开放50级的职业任务,那么50级的职业任务,对某些职业来说还是非常重要的,因为给的装备。有的甚至可以用到7...

暗牧的T5与散件如何取舍?认准自己的团队地位才最重要

牧师作为《魔兽世界》中的老牌职业历经许久已经收获了不少的信仰者,而在笔者看来牧师的最大特色便是风格完全不同的三系专精,在TBC时期,Raid本中的牧师大多为神牧,而戒律牧基本只活跃在竞技场和战场上,而...

DNF:魂异界传说宝珠曝光!属性设计一般般,男枪第五转职专属

魂异界地下城“炒冷饭”,定位新春活动副本,奖励道具覆盖面广,涉及白金徽章、转职书、矛盾材料等等。解锁魂异界次元等级,还能兑换传说宝珠,属性也逐渐浮出水面,却比较鸡肋,“抠门”发挥的淋漓尽致!太“抠门”...

SwiftUI入门五:让视图和过渡动起来

在使用SwiftUI的时候,无论效果在哪里,我们都可以单独的让视图的变化动起来,或者让视图的状态的变化动态化。SwiftUI会为我们处理那些组合的、层叠的以及可中断的动画的复杂性。在这个教程中,我们会...

DNF:又是变强的一年?2024耕耘礼包提升率揭晓

作者:assddde前言国服耕耘礼包的内容已经爆料了。对去年拉满耕耘的奶系职业的而言,今年的提升点为纹章加入了1%的增益量增幅。对C而言,今年换装称号中还加入了buff换装词条。而对于错过了新春套的C...

魔兽世界:TBC第一阶段还有必要刷T4套吗,D3套能否过渡到T5套?

T4套真的不如D3套?TBC怀旧服P1阶段目前已经走过大半,作为这个阶段装备等级最高的套装T4套装,游戏中有很大争议。比如猎人玩家会选择D3套,直接跳过T4到T5阶段,而法师甚至会选择继续使用T3套装...

《异世界勇者》390版本开荒&毕业攻略——狂暴战

虽然说这个版本是防战的本命版本,但是从大家催更的频率来看,狂暴战依旧是碾压的优势,今天给大家分享一下390版本狂暴战的毕业游玩思路,希望对你有帮助。今天给大家带来的是手动速刷版的攻略,想要挂机过本需要...

飞飞重逢:装备属性卡全攻略,五色神卡助你战力飙升快速获取

在游戏中,装备属性卡是提升战斗力的关键道具,它能赋予装备特殊的元素属性,不仅大幅提升攻击力,还能针对不同怪物打出克制伤害。属性卡分为火、水、风、土、电五种元素,每种都能为装备附加独特的攻击特效。那么如...