工程化思想总结

前言:本人和Jack两人创立Wonder科技两年已久,虽然公司还没注册,但我们的项目已经开发到1.2版本,由于种种原因项目停止了开发。Jack开始了写书的道路,而我,也面临了找工作的事情,在找工作之前,我想先把这两年学习的东西进行总结和复盘,如若能帮助大家,也算是做了件好事。

先给大家介绍下我们的项目,以及我们如何使用工程化思想进行项目重写和重构。

我们开发的是Web端3D WebGL引擎和在线编辑器,其中Jack主要负责引擎,我主要负责3D编辑器以及公司官网、论坛、托管平台等系统开发。在这期间我也熟悉引擎并开发了引擎中的自由相机功能,以及集成到编辑器中使用,为此,我想总结下这两年来跟随Jack学习到的工程化思想。

一、中大型项目的根基:测试驱动开发

刚接触TDD的时候我想大家肯定也和我一样迷茫,到底花费那么多时间写测试有没有必要,尤其是前端开发同学,很多公司不要求你写测试,所以大环境下前端程序员基本不会写测试。我先列举自动化测试的优点:

  • 降低成本:程序员以自动化测试捕捉到bug,成为一个测试用例,就把这个bug固定住,以后有任何重构让这个bug重现都能报错,这样我们不需要测试团队
  • 减少时间:只需要写一遍测试就可以一直复用,效率肯定比人工高
  • 正确性:只要测试代码覆盖越多的产品代码,就能保证产品代码的正确性
  • 代码复用性、可扩展性:当项目发展到一定量级,没有自动化测试支撑的项目,很难进行代码维护和重构
  • 测试可读性:良好的测试也可以当做文档方便阅读
  • 增加信心:帮助我们增加对软件的信心,也让用户更放心使用我们的产品

我们的编辑器测试覆盖率达到87%,覆盖了所有编辑器与引擎交互的业务逻辑代码,在我们项目迭代过程中,我也越来越感受到自动化测试的重要性。此外,测试驱动开发还有一个优势就是,我们在进行需求设计的时候,以先写测试的形式进行开发,在这个开发过程中,我们从用户角度分析这个需求,进而可以帮助我们完善自己的代码设计,在编程过程中,又有测试保证代码的正确性。

所以在编写3D引擎或者Web富应用(如钉钉,工具类网站)的时候,我觉得公司有必要考虑进行自动化测试,不然项目发展起来可能会出现无法迭代的后果。

二、契约式设计:增加代码的健壮性

何为契约式设计?

契约式设计(DbC)是一种设计计算机软件的方法。这种方法描述了,软件设计者应该为软件组件定义正式的、准确的、可验证的接口规范,它扩展了抽象数据类型对于先验条件、后验条件和不变性的一般定义。这些规范称为“契约”,它是一个比喻,类似于商业契约/合同的条件和职责。

我们内部开发的时候,每次完成一个功能,都会进行代码检查,Jack也会根据自己以往的经验进行重构,在重构过程中我也掌握到契约式设计的好处和必要性。由于我们使用的函数式编程范式,函数是基本单位,所以放大了契约式设计的优势,所以我们为很多特定函数写契约,使用先验条件和后验条件来保证函数的健壮性。

先验条件: 保证API的输入是我们期望的输入,比如我们设计一个数组操作API,那我们需要保证参数为一个数组,这时候我们写先验条件,保证参数类型为数组,再进行操作,如果不是则抛出错误。

后验条件: 保证API的输出是我们期望的输出,比如某个特定API,需要输出数据不为空,这时候我们写后验条件,期望他的返回值不为空。

在线上运行时我们需要保证错误定位,根据我们的产品上线经验来看,大多数报错都来自于好的契约设计,让我们能快速定位到问题的位置,所以我觉得在我们设计API的时候可以使用到契约式设计,来保证API的健壮性。

三、团队规范

团队内部规范定义是一个重要的事情,能保证一个团队的产出就像一个人完成的一样,也使得团队成员之间能够无缝衔接完成工作,也不必担心成员变动等问题。下面我介绍一下我们团队的规范。

1.git提交规范
我们使用cz-customizable库以及规范的CZ提交规范

2.代码规范

代码规范主要使用项目负责人的编程规范,或者使用成熟团队的编程规范,执行主要使用代码审核的方式把新人的编程习惯规范下来,每次功能完成以后都花时间进行代码审核尤为重要,第一保证新人的工作质量,第二保证新人的编程规范。

四、自动化工具

我一直是相信人是会犯错的,但机器不会,所以我们需要把团队经常重复手动执行的工作交给机器来做,大公司是专门有内部工具团队来做这个事情,我们两个人的话当然也是我们自己写的自动化工具。

以前在看程序员分级的文章里提到一句话,抛开工具的使用,程序员与程序员之间的差距并不是很大,而对新工具的使用,能培养程序员一套新的思维方式,进而促使他们更新自己的思维。

1.Vim操作命令

在我认识Jack的时候,当时还没一起合作,Jack在后期给我的指导是学习Vim和TypeScript,而我在三个月的Vim学习过程中放弃过无数次,但第二天又再次捡起来,终于能够形成肌肉记忆,从此感受到Vim给我带来的编程快感,而我也从一直手动重复做事情,进阶到使用工具快速完成的思维,以前写代码使用键盘搭配鼠标,移动光标慢,导致编程速度慢。在使用Vim以后纯键盘操作,在编程时经常感受到自己很厉害,常常自我陶醉,这也是编程的乐趣之一。

2.Emacs

网上经常有人讨论Vim和Emacs孰好孰坏的问题,我使用Emacs主要使用Emacs-org进行TODO管理,依然使用的vim操作命令,还需要学习Emacs的基础命令,在记录笔记和TODO的时候,真心感觉好用。

3.chrome插件

因为我们编辑器主要运行在chrome上,所以使用好的chrome插件可以帮助我们在浏览器上进行操作。
我觉得最好的是Vimium插件,在浏览器上使用vim命令,进行操作,大多数时候都不需要鼠标就能流畅使用浏览器。
还有其他的都是私人插件,根据个人喜好进行选择,在这我就不多介绍了。

4.自动化部署

把本地项目推送到远程服务器时,写工具实现自动化项目部署,把项目发布能够保证正确和简便。

5.CI测试检查

项目发布新版本,推送到远程服务器,先自动运行测试CI检查,保证所有测试通过再提交。

6.自动化发布

项目发布新版本,自动化更新版本号,执行发布流程。

结束语: 在结束自己两年的创业生涯其实还是挺舍不得,多情自古伤离别,不过我们每个人都有自己的生活要过,我和Jack亦师亦友,感谢Jack多年的教导和关爱。在本科毕业第三年,我从Wonder科技毕业了,以后的路,依然天高任鸟飞。

你可能感兴趣的:(工程化思想总结)