`

代码的体格

阅读更多

Steve Yegge 在他特立独行的作品《程序员的呐喊》中写道:“我坚信代码最大的敌人就是体格”。不过他过于自大了,以为这只是像他那样牛逼的程序员才拥有的少数派观点;又或者说他过于悲观,以为程序员的世界还在拼代码的肌肉男臆想中。殊不知只要是曾经挣扎在庞大代码库泥潭中的程序员,就不会盲目崇拜代码的大块头。

可惜,“知行合一”非圣人不可以做到,梦想的光芒常常难以照进现实的阴影。要缩小代码的体格,似乎比减肥还要艰难。软件系统像一条贪吃蛇,吃掉一切功能,最后越变越长,在局限的空间里再也无法做到从容的转折腾挪,最后活活困死。偏偏还有人以能掌控千万级代码的软件系统为荣。——“兄弟不才,做过一系统,代码达到了两千万行,真是一场噩梦啊!”,程序君一边摇头作痛苦状,嘘声叹气,但察其眼角眉间,藏不住的却是得意和炫耀。

因而,我们一边在愤慨代码日益膨胀的体格,一边又在做着堆代码的增肥工作。软件从来都不是一个人写完的,需求也从来不会稳定不变,于是乎出现了超过数个屏幕的分支语句,出现了大量注释过的代码残骸,于是乎有了拷贝粘贴,程序员渐渐开始降低坏代码的容忍度,开始得过且过。

面对日益膨胀的代码体格,Steve 的呐喊是换语言,因为他是 Ruby 粉和 Python 粉的缘故,恨不得把所有系统都换成 Ruby 或者 Python,要么就是 Lisp。作为 Scala 粉的我,当然也恨不得所有 Java 项目都换成 Scala。让我再写啰嗦的 Java 代码,真是痛不欲生,生不如死啊。支持了 lambda 的 Java 8 也许还能挽救我,但我还是钟情 Scala。

太天真了!首先是换不了,其次是换了也没用。你真以为换语言如换刀,宝刀在手,就能割去那些臃肿的代码,还代码一个苗条身材?——你以为是抽脂啊!Ruby 也可以写出烂代码,Java 也能写出漂亮的程序,关键不在于语言。正如武林高手比武并不在于刀剑的利钝,要分出武功高低,根本还是功力和招式。只有同等高手之间的厮杀,手握一柄利器才能成为制胜法宝。

代码的臃肿关键还在于分解与去重。Unix 大吗?大,而且必须大。但它又很小,因为它以内核形式确立了系统的边界,同时遵循 KISS 原则,将大功能分解为小程序,每个小程序只能完成一个功能,任何复杂的操作都必须分解成一些基本步骤,由这些小程序逐一完成,再组合起来得到最终结果。分解的一个难题是如何定边界,换言之就是如何做到“高内聚、松耦合”。另一个难题在于组合,即该如何把这些分解的细小功能再糅合起来,形成一个整体。这也是为何 Micro Service 被鼓吹了多少遍,仍然有人保持观望态度的原因。

若说掌握分解这门技艺的高手中高手,还得数庖丁这哥们,“彼节者有闲,而刀刃者无厚,以无厚入有闲,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。”眼睛都修炼成了X光,能够透过牛皮看清骨肉经络,以至于能够无厚入有闲,像舞蹈一般变屠牛为行为艺术,举手投足间,潇潇洒洒地把牛给宰了,还挥挥衣袖,不带走一点血。对软件系统的分解,我们能做到像庖丁那般识破依赖,判断“有闲”之节者,进而做到合理解耦吗?

去重的根本其实还是分解,粒度可以是函数、类、模块、子系统。程序员需要有洁癖,重复就是最大的 dirty,可惜打扫卫生需要付出。写代码是件劳心劳力的事儿,总会有人偷懒的。Deadline 又是一把悬在程序员头上的达摩克利斯之剑,在急迫的催促声中,程序员寻找到了心里安慰,因为时间是允许降低质量的最完美借口。——当然,时间也是最残忍的。程序员干的是刀口舔血的生活,出来混,迟早是要还的。程序世界,就是佛家所谓的“因果世界”啊。

去重的关键并不在于技巧(程序员都不是傻子,只要愿意学,什么技巧不能学会?),而在于勇气和决心。重复是敌人,而且是大块头的敌人,它就这般随意地站着,勾起小指头,傲慢地挑衅着你。而你,却未必有战风车的勇气。是明知必败吗?还是不可战胜?未战先怯,这场战争你已经败了。我见到的诸多遗留系统,重复代码都是这样开始蔓延的。——时间,见鬼的时间,其实大多数时候它都是你举白旗时找来贴脸的遮羞布。

我常常说程序员要懒,例如要把重复的过程变成自动化,例如不要重复制造轮子,例如竭力少写代码完成更多的事。可惜,我们多数时候把这种懒,用错了地方。懒于打扫,懒于行动,却又不计后果的吃,代码的体格怎么能够减得下来?就看着代码的体格一天天膨胀下去,然后呜呼哀哉吧。

 

 

from http://www.techug.com/the-figure-of-code

分享到:
评论

相关推荐

    WS 364-2011卫生信息数据元值域代码 第7部分:体格检查.pdf

    WS 364-2011卫生信息数据元值域代码 第7部分:体格检查

    开发活体格的插件

    在IT行业中,开发活体格的插件是一个特定领域的任务,涉及到软件开发、插件系统设计以及用户界面的构建。活体格是一个表格变身系统的开发环境,它为开发者提供了便捷的工具来创建和管理数据密集型的应用程序。4.0.2...

    卫生信息数据元目录 第7部分:体格检查.pdf

    文档中引用了特定的规范性文件,如S363.1卫生信息数据元目录第1部分:总则和S364.7卫生信息数据元值域代码第7部分:体格检查。这些文件为本部分提供了必要的术语定义和数据元值域代码,确保数据元能够有统一的解释和...

    仁爱医院体格检查登记打印系统 Ver 1.02

    仁爱医院体格检查登记打印系统 Ver 1.02源代码,作者自己写的,软件虽小,但功能蛮实用,而且也算丰富,具有医院体检工作标准表格。比较有特色的是具有利用摄像头自动照片拍照,您可以调整照片的大小。报表工具使用...

    pb11电子病历代码

    1. 病历书写:首次病程记录是电子病历系统的核心部分,它允许医生详细记录患者的初次就诊情况,包括病史、症状、体格检查、初步诊断和治疗计划等。PowerBuilder 11的数据窗口组件可以用来创建用户友好的界面,便于...

    大数据期末作业分析蔬菜价格分析源码,大数据蔬菜体格分析源码,含数据包及可视化结果

    大数据期末作业 分析蔬菜价格 软件架构 2802_hdp_ver文件夹中,...origin_data中是初始数据 origin_code中是项目的代码 origin_code/echarts中是生成图表的代码 origin_code/my_ver中是清洗数据以及打包到集群跑的代码

    somacaller:一种在体格面板中调用低频变体的工具

    1. **源代码**:包括Python脚本和其他相关文件,这些脚本实现了变体调用算法和数据处理逻辑。它们可能包含主程序、模块化函数、配置文件等。 2. **文档**:可能有README文件,详细介绍了如何安装、运行和使用...

    ist的matlab代码-BachelorThesis_Pirotte_Vranken:高度复杂的医学数据结构的触觉碰撞检测

    ist的matlab代码碰撞检测应用 可以在此处下载CHAI3D库。 如何: 注意:在以下文本对象中,是指向cMesh的指针。 构建IST包括以下头文件: # include < ist/InnerSphereTree.h > # include < collisions/...

    论文研究 - 病例报告:妊娠急性脂肪肝

    在越南,妊娠急性脂肪肝(AFLP)是一种罕见的疾病。... 仔细的病史和体格检查,再加上兼容的实验室检查和超声检查结果,通常足以做出诊断,很少进行肝活检。 强化辅助治疗和快速节育对于母婴结局至关重要。

    Mutct-benchmark:硕士论文的代码回购

    Mutect和GATK Mutect2的体细胞变异调用基准此回购包含可视化代码/论文/幻灯片,供我研究Mutect1和GATK Mutect2之间的SNV调用者体格比较的论文。 可以在smk 找到在Snakemake中重现Mutect2(在GATK 4.1.4.0中)的代码...

    健康体检自测问卷数据集(2018年版).pdf

    - WS364.7卫生信息数据元值域代码,涉及体格检查。 - WS364.9卫生信息数据元值域代码,涉及实验室检查。 - WS370卫生信息基本数据集编制规范。 - WS363卫生信息数据元目录。 - WS364卫生信息数据元值域代码。 ...

    Python+Opencv身份证号码区域提取及识别实现 .zip

    现在实训结束了将代码发布出来供大家参考,识别的方式并不复杂,并加了一些注释,如果有什么问题可共同讨论。最后重要的事情说三遍:请勿直接抄袭,请勿直接抄袭,请勿直接抄袭!尤其是我的学弟学妹们,还是要自己做...

    Python+Opencv身份证号码区域提取及识别实现 1.zip

    现在实训结束了将代码发布出来供大家参考,识别的方式并不复杂,并加了一些注释,如果有什么问题可共同讨论。最后重要的事情说三遍:请勿直接抄袭,请勿直接抄袭,请勿直接抄袭!尤其是我的学弟学妹们,还是要自己做...

    火焰纹章系列金手指.doc

    角色的属性如等级、经验值、HP、力量、魔力、技术、速度、守备、魔防、幸运以及移动附加和体格附加也是可修改的。通过0202AB80至0202AB92的地址,玩家可以直接提升或降低角色的这些属性,这在某些情况下可能对游戏...

    matlab开发-模拟系统多生理时间

    在多体格训练营的背景下,这可能是为了教育或研究目的,让学习者了解人体如何在不同条件下响应。 “数据库访问和报告”这个标签表明,除了模拟之外,项目可能还包括从数据库中获取数据,以便分析和报告结果。这可能...

    (2021最新)WS363-卫生信息数据元目录WS363-2011 (1-17全集).zip

    在《卫生信息数据元目录 第7部分:体格检查》中,主要阐述了体格检查相关的数据元,包括但不限于病人的身高、体重、血压、心率等基础生理指标,以及体格检查过程中的发现和异常情况。这些数据元对于医生进行临床判断...

    基于互联网大数据平台的临床思维训练模式在住院医师临床培养中的应用研究.pdf

    考核内容涵盖病史采集、体格检查、技能操作及思维能力四个方面。通过大数据分析进行住院医师培训病例库的筛选,针对不同年资、不同水平的住院医师进行多级训练,并分析考核训练成绩,提供给住院医师个性化培训建议,...

    现行有效卫生健康行业信息化标准目录.doc

    6. **卫生信息数据元目录**(WS 363系列):这一系列标准详细定义了不同领域的数据元,包括人口学、社会经济学特征、健康史、健康危险因素、主诉与症状、体格检查、临床辅助检查、实验室检查、医学诊断、医学评估、...

    js 之前 插入html.docx

    这里可以自定义背景颜色、原子渲染样式(如球形、棒状、线框、交叉、卡通或点击球体),以及是否显示晶体格。 以下是一个简单的示例代码片段: ```html <div id="my3Dmol"></div> <script src="path/to/3Dmol.js">...

Global site tag (gtag.js) - Google Analytics