西西河

主题:【原创】闲聊敏捷编程——测试驱动开发(一) -- 代码ABC

共:💬55 🌺131 新:
分页树展主题 · 全看 上页 下页
    • 家园 敏捷开发,

      每次迭代开发,都需要明确需求,开发过程中,需求不能再变更。完成当前有限的需求开发以后,才能进入下一轮的迭代开发。每次迭代完,都是可以提供给客户一个稳定的软件系统.迭代早期,开发出来的是一个功能简单软件,有一个简单稳定的东西总比复杂但充满BUG的东西好吧。

      迭代开发的周期也不能太长,一个久拖不决的项目,对开发人员,容易造成心里疲劳,后期就在应付差事(深有体会);对用户来说,看不到项目的结果,造成失望.

      每次迭代开发完,用户根据预先写好的测试用例验收当前迭代的代码,可见,敏捷开发对客户的参与是有一定的要求的。

    • 家园 Dijkstra成天和这家伙的程序打交道

      eigrp ospf......

    • 家园 送花,小羊最近也在试着野路子的拥抱变化

      小羊现在的项目实践主要在web应用方向,和开发组商量着用了几回“山寨版”的敏捷方法,还是受益匪浅的。就说说我们的山寨版敏捷过程吧。

      小羊的理解,敏捷的路数,所谓的拥抱变化,是一个从没有需求到完成需求的过程,需求分析和软件开发的过程是合二为一的,拿web应用开发来说,我们的美工和客户肩并肩坐着,客户说这里要个banner,就出来一个banner,客户说这个button要是黄色的,就出来一个黄色的,客户说页面布局应该是两栏三行,页面就是两栏三行,对于一个一般规模的web应用而言,基本上一到两天结束战斗。

      然后客户转战到前台程序员组,还是肩并肩,把页面上每一个交互元素都趟上一遍,客户说这个input丢失焦点的时候,应该在旁边提示输入是不是合法,程序员就随手写一段javascript代码,不管怎么样都在旁边提示一下,以此类推,一个凑合能动的“假”应用也差不多就是三五天的事儿。在这个过程中,后台组的哥们儿就在旁边站着,记下来每一个能动的玩意儿应该怎么动,行话说,叫用例吧。

      到这里,客户可以退场了,开发组开始写测试用例,顺便说一句,如果稍微NB一点,跟着前台程序员观摩的时候,测试用例已经写的差不多了,从用例抽象出数据模型,然后找来玩儿后台数据库的,提出自己的数据模型需求,等到系统数据模型建立完毕,再找来前台程序员肩并肩,这个时候是前台程序员说需求了,前台的兄弟说这块儿我要一个包含什么内容的json,后台的兄弟就写一个controller返回一个包含什么内容的json,模型层满足不了controller的要求了?没关系,那哥们儿就在旁边一米远,立马改。完了跑跑测试,测试ok之后,不仅单元ok了,实际上集成也ok了。

      最后一关,交活儿,客户就是不花钱的集成测试员,直接抓过来让他点鼠标,美工和前台程序员坐旁边,小修小改,顺带着就把浏览器兼容性问题解决了。

      至于大的页面和功能调整,目前还没有碰到过,感觉整个过程中,用户也在根据面前的原型不断的调整和表述自己的需求,是一个思考固化的过程,所谓大的调整其实已经分解成了若干个小的需求。

      同时,眼看着一个应用程序从无到有展示在自己面前,无论是客户还是开发人员都反映挺有成就感的,而且快速的需求——实现反馈会不断的增强用户和开发人员的信心,客户最后点鼠标的时候就是最high的时候,小羊一般在这个时候会找来业务人员,等客户high到顶点的那一霎那,就把项目验收确认书的字儿也签了,嘿嘿。

      总结这个过程,小羊的心得是————要想玩儿的爽,客户要配合,需要客户配合,就得让客户有热情,要让客户有热情,关键是快速的需求——实现反馈,为了快速的反馈,就必须:

      第一,开发工具必须能够快速的建立原型,快速的修改并且反馈结果,html,css,javascript,ruby,php,python这样的都行,java那样的就算了,building过程就能谋杀掉客户的所有耐心,要是完了再抛出几个错误,把戏就不用玩儿了。

      第二,需求的获取、传递和使用要讲究传递的层次和传递过程中的解构,客户是消息的源头,美工、前台、后台、建模都是消息的消费者,消息的消费者各自从消息源获取对自己有用的消息,同时信息传递过程中,需要“翻译”的要求越高,距离消息源就应该越远,基本不需要加工的直接传递,像页面、前台,没什么专业术语,平时说的就是人话,就直接从客户处获取;稍微需要一点翻译是后台程序员,列席客户和前台的交流,记录用例,他真正需要的信息是前台程序员传递过来的;距离最远的就是建模,他完全不参与和客户的沟通(沟了也白沟,鸡同鸭讲),他仅仅从后台程序员处获取信息。

      第三,由于需求信息分层传递和各取所需的设计,整个系统架构就必须充分解耦,当然这个是系统设计的正常要求,只不过如果使用敏捷编程的方法,就变成了强制要求,要不然经过这么复杂的反馈过程,项目足以成为一个超级焦油坑,不可收拾。

      第四,项目组人员越少越好,敏捷编程对于项目人员的要求还是很高的,靠翻文档写代码的不成,打字慢的也不行,尤其是后台程序部分,要在客户和前台程序员建构系统原型的时候就做到对用例和功能模块心里有数,要求不是一般的高,项目成员——尤其是参与信息的获取和传递的——一块短板足以搞垮整个项目。越玩儿敏捷编程,越发现适合小项目组,最好就一个牛人,和客户商量着就把事儿办了

      总而言之,小羊觉得,所谓敏捷编程,就是以我万变之不变,应对用户不变之万变,只要我写的快,改的稳,管你千变万化我都不怕,所以,敏捷编程,小羊觉得于其称之为软件工程的方法论,不如说是对软件业界的一份QA指南,对于语言、工具、分工都提出了自己独特的要求。

      元宝推荐:铁手,
      • 家园 其实你们只涉及了问题的一部分

        你们没有遇到另一类问题,就是客户不断更改需求,以及需求非常复杂,以至于项目组成员看到客户就害怕。客户的需求更改非常正常,当他看到实际成品出来的时候会接二连三的冒出‘灵感’,此时如何对应这些‘灵感’是agile/SCRUM体制中最最精彩的部分。

        待我有空,我来写SCRUM。

      • 家园 Refactoring

        没有Refactoring,谈不上拥抱变化。

        • 家园 用户的变化,小羊算是抱结实了,重构。。。确实碰到问题了

          小羊这几个项目用的是ruby ,必须承认,在重构方面,找不到java重构那种很爽的感觉,小羊不知道这是动态语言先天的问题,还是小羊工具或者方法上面的问题,还请zhonghm兄台指教,小羊拜谢了

          • 家园 重构在于抽象

            重构一个很重要的目标在于消除代码中的重复:代码重复、结构重复、思路重复等等。而消除重复一个方法在于抽象。Java、C++和C#这类OO语言一个最强的地方就在于抽象能力。动态语言我用得很少,感觉上其抽象能力不如上述语言强,不过,也许是我还没领会其设计思路吧。应该和工具无关。

            • 家园 代码说的不错

              什么是改变的大敌?

              一,重复,当一个被复制的到处都是的逻辑需要修改时,代价在于找出所有需要改变的地方,这是困难的。

              二,复杂,当一个混乱不堪的程序块需要修改的时候,你需要找到合适的需要修改的地方和修改的方法,这是困难的。

              三,耦合,如果所有的程序块都高度耦合,你需要找出合适的修改方法完成改变而不影响到相对应的模块,这更是困难的。

              困难到了一定的程度,就是mission impossible. refectoring的作用在于在合适的时候,通过修改代码的结构,把复杂性逐渐增高的逻辑分拆,把重复的逻辑合并,把不合适的逻辑划分改变,从而降低你系统的复杂度和耦合度,提高系统的可读性和灵活性,降低变化的代价。如果没有refectoring,只能叫拥抱需求,只有充分的refectoring,才能说是拥抱变化。

      • 家园 现在做的一个很小的内部开发

        我一个人,反正是内部,文档全省了,有过程中来往的Email,不怕他不认账,根本不做test case,管杀不管埋,测试全交给客户做,用下来不满的出问题的给我一个email,我阅读之后把大概的可解决性回个email请客户确认,然后出下一个版本...

        大概比野路子还野路子,结果客户满意度感觉上高于之前做过的任何项目...

分页树展主题 · 全看 上页 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河