读书笔记之二—大泥球和顶级的设计

2023-05-16

大泥球——世界上最常用的软件体系结构,一个经久不衰的传奇。

大泥球是一件很神奇的事情,阅读文章里列举了大泥球出现的一系列原因,但是我们貌似很少在其他的领域看到这么不专业的专业行为,从这个角度看看,不妨稍稍刨根问底一下。

我觉得首先有个成本问题——软件开发可以说是没有物质成本的。可以看到大泥球能够工作,而且,造成一个大泥球并不比有道理的开发架构需要更多的物质成本,多调几个大泥球经费也不会被马上耗光——一个失败的设计在量产时需多焊很多的电路板可能会马上被产品经理批评——相反,软件工程中的大泥球还能提高时间效率,它能减少了架构设计的思考占用的时间——这一点我还是很有体会的,之后我会提到之前的课程学习经历来简述我的体验。

另外文章说到的能见度也是一个有趣的原因,闭源的软件产业使得产品和设计的分离,设计对于用户乃至其他开发人员来说常常是不可见的,软件开发者并不在意软件的内部架构在用户看起来是什么样,反正你也看不到,软件就像是一个神奇的魔法盒子,不管它怎么工作的,反正有用。

对于软件开发,效率是至关重要的,代码重用是提高效率的一个重要思想,但是正如文章所说也是风险,一个仅需要适应当前需求的架构可以快速完工并且投入工作,但当需求变更来临的时候怎么办?架构扩充还是一件小事,有时候新的需求甚至可能会扰动架构的根基,在这英雄的悲剧时刻通常有两种选择:

1.推翻架构的一部分或者全部以适应新的需求,再开始新的编码——无论是一部份还是全部,架构的改变都可能影响架构之上的其他代码,你都不得不考虑兼容性,一旦兼容无法实现又是另一出悲剧,就算侥幸地架构师是一个天才,几天几夜的设计之后,更新的架构能够承担新的需求并且完美兼容之前上层建筑,那么——用户说他还想要来一个新需求呢?

2.或者为了开始一段架构之外的罗曼,作为一个补充,有时候可以在架构之外补充一段代码,横跨底层至用户界面,就像一栋精致的别墅从地板到天花板被开了一个洞,露出了一根电线杆。同样地,再来几根,一颗裹着别墅的大泥球诞生了。

为了避免这些悲剧的发生,一个勇敢的架构师说,我们应当预先考虑大部分可能来临的需求,我们的架构需要在实现当前需求的时候,同时拥有良好的可扩展性,新需求来临的时候只要扩充就可以了。为了提供预留的这些需求以扩充实现的,便不再有眼前需要设计的小屋,而是一座城市。这个架构本身就需要足够多时间去设计和建造,相比架构本身,需要实现的功能才成了真正的小部分。结果延长了工程周期,很多人认为这不值得,而且也没人相信有一个牛逼的架构能够轻易地扩展实现不讲理的一切用户需求,即便有这样牛逼的架构,也没有这样牛逼的人……

回过头来谈谈实际,我作为一个不偏向于大泥球的程序员,一定是对良好架构有这特殊坚持和憧憬的。因为我的理论是没有架构的工程就像是不写函数的程序……增加项的工作量是平方的甚至是指数,那是要死……那不科学……我理解中架构的一个有点就是层次地整理可以重用的代码来减少代码量,提供可维护性,缺点在于不灵活,然后对于经验不足的初学者来说,开发周期有时候是更长的。还有一点,当一个人做的不完全是真正的产品,而是一个试验品、或者说是简历填充物的时候,能见度原因就不起作用了,因为要是说代码给别人一看,让别人觉得,这TM写的一坨大……肯定没有前途。所以我必须坚信写软件要有架构。

我大二上的Java大作业和大二下面向对象大作业,基本都是一个人写的Java小游戏,是个泥球vs设计的正面例子。

Java大作业就像一个大泥球,我只求每个单位只管自己的所有逻辑,能够运行,有点像用FlashAS写小游戏的感觉,最后我做出了一个可以玩的版本,只有三个游戏单位,三种子弹,三种效果,一个不太完善不容易制定的固定规则和友好度较差的界面。开发时间之有大约两周,也算有始有终了。

当我在大二下应对面向对象大作业的时候,我觉得有了上次的经验,这回我应该能不太费力地写出一个游戏内容更丰富一些的游戏,增加了一些目标的游戏内容量和网络联机功能,等于是对原来的Java大作业作一个扩充。这个时候,我发现逐个单位去考虑各自的逻辑是个噩梦,工作量太大了,而且不便维护,从而开始考虑一个架构。举个架构主要功能来说:希望用一套逻辑抽象来所有类型的单位,然后以数据文件来定义不同单位的逻辑,这样就需要一个能够用动作跳转的数据结构来控制单位运动逻辑架构,而且这个动作结构又万能。仿照我之前接触过的游戏数据形式,我进行着这方面的尝试,结果大约从开始集中注意力写作业到一个月过去之后,基本以失败告终,因为剩下的时间已不多了,剩余工程已经非常巨大,光游戏逻辑还有几十个类没有实现,类之间的工作互相依赖,逐个单元测试工作量也极其大。眼看快要到死期了,果断放弃了新架构的设计,转而使用简化的代码状态机(而非数据状态机)编写。最后的情况是一个简略得多的架构完成了整个场景只有四种游戏物体的游戏,然后有网络联机功能,一坨翔。

不服,果然在之后的大二暑假我还是用C++和DX完成了之前未完成的架构。花了我一暑假。而且在架构实现和游戏实现的过程中,遇到了一些架构设计时未考虑的问题导致游戏实现过程也在反复修改架构,这经验太宝贵我会出去随便乱说?

有了这次失败之后我认识到架构设计有难度的……首先设计就是有难度的。然后实现是更有难度的。而且我坚信了,一定没有人会愿意用一套动作游戏的动作引擎来编写动作相对简单的射击类游戏的!动作游戏需要动作引擎是因为的具体单位的动作编写复杂性太高需要的代码太多了!而我做的游戏是动作射击游戏!

我一瞬间懂了,所以架构的设计是目标驱动的,如果没有一个合适的目标,大泥球还是更合适一点。没有足够经验的开发人员希望借助一个nb的架构减少自己的工作量是愿景很美好。而且你不能说要做成什么样我马上就设计成什么样,首先我要试一下。

这些经验我带到了软件工程大作业中,鉴于经验还不足够多到能马上给出一个足够优秀的架构,而且游戏内容必须不能太少以至于不能改变世界,我很谨慎地先制定好了游戏设计的需求,坚决不要考虑基本不需要的功能,首先使用一个“架构非常简单+只有少量基本单位+部分地方由小泥球组成”的原型工程,来看看架构设计的需要。然后才和安然开始正式的架构设计,并且和团队开始完整的开发。如此慢步前进,虽然工程开始的时间相对其他小组较晚,但是……大作业能够追求一体成型(希望)……

学生团队有一个好,就是架构设计搓了,也还不要紧,不至于流落街头要饭,回头还能滚泥球一下。这使得我们有机会积累更多的软件工程经验,避免今后真正进入职业了,也只能天天往工程里塞泥巴。我也以为大泥球依然在正牌软件架构中有极高市场占有率的原因,是太多软件工程不敢有足够宏伟的目标、承担不起时间和尝试的成本(也就是没有足够NB的架构设计师嘛)。不经历风雨,怎见得彩虹?一个PM既得要堆过泥巴,也有过足够多的失败设计,才能有一天能够站出来,给出一个顶级的设计,力挽狂澜。

转载于:https://www.cnblogs.com/skyjoker/archive/2012/11/13/2768903.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读书笔记之二—大泥球和顶级的设计 的相关文章

随机推荐

  • Ubuntu下提升当前用户权限到root权限的坑与出坑方法

    由于使用gedit过程中很多时候权限不足 xff0c 想到将普通用户的权限提升为root权限的用户 经过问百度 xff0c 有博客说通过修改 34 etc passwd 34 文件 xff0c 提升用户权限 如博客 xff1a https
  • MariaDB 表的基本操作(3)

    MariaDB数据库管理系统是MySQL的一个分支 主要由开源社区在维护 采用GPL授权许可MariaDB的目的是完全兼容MySQL 包括API和命令行 MySQL由于现在闭源了 而能轻松成为MySQL的代替品 在存储引擎方面 使用Xtra
  • 流程审批设计

    这是我的项目中使用的一套关于工作流和审批流的配置 xff0c 算是比较简单的 xff0c 这里只写其中比较核心的思路 xff0c 算是对之前工作的一个技术总结吧 以下是数据库设计 xff1b 后面再跟据实例分析每个表的作用 首先是流程配置表
  • 文件流写到ftp服务器,采用ftpclient.storeFile(String, Inputstream)将流写到服务器,没报错但服务器上没有文件,这是怎么回事...

    满意答案 qingjixiaolan 推荐于 2018 04 27 创建一个FtpClient对象 FTPClient ftpClient 61 new FTPClient 上传文件 读取本地文件 file xff1a 需要上传的文件地址
  • TSA not available (for R version 3.6.3) 解决方法

    安装包 全部安装包路径 xff1a https cran r project org src contrib Archive TSA下载路径 xff1a https cran r project org src contrib Archiv
  • android banner设置图片比例,Banner基本使用 2.1.0

    Step 1 依赖banner Gradle dependencies compile 39 com youth banner banner 2 1 0 39 Step 2 添加权限到你的 AndroidManifest xml Step
  • int,bool,字符串知识总结

    一 xff1a int整数类型 bool类型 一 xff1a int类型 xff0c 整数 1 xff0c bit length 返回一个数的二进制长度 a 61 5 0 1 10 11 100 101 print a bit length
  • postgresql从库搭建

    1 复制类型 PostgreSQL支持物理复制 xff08 流复制 xff09 及逻辑复制2种 通过流复制技术 xff0c 可以从实例级复制出一个与主库一模一样的实例级的从库 流复制同步方式有同步 异步两种 另一种复制方式为逻辑复制 xff
  • NotePad 快捷键

    转载于 https www cnblogs com pxzbky p 11567346 html
  • 网络通信原理和过程

    当时查http协议的时候了解的一些网络底层的知识 xff0c 感觉挺有意思的 xff0c 就把多位博主的资料整料梳理出来整理到一堆 xff0c 就当是一篇科普文吧 一 网络的五层模型 如何分层有不同的模型 xff0c 有的模型分七层 xff
  • Springboot读取本地图片并显示

    在application xml中配置url访问路径和本地图片路径 xff1a 配置 url中访问路径 xff0c 这里为 xff1a localhost 8080 image 配置 本地图片保存的路径 xff0c image会根据D up
  • vue路由跳转到指定页面

    1 this router push name 39 Home 39 2 this router push path 39 view 39 3 this router replace name 39 Home 39 4 this route
  • Post方式提交,通过上下文HttpContext,Request[""]获取

    问题场景如下 xff1a 在项目的一般处理程序中 xff0c 所有方法都是通过 context Request 34 参数名 34 ToString 来获取参数的值 如果我直接将参数追加到URL后面 xff0c 直接Post xff0c 后
  • maven项目添加mysql的链接驱动

    Maven项目中添加JDBC驱动 在pom xml配置文件中添加 lt dependency gt lt groupId gt mysql lt groupId gt lt artifactId gt mysql connector jav
  • 2.5年, 从0到阿里

    从来没有想到自己的求职之路会这么顺利 第一次投阿里就拿到了offer 以前一直都是做好被刷的准备的 3月31号晚上收到了来自阿里的正式offer 签下录取意向书 粗略算了一下 从2012年9月份正式入学进入计算机系到2015年3月签下阿里o
  • 我的2013—弃金融IT,从SAP业务

    我的2013 xff0c 是动荡的一年 xff1b 这一年 xff0c 我跳巢了 xff1b 这一年 xff0c 我换行业了 xff1b 这一年 xff0c 我离开了生活5年的长春 xff0c 来到成都 xff1b 这一年 xff0c 我放
  • [转载]LazyWriter(惰性写入器) 进程的作用

    Q What Does the LazyWriter Process Do The LazyWriter process is a periodic process that checks the status of BPool buffe
  • Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫 爬取百度百科关键词1000个相关网页 标题和简介 网站爬虫由浅入深 xff1a 慢慢来 分析 xff1a 链接的URL分析 xff1a 数据格式 xff1a 爬虫基本架构模型 xff1a 本爬虫架构 xff1a 源代码
  • python2:TypeError: must be string without null bytes, not str

    Stack Overflow QuestionsDeveloper JobsTagsUsers Log In Sign Up Join Stack Overflow to learn share knowledge and build yo
  • 读书笔记之二—大泥球和顶级的设计

    大泥球 世界上最常用的软件体系结构 xff0c 一个经久不衰的传奇 大泥球是一件很神奇的事情 xff0c 阅读文章里列举了大泥球出现的一系列原因 xff0c 但是我们貌似很少在其他的领域看到这么不专业的专业行为 xff0c 从这个角度看看