当前位置: 首页 > 科技观察

如何编写干净的代码?(上篇)

时间:2023-03-16 17:30:53 科技观察

作者:原深剑声明:本故事近乎虚构,适合程序员和非程序员~开头一句:“言辞凝练,意在自成一体”的意思是更容易以明快的表达有效传达意图。当你听一个啰嗦的人时,你的脑细胞会消耗更多,而这种不愉快的消耗会引发大脑本能的反抗。这自然会降低您倾听的欲望,并相信这不是您的问题,而是与您交谈的人需要改进的地方。DomainRedundancy“什么!我写的代码也会说话?”青阳惊呼一声。刚入职不到2个月的杨青非常热爱学习。每周五下午的自习时间,她都会缠着他的哥们袁帅讨论整洁的代码。这不,两人已经到了公司的年会,坐下来,还在商量。袁帅刚要说什么,就被主持人清脆悦耳的声音打断了。》尊敬的各位来宾、各位领导,欢迎来到Sitework2019年会现场,很高兴也很荣幸能够主持本次年会。首先,请允许我代表大家请来全球CEO郭总Sitework的,还有Sitework中国区总经理张……卓老师,Sitework内部培训组组长……”袁帅眉头一皱,凑到旁边同事的耳边:“宿主是哪位同事?““不知道,没见过,好像听说今年从外面请来了专业的主持人。”“难怪……”袁帅若有所思地坐直了身体,眉头却依旧皱着,这表情被清扬捕捉到,调侃道:“宿主真漂亮,你上次没有报名参加征集活动。月儿,你现在吃醋了!”“喂,你觉得刚才宿主的开场白有什么问题吗?”袁帅一点也不挑衅,故意挑起青扬的兴趣。问完这个问题,原本还没有觉得有什么异常的青扬警惕了起来,“嗯……好像有什么地方不对,但又说不出来。”“如果宿主不是内部同事,”袁帅刚挤出一句话,半句话后,清扬仿佛发现了一个新世界:“啊,我找到了!她总是用‘StayWalker’这个前缀介绍人名,应该是外聘专业主持人的习惯吧。”“小鬼不坏,好机灵!”。“现在,请Seetwork全球CEO郭先生上台发言,欢迎掌声!”主持人仿佛听到了他们的对话,再次用行动证实了程扬的发现。他们也给了CEO陌生而又熟悉的掌声,内敛的CEO只用了一分钟就结束了演讲。掌声还没有散去,袁帅就问清扬一个问题:“如果你是主持人,你会怎么说?”“废话,我绝对不会带《StayWalker》这个多余的前缀。本来就是年会在我们公司内部。”“是的,我们写代码的时候很容易搞出这么一点点混乱,来,我写几段给大家看看。”袁帅从背包里拿出A4纸和铅笔,准备写了几段断码:青阳看了一会,开始说道:“在“ParkingLot”这个字段的限制下,属性“parkingCapability”以parking为前缀是一种“域冗余”,更简洁的名字可以是“capacity”。“parkCar”方法也有域冗余,只需使用“park”作为名称即可。说完,她从袁帅手中抢过铅笔,修改了一下:袁帅对着青扬竖起了大拇指,青扬有些得意,尖叫起来,“哼,这种多余的事情,我可没把握。””代码库太多了!”我看到她熟练地写了一个资源库类“UserRepository”用于操作User对象:袁帅也很清楚冗余,因为论文写不出来,但他心里有一个清晰的想法:”method"queryUsers"中的User后缀,"queryUser"和"updateUser"属于"domainredundancy",可以通过下面的命名方式来区分":清扬明白袁帅的意思,这次她是用诚意学习而不是用心学习开玩笑地问袁帅:“这种冗余代码有不少,但冗余听起来很广泛,有没有更合适的名字传给别人?”青阳的语气触动了袁帅的心,他认真的想了想,不紧不慢的道:“《域冗余》。这意味着什么?域一般是指一个特定的范围,比如一个域或者一个地区的域。在代码中,项目、模块、包、类和方法都是不同层次的域。模块在项目域,包在模块域,类在包域,成员变量和成员方法在类域。“域名冗余”是指重复使用特定域名下的父域名进行额外的修饰。”青阳此刻对袁帅那份天真不屑的眼神褪去了几分,但依旧是天真无邪。”我请来了内训组长卓老师上台为讲师们颁奖”听到宿主的邀请,两人的目光不约而同地对视了一眼,会意地笑了笑,因为他们听到宿主的话,已经如鬼魅般消除了域冗余“StayWalker”。马尾婵卓颁奖后,给台上可爱的讲师们合影,他就下去了。主持人让其中一位讲师留下来,说说他这一年当讲师的感受,不知道是不是主持人故意的,把吴柳燕留了下来和袁帅合作过多次的技术达人,让袁帅没想到的是,柳岩这种不爱说话的技术直男,也是需要组织的,该站出来了.“呃,我叫柳岩,呃……我是dom的estic华北区交付团队,我是一名DEV,在Thoughtworks工作了7年多。我一直都在做外送,特别感谢内训团队今年提供了一个不一样的机会,也让我有机会去尝试不一样的东西……”见袁帅微蹙眉头,清杨开猜到他在想什么,“包少爷,您是不是又发现了什么猫腻?”说完,他用诡异的精灵眼盯着袁帅,“小鬼,别来了!“一句咒语,充其量代表一个人的特点,能给人留下一些深刻或陌生的印象,也可以作为思想缓冲。”袁帅故作严肃,开门见山。”说的不好,有点多余,容易诱导听众把注意力集中在说话人的口头禅上。青扬连忙接管,直接把袁帅想说的后半句说了出来”你看,我们经常听到“then,then,that,this,uh...”,在口头禅中加上罪过就太过分了。在大多数情况下,它的存在对交流的副作用很小,但没有这些潜意识的成语,整个表达会显得更加精简流畅,提升观众体验和传播效果。”程扬这次没有急着说,而是一边开始一边在第二张A4纸上写代码听了,片刻后抬起头,有些得意地说:“这种现象也存在于代码的表达中。在业务概念名称后加上“Info”或“Data”后缀,例如“ContactInfo,PolicyInfo,PersonData”,我在代码末尾添加的,我称之为“码尾禅”。同理,s命名前加的类似前缀也属于此类,前面加的dockZen比较少见。”青阳这番话,让袁帅心中一凛,颇有名师高徒的味道,也不知道是酒气的缘故,还是得意的缘故,他有些心慌,伸手去拿清扬刚刚写好的代码手稿,出神:“砰!”清扬端着酒杯,故意用更大的力气撞向袁帅的杯子,袁帅回过神来,继续走在喝N游的路上,层层叠叠”我觉得内训师应该扮演三个角色出色地。首先,内训师应该是知识的沉淀者。二是内训师要扛起文化传播的大旗,做文化的传播者。最后,内部培训师应该充当组织的润滑剂,即高效的协调员。作为知识的沉淀者,内训师除了自身专业业务知识的积累外,还应该根据组织的发展需要,提取业务部门的知识和经验,沉淀成方法论和框架体系,从而使可以获得本组织的知识和经验。高效复制传播,助力员工知识储备和技能增长。内训师作为文化的传播者,面对的是企业中的新老员工。你的一举一动、一言一行都在向员工传递着某种内在的文化信息。你的认知观念是否符合企业文化,你的言行是否符合企业文化,将极大地影响你所培养的学员,所以你要深刻理解企业文化,并亲自实践,以身作则。作为组织的润滑剂,你需要帮助多个不同的业务部门进行人员培训。业务部门与职能部门之间,需要根据组织发展的需要,协调优势资源,解决高优先级业务部门的问题。同时,还要兼顾其他部门的发展需要,做好资源协调和矛盾协调工作。”虽然袁帅刚加入内训没多久,但卓老师热情洋溢的一番话却让他心潮澎湃,他很认同这三个角色的比喻,暗暗答应一定要把内训搞好。除了精神话里,袁帅还称赞结构清晰,逻辑顺序非常自然。一开始道明三个字,然后一一深入介绍,简单的结构先概括再细分。这时候,他泪流满面是因为他想起了自己刚毕业的时候,去找别人的时候,演讲的结构很乱,一两句话,没有人能听懂他想表达什么。后来在Thoughworks,经过多位同事的直言反馈,袁帅逐渐克服了这个问题,久病成医,举一反三的能力弱,袁帅将这一原则应用到写代码中。正好最近清扬在学习《金字塔原理》。袁帅想试探她,当然不是交流,而是代码。他拿起手机,翻出一张之前拍的密码照片,递给青扬:“喂,《金字塔原理》最近怎么样?”明明是在说《金字塔原理》和表达,结果给她的却是一段代码:“面向意图的编程!””没想到清扬这么快就说出了关键词。“对了,你也看过《敏捷技能修炼:敏捷软件开发与设计的最佳实践》这本书?”袁帅故作惊讶。当时就是这种面向意图的编程让我一知半解。正好今天你能帮我解开疑惑。”听了青扬的劝告,喝了三巡的袁帅这回装出一副严肃关切的样子:“哦,你有什么不明白的?”“作者说这样写代码叫面向意图的编程,我从一开始就一行一行地写这些细节不就是按照我的意图吗?”“的确,你要写的代码和你想写的东西想说的都是你想表达的,说你一行一行写的不符合本意,有点不公平。说说我的理解吧。袁帅喝了一口水杯里的热水,凑近了青阳:“如果我把各种细节都说的很详细,你听了会有什么感觉?”“烦躁!”青阳想都没想就蹦出两个字。?”袁帅顺势追了上去。“都一样,我还在心里埋怨这是哪个王八蛋写的!””青阳可爱的表情让袁帅笑了起来,因为他想起了青阳打开Git提交记录,看到committer是自己的画面。”是的,你可能需要花费大量的精力和注意力去理解这些代码的意图,而且很容易看完就忘记了前面,迷失在细节中。如果我把这一大段代码抽象出来,把它细化一下,如果把它分成三个功能步骤,并且给每个步骤起一个合适的名字,你觉得怎么样?”“很方便我理解作者的意图,也不容易迷路。”青阳反应很快。“是的,这样你可以快速了解作者的整体意图,可以大大节省你的时间。当你需要了解细节的时候,可以进行到某个步骤。”“所以,面向意图就是提倡用更高效的方式来表达代码的意图!”程扬感悟地补充道。“基本对,要有效率,就必须优先传达更高层抽象的意图,同一个地方的抽象层次要保持在一层,然后一层层往下走,和越往下,越具体,也就是越详细。”难怪,有的人一开口,听众一片欢喜(意图明确,结构清晰),有的人一开口,听众就痛不欲生(卡在细节上,挣扎),观众会不知所措(层级结构错综复杂)。”清扬对自己的结论很得意,举起酒杯碰了碰袁帅,却没注意到袁帅此时愧疚地低下了头,他当时心里有些愧疚,作为一个应届毕业生,我害了给别人带来很多麻烦。》作者也提到,这种方法只是思路和编码顺序不同而已。但是作者说这种方法基本不会增加工作量,但是为什么你觉得我用这种方法会花很多时间呢?“清扬有点像自言自语。“面向意图的编程必须结合结构化思维和表述,才能让代码通俗易懂。”“编程高手不是能快速写出可用代码的人,而是能快速写出别人一眼就能看懂的代码的人。”人(整洁可用)》《编程高手更多的是在底层能力上较量,如何分解问题,如何抽象提炼,这些都不是一蹴而就的》《编程是艺术表演,不是打字游戏》一连串后情绪一动,袁帅觉得自己喝的不是酒,而是思绪,这一刻,已经喝了四轮酒的袁帅已经无力思考了,看着台上的表演,思绪荡然无存“幸运奖二等奖,袁帅!”主持人话音刚落,清扬就尖叫一声跳了起来,惊醒了还在胡思乱想中的袁帅,然后一股力量将他“拽”到了在今年的年会上,他不再因为奖品而感到孤单……