像做项目一样做毕设

绪论

整理自己在学校的东西,看到自己为了毕业设计开的项目,觉得自己的这份经验值得分享一下,所以整理一下发出来,帮助学弟学妹开始自己的毕设。

本文主要分为两个部分,一个是工作流,另一个是小技巧:工作流包括了我从联系导师、确认选题到最后完成设计、申请推优的大流程;小技巧则是我认为在毕设过程中提升了我工作效率的一些设计、软件。

工作流

选题与联系导师

选题的来源就是自己定和让老师给两种,如果保研或者自己早有想法大概就是前者了。有想法以后可以尽早联系觉得合适的导师,看看是否还有位置/任务工作量是否合适。导师如果愿意留位置给你那还需要记得隔段时间和老师确认一下,如果老师到时候给忘了就有点尴尬了。让老师给任务的也可以早点联系老师,了解一下任务相关的东西(不了解感觉问题也不大,只要毕个业的话)。

然后就是等毕设正式开始的时间了,大概就是大四上学期期末的时候,导师就会把带的学生拉一起,说一下关键时间节点,官方要注意的时间节点就是中期检查和上交终稿的时间,依据这个各个导师有自己的安排,比如什么时候完成调研报告、什么时候要把设计主题完成了、什么时候论文初稿要出来、要不要开周会什么的。

我当时是考虑了三个选题,一个是密码学实验的整个系统,一个是markdown转word文档的工具,最后一个是匿名投票系统,这三个选题都是在大学里遇到的问题,因为其中两个都是密码学相关的,所以我早早联系了密码学老师,一通分析以后也觉得这几个应该都是谋个良毕业无压力的任务,最后想着挑战一下自己顺便多学点知识选了第三个(因为前两个都已经做出来了)。

调研报告

调研报告基本可以认为是毕业论文第一章的展开版本,导师和我们表达的观点是“把调研报告扩写成论文”。调研报告或者说论文的第一章,基本就是引用参考文献的出处了,后面几章能新引用的参考文献屈指可数,所以如果写完调研报告发现参考文献引用的太少就赶紧看怎么找补吧。

写调研报告也是了解研究领域、思考工作方向的重要一环,只要不是自己已经深耕过的领域,这时候应该是收获最大的时间。可以先搜几篇调研/survey/总结之类的文章,了解一下整个领域发展历史、常用的方法、各方法的利弊对比。比如我做的匿名投票就是找了《A survey of different electronic voting systems》,如果找不到类似的东西也不用紧张,大可以搜几篇论文看看,因为论文开头的研究现状里追溯领域的发展过程的不算少见。

考虑自己工作方向的时候可以参考国内的硕士毕业论文(毕竟看不到本科生的),在那个难度上做一些简化,考虑一下别人没有做的方向,毕竟科研就是排列组合(暴论)。继续拿我自己举例,我就是看了2008年彭珊珊的硕士毕业论文以后,考虑像她一样的在已有协议上进行优化,她有用软件做形式化的分析,而我这方面能力不足但是开发能力还不错,我就做一个开源的电子投票系统。

也听说有的人先随便糊一版调研报告,最后拿毕业论文的第一章替换调研报告的,但是说往年这么干的已经被打爆了。

项目开发

就我校的要求来说,作为一个计算机院毕业生,毕业设计没有代码相关的东西是不太可能不被刁难的,所以先做好准备吧。也未必每个毕业设计都需要做一个工程,也有做实验的、做仿真模拟的,但总之是不能拿个PPT就过答辩的。

项目开发最好能从调研报告了解完现状就开始,因为作为一个本科生来说,能在已有的东西上做个微创新就已经算不错了,已有的系统通常也不是那么好加东西的。这里就看研究的方向了,首先看有没有能直接拿来改了用的开源软件(这里呼吁用了别人开源代码的遵循开源协议),如果没有,那再看有没有比较小的合适的系统可以大段大段地复制,如果还没有,那再看看有没有可以参考架构的,如果依然没有,那最好做好最后只能靠仿真出结果的准备了。对于可能用到的组件也是一样的,尤其是那种单独拎出来都可以写一篇论文的组件,一定要尽早调研清楚情况。

就我的情况来说,找到了几个开源的投票系统,一个是主要用Java开发的IVXV,一个是golang写的cryptoballot(在我调研完一个月突然推了两年的更新现在变成rust的了)。前者协议就和主流不太一样,所以只是分析了一下B/C的架构;后者小而且算是有了一版完整的demo,于是我仔细研究了一下它的架构,然后放弃了写go屎的念头,用rust写了自己的系统。

毕业论文

毕业论文和项目开发可以半同步进行,在设计架构的时候就顺便把毕业论文的系统设计给写了,在写代码的时候顺便写一写详细设计,回过头来编的时候心里会更踏实(回来编还是必要的,毕竟写代码的时候我憋不出那么多字)。

毕业论文和调研报告能有参考是最好的,能找老师要一个前人的论文是最好的,注意抄格式的时候看一下类型,有的人的毕业设计是做系统(开发)的,有的人的设计是做调研的,有的是两者皆有的,综合考虑确定自己论文的分节。

个人写论文的时候没有遇到降重的问题,个人感觉只要写论文的时候不要打开其他论文就基本不会有这个问题,如果要参考就先看一下别人的主体意思,然后关了窗口自己复述一遍,基本就没有问题了。

答辩与申请推优

答辩的PPT最好能打一个稿子,自己排练几遍,把握住时间语速什么的,系统展示建议用视频录制,如果要实操也准备一份视频备用,实操最好能有自动化的流程比如用脚本,如果没有脚本也提前给自己打个时间轴/备忘。

答辩结束后就是推优了,优秀论文在我这里似乎没什么用(据说我院不仅没有奖状甚至连个通报都没有),申请就是让我把论文复制了一份删了大半东西。

小技巧

使用git

使用版本控制工具最大的好处就是我能写这篇文章的原因,因为很方便进行复盘。这一点对志在读研、科研的同学来说应该是比较有意义的,对于以后可能要做自己微创新的同学来说可能也是有所帮助了。此外用了git以后还能很方便地进行备份,毕竟这个工具就是本职工作要用的,理应很熟悉。

备份:3-2-1原则

毕业设计的相关资料毫无疑问算是重要的资料了,重要资料的备份遵循3-2-1原则:

  • 3指三份存储,即一份主存和两份备份。
  • 2指备份在两种介质上,机械硬盘、SSD、光盘、磁带、U盘甚至手机,选择适合自己的介质备份。
  • 1指有一份是备份在远端。因为使用了git,所以这一步挺好做的,你甚至可以在GitHub建一个私有repo推上去(我就是这么干的)

使用笔记管理/参考文献管理软件

读论文和做笔记总是息息相关的,所以这两个拉一起说也是应该的。

做一个研究之前大概都是要通读不少论文的吧,我个人来说是先读了十五篇左右的论文了解了现有的研究与现有的系统,在确认方向以后又专门看了十多篇盲签名电子投票系统相关的论文,写调研报告的时候为了凑字数又去总结了十多篇其他电子投票系统方案的论文。读论文自然有精读和略读之分,精读和略读做的笔记也不一样。这里因为一来我其实没怎么做研究经验不足,二来笔记也比较乱,就不分享我个人的经验了,推荐大家搜一下知乎,这里推荐几篇:

多使用自动化工具

作为计算机专业的同学,自然要尽量把一些可能重复的任务变成自动化的工作。比如我为了论文就写了一个md2docx,写了一个自动重排引用序号的程序,把论文的格式问题处理自动化了大半。

还有一些显而易见的地方,比如自动化备份(可以用定时git commit -m + git push),工程的自动构建(CI/CD)。

自动化的工具也要考虑时间成本,你当然不应该为了每周一次,每次一分钟的任务花上半天来写一个工具。也要多看看有没有现成的工具,比如参考文献生成器、参考文献引用都已经有很好的工具了(前者找个网站,后者谷歌学术用中文就有GB标准)。

写日总结

一个是方便有周会的同学写周报,另一个有日总结以后会对进度有更好的把握。这里推荐在每晚睡前写一下日总结和明日计划,总结部分包括工作、问题和学习。