团队作业八——第二次团队冲刺(Beta版本)第7天&项目汇总
项目汇总
第一天:http://www.cnblogs.com/newteam6/p/6879383.html
第二天:http://www.cnblogs.com/newteam6/p/6880788.html
第三天:http://www.cnblogs.com/newteam6/p/6884975.html
第四天:http://www.cnblogs.com/newteam6/p/6895437.html
第五天:http://www.cnblogs.com/newteam6/p/6895446.html
第六天:http://www.cnblogs.com/newteam6/p/6905238.html
第七天:http://www.cnblogs.com/newteam6/p/6910784.html
conding地址:https://git.coding.net/lizhiqiang0x01/Beta-APPsizeyunsuan.git
源代码下载:四则运算源代码
APK下载:四则运算.apk
团队作业八——第二次团队冲刺(Beta版本)第7天
一、每个人的工作
(1) 昨天已完成的工作
登录注册功能的完善与实现和简单测试模块的优化
(2) 今天计划完成的工作
修复昨天写入SD存储卡文件权限问题,以及中级和高级功能的实现。
(3) 工作中遇到的困难
错题本功能的具体实现过程出现问题,因为有一些知识不了解。通过学习后逐步解决了问题。
(4) 每个人的贡献比
二、燃尽图
三、代码
package com.example.asus.appsizeyunsuan1; import android.content.Intent; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.*; public class JieguoActivity extends AppCompatActivity { private TextView rank=null; private TextView rank_name=null; public String cuoti=null; @Override protected void onCreate(Bundle savedInstanceState) { rank_name=(TextView)findViewById(R.id.textView7);//用TextView显示值 rank=(TextView)findViewById(R.id.textView13); super.onCreate(savedInstanceState); setContentView(R.layout.activity_jieguo); Intent intent1 = getIntent(); rank=(TextView)findViewById(R.id.textView13); cuoti = intent1.getStringExtra("date"); rank.setText(cuoti+"%"); readSDcard(); } private void readSDcard() { // StringBuffer strsBuffer = new StringBuffer(); try { // 判断是否存在SD if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/rank.txt"); // 判断是否存在该文件 if (file.exists()) { rank_name=(TextView)findViewById(R.id.textView7); // 打开文件输入流 FileInputStream fileR = new FileInputStream(file); BufferedReader reads = new BufferedReader(new InputStreamReader(fileR)); String st="",net=""; while ((st = reads.readLine()) != null) { net=net+st+"\n"; } rank_name.setText(net); fileR.close(); } } /* BufferedReader br=new BufferedReader(new FileReader(Environment.getExternalStorageDirectory().getPath() +"/rank.txt")); String line=null; while( (line=br.readLine())!=null){ rank_name.setText(line);Toast.makeText(this,"正常", Toast.LENGTH_SHORT).show(); }*/ } catch (Exception e) { e.printStackTrace(); Toast.makeText(this,e.toString(), Toast.LENGTH_SHORT).show(); } } }
https://git.coding.net/lizhiqiang0x01/Beta-APPsizeyunsuan.git
四、模块部分截图
五、项目进展
今天我们将所有的简单版本内容都实现了(主要是实现了错题本功能)
六、小结
项目方面:总的来说,我们是在一步一步向我们的目标靠近,我们修补了昨天的bug,但由于今天被其他事情影响了,没有按时能完成所有功能,今天的部分只完成了一半,我们争取明天补上。我们还是一步一步按每天的安排走的,尽最大努力完成每天的任务量,解决不了的和事发突然的,也只能延到后面,但是我们的拖延症已经慢慢好了,我们总体也越来越完善了。
团队方面:每个人都在努力最好自己的角色,看着大家也都越来越投入了,项目经理每天都给每个人分配任务并时不时的督促,导致大家都按时完成自己的任务,大家之间的默契和配合度越来越高,做东西也越来越上手了,每个人对自己的part也越来越有责任感了。
七、站立会议图片
关于代码的十个问题:
0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新、最稳定版本的软件编译出来,并运行必要的单元测试? (在这过程中,不需要和老队员做任何交流)
只是有一个文档用来指导,使新来的队员能够成功的运行代码,感觉会有点难度,因为考虑到环境搭建需要相应的版本才能够兼容,所以我们在前期需要老队员相应的指导。
1. 你的团队的源代码控制在哪里?用的是什么系统?如何处理文件的锁定问题?
场景: 程序员果冻正在对几个文件进行修改,实现一个大的功能,这时候,程序员小飞也要改其中一个文件,快速修复一个问题。怎么办?
一个代码文件被签出 (check out)之后,另一个团队成员可以签出这个文件,并修改,然后签入么?
有几种设计,各有什么优缺点?
例如,签出文件后,此文件就加锁,别人无法签出; 或者, 所有人都可以自由签出文件
我们源代码是统一时间Git到coding上面的,在白天完成代码功能后,我们团队把各自负责的代码统一运行看是否可以做到正常输出。在签入签出问题上,由于我们在晚上统一整理代码,所以在这方面我们并没有明确的分隔,设定锁。
2. 如何看到这个文件和之前版本的差异? 如何看到代码修改和工作项 (work item),缺陷修复 (bug fix) 的关系。
场景: 程序员果冻看到某个文件被修改了,他怎么看到这个文件在最近的修改究竟改了哪些地方? (例子)
场景: 程序员果冻看到某个文件在最新版本被改动了100 多行, 那么和这100多行对应的其他修改在什么文件中呢? 这个修改是为了解决哪些问题而作的呢? 那些问题有工作项 (work item,issue),或者bug 来跟踪么?
这个问题还是比较容易解决的,应为coding托管代码功能还是比较齐全的,我们可以通过提交历史记录和文件对比很快发现最近修改了哪些地方,通过左右分页对比可以很明显发现修改文件的哪一行,在每一次上传代码时,对其进行响应的备注从而知道为什么问题解决的。
3. 如果某个文件在你签出之后已经被别人修改,并且签入了,那么你在签入你的修改的时候, 如何合并不同的修改(merge)? 你用了什么工具来帮助你?
在签入修改代码时,coding会自动合并git代码不同的部分并加以分页对比,让原程序编写者知道,在签入时需要对其进行告知。
4. 你有20个文件都是关于同一个功能的修改,你要如何保证这些文件都同时签入成功(修改的原子性),或者同时签入不成功?
场景: 程序员果冻要签入 20 个文件,他一个一个地签入, 在签入完5 个 .h 文件之后, 他发现一些 .cpp 文件和最新的版本有冲突,他正在花时间琢磨如何合并... 这时候, 程序员小飞从客户端同步了所有最新代码, 开始编译, 但是编译不成功 - 因为有不同步的 .h 文件和 .cpp 文件! 这时候, 别的程序员也来抱怨同样的问题,果冻应该怎么办?
在签入代码之前,本人应当现在本机上测试,测试通过,便可以很放心的将代码直接签入其中,如果测试不通过,就继续在本机上测试修改知道解决版本冲突问题。
5. 你的PC 上有关于三个功能的修改, 但是都没有完成,有很多文件处于半完工的状态,这时你要紧急修改一个新的 bug,如何把本地修改放一边,保证在干净的环境中修改这个 bug, 并成功地签入你的修改 --- changelist management。
可以到coding上下载原始的源代码,通过直接运行源代码修改,修改完毕,然后再将修复好的bug源代码重新上传到coding上。
6. 规范操作和自动化
你的团队规定开发者签入的时候要做这些事情:
运行单元测试,相关的代码质量测试。
代码复审 (要有别的员工的名字)
和这次签入相关的issue 编号, 任务/task, 缺陷/bug 编号,等等, 以备查询。
请问你的团队有这样的自动化工具让开发者方便地一次性填入所有信息然后提交么? (高级功能, 代码提交之后, 相关bug 的状态会改动为 “fixed”, 并且有链接指向这次签入。)
暂时还没有这样的工具,后期考虑尝试一下。
7. 如何给你的源代码建立分支?
场景:你们需要做一个演示,所以在演示版本的分支中对各处的代码做了一个临时的修改, 同时,主要的分支还保持原来的计划开发。 你们怎么做到的? 在演示之后,演示版本的有些修改应该合并到主分支中,有些则不用,你们是怎么做到的?
场景: 你们的软件发布了,有很多用户,一天,一个用户报告了一个问题,但是他们是用某个老版本,而且没有条件更新到最新版本。 这时候,你如何在本地构建一个老版本的软件,并试图重现那个问题?
让组员都拥有自己的源代码分支,通过coding比较容易实现。
8. 一个源文件,如何知道它的每一行都是什么时候签入的,为了什么目的签入的 (解决了哪个任务,或者哪个bug)?
场景: 一个重要的软件历经几年,几个团队的开发和维护,忽然出现在某个条件下崩溃的事故, 程序员果冻经过各种debug手段,发现问题是在某一个文件中有一行代码似乎显然出了问题, 但是这个模块被很多其他模块调用, 这行代码是什么时候,为了什么目的,经过谁签入的呢? 如果贸然修改, 会不会导致其他问题呢? 怎么办?
将提交代码到coding上,之后修改后会再次重新提交,会产生修改记录,在记录上面会有时间,这样就能查看这行代码是什么时候签入的或者是谁签入的就可以看到记录;通过commit -m命令可以看到为了什么目的签入的。
9. 如何给一个系统的所有源文件都打上标签,这样别人可以同步所有有这个标签的文件版本?
代码每天都在变, 有时质量变好,有时变差,我们需要一个 Last Known Good (最后稳定的好版本) 版本, 这样新员工就可以同步这个版本, 我们如果需要发布,也是从这个版本开始。 那么如何标记这个 Last Known Good 版本呢?
Last Known Good 版本可以理解为基线版本,通常情况下每次正式上线的版本都会打基线,即备份这个版本的源代码和发布包
10. 你的项目的源代码和测试这些代码的单元测试,以及其他测试脚本都是放在一起的么? 修改源代码会确保相应的测试也更新么?你的团队是否能部署自动构建的任务?
在签入之前,程序员能否自动在自己的机器上运行自动测试,以保证本地修改不会影响整个软件的质量?
在程序员提交签入之后,服务器上是否有自动测试程序, 完成编译,测试,如果成功,就签入,否则,就取消签入?
团队是否配置了服务器,它自动同步所有文件,自动构建,自动运行相关的单元测试,碰到错误能自动发邮件给团队
测试目前的确是我们团队一个一个短板,场景所提到的自动测试程序我们几乎没有。如今Beta的开发阶段已经过去,也仅是对成员做出测试数据记录以及测试日志的上传,测试强度依然欠缺。从现在到项目展示的这段时间,我们会尤其重视测试。如若时间条件允许,也会编一个自动测试程序进行各个变更集的编译测试。