对M1/M2阶段的总结  

M1阶段的总结反思见我以前的博客,我以前曾经写过。现附上链接。http://www.cnblogs.com/jirufeng/p/4990245.html

  M2阶段主要是对我们做的LETS的升级。我们主要在关注、评论、IM和界面几个方面进行的升级。我们按照功能进行了分工,平均是两个人做一个功能。M2阶段和M1阶段就有了很大地不同。因为M1阶段,几乎是我们一块做的开发,所以工程中每个部分都很熟悉,对整体有较好的了解,而M2阶段,完全是新做一个功能,然后融合到原来的工程里面,这就使我对整体工程的把握变少了。应该说这样更符合软件工程的思想,比如到了大公司,我肯定只是做软件的一部分。另一个不同点就是我们M2阶段是以功能为主导,通过实现一个功能来学习一系列的技术,而M1阶段是以技术为主导的,最初功能为空,每学会一个技术,就把它能实现的功能加进去。这使得M2阶段的难度增长了很多,因为新增一个功能要学习太多的功能,而且由于时间有限,不可能从零开始一点点的做新的功能。这就只能找一个现有的工程,进行抽取和融合。这个过程中出现了很多难以解决的问题首。先是xml类的问题,比如manifest.xml中的activity的说明,layout中的布局,使用的图片等等。这些从一个项目转移到另一个项目时,很多需要更改。下一个问题是Bmob的消息发送机制,它把发送的函数实现写在一个sdk中,我们无法查看,所以并不知道它的实现原理,然后仿照它的消息发送写,就是不成功,这里浪累了很长的时间。而且要是完全使用被引入的项目的数据结构,需要改变数据库的结构。这个我们最初竭力避免的,但是最后通过android studio的反汇编,努力读出了必须是用一个新的类,必须改变数据库的结构。

  以上是关于技术方面的感悟。另外还是感觉到一个团队不应该全都是搞技术的人。张炯老师说过,一个团队里如果有人只是负责想法或者管理,一点代码也不写,这也是合理的。从公司的角度看,这确实是正确的,我感觉在公司并不是程序员就是最NB的。但是在我们的课程中,我们无法模拟到公司的环境,还是做得以技术、代码量为重。有点感觉我们所有的队伍都缺少系统的测试、缺少定期进行规划。缺少系统的测试是说,每个队伍都认为可以一边写一边测试,甚至认为测试是浪费开发时间。编译课程的学习让我认识到了测试真的是一门艺术,有的同学的测试就十分完善,测试数据覆盖面很全,测试思路十分清晰,测试结果显示也十分清晰。还有缺少定期规划,大多数队伍都是开始定了计划,本次迭代要开发哪些功能(当然可能也有队伍没有规划,就是有空就写点,写多少算多少)。但是,随着学业压力的增大,大家都先去写哪些最着急的作业了,比如编译、数据库、数学建模,导致软件工程开发时间不够了。这时应该对任务进行重新规划,以期仍然能够按时发布,而大多人都仍然开发着原来计划的任务,导致到截止时间时,项目并不是一个完整的整体,最后是截止时间的一次次的推迟。

  总的来说,还是认为这样的软件工程课是很棒的尝试。从这门课中,确实学到了很多知识,收获了很多前大班所没有收获的。技术上学习到了安卓的很多知识,让我比较轻松地通过了本学期的安卓课程;团队合作上,增加了一定的经历,有了很多感受;项目管理上也积累了一定的经验,比如对git、对文档有了更深的认识。

原来提的问题

  这是我学期之初提的问题。http://www.cnblogs.com/jirufeng/p/4830821.html

1、成长与代码量是什么关系?代码量与工程师的水平呈现什么关系?

  在一个常数以下,成长和代码量是正相关的。但达到这个常数后,代码量增加并不会让自己成长,因此需要使用新的方式来是自己技能增长。

  Edsger Dijkstra 在1969年写道:

  一个Clift 所指的初级程序员,学会了爬行,接着蹒跚学步,然后行走,然后慢跑,然后再跑步,最后冲刺,他认为,“以这样加速度前进我可以赶上超音速喷气机的速度!“但他跑进了2,000行的极限,因为他的技能不会再按比例增加。他必须改变移动方式,比如开车去获得更快的速度。然后,他就学会了开车,开始很慢,然后越来越快,但有进入到了20000行极限。驾驶汽车的技术不会变成开喷气式飞机。

  这个问题是通过上网搜集资料解决的。

2、课本上对结对编程很赞赏,而实际工作中,两个人结对编程是不是浪费了一个人的工作量,有多少比例公司或者部门领导允许两个员工结对编程?

  从网上搜集的资料表明结对编程很受争议。有很多证明结对编程更加高效的理论,但也有很多人对结对编程表示十分厌恶。反对的人有如下观点:

  我们中三分之一是性格内向的人(程序员中的比例可能更高!)。在一般情况下,我们不仅偏好单独工作,而且独自工作时成效更显著。我们并不是不喜欢别人,而是我们的大脑更容易被外部刺激所扰乱(不管好还是坏,结对也是刺激的一种)。对于我们来说,高质量的工作是和得到和保持自己的“区域”有关系的。如果确保了这一点,我们就能做到高效率。如果确保不了,我们就做不到。

  应该说不是所有的情况都适合结对编程,

  App Annie有开展结对编程,并进行过多次回顾,目前大家比较认可的看法是:

  (1)结对编程特别适合于知识的分享和传递。特别适合于帮助开发者快速熟悉自己所不熟悉的领域。对于新员工,效果特别明显。

  (2)如果两个人水平相似,并且对正在工作的领域都很了解的人,结对编程有浪费时间的嫌疑。但我对于这个前提是存疑的。除非特别简单的部分,很难有人真正能说对一个领域全面了解。

  (3)结对编程很累。要求结对的双方都要保证有充沛的精力。

  (4 结对的双方如果脾气对味,技术观点相近,结对会很愉快,而且碰撞出很多火花,效率有明显提高。反之,就可能陷入很多的争吵,而导致进度停滞不前。甚至影响团队协作。

  (5)不是所有的工作都适合结对。技术验证和架构设计都不适合结对。结对比较适合在需求和架构设计明确后的实现阶段。常见的方式有一个人写,一个人看;或者一个人写实现,一个人写测试。一段时间后交换。

  (6)结对编程不能替代代码评审。虽然结对编程对代码的审核程度比代码评审细致的多。但两个结对的人有明显的思维趋同性,从而忽略同样的问题或者犯下同样的错误。

  由此看,如果一个公司不分具体情况,一味使用结对编程,它是注定失败的。

  有知乎网友提到国内很少有人实施,我也搜不到国内结对编程效果的实证,应该可以认为是国内很少实施结对编程。

3、书中讲的敏捷流程变化大,效率高,但我感觉这只适用于小团队,人少才好管理,如果很多人的团队,能否在用敏捷流程?

  现在感觉大公司也不是全都是大型工程,他也分部门、团队,也要开发新的小项目,也是可以使用敏捷开发的。

  下面是一个网友讲阿里的敏捷开发。

  我来说一下阿里的敏捷开发吧,准确地说是scrum开发。就我所知,部分部门如p4p采用的是scrum开发。这些开发模式都结合业务做了一些改良。另外一些部门,任务是根据业务需求来的,就是一个一个的排需求,做需求。

  下面说说Scrum。首先是晨会:即站会。每天早上10-20分钟讲三个问题,昨天做了什么,今天做什么,遇到什么问题。晨会一般9点30分左右开始。迟到一般是请水果之类。

  需求PK:一般2周一次,或者一个月一次需求pk。大概两个月作为一个需求review的周期。

  日报:通过各种方式填写日报;

  项目周报:一般写日报就不写周报。但是需要写项目周报。

  某些团队搞燃尽图:但是实际上这个玩意儿不实用。

  to do、doing、done,这三种任务的面板,某些团队在用,另外也有web的管理工具,用起来相对方便。

  总体来说严格的scrum开发是挺累的,如果连续两天遇到问题没有进展,会压力比较大。可能要请求其他人的帮助了。

  Scrum Master是一个非常重要的角色,因为他要负责和其他团队pk需求。到底做哪些需求,基本上master要非常清楚代价和实现难度。要根据团队的技术实力和团队的成长情况来安排需求。如果master不给力,团队会比较难受。

  很多人都有疑惑,机器学习类的团队如何开展敏捷开发。一般是这样的,通过任务分解把工作拆分为半天到一天的工作量,然后制定里程碑时间点。如看资料、做实验的时间;训练样本、特征开发的时间;模型和预测的时间;最后工程实现。这几个流程下来项目一般会有好几个月。

  这个问题是通过网上搜集资料解决的。

4、如何避免产品开发后期有重大修改?

  这个问题没有得到较好的解决。从课本上看,要在最初的时候做好定位,考虑到产品需求的变化,最初做好架构,以避免后期有重大修改。有重大修改,我认为有两类原因:一类是客户改了需求,一类是自己架构错误。自己架构错误可能是对架构的不熟悉,也可能是对需求理解有偏差,这些应该是可以尽量避免的。还有,客户改了需求,这时候如果客户认为自己改动很大,一般是允许推迟工期的,但一般是客户认为需求只是小改,而产品却要大改,这就产生于没有考虑到需求的变化。一个不负责任的答案就是:要有预测未来的能力。

5、如何进行风险管理?能否用更多的例子来讲解它。

常见的风险应对措施
  风险分析活动分析的目的在于建立处理风险的策略.而风险规避的最好方式是把风险控制在项目启动阶段,把损失减小到最小程度.常见的风险应对措施有:
  (1)建立畅通的沟通渠道和沟通策略.需求的不确定性风险很大程度上是由沟通不畅引起的.因此,在需求调研阶段,要多和应用部门沟通,了解他们真正的需求,最好能将目标系统的模型向应用部门演示,并得到反馈意见,直到双方都达成共识,形成双方认可的验收方案和验收标准,并做好变更控制和配置管理,尽量降低需求不确定性风险.
  (2)配备高素质的项目管理人员.最好是具有丰富的项目管理经验,或是经过系统的项目管理知识训练的人员来担任项目经理,通过制定有效的项目管理计划,并认真执行落实,提高项目的可控性.同时,风险不是静止的、一成不变的,它会随着项目状况的变化而变化,因此,风险管理必须被作为一个日常的正式活动列入项目工作计划,成为项目管理人员的一个重要工作.
  (3)建立一支协作高效的项目团队.技术部门有技术,业务部门有需求,因此,项目组中不仅要有开发商和技术部门的参与,更要有应用部门的参与,从而形成一个合作的项目工作团队,共同理解企业的战略规划和业务发展,从整体全局的角度,提出有效的信息化需求,共同研讨项目进展中出现的问题,共同控制项目进度,共同为项目质量把关.
  (4)制定科学的风险管理计划.从风险管理的角度对项目规划或计划进行审核,建立“风险清单”,对每个可能存在风险的表现、范围、时间做出尽量准确的判断并对风险进行监控,提前做好应对准备.如针对需求风险,要制定相应的需求变更控制;针对技术风险,要安排核心技术人员全程参与开发等.
  (5)选择合适的开发技术.虽然在系统设计时需要考虑新技术的发展和技术的先进性问题,但“最好的不一定是最合适的,最合适的才是最好的”,如果项目组的人员对所需开发的技术不熟,在满足业务需求的前提下,尽可能采用熟悉的技术来减轻项目在成本或进度方面的影响,也可以事先进行培训来减轻对项目的影响,以避免因技术瓶颈导致的项目失败。

  通过上网搜集到的,但是关于具体的实例没有找到。

产生的新的问题

  软件开发中公司是如何培养新人的?一个新人加入团队,他肯定要通过团队的文档来了解项目,但是只是这样是不够的,所以提出问题公司一般如何培养新人。

新的体会

  谈谈关于大泥球的体会:软件开发是一个代码量越来越膨胀的过程。为了引入IM功能,我们引入了有关IM的代码,同时还要做必要的修改以进行融合。这里面实际上引入了很多病没有使用过的代码,使我们的项目出现了杂乱无章、错综复杂、邋遢不堪、随意拼贴的大堆代码,如果继续开发会造成很大地困难:读不懂,出错了不知道是哪,也不敢随意删掉。

  关于敏捷开发的体会:以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。在M2阶段,我们组分了几个小项目:平分、评论、关注、IM。每个小项目的工作能够正常运行时,就把这些代码push到git上,这就保持了敏捷开发的特点。

做中学

  我学到的知识点:

  需求阶段:使用NABC进行需求分析,通过问卷调查获得用户的需求。

  设计阶段:根据用户的需求进行功能设计,前后端共同设计,设计好接口,如果有多个任务,就优先设计重要度最高的任务,按序进行。

  实现阶段:使用合理的代码管理工具管理项目代码,每天scrum进行任务总结与分配。在分配任务时,要根据队员不同的能力安排不同的任务。在组织和管理一个团队的时候,应当尽量做到一个学习成本最小化。

  测试阶段:针对不同的安卓机型进行充分的测试。发布前要进行单元测试、全方位的测试,进行场景测试。

  发布阶段:发布要制定好出口条件,如果满足了出口条件就要尽快发布,不要在想着继续完善再发布,这样就影响了整个计划。

  维护阶段:进入到维护阶段时,一定要及时处理用户反馈的bug,要倾听用户的声音,然后对自己的产品进行修复,产品上的再次迭代。同时要写好技术文档,方便之后再迅速理解之前的代码。

个人作业 Last的更多相关文章

  1. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  2. SQLServer2005创建定时作业任务

    SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...

  3. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  4. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

  5. Python09作业思路及源码:高级FTP服务器开发(仅供参考)

    高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

  6. 个人作业week3——代码复审

    1.     软件工程师的成长 感想 看了这么多博客,收获颇丰.一方面是对大牛们的计算机之路有了一定的了解,另一方面还是态度最重要,或者说用不用功最重要.这些博客里好些都是九几年或者零几年就开始学习编 ...

  7. 个人作业-week2:关于微软必应词典的案例分析

    第一部分 调研,评测 评测基于微软必应词典Android5.2.2客户端,手机型号为MI NOTE LTE,Android版本为6.0.1. 软件bug:关于这方面,其实有一些疑问.因为相对于市面上其 ...

  8. 软件工程第二次作业——git的使用

    1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...

  9. hadoop作业调度策略

    一个Mapreduce作业是通过JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient通过RPC协议提交作业),JobTasker接到JobClie ...

  10. SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

    1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...

随机推荐

  1. 【PAT】B1041 考试座位号(15 分)

    /* */ #include<stdio.h> #include<algorithm> using namespace std; struct stu{ char number ...

  2. ES5数组的遍历方式

    /* 遍历数组 */ var arr=[1,2,3,43,55,66,77,99]; /* 遍历数组 function(item,index) */ arr.forEach(function(item ...

  3. 【日常开发】使用多种工具实现 sql查询没有结果的name

    本文地址 分享提纲: 1. 事情的背景 2. 解决办法 3. 总结 1. 事情的背景 现在需要将2000条数据的name,从user表中查询出来结果,sql 这样写 SELECT * FROM use ...

  4. CSS3 animation动画,循环间的延时执行时间

    如下代码,其中的delay值为3s,但是animation按现在的规则,这个delay是指动画开始前的延时,在动画循环执行间,这个delay是不生效的. .item{ webkit-animation ...

  5. 控件_TimePicker

    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view ...

  6. js如何获得局部变量的值

    方法一: <script> var a; //全局变量 function test(){ var b=20; //局部变量   return b; //返回局部变量的值 }; a=test ...

  7. Java逻辑运算

    逻辑运算是在关系运算基础之上的运算,能处理更加复杂的问题 逻辑运算的结果是 true 或 false 一.逻辑运算的种类: 在java的逻辑运算符中,有这么四类&&(短路与).& ...

  8. 区分Web Server和应用服务器

    一般的信息服务系统架构如下图所示: Web Server:提供Web信息浏览服务,主要处理的静态资源(session,request,js,html,cs等),如响应http请求,响应请求返回静态ht ...

  9. PAT A1149 Dangerous Goods Packaging (25 分)——set查找

    When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...

  10. PAT A1013 Battle Over Cities (25 分)——图遍历,联通块个数

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...