从入职到如今已通过了一年,然而博客几乎没有更新。原本毕业时和过年先后是打算写点总结什么的,写着写着就没有继续。php
但不写点回顾的话,内心总感受难受。之后要是想回忆一下当初都作了啥,结果没想起什么,感受都是在浪费时间,这就很差了。html
这几天恰好是咱们这批新人入职满一年,脑中“写点什么回顾一下吧”的想法频繁浮现。索性就把周末时间拿来写这篇博客了。前端
在同班同窗的安利下,来到如今就任的这家公司面试。如今咱们在同一个小组。linux
当初是冲着说不用加班来的(然然后来却常常加班,虽然是自找的)。此外,待遇好也是很是吸引个人地方~git
同事以前的氛围很好。你们人都挺好的。此外咱们老大(咱们都叫他大大~)常常会请咱们吃下午茶,有时候会组织部门聚餐,上周六还一块儿去看了《我不是药神》。小组的聚餐也组织过几回。前面说过,这几天咱们这批新人入职满一年,你们会买下午茶请部门的同事。因而咱们就这样吃了一周下午茶,哈哈哈。在这样的部门里面,感受很幸福~面试
也有很差的地方。我所在的小组就编程而言,个人水平是最高的了,其余技术方面的也差很少。这也就意味着在这个小组里面,没有大腿能够抱,只能经过自学来提升本身。自学的进步速度比不上有人带的速度。这也是我常常感到压力的缘由——进步速度太慢了。数据库
所幸的是,从去年十二月开始,咱们部门有同事组织起了知识分享会,成立了学习小组。每周五下午会抽出两个小时的时间给知识分享会。期初是针对特定议题,你们各自学习,并在会上针对议题讲述所学内容或发表见解。后来则是由每一个人自定主题,而后上台演讲。主题的范围很广,非技术相关的例如:时间管理、如何作好演讲、团队合做等;技术相关的例如:代理服务、分布式、存储组件等;不知道怎么分类的例如:人工神经网络介绍(我讲的),三维地图重建,密码学入门等。编程
总的来讲,能学到东西,但仍是不够。一般只有讲师学到的东西最多,其余人能学到多少,仍是要看讲师讲得如何。像我讲的人工神经网络,虽然全程都是有画图讲解的(彻底没有PPT),可是到了后半部分往深讲的时候,仍是有一半同事懵圈了。json
一年间接触的项目总共有三个,姑且称做项目 A B C。用的语言都是 PHP。vim
项目 A 放后面讲,另外两个内容比较少。
项目用的是 Zend Framework 框架,1.10.8 版本,2010 年 8 月发布的。如今最新版本是 3。
旧代码不多用到框架已经写好的东西,还有很多东西是框架已经写好,但仍是本身写的。应该只是为了用上 MVC 和部分功能吧。
和其余模块的重构是把原来的代码拷一份,而后在上面修修补补的方式不一样。我基本重写了全部代码。把业务相关的东西抽出来,简化复杂的逻辑,把大块的代码拆解成几个部分。然而这是有代价的,我为此加班了好多天。不过最后仍是定期交付了。若是不重写的话,我能够不加班也能完成一样的功能,可是过不了本身这一关。本身经手过的代码,让它们保持之前那种糟糕的状态,实在不能接受。
不过我也知道本身这样作的风险。从公司的角度讲,天然是项目越快完成越好。万一要是由于我想把代码写好一些,致使项目进度变慢,那问题就大了。虽然在很多地方我克制了冲动,但仍是常常忍不住去重构代码。幸运的是,项目的进度要求都没有紧张到没有时间来作优化。这也是受到公司氛围的影响吧~
一开始冲着机器学习来的,兴冲冲地加入到项目里面,想着学点有深度的东西。但果真仍是太年轻了。自身并无相关的技术积累,想经过加入项目来提升技术的想法,是否是太幼稚了呢?
在这个项目组里面,到目前为止我都是负责后台的简单工做。例如提供知识库的录入界面等各类界面及其配套的后台逻辑代码,大部分工做都是前端相关。后端框架用的 EasySwoole ,由于涉及到通讯,须要用 swoole 扩展。不过我这一部分的工做跟这个框架其实没什么关系。先后端接口用的 Restful API 标准,可是 GET 查询的支持不完善。
其余同事有的负责模型训练,有的是负责通信模块。虽然原理我懂很多,但没有实践。后面咱们会交换工做内容,我到时争取换到模型训练去。
说到我在这个项目所作的事情,能够引出一个话题:
其实我指向好好地作一个后端开发人员。嗯!前端是要了解一点,可是也没必要要这么早吧。等此次作完,之后再有其余前端的事情,我都推掉。此次没有早点推掉,把本身给坑了。
待我成为后端大佬,须要拓展技术面的时候再去多了解和实践前端。
因为是主要参与的项目,因此能够说的东西就比较多了。下面我就叫它流水系统吧。事先说明,这是个内部系统,用户量不会大到哪去,但使用频率很高,并且跟绝大部分提供给用户的线上的机器有关。
前面说过,这个项目的历史有十年以上。想象一下十年前的开发吧,如今流行的几个框架中,最先的是在 2007 年左右发布第一个版本。没错,也就是说这个项目没有用到任何框架。最多见的 MVC 也是不存在的,基本全部东西都写在一块儿,面向过程。听说这个项目的开发人员基本都是从运维转到开发,包括目前组内的几个成员都是从运维转到开发的。
不过神奇的是,我参与的这部分(也是整个系统最有业务价值的部分),能够说是隔离的还不错。前辈们已经把前端相关的东西封装好了,只须要到配置界面配置一下,就能组合成一个简单的表单界面。剩下的就是写后端部分,你能够把它当作是一个接近纯 API 形式的系统,最终只要 return 一个 json 字符串就好了。这点实在是使人佩服。这也为我接下来的改造提供了便利,由于在整个请求中,会有一个地方成为主入口,只要在这个地方作个拦截,把部分请求重定向到另外一个位置,最后返回的时候是一个符合规定的 json 字符串就行。
流水系统的开发面临几个问题:
听说在我来以前的一年,已经有说要重构项目了,但一直没有行动。由于维护自己就要花去不少时间,再加上需求一直作不完。这周才又开始提起这件事,由于组内目前有几个同事,他们负责的部分没有需求了。并且我在最近的半年间也作了很多事情,对他们也会有帮助。
接下来讲说我怎么逐个解决上面那几个问题吧。
本来能够说是没有什么管理方式。事实上咱们改代码基本都是直接到线上用 vim 改(致使我如今 vim 几个快捷键用得 66 的)。一旦保存,就会自动生成一份备份文件到指定的备份目录。而后咱们会有代码审核,要调用 linux 的 diff 比较两个文件的不一样,而后截图发到讨论组让其余人审核。有时候改的地方多,要截图好几屏幕。
连 svn 都没有,更不用说 git 了。
今年三月,我开始推进代码管理方式的变化,改为用 git 管理代码。固然,老大是支持滴。我作了几件事:
先后大概一个月的时间,前期准备花去大概三周(毕竟还有需求要作)。培训先后跨度一周。培训完的下一周开始使用。算起来应该要从四月初开始算起,到目前为止合并了 760 个 Pull Request。
咱们组四月份的时候来了个新人。当后来谈起 git 的时候,我说了在三月底才逐渐开始使用 git 以及之前是怎样管理代码的时候,她都惊呆了。
让咱们回到还没使用 git 的时候。
上面说了修改代码时一般要在线上修改,为何不在测试机上修改呢?
不过我也有一段时间是在测试机上修改,而后复制到线上。可是 vim 编辑虽然挺熟悉的,但仍是不舒服。后来就下载 PHPStorm ,在本地电脑上修改,而后经过它内置的 ftp 传到测试机上测试。
为啥不在本地搭建个环境呢?这其实也挺困难的。
第一点还好解决,毕竟有虚拟机呀。第二点就比较麻烦,所有数据都同步的话,要几十个G吧。
因而本地搭建环境这点就先搁置了。要等到接下来讲的这件事作完才有继续的可能。
先说以前的开发是如何调试代码的。首先确定是在线上调试,调试的手段是 echo var_dump print_r 这些,直接把数据打印到界面上。是的,你没看错。用户都能看到他们打印出来的信息。
大量的数据暴露给用户,并且我以前还看到把一个接口请求的 key 暴露出来。更惨的是,这是已经调试完,没有删掉的。也就是说存在至关长的一段时间。事实上代码里面有大量的这种输出信息没有删除。所幸直接用户都是公司内部员工,这要是外部人员使用,早炸了。
对于开发者而言,若是是本身写的代码,echo 看一下可能很快就找到问题。但若是是别人写的代码,可能要 echo 一大堆才知道问题在哪。更可怕的是,这若是是系统基础层面的问题,根本不知道在哪找 bug,那代码一坨坨(来自同事的描述)的。
有个比较好的地方是,这个系统有备机。我在备机上装了个 Xdebug,这才使得断点调试成为可能。固然,为了支持多人能同时调试,还去装了个 dbgp。这些在我以前的博客中有写了:php+xdebug+dbgp远程调试(多人)。当时发到博客园首页,还被管理员踢掉哈哈哈。
此后我都是使用 IDE 来断点调试,这才能知道系统究竟是怎么运行的。
可以断点调试意味着我可以知道它链接了哪些数据库,查了哪些表。这样就能够开始作配置了。
为了方便之后新搭建系统,我还写了个半自动初始化的脚本。把要修改的配置组织好,而后转化成原系统可用的数据。还提示了要把系统跑起来,须要同步哪几个表格。可是碰到路径依赖的代码时,仍然要再去手动修改代码,而后重试。
这种方式持续很长一段时间,直到我最近接触 Docker 才获得解决。我在 Windows 10 上面装了 Docker。而后对 PHP 镜像作了定制,其实就是额外装了 xdebug 、 composer(PHP 的包管理工具)、一些项目会用到的 php 插件。
通过一些配置的调整,总算是跑起来了。效果还不错~不过还有几个地方须要调整和添加的,后续再继续处理。
看如下几个数字:
19264 17622 13223 12160 6621 6067 4655
这些是几个主要文件的行数,最大一个将近两万行了。用 PHPStorm 打开后有点吃力,解析要好一下子。
里面实际上是不少个 if-elseif-else 组合成的,每一个分支完成一件事情。其实能够把它们看为一个个 function,事实上把它们抽取为 function 也能正常执行。最大的一个文件由大概 200 个分支组成,平均每一个分支 100 行代码。可是也有很多分支有 5~6 百行代码,3 百行的 foreach 循环了解一下?
后来我作了个改变。前面有提到,它在某一个地方会有一个统一的入口,而后也有一个统一的出口。我另外建了个文件夹,而后建了一个文件做为新的入口,把知足条件的请求转发到这个入口。就像是进入一个子系统。
这个子系统能够直接使用 PHP 的一些特性,例如命名空间。在里面写代码直接用面向对象的方式来,只要最后返回的结果是 json 就好了。这样能够为之后的重构(实际上是重写)作准备,提早写好一些工具类,积累一些须要注意的点。
在实现上面,没有直接使用开源框架。一个是编码问题,咱们项目是 GBK 编码(其实也不是很难解决);另外一个是之后项目重写的成本问题。目前不用框架,把骨架搭建起来仍是蛮快的。在一些实现上面会去参考开源框架,像 Yii2 和 Laravel ,也会往 PSR 上面靠。
这样单个文件的大小就变小了,变成多个小文件。不少能够重用的代码也能够封装起来,放到类里面。前面那么多年,没有留下什么有价值的代码,实在是惋惜。若是之前有封装一些业务相关的代码,如今要了解业务也比较方便些。
新的代码会写在这里面。若是有旧代码须要维护,且感受能够重构的时候,也会把代码重构到子系统里面。
这个是在 git 以后。由于作这种大规模添加和变动的时候,有 git 会比较好处理。
这项目的测试基本都是在测试机上直接进入网页测试,没有什么单元测试的概念。有时候测试机没办法测试,只能到线上测。Emmm...是挺危险的。
嗯对,没有专门的测试人员。
如今 git 有了、IDE 有了、面向对象也有了,能够了解一下单元测试。正好公司有这方面的绩效要求。
之前那些代码很难测,我先处理的是面向对象这部分的单元测试,引入 PHPUnit。先把工具类的单元测试搞定了。
接着想着怎么测试之前的代码。仍是从单一入口那里入手,一些全局变量都事先声明好,还有一些文件都导入进来,而后调用。固然还要处理其余问题,例如原先的代码里面,会直接 echo 出东西,这些要用 ob_start() 这种拦截下来。不过 PHPUnit 也有对这方面的支持。
这项目没有什么文档,他们的理由是业务常常变化,文档要常常改,麻烦。不过连基础的业务无关的开发文档都没有,确实麻烦。新人来了还得找导师问,由于并无相关的培训课程。
后来我写了篇开发文档,填补了这个空白。(听说写得不错)
自从引入了子系统,也补充了篇开发文档。不过由于结构挺清晰了,不用文档也能开发。
至于业务上的文档尚未写。以前公司的机器在作集群架构调整,目前咱们这边还在作相应改变。调整完成后,我会逐渐把业务文档补充上去。
上面提到这个项目要重构(重写)。这个其实才是我最感兴趣的地方,由于能学到很多东西。到时要向大佬们多请教。若是到时有大腿来指导就行了。
你可能会问,哪来时间作这些事情?不用作需求吗?我说一个数据。咱们加班是没有加班费的,可是有一个误餐补贴。天天加班到八点半后就有 20 块钱,而我上个季度的补贴是 1k+。
这一年间作的事情看起来不是不少,也不是不多,惟一能肯定的是学到的东西很少。这是最让我忧虑的地方。这一点以前咱们部门的一个大佬跟我聊的时候有说过,孤军奋战进步很慢。其实部门里面的高手也是有的,但我不善于使用已有资源这一点是硬伤,要想办法有所突破。
但愿接下去能有更多进步的机会~我也会去多争取这样的机会。