如何编写简洁代码?(上)

原创
开发
当你听一个说话啰里啰嗦的人讲话时,脑细胞会消耗更多,这种不愉快的消耗会引发本能脑的反抗。自然而然就降低了你专注倾听的欲望,请相信这不是你的问题,而是对你讲话的人要改进的方面。

作者:袁慎建

声明:本故事几乎属虚构,适合程序员和非程序员~

篇首语:「话语简洁,意图自携」说的是,干脆利索的表达更容易有效传达意图。当你听一个说话啰里啰嗦的人讲话时,脑细胞会消耗更多,这种不愉快的消耗会引发本能脑的反抗。自然而然就降低了你专注倾听的欲望,请相信这不是你的问题,而是对你讲话的人要改进的方面。

域冗余

“什么!我写的代码也会讲话?” 清扬惊讶地大声叫起来。

刚入职不到2个月的清扬特别热爱学习,每周五下午的学习时刻,她一定会缠着他的Buddy袁帅探讨整洁代码。

这不,俩已经到了公司年会现场并入座,还在探讨着。袁帅刚要说点什么,被主持人清脆悦耳的声音给打断了。

“尊敬的各位来宾和领导,欢迎来到思特沃克2019年会现场,我很开心也很荣幸能主持年会,首先请允许我代表大家邀请思特沃克全球CEO果总、思特沃克中国区总经理彰总... 思特沃克内训团队Head卓老师...”

袁帅皱起了眉毛,凑到旁边同事的耳旁:“主持人是哪位同事呀?”“不知道,没见过呢,好像听说今年从外面雇了一个职业主持人。”

“难怪...” 袁帅若有所思地端坐直,但还是眉头锁紧,这幅表情被清扬抓了个正着,调戏道:“人家主持人真是风光了得哟,上个月征集主持人你不报名,现在嫉妒了吧!”

“诶,你有没有觉得刚才主持人那段开场介绍有什么不对劲的地方?” 袁帅丝毫没有受到挑衅,故意挑起清扬的兴趣。经这么一问,本来没觉得有什么不正常的清扬警觉了起来,“嗯... 好像是有点不对劲,但说不上来。”

“如果主持人不是内部同事,”袁帅一句话刚挤出了半句,清扬就跟发现新大陆似的:“啊,我发现了!她在介绍人名时总是带上「思特沃克」这个前缀,外部职业的主持人,应该是习惯使然吧。”

“小鬼不错啊,这么机灵!”。

“现在有请思特沃克全球CEO果总上台发言,掌声有请!” 主持人好像听到了他俩谈话,再次用行动证实了清扬的发现。他俩也为CEO送去了陌生而熟悉的掌声,内敛的CEO仅用了1分钟就结束了自己的发言。

在掌声还未消散前,袁帅给清扬抛出了一个问题:“你要是主持人,你会怎么讲?” “废话,我肯定不会带上多余的「思特沃克」前缀,本来就是咱们公司内部的年会。”

“是的,咱们写代码的时候也很容易犯这样的小糊涂,来,我写几段给你看看。” 袁帅早有准备地从背包里抽出A4纸和铅笔手写了几段断码:

图片

清扬瞅了一会儿就开始说:“在「ParkingLot」这个域的限定下,「parkingCapability」这个属性中前缀parking就是一个「域冗余」,更简洁的命名可以是「capacity」。「parkCar」这个方法也存在域冗余,使用「park」命名就好。” 说罢,她从袁帅手里抢过铅笔改了一版:

图片

袁帅给清扬竖起了大拇指,这让清扬有点得意,她嘚瑟起来:“哼,这种冗余我在代码库见太多了!” 只见她娴熟的写了一个用于操作User对象的资源库类「UserRepository」:

图片

袁帅也很清楚冗余的地方,由于纸张写不下了,但他心里有明确的思路:“方法「queryUsers」、「queryUser」和「updateUser」中的User后缀属于「域冗余」,可以使用如下命名方式来区分”:

图片图片

清扬领会到袁帅的意思了,这次她秉着真心学习而非调侃的口吻问了袁帅:“这种冗余代码还真不少呢,但冗余有听起来很宽泛,有没有一个更合适的名字来向别人传递它呢。”

清扬的口吻让袁帅内心颇为感动,他很认真地思考了好一会儿才不紧不慢地讲:“「域冗余」。什么意思呢?域,泛指一个特定范围,比如常说的领域、区域中的域。在代码中,工程、模块、包、类、方法都是不同级别的域。模块处在工程的域中,包处在模块的域下,类处在包的域中,成员变量和成员方法处在类的域中。「域冗余」则是指在一个明确特定的域下,重复使用父级域的名称来做额外的修饰。”

清扬此刻对袁帅那种纯真不屑的眼神,此刻褪去了几分不屑,但依然纯真。

“有请内训团队Head卓老师上台为讲师们颁奖” 听到主持人的邀请,俩眼神不约而同相视后会心一笑,因为听出来主持人的这段话鬼使神差般地消除了域冗余「思特沃克」。

码尾禅

卓老师为台上可爱的讲师们颁奖合照之后就下去了,只见主持人让其中一名讲师留步聊聊这一年作为讲师的感想。也不知道主持人是不是故意的,把跟袁帅有过较多合作的技术大拿吴柳岩留了下来,让袁帅没想到的是柳岩这么一个不爱讲话的技术直男也在组织需要的时候挺身而出。

“额,那个我叫柳岩,额... 我来自国内华北交付团队,我是一名DEV,来Thoughtworks有7年多了。那个我平时一直在做交付,然后也特别感谢今年内训团队提供了一个不一样的机会,那个也让我有机会去尝试不一样的事情......”

看到袁帅眉头微微紧锁,清扬心里猜到他在想什么,“包大人,您是不是又发现什么猫腻啦?” 说完一副古怪精灵的眼睛直盯着袁帅,“小鬼少来!”袁帅顿时表情放松地笑了起来。

“口头禅这个东西,往好里说,它代表了一个人的特色,能够让人留下一些深刻可能奇怪的印象。还可以被当做思维缓冲器。”袁帅假装一本正经的开门见山了。

“往不好里说,有点多余,容易诱导听众注意力放在讲者的口头禅上了。” 清扬迅速接过话茬,直接把袁帅想说的下半句抢先讲出来。

“你看,咱们在各种正式和非正式的场合经常听到「然后、那么、那个、这个、额...」,要是非得给口头禅加个罪名也有点过了,大多数情况下它的存在对沟通带来的副作用也不大,只是如果没有这些下意识的习惯用语,会让整个表达显得更加精简流畅,提升听众体验和沟通的效果。”

清扬这次没有抢话,而是边听边开始在第二张A4纸上写起了代码,不一会儿抬起头来略微得意道:“代码的表达也存在这种现象,有些人总在业务概念命名后加个「Info」或者「Data」后缀,比如「ContactInfo,PolicyInfo,PersonData」,这种加在代码末尾的我称之为「码尾禅」。同理,类似加在命名之前的前缀也属于这种,加在前面的码头禅相对少见。”

清扬的一番言论让袁帅自豪感油然而生,颇有名师出高徒的味道,也不知道是酒过一巡还是自豪感使然,他有点飘飘然,伸手拿来清扬刚才写的代码手稿,看得入迷:

图片

“砰!” 清扬手持高脚杯有意加大了力度碰在袁帅的杯子上,袁帅这才从发呆状回过神来,继续在酒过N巡的道路上前行着。

层错综

“我觉得内训师要扮演好三个角色,首先,内训师应该是一名知识沉淀者,其次,内训师应该扛起文化传播的旗帜,做一名文化传播者,最后,内训师要充当组织润滑剂,也就是高效协调者。

作为知识沉淀者,内训师除了自身的专业业务知识的积累,还应该根据组织的发展需要,提取业务部门的知识和经验,并将其沉淀成方法论和框架体系,让组织的知识和经验得到高效复制和传播,助力员工知识储备和技能成长。

作为文化传播者,内训师面对的是企业中的新、老员工,你的一举一动,一言一行都在向员工传递着某种内在的文化信息。你的认知理念是否符合企业文化,你的言行举止是否符合企业文化,这都将很大程度影响被你培训过的学员,所以你得深刻理解企业文化,并身体力行,以身作则。

作为组织润滑剂,你要帮助多个不同的业务部门去做人员培养,在业务部门和职能部门之间,你需要优先根据组织发展的需要,去协调优势资源,解决高优先级业务部门的问题,同时也要兼顾其他部门的发展需要,做好资源协调和冲突协调。”

袁帅虽然刚加入内训不久,卓老师的这番激情言论让他心潮澎湃,他很认同这三个角色的比喻,也暗自许诺要在内训好好干出点成绩。

除了文字中的精神,袁帅也赞叹其结构如此清晰,逻辑顺序非常自然,一开始道明3个角色,然后逐个角色深入介绍,一个简单的先总后分结构彰显出来。

此时,他有点潸然泪下,因为想起了自己刚毕业那会儿,去找别人时,讲话结构混乱,东一句西一句的,讲了一两分钟别人都听不懂他要表达什么。后来在Thoughworks,经过很多同事直言不讳地反馈,袁帅逐渐克服了这个问题。久病成良医加上薄弱的举一反三能力,袁帅把这个道理运用在写代码上了。

恰巧清扬最近在读《金字塔原理》,袁帅想考一考她,当然不是沟通表达,而是代码。他拿起手机找到之前拍的一张代码照片递给清扬:“嘿,最近《金字塔原理》咋样了,刚听了大姐大的发言,你有什么新发现吗?”

清扬兴奋地接受了挑战,不过让她不解的是,明明在说《金字塔原理》和表达,但给她的却是一片代码:

图片

“意图导向编程!” 没想到清扬这么快就说出了关键词。

“可以啊,你也看过《敏捷技能修炼:敏捷软件开发与设计的最佳实践》这本书?” 袁帅故作惊讶。

“何止看过,当时就是这个意图导向编程让我一知半解,正好今儿你帮我解解惑。”

听到清扬的请教,酒过三巡的袁帅这次假装正经地关切道:“哦,哪里不懂呀?”

“作者说这样写代码叫意图导向编程,难道我从一开始一行一行的写这些细节过程,不是按照我的意图吗?”

“确实,你要写的代码和你要说的话都是你意图想表达的内容,要说你一行一行的写不合符意图导向有点冤枉,我谈谈我的理解哈。” 袁帅喝了口水杯中的热水,往清扬靠近了一些:“如果我讲话一上来长篇大论各种细节,你听了会有什么感受?”

“烦躁!” 清扬不假思索地蹦出两字。

“那读这样的代码的呢?” 袁帅趁势追击。

“一样啊,心里还会吐槽这是哪个二货写的!” 清扬呆萌的表情把袁帅逗笑了,因为他想到了清扬打开Git提交记录看到提交者是她自己的画面。

“对的,你可能需要花很多精力和注意力去了解这些代码的意图,而且也容易看了后面忘了前面,迷失在细节里。那如果我把这大段代码做一层抽象提炼,提炼成三个功能步骤,每个步骤给它一个贴切的名字,你感觉会怎么样?”

“我就很方便就明白作者意图了,而且不容易迷路。”清扬反应很敏捷。

“是呀,这样你就很快获知作者的整体意图,就可以大大节省你的时间,当你需要了解细节的时候,再进入到某个步骤。”

“所以说,意图导向是提倡用更高效的方式表达代码意图咯!” 清扬若有所悟地补充道。

“基本上说对了,要做到高效,就要优先传达更高抽象层次的意图,而且同一个地方抽象层次应当保持在一个层级上,然后逐层往下,越往下就会越具体,也就是越细节。”

“难怪,有些人一开口,听众如沐春风(意图明朗,结构清晰),有的人一开口,听众痛不欲生(陷入细节,苦苦挣扎)。而介于这之间的一开口,听众会不知所措(层次结构交叉混乱)。” 清扬很得意自己的总结,顺手举杯跟袁帅碰了一下,但她没注意到袁帅此时愧疚地低下头,他有点内疚当年刚毕业的自己给别人带来了不少困扰。

“作者也提到这种方式仅仅是思考方式和编码顺序不同。但作者说这个基本不会增加工作量,可怎么觉得我用这种方式的时候就很花时间呢?” 清扬有点像在自言自语。

“意图导向编程得结合结构化思考和呈现,方才让代码讲得一席受欢迎的话”

“编程高手不是能够快速写出可用代码的人,而是能够快速写出别人一眼就能看懂的代码的人(整洁可用)”

“编程高手更多比拼的是底层胜任力,如何分解问题,如何抽象提炼,这些都不是一朝一夕能练成的”

“编程是艺术表演,不是打字游戏”

在一连串地感慨后,袁帅觉得自己喝的不是酒,而是思想。此刻,酒过四巡的袁帅已然无力思考,望着台上的节目表演,思绪不知去向。

“幸运奖二等奖,袁帅!” 主持人话音刚落,清扬尖叫着跳起来,把思绪飘飞的袁帅惊醒,然后一股力量“托”着他飘到领奖台。

今年年会,他不再因奖品感到寂寞......

责任编辑:赵宁宁 来源: Thoughtworks洞见
相关推荐

2022-12-15 10:52:26

代码开发

2021-04-25 11:31:45

React代码整洁代码的实践

2024-01-30 08:54:05

JavaScript技巧代码

2020-08-06 16:34:48

Python开发工具

2020-05-11 15:23:58

CQRS代码命令

2022-08-28 19:03:18

JavaScript编程语言开发

2020-10-04 13:15:37

代码技术开发

2022-05-10 10:28:21

JavaScript代码

2021-06-08 09:35:11

Cleaner ReaReact开发React代码

2015-01-28 14:30:31

android代码

2012-03-15 13:36:51

云计算JavaSpring框架

2010-02-05 16:49:05

编写Android 代

2012-07-11 10:51:37

编程

2016-02-24 16:03:34

代码质量编写函数

2022-06-07 09:30:35

JavaScript变量名参数

2010-02-03 13:55:51

Python 代码

2021-03-17 08:00:59

JS语言Javascript

2010-03-12 11:07:49

Python retu

2016-02-23 11:03:03

代码质量编写函数

2022-02-17 16:44:19

函数Go 语言高阶函数
点赞
收藏

51CTO技术栈公众号