结对编程心得---------优秀的队友是成功的一半
一,结对编程的收获
1.团队分工
结对编程作业大部分的时间都是采取共同编写代码,即“一个做驾驶员,一个做领航员”,驾驶员负责敲键盘,领航员在一侧提供建议、检查错误或帮忙搜索相关的资料。
就这次团队项目而言,我们合作还是很愉快的。清明节的后两天我和朱池苇同学一起学习了Qt。由于朱池苇同学的工程能力比较强,所以大部分程序都是朱池苇同学作为驾驶员,而我(刘鼎乾)则作为领航员,与朱池苇同学对问题进行讨论,查找资料,检查错误等。
2.结对编程的意义
我觉得结对编程确实具有非常重要的意义:
- 一个人编写代码,总是有种灯下黑的现象。可能你自己犯的很微小的错误,你花了大把大把的时间,还是搞不出来。而另一个人只需要看一下就能指出,这提高了复审效率。
- 可以不断从别人那里学习,提高自己的水平。这次结对编程,我从朱池苇大佬那里学到了很多,比如良好的代码风格,清晰的编码思路,以及熟练的调试技巧等
- 通过两个人的讨论,更好的解决问题等。
3.代码的可读性
以前数据结构的助教说我的代码可读性差,这是为什么呢,这里附一段我以前写过的代码:
1 unsigned long long a;2 int b;3 for(int i=0;i<10000;i++)4 {5 cin >> a >> b;6 switch (b)7 {8 case 1:9 charu(a); 10 break; 11 case 0: 12 chaxun(a); 13 break; 14 default: 15 break; 16 } 17 18 } 19 20 cout << n2 << "/" << n1 << endl; 21 cout << m2 << "/" << m1 << endl; 22 return 0;
a是什么,b是什么,n1 n2又是干什么的呢?不仅没有注释,而且用的变量名也非常不好。
而这本书给了很多提高代码规范的建议,比如:
- 缩进,一般以4个空格
- 行宽,不多于100个字符
- 用括号清楚地表达优先级
- 断行与空白的{}行
if (condition1) {Do something; }else {Do something else; }
一般用这种方式会让人觉得层次清晰,逻辑分明
- 命名!想我之前写的那段程序,最主要的问题之一就在于没有命名。我以前觉得命名无所谓,但现在觉得,好的命名要让人能够见名知意,这对提高代码可读性是重要的,很多程序员为了一个好的名字还想半天。一般可用下划线来构造很好地命名。
注释,没有注释的代码让人读起来很痛苦,而好的注释主要是告诉别人这个程序在做什么,为什么这么做,以及需要注意的东西。这样别人读起你的代码才不会很痛苦。
于是乎我们就要问,为什么我们需要好的代码规范?为什么我们需要别人看懂我们的代码?
这在结对编程中,尤其重要。假如说没有人看得懂你的代码,结对编程也就只是纸上谈兵了。
4.好队友的重要性
这次结对编程,我从我的队友朱池苇同学身上学到了很多。他的工程能力很强,代码可读性也很好,而且思路也很清晰。能经常和这样的队友结对编程,我突然对能否最终调试成功充满了信心。这说明了,结对编程的队友有多重要。
二、对接的收获
UI主要工作量集中在设计界面,代码量并不大,大概在300行左右(除开Qt Creator生成的代码,自动生成的代码在1500行左右)。但是对接的时候,各组Core的API甚至逻辑功能的差别,给我们带来了巨大的麻烦。
首先是逻辑层面,有的组要求加减、乘除分别绑定,而有的组要求可以单独支持任一种运算;有的组要求小数和分数不能同时存在,而有的组要求一个式子里既有小数又有分数,这样的情况下,同样的UI界面不可能满足所有Core的要求(比如QRadioButton选项互斥,而QCheckBox可以复选,不支持复选的 core用了QCheckBox,就会造成非法输入),也许需要根据不同的core发布不同版本的UI。但这个工作量显然太大了。
另外则是每个组的接口参数不同,需要编写不同的接口转换代码,而且代码量的高低,很大取决于API的好坏。本次所有Core中的API主要分为三个档次:
第一档:接口函数少,传参合理,可以直接把UI获取的用户作为函数参数。这样的接口,对接代码量是最小的。
这是第一档的接口代码:
//setting set_setting(oNum-1,ui->oUppRange->value(),ui->precisionSpin->value(),ui->fraction->isChecked(),ui->real->isChecked(),ui->mulDiv->isChecked(),ui->power->isChecked()); // generate one question and one answer (loop this) std::string *question = new std::string(); std::string *answer = new std::string(); generate(&question,&answer); ui->questionBrowser->setText(QString::fromStdString(*question)); ui->answer->setText(QString::fromStdString(*answer));
第二档:接口函数多,传参合理。这是本次大部分组core的API所处在的档次,这种API把setting的每一个参数分别设置为一个函数,需要单独传输,但是参数设计合理,可以直接将用户输入作为函数参数。这样的接口,setting的代码量较大,有时需要做用户输入到core接口的转换(例如“是否支持小数/分数”的参数是0,1,2,但UI得到的数据是选择框是否被选中的布尔型,因此要先做逻辑判断,再进行转换)。
这是第二档所需要的接口转换代码(为了避免可以看出是哪一组,我对函数名作了修改):
//setting core.setQueNum(ui->qNum->value());core.setDataNum(ui->oNum->value());core.setRange(ui->oUppRange->value()); core.setAccuracy(ui->precisionSpin->value()); //set operator typeif(((ui->mulDiv->isChecked())&&(ui->power->isChecked()))==true)core.setOprType(3);else if(ui->mulDiv->isChecked()==true)core.setOprType(2);elsecore.setOprType(0); //set operand typeif(ui->fraction->isChecked()&&(!ui->real->isChecked()))core.setDataType(2);else if(ui->real->isChecked()&&(!ui->fraction->isChecked()))core.setDataType(1);else if((!ui->real->isChecked())&&(!ui->fraction->isChecked()))core.setDataType(0); //generate all questions question=core.getQue(); answer=core.getAns(); ui->questionBrowser->setText(QString::fromStdString(question[0])); ui->answer->setText(QString::fromStdString(answer[0])); //loop this (i is defined in the header file) if(i<totalQNum) { ui->questionBrowser->setText(QString::fromStdString(question[i])); ui->answer->setText(QString::fromStdString(answer[i])); i++; }
第三档:最差的一档,函数多,而且参数设置不合理。
某一组,曾经将所有的函数的传入参数全部设置为了字符串!!!这意味着什么?意味着UI组要将所有得到的整形、布尔型先进行逻辑判断,再转化成对应的字符串,最后再调用接口函数。而当我们为这个组的接口编写了复杂的转换代码并实现了之后,这个组将API改回了直接传参的模式。(就不贴代码了)。
(这里对号入座太简单,在这里对那一组说声抱歉,但是我实在很想吐槽这一点)
不难想到,实际上这种输入为字符串的方式一定也给core组增加了工作量,那么他们为什么会这样做?
我可以理解这个core组的想法,可以说出发点是非常好的,他们希望自己的接口更加“易懂”,对于最终用户,什么东西最好懂?当然是自然语言!比如,字符串“precision”代表了“精度”,“+-*/”代表“加减乘除”,函数的功能是简单易懂的。但是他们忽略了一点,这种考虑应当是相对于最终用户,也就是使用这个软件的人而言的,而不是相对UI编写者而言的。对于UI编写者,只需要定义清晰易懂的变量名、提供能够理解的API文档,就足够了。而如何用自然语言去通俗易懂地表述输入要求,应当是我们UI组所考虑的内容。
转载于:https://www.cnblogs.com/ustcldq/p/8892420.html
结对编程心得---------优秀的队友是成功的一半相关推荐
- 结对编程-Core 第12组 [pb15061359+pb15061351]
一.项目要求 1.输入题目数量,生成操作数为3~5个的四则运算题目 2.输入上限值控制生成的操作数的最大值以及结果的最大值 3.输入支持的操作符类型:加.减.乘.除.乘方.括号 4.输入支持的操作数类 ...
- 程序员curd编程是什么_为什么许多程序员讨厌结对编程?
结对编程是国外非常盛行的一种敏捷开发方式,今天 Google 最顶级的两位程序员 Jeff Dean 和 Sanjay Ghemawat 就是结对编程世界让人颇为津津乐道的人物.不过,有人喜欢有人讨厌 ...
- 为什么许多程序员讨厌结对编程?
结对编程是国外非常盛行的一种敏捷开发方式,今天 Google 最顶级的两位程序员 Jeff Dean 和 Sanjay Ghemawat 就是结对编程世界让人颇为津津乐道的人物.不过,有人喜欢有人讨厌 ...
- 2022软件工程K班结对编程任务
https://github.com/vincigeorge/Pair_work2/tree/main https://www.bilibili.com/video/BV1Ee411L7zR/?vd_ ...
- 7个 优秀的远程“结对编程“编码工具
疫情原因,大家都在家远程办公.不知你是否正在寻找与远程团队协作的编码工具?本篇文章,我们寻找了当下最好的协作编码工具,这些工具将使远程结对编程更容易,并提高你和你的团队的工作效率. 如果你是一名程序员 ...
- 结对编程前对队友程序的分析与对比总结
目录 1. 项目需求 1.1 项目名称 1.2 用户 1.3 功能 2. 对队友程序的分析 2.1 主要流程分析 2.2 主要函数分析 2.3 优点 2.4 缺点 3. 与自己的程序比较 4. 个人项 ...
- 结对编程遇到猪队友,“你用的才是中华田园敏捷!”
现在我们有一个大坑,缺少软件设计.质量保障,项目leader常常盲目强调快速迭代,项目最终会陷入到质量腐化.Bug百出.交付失控的悲惨境地. 对这种空谈快速响应变化的"敏捷",我更 ...
- 结对编程队友代码分析
这次结对编程的队友是可熊,感谢可熊不嫌弃我这个鶸,,和我组队 通过分析可熊的代码,深刻体会到了自己代码的不规范以及代码可延展性的缺失 比如using namespace std; ,这一行代码虽然自己 ...
- “结对编程” 实验心得
实验内容: 1. 联系结对编程,体验敏捷开发中的两人合作: 2. 两人一组,自由组合: 3. 使用一台计算机,共同编码,完成实验要求: 4. 在工作期间,两人的 ...
最新文章
- windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现
- SAP EWM 与 AGV 机器人对接的三种模式
- java 消息队列_java消息队列
- ssh(Spring+Spring mvc+hibernate)——applicationContext.xml
- 计算机组成原理题目题型总结)第三章:存储器
- 【AI视野·今日NLP 自然语言处理论文速览 第十四期】Thu, 24 Jun 2021
- 基于OpenCV的计算机视觉入门(2)图片几何变换入门
- 【python】见过if else组合,但是你见过for else组合吗?
- .NetCF 绘制半透明效果
- 对图像进行各种滤波的编程思路
- 王长震《非财务经理的财务管理沙盘推演课程》
- 1分钟链圈 | 硅谷和成都互设科技金融中心;帅初:区块链更容易落地游戏和版权行业;区块链底层技术布局基本完成
- 三星android版本4.2.2,三星 Galaxy Note (i9220) 安卓4.2.2 稳定 流畅版
- css用网络图片做背景图片,网络编程css为图片设置背景图片
- 奉子成婚,永远不可能成为潮流
- AX 2009 删除已经发出领料单的订单行
- java graphics 渐变色_使用BufferedImage进行渐变色操作
- 【线程池封装】实现简单回射服务器
- pyinstaller 打包pyqt5程序出现环境变量错误问题
- 会声会影视频剪辑详细教程
热门文章
- 2018年9月网易游戏雷火防护工程师秋招线下笔试
- [C++] 内联函数inline 以及 auto关键字 -- C++入门(4)
- 企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通
- TRUE PARTNER迎来戴维斯双击,资产规模业绩双增长
- python使用pandas读取excel绘制柱状图,折线图,饼状图
- 年货来咯:精选年度最受欢迎干货,覆盖客户端、服务端、前端、数据、算法……...
- 国产可替代电机芯片AT8236驱动控制
- cximage 进行gif 背景透明处理
- Python环境搭建(一)
- 练习题:打印26个小写字母