• 工程化思想总结


    前言:本人和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科技毕业了,以后的路,依然天高任鸟飞。

  • 相关阅读:
    js如何将字符串作为函数名调用函数
    js如何生成[n,m]的随机数
    UIMenuController,UIPasteboard:复制,粘贴详细解释
    python2.7和 python3.4但是不要
    Android IPC通信和AIDL技术应用
    可穿戴式智能设备,其潜在的安全问题?(上)
    CentOS安装KVM步骤虚拟机,绝对实用!
    Python于*args 和**kwargs使用
    uva 1556
    JSCover+WebDriver/Selenium获得JS 代码覆盖
  • 原文地址:https://www.cnblogs.com/xiaohaoxuezhang/p/11713479.html
Copyright © 2020-2023  润新知