高手指点:如何取得好的软件设计
关键字:软件设计 似乎作为一个软件 开发 者,就注定要背着沉重的行囊,穿行在茂密的热带丛林里,酷热,没有风,只有腐烂的植被、浓浓的瘴气、不时从肩膀上爬过的毒蜘蛛和从脚背上“嗖”地窜过的毒蛇。汗流浃背,疲惫不堪,却不能休息片刻——因为这是一个软
关键字:软件设计
似乎作为一个软件
开发者,就注定要背着沉重的行囊,穿行在茂密的热带丛林里,酷热,没有风,只有腐烂的植被、浓浓的瘴气、不时从肩膀上爬过的毒蜘蛛和从脚背上“嗖”地窜过的毒蛇。汗流浃背,疲惫不堪,却不能休息片刻——因为这是一个软件开发的混乱的时代!
充分的前期
需求分析?严格的开发流程控制?严密的后期
测试?这些都做到了啊,可是为什么软件还是有
bug?特别是用户频繁地提出新的要求,软件要不断地修改,每一次修改都胆战心惊几近崩溃,这到底是为什么?神啊,到底要怎么做才能获得好的软件设计啊?
人们一直都没有停止思考如何能够获得好的软件设计。
软件工程风行了几十年,“没有银弹”的咒语还没有解除。人们不禁要抛弃所有的“软件工程”带来的规制,回到软件开发的源头寻找答案。如下就是笔者看到的火烧云的形状,像猫像虎任凭端详。
1、要有技艺高超的开发者
软件是人的思维活动的产物,软件开发首先需要的是人的创造性。就如同其他一切人类创作一样,人是占据核心地位的。恐怕再过一百年,也没有哪个自动化的工序可以代替金庸先生的妙笔写出《笑傲江湖》这样经典的小说。所以,当前软件工程企图用其眼花缭乱的流程控制来达到“软件工厂”的目的,是方向性的错误。人,只有人,技艺高超的开发者,才是产生好的软件设计的核心因素。
技艺高超的开发者,应当有丰富的软件开发经验。有了丰富的软件开发经验,才会培养出对软件设计中的各种“坏味道”的敏锐的嗅觉,才能熟练地绕过软?杓浦械闹种窒葳澹挥辛朔岣坏娜砑??⒕?椋?呕岫愿髦秩砑?逑到峁鼓J嚼檬煊谛兀?拍茉擞贸墒斓纳杓颇J浇饩瞿切┢毡榈纳杓莆侍猓挥辛朔岣坏娜砑??⒕?椋?呕岫愿髦钟镅浴⒐ぞ叩奶爻ず拖拗屏巳缰刚疲?拍苎≡裾攵缘鼻拔侍獾淖詈鲜实谋喑逃镅院蜕杓乒ぞ撸挥辛朔岣坏娜砑??⒕?椋?呕岫愿髦制教ê突肪车奶匦院筒钜煊兴?私猓?拍茉谏杓频墓?讨凶畲蟪潭鹊乩?闷教ê突肪车奶匦裕?⒖沙浞挚悸堑匠绦虻目梢浦残浴?
技艺高超的开发者,应当有专业的领域
知识。软件总是服务于某一领域的应用,各个领域的专业特性不同,使得软件开发也产生了许多分支。从事某一专业领域的软件开发,必然要对该领域的专业知识有深入的了解,才能在软件设计中正确地把握对概念的抽象。随着软件的复杂性的转移,领域建模越来越受到重视。在此强烈推荐《领域驱动设计——软件核心复杂性应对之道》(Eric Evans著,陈大峰等译,清华大学出版社出版)一书。
技艺高超的开发者,应当有求真务实的技术作风。在这个浮躁、虚华、官僚化的社会里,“求真务实”显得太可贵!这也是对开发者提出的很高的要求。求真务实的技术作风,就要求开发者不要盲从技术风潮,软件开发的技术发展飞快,也产生了不同技术流派,各个流派都想扩大自己的影响,这时候就需要开发者自己去识破各种幌子,吸收真正对软件开发有所助益的好方法;求真务实的技术作风,还要求开发者实事求是地看待各种非技术机制对软件开发的影响,看看这些机制是否对软件设计
质量的提高有帮助,有则批判地采纳,无则无情地抛弃,不要抱有“这个流程是某某认证所必须的,且其他很多公司都这样做了,所以它一定有它的道理”的想法,这些目前看不到好处的东西,不要指望将来给你带来什么好处;求真务实的技术作风,更要求开发者抛弃官僚主义作风和自大的姿态,在技术面前人人平等,以开阔的胸襟对待不同技术观点和反对者,友好地同其他人合作,以把软件设计做好为要旨。
技艺高超的开发者的成长需要长期的磨练,代价很大。且人的因素确实是一个很不确定(流动性很大)的因素,软件工程减少不确定因素的初衷是好的,但是人的地位毕竟不可替代。“软件蓝领”是又一个软件工程产生的畸形儿,软件工程宣称,只要几个月的短期训练,就可以胜任软件开发的工作。真是可悲!
2、要有合理的软件过程
软件开发早已不是单兵作战,而是一项有组织的集体活动,但是跟修水库和建筑施工等“工程活动”不同,软件开发需要集中团队中每个人的智慧。软件开发的过程中,最终要达到的目标在最初往往并不十分清楚,所以需要不断地去探索。软件开发的核心复杂性在于对应用领域的抽象与建模,很多时候,软件开发也是一个建立模型、验证模型、改进模型的一个不断迭代的过程,所以一个合理的软件过程至关重要。
一个合理的软件过程,应该能获取准确的需求。软件需求据行业领域和客户的要求不同而差异很大,没有一个通行的模板可以套用,那么就需要对行业领域的充分研究以及与客户的充分沟通来获取到真实的需求。客户把自己的需求表达清楚本身就是一件困难的事,开发者理解用户的表达又增添了困难,语言会产生偏差,我们注重点的不同也会产生偏差所以往往我们“按照”客户的需求做出来的东西并不是客户真正想要的东西。再者,很多用户的需求随着时势的变化会发生改变,这都是很正常的。因此,我们不能“苛求”一开始就能全盘获得准确的需求,要想获得准确的需求,就要保持一直与客户的沟通,允许在我们的开发的过程中客户提出变化,随时表达和强调他们真正想要的“软件”,只有这样,我们的开发才不会偏离客户的初衷,一切设计才有意义。
因此,合理的软件过程应该将客户需求的表达穿插在软件过程的全部环节中,而不是指望在开始设计之前跟客户订好需求的“契约”就以为万事大吉。
一个合理的软件过程,应该快速的反馈软件构思。软件设计是开发者思维活动的产物,这种思维是建立在领域建模和软件构建的基础上的。建模的过程中,需要开发者极大地发挥自主性和创造性,不同的人,在不同的知识背景下思考的方式会不一样,所以设计过程迫切需要验证当前的思路是否正确,需要一些反馈信息来证明当前的模型是准确地满足了某一需求。并且,构思是一个不确定、不严密的脑力活动,对开发者的经验有很强的依赖性,而经验的运用往往会产生不知不觉的错误或疏漏,所以需要及时的反馈来验证构思的正确性,从而避免“错之毫厘,谬以千里”。
快速的反馈是保证设计构思不会“离题”的必要手段,所以合理的软件过程需要提供一个快速反馈的机制,而不是一味地想象,直到如梦初醒。
一个合理的软件过程,应该保障团队成员的沟通顺畅。团队成员合作开发,共同完成一个软件系统,成员各自的思路之间是有“缝隙”的,要将每个人的设计联结成一个整体的设计,就需要充分的沟通来填补这些“缝隙”只有充分的沟通,才能保证各个成员各自完成的部分组合起来的协调性,才能避免牛头对个马嘴。Brooks在其《人月神话》中曾描述过一种情况:往一个效率低下的软件开发团队中增加人员,不但不能提升其开发效率,反而会降低其开发效率。这说明团队成员越少越好,同时也说明团队成员之间沟通的时间耗费是巨大的。团队成员交流的主要是对系统的理解和自己对模块接口的划分,因此需要的是直接的“对话”,是随时展开的是“辩论”,是立竿见影的对设计者思路的冲击,这样才高效。而多余的文档、图表、流程或任何其他形式的沟通媒介,不仅耗费了开发者宝贵的时间,更可能引起传递“信号”的失真,带来歧义。
一个合理的软件过程,应该提倡“Work smart, not just hard.”(笔者借用这种说法,其本义可以参考http://www.jorydesjardins.com/pause/2006/05/what_does_that__1.html),软件设计是一项智力劳动,其核心成果来自开发者发挥自己的聪明才智和创造性。(google就是一个很好的例子。)开发者的创造性来自对行业领域的钻研和领域以外的借鉴,所以,开发者应当有丰富的领域外的知识的涉猎,在行业领域之外也有多姿多彩的阅历和思考素材,发展自己的个性。这样思路才不会呆板,思维才更活跃。
合理的软件过程,应该给开发者营造一个轻松的工作氛围,允许开发者的个性化,才能让开发者身心愉悦地投入到软件设计的虚空间中去,激发设计创意。
原文转自:http://www.ltesting.net