实习前深知当前业界和学界存在巨大的差异,实习初期便会通过各种途径获取各方面的知识,使自己尽快习惯业界的的工作节奏。
初期没有机器,测试岗也很难像其他岗一样安排一个比较独立的项目去联系,于是海哥安排我坐在旁边看他操作,有问题及时问,并给我提供了一个技术栈清单让我自学:
flink
;kafka
;sprint
);Hbase
、Hive
、vertica
、SQLServer
、Redis
、ES
(Elastic Search
);linux
使用(指令等)、Python
、了解Java
、git
Jmeter
、Postman
;nginx
、tomcat
。海哥同时承担微光标签小组和公共组件小组的测试任务,所以每天早上也就要开像个晨会,小组内每个人会汇报一下昨天完成的工作,并明确今天要做的任务,每个晨会大概5~15分钟。
项目使用敏捷开发作为开发实践,一次开发迭代是两周实践(PS:我刚入职那会微光资源管理系统正好是第100次迭代,为了庆祝蹭到了一杯奶茶)。每次开发迭代前会开一个澄清会。不得不说澄清会这个形式挺好的。小组的leader把下一次迭代需要完成的所有故事和任务进行详细说说明,同时对实现时可能出现的技术细节进行讨论并确定。不会像无头苍蝇一样不知道该怎么做/做什么。
拿到机器后,登录内部wiki网站各种点,有一块内容是「新员工沙盘」,里面有正式员工入职培训时的各种材料。花了几天时间把这些培训材料看了一遍,对于微光平台下的各个应用处理的业务、业务相关的一些专业名词与缩写、系统架构等有了初步的了解,脑海中对于整个平台系统有了一个概略图。
坐在海哥旁边学习的那段时间,海哥提到测试工作没有想象中要写很多的文档,但是前提是对同组内其他同事做的工作都熟稔于心,才能知道测试需求实际上需要测什么;同时也了解到测试的工作相对杂且繁琐,当前的任务没做多少可能就有新的需求,要进行快速地任务切换。
学习了一段时间后,就开始根据任务写测试用例,并根据测试用例进行图形用户接口测试。测试的工作往往比较机械和繁琐,对于这类测试任务就需要写脚本自动化完成。我始终认为人需要进行创造性的工作,机械性的重复劳动交给机器完成。把这些重复的劳动进行抽象,提取存在共性的重复的部分,编写脚本完成测试流程返回结果,人需要做的一个重要工作是去管理和维护这些脚本。在实际的测试工作中,也确实发现了在迭代中系统存在/新产生的bug并进行汇报。
某次围观海哥工作,发现项目管理系统只支持测试用例的导入,但是不支持导出。手动导出就需要手动机械化地复制粘贴,很枯燥,这种机械化的事情就应该开发一个自动化的工具去做,解放测试人员的劳动力。于是花了一下午时间,基于Selenium
库开发了一个可配置的测试用例自动导出工具。
给海哥验收之后,我考虑起这个工具的性价比:假设手动导出一次3分钟,自动导出时间忽略不计,那么一次导出就能节省3分钟的时间;一次迭代大概只有一次澄清详细测试用例的流程,两次迭代中间至少间隔两周;我开发这个工具用了一下午,按3小时算;那么这个工具大概使用60次迭代,也就是至少120个工作周,我的工具就算“收回成本”了。。。
实习期间,我参加了招商银行信用卡中心举办的M-Geeker技术竞赛并进入决赛,结合一个多月的实习经历,感触颇多。
算法设计类的比赛和考试我参加了很多,提前批的决赛赛题却换了个套路:以实际的需求场景为背景,开发一个高可用高可靠的系统。这种开发的需求在我日常科研学习中几乎没有的,上次碰到这种设计开发系统的需求还是在三年前参加上海交通大学软件学院夏令营机试的时候,结果不出意外地挂了,冥冥之中暗示了这次比赛的最后结果。。。
在比赛成果答辩时,对于中转算法我提出了一个基于朴素BFS
的启发式算法,通过MyBatis
从MySql
中把所有数据读到内存里,然后调用算法计算结果;Q&A环节评委认可了我的算法,然后提出其实我可以基于已有数据修改一下表结构,使用简单的sql join
语句就可以得到两个站点之间的可达性,在性能开销和时间开销上都优于我的离线算法(不过答辩结束再去思考的时候觉得这样可能只能支持一次中转的情景,估计是我学艺不精);
刚入职坐在海哥旁边学习时,他就跟我提到一些需要掌握的技术,其中反复强调用好数据库的重要性。但是我在学校的课程学习和实验中,几乎很少用到数据库,在大三初完成课程设计后也基本抛弃了数据库的使用,大多数情况下都是把数据格式化保存到文本中进行持久化。这次试题中我设计了两张表,也只是起到了最简单的存储作用,两表没有任何交互,完全没体现数据库的优势;用好数据库能够极大地简化问题、降低业务的复杂度、提高模块/系统的性能,这也是赛题中强调良好的数据库数据结构设计的原因;
高并发场景,同上。在软工中,常常会研究并发场景出现的数据竞争等问题。对于真正的高并发场景,可能并不知道如何设计整个系统。针对此次赛题,购票后需要锁票,100个人同时抢10张票,一定有且仅有90人返回购买失败,在分布式场景下如何设计整个系统?我在答辩PPT上简单写了思路,用synchronized
关键字只能保证在单个服务器上保持一致。Kafka
这类消息中间件可以保证消息最多被消费一次(at most once, at least once, exactly once),评委老师告诉我消息传到MQ
后再取出来被消费,中间会存在时延,不适合用在这个场景(在答辩时出于公平原因考虑,没有告诉我合理的解决方案,赛后搜索发现这种需要实时获取结果的场景需要用 RPC
)。我相信这个场景有成熟且高可靠的解决方案,自己平时总认为这些东西都是工作后可以掌握的,而在学校写实验代码都是单线程跑,根本用不上这些,这种“实用至上”主义让我几乎不主动去了解这方面的技术,真正做工程碰到了一无所知;
我们研究过的很多东西都基于实际的应用场景,但是解决方案(代码)都是实验性质的,对于解决方案在实际场景中的可行性进行证明或实证调查;很少产出真正项目级别/产品级别的代码。我曾经试图用比较严格的规范来编码,但是随着实验的进行,中途会有较多大规模的变化或临时的需求,疲于应付这些改变导致我慢慢放弃了对于代码规范的保证;
比赛最后一天的下午安排了提前批的面试,面试官是信息技术部的周炜总经理。
最后的结果还是技不如人,最终没有获奖和拿到提前批的offer。不过此次经历让我认识要到了公司需要的人才应该具备的技术栈,而不是一味地刷题;赛程安排之余还有官方安排的小龙虾盛宴,结识了各个学校杀出重围赶来比赛的大佬,比赛抱憾之余也算不虚此行了。
同时也感谢这次比赛让我在不到一周时间内入门了Springboot
、MyBatis
、Thymeleaf
。。。
作为实习生,没有与正式员工的权限访问一些内网系统。在这个前提下,安排的任务难度就比较低,容错性较大。完成安排的工作之余便有时间进行自学,熟悉内部系统/项目所用的技术栈,亦或是在令人慵懒的下午三点,叫上室友偷偷溜到二楼食堂买下午茶(园区内有一个星巴克,卡中心的员工打九折优惠)。。。
人力资源部也很关心实习生的发展,在工作日的下午或周六上午组织的各色各样活动、讲座、入职培训、期中座谈会等,极大地丰富班后生活。
两个月的实习生活转瞬即逝,回首昨日似乎才刚搬进公寓结识两位小伙伴。日常实习工作中偶尔忙里偷闲,感受IT行业在学术界和工业界的思维差异,并思考如何在快速更新迭代的互联网环境中保持竞争力。通过此次实习我学到了:
凡是过往,皆为序章。两个月的实习,对于部门和公司来说我只是一个匆匆过客;但是这次实习经历对于我,帮助我平稳过渡到社会,了解职场的规范,熟悉业界的工作流程,965的工作作息,相对可观的薪酬,是值得铭记的一段历程。
感谢招商银行信用卡中心作为我步入社会的第一家公司,给我提供了足够高的平台和足够广阔的视野。
感谢信息技术部数据管理与支持室提供的实习机会和丰富的学习资源。
感谢微光标签小组和公共组件小组的前辈们提供的支持和帮助。
感谢导师海哥在实习期间在专业方向的学习路径、职场规范和系统业务方面的谆谆教诲和耐心指导。
我平时喜欢看动漫,希望能用「日常」中的一句摘录结束这个总结:我们所度过的每个平凡的日常,也许就是连续发生的奇迹。