从来没有写过年度总结,今年决心写一次,也算是对满是感慨的2016年做个纪念。从年前一直拖到现在,拖延症着实严重,Mark一下日期:2017-02-09。哈哈~~梦想和现实总是很矛盾,从我的博客名和我的性格中就能体现出来。
生活
截至今年中秋节,爱情长跑已经跑了6年,依然是异地,从早期的分分合合,到现在谈婚论嫁,整体上看似乎是顺顺利利,然后实际有多曲折,可能只有我们俩自己清楚。能遇见已是缘分,在一起更是不容易!
不得不说,在这场爱情长跑里,她牺牲了很多很多,远超于我。为了能在一起,结束异地生活,争论了很久,最后她选择了辞职来北京找我,这件事情上,我有点狠心,并且越是临近她来北京的时间,我越觉得矛盾与愧疚。矛盾是因为2016年北京的房价,呵呵,涨了一倍,虽说年轻该闯一闯,但现在真的怀疑这些决定是否值得,但愿多少年后,回首再看这篇博客时,能够回复两个字:值得。再说愧疚,专科学历的她,放弃了本来舒适、稳定的工作,来北京找工作,承受的压力可想而知。除此以外,因为我们俩学历不对等,这么多年来自周围的言论,也是给她带来了巨大的压力。然而我不仅没有同意回合肥发展,也没有能力帮助她,让她来北京过上幸福、安逸的生活,至少在现在的房价下,两、三年内没有希望。
(PS:居然能让房价涨了一倍,也不知道上面是干嘛的,我就不信2017年上半年你不回落一次)
因为她的牺牲,我们的爱情也前进了一大步。用行动和态度说服了双方父母改变了心意,家长见面、领证日子、婚礼日子,习俗礼节等等,两星期内全部敲定,万事俱备,只欠落实。这样的速度,连我们自己也觉得惊讶。
爱情果真是一件让人幸福、愉悦的事情,尽快工作上突发变动,心情压抑,但每每想到谈婚论嫁的事宜,总会多云转晴,动力十足。
工作
今年年初时,刚毕业半年,也刚工作半年。之前没有实习过,工作经验少的可怜,另外基础也不扎实,所以,可以说是彻头彻尾的新手菜鸟!尽管如此,在工作方面,今年着实收获很多、成长很多,同时也感慨很多!
前一年写了2个月数据库自动化脚本,天天加班加点的,好不容易积累了点数据库运维技能,夯实了python、shell编程能力,准备强行当一个DBA,搞一点运维开发、数据分析。结果今年……尼玛!依次做了批量部署、装机自动化(what‘s the fuck?!)、服务端开发、系统发布与持续集成、自动化测试、系统环境运维、前端开发……唉~~莫名其妙的被领导刻上了“全栈”的印记,亲身体会到了那种“什么都会做,又什么都不会做”的感受。尽管如此,“全栈”没有白做,高的离谱的绩效也没有白拿,这一年我还是成长了很多,总结一下收获:
1、批量部署
说起来很简单,然而在公司几万台服务器上操作,所需要的可不仅仅是“怎么做”,更重要的是“要注意哪些情况”。怎么做?我用的是Ansible。要注意哪些情况?密码文件的管理、rm等高危操作(莫名的想起了gitlab事件,可怜的管理员)、机器品牌、机器型号、操作系统版本、MegaCli版本、磁盘空间、用户权限、性能等等,各种各样的特殊情况。幸好有位大神罩着,不然我这个菜鸟也不会成长的这么快,这对我后续的做事风格影响很大,这也是领导比较重视我的一个原因,做事、写程序考虑的因素、场景很全面,对于危险的操作有足够的防护措施和回滚策略。
话说那个全自动部署的脚本写的真是漂亮,解析文件、批量部署、分析部署结果、生成部署结果Excel,几万台服务器的批量部署,全部自动化,真的是很厉害,然而能体会到这一点的可能只有我和那位大神两个真正做的人。
2、装机自动化
从大学开始,如果遇到了“难啃的骨头”,一般都是我上,我也不知道我身上的哪个特质导致了这样的情况(不过我这个人好奇心比较重,做之前都比较兴奋,并不抵触,然而也只是做之前~~之前~~前~~)。难啃的事,不一定就很难,技术也不一定就很高深,关键在与:压根就不想做,比如说装机自动化。我一个计算机科学与技术专业毕业的人,硬件不怎么懂,嵌入式也没好好学,之前也都是写Python、Shell,再多点也就用了点MySQL、MongoDB、Ansible,领导居然让我去做自动化装机,这是个什么鬼?!即使做出来,对我以后有什么用处?并且这回可不像批量部署那次有个大神照顾了,什么是ILO?什么是IPMI?什么是PXE网卡?通通都不知道!脑子里的唯一的想法就是:“刚买回来的机器,都没开机,也没有系统,没有人工介入,怎么装系统?”
尽管如此,最后我居然单枪匹马,一个星期就给出实现方案了,现在想想也是蛮自豪的。实现方案:PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统。虽然实现方案是可行的,最后我也确实实现了,然而结果却差强人意,纯粹变成了我的技术路线的一个冷门分支,并没有实际成果落地,因为任务起初定下的会提供给我机器的MAC地址,最后提供不了,导致整个实现方案不能覆盖到所有机型。这是我的工作生涯中,第一个失败的任务,尽管我自己是满意的,因为你给我MAC地址,我就能完成自动化装机。
3、服务端开发
系统上线后,用户体验并不好,Bug很多,前端、后端人手不够,领导单独请吃了一顿饭,1个小时的功夫就把我从底层Python开发转成了后端Java开发。虽然Spring MVC、Hibernate都没看过,但是边学边做,倒是很快就达到了基本开发的需求。修了2个月的Bug,又开始负责数据库相关业务逻辑,再之后逐渐的扩展到系统大部分业务逻辑,以及多个系统相关组件的开发与运维,包括监控组件、报警组件、任务调度组件、定时任务组件等等。在这个过程中,自己的问题定位的能力、业务逻辑的理解能力、系统框架的设计思想、数据库表结构的设计思想、团队协作能力、开发流程的规范化、文档的规范化、项目管理等都有不同程度的提升。总的来说,开发技能进步的很少,但是在系统的整体框架,以及业务逻辑的理解上提高了很多。
对系统整体框架的了解,对各个业务逻辑的把握,以及良好的沟通、工作方式,确立了我在项目组内的核心骨干地位,参与了一些重要功能的设计与开发。
4、系统发布与持续集成
因为Bug太多,外界给的压力太大,领导希望每天都能看到效果提升,从而几乎每天都要发布系统,修复Bug。刚从底层转到后端的我,正好接手了系统发布的工作,当时还是手动发布。作为一个写了几个月底层代码的人,我实在是接受不了每天心惊胆战敲着相同的命令,生怕敲错一个命令,就会系统崩溃。于是我写了一个自动部署的Shell脚本,部署快了,但是打包、上传war包还是很慢(因为是在本地打包,上传到服务器,笔记本配置太差)。所以我又搭建了个Jenkins,花了两天配置好了,整个跑通了。考虑到之后能将系统发布工作交接出去(实在太枯燥了),又添加了在ftp上的版本管理,与Git双重保险,并添加了一键回滚策略,保证万无一失。 一键部署,一键回滚,十分方便,搭建完使用了好多天后才知道,原来这个玩意还有个专门的名称:持续集成。自己方便、团队开心、领导满意,简直不能更好。
5、自动化测试
在2个月的Bug修复时期,出现了多次产生了新的Bug、Bug反复出现的情况,在新功能开发中,领导严格要求开发流程的规范化、文档的规范化,另外,就是要引入测试来保证系统的质量。领导的这一决定,项目组的很多开发都不理解、不赞成,觉得是在浪费时间,但是我个人一直是非常赞成这个想法和理念的,尤其是测试驱动(TDD)的思想,虽然行为驱动(BDD)更加高大上,但是我觉得测试驱动更加符合当时的项目及开发者的情况。不过,仅仅是赞成想法而已,真要实现,我是反对的,各个开发在测试上想法不一致,强行推行测试,并不会得到预期的效果。个人感觉,想要落实测试,团队成员必须都要对测试有足够的重视,即使你不是一个测试人员。
话题说偏了,简而言之,领导又让我设计一套自动化测试方案。一方面,要能融入持续集成中,测试不通过就不进行构建、部署;另一方面,要能覆盖前端代码、后端代码、底层代码;最后,要能模拟用户,进行整个流程的测试,也就是用户验收测试(UAT)。最后我的设计方案是:1.使用Selenium测试框架进行UAT测试,同时也能覆盖到前端代码的测试,该测试仅针对更新频率较低,并且重要的页面流程进行测试,其它测试代价太高,折中后放弃;2.使用JUnit编写单元测试,进行后端代码的测试,然后在Jenkins构建、打包前,通过Maven调起单元测试,测试通过才构建,否则失败,并发送邮件通知;3.使用UnitTest等测试框架,编写单元测试,进行底层代码的测试,比如Python程序的测试。
庆幸的是,领导仅让我设计了方案,搭建、配置了部分环境,并未让我全权负责测试代码的编写,总算逃过一劫。作为一个好同事,我还友好的提醒了其它快要掉进这个“大坑”的同事,个别还给出了逃离理由,唉~~真是对不起领导啊,谁让你这个真的有点坑人啊~~
6、系统环境运维
我运维了几乎所有的系统和组件,运维真是件痛苦的活,尤其是特别重要的组件,比如报警组件、任务调度组件。尽管为了省事,我已经写了很多组件运行状态的监控脚本,各个组件也都有高可用脚本,但是依然有很多事情要处理,比如机器宕机、机器下线、节点迁移、添加节点等等。每个组件每个操作,会影响到哪些组件,会影响到数据库中的哪些表。唉~不得不感慨,知道多了也很累,各种事情都会来找你。
7、前端开发
我并不懂前端开发,然而因为分工不是特别明确,经常进行后端开发或者Bug修复,会涉及到部分前端内容,总是不停的找前端开发人员,找多了自己也不好意思,比较人家也有自己的任务。没办法,索性就学了前端的基本知识:Html + CSS + JavaScript,我个人特别喜欢页面这种所见即所得的感觉,突然发现还挺有意思的,于是乎又学习了JQuery + EasyUI,慢慢的,不仅问题不找前端了,后来干脆跟领导说我的页面我自己画,不用找前端人员了。就这样,我又成了前端开发。最近又看了点BootStrap和Vue.js,MVVM还是挺不错的,虽然还不怎么会写,但是并不妨碍我很喜欢前端开发的感觉。