一 、编程精进之法
“敏捷”之TDD
TDD(全称Test Driven Development)测试驱动开发,是一种软件开发的流程,其由敏捷的“极限编程”引入。
开发过程是从功能需求的测试用例开始,先添加一个测试用例,然后运行所有的测试用例看是否有问题,再实现测试用例所要测试的功能,然后再运行测试用例,查看是否有case失败,然后重构代码,再重复以上步骤。
其理念主要是两件事:
- 确保所有的需求都能被照顾到。
- 在代码不断增加和重构的过程中,可以检查所有的功能是否正确。
“敏捷”之BDD
BDD:行为驱动开发(Behavior Driven Development)
行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。主要是从用户的需求出发,强调系统行为。BDD包括验收测试和客户测试驱动等的极限编程的实践,作为对测试驱动开发的回应。
“敏捷”之ATDD
ATDD:验收测试驱动开发(Acceptance Test Driven Development)
TDD 是开发人员的职责,通过单元测试用例来驱动功能代码的实现。
在准备实施一个功能或特性之前,首先团队需要定义出期望的质量标准和验收细则,以明确而且达成共识的验收测试计划(包含一系列测试场景)来驱动开发人员的TDD实践和测试人员的测试脚本开发。面向开发人员,强调如何实现系统以及如何检验。
保证编程质量,提高编程效率
任务列表法+PDCA
- 任务列表法:使任务 完全穷尽 与 各自独立
- PDCA是Plan-Do-Check-Action四个词的组合。是著名的戴明环。从计划开始,经过实践,再反思,产生的改进行动再纳入下一轮计划的持续改进过程。
plan:任务列表法(预估时间)
do:做可以check的事情(计时完成任务)
check:反思计划与实际的差距(对比时间,反思)
action:在反思后采取改进措施(针对反思要采取的措施)
二 、像机器一样思考
Analytical Thinking(按照输入输出 对问题进行分解)
思考过程:
- 分解问题
- 找到子问题之间的关联(通过输入输出关联起来)
- 找到问题的边界,明确假设与结果
数据类型与结构
类的结构表达对比:
JS
{
name: String,
age: Number,
children: [{
name: String,
age: Number
}]
}
JAVA
Person {
name: String,
age: Number,
children: [Person]
}
分析问题的基本原则:完全穷尽,各自独立。
各自独立,是指,在划分任务的过程中,每一个任务都对应一个 代码块 或一个 函数 ,这些代码块和函数,是互相不包含的(不是不依赖,Exclusive不是Independent)
完全穷尽,是指,需要穷尽这个代码块或函数里 所有的输入和输出 。不能遗漏任何一个输入,任何一个输出。每一项的 属性 也不能有遗漏
一图抵千言部分
画图的规则
我们的画图方法受时序图启发而发明,具体的规则如下:
1 图中基本元素由方块和带箭头的线组成
2 一个方块只代表一个函数或一个代码块,通常是函数,方块中可以写字,可以表达函数是属于哪个类或哪个实例等信息。
3 指向方块的线代表该函数的输入,背离方块的线代表函数的输出。
4 数据流动的时间轴遵守先从左到右,再从上到下的顺序。
5 每一对输入输出(输入在上,输出在下)加一个方块,表达了一次函数调用。
测试驱动的任务切分
按照模块的分析方法拆分成任务时比较复杂的话,我们可以按照测试的角度来切分成任务。这个思维的切换是TDD的核心。我们需要按照测试的视角来切分任务,从一个函数的实现视角转为一个函数的调用视角。
测试视角的优点:
1 封装复杂性,按照模块去拆分的时候,复杂性会变高,思考负担会加大。而按照测试的视角来切分,复杂性当然不会消失,但是被封装了,方便我们在分析的时候减少思考负担。
2 跳出盒子外来看盒子的视角。我们在画前面的图的时候,实际上是在我们要实现的这个程序内在看,完全没有使用者的视角,也就是所谓的在盒子内。当我们站在测试的视角看的时候,我们就跳出了盒子外,他更容易让我们发现哪里可能设计上有问题,比如设计出的接口是不是好用。
3 在TWs有一个观点:叫做任务不是步骤。当按步骤来考虑问题的时候,对怎么算做完这个问题的答案往往是模糊的(往往只落在行为上,而不是结果上)。只考虑函数实现的时候,也会有类似的问题,因为一个数据类型包含的情况太多了,想到某种类型的数据我们就会停止思考当前问题转而去想其他问题,于是我们很容易漏掉一些情况,以测试角度看待任务会让我们更容易看清楚我们的工作是不是真的做完了。
附 学习中遇到的专用词:
-
migration脚本
每一个migrate的类都是 ActiveRecord::Migration 的子类,每一个migrate都要重写两个方法 up 和 down。Migrations提供了一系列的方法来操作数据库,这些方法可以替代使用SQL来操作数据库。(总之,是与MySQL数据库有关的, 如何写migration ) -
ORM框架
目前数据库是关系型数据库,ORM 主要是把数据库中的关系数据映射为程序中的对象。
ORM框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有三种:Hibernate,iBATIS,EclipseLink。 -
Jersey(软件框架)
Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。它已经是一个产品级的 RESTful service 和 client 框架。与Struts类似,它同样可以和hibernate,spring框架整合。(是Java领域中开发REST式web服务的工具)
Jersey框架一:Jersey RESTful WebService框架简介 -
SICP
《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs, SICP)是一本关于计算机程序设计的总体性观念的基础教科书,由 MIT press 与 McGraw-Hill 共同出版营销。
书中使用程序设计语言 Lisp 的方言 Scheme 来解释计算机科学的核心概念,包括抽象(abstraction),递归(recursion),解释器(interpreters),以及元语言抽象(metalinguistic abstraction)。《计算机程序的构造和解释(SICP)》讨论的核心问题是什么? -
Rails
Rails框架首次提出是在2004年7月,它的研发者是26岁的丹麦人David Heinemeier Hansson。不同于已有复杂的Web 开发框架,Rails是一个更符合实际需要而且更高效的Web开发框架。Rails结合了PHP体系的优点(快速开发)和Java体系的优点(程序规整)。Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,Rails 提供纯Ruby的开发环境。发布网站时,只需要一个数据库和一个网络服务器即可。 -
强类型 弱类型
编程语言分为强类型(比如Java,C#,Scala)和弱类型(比如JavaScript,Ruby,Python)