如此重要但是经常被忽视的代码架构!

软件开发的生命周期,大致都是一样的流程:

  • 需求分析,产出概念模型
  • 概要设计,包括系统边界设计、内部架构设计、设计决策
  • 详细设计,包括代码架构,业务逻辑实现
  • 开发代码
  • 单元测试、连通测试
  • 部署上线
  • 系统运维

这样的流程,开发代码这个步骤,其实是个分界点,它实现了前面的设计,同时开发好的代码会最终的进行测试和运行。

正常情况下,概念模型、边界交互设计、数据流设计、系统内部架构设计、设计决策等等,都会产出成文档,供各方阅读和实施,然而,经常情况下大家却忽视了,如何在代码架构中表达这些设计意图。经常会看到一些系统的设计非常的清晰和高大上,但是去阅读代码的时候,却发现一团乱麻。如果涉及系统的交接、文档过时,就会发现这又变成了一个糟糕的系统。

其实在代码中如果承载了这些意图,岂不是最好的体现。

代码架构在规范化模型架构中的位置

normalize_model_architecture
对应到系统实现过程中,对于需求分析的产出,会得到领域模型,对于边界模型的设计会产出系统上下文交互、接口设计,然而由于内部模型和代码模型因为限于系统的内部,只要它实现了边界模型,就不用关系怎么实现,最后导致了这部分关注不多,导致混乱。

架构明显的编程风格

无论怎么努力,模型设计和代码实现之间,会存在差异,只不过是多和少的差别。

模型的设计产出的是文档,但是文档只能表达主模型的一部分内容或者投影,无法全部表达,文档同时也存在维护代价过高,从而导致容易过时的问题。

采用架构明显的编码风格进行编程就是在源代码中嵌入关于系统架构模型的线索,一种设计意图。也就是说,在程序可以运行这样一个最低要求之上,还遵循了模型嵌入代码原理。

这里目的是为了嵌入模型,目的也是能否在代码中表达领域模型?能否表达设计模型呢?

对于领域模型,表达设计意图的标准方法就是,把对领域中类型和关系的理解,映射到程序中的类结构。

而在代码中表达模块模块试图类型和运行时视图类型,主要是通过在模块的命名中,加入通用的模式命名来实现的,比如:

  • *Manager
  • *Service
  • *Factory
  • *Filter
  • *Builder
  • *Agent
  • *Proxy
  • *Repository
  • *StatusManager
  • *RuleEngine
  • *Facade

可以看到,这些词语来源于设计模式、分析模式、通用包名次,通过这些名次的约定,再和团队成员约定一个通用完善的代码架构,即可通过代码表达设计意图。

一个通用完善的代码架构

大量的书籍资料,都会提供概念模型、系统交互设计等设计,然而对于代码架构,并没有一个很规范通用的标准,这也导致了大家写出来的代码各种各样,包命名和依赖混乱不堪,代码简直无法阅读。

而组织良好的包划分、关系依赖设计,是让代码变得能阅读,并且能表达设计意图的第一步。

a_very_good_package_architectrue

这个模型每个部分的说明,在图中都有注释。

而主要的一个划分的方法,就是技术实现和业务逻辑的区别。

业务逻辑是我们提供的系统的实现目标,但是这也是很容易变化的部分,如果能封装到一个模块,隔离变化,交给对业务理解透彻的同学实现,会有很好的效果。

而对外提供接口、代码粘合、保存数据到DB、调用第三方资源、实现dto/model/entiry的转换,这些代码因为不涉及业务逻辑,谁都能写,因为不包含业务逻辑,那么变化的频率也会降低。

business的输入,是来自manager获取或者整合好的业务对象,business通过各种逻辑处理和转换,给出业务结果,然后由manager对外进行分发。

 

文中引用资源:

  • 架构明显的编码风格,来自书籍《恰如其分的软件架构》
  • 代码架构图的划分,是对infoq的《架构漫谈》作者kevin提供的文章《从架构的角度看如何写好代码》中架构的改进和注释

本文地址:http://www.crazyant.net/1973.html

Stay hungry, Stay foolish

即使穷尽一生的精力,我们又能探索到世界的多少精彩?

要永远保持饥饿,不要停止永远追寻和追求的步伐,去探索现实世界和精神世界的未知领域;

要永远保持傻逼,对一切保持敬畏、卑微、虚心,只有从山脚出发往上攀登,才能领略到沿途的美丽风景;

 

这两句话,有两种翻译:

1、中式翻译:求知若渴,虚心若愚

这是典型的受儒家价值观影响而导致的翻译错误,在中国文化里,知识很重要,虚心是一种美德;

2、西式翻译:永不知足,我行我素

然而在西方文化里则完全不同,它鼓励冒险,张扬个性。纵观乔布斯的人生哲学,这两句话应该理解为:“永不知足,我行我素”。只有这样才能理解西方文化的精髓和乔布斯一生的追求。

 

 

文章来自:http://www.crazyant.net/1964.html

MAC挂载NTFS移动硬盘进行读写操作

NTFS是Windows NT File System (NTFS)的意思,是Windows特有的文件系统,所以MAC并没有直接提供支持读写,当插入NTFS的移动硬盘时,只能读取文件不能写入文件。

有两种方法可以解决这个问题,方法1就是把移动硬盘转换成FAT32格式,但是这样就能存储小于4GB的文件了,方法2如下所以,需要执行几个命令执行挂载。

步骤1:查看自己的磁盘地址

ls -l /Volumes/

然后会看到自己的移动硬盘名称,假设名字叫做“移动硬盘2016”

那么自己的移动硬盘的地址就是/Volumes/移动硬盘2016

步骤2:查看移动硬盘的信息

diskutil info /Volumes/移动硬盘2016

会输出磁盘的详细信息

查找关键字Device Node有一行会是这样:

Device Node:              /dev/disk2s1

3、将影动硬盘退出(为的是重新挂载)

执行命令

hdiutil eject /Volumes/移动硬盘2016

“disk2” unmounted.
“disk2” ejected.

4、创建一个自己要挂载的目录

mkdir /Users/baidu/myMobileDisk

5、执行磁盘挂载

sudo mount_ntfs -o rw,nobrowse /dev/disk2s1 /Users/baidu/myMobileDisk

然后提示输入密码,输入之后命令结束。

这时候发现已经能打开/Users/baidu/myMobileDisk进行文件读写了。

工程师的月亮和六便士

《月亮和六便士》是英国作家威廉·萨默塞特·毛姆的三大长篇力作之一,完成于1919年。作品以法国印象摄画家保罗·高更的生平为素材.描述了一个原本平凡的伦敦证券经纪人思特里克兰德,突然着了艺术的魔,抛妻弃子,绝弃了旁人看来优裕美满的生活,奔赴南太平洋的塔希提岛,用圆笔谱写出自己光解灿烂的生命,把生命的价值全部注入绚烂的画布的故事。贫穷的纠缠,病魔的折磨他毫不在意,只是后悔从来没有光顾过他的意识。作品表现了天才、个性与物质文明以及现代婚姻、家庭生活之间的矛盾,有着广阔的生命视角,用散发着消毒水味道的手术刀对皮囊包裹下的人性进行了犀利地解剖,混合着看客讪笑的幽默和残忍的目光。
六便士是当时英国货币的最小单位,有个朋友跟毛姆开玩笑说,人们在仰望月亮时常常忘了脚下的六便士,毛姆觉得这说法挺有意思,就起了这个书名,甚是开玩笑的语气。月亮代表高高在上的理想,六便士则是现实的代表。

工程师的六便士和月亮

软件开发者或者成为工程师,属于工程技术人员,做的是再也具体不过的事情:确认需求、开发、测试、上线、运维,都是一件件的实事,同时关心的也都是六便士的事情:职称和薪资,对于工程师来说,眼中很容易的全是六便士,对于我们来说,有月亮吗?有梦想吗?有追求吗?

如果工程师也有月亮,也有远方,也有梦想,也有追求,那它是什么?

思特里克兰德开始的时候,是一位伦敦证券经纪人,拿着并不低的薪水,有着大房子、漂亮的老婆和两个孩子,生活水平处于社会的中层,只要他努力打拼,生活会更优越,然而对他来说,这些都是物质意义上的六便士,难以满足自己精神上对艺术的追求。而令人佩服的是,他会突然地放弃所有,放弃温暖舒适的的房子、放弃每月宽裕的薪资、放弃温柔体贴的老婆和天伦之乐的家庭,从物质生活中脱离,完全投入到自己的精神追求中去,即使混沌潦倒、即使受尽挫折,但他并没有感到后悔和不适,反而一步步的靠近自己的月亮最终拥抱自己的月亮。

对应到原著,六便士代表的是物质的追求,而月亮代表的是精神追求。精神追求会带来比物质追求完全无法比拟的满足。

如果将月亮定义为精神追求,工程师应该追寻的是什么呢?也许是规划完架构、实现功能、圆满交付所带来的成就感、也许是别人认同的满足感、也许是在各方利益和谐协调带来的认同感;

如果将月亮定义为理想追求,工程师的目标是什么呢?也许是做出人们需要和依赖的产品、也许是成为领域不可替代不可或缺的大牛、也许是团队前进的精神领袖,但这些好像都不是理想,困惑~

我该怎样选择

现实的压力让人们不得不面对六便士,一直低头走路,忘记了抬头看月亮。

人们因为房贷、买车计划、育儿目标,不断的将头埋得更低,更加关注金钱和现实,变成一个物质机器,日复一日、年复一年,最终回过头来,发现自己有了房子、有了车子、孩子长大了,可是自己呢?几十年都在埋头苦干,就像车轮压过一条条公路,最终是在原地转圈圈,自己的精神领域,好像一直那么的贫乏。

在人生的路上,不只有物质的追求,不只是追求高高的薪资、大大的房子、漂亮的车子、优越的地位,更能带来满足、更能带来成就感、更能让自己老不后悔的,是精神的追求。

对于佛陀来说,放弃了一切物质,哪怕身上衣不遮体,但是精神修为达到了圆满,这才是终极的追求和自我实现。

对于这个精彩的、未知的世界的探索和精神上的修炼领悟,才是在低头看着六便士的同时,需要抬头追求的月亮。

看书、健身、沉思、音乐、冥想、交流、修炼。

不要做物质的奴隶,要做精神的主人。