软工_个人博客作业3
PART1 博文阅读感想
十几篇博客一气读下来,有一个词一直萦绕在我的脑海里——紧张!紧张!还是紧张!
首先这紧张来自于自己的学习方面。作为计算机系的科班出身,当然与生俱来就有一种优越感——我们是专业的,四年的专业训练再怎么不济也要比那些半路出家的野路子们好找工作吧。但读了这么多博客给我了一种深深的紧张感,粗粗看下来,这些博主们绝少是科班出身,有学英语的,有学数学的,五花八门,但唯独很少是计算机系出身。每个人在提起自己转向程序开发领域的同时,都有一番非常痛苦的,甚至天昏地暗的学习阶段。短短几个月的时间,他们就学会了几门语言,掌握了几种我在学校里都没听过的技术。诚然,接受过专业基础训练的我们可能会对原理上了解的更加深入一些,但是IT行业这个市场早已有太多人挤着头皮想要进入,这个行业的门槛并没有那么深。除了谷歌微软,还有很多默默无名的小公司需要信息技术人才。而往往很多开发工作并不需要你对计算机底层原理的了解,只需要你掌握一门技术,一门应用性很强的技术,在应用方面,在专业技术方面,计算机专业科班出身的学生如果仅仅满足于学校中的那点知识,完全没有任何竞争力。所以啊,什么时候都要学习,要靠自己学习,要结合实践的学习,要永不满足的学习。
另一个紧张来自于这个行业的忧虑。程序员?=青春饭,扪心自问,虽然对于这个专业拥有着极大的热忱,但是如果说要让我当一辈子程序员,甚至想要安稳的当一辈子程序员都很困难(被年轻人替代),我还是拒绝的。看了这么多博文,我越发的发现这个行业的门槛真的非常低,而工作强度却异乎寻常的高,如果等自己步入中年,身体上是否能吃的消上是一个问题。就算能勉强坚持,也总比不过那些入行刚几年已经全面掌握技术的年轻人。程序员是一个太容易被他人替代的行业,如何能在这个行业中站住脚,如何能够在自己的职业道路上获得发展。看似很难。晋升管理层?谁也说不定。变身技术中坚?程序员真的不是越老越值钱。自己创业?机遇难得。虽然刚入行的程序员能够拿着令人羡慕的工资,但是对于身体的透支和发展的局限性是一个不得不考虑的问题。
真的很紧张。
PART2 代码复审
这次由于奇数个同学选课的原因,我们结对小组有三位同学,所以我们采用了单循环的方式进行代码复审。这次我复审的是韩青长同学的代码。
General
- Does the code work? Does it perform its intended function, the logic is correct etc.
YES
我将代码使用我自己的测试集进行测试,结果基本完成了作业基本要求中的-b和-c两个功能。对于机场线单行线,环线,错误输入等的问题也处理得很好。
下面是我的测试集与测试目标
1.MetroSystem.exe -b 2号航站楼 3号航站楼
2.MetroSystem.exe -b 健德门 火器营
3.MetroSystem.exe -b 南邵 角门西
4.MetroSystem.exe -b 朱辛 马泉营
5.MetroSystem.exe -b 西直门 国贸
6.MetroSystem.exe -c 3号航站楼 西局
7.MetroSystem.exe –c 北苑路北 安立路
8.MetroSystem.exe -c 广渠门外 国贸
9.MetroSystem.exe -c 大屯路东5 大屯路东15
10.MetroSystem.exe -c 什刹海 什刹海
第一组测试用例测试单行线
第二组测试用例测试环线
第三组测试用例测试尽头站到换乘站
第四组测试用例测试错误输入不存在的车站
第五组测试用例测试换乘站到换乘站
第六组测试用例同样测试单行线
第七组测试用例测试不能换乘的大屯路东站
第八组测试用例测试不能换乘的双井站
第九组测试用例测试两条线同名车站实际不能换乘的情况
第十组测试用例测试同名车站
但是我还是发现了两个小问题
第一个问题是,在两种模式下,如果起点站与终点站相同,程序将会报错。在-b模式下,程序直接崩溃,而在-c模式下,程序输出结果将会是10001.这个点虽然平时一般不会出现在正常输入中,但是也算是一个较为普通的特殊输入,应该被考虑。
第二个问题(可能只是理解上的差异),实际上大屯路东站和双井站交叉的两条线是不能换乘的,我设计时将这两个站分开考虑,韩青长同学则认为可以换乘。两种方案我认为都可以接受。
- Is all the code easily understood?
Yes
韩青长同学的代码均使用C++语言编写,虽然没有学过,但是代码风格上结构清晰,还是比较容易看懂的。
- Does it conform to your agreed coding conventions? These will usually cover location of braces, variable and function names, line length, indentations, formatting, and comments.
Yes
代码中变量名命名清晰,虽然有很多简写,但是能够很容易的看出来它代表的意思。没有让人不知所云的变量。大括号使用单起一行的形式,与我的习惯相同,很舒服。同时行长控制较好,较长的行均分行写出,代码缩进风格统一,虽错落但是给人一种容易阅读的感觉。每一个模块开头时均有注释,这是一个非常好的习惯,我这次的代码没有写太多的注释,这点我要向韩青长同学学习。
- Is there any redundant or duplicate code?
No
通篇浏览了代码,整体来看没有大段重复或者冗余的代码。
- Is the code as modular as possible?
Yes
整个代码中除了main()函数都没有长于100行的函数,读起来各模块功能清晰,我认为已经尽力做到了模块化。不过如果能将main()函数中的初始化地图模块独立出去就更好了,这样可以让main()函数大大缩短,简化逻辑结构。
- Can any global variables be replaced?
Yes
该图是程序中全部的全局变量,邻接矩阵和站点相关的存储作为所有路径计算的基础,作为全局变量是必要的,但是简易不要将数组大小定死,这样有些不利于以后的扩展。比较好的方式是通过定义常量来初始化数组空间,这样修改起来比较方便。下面有关递归的全局变量中,我想如果将递归函数外部套一层调用递归函数的路径查找函数,这些全局变量就可以定义在路径查找函数中了。不过要求似乎也没说要尽可能少的使用全局变量,我自己也是写了一堆全局变量==
- Is there any commented out code?
No
在代码中并没有发现过时的被注释掉的代码。
- Do loops have a set length and correct termination conditions?
Yes
在代码的递归部分,最开始均有跳出递归的判断语句。
- Can any of the code be replaced with library functions?
No
我因为也是初学,对于库函数了解不多,但是整体看上去并没有什么能够直接被库函数替代的代码。
- Can any logging or debugging code be removed?
No
代码很干净,没有调试用的代码。不过读取文件路径直接设置为了一个绝对路径,我觉得设置为相对路径更好一些。
Security
- Are all data inputs checked (for the correct type, length, format, and range) and encoded?
Yes
代码中循环读入参数,对于不正确的参数或者站点名都能进行处理,输出“输入错误,请重试”
- Where third-party utilities are used, are returning errors being caught?
No
没有使用到第三方工具
- Are output values checked and encoded?
Yes
输出值与题目要求相同。不过有一点小瑕疵,就是前面提到的起点终点相同的情况,如果都在环线上,会输出环线上所有站点,如果不在,距离则会输出10001.
- Are invalid parameter values handled?
Yes
在输入处理时,就过滤掉了无效参数。
Documentation
- Do comments exist and describe the intent of the code?
Yes
韩青长同学的代码中存在着大量的注释,对于理解程序有着很大的帮助
- Are all functions commented?
Yes
所有的函数都有注释,甚至函数内部都有详细的注释
- Is any unusual behavior or edge-case handling described?
No
虽然对于边界情况进行了处理,但是并没有在注释中进行说明
- Is the use and function of third-party libraries documented?
No
并没有使用第三方库
- Are data structures and units of measurement explained?
Yes
所有的全局变量都有解释,且大部分的变量在声明时都有解释。
- Is there any incomplete code? If so, should it be removed or flagged with a suitable marker like ‘TODO’?
No
没有,全部代码都完成了
Testing
- Is the code testable? i.e. don’t add too many or hide dependencies, unable to initialize objects, test frameworks can use methods etc.
Yes
可以直接执行txt文件,并很方便的执行测试
- Do tests exist and are they comprehensive? i.e. has at least your agreed on code coverage.
No
可能因为没有要求,在代码中并没有测试代码存在
- Do unit tests actually test that the code is performing the intended functionality?
No
没有进行单元测试
- Are arrays checked for ‘out-of-bound’ errors?
No
代码中并没有对于数组越界进行处理,可能这是导致程序-b出错的原因
- Could any test code be replaced with the use of an existing API?
No
程序中并没有测试代码