杨二

Machine repeats, Human creates

一次项目总结

引子

参加工作五年了,一直想找个实战项目综合性地练练手:从后端到前端,从后台到前台,技术选型,开发排期,开发环境,部署环境,通通自己来搞定。这是件很有挑战性的事情,同时也可遇不可求。

不知是上天的眷顾还是捉弄,前段时间公司有个“分站”项目立项,委任我为项目经理(第一次作为项目负责人),但人手严重不足,只给我分配一个只有一年开发经验的 PHP 程序员,工作态度挺好,但基础实在薄弱,时间紧,任务重,许多问题实在是不能从零开始教她,最后没办法,硬着头皮自己包揽了大部分开发任务。

一个多月的加班加点的生活,最终如期并且超出预期地完成了分站项目,值得好好总结总结:不吹不黑,讲讲从前端转后端,搞定 PHP 项目是怎样的一种体验,无关情怀,只讲事实。总结分为两部分,第一部分介绍飞华分站这个项目,第二部分分享下对写代码这件事的思考。

飞华分站

飞华分站项目,是以省为站点单位建站与管理平台,其实就是门户网站在各个行政区域的本地化站点,有如下功能: 后台,其实就是数据的管理,交互非常多:

  • 登录,注册,角色,权限控制等标配功能
  • 一个后台对应多个站点
  • 后台角色分为:超级管理员、站点管理员和站点编辑
  • 超级管理员可以编辑站点(增删改查),并拥有站点管理员和编辑的所有权限
  • 站点管理员可以管理编辑(新建,删除,重置密码等等),管理分类(增删改查),并拥有编辑的所有权限
  • 站点编辑可以编辑文章(增删改查)和手工(增删改查)

后台登录

超级管理员后台首页

后台用户管理界面

后台文章管理界面

前台,纯展示页面,分为首页,列表页,详情页:

分站前台首页

分站前台列表页

分站前台详情页

改进

公司有自己的 PHP 框架,这么多年了,自己也或多或少地了解了这套框架的代码,有些地方已经挺老旧了,基于此套代码,我做了如下改进:

代码瘦身

删掉了巨量无用的代码,最终打包出的代码从 70+M 锐减到 20+M

数据库的使用方式

mysqli ==>PDO(Medoo)

PDO 优势:

  • PDO 真正的以底层实现的统一接口数库操作接口,不管后端使用的是何种数据库,如果代码封装好了以后,应用层调用基本上差不多的,当后端数据库更换了以后,应用层代码基本不用修改.

  • 支持更高级的 DB 特性操作,如:存储过程的调度等,mysql 原生库是不支持的.

  • PHP 官方主推,兼容性稳定性必然要高于MySQL Extension,可以直接使用pecl upgrade pdo 命令升级.

  • 可以防止 SQL 注入,确保数据库更加安全

    真正感到爽的是:可以以 OO 方式来存取数据,不用自己拼 sql 语句,减少了出错的可能性,更易维护。

类库的加载方式

require XXX ==> Composer

开发体验

SVN 本地提交后刷新看效果 ==> Docker 本地开发

后台颜值&交互

  • Bootstrap-UI ==> Semantic-UI
  • 同步操作,刷新页面 ==> 异步操作,即时响应

同一功能,不同的实现

功能点 新实现 老实现
分页 结构化
body 数据
PHP 拼接 HTML
手工 标识
更灵活,更一致,减少了理解成本和数据库表
模块
表单验证 自动化、可配置
增强了体验的同时也精简了代码
手写
缩略图上传 多张、可配置 单张

新工具

为了支持以上列出的改进,经过大量的调研,引入了以下新工具:

  • docker:方便开发环境的搭建

docker v.s. VM

特性 Docker VM
启动速度 秒级 分钟级
硬盘使用 MB GB
性能 接近原生 弱于
系统支持量 单机支持上千容器 一般十几个

无论是性能、效率、还是资源占用上,比传统虚拟机都有非常明显的优势。当然,对于开发流程而言,要求不仅限于性能、效率和资源占用。 还要考虑制作、分发、部署、管理是否方便快捷、是否可以自动化。 这些通过 Docker 都可以让流程更高效,机器干机器干的事,人干人该干的事。 降低了应用环境的管理成本,就可以投入更多的精力到更有价值的事情上,比如需求消化关注代码质量

三句话

也是三个原则,贯穿开发始终

  • Machine Repeats,Human Creates.
  • Simple Short Straightforward (3S 原则)
  • 脱离业务场景谈技术的优劣都是耍流氓

环境即基础

搭建能提高开发效率的环境:

  • docker
  • composer
  • semantic-ui
  • medoo

代码即表达

  • 时刻谨记:维护你代码的人是一个知道你住址的狂暴精神病患者
  • 做好格式化(借助编辑器或插件,自动格式化)
  • 命名规范:类/函数/变量/数据库字段
  • 代码长度:e.g.一个函数不要超过一个屏幕
  • 好代码本身就是最好的文档:

    如果你是医生,病人在请求手术前别洗手,因为那会花太多时间,你会照办吗?本该是病人说了算,但医生却绝对应该拒绝。为什么?因为医生比病人更了解感染的风险。医生如果按病人说的办,就是一种不专业的态度。 同理,程序员遵从不了解混乱代码风险的产品经理(策划)的意愿,都是不专业的做法。

推荐读物: write clean code

思维即能力

一开始就把事情做对:CODE LESS THINK MORE

think more code less

最后

在此只是提纲挈领地罗列出自己的观点,很多点都可以展开来说,比如 Docker 就是一个值得写一系列文章来介绍,以后有时间我在展开来讲。