Homework01-Individual Project-Summary
现代软件工程课第一次作业:
个人项目——词频统计器(WordTally)
由于小组分好后大家商量决定要用 C# 来写最终的Team Project ,所以在完成个人作业的这一周我的时间规划如下:
周二至周五的晚自习两小时以上用于 C# 语法与常用方法的学习,周六周日全天用不少于五小时写作业,由于之前没有真正写过 C# ,所以就预留十小时时间用于个人工程开发。在作业时间分配上,最多两小时用于确定大体采取的数据结构、会用到的方法以及核心算法的构造,剩下的时间没法很清晰的划分。因为根据之前写陌生语言代码的经验,通常都是很难流畅地按照思路写下去,经常会遇到想实现的功能却不了解相关的方法。于是就工具书、搜索引擎一起上了。果然八九小时的写代码时间有相当一部分是用在查相关方法上的。
至于最终的完成情况,我和别的同学比较过,效率很一般。而且最后写完的时候我发现,成果确实和自己预想的有一定的偏差。因为用 C# 编程不像是大一时用 C 写面向过程的小程序,想好了算法就数组链表招呼,各种不算是技巧的处理方法,虽说是也不熟但是好好想想还是能够做到的。然而用 C# 时,还是因为之前没写过所以就连有哪些常用的方法都要查一下才能了解。之前的晚自习那几天虽说也是在研究 C# ,但是对之后的工作贡献很小,因为那么多方法,不常写程序不断重复是不能记住的。所以只是看过很多,真正写起来还是两手空空。最后的代码我看起来十分难受,因为我还是延续了用 C 时在 main 函数里进行各种数据处理的恶习,很少自己定义一个方法调用,总是直接处理。所以我的代码可读性就很差,而且一个大函数就好长好长,还又各种眼花缭乱的附加条件判断。从这次作业,我总结的一点就是要尽量把一些实现的小功能定义成方法,这样便于提高可读性,而且为理解主要算法减轻压力。再者就是由于自己知道的库函数(该是叫库方法?)很少,所以在写算法时不知不觉就拐到完全陌生的数据结构上去了。这费了我好大的劲,也是导致我最终项目用时超过预期的主要原因。
第三点就是注释。我第一次尝试用英文写注释,感觉越写越像chinglish,或许除了我自己看得懂,剩下的就只有上帝了吧。(话说我截图里的注释by the requirement“……”是不是会气死高中老师,发完博客才发现……)
下面是我统计HappyPotter一至七部英文原版的性能分析:
七部小说共6.15MB的txt文件用时8秒多,用时最多的就是我提到的那个特别臃肿的函数BossOper,我一直以为频繁地调用各个函数会比在一个函数里做基础操作用时稍多些(这个想法应该是不对吧?)。函数调用中最耗时的在于在Dict中遍历找词,匹配后增加一次计数。在整个函数里这一步应该算是最底层的操作,想要再优化的话就只能从采取更好的数据结构上去考虑了。在系统函数调用里最多的是nlssorting.dll那个,可是我搜了半天也没弄清楚这个是做什么用的,找到的全都是这个文件缺失的处理方法或者下载链接,表示一涉及到基本的原理就感觉书到用时方恨少。我不清楚这里是不是我的程序的performance bottlenecks,我现在能做到的只有这些。而且我现在还不能很好地应用 C# 的调试功能,稍复杂的函数调用我的参数设置就一塌糊涂了。从学 C 开始我的调试技能就不好,作为程序员的基本能力,我会花时间好好加强加强。
下面是关于判断一个词是不是符合word 定义的测试。
win32a后面的那一系列都不符合要求,其他的测试还有路径下有一个空文件夹、文件夹里有不识别的的文件等等,都已在作业里上交。
这次的作业,让我初次尝到miss the deadline是什么感觉,大家在各自宿舍里热火朝天地讨论作业要求里的各种条目,莫衷一是。或许将来我们要是从事这方面的工作,也会遇到类似的情况,但是能够尽可能完美地实现用户需求,不正是我们所追求的目标吗?所以说到底一句话,程序员就是要不断修炼,才能得心应手的实现自己的想法,才能真正为社会做出贡献。