在项目开发最初的时候,他也有过一段狂欢般的快乐时光,不久之后,事情就越来越艰难。

项目的代码越来越难以维护,工作越来越像是一种煎熬,合作的同事对他越来越不满。

“该是与这个项目,与这个公司说 bye bye 的时候了”,他想。他换了一家公司,涨了一点工资,开始了另一段狂欢。

周而复始,一年又一年过去了。随着年龄的增长,他不再能够从软件开发中享受到乐趣,软件开发的职业生涯,对于他而言痛苦多于快乐。

学习新的技术,他也比不上年轻人。运气好的话,他可以完全脱离开发,转去做管理、做产品设计、做业务,运气不好的话,

他只得继续做开发,因为毕竟还要养家糊 口。“继续混着呗”,他悲观地想。他从一家公司换到另一家公司,从一次失败,走向 另一次失败,他始终都是一个loser。

在笔者所在的公司里面,有一个很重要的项目,最初的架构师(不止一个人)在错 误的架构设计风潮的影响下,决意把这个项目设计成一个全分布式的系统。

他们设计了 十几个分布式服务,相互之间通过 WebService 通信。他们还引入了一个开源的 ESB (企业服务总线)中间件——Mule。项目开发的鼎盛时期,

曾经有二十几个开发人员, 每个人负责开发不同的分布式服务。因为架构师对这些程序员缺乏必要的指导和控制, 不再关心最初画的那些架构图,

他们开始自行其事,只求尽快完成手头的工作早点下班。应该提前做一些压力测试!项目的开发人员,离职的越来越多,也包括最初的架构师,

每个程序员只熟悉自己负责的一小块工作,相互之间缺乏沟通和协作。这个项目的概念 完整性很快就遭到了破坏,架构师所画的架构图,在代码实现中消失了。

程序员很快就 十几个分布式服务所导致的大量远程调用给系统的性能和可伸缩性带来了巨大损失,每 一个远程调用都有可能出错,全部可能出现的异常情况难以计数,

极大增加了异常处理 的开发和测试工作量。同时给配管、运维人员的发布工作也带来了巨大的困难,每一次 的上线发布都像是一次艰难的战役。Mule 这个中间件,

并不适用于大流量互联网应用 的环境,其性能和可伸缩性有很大的问题。最初引入 Mule 时,架构师甚至都没有想到 最后只剩下了 4 个人。这么少的人很难维护十几个分布式服务,

架构师只好决定将 Mule 完全废弃掉,将十几个分布式服务合并为三个相对独立的集中式应用,将远程调用改为 了本地方法调用。这样做起码配管、运维人员的工作能够大幅减少。

然而,这种合并仅 仅是把代码简单地合在一起,原先因为存在十几个分布式应用,程序员自行其事,所导 致概念完整性遭受的破坏,仍然完全没有解决,因此这个项目的代码仍然难以维护。

这 真是一个 design by buzzword 的典型案例,软件开发的很多反模式都可以在这个项目 中找到。这个项目的开发人员流动性很大,一个重要原因是他们无法从这个项目中获得 开发的乐趣。

--摘自 dddquickly

dddquickly的更多相关文章

  1. 领域驱动设计和Spring

    原文 http://static.olivergierke.de/lectures/ddd-and-spring/ 1.介绍这篇文章是的介绍一下领域驱动设计的基础构件.概念和Java的web应用(主要 ...

随机推荐

  1. Spring MVC详解

    Spring MVC 教程,快速入门,深入分析 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 目录  一.前言二.spring ...

  2. linux 批量测试域名返回码脚本

    需求:应用要求覆盖host并测试 1.创建一个host.txt的文件来存放需要修改的host记录 2.过滤出host.txt域名列并新生成一个curl.txt文件 cat host.txt |awk ...

  3. webstorm主要快捷键

    1.  必备快捷键 Ctrl+/:注释当前行    F11:全屏    Alt+数字:切换打开第N个文件    Ctrl+Shift+P:打开命令面板    Ctrl+P:搜索项目中的文件    Ct ...

  4. 微信小程序语音与讯飞语音识别接口(Java),Kronopath/SILKCodec,ffmpeg处理silk,pcm,wav转换

    项目需求,需要使用讯飞的语音识别接口,将微信小程序上传的录音文件识别成文字返回 首先去讯飞开放平台中申请开通语音识别功能 在这里面下载sdk,然后解压,注意appid与sdk是关联的,appid在初始 ...

  5. 【Android】onNewIntent调用时机

    在IntentActivity中重写下列方法:onCreate onStart onRestart onResume onPause onStop onDestroy onNewIntent一.其他应 ...

  6. python运算符——算数运算符

    加减乘除比较简单这里不多赘述了,print(2 +-*/ 3),唯一需要注意的就是整除运算,符号是“//”,整除运算取的是整数部分,而不是四舍五入哦! print(5 / 2)    这个运行的结果是 ...

  7. 反素数ant HYSBZ - 1053(数学+dfs)

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质 ...

  8. selenium之使用chrome浏览器测试(附chromedriver与chrome的对应关系表)

    https://www.cnblogs.com/JHblogs/p/7699951.html

  9. Android Studio 常用快捷键及常用设置

    Android Studio 常用快捷键及常用设置 一.常用快捷键 快捷键 描述 Ctrl + Alt + L 格式化代码 Ctrl + ( +/- ) 展开/折叠 代码块 Ctrl + Shift ...

  10. django——url(路由)配置

    URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被 ...