开始、结束与开始
by李畅 李雅楠
看似漫长实则短暂的结对编程项目就这么结束了。细细回想起来,其中更有着点滴的感悟与体会。那么,让我们一切从头说起,慢慢回味其中的点滴。
Part 1
初遇结对编程,对其中的点滴真的是可以说完全不了解。结对编程?如何去做?怎么去做?又会有什么结果?一切,起于未知。
而在从个人项目到结对编程项目转换的初始,就开始体会到结对编程项目的细微好处了。首先是相互之间的互看代码。(先例行感慨一下自己的搭档真的很厉害)在互看代码的过程中,我们开始了解对方的思路,开始明确对方的想法与解题方法。有的地方,我们不谋而合,有的地方,她更胜一筹,有的地方,我可能有些特色,有的地方,我们都互有缺陷……没有人的代码生来完美,也没有人的代码一处不错,我们都互有优缺点,我们都互有需要学习和可以被学习的地方……我们,互相在学习与探讨中成长。
了解搭档代码的过程,对自己有着很好的提升作用。之于我,在理解的过程中明白了自己的不足,明白了自己对需求理解的不透彻,也明白了不同人对于同一需求的不同理解……在这个过程中,我明白了很多。而这一切,不过是结对编程初起步。我们才刚刚开始。
Part 2
代码的开启,源于一个词——复用。(今天我就要疯狂吹我搭档)搭档的个人项目代码几近完美,至少从功能实现上来说,她对功能实现的解读对我真的是启发很大。而且她代码的扩展性很强,在个人项目中她就已经做出来了界面,再者针对后续操作更能看出她代码的可扩展性,所以我们以搭档的代码作为复用基础。而在复用的过程中,我们也认识到分模块编写代码及简约一个函数中包含内容的重要性与必要性。
代码复用,简单来说就是,你把一个功能写成一个模块, 以便当再次需要相同功能的时候,可以直接使用,而不用重新开发。函数,继承等,大抵都是运用了这种思想。而代码重用,也是面向对象编程的一个突出部分,当然,亦是面向对象与面向过程两种编程的不同所在。
我是一条分割线
?
队友这样商业互吹式的开头就让我很尴尬了QAQ只能尴尬地迅速转移到正题。
首先谈谈队友说到的代码复用,或许是出于当过PM的直觉吧,个人项目没有要求语言,需求中也是说的使用命令行完成指令,我还是默默给自己加了需求,做了界面,也选择了可移植性更强的JAVA语言,因此代码复用的底层工程,我和室友不谋而合地拍板定了我的项目。其实在代码复用方面,结对编程的第一项任务——互看代码,对我帮助非常大。虽然和队友用的不是同一种语言,但思想上是相通的。每一个功能都封装成了一个函数,只有在主函数中,按照流程依次调用了各个功能函数,其余函数之间几乎没有相互调用,基本做到了模块与模块之间,尽可能的独立存在。这一点也是我的代码做的不太好的一点,为了开发时省事,我将功能划分的比较大,每个实现子功能的函数都相对复杂,这样一来,一旦某一个小功能需求改变,就需要在一个大模块中调整,工作量会增大、出错率也会提高。室友的实现方式遵循了高内聚、低耦合原则,正是我们考虑代码复用时的基准原则。代码复用还体现在可扩展性和程序智能化方面,以个人项目需求为例,需求中说,“每个账号一个文件夹”,我当时是按照用户文件夹提前创建好,然后生成试卷后寻址,存入该文件夹来理解的。而她的代码思路我觉得更好,在准备生成第一套试卷时,若用户文件夹不存在,则创建,这样一来扩展性比较强,当用户增多,或者需求改成用户表不是预设好的,而是通过注册产生的时,就会容易实现得多。这都是我在队友代码中学到并用在了结对编程中的。
Part 3
简单介绍一下程序开发的细节。
?开发环境:Eclipse+Tomcat-7.0.85
开发语言:Servlet+HTML+CSS+JS+MySQL+Ajax
?
底层是由Servlet开发的,我通俗地理解了一下,就是将实现了servlet接口的Java类,部署到web服务器中。
处理HTTP请求的方式是HttpServlet。如果为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。
前端HTML+CSS+JS都是现学的,从界面排布到事件触发,都走了不少弯路,即便是最后的代码也是非常不专业的,而且没有完全实现需求文档。由于第一次接触前端,我并没有使用框架,一是觉得可能没有那么多时间再去了解各种框架,二是几天速成的技能,原本基础就没打好,还是希望能通过这份可能无法做到完美的工程来对基本语法结构有所了解。
花费比较久时间的还有前后端的数据传输,这里我们选择的是表单数据提交和HTTP请求。对网上大神代码的研究发现,Ajax或许是最为优秀的方法,但是Ajax技术所关联的知识点非常广泛,如果了解不够深入,设计起来也会有难度,因此最终权衡之下,还是给早就订好的假期旅行留了点时间(言外之意:少学了点)。
真正实现的过程中,表单数据提交还是带来了一定困难的,Servlet层只能向HTML请求表单数据、以及直接打印到HTML界面,并不能传递单个表单数据给HTML,因此出现了开发过程中与需求文档最大的出入——答题界面,答题界面原本答案提交表单和题目应当在一起的,结果我想了很久还是没找到不使用Ajax通信,将数据传输给浏览器的方法,只能按照反人类逻辑先做出来了,假装自己坚持了敏捷开发、多次迭代的原则,嗯!
比起没接触过的前端,后端的实现相对容易了不少,不做数据库,就只剩了出题算法、post请求发送验证码。这里简单介绍一下出题算法,之前的算法虽然出题逻辑都实现了,但是计算起来很困难,于是重构了一下这个算法,考虑到括号和运算符优先级之余,也在出题过程中将结果一步一步算了出来。
算法简述: 1、题目在生成的过程中运算出结果,主要思路为分治思想:若子运算式两边带括号,则直接看做一个整体求解出运算结果,每个小整体都遵循从左到右,先乘除后加减的算法。
2、算法改进:在个人项目的基础上考虑了乘除法优先级高于加减法的现实情况,只有内部运算符含有加减时才会出现括号。
3、对题目严谨性的考虑,平方和根号运算符较难生成,因此用^2和^0.5代替,由于括号的存在,容易产生歧义,因此本版本将^2和^0.5的作用域用括号表示;
4、考虑题目人性化问题,将初中难度和高中难度的运算符出现频率都=相应下调。
5、以小学题目生成的实现为例:先生成n(2-5)个操作数,放入列表中,从中任取两个加符号和括号,再将取出的两个对象看成整体,重新放入列表中做前一步操作,直到所有操作数称为一个整体在合并的过程中将括号内的结果算出,最后的运算只需调用Result类的简单运算函数(遵循先左后右、先加后减原则)即可完成。中学题目只需在运算子式上添加相应的二、三级运算符即可。
因为个人项目做了简单的UI界面,因此结对项目就不想守着老本不放,于是选择了Javaweb,希望能在强压之下学到点东西(在这里松口气,国庆节在各个景点玩的时候还牵挂着我们的项目,差点以为要凉了)。其实这个项目还是有一定纪念意义的,因为是我们动手做的第一个小型Javaweb工程,一切从0开始学。和以往一些纸老虎不同,网络编程是听起来很难,真正做起来也不容易的那种。首先需要设计各个功能如何实现,这就要知道我们所选用的前端和后端语言都能实现什么,能做到怎样的通信功能,因此除了复用之前代码写的纯算法部分——题目生成和计算,国庆节的前几天(虽然只有晚上)我都在了解这些语言,通过别人的工程案例,去推断它们能做到什么,自己能调用什么。看着看着就感觉要学的越看越多,于是我们在悬崖边及时收住了给自己不断“完善”的需求,暂时放弃了数据库,选择了很low的文件存储。
距离接近一千公里的结对编程,给我们也带来了一定的麻烦,因为我白天要出去玩耍,害得队友明明回了家,还得大半夜和我“云”结对。直到回来以后,我们两个坐在一起debug才发现,极限编程是多么的优秀,两个人都有特别傻的逻辑,相互碰撞,就能刚好把bug碰掉了。
Part 4
回归根本,从头到尾去回忆结对编程中的点滴,感觉其中伴随着茫然与收获。作为一个代码能力较弱而且不善于使用API的人,在撰写代码的过程中遇到了许多的困难,很多地方都是通过查找相关资料以及看网上的大神们写的博客去一点点扣出来解决的,还有一部分是咨询搭档去进行解决理解的。面对细致的项目需求和其中种种复杂的要求点,最初真的是茫然的,对Java语言的不熟悉,对HTML语言的不了解,对CSS,JavaScript语言的茫然,想要做出来一个基于网页的系统,谈何容易。从零起步,补充对应的知识,通过查找资料解决种种困难与难题。在短暂的时间内,要学习自己不了解的语言,一个项目组有许多的技术分工,两个人又要去承担其中的全部职位,从需求文档,到设计网页,从点点需求,到前后端撰写。我们走过了漫漫长路,初始之时,茫然相伴,结束之时,欣喜相随。
Part 5
本次结对编程,有所收获也是有所遗憾的,首先结对项目处于国庆假期,和搭档天各一方分居两地,相互之间进行交流与一些局部细节的处理等代码上的问题,以及结对编程本身的意义都无法得到很好地施行与扩展,假期的特殊性导致两个人无法很好地完成结对编程的需要与意愿,初衷没有得到良好的实现。其次,在存储用户注册信息时,通过讨论和查阅资料,大概得出了三种解决方式,第一,存储到文件,第二,运用数据库,第三,运用cookie的相关知识将其保存到浏览器。和搭档针对三种不同的方案进行了探讨,由于数据库的搭建较为费时费事,且我们刚开始数据库的学习,对其中的操作不甚了解,所以这个最为快捷有效且常用的方法只能忍痛割弃,而cookie的操作又过于麻烦,于是只能选择很low的文件存储。在文件存储的过程中,起初考虑创建指定路径下的文件夹,本身有顾及到在IOS系统上运行的情况(在我们的助教小姐姐的提醒下突然发现了还有Mac的情况),但是在查阅资料发现提及的相关资料几乎为0,以及对Mac等电脑的不理解,导致对文件夹在Mac电脑上生成的代码不够明确,所以只能在根目录下创建,文件存储在相对路径下而不是绝对路径,存储后的结果属于理论上可以存储在电脑中,具体位置可能是jdk的环境也可能是处在编译器所在的环境。对不同的电脑可能性不同,并且在编写完代码后没有在Mac平台上进行测试,也是存储文件操作中的遗憾之处了。而在网页设计中,我们的网页初始设计有7个页面(分别是登录界面,注册中输入手机号和接收验证码界面,注册中输入确认密码界面,选择题目类型界面,输入题目数量界面,做题界面和显示分数界面),但是在后期对网页进行编码以及链接前后端的过程中,发现其中的一些问题,包括本身编码者技术不够成熟的情况,最后为了能够将其完美解决,不得不进行更改,与最初的需求文档(见博客最后附件)的需求没有完全符合匹配。面对最后的网页结果,虽然实现了需求,但是与最初设想不同,也算是在编程过程中不完善的部分。
Part 6
然而,我们依然在结对编程的过程中学习了很多,补充了许多知识。而我也借机和搭档多多学习,从而掌握一些关于项目的更多知识。从需求文档的详细撰写,到Axure RP的使用,再到CPP向JAVA的转换,从用PS设计页面与大致布局,到运用HTML+CSS+JavaScript结合将它付诸实践,从学习一些细微的编码等,到考虑代码规范性等情况下对代码格式与注释格式的规范性,我们经历了很多,我也从中和网上的大神们,和自己的搭档学习了很多。再者,我们从入学起就了解到自己未来的种种就业方向,了解了一个项目组中的种种职位,但是对其的工作仍然没有深刻而基于实践的了解,同样,我们从入学便知道项目经历的重要性,但是自己参与其中的项目仍然是少数,就算加入了老师的实验室,也往往是“打下手”的存在(当然,加入了一些社团组织的除外)。在这次结对编程的过程中,我们从头开始,一切基于个人项目,或者对其进行扩展与重构,或者对其进行改写,甚至重写,但是我们可以详细的了解其中的几个研发的主要职位(测试方面还没有涉及),可以基于实践去加深了解与印象,真正的让自己在“做中学”,为自己未来的发展奠基。或许我们未来的团队项目会是一个更好的突破口,但是不得不承认,这次的个人项目,已经让人感慨万分,亦是让人从中受益良多。或许我这句话在不远的将来会被自己推翻,但是至少现在我坚信,这个项目会是我在大学期间经历的项目中感触最深,也会为我留下最深刻印象的一个项目。两人之间的合作,相互之间的帮助,向对方不断学习,在完成项目的过程中不断完善自己,或许这个是一个结尾,但是这个项目也是一个开始,或许它的初衷很简单,但是在实现的过程中我们收获良多,体悟颇深。
原文地址:https://www.cnblogs.com/clover-muyou/p/9757691.html