软件研发_软件研发流程 - CSDN
精华内容
参与话题
  • 完整软件研发流程

    千次阅读 2019-10-14 16:50:38
    软件产品开发流程: 下图所示的是一个软件产品开发大体上所需要经历的全部流程: 1、启动 在项目启动阶段,主要确定项目的目标及其可行性。我们需要对项目的背景、干系人、解决的问题等等进行了解。并编制...

    软件产品开发流程:

    下图所示的是一个软件产品开发大体上所需要经历的全部流程:

     

    1、启动

     

    在项目启动阶段,主要确定项目的目标及其可行性。我们需要对项目的背景、干系人、解决的问题等等进行了解。并编制项目章程和组建项目团队,包括:产品经理、架构工程师、UI工程师、开发工程师、测试工程师等。

    完成以上准备工作之后,召开项目启动会,启动会结束则进入下一步的工作。

     

    2、规划

     

    在项目的规划阶段,项目经理需要和项目需求方,以及项目的相关干系人确定项目的范围,创建WBS,确定项目的里程碑和项目计划。同时制定项目的管理计划,包括成本、质量、风险等方面的预测和控制方案。

     

    3)需求

     

    在需求阶段,需要对采集的需求进行需求分析,编写PRD文档、UI设计、高保真设计。

    最后进入需求评审,评审通过则进入下一步的工作

     

    4)设计

    在设计阶段,设计人员根据需求文档,对软件系统进行设计,包括数据结构、系统架构、业务模型及规则、流程控制、模块接口等。 输出概要设计,详细设计文档,以及数据库设计说明书等。

     

    5)开发

    在明确需求后,开发工程师正式进入编码阶段,根据产品原型图、UI效果图、设计文档,选择合适的开发环境、开发工具、开发语言等等进行实现,这个阶段也是个很长很难的阶段,也是软件实现的核心。

     

    6)功能测试

    对软件进行测试是保证软件质量的重要手段。开发工程师开发完成后,可以交由测试工程师测试。测试工程师测试到BUG要反馈给开发,开发进行修改。功能测试通常需要进行很多次,直到测试通过,达到质量要求。

     

    7)端到端测试

    在端到端测试阶段,测试人员根据完整的业务流程设计可以覆盖全流程的端到端测试案例,然后基于端到端案例对系统的各个模块进行全面测试,确保系统能够符合需求和验收质量标准。

     

    8)用户验收测试

    用户验收测试阶段,也是通常的UAT(User Acceptance Test)阶段,用户验收测试是最终用户可以检查软件是否符合业务要求的最后阶段。UAT由了解要求并了解构建软件目的的最终用户执行。此测试是在软件运行之前执行的最后一次测试。最终用户使用现实生活场景并为真实数据构建UAT测试用例,用户验收测试在最终用户在上线之前验证软件是否满足这些业务需求方面具有重要作用。

    9)上线

     

    所有测试通过,并与客户或者上级达成一致后,系统进行试运行,稳定后上线。

    上线包括:上线部署、部署后验证、整理交付物(需求文档、设计文档、安装部署手册、产品帮助等等)和运维移交。

     

    10)收尾

    项目的收尾阶段,移交项目成果,释放项目团队,进行项目回顾总结,项目汇报,完成项目结项。

     

    Leangoo项目管理软件管理阶段式软件产品开发

     

    首先我们在Leangoo中,创建一个项目(选择阶段式项目)

    在阶段式项目中,建议使用leangoo中“阶段式软件开发项目”项目模版。

    在“阶段式软件开发项目”项目模版中,系统自动为您创建了10个阶段看板(一个阶段一个看板)、1个缺陷看板、1个风险管理看板和1个变更管理看板。

    如下图:

    在每个阶段看板中,都提供了该阶段需要完成的目标的参考样本,供参考~

     

    1)阶段式看板

    一个标准的阶段看板包括了:阶段目标,待办,进行中,已完成,如下图所示:

     

     

    • 阶段目标:放置本阶段需要达成的目标,每个目标一张卡片,占一个泳道。
    • 待办:放置为了完成阶段目标需要完成的具体工作任务(工作项),一个目标对应多个工作任务。(如上图红框所示)
    • 进行中:进行中的工作任务。
    • 完成:已经完成的工作任务。

    2)缺陷看板

    用于跟踪管理产品缺陷,系统已为您设定好缺陷处理的流程。(可根据需要自定义流程)

    3)风险管理看板

    风险管理看板是对项目风险进行识别、分析、处理和监控的过程,是项目管理中很重要的管理活动,有效的实施软件风险管理是软件项目开发工作顺利完成的保证

     

    4)变更管理看板

    变更管理流程是成功交付项目的基础,变更管理确保对在项目环境中的每个变更在实施以前都得以恰当的定义、评估和审批。

     

    统计

    跟踪每个阶段的进展

    甘特图

    项目进度——跟踪整个项目总体进展

    注:对于不同企业,不同产品,可能会有不同的流程和要求。以上可作为参考~

     

     

     

     

     

     

    展开全文
  • 软件研发

    2011-07-28 17:48:39
    hjkhj 编辑文章 - CSDN博客频道 var statichost = "http://static.blog.csdn.net"; #topnav a { color:#0000ca; font
    <a href="#">hjkhj</a>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>编辑文章 - CSDN博客频道</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link type="text/css" rel="Stylesheet" href="/css/main.css" />
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/jquery.js"></script>
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/csdn.js"></script>
    <script type="text/javascript" src="/scripts/master.js"></script>
    <script type="text/javascript">var statichost = "http://static.blog.csdn.net";</script>
    
    <link type='text/css' rel='Stylesheet' href='/css/write.css' />
    
    <script type='text/javascript' src='/scripts/postedit.js'></script>
    <script type='text/javascript' src='/scripts/jquery.autocomplete.min.js'></script>
    <script type='text/javascript' src='http://static.blog.csdn.net/xheditor/xheditor-zh-cn.min.js'></script>
    <link type='text/css' rel='Stylesheet' href='/css/jquery.autocomplete.css' />
    </head>
    
    <body>
    <style type="text/css">
    #topnav a { color:#0000ca; font-size:12px; text-decoration:underline; }
    #topnav a:hover { color:#f00; }
    #topnav_hidlist { position:absolute; text-align:left; z-index:500; background:#fff; border:solid 1px #ccc; border-top:none; top:8px; line-height:180%; padding:4px;}
    *html #topnav_hidlist { width:70px; _top:22px;}
    #topnav .topnav_left a { margin:0px 2px; }
    #topnav .topnav_right a { color:#333; margin:0px 6px; text-decoration:none; }
    #topnav .topnav_right a:hover { text-decoration:underline;}
    #topnav .topnav_right em { font-family:Arial; color:Red; font-style:normal; font-weight:bold; padding:0px 10px; }
    #topnav a.red { color:Red;}
    </style>
    <div id="topnav" style="height:16px; padding:2px 4px; background-color:#fff; border-bottom:solid 1px #ccc;">
    <div class="topnav_left" style="float:left;">
    
    <a href="http://www.csdn.net/" target="_blank">CSDN首页</a>
    
    <a href="http://news.csdn.net/" target="_blank">资讯</a>
    <a href="http://bbs.csdn.net/" target="_blank">论坛</a>
    <a href="http://blog.csdn.net/" target="_blank">博客</a>
    <a href="http://download.csdn.net/" target="_blank">下载</a>
    <a href="http://so.csdn.net/" target="_blank">搜索</a>
    <a id="topnav_btnmove" href="javascript:void(0);" οnclick="javascript:topnavMore(this);return false;">更多</a><span style="color:#006699; font-size:10px;">▼</span>
    <ul id="topnav_hidlist" style="display:none;">
    <li><a href="http://cto.csdn.net/" target="_blank">CTO俱乐部</a></li>
    <li><a href="http://student.csdn.net/" target="_blank">学生大本营</a></li>
    
    <li><a href="http://edu.csdn.net/" target="_blank">培训充电</a></li>
    <li><a href="http://mobile.csdn.net/" target="_blank">移动开发</a></li>
    <li><a href="http://sd.csdn.net/" target="_blank">软件研发</a></li>
    <li><a href="http://cloud.csdn.net/" target="_blank">云计算</a></li>
    <li><a href="http://www.programmer.com.cn/" target="_blank">程序员</a></li>
    <li><a href="http://tup.csdn.net/" target="_blank">TUP</a></li>
    </ul>
    
    </div>
    <div class="topnav_right" style="float:right;">
    
    <script type="text/javascript">
        var p__un = document.cookie.match(new RegExp("(^| )UserName=([^;]*)(;|$)"));
        if (p__un) {
            document.write('欢迎<em>' + p__un[2] + '</em>我的:<a href="http://hi.csdn.net/my.html">空间</a><a href="http://writeblog.csdn.net/">博客</a><a href="http://wz.csdn.net/my/">网摘</a><a href="http://download.csdn.net/user/' + p__un[2] + '">资源</a><a href="http://passport.csdn.net/account/profile" class="red">设置</a>|<a href="http://passport.csdn.net/help/faq">帮助</a>|<a href="http://passport.csdn.net/account/logout">退出</a>');
        } else {
            document.write('<span style="color:red;">您还未登录!</span>|<a href="http://passport.csdn.net/UserLogin.aspx">登录</a>|<a href="http://passport.csdn.net/CSDNUserRegister.aspx">注册</a>|<a href="http://passport.csdn.net/help/faq">帮助</a>');
        }
    </script>
    </div>
    <div style="clear:both;"></div>
    </div>
    
    <script type="text/javascript">
        function topnavMore(e) {
            var hidList = document.getElementById("topnav_hidlist");
            hidList.style.display = hidList.style.display == "block" ? "none" : "block";
            hidList.style.left = e.offsetLeft - 7 + "px";
            e.blur();
            return false;
        }
        document.body.onclick = function (event) {
            event = event || window.event;
            var target = event.target || event.srcElement;
            if (target.id != "topnav_btnmove")
                document.getElementById("topnav_hidlist").style.display = "none";
        };
    </script>
    
    
    <div id="wrap">
    
    <div class="head">
    <!--<div class="search">
    <img src="/images/sear_btn.gif" class="btn_search" alt="Go" /><input type="text" class="input_search" />
    </div>-->
    <div class="user_info">
    <dl>
    <dt><a href="http://hi.csdn.net/my.html"><img src="http://avatar.csdn.net/0/D/C/3_teddy840989795.jpg" alt="teddy840989795" /></a></dt>
    
    <dd>
    <ul>
    <li class="user_name"><a href="http://hi.csdn.net/my.html">teddy840989795</a><span>teddy840989795的专栏</span></li>
    <li class="feed_link"><a href="http://hi.csdn.net/my.html">个人主页</a>|<a href="http://blog.csdn.net/teddy840989795">我的博客</a></li>
    </ul>
    </dd>
    </dl>
    </div>
    <div style="float:right; margin-top:20px; color:Red;"></div>
    </div>
    
    <div class="tabs_header">
    
    <ul id="ul_tab" class="tabs">
    <li id="tab_postedit" style="display:none;"><a href="/postedit"><span>发表文章</span></a></li>
    <li><a href="/postlist"><span>文章管理</span></a></li>
    <li><a href="/postlist/0/all/draft"><span>草稿箱</span></a></li>
    <li><a href="/category"><span>类别管理</span></a></li>
    <li><a href="/feedback"><span>评论管理</span></a></li>
    <li><a href="/configure"><span>博客配置</span></a></li>
    <li><a href="/configure/column"><span>博客栏目</span></a></li>
    <li class="write"><a href="/postedit" class="t_button">写新文章</a></li>
    
    </ul>
    </div>
    <script type="text/javascript">setTab();</script>
    
    
    <p class="subtit">文章标题</p>
    <div>
    <select id="selType"><option value="1">原创</option><option value="2">转载</option><option value="4">翻译</option></select>
    <input type="text" id="txtTitle" style="width:600px; height:20px; float:left;" maxlength="100" />
    </div>
    <p class="subtit">文章内容<span style="color:#ff9900;font-weight:normal;">(很抱歉,由于博客图片审核功能尚未完成,普通用户暂时关闭引用站外图片功能,请您谅解,我们会尽快开放。)</span><span id="autosave_note"></span></p>
    
    <div class="section">
    <textarea id="editor" name="editor" rows="30" style="width:99.4%;"></textarea>
    </div>
    <style type="text/css">
        #ol_img { margin:0px 12px; padding:10px; }
        #ol_img li { list-style-type:decimal;}
        #ol_img li a { margin-left:10px;}
    </style>
    <fieldset style="margin-top:10px; padding:4px 10px 10px 10px;">
    <legend>上传图片</legend>
    <table border="0" cellpadding="0" cellspacing="0" style="width:100%;">
    <tr>
    <td valign="top">
    <ol id="ol_img"></ol>
    <p id="p_err" style="color:Red;"></p>
    </td>
    <td rowspan="2" valign="top" style="width:240px;">
    <div style="border:solid 1px #999; background-color:#f0f0f0; font-size:11px; padding-left:10px;">
    
        <p>1、图片大小不能超过<b>2M</b></p>
        <p>2、支持格式:.jpg .gif .png .bmp</p>
        <p>3、如需管理图片,请进入<a href="http://hi.csdn.net/space.php?do=album&view=me" target="_blank">个人空间相册</a></p>
    </div>
    </td>
    </tr>
    <tr>
    <td valign="bottom">
    <iframe id="frm_img_2" name="frm_img_2" src="/article/uploadimg2" frameborder="0" scrolling="no" style="width:390px;height:24px;float:left;"></iframe>
    
    <input type="button" value="上传" style="float:left;_padding:2px 4px;" οnclick="uploadImg2(this)" />
    </td>
    </tr>
    </table>
    </fieldset>
    <script type="text/javascript">
        function showErr2(msg) {
            $("#p_err").html("* " + msg);
        }
        function setPath2(url) {
            var li = "<li><span>" + url + "</span><a href='#' οnclick='javascript:insertImage2(this);return false;'>[插入]</a></li>";
            $("#ol_img").append($(li));
        }
        function uploadImg2(e) {
            window.frames["frm_img_2"].document.forms[0].submit();
        }
        function insertImage2(e) {
            var url = e.previousSibling.innerHTML;
            var str = csdn.format("<img src='{0}' />", url);
            if (xh) {
                xh.loadBookmark();
                xh.pasteHTML(str);
            } else {
                $("#editor").val($("#editor").val() + str);
            }
        }
    </script><div id="moreDiv">
    <p id="p_desc" class="subtit" style="display:none;">文章摘要(仅支持纯文本)<span id="sp_desc_stat" class="font12"></span></p>
    <div id="d_desc" style="display:none;">
    <textarea id="txtDesc" rows="6" style="width:99%;"></textarea>
    </div>
    
    <p class="subtit">个人分类 [<a href="/category" target="_blank">编辑分类</a>]</p>
    
    <div>
    <input type="text" id="txtTag" style="width:60%; height:20px;" maxlength="100" />(多个分类之间用“,”分隔)
    <div style="height:24px;"><div id="tagbox"></div></div>
    </div>
    
    <p class="subtit" style="display:none;">文章别名(URL中使用,取代文章ID)</p>
    <div style="display:none;">
    <input type="text" id="txtFileName" style="width:60%; height:20px;" maxlength="30" />(只能使用数字、字母、横线和下划线)
    </div>
    <p class="subtit">文章分类(到分类首页)</p>
    <div class="radioBox channel">
    <input type='radio' name='radChl' id='radChl1' value='1' /><label for='radChl1'>移动开发</label><input type='radio' name='radChl' id='radChl2' value='14' /><label for='radChl2'>Web前端</label><input type='radio' name='radChl' id='radChl3' value='15' /><label for='radChl3'>架构设计</label><input type='radio' name='radChl' id='radChl4' value='16' /><label for='radChl4'>编程语言</label><input type='radio' name='radChl' id='radChl5' value='17' /><label for='radChl5'>互联网</label><input type='radio' name='radChl' id='radChl6' value='6' /><label for='radChl6'>数据库</label><input type='radio' name='radChl' id='radChl7' value='12' /><label for='radChl7'>系统运维</label><input type='radio' name='radChl' id='radChl8' value='2' /><label for='radChl8'>云计算</label><input type='radio' name='radChl' id='radChl9' value='3' /><label for='radChl9'>研发管理</label><input type='radio' name='radChl' id='radChl10' value='7' /><label for='radChl10'>综合</label>
    
    </div>
    <p id="p_comment" class="subtit" style="display:none;">是否允许评论</p>
    <div id="d_comment" class="radioBox" style="display:none;">
    <input type="radio" name="radComment" id="radComment2" value="2" checked="checked" /><label for="radComment2">允许评论</label>
    <input type="radio" name="radComment" id="radComment1" value="1" /><label for="radComment1">禁止评论</label>
    </div>
    <p class="subtit"></p>
    <div id="chkHomeDiv" class="radioBox">
    <input type="checkbox" id="chkHome" value="1" /><label for="chkHome" style="padding-right:0px;">发布到CSDN博客首页(<span id="sp_tohome_note"></span>)</label>
    <div class="clear"></div>
    <p style="text-indent:2em;">提示:1、推荐到首页必需是高质量、对别人有帮助的文章</p>
    
    <p style="text-indent:5em;">2、发布到首页后,一旦被管理员撤下,3天内将不能再发布到首页</p>
    </div>
    <p class="subtit"></p>
    </div>
    <div class="btn_area_1">
    <input id="btnPublish" type="button" class="input_btn_1" value="发表文章" title="保存并跳转" />
    <input id="btnDraft" type="button" class="input_btn_1" value="立即保存" title="保存文章并留在当前页" />
    <input id="btnCancel" type="button" class="input_btn_1" value="舍弃" />
    <span id="sp_note" class="savenote" style="display:none;"></span>
    </div>
    <div class="clear"></div>
    <p id="p_n" style="display:none;">提示:文章内容有<b>1</b>分钟的缓存,更改之后不会立即生效。</p>
    
    <script type="text/javascript">
    jsonData={articleId:'0',point:'False',max_point:'100',tohome_max_cnt:'5',_0:'0'};
    var tags = "".split(',');
    var hostList = 'csdn.net,csdn.com,iteye.com,cmdn.net'.split(',');
    </script>
    
    </div>
    <script type="text/javascript"> document.write("<img src=http://counter.csdn.net/pv.aspx?id=342 border=0 width=0 height=0>");</script>
    <script type="text/javascript" src="http://www.csdn.net/ui/scripts/Csdn/counter.js"></script>
    <script src="http://csdnimg.cn/pubfooter/js/publib_footer.js" type="text/javascript"></script>
    </body>
    </html>
    


    展开全文
  • 软件研发的这些误区,你中了吗?

    千次阅读 2020-06-23 12:04:56
    简介:软件研发过程中如何让工作变得更简单高效?事务性工作应该更关注需求还是更关注任务?是持续发布还是批量发布?本文将从七个方面聊一聊软件研发过程中常见的误区及正确姿势,分享研发过程中的那些 Dos 和 Dont...
    简介:软件研发过程中如何让工作变得更简单高效?事务性工作应该更关注需求还是更关注任务?是持续发布还是批量发布?本文将从七个方面聊一聊软件研发过程中常见的误区及正确姿势,分享研发过程中的那些 Dos 和 Dont's。

    image.png
    结束了一天的工作,拖着疲惫的身躯,坐在马桶上,回顾一天的工作,发现有那么多的不值得,明显没有价值贡献的任务,却干了一大杯;明明可以好好工作,却硬要表演得很忙似的;明明有机器帮我们干活,却硬着头皮逐字逐句读代码;明明别人家已经持续交付了,而我们依然觉得批量来一把更经济实惠。哥很难,难的不是工作太辛苦,而是明明可以更简单,却硬要搞得很复杂,今天,我们试着扒一扒软件研发过程中的常见误区。

    关注需求 vs 关注任务

    在办公室里看得最多的场景,无非是每一个人都并行工作在很多事务上,忙至深夜。而“努力”的结果还是交付时间一而再、再而三地延期。事务性工作的本质还是任务驱动,关注在基本的开发任务,因为任务是片段的、部分的,缺乏产品需求及目标的整体性。个体上,虽然任务完成很多,但因为缺少与其他任务在产品需求层面的拉通,也难以保证产品需求交付的按期交付。这就像忙碌的仓鼠,虽然不停歇地在滚轮上奔跑,但依然在原地。

    而软件交付的本质,是持续、快速、高质量地交付有效价值。业务或产品需求才是有效价值的体现。需求来源于用户问题和业务目标,可以从业务目标、业务场景、功能需求等几个不同的维度分解需求,分解完后的需求,依然保持续其完整性、独立性,可测可发布,每一个需求的交付,都是一次假设验证的过程,是业务价值创造的机会。

    所以,在软件交付协作中,通过精益交付看板可视化需求流动,才能做到价值驱动;只有通过需求,以一个整体视角,可视化“端到端”的价值流,才能做到在协作过程中的前后(职能)拉通。始于用户问题的提出,终于用户问题的解决。

    image.png

    所谓,Outcome over output,就是尽可能在最小化 output 的同时,最大化 outcome。output 是任务产出,outcome 是需求结果。站在老板的角度,才不看你完成了几个任务,他关心的是交付了多少特性需求。

    【要诀】以需求为单位进行协作,更关注业务价值视角。通过精益交付看板可视化需求交付过程。

    流动效率 vs 资源效率

    资源效率,指的是那种视人为资源,关注人效,制造局部繁忙。然而局部资源效率的提升,并不能使整体效率提升。这是为什么呢?

    因为,产品交付的整个过程,需要协同所有职能,包括(但不限于)业务、产品、开发、测试和运维。关注资源效率,一是软件的交付取决长短板;二是每个职能进行局部效率优化,容易形成效率竖井,即局部来看,效率很高,产出了很多中间制品,竖井之间的交接形成了批量,整体效能并未得到任何改善。

    image.png

    以流动效率为核心,就是要以需求为流动单元,从用户来,然后快速流向用户,加速需求的 Time to market。流动效率的快慢直接决定了用户响应、获取反馈的效率。以流动效率为核心,必须拉通交付流程中的所有职能,打破组织壁垒。同时,聚焦流动效率,可以帮助组织即时暴露协作中的问题,如阻塞、等待等,这些问题可能是协作问题,也有可能是工程能力问题。

    软件研发过程中的主要问题,永远都不是闲着的资源,而是闲着的需求。

    做个不太恰当的比喻,关注资源效率的老板是计时发薪,关注流动效率的老板是计件发薪。你们老板属于哪一类呢?

    【要诀】资源效率,是关注个人人效,关注人力的利用率,繁忙的局部资源效率,并不能在整体上带来流动效率的提升。

    关注问题 vs 关注活动

    僵尸式站会,指的是那种照搬方法论框架,追求形式主义的站会现象。这一现象,人们往往会面临“站会是要站着开,还是坐着开?计划会议需要分上下午两场,还是集中在下午?”这样的问题。过分关注活动的形式,而忽略了问题本身就是本末倒置。

    方法论框架的目的是为了交流理解的需要,而不是生搬硬套,照本宣科。软件项目协作,应该关注问题的解决,阻塞的移除,关注需求如何快速从前一道工序流动到下一道工序。项目协作中,应该关注:

    • 当前有哪些阻塞
    • 哪些到期应该交付,而不能交付的需求
    • 依赖有哪些
    • 交付的价值流中是否有中断
    • 当前交付过程中的瓶颈有哪些

    我们建议的站会 6+1,是对协作中关注问题的一个指南。

    image.png

    我们不建议照搬哪个方法论的框架,如站会是要站着开,还是坐着开?计划会议需要分上下午,还是一个下午?过分强调活动的样式,就是形式主义。方法论框架的目的是为了交流理解的需要,而不是生搬硬套,照本宣科。

    一切不以解决问题为目的的形式主义都是耍流氓。

    【要诀】站会 6+1。

    跨职能团队 vs 单一职能团队

    以需求价值驱动,流动效率为核心,意味着在协作过程中,必须以业务驱动,拉通从业务、产品,到开发和测试的各个职能,跨职能协同。单一职能的团队,容易形成职能竖井,导致各个职能在局部繁忙,但是整体系统协作效率低下。

    我们假设团队内部的沟通效率始终大于跨团队沟通的效率,通过组建跨职能团队,可以有效提升在协作中的等待问题,让整个团队关注在需求的交付上,而不是任务的完成。跨职能团队可以是实体团队,如果没有条件,组建虚拟的跨职能团队也是一个非常不错的尝试。

    image.png

    【要诀】可以虚拟组建跨职能团队,拉通从业务、产品,到开发和测试的各个职能,跨职能协同。

    代码扫描 vs 代码评审

    人们过分强调代码评审(Code Review)的作用,而忽视了自动化代码扫描的能力。代码评审本身并不能直接提升代码质量,代码评审是社交化编程的一种手段,旨在代码评审中,形成促进团队内部知识共享,提高团队整体水平,确保团队统一规范。其本身是员工编程技能培养的一种手段。
    image.png

    代码扫描,可以自动化地完成代码质量的检查,借助技术手段,促进代码的高可见性,如代码的重复度、复杂度、扇入扇出依赖度、领域语言识别等等,这远比人工的检查效率高出许多。同时,结合静态代码扫描和规约扫描,把一般性的问题可以快速识别出来,如格式问题、基本的语法错误、潜在的内存问题等等;而对于一些内存问题及性能问题,也可以通过动态检查的手段来检查,如 C/C++中,常用 Valgrind,llvm-clang,efence 等等小工具就可以完成相应的动态检查。

    对于 Java 开发者而言,Java 开发手册是一个不错的手段,同时,云效代码管理工具,内置代码安全扫描等功能,可以抓出代码的大部分安全问题。

    【要诀】代码评审是开发者能力培养的手段、而非质量守护手段。借助代码规约,通过代码扫描完成代码质量检查。

    持续发布 vs 批量发布

    持续发布,就是持续地发布,即持续、快速、可靠地发布软件。持续发布,有助于问题的快速发现,同样,持续发布有助于工程效能问题的发现,需要做到持续发布,意味着:

    • 需要建立统一规范的发布流程,以工具手段,将流程内建在工具上,防止过多的人工参与引入不必要的问题和安全风险。
    • 建立自动、完善的质量守护体系。
    • 自动化的部署手段,部署尽量做到无人工介入,如采取 Docker 镜像方式,代码与配置分离,一次构建多次部署。

    持续发布意味着持续获得反馈,每天的工作有反馈。更多的反馈和持续改进的机会,有助于质量及工程效率的提升。基于云的一站式代码托管和持续发布系统,可以快速发现,即时反馈。让在线发布协同成为可能。

    批量发布意味着大爆炸式集成,问题集中爆发,传统的以瀑布或大迭代方式的开发方式,一般都是批量的发布方式,在当前业务不确定性如此强,变化如此快的大环境下,这种批量的发布越来越不受待见。

    image.png

    【要诀】建立统一发布流程和规范,通过工具或云原生技术实现一次构建多次部署。

    自动测试 vs 人工验证

    持续发布的效率,在很大程度上受制于质量验证的效率,人工验证的方式,完全依赖于人工验证的速度,对于互联网多端多环境的开发方式,人工验证的手段完全跟不上工程效率的需要。采用自动化的回归的方式,让开发者每次提交都能快速获得反馈,安全放心,有信心。

    常见的自动化测试手段可以用于基于 Robot Framework, Cucumber 等工具进行接口的自动化测试,服务间调用的契约测试,流量回放等等。

    这样,有了自动化的回归手段,开发者提交代码,自动触发持续集成系统的回归验证,在第一时间就能获得反馈,有问题快速进行定位修改,再提交,再回归。

    【要诀】自动化回归,自动化测试,持续反馈。

    下图为基于云效构建的 DevOps 协作示例:

    image.png

    原文链接:https://developer.aliyun.com/article/765773?

    版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
    展开全文
  • 浅谈软件研发管理体系建设

    万次阅读 2018-12-09 15:06:47
    最近一段时间,我一直在反复思考一个问题:我们的软件研发管理体系应该是怎样的?在不断思考的过程中,逐步有一些粗浅的认识,在此将这些认识记录成文字,并期待能够与更多的伙伴碰撞,进一步完善这种认识,并逐步...

    最近一段时间,我一直在反复思考一个问题:我们的软件研发管理体系应该是怎样的?在不断思考的过程中,逐步有一些粗浅的认识,在此将这些认识记录成文字,并期待能够与更多的伙伴碰撞,进一步完善这种认识,并逐步上升到理论高度,从而有利于指导具体实践。

    1. 对软件研发管理体系的一些概念认知
    1.1. 研发管理是什么
    关于研发管理,百度百科中这样定义:研发管理就是在研发体系结构设计和各种管理理论基础之上,借助信息平台对研发过程中进行的团队建设、流程设计、绩效管理、风险管理、成本管理、项目管理和知识管理等的一系列协调活动。

    也就是说,研发管理首要一点就是要根据公司业务的发展确定相应的研发体系结构,之后按照这种研发体系结构组件一支高水平的研发团队,设计高效合理的研发流程,借助合适的研发信息平台支持研发团队高效工作,以绩效管理调动研发团队的积极性,以风险管理控制研发风险,以成本管理使研发在成本预算范围内完成研发工作,以项目管理确保研发项目的顺利进行,而知识管理使得研发团队的智慧联网和知识沉淀。

    纵观各类软件企业,由于自身所处环境不同,因此其软件研发管理模式也不尽相同,这其中有基于CMMI能力成熟度模型指导下构建的研发管理体系,也有基于IPD集成产品研发框架指导下构建的研发管理体系,当然也有一些目前不少小企业、互联网企业推崇的敏捷研发管理体系。不同的研发管理体系其实都会有相应的交叉部分,最终追求的目标都是能否适合企业的发展,给企业带来市场和财务上的成功。

    1.2. 基于CMMI的研发管理
    CMMI能力成熟度模型相信大家都不陌生,从一级到五级,覆盖了22个过程域,一般能达到CMMI3级别的基本上可以理解为各类流程、过程规则等已经达到一个较好的水平。当然,这里主要是指企业能够确实按照CMMI模型去实践,这种实践其实更适合于以瀑布式开发为主导的项目开发及产品研发模式。然则,实际上,大部分企业尤其是国内企业并不会严格按照这个模型去做,因为如果每一个过程域都不打折扣地执行地话,需要非常标准化的流程和强大的资源支撑,在这个讲究快速响应变化的时代其实是很难做到的,通常这个时候都会进行相应的裁剪,甚至会结合敏捷迭代等方面的模式,从而逐步形成自己公司的研发管理体系。

    1.3. 基于敏捷模式的研发管理
    在这个快鱼吃慢鱼的互联网时代,对用户和环境越来越要求要快速响应。敏捷研发是当前不少互联网企业、中小企业推行的研发管理体系,主要理念就是敏捷迭代、小步快跑,快速改进、拥抱变化,用户参与等等。目前这方面也有不少公司除了有相应的敏捷研发体系之外,还有相应的成熟工具做支撑。例如,腾讯的TAPD敏捷研发平台就是其中的代表。通过对用户故事的层级拆分,实现对需求的有效管控和分解,从而确保持续迭代上线。

    敏捷研发管理在当前我们以业务为导向、项目为主的情况下,要全面实施尚有较大困难,当然并非是完全不能做,主要是当前所处的环境、所面向的业务、项目开发模式、人员结构等可能较难满足敏捷模式推行的需要。

    1.4. 基于IPD的研发管理
    之前有简单了解过IPD产品研发管理体系,我认为其中的核心就是“四四四”模型,四四四代表了四大团队、四个流程、四个支撑体系。

    四大团队建设包括建立集成产品管理团队(IPMT)、建立产品市场团队(PMT)、建立产品开发团队(PDT)、建立技术开发团队(TDT)。

    四大流程建设包括建立产品战略流程、建立需求管理流程、建立产品开发流程、建立技术开发及平台开发流程。

    四个支撑体系建设包括建立项目管理体系、建立质量管理体系、建立绩效管理体系、建立成本管理体系。

    个人感觉,基于IPD的产品研发管理从整体上来看是一个相对重量级的体系,要落地执行往往需要从整个公司层面去整体考虑和推动。

    IPD的理念和敏捷开发理念在本质上是基本一致的,比如以市场需求(用户价值)为核心,将产品开发看成一项投资(商业价值),通过CBB—公共基础模块和跨部门的团队准确、快速、低成本、高质量地推出产品(各评审点的多团队参与和决策、通过各种技术改进提升产品开发效率和降低浪费、持续交付)。

    从理论上来讲,IPD研发管理体系是一个较全面的体系,在当前我们的现状下也可能容易出现水土不服的情形,当然其中有一些好的做法是值得借鉴的。

    2. 什么样的软件研发管理体系适合我们的发展
    从项目及产品的研发角度来看,发展到一定阶段的传统IT企业在研发管理上多数都是基于瀑布型的传统研发模式,由于项目的特点及人员的组织结构等因素,项目开发及产品研发的周期往往较长,较难适应市场快速变化的需要,也较难做到对客户的需求进行快速响应。而大部分的互联网公司及一些大厂,推行了敏捷研发模式,或者是在标准化项目管理和敏捷迭代两者融合上进行了相应的实践。

    那么,针对当前我们所面临的一系列问题,究竟什么样的软件研发管理体系在未来一定时期内适合我们的发展?我们需要重构我们的软件研发管理体系吗?我们有必要重构我们的软件研发管理体系吗?带着这些问题,我想主要思考几个方面的问题。

    2.1. 能否快速适应未来业务的发展变化
    技术是为业务发展而服务的,因此在考虑软件研发管理体系构建时,第一个要考虑的问题就是我们的软件研发管理体系能否快速适应公司未来业务的发展变化。特别是在传统IT业务与互联网新兴业务加速融合的大环境下,信息化能力是越来越多客户的第一选择,因此在业务的快速发展方面需要更加强有力的技术支撑,而这个支撑的背后就是需要我们能够有一套能够快速响应变化、敏捷高效的研发体系,特别是能够有一定的前瞻性并支撑到老业务的快速转型和新业务的拓展。

    2.2. 在业务出现较大波动时能否弹性伸缩
    另外一个问题就是,业务在发展过程中,受大环境等诸多因素的影响,定然很难一直都是呈现直线上升的发展趋势,这当中必然会有波峰波谷,只不过这个波峰波谷是大是小的问题。而我们面临的问题则是,当出现较大的波峰波谷的时候,我们的研发管理体系应该如何适应?特别是在软件业务处于相对低谷时,既能够继续保持对技术研发的持续投入,又能够在应用开发等方面有一定的可伸缩性,从而正确地处理好软件生产效益问题。这里面可能会涉及到中高层次软件人才的相对稳定和低层次软件人才的灵活流动等问题。特别是在我们业务多样化的背景下,不同业务单元的发展会有不同的发展路径,对软件研发能力的诉求也有所不同,那么这里面首先涉及到的一点就是如何有效平衡基础研发能力和行业研发能力。

    对于基础研发能力,个人认为应该是一个软件公司最内在的核心技术能力,往往很多时候基础研发工作很难像做行业应用开发那样立竿见影,但这项工作干得不好往往又容易成为行业研发能力的掣肘,这也是我们当前在人工智能、区块链等新技术潮流背景下总感觉难以发力的原因之一。

    对于行业研发能力,个人认为应该要从两个方面去考虑,一个是产品化的能力,其二才是应用开发能力。应用开发能力很好理解,就是目前我们这么多年以来一直在做的各种类型的项目开发,而这里面大部分的项目开发其实都是偏应用层面的开发。而产品化的能力则是最近一两年以来我们重新关注的一个内容,不过这条路上我们尚开始起步,还有很长的路要走,也还有不少坑要踩。个人认为,产品化的能力能否真正发展起来,其中很重要的一点就是要考虑如何与基础研发能力做充分融合。产品化不等同于应用开发,应用开发更多是定制化的开发,是客户导向的软件开发,通常面向的是一个或少数几个的客户;而产品化则是要综合行业、市场、客户群体、新技术等多方面因素的研发,是市场导向的软件开发,面向的是一个或多个的客户群体,甚至面向的是一个市场或跨界市场。

    2.3. 新技术研发及成果转化能否跟上业务变化
    最近几年,新技术层出不穷,在软件架构的发展方面也非常迅猛,历经了单体架构、垂直架构、SOA架构、微服务架构的演化。从我们公司目前的技术研发实际来看,我们有少量的项目/系统采用了SOA架构,然则大部分的项目/系统仍然采用的是单体架构和垂直架构。单从这一点来看,我们在技术领域的持续跟进及成果转化方面已然有落后趋势,这方面需要我们奋起直追才行。当然,出现如今这种局面固然由众多因素催生而成。比如,已有开发框架前端兼容性的问题最近一两年以来常常被诟病,诚然有它内在的好处,然则最近一两年以来,用户对系统的用户体验要求更高了,不再是单纯地满足于功能实现层面,而是开始追求良好的人机交互和界面展现。因此,这方面势必对新技术的要求更加迫切。最近几年,当不少团队都在往前后端分离走的时候,我们至今的绝大部分软件项目开发仍然停留在前后端分离之前,对不少用户界面展现要求高的软件项目而言,难以快速有效响应变化,同时对一些相对比较成熟的软件产品而言也难以做到接口自动化。

    因此,能否在新技术的研发上抓住正确的方向并加快研发成果转化,为业务的快速变化提供强有力的技术支撑,是一个摆在我们面前急需解决的课题。从当今新技术的发展趋势来看,研发架构方面,我们虽说不能完全抛弃传统的单体/垂直架构,但我们必须要往微服务架构方向迈进,除了与最新技术接轨之外,更重要的是如何进行业务解耦,沉淀行业积累,并反向推动人员组织层次的变革,提升软件生产效率,提高软件质量。

    除此之外,对于人工智能、区块链等新领域,也是需要综合业务应用场景打造适合我们自身发展的技术+业务融合之路。

    2.4. 在标准化和敏捷迭代之间如何平衡
    标准化的软件研发道路固然有不少好处,有严谨的流程、规范的体系、固定的套路,当然更多的则是瀑布开发模式,虽然最近几年也陆续有迭代开发的模式,但更多的是被动式响应,而且这种迭代开发模式基本上是大阶段的划分,在每一个大阶段里面依旧是一个典型的瀑布开发模式,即历经需求分析、交互原型设计、UI设计、Web前端开发、程序开发、系统测试、部署实施等步骤,横跨周期往往较长,一旦发生需求变更,变动的代价过高。

    敏捷开发强调以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

    那么,问题来了,既然标准化项目管理模式下存在太多流水线作业及效率低下等问题,那么我们能够直接转向敏捷迭代模式呢?世界上万事万物都是对立统一的,个人认为不论是标准化项目管理模式还是敏捷迭代项目管理模式都有其擅长的一面。一方面,在现有的以项目为主导的软件开发体系中,标准化模式是我们一直以来的主要做法,也积累了不少经验做法;另一方面,采用敏捷迭代模式对于产品复杂不断有新需求加入等场景是比较适合的。所以这里面更多的是考虑如何更好地平衡标准化项目管理和敏捷迭代两者之间的关系。基本的思路就是结合标准化项目管理和敏捷迭代的优缺点进行适度裁剪,既能提高软件质量和软件开发效率,也能够保留一定的规范性和软件过程文档。例如,针对项目管理,通常是五个过程组:启动、规划、执行、监控、收尾,那么我们其实可以结合实际将规划提前,将监控贯穿于执行过程,这样就势必要求在启动时也要做好项目计划相关工作,在执行过程中抓住关注点并定期监控其执行情况,在收尾阶段做好项目回顾总结。

    不论采用何种模式,我们的根本目标就是达到更低的成本实现更快速、更可靠的交付。近年来比较火热的是DevOps。DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

    因此,我们的软件研发管理体系中是否应该引入DevOps,进而改善公司组织文化、提高员工的参与感、提高交付效率,我想这也是需要重点关注和考虑的。

    2.5. 组织过程资产能否持续积累并盘活
    组织过程资产指一个学习型组织在项目操作过程中所积累的无形资产。组织过程资产的累积程度是衡量一个项目组织管理体系成熟度的重要指标,项目组织在实践中形成自己独特的过程资产,构成组织的核心竞争力。

    组织过程资产主要包括但不限于以下内容:项目组织在项目管理过程中指定的各种规章制度、指导方针、规范标准、操作程序、工作流程、行为准则和工具方法等。项目组织在项目操作过程中所获得的经验和教训,其中既包括已经形成文字的档案,也包括留在团队成员脑子中没有形成文字的思想。项目组织在项目管理过程中形成的所有文档,包括知识资料库、文档模板、标准化的表格、风险清单等。 项目组织在以往的项目操作过程中留下的历史信息。

    经过多年的软件开发,我们做了大大小小形形色色的软件项目和产品,也逐渐积累了一些行业化的软件项目,但总的来看,能够形成规模化效应的软件产品尚较为匮乏,更多的是以定制化开发为主的软件系统,当然也积累了不少项目经验。在这过程中,也积累了不少标准、规范、流程、模板等各类软件过程资源。然而,从目前掌握的情况来看,这些资源是分散的,不够体系化的,还谈不上真正意义上的资产,至少在价值的发挥上还不充分。况且,软件行业这几年的人才流动率明显加快,人员更替的速度以及未能体系化的过程资产积累,加剧了组织过程资产的盘活难度。

    那么,构建一个相对健全的、动态的、能够适应未来业务发展的组织过程资产库就显得尤为重要。这既是软件研发管理体系的一个重要组成部分,也是公司层面应该给予充分重视的。在组织过程资产库构建的过程中,其中很重要的一点就是如何让研发知识与经验成为公司的宝贵财产,这里就要充分考虑研发知识管理。知识管理把“隐形知识显性化”,是一项涉及知识库、过程资产、环境和交流等元素的整合过程,所管理的知识将作为一个团组织中过程资产的重要组成部分。对于软件研发而言,我们需要考虑怎么把业务人员和技术人员脑中的蓝图转化为显性知识。

    3. 构建我们的软件研发管理体系应包含哪些内容
    软件研发管理体系的建设离不开几个关键要素:人员、技术、过程、资源,并在此基础上配以相应的管理手段。进一步来看,要构建适合我们自身发展的软件研发管理体系,需要着重考虑几个能力体系的建设,即:人员组织能力、技术研发能力、过程管理能力和资源建设能力。

    前面也有针对“什么样的软件研发管理体系适合我们的发展”进行了一些相对粗浅的探讨,那么在考虑如何构建适合我们发展的软件研发管理体系之前,我想这里首先要明确一下我们期待构建的软件研发管理体系。我们公司的业务涉及众多行业客户,一直以来主要以定制化项目开发为主,同时也涉及运维服务,而在产品研发等方面则处于起步阶段,且在一段时期内项目、产品、服务将会长期并存,因此,个人认为适合我们的软件研发管理体系应该至少经历三个阶段,包括初期的标准化软件研发管理体系、中期的标准化与敏捷相结合的软件研发管理体系和后期的敏捷化软件研发管理体系。

    基于上述这样的考虑,正常来讲我们当前应该在标准化的软件研发管理体系中要做进一步强化,而考虑到市场的快速变化、技术的日益进步,个人认为我们当前就需要开始考虑标准化的与敏捷相结合的软件研发管理体系。为什么还需要考虑标准化的软件研发管理体系呢?主要是传统的定制化的软件项目开发依旧占据主体,且目前在这方面仍然有非常大的改进提升空间,然而标准化的模式常常是过于强调标准、规范、流程,开发模式过于线性化,因此需要引入敏捷开发模式。所以,我们又需要考虑敏捷的软件研发管理体系,这主要是为了更好地适应市场变化、更快速地响应客户需求,更好地提升软件开发生产效率。

    3.1. 人员组织能力
    关于人员组织能力,个人认为有两个关注点:一是团队的发展,二是个体的发展。这两者是相辅相成、互相融合促进的。综合来看,人员组织能力的建设主要包括设立与公司战略、业务、技术发展相适应的组织架构,并配以构建相对完整可行的岗位体系和对应的人员考核体系,同时在团队建设等方面持续改进与提升。

    关于组织架构,当前的组织架构虽然解决了一些曾经的主要矛盾,但依然存在不少问题,突出的一点就是核心薄弱,即核心技术能力不强,仍旧需要投入大量的人力到各行业的应用开发中,当然这与我们一直以来承接定制化的软件项目开发不无关系。这是当前乃至未来一定时期需要解决的。

    同时,最近几年来的组织架构主要是以职能型组织架构为主,产品线为主导的研发模式尚不成熟,针对项目及产品的团队构建主要是以项目经理来驱动,在项目团队的组成方面固然与互联网的项目团队截然不同。在团队建设方面,需要进一步打通团队之间的壁垒,强化团队的整体协同作战能力。

    在岗位体系方面,特别是对人员的绩效评价方面,需要在已有的岗位体系基础上进一步考虑如何更好地执行落地,确保个人绩效目标与团队绩效目标的一致性和顺利达成。

    3.2. 技术研发能力
    结合我们的实际,我认为在技术研发能力方面要考虑四个方面:一是技术预研,二是技术开发,三是产品开发,四是定制开发。

    关于技术预研,通俗来讲就是:预研=预先+研究。这种预先研究通常来源于几个方面,例如来自外部竞争对手的迫使、来自客户或市场的需求、来自公司高层的决策等。为什么要做技术预研呢?这是扫清前行障碍的过程,这为后续展开总体设计、详细设计指明了方向,也是持续积累公司技术能力、保持与新技术同步而不至于脱离轨道的方式之一。

    关于技术开发,其实这里主要指与基础平台、公共组件、关键技术等方面的技术研发。另外一个方面来理解,技术开发是技术预研的延续,是在技术预研成果经论证的基础上开展的一系列能促进公司发展、业务发展、技术发展而开展的技术研发工作。

    软件产品是指向用户提供的计算机软件、信息系统、套装软件或在提供计算机信息系统集成、应用服务等技术服务时提供的软件,是通用的产品应用于某一行业领域而不是像软件项目一样为某一需求或者单位定制开发。

    软件项目主要为特定企业开发或者部署实施一套专用的系统,在进入项目开发之前需要与用户进行具体的交流和讨论,了解用户心中对于软件预期的样子,后经过招投标,签订合同,实施交付。

    关于产品开发,这方面我们尚处于起步阶段,尚缺乏一套完整可行的产品研发流程及最佳实践,需要摸着石头过河,也需要长期坚持不懈地努力。

    关于定制开发,当前主要是基于客户需求的软件项目定制开发,后续还会包括基于产品衍生出来的定制化开发。前面的这种方式是我们当前最熟悉的模式,主要面临的困境是两个:一是如何实现快速交付,二是如何实现成本可控,从而提升软件项目的利润。

    做项目侧重于在最短的时间内,按照客户的需求开发出操作敏捷,用户体验良好的软件。而做产品则侧重于市场驱动,时间相对充足,但要开发出有竞争力,有自身特色,且受客户欢迎的产品,要求功能响应速度快,操作简单,界面美观。

    技术预研+技术开发是强化内核的内在需要,定制开发是现阶段的生存根本,产品开发则是为未来发展铺路。

    3.3. 过程管理能力
    过程管理能力主要包括项目管理、开发管理、质量管理和配置管理等几个方面,需要一套完整合理的流程贯穿整个过程。

    在项目管理方面,我们需要梳理当前项目管理体系的标准、规范、流程及相关实践,建立以过程为核心、以度量为基础、以人为本的可裁剪、受认可、能执行的信息集成项目管理体系,进一步规范公司的项目管理,提升项目群管理能力。结合项目管理的五大过程组(启动、计划、执行、监控、收尾),并结合敏捷迭代的思想,形成标准化项目管理与敏捷迭代相结合的具有实际指导意义的方法体系,同时将这套方法体系以指南性文件、规范性文件等形式传导到相关人员,确保可落地执行。此外,为加强过程管控、资源共享、工作协同,组建PMO团队,实现对项目群及重大项目的统一管控与决策支持。

    在开发管理方面,一是要落实统一的软件开发规范,包括架构规范、设计规范、UI规范、编码规范、测试规范等。强化设计及开发关键环节的评审,包括对需求、概要设计、详细设计、UI设计等的设计方面的评审,对测试用例等方面的评审,对代码的评审检查(例如利用SonarQube进行代码的自动检查等)及发布评审等。同时通过试点+逐步铺开的方式着力推进CI/CD的落地。

    在质量管理方面,进一步强化项目质量审计,逐步改进软件过程生产效能。而在配置方面,则加强对配置项的识别、配置空间的管理、变更控制等,规范软件开发过程,确保构建正确的系统。正确应用软件配置管理是开发高质量软件所不可缺少的。软件配置管理的过程是软件开发过程中质量管理的精髓。

    综合来讲,在过程管理方面就是要形成一套适用的软件研发管理流程,并配以相应的节点管控,让不同开发角色之间即各司其职又相互融合促进,从而促进软件开发自组织能力的逐步提升,充分调动软件开发人员的主动性和积极性。

    3.4. 资源建设能力
    简单来讲,资源建设是软件研发管理体系中的支撑体系。资源建设主要包括了一系列的制度规范、工具、模板、过程资料及交付物(例如项目文档、源代码等),以及相应的经验、知识沉淀等。一是要适时梳理相应的制度、规程、标准、规范、文档模板等,形成标准化资源库;二是要对不同行业历年来的项目资料及源代码分门别类做好规划和归档管理,形成静态库(归档库)和活跃库,同时做好数据安全管理;三是要对软件研发人员及工作中的一些隐性知识转化为显性知识,并逐步构建软件研发的知识图谱,促进知识经验的持续积累与转化,并通过链条式、网状式等方式实现知识分享与传播,形成经验知识库。

    展开全文
  • 包含: 1、概要设计说明书_V1.0.doc 2、开发帮助文档.docx 3、客户访谈记录模板-V1.0.xls 4、数据库设计说明书_V1.0.doc 5、系统安装手册-V1.0.doc 6、详细设计说明书_V1.0.doc 7、项目里程碑计划安排.mpp ...
  • 华为软件研发的上机试题和答案 感兴趣的可以看看
  • 软件测试入门视频教程

    万人学习 2019-06-25 10:59:08
    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试...
  • 《QuickTest Professional》原书作者授课,书籍配套视频,QuickTest是测试领域的一门重要的专业技术课程,其属于测试领域中课程。课程讲授当前HP旗下主流自动化测试工具QuickTest Professional。
  • 项目管理工具是团队研发过程中不可缺少的工具,有助于团队协作,大大提高开发效率,这里对几个项目管理软件进行了对比。 1.TOPO 适用于重点关注任务、缺陷、文档及代码的研发团队。支持多项目数据汇总对比,完整的...
  • 软件设计是怎样炼成的?

    万人学习 2019-11-14 13:37:20
    软件设计视频培训教程,该课程告诉大家,软件设计并不是概要设计与详细设计这么简单,更加不是纸上谈兵的事情。课程全程活用UML(统一建模语言或标准建模语言),为你分享架构设计、数据库设计、用户体验设计和详细...
  • SDCC2015大会精彩演讲PPT集锦

    万人学习 2015-11-26 17:20:30
    SDCC2015中国软件开发者大会,由CSDN重磅打造,作为年度的技术盛会,邀请了近百名国内外业界领袖和知名技术讲师共论技术热点与佳实践。 本压缩包汇聚SDCC2015所有可公开的讲师演讲PPT,共计10份。已购买大会门票的...
  • 帮助学习者掌握从事软件测试工作的基础理论与技能,熟知软件测试的整个流程并胜任招聘企业中初级测试工程师职位的要求。
  • 1、本课程针对JMETER软件性能测试八大组件:配置元件、前置处理器、定时器、sampler(采样器)、后 置处理器、断言、监听器以及逻辑控制器等内容全方位讲解。 2、参数化、badboy测试脚本开发以及...
  • 《QuickTest Professional》原书作者授课,书籍配套视频,QuickTest是测试领域的一门重要的专业技术课程,其属于测试领域中课程。课程讲授当前HP旗下主流自动化测试工具QuickTest Professional。
  • Jmeter性能测试从入门到精通-全程实战 全程实战,每个知识点通过实际项目演练讲解 理论实践结合,既会做,又知道为什么这样做 讲解时同其他工具做对比,加深理解,了解区别 分享技巧,用起来事半功倍 ...
  • 您观看课程学习后 添加小助手免费领取【超全Python资料包+17本学习电子书】 ...想要学习软件测试自动化的同学,必须有一个扎实的编程基础,本课程作为自动化基础课程,适合大家入门学习。
  • Robot Framework 自动化测试框架

    万人学习 2019-11-29 15:16:52
    Robot Framework 自动化测试框架,包括接口测试、数据库测试、Web测试、App测试。
  • Python自动化测试之Selenium

    万人学习 2019-11-29 15:18:02
    本课程详细介绍了Selenium Python版本的自动化测试方法和实践,通过本课程的学习你将掌握如下内容:Selenium 测试环境搭建单元测试、生成测试报告、定位元素、WebDriver属性和方法、WebElement属性和方法、操作form...
  • 软件测试速成篇

    万人学习 2016-08-23 14:00:03
    课程内容是全面介绍软件测试知识的,帮助新手入门到软件测试领域(包括测试的技巧、测试用例的设计、如何迅速找出软件缺陷),并且胜任相关的工作,并且对软件测试管理者如何应对工作中遇到的风险与策略。
  • C语言实战之学生成绩管理系统

    万人学习 2018-10-22 21:38:04
    2.熟悉企业软件开发的基本流程,树立软件工程的思维和概念 3.具备独立开发一个小型甚至中型软件的能力:XX管理系统 4.具备企业初级工程师的能力和水平,实现从学生到工程师的初级跨越 关注更多新教程,可以关注...
1 2 3 4 5 ... 20
收藏数 225,636
精华内容 90,254
关键字:

软件研发