外包十年

老猿信息

ID:川川
曾用ID:比尔板三
出生年月:1979年11月
星座:天蝎
专业:工业设计
职业:程序员
PMP
爱好:马拉松、越野跑
博客:奔跑的猿(原博客地址)


工业设计是非常好的专业,但我没有这方面的天分。大学一位同学自学通过了高级程序员考试,我对计算机也颇有兴趣,开始学习,先后考过三级、四级、高程。毕业后一直从事软件开发工作,08年奥运前夕来到北京,开始了近10年的外包生涯。

来北京之前,在东北工作六年,从事过ERP实施及维护,开发过自控、病案管理等软件,涉及PB、VB、JAVA等技术。

外包十年

东家I
NO. 1 H公司
之前,连续的JAVA开发经历不过1个多月,仅熟悉SSH框架,设计能力很弱。项目刚刚开始,没有基础架构,需求也不清晰,脱离SSH模式开发某一部分代码,如何设计类都不知道,近两周没有什么产出。领导又安排了一个小项目,由我搭建基础框架,使用SSH、JFreeChart、Open Flash Chart等技术,和一位同事一起开发,顺利完成任务。后又加入另一项目组,主要应用SSH2、Ext、JFreeChart、Open Flash Chart等技术,架构基本上模仿江南白衣的Spring Side。

NO. 2 S公司
到了S公司才知道,项目是H公司开发的,要感谢H的推荐。工作内容主要是编写Oracle存储过程、Java后台调用程序。同事部署时采用逐一替换类的方式,经常出错,这也导致不能确定生产代码是否与开发代码完全一致。为解决这一问题,我开发了Ant打包脚本,再将两者打的包反编译后比对修改,确保了代码一致。工作中,往往一些小问题不去花时间解决,造成浪费更多的资源,产生更多的问题。

NO.3 T公司
开发维护过三、四个项目,涉及Socket编程、Eclipse RCP、SSH等技术。期间对新开发项目的前后台结构进行了调整,去除了不必要的逻辑,分离出公用代码,引入JQuery重写了JS代码,自定义了常用组件,使代码结构更简单清晰。

NO.4 A公司
主要负责前台原型开发及加密、压缩等一些技术的研究,涉及Seam 2.2、JSF 1.2、Richfaces 3.3、Hibernate 3、JBoss 4、Maven、Hudson等技术。当时JSF 2.0、Richfaces 4、Hibernate 4、JBoss 7已推出,我曾建议采用新技术并重构一些基础代码(如表单验证、DataModel等),但未被采纳。Seam简化了代码的开发,但学习较难,其双向注入、事务处理等也带来较多问题。

合同到期后,未续签,也未找新工作,整理了一些资料,此后形成记录文档的习惯。

东家B
在一家公司工作一个多月后被解雇。主要使用RCP技术,那时我不看好RCP的前景,最初是不想到这家公司的。工作中遇到一个RCP问题,我只想通过RCP本身而不想通过其他方式解决,迟迟未找到办法,安排学习Mule ESB也没进行。在这家公司时间虽短,但学习了一些知识,公司采用测试驱动开发(TDD),重视代码风格和质量,鼓励重构,重视测试,特别是功能测试(使用的fit)。有一些理念或方法,我不大认同:当时团队刚刚实施Scrum、结对编程,本来几分钟的站会往往持续一上午;结对编程我认为是互相学习的好方法,但我不认为适用于正常编程,不适合所有人,我更需要安静的环境;加班成常态,效率低下,有很多时候很多人是不必要加班的。

东家S
在I公司工作至今。到I公司破费周折,原本定好4月份上班,结果拖延到8月份。好在有失有得,这段时间养成了跑步的习惯,至今已参加过几十场马拉松和越野跑,跑了大半个中国。

五年的时间,参与了多个项目。

第一个项目主要负责前台开发,使用的技术主要有CDI、JSF 2、Richfaces 4、Hibernate 4、Concordion、MySQL、MongoDB、Jenkins、Sonar、Jboss EAP 6、Linux,后因有图表的需求,又引入了Primefaces。项目由thoughtworks主导,是迄今我参与的项目中管理最好的一个。

接下来,独立开发了一个小项目,基本延用上一个项目的技术CDI、JSF 2、Richfaces 4、Concordion、Jenkins、Sonar、Jboss EAP 6,新引入了DeltaSpike和BootStrap。

后来,在前两个项目的基础上开发了一个框架和Demo工程,编写了框架和环境配置用户手册,供其他项目使用。在新项目开始时负责培训,POC代码开发,新技术研究等。

近两年,主要负责多个项目的升级工作,从JDK 1.5/1.6升级到1.7,从Ant升级到Maven,从Jboss 4升级到EAP 6,数据库从Oracle迁移到PostgreSQL,部署环境调整到AWS,SVN、Git、Nexus、Jenkins、Sonar、Nagios等都迁移到AWS。这些项目涉及的技术主要有:Seam 2、JSF 1.2/Richfaces 3、Struts 1/2、Spring 3、Hibernate 3、EJB、JMS、ESB、JP1等。因EAP 6不再支持Jboss ESB,删除了ESB,重写了相关代码。另外,所有系统进行了SSO改造。AWS是升级中使用的新技术,编写了CloudFormation、CLI等脚本管理AWS资源。之后,参与了一个项目的重写,使用了Spring Boot 1.5 + Angular 4架构。

今年,使用Spring Boot 1.5 + Angular 5开发了一个项目的POC代码。框架 和Demo工程进行了两次升级,先用Primefaces 6替换了Richfaces 4,后又用Spring Boot 2 + Angular 6重写。以前升级的项目又进行了升级,从JDK 1.7升级到1.8,从Jboss EAP 6升级到EAP 7。

软件升级与维护

在升级过程中,发现了一些问题,整理如下:
代码

  • 编码
    开发人员IDE的编码设置不统一,有的UTF-8,有的GBK,同一工程多种编码,造成乱码,编译错误。
  • 代码风格
    不使用IDE格式化代码(特别是未格式化的页面代码,难以维护),无空格、不规则的缩进、过多的空行、错误的拼写、无意义的变量名、方法名、大段注释掉的代码(查看历史完全可以通过版本管理工具,保留不利于后期维护,建议删除,不要保留垃圾)、字段和方法排列混乱等。
  • 日志
    大量使用System.out、e.print,导致无法控制日志的输出,输出的日志不规则,不利于查看。不合适的日志级别,debug、info、error乱用,在循环中输出大量日志,造成性能下降,过多无效的日志,不利于错误排查与分析。
  • 注释
    过多的注释,大量注释未必能提高程序的可读性,也不利于维护,常发现注释与代码不一致的情况。有意义的变量名、方法名,清晰的结构,具有良好可读性的代码不需要过多的注释,甚至根本不用注释。
  • 错误
    大量存在IDE能检查出错误的代码,比如错误的注释变量名、页面标签、无效CSS链接等,这些错误虽然不会影响编译,不会影响当前功能,但造成后期排错困难,或者有潜在的风险。

  • lib中存在不需要的jar,在升级分析中浪费时间。有的jar同时存在两个版本,代码中存在乱用库的情况,使用internal类,使用容器特有的类,或某一框架特有的类,而没有使用通用的标准类库。
  • 访问权限
    过多的使用public、protected,应遵循类和成员的可访问性最小化的原则。
  • 重复的代码
    大量Copy/Paste的代码,而没有进行提炼,发现bug时要多处修改。
  • 多余的代码
    大量存在不再使用的代码,没有被调用的类,没用的页面等。确定不用的代码应果断删除,减少以后的维护工作。
  • 过长的代码
    一些类有数千行代码,这些类大多如经重构后能大为缩减,每个方法功能类似,有些代码本应通过SQL实现,有些可利用反射机制。有的项目管理者关注代码行数,简单的以代码行数衡量工作量。
  • 异常
    忽略异常,不输出错误日志,使用错误的级别输出日志,没有输出完整的错误信息,造成查错困难。
  • 模块
    项目模块拆分不合理,各个模块/子系统间相互依赖,共用部分未分离。
  • 过度设计
    简单问题复杂化,过多非必要的设计

管理

  • 加班
    重复性的劳动,短期内通过加班可以追赶进度,长期加班势必导致效率下降。解决技术问题,需要劳逸结合,往往是在放松时想起问题所在。
  • 进度
    开始每项任务之前一般会预估一个时间,既然是预估就会或长或短,特别是遇到技术坑可能会逾期,项目管理者应掌控全局,而不是纠结于一个任务。
  • 代码质量
    平时谈要重视质量,制定质量目标,但开发时往往牺牲质量赶进度,要求先完成功能后期再完善代码,甚至说通过测试来保证质量。有多少程序员在项目成功上线后,有时间或者有意愿再去调整优化代码、修改潜在的问题呢?质量和进度是矛盾的么?从长远看高质量意味着高产能,特别是项目初期的代码往往对后面代码有很大的影响,初期代码有良好的设计与质量,后面的开发会节约大量时间,良好的质量也会减少测试、返工、维护的时间。一旦大量低质量的代码堆积,就积重难返了。
  • 性能
    花费大量时间进行性能测试,但没有真正关注性能。很多代码实现方法、处理逻辑或数据库有性能问题,没有从本身解决,只是考虑增加硬件。
  • Workshop/结对编程/方法论
    一个团队需要不同的人,假设你的五个手指一样长,能称之为健全的手么?有的人喜欢安静独立,有的人喜欢结对,没有一种方法论是银弹,最终结果更多在于是谁来做,而不是怎么做,项目的成功是团队中各种人团结努力的结果。
  • 会议
    无效会议多,不相干的人集中在一起开会。在工位几句话可以说清楚的事情,没必要到会议室。
  • 信任
    程式化方法论,防御式管理,缺乏信任,过多干涉技术细节。
  • 责任
    管理者应有担当

老猿

  • 注重基础知识,多看官方文档、样例,磨刀不误砍柴功。遇到疑难问题时,如网上没有同样的问题,很可能是最基本的东西弄错了。
  • 查看源码,有些lib不再更新,需要修改源码时,可先在老环境下调试跟踪,帮助理解程序逻辑。
  • 大胆重构,不断改进
  • 行百里者半九十
  • 尽力做好

而立之年到北京,十年过去,仍无以立,希望十年之期有一个好的开端。
外包十年
一个人跑的快,一群人跑的远

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章