首页 > 程序设计, 系统架构 > 需求变化与IoC

需求变化与IoC

2012年3月26日 发表评论 阅读评论 19,228 人阅读    

感谢 Todd投递本文 – 微博帐号:@weidagang

需求又变了,怎么办?

先上一个轻松的段子:

程序员XX遭遇车祸成植物人,医生说活下来的希望只有万分之一,唤醒更为渺茫。可他的Lead和亲人没有放弃,他们根据XX工作如命的作风,每天都在他身边念:“XX,需求又改了,该干活了,你快来呀!”,奇迹终于发生了,XX醒来了,第一句话:“需求又改了?”。

这个段子用幽默的方式反映了需求变化是每一个程序员、架构师或项目经理都会经常遇到的问题。面对这个问题,不同的人有不同的应对之道,最近微博上有一段关于需求变化的讨论:

@假装刺猬的猪:我们在软件开发过程中,会持续碰到客户需求变更的情况。如果没有领域建模,我们单纯将问题使用直觉将问题解决,那么等到客户需求变更或者有新的需求时,就会面临一个僵硬的前设计!无法在以前的设计上持续深入的优化模型,导致需求变更无法及时深化。设计实现均滞后与变更!

@高煥堂: <碰到客户需求变更的情况>是合理的;但<领域建模>不是美好的手段!!!

@weidagang: 要不被客户牵着鼻子走,需要自己有很强的设计能力,反过来让客户跟着你的设计来满足你的要求。能做到这点的公司很少,但这是软件行业唯一有希望的出路。

@高煥堂: <这是软件行业唯一有希望的出路>。 Great!!

如何应对需求变化? @假装刺猬的猪 的答案是领域建模,并持续优化模型,适应需求的变化。@高煥堂 则认为领域建模不是美好的手段。我进一步补充,应该“反过来”让自己在需求变化中处于主导地位,而不是被动地适应。

控制反转 (IoC)

什么样就算是“反过来”了呢?举个例子:

用户想购买一台普通PC,他只想电脑能流畅运行魔兽世界,他根本不想知道什么叫主板,什么叫内存,什么叫CPU;但他不得不接受必须购买主板、CPU、内存的事实,因为PC架构是产业标准,而不是由用户定的。客户有选择的权利,但没有设计的权利,客户的需求必须在设计框架下得到满足。

这里我们要问PC架构是保护了谁的利益?显然,直接的受益者是厂商。如果没有PC架构的保护,厂商就会直接面对客户,客户说我需要功能A,我马上分析设计实现功能A;客户说我要功能B,我马上分析设计实现功能B … 有了PC架构的保护,厂商就变得更加强势,用户的一切需求都必须在PC架构下来谈。厂商可以倾听用户的声音,不断改进产品,但设计主导权永远在自己手中。我们IT行业常常用“做产品”和“做项目”的视角来区分不同的公司,但很少有人用“做设计”的视角来看。实际上,关键的问题在于设计主导权是厂商还是在客户。如果设计主导权在客户,不管是做产品、做服务还是做项目,其命运必然是疲于奔命应付客户,最后获得微薄的利润;如果设计主导权在厂商,不管做产品、做服务还是做项目都能有更多的话语权和更高的利润。

当然,光有设计还不够,必须客户接受才能起到通过设计掌握主导权的作用。这一方面需要自己具有很强的设计能力,如苹果就是以设计能力著称的公司;另一方面,和其他厂商结盟壮大阵营也是一种方法,如最著名的Wintel联盟(Windows+Intel),以及现在的日益壮大的Android阵营都属于此类。假如有厂商不遵守PC产业标准,说我的PC就没有主板,没有显卡,因为用户更不不需要这些东西;那么,它要么像苹果一样独树一帜成为一种新的标准,要么无人问津。

我所谈到的“反过来”本质上就是软件设计中的控制反转 (Inversion of Control, IoC)思想。IoC是每一个初级程序员向高级进阶所需要了解的最重要的设计思想。由于Spring等开发框架的流行,知道IoC概念的程序员不在少数,但不少人对于IoC的理解仅仅停留在通过依赖注入 (Dependency Injection)实现解耦这个层面。实际上,IoC的应用不仅包括解耦,它还是框架的基本原理,在非计算机领域,IoC也是无处不在,如果你能从上面的例子中体会到IoC,这才算是融会贯通了。

软件开发中一种最常见的模式是“以用户为出发点,以需求分析为核心”。该模式提倡从用户需求中分析推导出设计和实现,比如,TDD式的设计正是这类典型。而IoC式的软件设计与此截然相反,IoC的设计是一种“以愿景(自身利益是愿景的重要方面)为出发点,以架构为核心”的模式。如果用户的需求是一台电脑,我们如何能通过第一种模式分析需求推导出“主板-CPU-内存-外设”的PC架构呢?恐怕很难。IoC式的设计是以用户看不见摸不着的架构为核心,自己主导设计,用户需求是设计的约束条件和验证手段,而不是出发点和目标。我们想要掌握主动,不被需求变化搞得疲于奔命,就必须熟练使用第二种模式。

我们的人生都被环境和各种客观条件所束缚,多数人只能随波逐流,听从命运的安排。你有没有想过要拥有人生的主导权呢?既然你是程序员,你懂IoC,你能否设计自己的人生框架呢?Yes,you can!


关注CoolShell微信公众账号可以在手机端搜索文章

(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——


本广告收入已由广告主捐给Wikipedia

好烂啊有点差凑合看看还不错很精彩 (17 人打了分,平均分: 4.76 )
Loading...
  1. 2014年3月6日18:23 | #1

    IoC,最近课堂上学到的新词汇,很富有深意的编程思想

  2. shady
    2014年5月5日11:09 | #2

    yes, I can

  3. chuck13
    2015年4月7日18:38 | #3

    读起楼主的文章我第一个想到的就是 SAP…

  4. 不曾离开的小耗子
    2016年7月3日14:18 | #4

    理想和现实总会有差距 有时为了更通用 一样会变为过度设计 当你不够强势 一切会很苍白

  5. shen520110
    2016年10月26日16:56 | #5

    ioc式的软件设计,我觉得现实生活中最生动的例子就是电信行业了。你要买套餐,只能在移动联通的设计好的套餐里面选择,从来没有听说过为了满足谁谁的需要定制了一个。而他们之所以能做到这一步,是因为在这个行业里面已经处于垄断的地位了。
    当然,这个只是个极端的例子。在不同的领域里面,想一直处于垄断地位很难。大部分的做法是,努力走在所有同行的前面。然后成为行业老大,掌握话语权,为这个行业指定标准。
    同样,我觉得软件行业,不管从事的是哪个领域内的开发,如果想掌握主动权,想牵着客户的鼻子走的话,就应该在这个领域内努力甩开其他的对手,然后成为制定标准的那一,掌握主动权。这样,客户在提出需求的时候也会参照这个标准,让其他同行向我们靠拢。
    但是,这可不是一朝一夕就能完成的。但是作为目标为之努力的话,多多少少不会受制于人吧。
    个人见解,

  6. 帕拉丁
    2016年11月23日23:12 | #6

    @neutra
    其实小公司首先要解决的是生存问题,做项目肯定是公司的主页,在项目基础上对项目进行提纯,将项目打造成产品,这个是一般小公司的发展之道,你那种坚持直接做产品的方式不太适合市场,很多小公司都是在产品还没有见到成效就熬不住了。

评论分页
1 2 6950
  1. 2013年2月1日14:50 | #1
  2. 2013年6月14日15:37 | #2
  3. 2013年11月10日15:50 | #3
  4. 2013年11月11日16:02 | #4
  5. 2013年11月16日12:38 | #5
  6. 2013年12月5日11:26 | #6
  7. 2014年3月6日18:26 | #7
  8. 2014年4月12日16:59 | #8
  9. 2014年4月22日11:48 | #9
  10. 2014年4月23日10:48 | #10
  11. 2014年5月6日22:52 | #11
  12. 2014年6月10日22:14 | #12
  13. 2014年9月21日23:01 | #13
  14. 2016年7月28日17:21 | #14