奔跑的猿

ID:川川Jason 姓名:孙靖川 出生年月:1979年11月 星座:天蝎 专业:工业设计 职业:架构师 爱好:马拉松、越野跑 邮箱:sjc-925@163.com

价值不在于知,而在于学。
授人以鱼,不如授人以渔。
知之为知之,不知为不知,是知也。
吾生也有涯,而知也无涯。以有涯随无涯,殆已。
未来教育是免费的。

工业设计专业,自学计算机,通过了三级、四级、软件设计师、PMP考试,一直从事软件开发工作。

黑龙江工作六年,负责ERP运维,开发油田注入站监控、病案管理等软件。08年奥运前夕来京。

外包十年

东家I NO. 1 H公司 来京前,JAVA开发经验不多,仅熟悉SSH框架。参与的第一个项目采用Adobe Flex + Java技术,尚未搭建基础架构,需求也不清晰,脱离SSH模式开发,近两周没有进展。领导又安排了新项目,我负责搭建基础框架,采用SSH、JFreeChart、Open Flash Chart等技术,顺利完成开发任务。后又参与另一项目,应用SSH2、Ext、JFreeChart、Open Flash Chart等技术,架构类似江南白衣的Spring Side。

NO. 2 S公司 项目原为H公司开发,主要任务是开发Oracle存储过程和Java调用程序。另外,编写Ant打包脚本,校对开发与生产代码的一致性。原打包脚本已不可用,同事采用替换类的方式进行生产部署,经常出错,这也导致开发与生产代码不完全一致。工作中,往往因不花时间解决一些小问题,反而浪费更多的时间与资源。

NO.3 T公司 参与了几个项目的开发与维护,主要应用Eclipse RCP、SSH、Socket、Axis、jQuery等技术。除基本的开发任务外,优化项目前后台架构,删除冗余逻辑,提取公用代码,使架构更简单清晰;学习新技术并应用到项目中,如利用JQuery重写JS代码、开发JQuery组件等。

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等技术,开发了一些POC代码,重构表单验证、DataModel等。Seam简化了开发,但学习较难,其双向注入、事务处理等也带来较多问题。项目采用的均是老技术,在技术选型时,我更倾向于使用最新的版本,而不是基于当前工程师已掌握的技术或者为了避免趟坑,技术更新迭代原本就很快,采用老技术不但不能利用新技术的特性、优势,也给以后的升级带来不必要的麻烦。

合同到期,辞职。

东家B 工作一个多月,被辞退。

主要应用Eclipse RCP技术,我不看好RCP的前景,原本不想继续从事RCP开发。工作中遇到一个RCP问题,我执着于通过RCP本身特性解决,而迟迟未采用其他方式。当时业余时间在学习PMP课程,安排的Mule ESB学习任务也没有进行。在这家公司时间虽短,但学习了一些新知识:测试驱动开发(TDD)、fit功能测试等。公司重视代码风格、质量,重视测试,鼓励重构。我不大认同公司的一些理念或做法:Scrum每日例会时间过长,往往持续一上午;结对编程有利于互相学习、培养新人,但不适合两个人同时学习新技术,不适合日常编程,不适用于所有人,我更需要安静的环境;加班常态化,效率低下,很多时候很多人是没必要加班的。

东家S I公司工作至今。到I公司颇费周折,原定4月份上班,拖延到8月份。有失有得,这段时间养成跑步的习惯,至今已完成几十场马拉松和越野跑比赛。

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

第二个项目规模较小,独自开发,基本延用上一个项目的技术CDI、JSF 2、Richfaces 4、Concordion、Sonar、Jboss EAP 6,新引入了DeltaSpike和BootStrap。

后来,负责多个项目的升级工作。升级范围:JDK从1.5/1.6升级到1.7(后升级到1.8);Ant升级到Maven;Jboss服务器从EAP 4升级到EAP 6(后升级到EAP 7);删除Jboss ESB,重写相关代码;实现ADFS SSO登录;部分数据库从Oracle迁移到PostgreSQL;部署环境迁移到AWS;迁移OpenLDAP、SFTP、JP1、SVN、Git、Nexus、Jenkins、Sonar、Nagios到AWS;编写AWS Cloud Formation、CLI脚本管理EC2、RDS等AWS资源。另外,使用Spring Boot + Angular重写一项目。涉及的技术主要有:Seam 2、JSF 1.2/Richfaces 3、Struts 1/2、Spring 3、Hibernate 3、Quartz、JBPM、EJB、JMS、ESB、JP1、OpenLDAP、JMeter、Spring Boot、Angular、AWS。

核心任务是开发公司内部使用的框架和Demo工程,编写wiki文档,以提高新项目开发速度,促进工程师掌握开发技术。开发了多个版本,分别基于以下技术:CDI/DeltaSpike + JSF 2.0/Richfaces 4.5、CDI/DeltaSpike + JSF 2.0/Primefaces 6.2、Spring Boot + Angular、Spring Boot + Angular + Keycloak。 另外,提供CI集成、Nagios监控、SSO、OpenShift/ECS部署等方案。在新项目开始时培训工程师、开发核心代码、研究新技术、解决技术问题等。

软件升级与维护

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

  • 编码 IDE的编码设置不统一,同一工程多种编码,乱码多
  • 代码风格 代码未格式化(特别是未格式化的页面代码,难以维护),无空格、缩进不规则、空行过多、拼写错误、变量名和方法名无意义、大段注释代码(可通过版本管理工具查看历史,保留不利于维护)、字段和方法排列混乱等。
  • 日志 大量使用System.out、e.print,导致无法控制日志的输出,日志格式不规则。不合适的日志级别,乱用debug、info、error。在循环中输出日志,造成性能下降,无效日志多,不利于错误排查。
  • 注释 注释过多,常发现注释与代码不一致的情况。大量注释未必能提高程序的可读性,也不利于维护。有意义的变量名、方法名,清晰的结构,具有良好可读性的代码不需要过多的注释,甚至根本不用注释。
  • 错误 存在大量IDE可检查出的错误代码,比如错误的注释变量名、页面标签、无效CSS链接等,这些错误虽不影响编译,不影响当前功能,但造成后期排错困难,或者有潜在风险。
  • 库 lib中存在不需要的jar,有的同时存在多个版本,代码使用的lib不一致。使用internal类,使用容器特有的类,或某一框架特有的类,而没有使用通用的标准类库。
  • 访问权限 过多的使用public、protected,应遵循类和成员的可访问性最小化的原则。
  • 重复的代码 大量Copy/Paste的代码,发现bug时要多处修改。
  • 多余的代码 存在大量未使用代码。应删除无用代码,减少维护工作。
  • 过长的代码 过长的方法或类,功能相似的方法应进行重构,减少重复。代码行数不是衡量工作量的标准。
  • 异常 忽略异常,使用错误的日志级别,不输出错误日志或不完整的输出日志,造成查错困难。
  • 模块 项目模块拆分不合理,各模块/子系统间相互依赖,未分离出共用部分。
  • 过度设计 简单问题复杂化,过多非必要的设计

管理

  • 加班 反对加班制度化、形式化。员工应有奋斗精神,但加班不等于奋斗,加班多少不是衡量员工是否敬业的标准。
  • 进度 项目管理者应掌控全局,而不是纠结于某个任务。
  • 代码质量 表面重视质量,制定较高的质量目标,但开发时往往牺牲质量赶进度,甚至说通过测试来保证质量、在后期完善代码。在项目上线后,有多少程序员有时间、有意愿去优化代码、修改潜在问题呢?质量和进度是矛盾的么?从长远看高质量意味着高产能,特别是项目初期的代码往往对开发有很大的影响,初期良好的代码质量,会节约大量开发时间。良好的质量也会减少测试、返工、维护的时间。
  • 性能 花费大量时间进行性能测试,但未真正关注性能,只为了满足性能指标。
  • Workshop/结对编程/方法论 团队需要不同的人,如五个手指一样长,手健全么?有人喜欢安静独立,有人喜欢结对,没有一种方法论是银弹,最终结果更多在于谁来做,而不是怎么做,项目成功是团队中各种人团结努力的结果。
  • 会议 无效会议多,参会无关人员多。
  • 信任 程式化方法论,防御式管理,缺乏信任,过多干涉技术细节。
  • 责任 管理者应有担当

员工

  • 注重基础知识、官方文档、样例的学习,磨刀不误砍柴功
  • 大胆重构,不断改进
  • 行百里者半九十
  • 尽力做好

2018 • 泰尼卡 • 意大利 • 巨人之旅 一个人跑的快,一群人跑的远