架构腐化之谜
网络反腐与制度反腐间还缺链接

非 真假”的意识, 网络永远只是一个情绪排泄场,成不了大 器和主流,永远摆脱 不了被人又爱又恨、一半是魔鬼一
半是 天 使的 尴 尬 处境 。 如 果 网络 监 督 走 不出非 理 性 的 泥 潭,还 会 给 某 些 害 怕网络 监 督 者 留下 妖 魔 化 和污 名 化网络 的口实 : 轻 信 瞧 轻 听 、不辨 是 非 、以讹 传 讹 、 谣 生事 、杀 气 腾 腾 、充满 造 话 语 暴 力,这 就 是 你 们所 赞 美 和 力 挺 的网络 监 督 ,这 样
年前, 最高检察机关就曾发文要求各地检察机关应抓住 新闻媒体曝 光的问题, 深挖案件线索,加大查 办力度。那么,有关纪检 监察机关 和检察机关,介入调查大约也是有必要的。
群空有一腔廉价道德 义愤 和正义感的乌合 之众,能干 网络轻听轻信的品性,导致了许多网络 暴力发生, 网
什 么正 经事 呢?
但事实上, 反腐败从来不是一件 “ 依申请”的政府行为, 而是一
件必须 “ 依职权”进行的国家行 为。 或奢侈名表、抽高价名烟的官员 有可能涉嫌受贿,或者涉嫌财产来源不明。对 涉嫌犯罪的行为进行 调查, 收到举报”从来就不是一个必备的选项。从媒体报道中发现 “ 线索, 从案件调 查中发现线索, 已经成为 “ 腐败发现机制”中极为重 要的组成部分。 在反腐败上, 检察、 纪检等反腐机构要增强主动意识。 网络舆情汹涌, 昭示着民众并不缺乏反腐的热情。对于公权力机
的冷 静 和 理 性 ,许 多网友 并 没 有 被 这 个 网帖所 预 设 的判 断 和情 绪牵 着 鼻 子 走, 是理 性 地 质 疑网帖的真 实性 。不 而 少 网友 表 示,这 张清 单 “ 历 不明” 来 ,没有 具 体的人 名和其
他确凿的证据,可信度很值 得怀疑,不排 除有 人编造出
机制存在的问题和原因

机制存在的问题和原因一、机制存在的问题1.1 缺乏公正性和透明度机制存在的首要问题是缺乏公正性和透明度。
很多机制在运行过程中存在着权力不对等和信息不对称的情况,导致一些参与者无法获得应有的权益。
例如,在招聘流程中,内定现象时有发生;在政府决策中,利益集团能够通过非透明的手段获取特殊待遇。
1.2 利益输送和腐败问题机制存在的另一个常见问题是利益输送和腐败现象。
由于权力集中或监管不到位,一些人利用其掌握的权力或资源寻求私利,导致公共资源的浪费以及社会公平公正受损。
这种滥用权力、操纵机制的行为严重扰乱了社会秩序,并给国家经济发展带来隐患。
1.3 不合理分配和效率低下机制存在的第三个问题是不合理分配和效率低下。
一些机制在资源配置上表现出偏向某一方面或某些群体,而忽视了其他群体或领域的需求。
此外,由于监管不到位或者缺乏有效的激励机制,很多机制在执行过程中效率低下,导致资源浪费和经济效益下降。
1.4 缺乏自我调控和创新机制存在的最后一个问题是缺乏自我调控和创新。
一些机制长期以来没有进行改革和创新,导致其钝化、僵化并且无法适应不断变化的社会需求。
缺乏自我调控能力意味着机制无法对内部问题进行及时解决,甚至会导致滥用权力等恶性问题的出现。
二、机制存在的原因2.1 权力过于集中许多机制存在问题的根源之一是权力过于集中。
当一个组织或群体拥有过大的权力而缺乏监管时,就容易产生腐败、滥用权力等不良行为。
权力应该分散,通过建立合理的监管机构和程序来保障公正与透明。
2.2 利益诱惑较大利益诱惑也是导致机制存在问题的一个重要原因。
在一些重要决策环节中,特定利益集团能够通过行贿、利益输送等手段获取特殊待遇,这就导致了机制的不公正和利益的失衡。
为解决这一问题,需要加强监管力度、建立公平竞争的市场秩序,并加强法律法规的执行力度。
2.3 缺乏有效监管机制缺乏有效监管机制也是机制存在问题的重要原因之一。
如果机制内外没有相应的监管机构和流程,就无法及时发现和纠正问题。
组织架构变革的影响因素

组织变革流程企业组织结构再造.doc88./p-.html组织文化与企业再造关键成功因素的认知之研究以自由时.doc88./p-.html组织变革需要经历“解冻”、“改变”和“再冻结”三个阶段,每个阶段都有其特殊的矛盾,每一阶段都需要针对性的对策和计划。
在任何一个阶段没能做好,都会葬送整个改革的成果。
组织架构变革的影响因素企业环境企业要生存和发展,就必须不断地适应环境的变化、满足环境对组织提出的各种要求。
因此,环境是决定管理者采取何种类型组织架构的一个关键因素。
外部环境指企业所处的行业特征、市场特点、经济形企业环境企业要生存和发展,就必须不断地适应环境的变化、满足环境对组织提出的各种要求。
因此,环境是决定管理者采取何种类型组织架构的一个关键因素。
外部环境指企业所处的行业特征、市场特点、经济形势、政府关系与自然环境等。
环境因素可以从两个方面影响组织架构的设计,即环境的复杂性和环境稳定性。
外部环境对组织的职能结构、层次结构、部门结构以与职权结构都会产生影响。
环境越复杂多变,组织设计就越要强调适应性,加强非程序化决策能力。
这也就是为什么在这种情况下结构简单的小规模企业的适应力反而比大企业强的原因。
处于高干扰性环境的组织需要减少管理层级,加强部门间的协调与部门授权,减弱组织内部的控制力。
在结构上需维持一定程度的灵活与弹性,这样才能使企业更具适应性。
当经济环境相对稳定时,企业追求成本效益,往往规模大,组织架构复杂。
在稳定的环境中采用机械式组织架构即可应付,组织内部的规章、程序和权力层级较为明显,组织的集权化程度明显增强。
企业战略企业的组织架构是其实现经营战略的主要工具,不同的战略要求不同的结构。
一旦战略形成,组织架构应做出相应的调整,以适应战略实施的要求。
著名管理学者钱德勒指出:战略决定结构。
战略选择的不同能在两个层次上影响组织的结构:不同的战略要求开展不同的业务活动,这会影响管理的职能结构;战略重点的改变,会引起组织的工作重点转变以与各部门在组织中重要程度的改变,因此要求对各管理部门之间的关系作相应的调整。
组织化腐败最难治理的腐败

组织化腐败:最难治理的腐败?作者:毛昭晖来源:《廉政瞭望》2012年第04期当我们看到诸多公共事件中扮演不光彩乃至引起公愤的角色已不是贪腐官员个体,而是一些理应令我们尊重的公共组织,震惊和失望在所难免。
为什么在中央高压态势下,腐败行为却在脱胎换骨,从官员的个体腐败演变发展到组织的集体腐败?这一现状凸显了当前中国反腐败斗争的长期性、复杂性和艰巨性,也折射出当今国家反腐败战略存在的深层次问题。
笔者认为,组织化腐败是当今中国最难治理的腐败。
一是从组织化腐败危害的视角看,组织化腐败是一切腐败之母,特定区域一旦呈现组织化腐败的特征,则能够说明该区域范围内公共资源以及公共政策的走向已经被腐败的组织群体所控制。
二是从治理组织化腐败的视角,由于其组织形态具有“模块化网络组织”特征,并具有强大的同化能力和无限增殖的本能,其组织形态与现行政治体制之间具有极为紧密的关联性,因此,在政治体制改革无法取得突破性进展的情况下,组织化腐败必然成为最难根治的腐败。
三是从组织化腐败表现形态的视角看,往往披着合法的外衣,打着为公共利益的旗号,具有很强的伪装性。
组织化腐败缺乏准确界定现行实体法对官员个体腐败的认定已不是问题,但对组织化腐败缺少全面深入的个案分析和理论归纳,其属性界定较为模糊。
因此,描述组织化腐败的性质则成为研究组织化腐败的重要路径。
一方面,当一个公共组织内部呈现以下特征,我们就认为腐败在该组织内部已经制度化:一把手腐败;制度健全但腐败行为在此组织体系内畅行无阻;该组织内部廉洁者被边缘化,甚至无法生存,而同流合污者必获利益;出现组织化违法或者不当行为(如小金库、单位受贿等)。
另一方面,该公共组织与其他强势利益集团之间存在着利益互补性交易,甚至被某些强势利益集团所俘获,成为了强势利益集团的代言人,从而扭曲公共政策的公共性。
可见,组织化腐败的性质不仅应当从组织内部加以分析,更应当从组织之间是否存在着交易合谋的角度予以评判,组织化腐败往往是组织的集合体行为。
组织变革中存在的问题和难题、解决方案

组织变革中存在的问题和难题、解决方案问题和难题在组织变革过程中,常常会面临一些问题和难题,以下是一些常见的挑战:1. 沟通障碍:在组织变革中,有效的沟通至关重要。
然而,由于信息传递不畅或者消息不准确,往往会导致员工对变革的不理解或担忧增加,进而阻碍变革的顺利进行。
沟通障碍:在组织变革中,有效的沟通至关重要。
然而,由于信息传递不畅或者消息不准确,往往会导致员工对变革的不理解或担忧增加,进而阻碍变革的顺利进行。
沟通障碍:在组织变革中,有效的沟通至关重要。
然而,由于信息传递不畅或者消息不准确,往往会导致员工对变革的不理解或担忧增加,进而阻碍变革的顺利进行。
2. 抵触情绪:变革通常会引发员工的抵触情绪。
这可能是因为他们对新的工作流程或角色有所担忧,或者因为他们对变革的不确定性感到不安。
抵触情绪:变革通常会引发员工的抵触情绪。
这可能是因为他们对新的工作流程或角色有所担忧,或者因为他们对变革的不确定性感到不安。
抵触情绪:变革通常会引发员工的抵触情绪。
这可能是因为他们对新的工作流程或角色有所担忧,或者因为他们对变革的不确定性感到不安。
3. 技术难题:一些组织变革可能涉及到引入新的技术或系统。
然而,技术的引入可能会涉及到高昂的成本、培训需求以及与现有系统的兼容性问题,这些都可能成为变革的障碍。
技术难题:一些组织变革可能涉及到引入新的技术或系统。
然而,技术的引入可能会涉及到高昂的成本、培训需求以及与现有系统的兼容性问题,这些都可能成为变革的障碍。
技术难题:一些组织变革可能涉及到引入新的技术或系统。
然而,技术的引入可能会涉及到高昂的成本、培训需求以及与现有系统的兼容性问题,这些都可能成为变革的障碍。
4. 文化冲突:组织文化是组织成员共同遵循的价值观和行为准则。
当组织变革与现有文化存在冲突时,员工可能会表现出抵触情绪或者不愿意接受新的工作方式。
文化冲突:组织文化是组织成员共同遵循的价值观和行为准则。
当组织变革与现有文化存在冲突时,员工可能会表现出抵触情绪或者不愿意接受新的工作方式。
重构之十六字心法|洞见

重构之⼗六字⼼法|洞见这篇⽂章是我写过的所有⽂章⾥最难产的⼀篇,前前后后斟酌酝酿了好⼏个⽉。
因为重构对于我来讲真的太重要也太深刻了,包含的内容和想说的也太多了。
如果说这⼏年⾃⼰觉得在哪些⽅⾯的收获最⼤的话,⾮重构莫属了。
重构的威⼒软件开发的难点在于不确定性,前⼏天邱⼤师刚写了⼀篇《软件开发为什么很难》就提到:软件的复杂性来⾃于⼤量的不确定性,⽽这个不确定事实上是⽆法避免的。
需求在变,语⾔在变,框架在变,⼯具在变,框架在变,架构在变,趋势在变,甚⾄连组织结构都在不断的变化。
随着变化的不断产⽣,软件变得越来越复杂。
就像《架构腐化之谜》中提到的⼀样,我们的软件也会像⼀个⽣命体,经历从新⽣到衰⽼腐化的过程。
⽽重构就像是⼀次⼿术,通过优化内部结构,减慢腐化衰⽼,让软件“青春永驻”,可见重构的威⼒。
重构教会了我如何通过⾼效安全地改善内部设计以使之适应外部的不确定性和频繁变化。
重构威⼒⽆边,就像是武侠⼩说中的⼀件插在⽯头上的上古神器,但同样也不是⼀般⼈可以轻松驾驭的。
如果运⽤不当,造成的损害也会同样巨⼤。
如何将重构这件神器运⽤⾃如,发挥其最⼤的威⼒,也是我⼀直在探寻的,即重构的⼿法和⼼法。
合格的重构在谈⼿法和⼼法之前,可能很多⼈会有疑惑,觉得重构并不像你说的那么难啊,我们每天都在做,就是改改代码改改设计,哪有你说的那么邪乎。
那我就先来讲讲我认为怎么样才算是⼀次合格的重构。
对于什么是重构,《重构》书中已经有明确的定义,分名词和动词两种形式。
重构(名词):对软件内部结构的⼀种调整,⽬的是在不改变软件可观察⾏为的前提下,提⾼其可理解性,降低其修改成本。
重构(动词):使⽤⼀系列重构⼿法,在不改变软件可观察⾏为的前提下,调整其结构。
就像“看板”不是“我们看到的那个⽩板”⼀样,“重构”也不是“重新修改代码”那么简单。
我就看到过太多打着重构的幌⼦,把系统改的⾯⽬全⾮,最后出了问题直接甩锅到重构⾝上的场景了。
那怎样才算是⼀次合格的重构呢?我觉得⾄少需要做到以下⼏点:消除味道:⼀个重构应该是从识别⼀个坏味道(Bad Smell)开始,以消除⼀个坏味道结束,任何不以消除坏味道为⽬标的重构都是耍流氓。
架构原理之万变不离其宗

HELLO WORLD
世界的边界是四维时空
代码结构与软件架构的异曲同工
看法都是人的看法
人的局限性和灵活性
拆解架构顺口溜
时空转换,虚实不分,架构原理,以人为本
一句话说架构
秒杀 并发出轨
HDFS 区块链 异地多活 中台 云计算 智能家居
还有什么问题?
算法? 人工智能?
Hale Waihona Puke 量子计算?遇事不决,量子力学,万不得已,熵增原理
业务架构、技术架构、软件架构 系统架构、应用架构、数据架构、安全架构、网络架构、部署架构
前端架构、后端架构、C/S架构、B/S架构、 平台架构、中台架构
企业级架构、互联网架构、移动互联网架构 SOA架构、微服务架构、云原生架构
什么是架构
什么是系统
一个系统 就是 对世界的 一种看法。
---杰拉尔德 .温伯格
世世世世 界界界界 并是是是 不变有多 完化机元 美的的的
架构是对系统的一种看法
架构原则和模式
编程范式 设计模式 SOLID面向对象设计原则 GRASP通用职责分配软件模式 12要素 Zachman企业架构框架 TOGAF AKF架构原则
原理是本质
信息系统的本质
信息系统的裂变
为什么说软件定义世界
架构原理
之
万变不离其宗
你有没有遇到过这些问题
写代码和设计架构是不是一回事? 最好的文档是注释还是代码? 架构师是干啥的?
架构设计好像都是后端的事儿,前端就没有架构了么? 传统企业应用架构和互联网应用架构真的格格不入么?
软件架构到底要解决什么问题? 架构的本质是什么? 有什么是不变的?
当我们谈论架构的时候 我们在谈什么?
不知道自己不知道 知道自己不知道 知道自己知道 不知道自己知道
海尔被颠覆的三角组织架构

海尔被颠覆的三角组织架构由领导驱动转变为用户驱动从青岛市内向西驱车一个半小时,便到达了平度。
销售代表陈栋带路去A类用户参观一圈之后,在车上与企业文化中心的负责人攀谈起了工作。
到了店里之后,陈栋一边介绍产品销售情况,一边谈起了自己的目标-下一个季度升为6级销售-他目前是8级。
"你升6级还缺什么?""还缺A类用户,我刚到这里不到一个半月,用户粘度还不够;如果下个季度升到6级,需要更加准确地了解用户的需求,还需要我的订单能100%被满足。
"2007年,海尔开始"再造1000天",将组织结构由正三角转变为倒三角,由领导驱动转变为用户驱动。
陈栋这样的基层员工,成为倒三角最大的那条边。
海尔为何做出如此颠覆?从最顶端转为最底端的张瑞敏如何保障这一结构的平衡?这种颠覆会为海尔带来哪些影响?员工是最大的边【海尔:被颠覆的"三角"】互联网时代,产品驱动向用户驱动转变,谁能最快满足用户的需求谁就是强者。
"倒三角"组织结构,是以企业作为边界降低交易成本,以员工为企业最大的边,与客户零距离接触,第一时间获得客户需求,确定市场目标,倒逼供应链提供服务的一种组织结构。
"这种结构,员工在最前线,面对市场,所有的人都听客户的命令,领导倒过来,在最下面,一方面为一线提供资源,另一方面就是捕捉市场的变化,抓住机遇。
所有人都听用户的指令。
员工从过去被动地听领导的指挥、完成领导确定的目标,变成和领导一起听用户的指挥、创造用户需求,共同完成为客户创造价值的市场目标。
管理者最重要的任务不是下指标,而是按照经营体中一线员工的需求,去帮助整合资源。
"海尔集团高级副总裁兼首席市场官周云杰阐述道,"用户的声音能够第一时间传递到企业。
"组织架构未颠覆之前,周云杰每到一个地方,负责人立马上来跟他说,周总,我跟你汇报汇报这里的情况,你对我们的目标要求是什么?然后做方案,请求审批,最后才考虑投入产出比。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在长期运转的项目中,架构的腐化是怎么产生的?为什么常见的面向对象技术无法解决这类问题?如何延缓架构的腐化?本文将尝试解释这一切,并提出相应的解决方案。
读者需要具备相当的开发经验——至少在同一个项目的开发上一年以上;公司负责架构演进、产品演进的角色会从本文找到灵感。
架构架构这个词在各种场合不断地以各种面目表现出来。
从维基百科的词条看来,我们经常听到的有插件架构(Plugin),以数据库为中心的架构(Database Centric),模型-视图-控制器架构(MVC),面向服务的架构(SOA),三层模型(Three-Tier model),模型驱动架构(MDA)等等等等。
奇妙的是,这些词越大,实际的开发者就越痛苦。
SOA很好——但在它提出的那个年代,带给开发者的只是面向厂商虚无缥缈的“公共数据类型”;MDA甚至都没有机会沦为新一轮令人笑话的CASE工具。
在继续阅读之前,读者不妨问自己一个问题:在长期的项目中,这些大词是否真的切实给你带来过好处?更为功利的问题是:你,作为战斗在一线的开发者,在长期项目中可曾有过美好的体验?技术的演变与挥之不去的痛企业应用的发展似乎从十年前开始腾飞。
从Microsoft ASP/LAMP(Linux、Apache、MySQL、PHP)年代开始,各种企业应用纷纷向浏览器迁移。
经过十年的发展,目前阵营已经百花齐放。
与过去不同,现在的技术不仅仅在编程语言方面,常见的编程套路、最佳实践、方法学、社区,都是各种技术独特拥有的。
目前占据主流的阵营有:* Rails* Java EE平台。
值得一提的是Java VM已经成为一种新的宿主平台,Scala、JRuby更为活跃并引人瞩目* LAMP平台。
Linux/MySQL/Apache并没有多少变化,PHP社区从Rails社区获得了不少养分,出现了许多更加优秀的开发框架* Microsoft .NET平台* Django没有理由对这些新技术不感到振奋。
它们解决了许多它们出现之前的问题。
在它们的网站上都宣称各种生产效率如何之高的广告语,类似于15分钟创建一个博客应用;2分钟快速教程等等。
比起过去21天才能学会XXX,现在它们在上手难度上早已大幅度降低。
需要泼冷水的是,本文开篇提出的问题,在上述任何一种技术下,都如幽灵般挥之不去。
采用Ruby on Rails的某高效团队在10人团队工作半年之后,构建时间从当初的2分钟变成2小时;我们之前采用Microsoft .NET 3.5 (C# 3.0)的一个项目,在产生2万行代码的时候,构建时间已经超过半小时;我们的一些客户,工作在10年的Java代码库上——他们竭尽全力,保持技术栈与时俱进:Spring、Hibernate、Struts等,面对的困境是他们需要同时打开72个项目才能在Eclipse中获得编译;由于编译打包时间过长,他们去掉了大部分的单元测试——带来巨大的质量风险。
如果你真的在一个长期的项目工作过,你应该清楚地了解到,这种痛苦,似乎不是任何一种框架能够根本性解决的。
这些新时代的框架解决了大部分显而易见的问题,然而在一个长期项目中所面对的问题,它们无能为力。
一步一步:架构是如何腐化的无论架构师在任何时代以何种绚丽的方式描述架构,开发中的项目不会超出下图所示:基本架构示意一些基本的准则:* 为了降低耦合,系统应当以恰当的方式进行分层。
目前最经考验的分层是MVC+Service。
* 为了提供基础的访问,一些基本的、平台级别的API应该被引入。
用Spring之类的框架来做这件事情。
* 用AOP进行横向切分业务层面共性的操作,例如日志、权限等。
* 为了保证项目正常构建,你还需要数据库、持续集成服务器,以及对应的与环境无关的构建脚本和数据库迁移脚本。
阶段1满足这个条件的架构在初期是非常令人愉悦的。
上一部分我们描述的框架都符合这种架构。
这个阶段开发非常快:IDE打开很快,开发功能完成很快,团队这个时候往往规模较小,交流也没有问题。
所有人都很高兴——因为用了新技术,因为这个架构是如此的简单、清晰、有效。
阶段2好日子不算太长。
很快你的老板(或者客户,随便什么)有一揽子的想法要在这个团队实现。
工作有条不紊的展开。
更多的功能加入进来,更多的团队成员也加入了进来。
新加入的功能也按照之前的架构方式开发着;新加入的团队成员也对清晰的架构表示欣喜,也一丝不苟的遵循着。
用不了多久——也许是三个月,或者更短,你会发现代码库变成下面的样子:正常开发之后你也许很快会意识到这其中有什么问题。
但你很难意识到这到底意味着什么。
常见的动作往往围绕着重构——将纵向相关的抽取出来,形成一个新的项目;横向相关的抽取出来,形成一个名叫common或者base的项目。
无论你做什么类型的重构,一些变化在悄悄产生(也许只是快慢的不同)。
构建过程不可避免的变长。
从刚开始的一两分钟变成好几分钟,到十几分钟。
通过重构构建脚本,去掉那些不需要的部分,构建时间会降到几分钟,你满意了,于是继续。
阶段3更多的功能、更多的成员加入了。
构建时间又变长了。
随着加载代码的增多,IDE也慢了下来;交流也多了起来——不是所有人能够了解所有代码了。
在某些时候,一个很有道德的程序员尝试重构一部分重复逻辑,发现牵涉的代码太多了,好多都是他看不懂的业务,于是他放弃了。
更多的人这么做了,代码库越来越臃肿,最终没有一个人能够搞清楚系统具体是怎么工作的了。
系统在混乱的状态下继续缓慢地混乱——这个过程远比本文写作的时间要长很多,之间会有反复,但据我观察,在不超过1年的时间内,无论采用何种技术框架,应用何种架构,这个过程似乎是不可抗拒的宿命。
常见的解决方案我们并非是坐以待毙的。
身边优秀的同事们在问题发现之前采取了各种解决方案。
常见的解决方案如下:升级工作环境没有什么比一台与时俱进的电脑更能激励开发人员了。
最多每隔三年,升级一次开发人员的电脑——升级到当时最好的配置,能够大幅度的提升生产效率,激励开发人员。
反过来,利用过时的电脑,在慢速的机器上进行开发,带来的不仅仅是客观上开发效率的降低,更大程度上带来的是开发人员心理上的懈怠。
升级的工作环境不仅仅是电脑,还包括工作的空间。
良好的,促进沟通的空间(以及工作方式)能够促进问题的发现从而减少问题的产生。
隔断不适合开发。
分阶段的构建一般而言,构建的顺序是:本地构建确保所有的功能运行正常,然后提交等待持续集成工作正常。
本地构建超过5分钟的时候就变得难以忍受;大多数情况下你希望这个反馈时间越短越好。
项目的初期往往会运行所有的步骤:编译所有代码,运行所有测试。
随着项目周期的变长,代码的增多,时间会越来越长。
在尝试若干次重构构建脚本再也没办法优化之后,“分阶段构建”成为绝大多数的选择。
通过合理的拆分、分层,每次运行特定的步骤,例如只运行特定的测试、只构建必要的部分;然后提交,让持续集成服务器运行所有的步骤。
这样开发者能够继续进行后续的工作。
分布式构建即便本地快了起来,采用分阶段构建的团队很快发现,CI服务器的构建时间也越来越让人不满意。
每次提交半小时之后才能得到构建结果太不可接受了。
各种各样的分布式技术被创建出来。
除了常见的CI服务器本身提供的能力,许多团队也发明了自己的分布式技术,他们往往能够将代码分布到多台机器进行编译和运行测试。
这种解决方案能够在比较长的一段时间内生效——当构建变慢的时候,只需要调整分布策略,让构建过程运行在更多的集群机器上,就可以显著的减少构建时间。
采用JRebel或者Spork一些新的工具能够显著地提速开发人员的工作。
JRebel能够将需要编译的Java语言变成修改、保存立即生效,减少了大量的修改、保存、重新编译、部署的时间;Spork能够启动一个Server,将RSpec测试相关的代码缓存于其中,这样在运行RSpec测试的时候就不用重新进行加载,极大提升了效率。
到底是什么问题?上述的解决方案在特定的时间域内很好地解决了一部分问题。
然而,在项目运转一年,两年或者更久,它们最终依然无法避免构建时间变长、开发变慢、代码变得混乱、架构晦涩难懂、新人难以上手等问题。
到底问题的症结是什么?人们喜欢简洁。
但这更多的看起来是一个谎言——没有多少团队能够自始至终保持简洁。
人们喜欢简洁只是因为这个难以做到。
并不是说人们不愿意如此。
很多人都知道软件开发不比其他的劳动力密集型的行业——人越多,产量越大。
《人月神话》中已经提到,项目增加更多的人,在提升工作产出的同时,也产生了混乱。
短期内,这些混乱能够被团队通过各种形式消化;但从长期看来,随着团队人员的变动(新人加入,老人离开),以及人正常自然的遗忘曲线,代码库会逐渐失控,混乱无法被消化,而项目并不会停止,新功能不断的加入,架构就在一天天的过程中被腐蚀。
人的理解总有一个边界,而需求和功能不会——今天的功能总比昨天的多;这个版本的功能总比上个版本的多。
而在长时间的开发中,忘记之前的代码是正常的;忘记某些约定也是正常的。
形成某些小而不经意的错误是正常的,在巨大的代码库中,这些小错误被忽视也是正常的。
这些不断积攒的小小的不一致、错误,随着时间的积累,最终变得难以控制。
很少有人注意到,规模的变大才是导致架构腐化的根源——因果关系在时空上的不连续,使得人们并不能从其中获得经验,只是一再重复这个悲剧的循环。
解决方案解决方案的终极目标是:在混乱发生之前,在我们的认知出现障碍之前,就将项目的规模控制在一定范围之内。
这并不容易。
大多数团队都有相当的交付压力。
大多数的业务用户并没有意识到,往一个项目/产品毫无节制地增加需求只会导致产品的崩溃。
看看Lotus Notes,你就知道产品最终会多么令人费解、难以使用。
我们这里主要讨论的是技术方案。
业务上你也需要始终对需求的增长保持警惕。
0. 采用新技术这可能是最廉价的、最容易采用的方案。
新技术的产生往往为了解决某些特定的问题,它们往往是经验的集合。
学习,理解这些新技术能够极大程度减少过去为了完成某些技术目标而进行的必要的经验积累过程。
就像武侠小说中经常有离奇遭遇的主人公突然获得某个世外高人多年的内力一样,这些新技术能够迅速帮助团队从某些特定的痛点中解脱出来。
已经有足够多的例子来证明这一观点。
在Spring出现之前,开发者的基本上只能遵循J2EE 模式文档中的各种实践,来构建自己的系统。
有一些简单的框架能够帮助这一过程,但总体来说,在处理今天看起来很基础的如数据库连接,异常管理,系统分层等等方面,还有很多手工的工作要做。
Spring出现之后,你不需要花费很多精力,很快就能得到一个系统分层良好、大部分设施已经准备就绪的基础。
这为减少代码库容量以及解决可能出现的低级Bug 提供了帮助。
Rails则是另外一个极端的例子。