引子
参加工作五年了,一直想找个实战项目综合性地练练手:从后端到前端,从后台到前台,技术选型,开发排期,开发环境,部署环境,通通自己来搞定。这是件很有挑战性的事情,同时也可遇不可求。
不知是上天的眷顾还是捉弄,前段时间公司有个“分站”项目立项,委任我为项目经理(第一次作为项目负责人),但人手严重不足,只给我分配一个只有一年开发经验的 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 都可以让流程更高效,机器干机器干的事,人干人该干的事。 降低了应用环境的管理成本,就可以投入更多的精力到更有价值的事情上,比如需求消化,关注代码质量。
-
Composer:方便各种 PHP 类库的引用
-
Medoo:数据库连接与使用
-
Semantic-UI:后台 UI 快速搭建
三句话
也是三个原则,贯穿开发始终
- Machine Repeats,Human Creates.
- Simple Short Straightforward (3S 原则)
- 脱离业务场景谈技术的优劣都是耍流氓
环境即基础
搭建能提高开发效率的环境:
- docker
- composer
- semantic-ui
- medoo
代码即表达
- 时刻谨记:维护你代码的人是一个知道你住址的狂暴精神病患者
- 做好格式化(借助编辑器或插件,自动格式化)
- 命名规范:类/函数/变量/数据库字段
- 代码长度:e.g.一个函数不要超过一个屏幕
- 好代码本身就是最好的文档:
如果你是医生,病人在请求手术前别洗手,因为那会花太多时间,你会照办吗?本该是病人说了算,但医生却绝对应该拒绝。为什么?因为医生比病人更了解感染的风险。医生如果按病人说的办,就是一种不专业的态度。 同理,程序员遵从不了解混乱代码风险的产品经理(策划)的意愿,都是不专业的做法。
推荐读物:
思维即能力
一开始就把事情做对:CODE LESS THINK MORE
最后
在此只是提纲挈领地罗列出自己的观点,很多点都可以展开来说,比如 Docker 就是一个值得写一系列文章来介绍,以后有时间我在展开来讲。