惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - Kevin Zou

vs2008 ctrl+D 查找出错 No files were found to look in. Error while trying to retrieve text for error ORA-03113 的一种解决方式 IE不能直接顯示PDF的原因分析和解決方法 [2012-01-06] 流程系统设计--消息和通知 企业应用整合(1)--一个账号 2010年终随笔--漫谈技术 Schtasks命令理解排程的應用 用Adobe ImageReady制作简单GIF动画 Console输出UTF-8 JQuery1.4+ Ajax IE8 内存泄漏 权限设计的三层境界续 闲话权限设计三层境界 - Kevin Zou - 博客园 一个时代的终结 Jquery乱码的一次解决过程 asp.net真的是并行处理request的吗? 十年磨一剑--缓存模块设计 系统设计其实很有趣--从业务逻辑谈起 系统架构随笔--我看三层架构的数据访问层"怪胎"
十年磨一剑—序
Kevin Zou · 2010-01-04 · via 博客园 - Kevin Zou

记得几年前不管开发什么系统,都会引入log4net进行系统的日志记录,当时只沉迷于这个组件带来的超强日志功能。不过很快我们就尝到了恶果,经常在日志无输出时,在试了google出来不知道原因的解决方法失败后,只能将log4net源码全部attach上,慢慢的一行一行追踪这个庞大的类库来找出原因。

有时我们甚至不得不进行日志的日志设计,在日志失败时,使用我们自己的,最直接的,最简单的,最少出错的方式来记录日志的出错信息。

而在我们头痛时,那个看似可应付无穷变化的组件却几乎一次也没有给我们带来惊喜。

日志永远在Warn级别输出,日志永远存在系统的D盘根目录/系统名称下,异常和警告邮件永远都会发向开发组的一个共用mail,日志的格式更是从来没有变过,谁没事天天会去琢磨日志是不是该增加一个什么记录?就算要增加,那也几乎要修改所有调用日志的地方,幻想只通过修改那个格式配置文件就行?

当我们最终想要换掉这个日志组件,重新换上一个不超过100行的自己写的日志类时,这时才发现日志的变化点在哪里?原来日志模块可能的变化是抽掉整个日志模块,而不是整天考虑是日志在C盘还是D盘,是记录Error还是Warn,是要输出日志到Console还是资料库?

为什么会这样,为什么该变的没有变,不该变的又频繁在变?

现在企业开发有很多平台和框架,像.net的Enterprise Libaray和java的SSH等。

无论是何种方式,何种平台,都无法逃避系统开发的一般问题域的处理。例如如何进行数据访问,如何输出日志,如何处理错误,如何读取系统配置。。。

在面对这些问题时,人们更多的时候是在寻找一个框架,即使这个框架大到你只想要一个轮子而不得不接收它的整个车子,你依然不会怀疑为什么这样做,当你终于被这个车子的其它零部件影响到你这个小小的轮子行驶,而不得不到处google爬文或分析源码,在弄得焦头烂额,筋疲力尽之时,你心里又会不会发出:这个。。。 能不能简单点的抱怨?

系统设计中,变化是一条军规,变化成就了今天的各种框架,类库和模式。然而当我们洋洋自得于我们的系统应对变化的能力的同时。却没有反思变化会带给我们的影响,我们不得不为一个几百年都不会第二次实现的接口而带来的复杂性买单?

对于一个优秀的系统架构师来说,他除了要为应对变化而施展他的艺术创作才华,很多时候他也必须分清哪些是需要变化的,哪些是可以变化的,哪些是不会变化。

而要认清这些不同的变化,首先就要理解问题域的本质,例如缓存处理,为什么要缓存处理,它有什么用,在系统中处于什么样的地位,和其它模块的接口在哪里?哪些是缓存可变的,哪些是缓存不会变的,当变化时在哪里处理这个变化,对系统的其它模块的影响在哪里?只有认清这些,才会在引入某个模块时做到心中有数,避开它的负面影响。

与到处考虑变化相反的是,很多时候我们却在排斥合理的变化。如经常看到一些询问如何应对表结构修改,如何在增加栏位时不修改系统的讨论。

有人认为是需求人员或系统分析师没有做好,要是做好了,就不会栏位变化了。这可能是没有遇到一些比较复杂的系统,我们这边一个财务系统,因为供应商,客户的付款,收货规则每次都在调整,因此基本上每个月系统都会对一些流程,业务实体作修改,想固定不变,那我们的工资都可能算不出来了。

实际上,系统要做到不变是不可能的,因为世界每天都在变,市场也在变,企业的管理者会随着市场的变化而持续检视自己的经营行为,改变流程,优化流程,缩短流程,而作为系统的架构师就是要当流程变化时,最快的修改系统以适应新的变化。

变化反应了一个系统的生命力,只有经常变化,系统才能持续产生价值。相反,僵化,这也不能动,那也不能改的系统最终会很快地淘汰出局。

作为一个系统架构师,当然希望需求分析比较完整,比较准确。但更重要的是了解系统会在何处变化,会怎样变化,会何时变化,这也是经常讲的技术不重要,业务重要的一层意思。

因为如果一点都不了解你系统的业务,就不能在需求信息不完整或不准确时,作出哪些变化,哪些不变的架构,从而在系统真正发生变化时,无力应对。

企业开发中,只有变化才是真正的不变,而抓住那些可以不变,或基本不变的保持稳定。大胆地将一定会变的,很大程度会变的进行最大的变化设计,最终完成系统架构。

从事企业开发将近8年,希望在满十年的时候能够完成自己对企业开发的理解和总结,因此决定开始这个系列,是为序。