项目为了进入一个产品,需要整个系统降低资源消耗。而因为原来系统并没有相应的应对方案,现在选择的方案是尽量使用原来的系统服务,进行资源降低以及组件裁剪。事实上并不是进行简单的裁剪就能完成交付的,还需要为了剪裁组件调整部分功能,并且同时还需要补充该产品价值需求。
现在交付管道遇到一些问题,表现为故障多、交付带宽不足、交付承诺有达不成、开发团队人力无法支撑需求等现象。
还有就是需要达到一个非常极致的低消耗,可能以各组件进行简单的缩减内存无法达成目的(之前产品一直注意进行资源消耗,所以可以通过简单方法可以缩减的资源并不大)。为了使这个产品的开发能够消除这些问题,做好产品交付,部门领导组织了这次工作坊。
对于能力之前的理解都是,是否可以做TDD、需求分析、业务能力、架构设计等等具体的能力项。但是这些能力能够解决问题是零散的,没有聚焦在一个完整的职业需要的技能上。 现在我转换了一下思路: 假设我现在离职了,需要换一家工作,那么我想些什么工作呢? 结合我现在的基础,我想做软件工程后中间一段的事情,包括:需求分析(偏向软件侧)、架构设计、软件设计、这样的事情。具体到实际可能的职位:
在这部分,假设我做为敏捷技术教练进入一个团队,辅助这个团队完成软件产品的改造和能力提升。按照时间顺序推演整个过程包括如下环节:
以上具体推演总结各个环节的实践经验,并且将每个环节进行详细描述,并通过实践经验进行串接。
下面这个例子中,要解决的是在执行时,可以灵活设置所有配置项。
而且这个配置项还有可能会持续变化和增长。
例子开发的是一个Go语言包,该包种有一个操作 Foo:
// 通过Option进行所有选项的设置,传入的选项是一个option类型的函数,这个函数可以设置一个指定的选项
// option类型是:type option func (*Foo)
// 代码如下:
func (f *Foo)Option(opts ...option) {
for _, opt := range opts {
opt(f) // 遍历执行传入的设置选项函数,这个函数的参数都是Foo对象本身,用于修改Foo对象的选项配置
}
}
// 下面是一个选项的函数实例,设置:
func Verbosity(v int) option {
return func(f *Foo){
f.verbosity = v
}
}
// 下面是调用实例, 选项设置并不需要修改Foo的代码:
foo.Option(pkg.Verbosity(3))
// ------------------------------------------
// 下面是在上面的基础上,在设置选项参数同时返回设置之前的初值:
type option func(*Foo) interface{}
func Verbosity(v int) option {
return func(f *Foo) interface{
prev := f.verbosity
f.verbosity = v
return prev
}
}
func(f *Foo)Option(opts ...option) (prev interface{}){
for _, opt := range opts {
prev = opt(f)
}
return prev
}
// 调用实例
preVerbosity := foo.Option(pkg.Verbosity(3))
foo.DoSomeThing()
foo.Option(pkg.Verbosity(preVerbosity.(int)))
// -----------------------------------------
// 上面的类型判断何有些笨茁,下面是优化
type option func(*Foo) option
func Verbosity(v int) option {
return func(f *Foo) option {
prev := f.verbosity
f.verbosity = v
return Verbosity(prev)
}
}
func(f *Foo)Option(opts ...option) (prev option){
for _, opt := range opts {
prev = opt(f)
}
return prev
}
// 调用实例
preVerbosity := foo.Option(pkg.Verbosity(3))
foo.DoSomeThing()
foo.Option(preVerbosity)
Beego是借助Go语言对于模块的import机制自动完成router(URL和controller的map)注册执行的。
Go语言模块的import机制如下图示例:
是先执行import模块的import,然后执行import模块的const申明,var申明,init()函数。
/* TODO: 补充参考一中的图 */
Begoo框架就是利用这个init自动执行的go语言特性:
根据Beego的router注册机制,我们可以发现在单元测试时只要import router模块就可以实现Beego框架中router的注册.
具体实施有两种方法:
第一种,使用httptest库进行测试。httptest有一个NewServer的函数,结合Beego提供的一个http的handle(beego.BeeApp.Handlers),
就可以启动这个fake server,然后使用http.(method)进行请求触发,见参考二。
第二种,直接使用Beego的serverHTTP,beego.BeeApp.Handlers.ServeHTTP(rsp, req)触发router服务。
这里的rep用httptest的NewRecorder()创建,req用httptest的NewRequest()创建。