个人作业week3——代码复审

一、感想

  某一篇知乎的评论说:小说总是不如真实的人生。呃,确实是这样,感觉各路大神的技术成长史总结起来有这么几个要点。

  1.一定要敲样例

  2.一定要阅读经典书籍

  3.平时自学很重要

  4.基础很重要

  5.英语很重要

  我看到有个人的博客首页写:“希望能用代码改变世界,哪怕只有一点点也可以”。我顿时想到了自己。

  高中的时候总以为自己能改变世界,然而大学已经过了一半,现在的我呢?我跟他们比,我大概只有年轻这个优势吧,以及我有很多前人的经验指路。以及现在开始还不晚。

二、计算机之路

  关于进了计算机系这个事吧。。

  高中的生活真是不想再提了。。想到现在自己这么失败都觉得自己没什么脸提自己的高中生活。。

  曾经觉得自己能改变世界,现在只希望自己的加权平均能高一些。。差不多就是这样吧

  本来我高中的想法是,我要考上清华,读全国第一的核物理,因为当初看物理书说可控核聚变将在本世纪中叶获得重大突破。。现在看自己真是无知。。

  然后我妈一直在研究这个招生这个东西。。后来跟我说:“你要是考不上清华就读北航的计算机吧。”再加上家里一个很厉害的长辈也这么推荐我,然后我就半推半就了。

  当时我还是对于核物理很专一的,后来第一次有出轨的意思是因为看了一个TED视频。

  视频主要说有一个人完成了一个很厉害的手机,手机有一个很厉害的投影功能。。现在想来我还是不知道怎么实现的。。具体手机的摄像头可以识别用户的手势,然后根据手势利用投影仪完成一些功能比如拍照,显示时钟,播放报纸上新闻的相关视频等等。。我差不多有了一点出轨的意思。。然而那个时候我还是什么都不懂

  第二次有出轨的意思是因为读了一篇文章,文章是关于whatsapp创始人的故事,标题叫做“从来没有一个屌丝能够逆袭”

  很有意思。。

  “我们只看得见5年、50人、190亿美金,却看不见他的梦想、积累、心态,看不见他的意志、气度、热情,看不见此人在职场里长达22年的摸爬滚打。”

  然而那个时候我还是什么都不懂。。

  后来高考出分了,清华不足,北航有余。然后我就来了北航了。。于是我算是彻底出轨了。。

  但是很有意思的是。。我并不了解我的出轨对象,只是凭着当初TED的那个视频和Whatsapp创始人的创业历程,我出轨了(我真是个坏男人。。)。。。。

  于是。。这大概也是我大学前两年没有什么长进的原因之一吧。。(主要还是自己懒。。)

  前三个学期越来越惨淡。。第四个学期获得了一个小进步,但还是得到了一个不公平的成绩,于是第五个学期,我打算保持这个进步的势头,拿下这门软工课。为我以后的程序员生涯打下基础。

  我不想再给自己扣上“间歇性壮志凌云,持续性混吃等死”这个属性了。

  技术道路:看了那位混迹江湖12年的老手的就业经历和其他博主的成长历程,我对我的规划是:这学期学习C++和C#,以及开发GUI,如果可以还可以学习安卓开发。以后自己不断阅读书籍,找到自己最喜欢的技术,并且尝试一些项目。

  职业道路和社会道路:毕业之后有两条路:考研,读完研之后出国,然后期间尝试做一些小项目,努力拿到大公司的offer,并在大公司中积累经验,再考虑创业或是跳槽之类的。

三、代码复审

  1.复审对象

    由于我们组比较特殊,是三人结对编程。所以复审采取循环方式,我复审的是石浩然同学的代码。

  2.阅读代码

  呃,石浩然的代码大约800+行C#代码,思路不是很清晰。。四个类,十几个函数。

  对代码进行了一些分析:

  主要的功能函数如下:

  public void ReadData()

  功能是读取数据

  分析结果:在读入数据中删除了某条线路的四惠站,导致四惠不是换乘站,原因据本人所说是BFS会出问题。。

  public void BuildGragph()

  功能是构建邻接矩阵

  分析结果:很有意思,他的邻接矩阵里只有换乘站,这样大大降低了dijkstra的问题规模,缩短了运行时间,理论上。

  以上两个功能在我个人的代码里是使用的状态机读入,只有一层循环同时完成两个功能,所以我觉得他的可以做优化也可以不做。因为这不重要

  public Tuple<string,int> DjistraPath(string f,string t)

  功能是通过不同的情况调用下面Djistralen,求出不同的最短路径并比较

  分析:由于他的邻接矩阵里只有换乘站,因此根据起始站和终点站是否是换乘站,我们可以得出多条可能的线路,并做比较,得到最终最短的线路,使用了以代码换时间的策略,具体来说比较成功,但是有一个bug是:如果起始站和终点站在同一条线上则直接输出,不做最短路径的查询,导致从知春路到东直门的测试样例测试错误。另外他还特殊处理了机场线,导致程序的扩展性比较低。

  public int DjistraLen(int fromno, int tono, int[] parents)

  功能是通过dij算法查询最短路径

  分析:没什么问题,忠实地实现了算法

  public Tuple<string, int> BFSPath(string f, string t)

  功能类似dijstrapath算法,当调用下面的函数求出所有最少换乘的路径之后,求出其中最短的一条

  public void BFSPathRecursion(int transLv, Station curStation, Line curLine,Station endStation, List<PathSection> stationList,List<Line> lineHis)

  功能:这个才是通过广搜求出所有最少换乘的路径

  除此以外。。还有很多函数辅助生成路径,这些函数是整个代码里逻辑最复杂的部分,尝试理解但是失败了。大概是我比较没用吧。。

  

  • CheckList

 

General

Does the code work? Does it perform its intended function, the logic is correct etc.

代码工作正常,做了一些测试,可以实现预期功能,逻辑大致正确

Is all the code easily understood?

部分地方有注释,部分结构易懂,部分结构复杂。

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.

这些好像都没有问题

Is there any redundant or duplicate code?

有挺多的。。

Is the code as modular as possible?

模块化了,但是耦合度高

Can any global variables be replaced?

代码中全局变量较多,一时半会找不到替换的方法

Is there any commented out code?

有,是测试代码

Do loops have a set length and correct termination conditions?

Can any of the code be replaced with library functions?

没有

Can any logging or debugging code be removed?

没有

Security

Are all data inputs checked (for the correct type, length, format, and range) and encoded?

有,但是当两个输入都有误时,只会显示第一个输入有误

Where third-party utilities are used, are returning errors being caught?

没有,没有

Are output values checked and encoded?

Are invalid parameter values handled?

处理了

Documentation

Do comments exist and describe the intent of the code?

有一些

Are all functions commented?

并没有

Is any unusual behavior or edge-case handling described?

处理了

Is the use and function of third-party libraries documented?

没有

Are data structures and units of measurement explained?

Is there any incomplete code? If so, should it be removed or flagged with a suitable marker like ‘TODO’?

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.

呃。。怎么说呢。。有部分小函数是为了满足另一个大函数的,所以这些小函数不是很容易测试

Do tests exist and are they comprehensive? i.e. has at least your agreed on code coverage.

看不出来

Do unit tests actually test that the code is performing the intended functionality?

是的

Are arrays checked for ‘out-of-bound’ errors?

是的

Could any test code be replaced with the use of an existing API?

不知道。。

  结论:

  1.能够想到只处理换乘站来缩小问题规模,这一点很厉害,但是关于这一点,我认为只能运用到-a的处理上,因为如果运用到-b-c的处理上,付出的代价太大,例如增加了很多小函数,使用了很多全局变量,最主要的是代码量直线上升,难以修改和维护和扩展,完成同样的功能,比我的代码要多400+行,且某些功能完成的没有我的好,但是由于简化了运算所以速度比我的快大约40倍,

  如果我是用户,我给五星好评,因为真的很快,但是如果我是维护人员,我。。我。。我大概不会接这个活。。

  2.特殊处理机场线和删去四惠这个。。虽然我一开始也想到特殊处理,但是最终还是想出了通用方法。。所以这一点我给差评。。从行为来分析是:特殊处理数据,简化程序功能,从动机\本质来分析是:投机取巧

  3.代码不易读,难以扩展,不是很符合软件工程开发的要求。

  但是我有一个额外的问题:

  我的评价是否真的公正了?

posted on 2016-10-02 02:14  ChildishChange  阅读(225)  评论(2编辑  收藏  举报

导航