设计与长代码

文中图片均来自网络

“软件领域永恒的主题是如何做正确的事和如何正确的做事 ”—— Gojko Adzic《实例化需求》

大咖的编码进化史

初学编程的时候,我埋头就写程序,浑浑噩噩地进行开发。然而很快我便发现,事先做好设计可以让我节省返工的高昂成本。于是我很快加强这种“预先设计”风格。—— Martin Fowler 《重构》

这是一段老马关于“编码进化”的自我描述,大多数程序员们也是循着这样的一条轨迹成长起来的,开始的时候总是想写点什么,抓耳挠腮却不得,到后来慢慢学会了用纸笔把想法画下来启发思考,再到引用高级工具规划架构。在这个进化的过程中,设计的引入(无论是脑海中的还是成稿的)就如同催化剂,一点一滴地加强着程序员对于问题领域的认识以及软件世界观的构建。

老马的亲身经历还讲述了另一个事实,即设计不是一天造就而需要长期实践摸索,中间会有一个相当长的时间跨度,而程序员们也会在演进中逐步学习到诸如流程图、UML等辅助设计工具,最后建立起一个有边界、可操作的软件蓝图。

当我们拿到软件蓝图是否就可以期待一个优雅的软件产品顺利诞生呢?很不幸,现实的答案非常无情地回答我们——不尽然!为何会这样?大咖不是已经在描述中讲道通过设计摆脱了浑浑噩噩的编码了吗!别着急,老马的话还没讲完,接着往下看。

许多人都把设计看做软件开发的关键环节,而把编程看做只是机械式的低级劳动。他们认为设计就像画工程图而编码就像施工。但是你要知道,软件和技巧有着很大的差异:软件的可塑性更强,而且完全是思想产品。—— Martin Fowler《重构》

从蓝图到实现,中间还横亘着一个大脑,由它来完成翻译工作,鉴于大脑背景参数(对问题领域的认知程度以及对软件世界观的完善程度)的不一致,因而可以预期每个大脑翻译的成品不尽相同。现实中也是这样,随手拣起手边的代码就能发现同样的设计,有的实现精巧、干净利落而有些则充斥着大量冗长、晦涩与复杂。那些冗长的实现又是如何蹦出来的呢?

情怀、教育、技术和压力

码林独行侠

程序员这个行当其实和武侠小说中行走江湖的侠客却有几分相似,毕竟都是凭着“手艺”吃饭,还多少有些不羁,有时总想着在独步码林,更是期望独孤求败,所以一些天生侠骨的程序员行走江湖秉承“一寸长一寸强”的不二真谛。代码便是他们手中的长剑,正所谓“长刀在手,天下我有”,在他们看来无法使用“长剑”的侠客终究只是未出师的学徒,而“仗剑天涯、快意恩仇”方才为人生大境界,快哉!壮哉!

仗剑天涯

学霸初养成

一个刚学编程的人,无论是阅读或编写一段稍长代码都充满了挑战,而短小的代码容易让初学者对编程有个大体印象,也容易让初学者模仿,更容易让人起步,所以几乎所有编程例子都是从只有若干行的hello world开始。

随着学习时间的增加,一些人希望摆脱初学者的卑微称号,于是他们开始向着更长更具挑战的代码前进。突然一夜之间长长的代码成了区分菜鸡与老鸟的分界线,谁的代码越长、嵌套的分支、循环越多,水平就越高。在我们自己向着长代码策马奔腾的同时,老师们也开始鼓励我们去写更长代码,因为这有助于锻炼代码整体结构和逻辑理解能力。

使用旧习惯

早期的编程语言中,子程序调用需要额外开销,这使得人们不太乐意使用小函数 —— Martin Fowler《重构》

技术上的考量有时候会让一些人使用冗长代码,原因是由于担心函数切换过程中产生的开销,特别是在那些对资源使用存在较大限制的场景中。不过这种考虑却和现实中大家对待长篇幅事物的态度相悖,试想一下当你置身与一个冗长篇幅的事件中,例如会议、报告、说明书,你很快就反应出各种不适应,包括但不限于:注意力不集中、困倦、抵触甚至拒绝。显然,从大家对事物的接受度上看,短篇幅更加受欢迎。

如此小心翼翼地控制子程序的使用,实际上是为了机器的性能而牺牲了人的创造性,你不得不把花在的创造性上的能量投放到阅读理解程序的上下文转换,还有一部分要用来抑制由于长篇幅对自身机体造成的不良反应。

压力无绝期

实际中外部压力更是长代码出现的重要诱因,比如时间。时间恐怕可以称得上是软件开发者最大的敌人了,它的约束迫使开发者会采用照搬修改现有实现或者平铺直叙的方式来进行对抗。无论多么好的设计,只要时间压力足够大,就一定会有足够糟糕的实现。堆砌补丁是开发人员在面临巨大交付压力时通常会选择的方法,在这加一个条件判断,在那加一个循环,日积月累造就了“危楼高百尺”的长代码。

破局

如果类比人类的进化,那么程序员也大致可分成4个进化阶段。

进化
  • 原始人,即刚入门的初学者,一个方法或函数会囊括所有流程,一条main路通罗马,开发者通常在这个阶段停留的时间很短;
  • 摩登原始人,会把流程拆分到几个函数中,但每个函数其实只是main的微缩,多数人会在此停留很长时间,这个阶段会给人一种错觉,那就是“你已经足够好,只有高手才能驾驭长代码”;
  • 近代人,函数按照功能分解,表意清晰,适当采用设计模式,这个阶段是大部分人通过工作经验积累,特别是工作环境下的编码规范最终达到的,函数布局已经趋向合理,但仍会有长代码偶尔发生;
  • 现代人,在近代人的基础上,增加了重构,并能敏锐地嗅探出代码的各种坏味道,这个阶段依靠开发者的自身修炼,通过读书、思考和实践,逐渐地找到消除长代码的合理方法

当进入近代人(大多数的我们所处的位置),之前的各种各样、奇形怪状的代码开始被标准化、一致性代码所替代:

  • 大部分开发者会采用相似的编程手段、风格,对代码的理解、协作趋于一致
  • 大部分开发者都会受到相似的外部压力,对于外部压力的外应也会趋于一致,甚至带有继承性和传递性
  • 大部分开发者都会犯相似的问题,并且会被大部分人接受为传统或风格

在这种环境下设计到实现的变形会产生发酵,由于得到了多数人的认同,长代码会逐渐成为多数人允许的灰色地带,直到拥有更先进思想和技术的“现代人”来“消灭”它。

从公元1500年开始的这种技术和政治上的差异,是现代世界不平等的直接原因。使用钢铁武器的帝国能够征服或消灭使用石制和木制武器的部落。 —— 《枪炮、病菌与钢铁:人类社会的命运》

进化始终都是事物唯一的出路,对生物如是,对技术亦如是,既然我们中的大多数人已经适应了从原始人到近代人的转变,那为何不再做点努力,让自己蜕变成现代人呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,622评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,716评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,746评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,991评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,706评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,036评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,029评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,203评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,725评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,451评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,677评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,161评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,857评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,266评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,606评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,407评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,643评论 2 380

推荐阅读更多精彩内容