闲谈简单设计(KISS)疑惑

       忙碌了一年了项目又到了交付了,虽然项目能成功上线(因为还有维护支持的团队)。但是个人从技术上看,这是一个不那么成功的项目,因为后期艰难的修复bug,添加feature。这与简单设计有什么关系呢?在某模块开发起初,由于架构的经验预见性的告诉我这模块开发中会出现什么问题,所以选择了提出某些比较好的解决方案,但是由于团队成员一致的所谓简单设计,通过TDD,重构达到”合适”的”完美”的设计,可是最后的结果如我所料一切的发生。这里插一句,现在在一家敏捷公司,敏捷强调是合作,所以没有一个人统一规划决策,不同之前的公司作为架构师决策一切架构设计。敏捷合作交流我不否认你正确性,因为我也相信软件是人和时间的问题,方法论都是解决我和时间的问题。但是对于一个在成长中团队,成员的设计或者某些预见性或者重构能力,力度相对不足的情形下,这样是不是合理?

    回到主题,简单设计英语 Keep It Simple, Stupid。我们常说的KISS原则,保持产品或设计的简单性,同时功能的足够性。我想说的是翻译成为简单这是一个错误的决定,因为这不是绝对的简单,在我看来最简单的系统就是没代码的系统,代码越少,甚至没有就没有bug没有维护。所以我更愿意以产品设计如家庭装修一样翻译为”简约”,简约而不简单。在《简约至上-软件交互式设计四策略》这本书以遥控器为例提供了删除,隐藏,转移,组织产品设计四策略,但是其简化改善后仍然五脏俱在,核心价值仍在。但是对于软件而言,我们最大对手是需求变化,所以我们常说“拥抱变化”,敏捷就是为了拥抱变化适应变化给用户提供更好优质可用的卓越软件。但真的所谓简单设计,我们起初就不设计?靠我们的测试驱动,行为驱动,重构等方法论就能解决软件设计?这些就是万能的灵药,软件的银弹?我还没见过这样的人,我不否认在这样牛人的存在, Martin Fowler 在《重构改善既有代码设计》一书提到XP发起一帮人能够比较好的完美利用这些方法论将代码改造为一个比较好的设计。但这毕竟是少数人的世界,我辈望山莫及,再加上项目开发周期中的由于时间,环境等等压力导致重构力度大幅度缩减,或者根本就没有把重构日常化,只是拿着重构这个感觉好nb的术语招摇撞骗(本人见过很多人或者博客将如果重构,但在鄙人鄙见下这更大程度的是重写,重新设计,只是招摇撞骗的幌子),那所谓的简单设计真的还能启用?

      在回到简单设计,在软件变化的需求下,我认为简单设计的目的是保持代码的整洁,以及不要花费太多时间在无谓的设计猜测需求中,减少类数量的庞大,其目的是减少时间人力资源的浪费,其相对于过度设计而言。但绝对不是不做设计,不留任何一点扩展,起终点在于时间资源的投入。所以我认为基于资源的投入,如果不是那么大浪费或者必须的设计,我们让然需要去做,因为程序员都是追求完美,适应以后潜在的变化。相反如果是将一个相对好的设计,或者扩展,花时间去做到所谓的简单设计,丧失扩展等,这不是减少资源投入,这是在捣蛋,花时间精力去搞破坏,即使是你认为不变,何况谁能预测未来世界。

     如果我们不是牛人,你却也追求卓越软件,我觉得我们还是需要考虑下设计,不要一味的“简单设计”,平衡各种方法论,权衡各种利弊,找到适合自己的方式方法论,如果只是”简单设计“却没有足够的重构力度,抑或完全的优先设计,不进行不断的持续改进,逐步细化,做到“简约而不简单”记住所有的技术债早晚会需要你偿还的。对于我来说没有万能的方法论,我也不是牛人,我选择设计,重构等方法论的权衡。

转载于:https://www.cnblogs.com/whitewolf/archive/2013/05/07/3063984.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSChina 周六乱弹 —— 有人骂你神经病怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 周六了,大家有没有在认真加班呢?其实咱们程序员的生活真的不容易 熊大信了熊二的话:程序员的人生 码代码不容易,咱们还是去抢银行吧 sunny_chan:一天老师让同学…

手把手教你学Dapr - 6. 发布订阅

介绍发布/订阅模式允许微服务使用消息相互通信。生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息。这涉及将它们写入输入通道。同样,消费者或订阅者订阅该主题并接收其消息,而不知道是什么服务产生了这些消息。这涉及从输出通道接收…

Android之AndroidManifest.xml文件解析和权限集合

一、关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置…

mysql许多连接错误而被阻止_怎样解决mysql连接过多的错误?

设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。那能不能不要杀掉而让他正…

直男的浪漫有多可怕?

1 你不说估计没人知道(via.信箱说i)▼2 举报,此处有个疑似小偷的人!(via:不知姓名的C)▼3 世界上最互相信任的人了吧?▼4 你看我这个垫肩是不是很不错!(素…

LNMP服务器安装配置(Rhel+Nginx+PHP+MySQL)

1、关闭selinux、配置防火墙,开启80、3306端口[rootlocalhost ~]# cp /etc/sysconfig/iptables /etc/sysconfig/iptablesbak [rootlocalhost ~]# vim /etc/sysconfig/iptables -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j…

第2课:关闭被黑客扫描的端口

端口定义:计算机与外界通讯交流的出口。netstat -an:查看本机开启的端口。1521 -->oracle端口3306 -->mysql端口1433 -->mssql端口5631 -->pcanywhere端口,它是一款远程控制软件 通过注册表编辑器来关闭445、135、139、3389端口&…

飞了,飞了,真的疯了

她走了,真的走了,不留下一片红唇,溜溜的走了,消失了,此生再无相见。转载于:https://blog.51cto.com/plusqueen/883628

WPF 透明窗口在桌面上放虫子。。。

抖音上偶然看到这个&#xff0c;咱也想来一个&#xff0c;看看效果&#xff1a;实现很简单&#xff0c;一个透明窗口&#xff0c;一个gif图片&#xff0c;不显示任务栏&#xff0c;再加上鼠标穿透&#xff0c;就ok了了看看代码&#xff1a;Mainwindow.xaml:<Window x:Class&…

Android之图片缓存管理

如果每次加载同一张图片都要从网络获取&#xff0c;那代价实在太大了。所以同一张图片只要从网络获取一次就够了&#xff0c;然后在本地缓存起来&#xff0c;之后加载同一张图片时就从缓存中加载就可以了。从内存缓存读取图片是最快的&#xff0c;但是因为内存容量有限&#xf…

mysql 非空语法_mysql从入门到优化(1)基本操作上

这是数据库系列的第一篇文章&#xff0c;主要是对mysql的基本操作有一个了解。本系列的教程会先从基础出发&#xff0c;逐步过渡到优化。一、前提在这里我们不会从如何去安装数据库开始讲起&#xff0c;而是在安装完之后从操作数据库开始&#xff0c;文中所有的代码均在我自己的…

“凡尔赛文学”疯狂刷屏!数学家们也拼命“装”了起来,哈哈哈哈哈

全世界只有3.14 % 的人关注了爆炸吧知识凡尔赛文学与数学结合起来完美无缺大家好&#xff0c;超模君昨天在写稿时&#xff0c;表妹过来告诉我&#xff1a;“表哥你的科普文章都out了&#xff01;现在凡尔赛文学才是主流&#xff01;”超模君很疑惑&#xff0c;凡尔赛文学的画风…

org.hibernate.InvalidMappingException: Could not parse mapping document from resource

在写hibernate时&#xff0c;若运行出现"org.hibernate.InvalidMappingException: Could not parse mapping document from resource"问题&#xff0c;首先确定jar包导入无误; 接下来看 *.hbm.xml文件中的字段&#xff1a; <!DOCTYPE hibernate-mapping PUBLIC &q…

.NET 6新特性试用 | 可空引用类型

前言在查看《隐式using指令》功能时&#xff0c;我们在csproj中发现这样一个属性&#xff1a;那么&#xff0c;Nullable到底是干嘛的&#xff1f;可为空上下文严格来说&#xff0c;这不是新特性&#xff0c;而是C# 8.0引入的特性之一。该特性用于指示引用类型是否接受null值:只…

zabbix JMX监控 tomcat

第一步&#xff1a;需要安装jdk1.# tar xvf jdk-7u21-linux-x64.tar.gz -C /usr/localource /etc/bashrc2.# ln -s /usr/local/jdk1.7.0_21 /usr/local/jdk3.# echo JAVA_HOME/usr/local/jdk >> /etc/bashrc4.# echo PATH$PATH:${JAVA_HOME}/bin/ >> /etc/bashrc5.…

Android之Base64

Base64介绍 Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转四字节。如将字符串“Man”用Base64编码。 如果数据的长度不是3的整数倍

mysql 1054 42s22_MySQL ERROR 1054(42S22)

修改用户的密码&#xff0c;网上搜到的命令为如下执行后报错  ERROR 1054(42S22) Unknown column password in ‘field list’错误的原因是 5.7版本下的mysql数据库下已经没有password这个字段了&#xff0c;password字段改成了authentication_string所以请使用一下命令>my…

这是不是帮女朋友拍照时的你?哈哈哈哈

1 就跟我房东说&#xff1a;现在打工人压力真大一样▼2 原来&#xff0c;连打工人都不配了吗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 原来这才是家大叶大▼4 给女朋友拍照时的你&#xff01;&#xff08;via.刘一杭三三 &#xff09;▼5 当法…

linux slub分配器浅析

在《linux内存管理浅析》中提到内核管理自己使用的内存时&#xff0c;使用了SLAB对象池。SLAB确实是比较复杂&#xff0c;所以一直以来都没有深入看一看。不过现在&#xff0c;linux内核中&#xff0c;SLAB已经被它的简化版--SLUB所代替。最近抽时间看了一下SLUB的代码&#xf…

openfire 插件开发例子

2019独角兽企业重金招聘Python工程师标准>>> 好久都没有写东西了。今天总结一下之前开发的一些openfire插件。 这次的插件需要提供一个HTTP的接口。通过HTTP来对openfire做一些操作。 插件的目录结构&#xff1a;项目名称“exampleplugin" src/main/javaorg/ji…