过度工程

简化方程:从过度工程化到高效可扩展解决方案 本章讲述了如何通过避免过度设计来实现高效能的系统架构。以eBay的经历为例,展示了复杂系统可能带来的问题,以及如何通过简化架构来提高系统的可维护性和可扩展性。作者强调,简单的设计不仅能降低成本,还能加快上市时间,增加创新性。 阅读详情

过度工程,最初我知道这个词是在Rod Johnson的《J2EE Development without EJB》,随着阅历地增长,渐渐发现书中熟悉的场景也在身边再现了。

 

敏捷、还有设计模式,给一个团队带来了什么?

我之所以把这两个词放在一起讲,是因为我要说一件显而易见的事情,可是这样一件事情很多人又不愿承认。

团队,是有风格个性的;团队,也是有能力强弱的。不管你承认不承认,整体来说,我们都还不是精英团队,因此相对于某些公司成功的案例来说,我们有很多事是不适合做的。

敏捷强调了主动性,强调了沟通,事实上并不是身边所有的团队都能做好敏捷管理的,譬如一支过于年轻化的团队、一支基本由外包人员构成的团队,甚至一支连转SDV版本都要熬一个通宵的团队,我认为是不适合实施敏捷流程的,至少,大部分所谓的敏捷实践,都是走样的。

关于设计模式,我要说什么?

我可以在板书上用Java和C++写出GoF 23种设计模式中的每个例子,也学习过J2EE Core Pattern,可即便这样,我依然在实际的软件开发中的某些情况下,避免使用它们。因为即便一个设计再过精巧,它依然是要和团队的风格和接受能力想匹配的,我们都是工程商人,公司也不以追求完美的代码为己任,需要的是一个一个项目坚实地交付,可以踏踏实实地赚到钱。

我觉得,“某一些精巧的设计,恰恰是以降低代码的可维护性为代价的”,当然这一句话在不同的团队场景中是不尽相同的。举例来说,一些回调方法、闭包的使用,还有庞大的职责链,都给代码的识别和单步调试带来困难。成熟的开发者,能够克服总想要引入新技术的冲动,并且不会在项目中去写只有少数人才能理解的奥义代码。

我相信会有很多人不认可我的观点,不过我相信并不一定要谁说服谁,有不同的想法经常是好事。

 

分布式对象,我们遇到了什么问题?

为什么使用分布式对象?看起来根本似乎是因为整个解决方案过于庞大了,软件工程中一切不好解决的问题都是由问题复杂引起的。分布式对象在SOA架构中有着不可替代的作用,也许遗憾的是我并不在这里强调问题的严重性,然后“啪”扔出一个传说中的最佳解决之道。

不过开发人员天生的本事就是善于抱怨,分布式对象确确实实带来了许许多多的麻烦,最典型的“阻抗不匹配”,是说无论是人力成本还是性能成本,都把精力耗费在传输对象和领域对象之间的数据交换,甚至数据同步上面。

我还记得Martin Fowlor提到:“分布式对象的第一条准则:不要使用分布式对象”。

举一个产品的例子,我们所有的产品处理逻辑全部都要通过SOAP接口中调用别的部件来实现,本地是没有持久化了的产品对象的,随着这一堆的接口愈加复杂和庞大,许许多多开发人员都希望有一天产品能够同步到本地来,落到存储中,一些流程上的接口性能问题就迎刃而解了,而这些问题,都是自己给自己造的绊脚石。

 

是否有过度的架构和过多的框架代码:

架构的价值在于为常见的问题找到好的解决方案,而不是一心想要解决更复杂也更罕见的问题。

这里遇到一个矛盾,产品的发展过程中,系统架构确实是在不断调整的,这些事情现在就是由开发人员完成的。问题是这过程中,到底应该分析到怎样的粒度?

问题不是分解得越细致、考虑得越多越好。在细节上挣扎得越久,就越难以设计出简洁和清晰的方案来。复杂,是软件的唯一天敌。可是简单的设计,又会令人不住地担心,是否会带来不易解决的问题。

这是一个不可调和的矛盾。其中一个好的办法是做纵向切面,设计一个系统架构时,做一个合适位置的纵向切面,能发现一些潜在的问题,作为可行性分析的重要依据。最典型的例子是性能问题,这些问题到了项目中后期很容易就能将一个工程陷入挣扎的境地。

框架代码是没有净生产力代码的一种。产品的代码,就像一只羽翼丰满的鸟,当这只鸟儿的骨架过于庞大,便难以飞远、飞高。简单的框架代码,意味着较高的可理解性,整个工程对新员工来说,是清晰的,易于业务技能的传递。

 

糟糕的可选性功能:

我们经常听到这样的对话:

——请确认这个功能需要实现吗?

——这个功能目前需要实现,但必须考虑到未来xxx的情形,保持灵活性,请做成配置项:1表示开启;0表示关闭。

于是,我们就有了漫山遍野的配置项。

我认为,这是最糟糕的回答了。我们不是在做一个刚好交付的产品,而是在做一个超级“灵活”的变形金刚,代码里面布满了配置项判断逻辑。

 

又是框架、又是平台……

框架、平台,这是很多学习J2EE的朋友最害怕听到的两个词语。身边似乎有无数这样的东西,产品能不能简单一些?使用硕大的框架和平台确实能够具备一些便利的功能……可是,我真的需要那么多吗?

开始理解代码了,有数种不同格式的模板、不同类型的标签,甚至连会话,都经常需要操作多种类型的会话获取接口。一个问题出现,我们从一个模块定位到另一个模块,从一个抽象层定位到另一个抽象层,最后吐血地发现,不是我们的代码问题,是框架或者平台的问题……

另一个同类产品Dev Portal,就开始尝试采用简洁的框架来实现,也不打算搬迁到什么复杂的平台上了。框架和平台的使用,一定要评估好必要性和影响,能简化的实现就不要作茧自缚,软件的本身,WEB应用的本身,是否就该追求简单的美?

Librepilot _64位window10环境下的搭建及一些坑的解决办法   刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不... 阅读详情

相关推荐

大语言模型推理机制:Prefill、Decode与KV Cache解析

Transformer架构中的推理过程涉及Prefill、Decode和KV Cache三个关键技术阶段。Prefill阶段负责将输入文本转换为token序列并生成初始隐藏状态,其计算复杂度与输入长度成正比。Decode阶段则以自回归方式逐token生成输出,依赖KV Cache存储历史键值对来避免重复计算。KV Cache作为核心优化机制,通过智能管理对话记忆显著提升推理效率。这些技术在聊天机器人、代码生成等场景中至关重要,特别是KV Cache的内存优化策略直接影响大模型在边缘设备等资源受限环境中的部署

weixin_30664615的博客 436

防止过度工程-[拒绝完美主义]

引用自自http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy 我在工作中也常常出现这样的问题,过度追求完美,未来的东西,而给当前带来不必要的麻烦。 正文: 人的脑子真是奇妙的东西。虽然大家都知道过度工程(over-engineering)不好,在实际的工程中却经常不由自主的出现过度工程。我自己也犯过好多次这种错...

weixin_30488085的博客 179

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4132

“过度设计”之真实例子

  我刚到了一家新公司,公司给我的感觉很不错,不过当开始做第一个项目时便有过度设计的嫌疑,项目不大,基本就实现CURD的功能,用struts2+spring+ibatis+extjs。拿我开发的一个简单的功能来讲,就花了大概一周,如果采用简化的技术,实际上可能只需要一两天。   设计太多的分层,以及偶和性太高,添加或修改一个模块太困难了,而且还不知道会不会影响到其它模块。按照项目定义的规范做...

lpn5200的博客 1469

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

dayuhaitang1的博客 2551

抛弃EJB(EJB2.0,EJB3.0,EJB4.0)

[b]关键词:EJB,JEEE,Spring,OO,需求至上,J2EE Without EJB[/b] 作为一个EJB的使用者,也是受害者,对EJB虽然谈不上深恶痛绝,但也达到了敬而远之的地步。必须要强调的是EJB不是J2EE,它只是J2EE很小的一部分,EJB既不是完美的也不是必须的。 我非常反对在项目中使用EJB,它给项目带来的复杂性甚至超过了项目本身。曾有人说过:你要么把事情做的尽可...

来杯咖啡,随便聊聊。 1173

【华为OD机试真题】390、AI面板识别 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。   由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),   请输出先行后列排序的指示灯的编号,排序规则:   1、每次在尚未排序的灯中挑选最高的灯作为的基准灯   2、找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行(即两个灯坐标的差 ≤ 灯高度的一半)

KJ.JK 1804

J2EE项目10大风险

避免本文所列之10大J2EE风险,确保企业级Java项目成功 作者:Humphrey Sheil 翻译:Blueski 说明: 本文已在51CMM网站《中国系统分析员》杂志第3期刊载。 原文在 http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-ten.html ----------------------------------------

Funny Min的专栏 1306

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 956

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

为何“过度工程”会发生

《警惕"过度工程"陷阱:简单架构才是成功前提》 摘要:本文剖析了软件工程中普遍存在的"过度工程"现象,即构建远超实际需求的复杂系统。通过Levels.fyi、Airbnb等案例对比,揭示成功的早期产品往往采用极简架构(如Google表单)快速验证价值,而非堆砌Kubernetes/微服务等"未来技术"。文章指出过度工程源于提前优化、简历驱动等动机,导致交付延迟、成本飙升等代价,并提出16条实用原则(如YAGNI、模块化单体优先)帮助团队保持理性。最

2301_79342058的博客 881

【100%通过率】华为OD机试真题 Python 实现【最多组合直角三角形个数】【2023 Q1 | 100分】

有N条线段,长度分别为a[1]-a[n]。 现要求你计算这N条线段最多可以组合成几个直角三角形。 每条线段只能使用一次,每个三角形包含三条线段。

MISAYAONE的博客 1万+

防止过度工程

人的脑子真是奇妙的东西。虽然大家都知道过度工程(over-engineering)不好,在实际的工程中却经常不由自主的出现过度工程。我自己也犯过好多次这种错误,所以觉得有必要分析一下,过度工程出现的信号和兆头,这样可以在初期的时候就及时发现并且避免。 过度工程即将出现的一个重要信号,就是当你过度的思考“将来”,考虑一些还没有发生的事情,还没有出现的需求。比如,“如果我们将来有了上百万行代码,有了几...

ailinyingai的博客 243

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

过度工程宣言用最复杂的方式问好

OverHelloWorld 是当框架、模式和脆弱的自尊心碰撞时诞生的产物。仅仅因为你能做到,并不意味着你应该这样做。所以下次当你对“你好”这样的简单场景也跃跃欲试想上CQRS时,不妨问问自己:这究竟是为了用户体验——还是为了简历镀金?

九十分的博客 738

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

最佳实践和过度工程之间的狭窄道路

几天前,我读了Petri Kainulainen的一则有关最佳实践的阴暗面的文章。 他确实在一方面打出了恕我直言的想法,这是完全显而易见的常识,但可悲的是,事实并非如此。 不要误会我的意思。 最佳实践是软件开发的重要组成部分,我对此表示大力支持。 每个开发人员都应该阅读诸如《四人帮的设计模式》,《 Fowlers重构》或《企业体系结构模式》等书籍。 我坚信自动测试和TDD方法会为您提供随...

danpu0978的博客 114

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

vue 页面之间的过度_最佳实践和过度工程之间的狭窄道路

vue 页面之间的过度 几天前,我读了Petri Kainulainen的一则有关最佳实践的阴暗面的文章。 他确实在一方面打出了恕我直言的观点,这是完全显而易见的常识,但可悲的是,事实往往并非如此。 不要误会我的意思。 最佳实践是软件开发的重要组成部分,我对此表示大力支持。 每个开发人员都应该阅读诸如《四人帮的设计模式》,《 Fowlers重构》或《企业体系结构模式》等书籍。 我坚信自动测...

danpu0978的博客 224

如何避免硬件设计过度工程化的成本浪费

硬件设计过度工程化指设计过程中超出实际需求的复杂性和成本投入,例如添加用户不需要的额外功能或采用性能远超需求的昂贵组件。

柚橙论 763

提示工程避坑:情感智能设计中不要过度的3个场景

过度情感解读指AI系统超出合理范围挖掘用户输入中的情感线索,将中性信息解读为情感信号,或对模糊情感表达做出确定性判断的现象。从客观陈述中强行解读情绪(如"今天开会了"→"听起来会议让你很疲惫?")对模糊情感表达做过度归因(如"还好"→"你是不是在压抑负面情绪?")跨模态情感信号的错误关联(如识别到用户打字速度慢→"你看起来很沮丧")过度个性化情感响应指AI系统过度依赖用户历史情感数据(如过去的情绪记录、创伤经历、敏感话题)定制当前回应,导致隐私侵犯、刻板印象或情感绑架的现象。

专注搜索引擎技术 869

一周技术思考(第30期)-不要成为过度工程化的牺牲品

大家好,这里记录,我每周读到的技术书籍、专栏、文章以及遇到的工作上的技术经历的思考,不见得都对,但开始思考总是好的。1Spring是工程化,依赖注入框架,可以允许用户通过约定或者注解,...

新栋BOOK 236

Prompt 工程十大误区:从过度设计到缺少评测

十个误区的共同根源:缺乏评测体系。没有评测,过度设计是唯一的选择——你不知道哪个约束有用,只好全部加上。没有评测,万能 Prompt 是自然的结果——你不知道不同场景的表现差异,只好一锅炖。没有评测,版本管理是多余的——你不知道改动效果,回滚无从谈起。先建评测集:50 条以上,覆盖多场景。用评测集驱动调优:每次改动有数据支撑。Prompt 保持简洁:只写必要约束,多余约束删掉。版本化管理:Git + CI,改动可追踪可回滚。按模型适配:不同模型用不同策略,不要一刀切。

m0_50889382的博客 5132

续:过度工程

在上一篇博客中,提到了几种常见的过度工程,然而不幸的软件团队有各自的不幸,故事似乎远不止这么多。     又见可扩展性,到底要扩展到什么时候? 见过一些同事,写代码处处考虑灵活、兼容,已经易扩展,一个简简单单的类实现,硬生生地被拆成从接口到抽象类到策略接口到策略实现类到辅助类到工具类十几个类来完成,和可是结果呢?还没等扩展开始,项目就黄了;或者某心态居高的程序员看到了,看着不爽,想不明白,...

四火专栏 197

拒绝过度工程:如何治愈技术项目中的“过度思考”与“范围蔓延”

你是否陷入过“想太多”或“顺手改一下”的陷阱,导致项目延期甚至烂尾?本文深入剖析过度思考与范围蔓延的根源,为你提供 MVP 思维与功能开关等实战策略,助你拒绝过度工程,回归交付本质 🚀。

weixin_44063643的博客 570

过度工程 vs 简单实现对比表

| 场景 | ❌ 过度工程化 | ✅ 简单优先方案 | |------|---------------|----------------| | 数据验证 | 创建验证框架、抽象类、接口 | 编写几个验证函数 | | API端点 | 设计复杂中间件系统 | 直接处理请求和响应 | | 错误处理 | 构建完整的错误处理层级 | 使用try-catch处理具体错误 | | 配置管理 | 创建配置解析器、

gitblog_00493的博客 413

Andrej Karpathy Skills:解决LLM过度工程化问题的5个实用技巧 [特殊字符]

大型语言模型在编程时常常陷入过度工程化的陷阱,导致代码变得复杂、难以维护。Andrej Karpathy Skills项目通过一套简洁的指导原则,有效解决了LLM过度工程化问题,让AI助手写出更简洁、更实用的代码。本文将分享5个关键技巧,帮助你避免常见的LLM编码陷阱。 ## 📋 技巧一:先思考后编码,避免隐藏假设 LLM最常见的错误是**默默做出假设并直接执行**,而不是先澄清需求。根据K

gitblog_00194的博客 676
上一篇: JavaScript重构(八):JSDoc和JSLint
下一篇: 过度工程
RayChase
博客等级 码龄20年 71粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值