ylink's Nest

一些参加工程类编程比赛的总结

昨天一天去参加了一个名为“文泉学堂高校编程挑战赛”的工程类编程比赛复赛。这一次得到三等奖,奖金1000元钱,没有达到拿到能抵掉队里所有人路费的奖金的目标。不过这期间得到更多超出奖金的一些收获。

初赛那20道题,做不出来的话那真的不算是合格的计科学生了……另外主办方像是没有接触过真正的OJ判题整套机制,所以有些题目,题意不明,主办方还以为自己出的没问题,所以那个过程没啥好评价的。更值得回顾一下的是那一天复赛的参赛过程。

复赛早上,我和圣男早一点到了林业大学——复赛进行答辩的地点。沈书泽晚点到,但也不算晚的过分。之后是听各其他队伍答辩,并进行我们自己的展示和答辩。开始比赛之前拿到一张日程表,一看,有两个队伍和我们做的创意挺相似,那我们就确定把3次进行询问的机会的2次送给他们,目标就是问到他们下不了台,保证我们的创意有展示空间。三个创意相近的队伍里,我们排第二个。第一个队伍进行展示时,看起来覆盖范围比较大而全,不过坑点被我们找到不少,一是技术用的太弱,流量稍大一点的话会瘫;二是他们的网站以公然提供破解软件为卖点……三是他们在讲述中没体现好线下和教师对接的问题。最后我们用第三点发起了攻击,因为第一点主要是我负责掌握,第二点有评委老师提过了,第三点由圣男负责掌握,而她口才比我好些,那就她来吧。搞第一个队伍还比较成功,但我是没想到轮到我们答辩的时候,都不需要其他队伍搞我们,我们自己把自己先搞的下不了台^_-。

毕竟那天凌晨花了不少功夫,针对答辩,用了各种hack操作,控制好了网站显示的内容;又通过预先设计好演示的操作序列,保证不会在演示的过程中暴露出未解决的bug,所以我就选择完全信任圣男去做这一次答辩的主讲。但出问题的地方让我根本没想到。一开始讲PPT、演示网页的时候,我心里是默默想着,这次真的是找对人了,然后她把一个未解决的bug用设计时权限限制的feature去解释的时候,我想的是下来之后得使劲夸她(///▽///),不过答辩的时候就轮到她搞翻车了(ーー;)。翻车从她演示下载之后展示pdf开始,她估计是不清楚现在浏览器下载回来pdf之后会直接在浏览器显示pdf内容,把这个效果当成在线阅读pdf了,然后就在台上提到实现了在线阅读功能,但在线阅读功能我们写代码的根本没做……好巧不巧,之后就有评委围绕着在线阅读开问了,问支持哪些格式,她临场发挥(说难听点是临场扯)了pdf、doc、ppt,然后评委直接问实现细节,好了,令人尴尬的沉默开始……几秒之后我开始救场:先直接承认这个功能我们还没在代码层面实现,然后顺水推舟说有实现这个功能的计划。接着就砸过来实现思路(毕竟说有计划嘛……)。当时也算发挥还好,想到wordpress里面在线阅读pdf的插件,然后形成了可以借鉴那些插件的php代码,然后将那些代码移植到我们使用的编程语言下的回答。然后评委又问是否支持下载断点续传,我承认没有(其实这个问题应该是由前端去回答,但当时救场的时候脑子短路,就直接我扛下来这个问题了),然后问有没有实现的计划或思路,我依照对wget和curl指定字节传输范围功能的了解,临时说了一个利用任意编程语言写一个可以形成调用这类linux小工具的命令的自动化程序去实现断点续传的思路。然后评委算把我们放过了,救场宣告结束。下台之后我想到看看自己心跳多高=(,但手表按了三四次,硬是每次都因为处在应激状态,忘了看测的结果……第一次看到心率结果的时候应该是离下台过去好几分钟的时候,心率120+(平时我的心率是60多……)。下台之后就尽量安慰吧,但到后面成了她劝我别一直那么紧张😂,因为我是第一次参加这种答辩,她反而是有不少这种答辩经验的,比我心态轻松些。

下午没有给我印象太深刻的队伍,有一个对教务系统做了网络爬虫的队伍,我特意问了一下他们怎么解决验证码的问题,他们给出的两个答案:直接返回图片让人去输入/ 后期加图像识别库的思路都没有超出我原先的了解范围,本来想听一下和验证码的斗争中有没有啥不知道的新创意的,但并没有。所有选手展示完之后,有一位老师——杨东晓临时给我们做了一次presentation,讲述了我们在演讲中存在的一些问题和他的期望,具体内容我放后面去写。之后是颁奖,我们队拿到3等奖和一个代金券,也不算是空手而归。因为得了奖,也有机会参加一次获奖参赛者和评审出场的晚宴。晚宴也有不少收获,放之后记录。

到了具体列一下这次参赛的整个过程有哪些收获的时候,想分成技术层面和非技术层面去写。

技术层面:

  • 这种项目比赛,快速开发能力很重要,如果是写代码,具有至少一门快速出原型的语言+框架的使用经验(我掌握的golang+它的标准库,沈书泽掌握的vue.js),相当于具有参加这种项目比赛的入场券。以后有学弟学妹问我计算机专业课外得学点啥,我可以更精准地给他们这一点答案。
  • 虽然是原型开发,函数的错误处理还是很重要。有好几次调试的时候无谓地花费大量时间,都是因为想当然地人为丢弃了函数返回的错误信息,之后又得老老实实地人为加print语句去观察错误原因。
  • SQL语句坚持使用预编译的方式,可以有效对抗SQL注入攻击。
  • 数据库建表时,varchar、char这些字符串类型是好东西,出原型的时候尽量用这种类型可以有效减少后段适配数据库表类型的工作量,代价仅仅是后端和前端得多做一些数据传输的约定,因为字符串类相比数字类还是不好做数据库层面的数据正确性限制,系统正式运用的时候还是得好好设计数据类型,不能偷这个懒。
  • 数据库外键在快速开发出成品时是个好东西,让数据库帮忙做数据参照完整性的校验,而不是在后段代码里,可以减少后段代码量。但在原型的开发阶段,因为存在前后端对接口的频繁调试,调试时候的数据有时候并不是一定按照数据库原有的数据去精心构造的,这时候因为外键的限制,无法完成一些操作,就很尴尬了。一个upload接口,从我开始使用正常到前端使用正常,中间隔了四五天……原因就是因为前端调试upload接口的时候,每次用户名都是他随便编一个,但这个编的用户名在数据库用户表里并没有,于是他得到的结果永远是数据库插入错误。而我每次测试这个接口用户名用的是自己常用的昵称,在数据库表里存的有,于是重现不出来他的问题。
  • 开发时互相明确一些特殊情况的处理约定很重要。前端对这次显示公共课的处理约定,之前一直在网上说的不清不楚,我是在答辩前一晚从网站发送的HTTP请求包里摸清的……之前根本没人提过,于是就是多熬夜到3点多解决问题呗。
  • 比赛展示之前,一定要把程序在讲演的展示环境上从源码编译/解释,到运行的所有环节全部过一遍。这次感觉至少1/3的编译/运行问题全是在讲演前一晚暴露的^_-,可能也有我的时间安排问题,那前端的呢……
  • 原型开发时,目标先专注于做好主干功能,不要沉溺于某个bug不可自拔,bug永远是修复不完的,为了修复某个bug,误了主干功能的实现时间,永远是不划算的买卖。
  • 平时对一台私有的服务器厉兵秣马,并从中积累一些玩linux的经验,对参加这类项目比赛,并且选择web编程方向,可以提供极大的调试便利。如果服务器、域名以及相应的经验也是从0开始准备……那这比赛放弃算了。
  • 写C/C++,心里永远得有一根弦绷着,名字叫“缓冲区溢出”,虽然这次我没用这个问题去难为一组参赛选手,因为她们已经被评委老师点评的够下不了台了,但这个问题本身还是值得一直记着的。
  • 技术栈这东西,至少在项目比赛里,是永远不嫌多的,堆得多就是能赢得评委的青睐。自己队伍这次答辩,其实评委老师是因为我们的PPT介绍里并没有太多的技术亮点,所以最后又给了我们一次机会介绍我们的技术亮点,但我们并没有,所以我只能用车轱辘话对付掉这个问题。以后参加这类比赛,这算是一个经验。当然实际应用里,肯定是以复杂度最低的技术栈解决适应当前体量的问题就够用了,盲目堆技术栈增加复杂度一点也不是好事。
  • 数据库尽量不要存blub,取而代之,可以存一个blub的指针,利用这个指针指向服务器的blub资源路径,以避免数据库大小像棉花糖一样快速膨胀。
  • mysql的innodb数据库,尽量使用一个INT型,自增字段id作为表的主键。这个问题其实我还想多做了解,搜索关键词:“业务主键 非业务主键”。
  • (动态更新,想到啥还会加……)

非技术层面:

  • 不要对大部分开发人员的美工能力抱有太多幻想…组队的时候老老实实花功夫找一位美工,让他负责好那些图片、按钮的样式设计,绝对是超值值的。比赛现场见到那些没有美工的队伍,说实话,我见识到了一个网页/程序界面丑的下限在哪里^_-
  • 这种项目比赛,小而精确的选题永远比大而全的选题要优秀,这是我们胜出另一个选题相似的队伍的原因。
  • 找好一位负责讲PPT和非技术类答辩问题回答的人也很重要,我很幸运见识到了一个具有这种能力的人是怎样完美掩盖住技术实现上的bug的……虽然答辩的时候她这次算搞翻车,不过我已经想定了,大三之后每次参加这种项目比赛,肯定要把她带着o(≧v≦)o
  • 这次比赛让我发现了,为什么我大一会那么坚定地选了工程开发方向作为我课下感兴趣研究的方向,而不是不少人说前景良好的ACM/ICPC竞赛,当时我没法用语言总结出来是为啥,现在可以了:一个工程项目的成功,不仅仅是靠堆技术栈就可以得到成功,这种成功里蕴含着人的温度,代码永远做不到,也不应该是一个工程项目成功的全部。而ACM类比赛,给你的的确就是一个只要考虑好代码,不需要考虑任何其他因素的竞赛环境。这种偏好并不存在好坏,只各人追求不一样罢了。
  • 晚宴的时候杨老师提到一个加微信的问题,你在一个活动场合加一位陌生人,尤其是大牛的微信,务必在验证消息里同时写到自己的姓名,工作单位,什么活动以什么身份相识,因为名人的微信确实需要很很多人交流,而你在验证消息环节没写清楚这些信息,很可能过一段时间,人家根本不知道你从哪来😂……我当时写验证信息的时候不知道要写交集活动,现在记着了。
  • 晚上还有一个问题是我那位讲ppt的搭档提的,怎么控制讲ppt的节奏问题,答案是事先多去做预演,通过大量预演能处理好这个问题。
  • “用数据讲故事”,还是ppt演讲的问题,6个字本身就足够说明这点的内容了。
  • 数据来源/数据安全,评审老师很喜欢问这两个主题的问题,然后市场运作、需求调研,也被评委老师问了不少。以后的项目比赛,这些地方是需要让负责讲演ppt和答辩非技术类问题的人着重准备的。
  • PlanB问题。引出这点问题的现象是上场的选手有鼠标不太好使的,然后拖了一下展示。简单说就是得有错误处理程序,不管是编码还是在日常生活都一样。
  • 如果讲PPT的人不是同时负责技术实现的,那答辩之前,一定一定要让讲PPT的人心里有数,技术实现的人,哪些做了,哪些没做。那天我们组的情况就是活生生的教训……
  • (动态更新,之后想到啥也会加)

1 评论

  1. 优秀优秀哈

发表评论

6 + 16 =