忙碌了一年了项目又到了交互了,虽然项目能成功上线(因为还有维护支持的团队)。但是个人从技术上看,这是一个不那么成功的项目,因为后期艰难的修复bug,添加feature。这与简单设计有什么关系呢?在某模块开发起初,由于架构的经验预见性的告诉我这模块开发中会出现什么问题,所以选择了提出某些比较好的解决方案,但是由于团队成员一致的所谓简单设计,通过TDD,重构达到”合适”的”完美”的设计,可是最后的结果如我所料一切的发生。这里插一句,现在在一家敏捷公司,敏捷强调是合作,所以没有一个人同意规划决策,不同之前的公司作为架构师决策一切架构设计。敏捷合作交流我不否认你正确性,因为我也相信软件是人和时间的问题,方法论都是解决我和时间的问题。但是对于一个在成长中团队,成员的设计或者某些预见性或者重构能力,力度相对不足的情形下,这样是不是合理?
回到主题,简单设计英语 Keep It Simple, Stupid。我们常说的KISS原则,保持产品或设计的简单性,同时功能的足够性。我想说的是翻译成为简单这是一个错误的决定,因为这不是绝对的简单,在我看来最简单的系统就是没代码的系统,代码越少,甚至没有就没有bug没有维护。所以我更愿意以产品设计如家庭装修一样翻译为”简约”,简约而不简单。在《简约至上-软件交互式设计四策略》这本书以遥控器为例提供了删除,隐藏,转移,组织产品设计四策略,但是其简化改善后仍然五脏俱在,核心价值仍在。但是对于软件而言,我们最大对手是需求变化,所以我们常说“拥抱变化”,敏捷就是为了拥抱变化适应变化给用户提供更好优质可用的卓越软件。但真的所谓简单设计,我们起初就不设计?靠我们的测试驱动,行为驱动,重构等方法论就能解决软件设计?这些就是万能的灵药,软件的银弹?我还没见过这样的人,我不否认在这样牛人的存在, Martin Fowler 在《重构改善既有代码设计》一书提到XP发起一帮人能够比较好的完美利用这些方法论将代码改造为一个比较好的设计。但这毕竟是少数人的世界,我辈望山莫及,再加上项目开发周期中的由于时间,环境等等压力导致重构力度大幅度缩减,或者根本就没有把重构日常化,只是拿着重构这个感觉好nb的术语招摇撞骗(本人见过很多人或者博客将如果重构,但在鄙人鄙见下这更大程度的是重写,重新设计,只是招摇撞骗的幌子),那所谓的简单设计真的还能启用?
在回到简单设计,在软件变化的需求下,我认为简单设计的目的是保持代码的整洁,以及不要花费太多时间在无谓的设计猜测需求中,其目的是减少时间人力资源的浪费,其相对于过度设计而言。但绝对不是不做设计,不留任何一点扩展,起终点在于时间资源的投入。所以我认为基于资源的投入,如果不是那么大浪费或者必须的设计,我们让然需要去做,因为程序员都是追求完美,适应以后潜在的变化。相反如果是将一个相对好的设计,或者扩展,花时间去做到所谓的简单设计,丧失扩展等,这不是减少资源投入,这是在捣蛋,花时间精力去搞破坏,即使是你认为不变,何况谁能预测未来世界。
如果我们不是牛人,你却也追求卓越软件,我觉得我们还是需要考虑下设计,不要一味的“简单设计”,平衡各种方法论,权衡各种利弊,找到适合自己的方式方法论,如果只是”简单设计“却没有足够的重构力度,抑或完全的优先设计,不不断的持续改进,逐步细化,做到“简约而不简单”记住所有的技术债早晚会需要你偿还的。对于我来说没有万能的方法论,我也不是牛人,我选择设计,重构等方法论的权衡。
本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/1194409,如需转载请自行联系原作者