No choice is a good choice

  愚蠢的实现各有各的蠢法,好的代码有相似的气质。比如说吧,在一个既有的函数里增加一个分支,写法包括

1. 敲一颗钉子进去

foo()
{
    ……
    if(condition)
          {statements;}
    else
        {other statements;}
    ……
}

2. 稍微优雅的敲一颗钉子,封装个函数

foo()
{
……
    if(condition)
          func1();
    else
        func2();
……
}

3. 分离条件和行为

foo()
{
    funcs[] = {func1, func2};
    ……
    funcs[toFuncIdx(condition)]();
    ……
}

4.  策略模式

//init.c
init()
{
    ……
    func = selector()
    ……
}
foo()
{
    ……
    func();
    ……
}

5. 设计一种DSL 语法描述它比如

def bhvname prototype {condition_i implement_i};
foo()
{
    ……
    bhvname();
    ……
}

方法5的好处是,隐藏了策略模式的实现细节。还可以再改进,设计更完整的语法体系,只描述这个特定领域的业务本质,将实现细节尽可能的隐藏。

讲起道理来,大部分人至少在口头承认不应该做霰弹式的改动,应该封装,应该做一些设计。但具体coding的时候,方式1超级简单啊。日积月累函数就长大了;有时候自己也看不过去了,抽取一个函数局部改造一下;团队别的同学稍微有点追求,对某些改动采用方法3或4来实现。总之,怎么做的都有,就一个具体的改动而言,程序员总能找到一个理由说明自己为何以这种方式实现而非其它。代码长得千奇百怪。

大型项目,这样的问题后果尤为严重。

分析这个过程,核心问题是将决策点遗留到了最后一步。coding的时候程序员才最终决策行为要怎么拆分,数据要怎么设计怎么封装,已经最终采用的实现方式如何。架构设计,业务分析(BA)的原则和意图没办法有效的传递下来。最终coding的那个同学,能力,眼界和职责都不足以让他做出长期看最佳的设计和实现。他只关心这个需求尽快交付,如何希望能对代码演进做出合适的判断呢?

一个解是通过某种机制,让coding的人最终没有选择,只能以某种(比较好的)方式来实现代码,且并不需要大量知识和经验来做判断和选择。

架构师(组)应该对系统做顶层设计,划分业务边界和抽取系统核心复杂度。在软件设计方面的工作内容包括定义

1. 系统的框架结构(不是业务框架,而是分层结构和核心元素);

2. 行为和数据的种类,拆分的原则和必须标明的属性,

3. 根据这种拆分应选择的实现形式;

4. 定义DSL和设计转换器,将1-3的内容固化;

5. 抽取系统特有的基础设施层。

6. 定义业务分析和开发的边界和工作方式;

业务分析,将系统有效的分解,并定义开发所需要完成的元素。他们描述业务本质,一般并不关心最终代码实现的形式。

架构组的工作在项目的早期和中期会非常繁重,架构师输出的并非文档或PPT,而是非常具体的语法,转换器,demo。可以定义和约束后续的业务分析和开发。

我们谈到资源前移时,往往担心前移了,未必会带来收益。对于注定长期运行的大型项目,一方面要坚定资源前移的信念,反正一二十人投到故障解决中,恐怕浩瀚的bug海上连一点涟漪都激不起来,不如放到前期设计和探索上去,倒可能产生价值;另一方面,总要给一套具体前移的方法,画个饼说清楚如何更细致的做好设计。注意这个饼必须要能迭代交付。目标宏大,梦想着上市敲钟,却拉不来一点投资,再报怨资本有眼无珠。投资要一轮一轮来,一方面看疗效,另一方面资本被裹挟进来了,花的越多,资本自然会帮你一起想办法,往往事就成了。

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

推荐阅读更多精彩内容