工程化思想总结

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

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

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

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

刚接触TDD的时候我想你们确定也和我同样迷茫,到底花费那么多时间写测试有没有必要,尤为是前端开发同窗,不少公司不要求你写测试,因此大环境下前端程序员基本不会写测试。我先列举自动化测试的优势:

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

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

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

2、契约式设计:增长代码的健壮性

何为契约式设计?

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

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

先验条件: 保证API的输入是咱们指望的输入,好比咱们设计一个数组操做API,那咱们须要保证参数为一个数组,这时候咱们写先验条件,保证参数类型为数组,再进行操做,若是不是则抛出错误。

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

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

3、团队规范

团队内部规范定义是一个重要的事情,能保证一个团队的产出就像一我的完成的同样,也使得团队成员之间可以无缝衔接完成工做,也没必要担忧成员变更等问题。下面我介绍一下咱们团队的规范。

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

2.代码规范

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

4、自动化工具

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

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

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科技毕业了,之后的路,依然天高任鸟飞。

相关文章
相关标签/搜索