1 软件工程的基本概念

1.1 软件开发的基本策略

  1. 软件复用

    软件复用包括代码的复用、原有的类库、工具函数的复用、模版的复用、设计的复用、框架的复用。使得开发效率变高、降低维护成本、提高产品质量。

  2. 分而治之

    将一个工程分解为多个小的问题,分开处理。比如现在的前后端分离,就是讲一个具体的工程分为了前端和后端,前后端商量好接口的定义,就可以分开独自开发,最后再联调。这样的优点是专注小的模块,同时可以多个开发人员同时开发,缩减开发周期。

  3. 逐步演进

    比如敏捷开发,先做出一个可以勉强上线,满足用户大部分功能的产品,然后再根据需求不断的迭代,使产品更好的满足用户的需求。

  4. 优化折中

    一个好的产品,是多方面的考量的。从开发的角度,需要高性能、代码符合规范、安全。对于用户来说,是易懂、容易操作、满足用户的某些需要。但是有时候,为了高性能可能会带来更高的开发成本,这个时候,这个成本是否值得,就是一种考量了。如果花更多的成本去提高性能能带来更多的收益,当然是好的。如果不能,那提高性能的代价就值得商榷了。

2 编程过程与规范

Google各个代码的代码规范:https://github.com/google/styleguide,可以参考一下。

如何更专业的沟通和提问:https://github.com/seajs/seajs/issues/545

2.1 模块化程序设计

即将一个大的程序按照功能或其它分解的方式,拆解成一个个小的模块。(分而治之的策略),优点是:

  1. 降低程序设计的复杂度
  2. 提高模块的可靠性和可复用性
  3. 缩短产品开发周期
  4. 易于维护和功能扩展

如何划分:

按照业务功能:登陆模块、主页面模块、其他具体活动的模块。

按照系统层次划分:业务层、数据存储层等等。

按照代码稳定性,将不容易改变的、通用的代码放在一个个独立的模块,然后其他易变的模块去引用。比如接口请求模块是不易变的,而某个具体的活动是易变的。

每个划分都应该遵循单一原则。单一原则 !== 单一功能,而是说只有一个引起变化的原因。

2.2 try…catch

对于能够预知到可能会发生错误的代码,进行一场捕获,如果发生异常,可以在catch中处理异常。

2.3 实例:生命游戏

2.4 code review

JS代码规范

2.5 代码性能优化

代码优化考虑的因素:

  • 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率
  • 以提高程序的全局效率为主、提高部分代码效率为辅
  • 在优化程序效率时,应先找出限制效率的“瓶颈”
  • 先优化数据结构和算法,再优化执行代码
  • 时间效率和空间效率可能是对立的,应当分析哪一个因素更重要,再作出适当的折中
  • 从一开始就要考虑程序性能,不要期待在开发结束后再做一些快速调整
  • 正确的代码比速度快的代码重要,任何优化都不能破坏代码的正确性

具体的代码优化步骤:

证明需要进行代码优化 -> 找出需要优化的关键部分 -> 测试代码 -> 评测优化后的代码

具体实例:https://www.bilibili.com/video/av80893577?p=11

PS:可读性好的代码才能方便修改,好修改的代码才能有更久的生命力。好的软件都是迭代出来的。

3 测试

3.1 单元测试

测试用例:

测试用例值、预期结果、前缀值(即必要的输入或者条件状态)、后缀值

测试用例设计:

  • 具有代表性和典型性
  • 寻求系统设计和功能设计的弱点
  • 基友正确输入也有错误和异常输入
  • 考虑用户实际的诸多使用场景

3.2 黑盒测试

等价类划分:将每个输入域尽可能的少的若干子域,然后每个子域两两互不相交。这些子域都是有意义、合理的输入,是为了验证代码是否完整的实现了需求,这叫有效等价类。还有一些事无意义的、不合理的输入叫无效等价类,是为了验证当错误发生或者用户不合理操作的时候,代码对这些异常的处理,是为了验证系统的健壮性。在编写代码的时候,可以使用代码来mock一些不合理的数据输入和输出来验证无效等价类。

1
2
3
4
5
6
7
8
9
10
11
// 比如现在有一个需求是:写一个函数,判断输入的三个三角形的边的值是否构成一个三角形,如果构成三角形,判断它是什么三角形,三角形包括:等边三角形、等腰三角形、直角三角形、普通三角形

// 那么这个时候的等价有效类是:等边三角形、等腰三角形、直角三角形、普通三角形
// 无效等价类是:非三角形

// 测试用例可以为:
// 1. a = 3, b = 3, c = 3 等边三角形
// 2. a = 3, b = 3, c = 4 等腰三角形
// 3. a = 3, b = 4, c = 5 直角三角形
// 4. a = 3, b = 4, c = 6 普通三角形
// 5. a = 3, b = 4, c = 9 非三角形

边界值分析:将输入设定为程序的输入限制的边界,然后查看是否出错。若有多个边界值,则每次值选择一个边界值进行测试。其他有边界值的输入为正常输入。

1
// 比如边界值是100的时候,用该输入99、100、101这三个边界值,判断输出是否符合预期

健壮性测试:将输入设定为程序输入限制之外的值,判断程序是否对其有合适的处理。

3.3 白盒测试

白盒测试更多是需要人工的去查看代码,判断代码逻辑是否正确,这个一般在code review的时候做。

4 软件过程

IMG_E931332B9DB4-1

4.1 需求的提出

在产品提出需求的时候,就需要考虑到这两个方面:

  1. 需求的可行性
  2. 需求的所带来的预期收益

IMG_69B198928578-1

4.2 开发

IMG_596FD21DCC92-1

软件开发过程就是根据需求说明,然后设计系统结构、接口、组件,同时做好前后端接口设计,形成一个软件设计说明书。然后得到根据软件设计说明书进行开发。

IMG_AC4D7AEF303F-1