工作七年总结

May 10, 2017


刚结束完日本的旅行,恰逢飞机上有时间,趁机总结下过去,展望下未来。

工作

转眼间,从2010年毕业到现在已经七个年头了。简历上的职业/职位/项目经历的也在不断变化,每个职位我暂且修饰以 工程师

  • 2010年 - 2012年,中兴通讯的LTE系统测试工程师,工作主要内容是LTE通信系统的控制面协议、算法测试。

  • 2012年 - 2013年,中兴通讯的LTE对外合同测试工程师,在香港CSL项目待了一年多的时间,主要测试交付合同条目,此期间也尝试着做对外测试项目的管理,处理与各个第三方部门的合作。

  • 2013年 - 2014年,Samsung SDS的Java开发工程师,当时Samsung SDS初入西安,有幸在此期间Java EE开发入门,且短暂时间带过一个四人开发小组。

  • 2014年 - 2016年,ThoughtWorks的开发工程师,在REA BAU组里熟悉了各种技术栈,成为一个 全栈工程师, 也熟悉了项目中的敏捷开发实践。

  • 2016年 - 2017年,REA RCA组里的Tech Leader以及Team Leader,在项目中历练了自己的团队技术管理、团队管理能力。


技术

测试转开发的过程中经历过转型的痛是不断在熟悉不同的技术栈,原本的期望是在嵌入式C/C++方向发展。入职Samsung后参与的却是之前一无所知Java EE项目,项目技术栈以Java, JQuery, CSS为主。入职ThoughtWorks后又从一个Java工程师变为一个全栈工程师,使用技术栈多且杂,AWS, Ruby, Java, Scala, NodeJS, CI/CD,Ansible, Docker等。

测试转开发

在决定从测试转为开发时,把在学校里较熟悉的C/C++有捡起来。Windows电脑上学习C/C++还是比较方便的,Visual Studio和Dev C++编辑器,学习Win32编程,MFC,Boost,以及各种算法还是比较方便的,但是Unix网络编程啃起来就没有这么容易了。

为了能找到开发的工作,也在网上找毕业生面试题刷题,看的东西也没有方向,如甚至看过DOM/DLL开发,现在几乎都没有印象了。其实回头来看对我找工作最重要的还是设计模式的学习。当时接触了MVC的概念,觉得Model, View, Controller分离很高大上,虽然对于那时Java程序员来说,MVC已经是一个家常词汇了。面试Samsung SDS时,使用C++写的一个程序,按自己的理解写了MVC分离的实现,且在PPT展示给面试官时试图话几页PPT去展示我对MVC的理解,结果面试官并不感冒,直接让我略过MVC的内容。

Java EE开发

Samsung SDS西安研发中心前期并没有项目,或者Samsung的高层并没有想好要西安做什么。所以入职后为其两个月的培训,入门了Java EE开发相关的知识,也接触了敏捷开发的概念。

当时培训时小组有五六个人,一起完成一个简单需求的开发,在这个过程中使用的框架是Spring MVC + MyBatis。入职前一直觉得C/C++开发人员需要长时间积累高大上,Java开发人员培训机构速速培训出来的。做完项目后认知没有颠覆我的想法,但感叹Spring MVC框架的强大,依赖注入、反射、适配器等等,但是问题是在搭建整个开发环境时并不那么顺畅,手动下载各种依赖Jar包尤其觉得痛苦。

在培训的过程中也逐渐了解了JQuery, Ajax,在印象中是Ajax的使用着实让自己痛苦,虽然已经记不清痛点究竟在哪了。

培训结束后也参与了几个小项目的开发,在这些项目的小实践中逐步加深了对Spring MVC的认识,而学习到更多的是JQuery相关的至少,项目中引入了JQuery的各种控件,如表格、日历控件等。这些控件虽强大却有各种Bug,为了解决问题也读了一些控件的源码。

印象比较深的一个比较坑Bug是在某个控件中循环迭代时条件判断删除当前节点,解决办法是迭代记录需要删除的节点,迭代完成后批量删除。

在项目中还接触了部分PL/SQL的内容,一些老旧的ERP项目在Oracle上使用各种复杂的PL/SQL以及统计SQL语句进行查询统计。当时觉得SQL工程师很强大,以致于自己还下载了很多Oracle PL/SQL相关的书籍。

全栈开发

ThoughtWorks是一家咨询公司,咨询是其一大块业务,但也外包人头给其他公司(第三方公司视为合同工)。我有幸成为REA(澳洲最大房产公司)的一名开发者。

REA的技术和管理都较先进,很早以前就开始讲单体项目拆分为微服务,很早以前就引入DevOps文化。我在BAU组修了一年多的Bug,接触了REA各种老系统、次新系统、新系统。

  • 本地搭建各个服务的运行环境。在搭环境的过程真正感受到了Mac book(Mac OS)的好用(brew安装各种软件, rbenv, jenv, nvm管理ruby, java, NodeJS的各种版本),Build工具(Gradle, Rake, Grunt/Gulp)的适用,Git版本管理工具的强大。

  • 熟悉各种IDE的使用,IntelliJ IDEA开发Java利器, Ruby Mine是Ruby开发的利器。而Sublime, Atom等也是非常强大的编辑器,免费有海量的插件。

  • 熟悉项目中的单元测试、集成测试,单元测试如Java的Junit、Ruby的Rspec以及NodeJS的Jasmine和Mocha。其他测试如Cucumber测试,PACT测试,UI测试。也感受到测试驱动开发在项目中的魅力,修Bug时看到好的单元测试以及测试驱动出来的代码,会情不自禁的点赞。

  • Infrastructure as Code, 项目构建与部署的脚本都是Ansible 代码,Dockerfile或者AWS Cloudformation。

  • 持续集成,自动化测试,构建与部署pipeline,可视化的构建状态版去实时展现所有项目的build情况,也可以邮件通知到相关人员。

  • 持续部署,零宕机的红绿部署,Feature Toggle, A/B Test。

  • 访问事件统计,Newrelic, Crazy Egg, Krux, Google Analytics, Newrelic用得较多,其不仅可以监控到后台服务的也可以监控用户对网页的访问性能。

  • 系统健康度监控,所有APP统一命名的监控监控。Nagios, Newrelic可以监控机器的运行情况(CPU, 内存,网络IO情况), NodePing可以监控系统与APP的一写节点保持心跳的方式来监控各个APP的运行。PagerDuty提供接口给各种监控工具,当系统运行部健康时发送通知或邮件给相关人员。

  • 这对不同服务SLA的划分(SLA1, SLA2, SLA3)。

未来的期望

技术上一直是有偏好的,希望自己能够多做点有 技术含量 以及 门槛高 的活。 但这种想法越来越淡了,希望自己继续全栈下去,但是对项目中用到的技术都要好好的总结输出成系列文章。

踏踏实实的走好每一步, 不求成为技术上大师,但求一步步的成长。方向比努力重要,但是个人理解,IT行业的道理其实很简单:通过项目实践历练才有最快的成长。

所以要么换工作,要么在现有的项目上尽量多的攫取经验和知识。

管理

待续

兴趣

待续

投资

待续

生活

待续