越“聪明”的代码,越是“一次性” 全球播资讯
大多数程序员,面对复杂问题却能写出精简代码时,总会觉得颇有成就感。但本文作者指出:看似越精简的“聪明”代码,其可读性越低,越是得不偿失。
原文链接:https://www.joshwcomeau.com/career/clever-code-considered-harmful/
(相关资料图)
作者 | Josh Comeau
译者 | 弯月 责编| 郑丽媛
出品 | CSDN(ID:CSDNnews)
不可否认,遇到难题能想到巧妙的解决方案会让人很有成就感。例如,挑战自己使用递归而不是迭代,或者创建优雅的级联抽象层以确保代码永远不会重复,你一定会感到很高兴。
对于这类编程,我最喜欢的一个资源是Project Euler(地址:https://projecteuler.net/)。
Project Euler 是一个基于高等数学的挑战库,旨在通过软件解决问题,要求程序在 2004 年左右的硬件上运行时间不超过 1 分钟。这意味着,你不能靠蛮力解决问题,必须想出一个更聪明的解决方案。
下面是一个例子:
问题 58:螺旋质数
从 1 开始,按如下方式逆时针旋转,形成一个边长为 7 的正方形螺旋。
有趣的是,奇数的平方数都位于右下对角线;更有趣的是,位于两条对角线上的 13 个数字中有 8 个是质数,总体占比为:8/13=62%。
如果在上面的螺旋之上再加一层,就会形成一个边长为 9 的正方形螺旋。如果继续这个过程,那么当正方形螺线的边长为多少时,两条对角线上的质数百分比将首次低于 10%?
解决这个问题后,你还可以查看其他人共享的解决方案。你会感到很惊讶:哇!居然有人能想出如此简洁、如此聪明的解决方案?!
下面就是一个用户使用 Haskell 编写的解决方法:pe58 = nwherea p q = scanl (+) p $ iterate (+ 8) q b = [[x,y,z] | (x,(y,z)) <- zip(a 310) $ zip(a 512) (a 714)] c= zip(scanl1 (+) . map(length . filterisPrime) $ b) (iterate (+ 4) 5) [(n, _)] = take 1$ dropWhile (\( _,(a,b)) ->10*a >b) $ zip[ 3, 5..] c
下面是一个用户使用 J 语言编写的代码:gt; :-:>:1i.~ 0. 1>}.(>:i.$n)%~+ /\n=. isprime +/\ 1, 4#2*>:i.14000
显然,用如此少的代码解决如此困难的问题需要大量技巧。如果我能够写出这样的解决方案,我会为自己感到高兴,但我的解决方案总是又长又不优雅。
不过,日常工作中一般不会出现这样的代码——这些代码只是为了娱乐,编写这样的代码多数 是为了凸显自己的聪明、吓唬其他人或锻炼大脑。
上述这类问题的代码,你永远也不会阅读第二次,因为它们都是一次性的,我们也不会交给其他人来维护,这与我们日常编写代码的环境不同。
实习生测试
在谈论日常编写的代码时,我会按照下面这个标准来要求:初级开发人员、或者说刚开始职业生涯的人,是否能够理解这段代码?
所以对于共享的代码库而言,好代码就是简单的代码,不需要任何花里胡哨,便于向新手解释基本概念的代码。
例如几年前,我曾接到一个任务,是审查包含以下函数的拉取请求:constextractDataFromResponse = ( response) =>{ const[Component, props] = response; constresultsEntries = Object.entries({ Component, props }); constassignIfValueTruthy = ( o, [k, v]) =>(v ? { ...o, [k]: v }: o);returnresultsEntries.reduce(assignIfValueTruthy, {}); }
我给出的建议是,按照下面这样重写:constextractDataFromResponse = ( response) =>{ const[Component, props] = response; constoutput = {}; if(Component) { output.Component = Component;}if(props) { output.props = props;}returnoutput; }
平心而论,原始版本确实有很多优点:
▶ 代码量更少(只有 4 个语句,而第二个版本中有 7 个语句);
▶ 没有重复(在第二个版本中,两个 if 语句的作用基本相同);
▶ 没有修改任何变量;
▶ 更具可扩展性:重写后可轻松处理 10 个字段,而不止 2 个。
但是,原始版本更难理解——我不得不浪费大量脑细胞来理解这些代码究竟在干什么,对于许多初级开发人员而言,应该也无法很好地理解。
在我看来,函数式版本的可读性成本太高了,得不偿失。
为什么可读性如此重要?
为了说明我认为可读性是好代码的一个重要属性,下面我们来看看流行的开源库 lodash。
lodash 是一个非常流行的库,每周仅通过 NPM 的下载量就超过 2600 万次,Github 上的 Star 数更是超过了 4.2 万个。然而,有一个很奇怪的地方是:这个库未解决的问题始终不会超过 10 个。
尽管我们一直都提倡 Inbox Zero(收件箱归零),但热门项目的 问题永远不会归零。但 lodash 的未解决问题经常为零,并且多年来一直如此。
有个主要原因可能是主作者 John-David Dalton 是一位热情的维护者,他花费了大量时间对问题进行分类。但我觉得,无论是任何人,就算是超人,都无法做到让如此热门的一个库的问题数归零——直到在多年前,我在播客上听到 John-David Dalton谈论管理这类项目的关键是,如何鼓励很多人为代码库做贡献。
他的方法之一是将代码保持在非常基础的水平,使用简单、基本的结构,确保贡献者无论经验深浅都能理解代码并为其做出贡献。我记得,John-David Dalton 提到他们更喜欢 if/else,而不是三元运算符,因为很少有人有使用三元运算符的经验。换句话来说,如果你的目标是保持代码简单易懂,那么用三元运算符的表达方式就是有害的。
如果你正在构建开源工具,那么记住这一点很重要;如果你正在与其他人一起开发生产代码库,那么这一点就尤为重要,特别是当队友的经验不如你时。
bug数与代码长度
你听过下面这句话吗?
“更少的代码意味着更少的错误隐藏空间。”
这句话的意思是,代码要越短越好,因为这样更容易发现错误,而每多敲一个字符,都会增加出错的可能性。
对于拼写错误这类的 bug,上述论点固然没错,但拼写错误往往很容易被发现和修复。真正麻烦的 bug 是由代码过于复杂而引发的,开发人员遇到这类 bug 就好像拿到烫手山芋,恨不得立即甩锅给别人。
在调试问题时,你必须全神贯注,仔细理解每一行代码。当你创建一个抽象来减少重复(所谓“DRY 原则”,Don"t Repeat Yourself,不要重复你自己)时,无形中就添加了一个间接层,理解起来也就多了一重障碍。思维模型越难解释每一个边缘情况和可能的状态,就越难诊断出问题的关键所在。
“每个人都知道调试比写程序要难一倍。所以,如果你在编写代码时机关算尽,那么将来要如何调试呢?”
—— Brian Kernighan,《The Elements of Programming Style》
抽象的成本
如果目标是降低复杂性,而抽象增加了复杂性,那么我们是否应该完全废除抽象呢?并不是。因为抽象无处不在:循环是抽象,函数是抽象,编程语言本身就是对机器代码的抽象,而机器代码本身则是晶体管的抽象。
所以说,一切都是抽象。关键在于,我们需要权衡抽象的成本与收益。
假设我们正在构建一个 React 应用,我们有一个列表,其中包含 100 个需要渲染的东西。我们可以选择复制/粘贴同一个 JSX 100 次,也可以将其映射到一个数组,这样只需编写一次 JSX。在这种情况下,“复杂”的解决方案是完全值得的,因为底层的复杂性众所周知,而替代方案维护起来会很麻烦。
在构建产品时,我们总是需要做出这样的权衡决定。我个人的看法是,我们在权衡利弊时应该考虑年轻队友,想一想我们为他们增加了多少复杂性?这样值得吗?
不可避免的复杂性
有时,有些代码本身就很复杂,因为现实世界就很复杂,我们的软件必须对其建模。我们无法确保总是能写出初级工程师可以轻松解析和贡献的代码。有时是因为业务逻辑真的很棘手,有时是因为我们不得不使用理解起来有难度的 API 等等。
我认为,一个最好的解决这类问题的方法是尝试隔离复杂性。在简单与复杂之间设置清晰的界限。不要让复杂性渗透到周围区域。
John-David Dalton 在 lodash 中做到了这一点。他在播客采访中表示,绝大多数 lodash 代码都简单易懂,他们将复杂的部分集中到了一起,组成核心代码,用于处理难题。这意味着,大多数贡献者不必在意这些复杂的代码,因为这种复杂性不会散布到整个应用中。
如果你的应用架构合理,复杂的问题都集中在一个地方处理,那么应用的绝大部分代码都可以保持简单。如果初级工程师需要处理那个复杂的核心,该怎么办?那么就只能找一个更资深的人来指导他们完成了。
冒名顶替综合症
去年的 React Rally 上,Chantastic 发表了一篇我最喜欢的演讲,题目是“Hot Garbage; Clean Code is Dead”。我的收获之一是明白每个人都患有冒名顶替综合症,我们总是会想尽办法证明自己,如果我编写了一个超级聪明且难以理解的函数,同事就会觉得我很聪明。
然而,我逐渐意识到,任何人都可以编写看似复杂的代码,而最难的部分实际上是用简单的代码来解决复杂的问题。如果你真的掌握了这种本领,没有人会质疑你的能力。
▶ GitHub 前 CTO 再创业,起步便获 2600 万美元投资,唯一竞争对手只有 OpenAI!
▶ 资深开发者眼中的开源云原生数仓 ByConity
▶ 资料下载丨一图看懂Serverless架构的资源平衡管理 返回搜狐,查看更多
责任编辑:
标签:
推荐
-
环球热议:郭明錤:苹果 MR 头戴设备成功关键因素在于能否与 AI、AIGC 高度整合 投资人更关注何时推出类 ChatGPT 服务
苹果WWDC23全球开发者大会将于6日正式登场,苹果首款混合现实头戴设备
来源:
财富更多》
-
人民币兑美元中间价报7.0904 调升35个基点 热头条
人民币兑美元中间价报7 0904调升35个基...
-
北交所、全国股转公司出台“十八条”优化市场服务—— 强化资本市场对中小企业创新发展|环球快资讯
北交所、全国股转公司出台“十八条”优...
-
【走进区域看发展】生态“双城” 新颜新貌-今日报
【走进区域看发展】生态“双城”新颜新...
-
科技创新推动模式变革 行业加速探索未来新水务 当前速讯
科技创新推动模式变革行业加速探索未来...
-
焦点观察:“东数西算”须统筹存力
“东数西算”须统筹存力---技术人员对中...
动态更多》
热点
- realme10系列正式宣布 采用双曲面屏正面顶部居中挖孔
- 五菱全新微型电动车内饰官图发布 座椅采用星际形打孔工艺
- 努比亚Z40星空典藏版正式开售 采用微米级油画笔触纹理技术
- iQOO11系列正式官宣 首批搭载骁龙8Gen2机型之一
- 海信34英寸带鱼屏显示器发布 支持165Hz刷新率
- OPPO明年将商用240W超级闪充 新一代电芯支持更高倍率充电
- 第一款Android手机渲染图曝光 横向滑盖设计和全尺寸键盘
- 吉利首款纯电皮卡11月9日上市 车辆续航里程超过610公里
- 努比亚Z40SPro星空典藏版正式公布 堪称窄边框天花板
- vivo无线运动耳机2今日正式上市 首销只要119元
- 阿里云部分云服务器价格将下调
- 环球热议:中物联:5月份我国大宗商品供应持续增加
- 全球观点:科创50ETF期权今日上市,标的ETF规模超650亿元
- 暑期高考生学车注意事项|世界热文
- 世界观点:注意!学生购票有变化
- 承压、韧性、破局 阿里影业(1060.HK)2023财年业绩深度解读
- 索尼CEO:云游戏存在延迟、服务器浪费等障碍 环球微资讯
- 科技创新推动模式变革 行业加速探索未来新水务 当前速讯
- 腾势汽车成为首个MPV单月冠军的中国豪华品牌
- 观热点:12306开通学生优惠资质在线核验
- 6月5日生意社R134a基准价为25166.67元/吨 环球播资讯
- 总投资52亿!江苏如东可再生氢基地暨光氢储一体化项目签约
- 百姓看联播 | 河北:“农机医生”出诊忙_今日讯
- 全球播报:百度地图宣布接入文心交通大模型Beta版能力
- 英伟达推出新AI模型 可将视频转换为高精3D模型
- 华为将发布直接对标 ChatGPT 的「盘古 Chat」多模态千亿级大模型
- 焦点报道:史上最“卷”618来了,消费者买单吗?
- 世界热消息:入职切莫轻信“高薪保底”
- 车企竞逐插电式混合动力市场_全球百事通
- 新疆昌吉布局现代化产业体系
- 焦点观察:“东数西算”须统筹存力
- 世界热议:广西壮族自治区桂林市委政法委:以高效能治理保障高质量发展|全国党委政法委系统“新时代政法楷模”
- 辽宁鞍山探索菱镁产业绿色发展路径——“力气活”变“技术活”
- 速递!交通100《淄博好医生》——膝关节骨性关节炎的阶梯治疗
- 二十四小时快报:新加坡2022年通胀率6.1%,显著高于前年
- 今天最新消息 福建霞浦7月7日确诊病例、无症状感染者轨迹公布
- 房子涂什么颜色(家装油漆什么颜色好看?)_全球热闻
- 东风披晨霞 天际迎归舟——神舟十五号载人飞行任务全记录
- 中兴AX3000满血路由器BUG价:仅需199元
- 天天播报:10年前的显卡都流畅 《暗黑4》被曝移植苹果平台:iPad也能玩
- 环球快播:万家基金高源:在周期上行中赚安心钱 看好大消费等领域
- 燃气灶点火针位置不对 燃气灶探热针位置不正确怎么调整 当前快报
- 全球微头条丨如何增加高新技术产业增加值_高新技术产品增加值
- 世界球精选!女子11万买收割机 帮父母收麦子 具体是什么情况?
- 快资讯:党旗国旗摆放正确位置图片(党旗国旗摆放正确位置)
- 【天眼电台·晚安曲(1000)】今夜,让我们细数这1000个感动的瞬间
- 尼康Z 8力压索尼α7 Ⅳ!最新数码相机销量排行榜出炉
- 打印机清洗喷头步骤(打印机清洗喷头) 今日热议
- x61装win7还是装win10(x61)
- 高升本是什么意思-高升本
- 【全球聚看点】2连板天地在线:目前公司虚拟数字业务仍处于发展初期阶段
- 焦点资讯:李幼斌妻子 前妻_李幼斌原配妻子
- 全球微动态丨2015年国债利率表_最新国债利率表2021
- 【当前独家】少年风采为题目中考满分作文600字_少年风采作文600字
- 环球视点!杨蓉又续约了于正,失角《凤囚凰》真相了!
- 一首醉人的歌原唱歌词简谱 一首醉人的歌简谱歌谱 每日热文
- 中国邮政邮发代号查询(国内邮发代号查询)_当前热议
- 手心输入法怎么用软键盘_手心输入法怎么手写 天天讯息
- 国产动画片排行榜前十名的_国产动画片排行榜前十名
- 消息!2023朝阳区青少年棒垒球锦标赛开幕
- 永修县气象台发布雷电黄色预警信号【III级/较重】【2023-06-04】
- 【环球报资讯】Reno10 Pro+影像体验:旗舰水准 大哥技术光速下放
- 美国债务上限危机暂缓 但更多危机正在靠近!
- 比亚迪王朝车型5月销量125515辆
- 佞妆_佞
- 十指春风 绣画古今 “内画”与“鲁绣”在一“丝”一“毫”间皆有文章 环球快播报
- 三年级英语手抄报内容资料大全_三年级英语手抄报内容资料|今日快看
- 林枫理财:周一开盘实时指导及精准策略
- 刺激战场怎样练反应和手速(刺激战场射击技巧) 环球看点
- 世界热议:常用的商品包装材料有哪些及其特性
- 消息!倾城之恋灵希番外(倾城之恋 灵希)
- 厦门二手车交易市场在哪里?(厦门二手交易市场)
- 高青:城园合一品质提升 打造精致全域公园 实时
- 全球即时看!帮助患者重获美丽,这一公益计划在湖北随州启动
- 重点聚焦!风景素描铅笔画图片(画30幅铅笔画 求简单又好看)
- 神十五返回地球 | 回家真好!|环球消息
- 练就“火眼金睛”,做网络谣言“终结者”!-全球看热讯
- 天天热推荐:2023年安徽阜阳阜南县中考考点安排
- 【关注】晋城2土地成交!楼面价约2307元/㎡、2325元/㎡!
- 淄博:打造绿色能源完整产业链 汇聚转型升级绿动能 全球热点评
- 环球看热讯:一图回顾神十五乘组186天“太空出差”!
- 世界信息:签字可以作为证据吗
- 世界短讯!这类基金成5月新发主力!整体规模最大已缩水四成,产品跟进创新需谨慎
- 焦点速递!权威发布丨淄博:聚力在推动文化繁荣发展上“提效争先”
- 平安抵京!重大突破!“太空出差”半年,神十五乘组完成多个“首次”
- 【新视野】华润微:目前公司IGBT产品已进入比亚迪、长城、吉利等车企
- 曾因比萨创意获软银近4亿美元投资的Zume被曝停运
- 中国铁塔董事长张志勇:公司新建站址共享率已经提高到83%
- 华润微:目前公司IGBT产品已进入比亚迪、长城、吉利等车企
- 中际旭创:向海外重点客户持续交付与GPU相配套的800G产品|天天精选
- 每经品牌100指数引领反弹,AIGC开启互联网新时代
- 环球热推荐:辽宁新增12例本土无症状_5月31日丹东疫情最新消息情况
- 上联交流娱乐微信融入生活下联_怎么区分上联和下联 每日焦点
- 拜登签了!但更多危机正在靠近_世界独家
- steam公开库存的方法
- 环球热议:大量安卓用户逃离换iPhone:Android 13保有量不足15%
- 环球热讯:更生(关于更生介绍)
- 张千载高谊文言文翻译及注释(张千载高谊)-天天热闻
- 环球热推荐:初三中考如何快速提分(中考如何快速提分)
- 天天微动态丨正在孙科别墅亮相的展览《未来幻想》,很“未来”!
- 世界报道:男子结婚4战友随2厚本刮刮乐具体详细内容是什么
- 欢迎回家!澳门少年献唱《看见》 祝贺神十五凯旋
- 华为版ChatGPT将于7月初发布,名为“盘古Chat" 当前关注
- 德玛出装最牛顺序图片_德玛出装最牛顺序-焦点速讯
- 新商联盟订烟登录手机版下载官网(新商联盟订烟登录) 当前速看
- 天天日报丨新研究:高脂高糖饮食可能损害睡眠质量
- 安徽退休中人养老金何时补发?2023安徽退休养老金调整方案何时出?_今日看点
- 焦点播报:adobe creative cloud_creative colour
- 环球观察:C919首次商飞圆满完成,如何载起“航空梦”?
- 谷歌MAPS在导航功能中添加了新的车辆图标 全球今亮点
- 环球看点!扎克伯格“截胡”苹果,但好像没什么用
- 天天信息:国防部长:请各国管好自家军舰飞机是什么情况
- 联邦米尼重磅推出一体化全案服务,以12大主题满足年轻空间多样性|全球微头条
- 观点:明珠三国(明珠三国)
- 足球报:海港未来将面对更严峻挑战,核心外援去留7月有结论|今热点
- 艾尔顿·约翰 英国乐坛常青树&曼城粉丝足总杯后与...
- 即时焦点:杭州亚运会绿电交易总电量达6.21亿千瓦时
- 我国攻克建造大型邮轮核心技术 形成一系列科技创新成果
- 罚没收入是一般公共预算收入吗_罚没
- 清波荡漾的意思是什么_清波荡漾的意思
- 冰火两重天:美日7大芯片设备厂商业绩下滑,国产厂商则大涨 环球焦点
- 尹力到怀柔区调研,要求聚力建设百年科学城,努力打造世界级原始创新承载区-头条
- 日本为何错失数字经济? 天天信息
- 当前视点!天津推出“扶风起飞”计划,培养复合型青年戏剧人才
- 全球看点:“英雄马”来了!2023南昌马拉松定于11月12日鸣枪起跑
- 通用非即插即用监视器是什么意思_通用非即插即用监视器
- 书铭的意思是什么_署名的意思_全球短讯
- 小米/Redmi这款手机力压苹果旗舰 成为618最热手机!
- 梅西巴黎告别战被嘘,巴黎主帅:他是历史最佳球员
- 天天即时:中药赛道热度突然升高!这些老字号要“翻红”了?286家机构调研呼吸机龙头,重点关注人事变动
- 巨明机械:打造“产品一流”的国家重点 农机装备制造企业
- 比亚迪成为以色列今年前五个月最畅销电动汽车品牌
- 赵庆文率队赴香港 澳门开展双招双引活动
- 扎实推进重点任务 聚力推动文化繁荣发展
- i knew you were trouble_i know you were trouble歌词