理顺软件开发各个环节-14(开发管理-编程实现)

5.7编程实现

软件开发,最后终归要编写程序代码来实现。

5.7.1关于程序语言

程序语言,即计算机语言,与自然语言的语种一样,也是五花八门,就我自己用过的语言就有:汇编、BASIC、FORTRAN、VB、C、C++、C#、PASCAL、PHP、JAVA、PYTHON、R等,还有脚本语言如:JavaScript/jQuery、HTML、XML、JSON、Shell、EL、SQL等。还有一些未曾使用但稍稍了解的语言,如ADA、COBOL、EPL、Erlang、F#、Go、LISP...等等,不一而足。

只要有配套的解释器或编译器,就可以有一种计算机语言。实际上,通过语法分析、词法分析,结合编译原理,就可以自己设计语言。

选择何种计算机语言,在总体设计时需要考虑,与软件依赖的软硬件环境有关,也与需要实现的需求有关,再结合计算机语言对开发实现带来的便利性。

在C++时代,不同的编译器有自己的类库,如Turbo C++、Borland C++、C++ Builder、Visual C++、GCC等,一旦选择,更换的成本非常高。

C++作为OOP的主力语言,高性能是优点,但内存管理给开发人员带来很大挑战,因此GC机制的引入,使得很多应用放弃了C++,而使用C#或Java。

Python近年来,持续火热,一方面因其支持函数式编程,另一方面与其支持大量机器学习算法包有很大关系。但由于其GIL,很难做到真正的多线程,并发能力是瓶颈。

在Windows平台,VC++和C#.Net是主流的选择;在Linux平台,主流选择是Java。其它如C、Python、PHP、Node.js等视需求选择。

Java作为跨平台语言,是如今B/S架构的主流语言,框架从早期的SSM到如今的SpringBoot,插件也非常丰富。因此,如有机会,就应尽量了解、熟悉和使用Java语言。

5.7.2关于编程规范

程序代码不仅输入给编译器或解析器,同时也是呈现给开发人员的。计算机语言,是表达思想的一种方式,这就需要开发人员有良好的表达能力。这个表达能力,不仅是符合计算机语言的语法和业务的逻辑结构,还应遵循约定的编程规范,从而使得开发团队成员阅读代码变得轻松,提高团队成员流动的便利性,降低代码的维护成本。

编程规范一般涉及如下部分:

  • 代码注释规范(我倾向于使用母语注释,这样更容易准确表达和被理解,除非是跨国团队协作);
  • 命名规范;
  • 代码书写规范;
  • UI规范(视需要)。

编程规范的执行情况,可以结合工具检查和人工代码审查来实行。工具如CodeStyle,Pylint等。

5.7.3关于接口先行

在代码开发之前,先确定接口,包括入参和出参,接口代码可以先不实现,用固定的值返回(即所谓的假接口)。

如Java开发,可以使用Swagger或YApi来开发接口,结合Mock构造数据,然后就可以部署,调试接口。

接口先行,好处多多。可以很容易发现参数是否缺失,数据类型是否合理等等,甚至可以检测出接口是否需要增加等情况。

由于代码尚未实际开发,所有调整的代价都是很低的;一旦代码已经编程实现,调整起来容易伤筋动骨。


5.7.4关于单元测试

Java开发,使用JUnit,实现单元测试,是提高代码质量的有效手段。

当然,单元测试的有效性,更重要的是测试用例的有效性;但使用单元测试框架,可以大大提高回归测试的效率。且单元测试可以单独部署,也便于测试验证。

因此,应尽量使用单元测试框架。


5.7.5关于持续构建

Jenkins使得代码的持续构建成为现实。

代码持续构建,方便获取可验证程序软件,便于及早发现问题,对于提高团队开发效率,帮助很大。当然,还需要与配置管理结合起来。

5.7.6编程实现阶段的关键信息

责任人:开发项目组长。

执行人:开发人员(软件工程师)。

关键行为:编码实现和自测。

输入

  • 软件需求规格书(SRS);
  • 数据字典(DD);
  • UI&UE交互设计原型(如果有);
  • 用户故事;
  • 总体设计文档(视需要);
  • 概要设计文档;
  • 详细设计文档(如果有);
  • 接口设计文档;
  • Checklist;
  • 开发约定。

输出

  • 程序代码,使用代码配置管理,一般用dev分支或相应的开发分支;
  • 单元测试及checklist,各check项都自测通过。

职责要求

  • 分析软件需求;
  • 理解设计思想;
  • 必要的详细设计;
  • 编写程序代码;
  • 实现软件需求;
  • 单元测试;
  • 代码review;
  • 提交代码至配置库。