过度工程,最初我知道这个词是在Rod Johnson的《J2EE Development without EJB》,随着阅历地增长,渐渐发现书中熟悉的场景也在身边再现了。
敏捷、还有设计模式,给一个团队带来了什么?
我之所以把这两个词放在一起讲,是因为我要说一件显而易见的事情,可是这样一件事情很多人又不愿承认。
团队,是有风格个性的;团队,也是有能力强弱的。不管你承认不承认,整体来说,我们都还不是精英团队,因此相对于某些公司成功的案例来说,我们有很多事是不适合做的。
敏捷强调了主动性,强调了沟通,事实上并不是身边所有的团队都能做好敏捷管理的,譬如一支过于年轻化的团队、一支基本由外包人员构成的团队,甚至一支连转SDV版本都要熬一个通宵的团队,我认为是不适合实施敏捷流程的,至少,大部分所谓的敏捷实践,都是走样的。
关于设计模式,我要说什么?
我可以在板书上用Java和C++写出GoF 23种设计模式中的每个例子,也学习过J2EE Core Pattern,可即便这样,我依然在实际的软件开发中的某些情况下,避免使用它们。因为即便一个设计再过精巧,它依然是要和团队的风格和接受能力想匹配的,我们都是工程商人,公司也不以追求完美的代码为己任,需要的是一个一个项目坚实地交付,可以踏踏实实地赚到钱。
我觉得,“某一些精巧的设计,恰恰是以降低代码的可维护性为代价的”,当然这一句话在不同的团队场景中是不尽相同的。举例来说,一些回调方法、闭包的使用,还有庞大的职责链,都给代码的识别和单步调试带来困难。成熟的开发者,能够克服总想要引入新技术的冲动,并且不会在项目中去写只有少数人才能理解的奥义代码。
我相信会有很多人不认可我的观点,不过我相信并不一定要谁说服谁,有不同的想法经常是好事。
分布式对象,我们遇到了什么问题?
为什么使用分布式对象?看起来根本似乎是因为整个解决方案过于庞大了,软件工程中一切不好解决的问题都是由问题复杂引起的。分布式对象在SOA架构中有着不可替代的作用,也许遗憾的是我并不在这里强调问题的严重性,然后“啪”扔出一个传说中的最佳解决之道。
不过开发人员天生的本事就是善于抱怨,分布式对象确确实实带来了许许多多的麻烦,最典型的“阻抗不匹配”,是说无论是人力成本还是性能成本,都把精力耗费在传输对象和领域对象之间的数据交换,甚至数据同步上面。
我还记得Martin Fowlor提到:“分布式对象的第一条准则:不要使用分布式对象”。
举一个产品的例子,我们所有的产品处理逻辑全部都要通过SOAP接口中调用别的部件来实现,本地是没有持久化了的产品对象的,随着这一堆的接口愈加复杂和庞大,许许多多开发人员都希望有一天产品能够同步到本地来,落到存储中,一些流程上的接口性能问题就迎刃而解了,而这些问题,都是自己给自己造的绊脚石。
是否有过度的架构和过多的框架代码:
架构的价值在于为常见的问题找到好的解决方案,而不是一心想要解决更复杂也更罕见的问题。
这里遇到一个矛盾,产品的发展过程中,系统架构确实是在不断调整的,这些事情现在就是由开发人员完成的。问题是这过程中,到底应该分析到怎样的粒度?
问题不是分解得越细致、考虑得越多越好。在细节上挣扎得越久,就越难以设计出简洁和清晰的方案来。复杂,是软件的唯一天敌。可是简单的设计,又会令人不住地担心,是否会带来不易解决的问题。
这是一个不可调和的矛盾。其中一个好的办法是做纵向切面,设计一个系统架构时,做一个合适位置的纵向切面,能发现一些潜在的问题,作为可行性分析的重要依据。最典型的例子是性能问题,这些问题到了项目中后期很容易就能将一个工程陷入挣扎的境地。
框架代码是没有净生产力代码的一种。产品的代码,就像一只羽翼丰满的鸟,当这只鸟儿的骨架过于庞大,便难以飞远、飞高。简单的框架代码,意味着较高的可理解性,整个工程对新员工来说,是清晰的,易于业务技能的传递。
糟糕的可选性功能:
我们经常听到这样的对话:
——请确认这个功能需要实现吗?
——这个功能目前需要实现,但必须考虑到未来xxx的情形,保持灵活性,请做成配置项:1表示开启;0表示关闭。
于是,我们就有了漫山遍野的配置项。
我认为,这是最糟糕的回答了。我们不是在做一个刚好交付的产品,而是在做一个超级“灵活”的变形金刚,代码里面布满了配置项判断逻辑。
又是框架、又是平台……
框架、平台,这是很多学习J2EE的朋友最害怕听到的两个词语。身边似乎有无数这样的东西,产品能不能简单一些?使用硕大的框架和平台确实能够具备一些便利的功能……可是,我真的需要那么多吗?
开始理解代码了,有数种不同格式的模板、不同类型的标签,甚至连会话,都经常需要操作多种类型的会话获取接口。一个问题出现,我们从一个模块定位到另一个模块,从一个抽象层定位到另一个抽象层,最后吐血地发现,不是我们的代码问题,是框架或者平台的问题……
另一个同类产品,就开始尝试采用简洁的框架来实现,也不打算搬迁到什么复杂的平台上了。框架和平台的使用,一定要评估好必要性和影响,能简化的实现就不要作茧自缚,软件的本身,WEB应用的本身,是否就该追求简单的美?
文章系本人原创,转载请注明作者和出处
分享到:
相关推荐
大型临时设施和过度工程.docx
什么 此包含我的网站的源代码和内容。 内容以诸如纯文本友好的标记格式创作,并使用动态堆栈(如下所述)进行投放。 可以部署新代码,并通过git push添加或更新内容。 叠放 :声明式的,面向组件的视图层。...
过度锅炉房一期工程环保工程招标技术文件.pdf
某省总工会干校过度食堂工程施工组织设计_房建建筑工程施工组织设计方案.rar
matlab的素描代码自动驾驶汽车 Aalto AS-0.3200项目工作:遥控模型车的控制系统和UI。 包括用于Atmel AVR微控制器的车载计算机代码(最初为Arduino草图),包括用于在Matlab中模拟所有这些的概念验证模块,用于...
某省总工会干校过度食堂工程施工组织设计.docx
某省总工会干校过度食堂工程施工组织设计.doc
某省总工会干校过度食堂工程施工组织设计(DOC29页).doc
建筑施工组织2021-某省总工会干校过度食堂工程施工组织设计.doc
建筑和工程行业周报:基建资金来源无需过度担忧,Q4建筑基金持仓大幅回暖.pdf
建筑和工程行业周报:基建资金来源无需过度担忧,Q4建筑基金持仓大幅回暖
避免过度工程 生命周期前的挂钩 代码状态: 指导方针 代码样例 1。 成分 完毕 2。 道具 完毕 3。 状态 完毕 4, 样式一致 完毕 6, 文件扩展名的一致性 -- 7。 语义HTML 完毕 8。 ContextAPI 完毕 9。 ...
flickrassignment版本1.0 使用Xcode 12.4进行编译支持iOS 13及更高版本使用Swift 没有使用第三方库支持纵向和横向使用MVVM架构编写了一些单元测试和UI测试避免过度工程功能•用户可以通过在搜索栏中写入带有特定搜索...
我知道在这样的项目中使用Rails可能会被认为是过度工程。 无论如何,我想使用另一个Ruby框架(例如 )或另一种编程语言(例如 , , 或来构建同一项目。 只是为了好玩。关于本网站由提供支持通过HTML标记通过 +CSS...
这个班级可能是过度工程的人。 要对Lua进行编码,只需创建一个JSON,将“ []:”替换为“ {} =“,然后在字符串之前插入“ return”。 限制是一样的。使用情况 // Encodevar luaTableString : String = ...
React RxJS Todo目标表现简单代码使用React && RxJS 在其他项目中稍后要关注的设计概念响应式设计一段时间后还引入了PWA和Web组件等等过度工程图书馆主要的 (使用@types) (带有@types) 子 表现健康)状况我试图...
AVSimulator2k15 此调整不是防病毒软件。 通过不断告诉用户其防病毒软件... 我们必须进行过度工程以最大程度地增加烦恼。 这是一个好主意吗? 谁在乎。 在2015年安装防病毒软件之前,您应该已经想到了这一点! GPL v3。