读《与熊共舞》

《与熊共舞》的重点在于风险管理,从风险的定义,讲到如何发现风险并管理风险,再阐述工具、如何量化等等,结构非常紧凑,例证很多,很有条理,读起来很流畅。熊节的翻译真不是盖的,一级棒!正如简体中文版上封面上所写,它确实算得上和《人件》、《人月神话》等并驾的好书。

在组织或团队中,当你发现风险,你有勇气说出来吗?也许会,也许不会,但请必须学会。风险具现的后果是对项目、组织,甚至社会造成很大的影响,想想航天飞机失事的事故吧。软件开发工程师不能简单的用“加班”做为“风险缓解”手段,有时再怎么加班也无济于事。“职业”的做法就是报告风险,无论项目处在什么阶段。

对于团队的Lead更有挑战的是,要习惯用风险图向自己的老板汇报,而不是拍胸脯说“在某某日这个项目一定做完“。在讲这话时,真的那么有底气吗?需求的不确定,估算的不确定,技术难点的不确定,代码遗留问题的不确定,人员的不确定等等,对于开发都是风险,而且常常发生的过程中。对于开发团队来说,对控制范围之内的风险最好的缓解就是平时多下功夫。和产品工程师做充分的需求分析与确认可以降低需求方面的不确定,代码全员所有会降低估算的不确定,时常的代码重构会降低遗留问题,积极培训可以降低技术风险等。当然这些都是成本、时间、人才,有看的见的,也有看不见的,但对团队和组织,这些活动都非常重要,特别在关键时刻。风险总是存在,只是可大可小。对于无法控制的风险,如需求变化的风险,对R&D,那应该属于”别人的风险“,自己是无法避免。团队还要有自己的风险仓库,项目做得多了,就从慢慢从中受益。

开发的方式也很重要。如使用增量式就可以减少风险,其实很好理解,把一个项目拆成若干个小的单元,范围小了,反馈快了,当然不确定就少了。只是能不能用就难说了,有时不在开发方,很多用户也不一定能接受。

书里提到了很多工具和方法也挺有意思,如”灾难头脑风暴“,用噩梦、水晶球等富有启发性的活动帮助团队发现风险;Riskology的Excel开上去就非常强大,需要的时候不妨一试。

总之,非常推荐大家读一读这本书!

最后附上我做的脑图。

与熊共舞

 

 

初识Scala

开门见山,Scala是真心的复杂、难学,但学着上瘾。因为它有太多吸引人的特性,超传统Java好几条街,即使Java 8也赶不上。(一点题外话,现在Java语言本身的特性,甚至连C++1x的也赶不上,发展的太慢,没有创新)。

简单说说有哪些有趣的特性。

强类型语言

这算不上什么特性,只是某种理念,但我觉得非常重要。类型安全的语言让人写起来的放心,日后也更容易维护。

函数对象

Scala本身是一门FP语言,函数的地位是第一位,非常简单就可定义函数,且函数可以做为对象传递给其他函数或由其他函数生成,非常方便,不再需要提前定义接口。

相当强大的灵活性吧。这个例子还展示了一些特性

  • 函数的参数可以有默认参数,再不用多个函数重载版本
  • 使用type定义类型的别名,很像C++11里的using

Match Expression

首先把它理解成表达式,不是简单的流程控制。这个特性比switch..case强大太多了。

这部分的语法还真是挺复杂的,有兴趣的找找Tutorial学习一下,不在这里一一展示了。

Objects, Case Classes, Traits

面向对象方面,除了传统的Java特性之外,还新添加了几个新的成员。

  • Object就是JVM上的一种单例实现,Lazy initialization。
  • Case Class可以看成一种语法糖,可以生成Instantiable的类,并自动生成一些常用的函数,如apply(), copy(), equals()等。
  • Trait则是为多继承准备的。从OO的角度看,多继承是完全合情合理的,只是实现上会有很多问题,所以设计从语言层面去掉了这种可能。

此外Scala还有很多的特性和超多的语法糖,以后慢慢再续上。

在单元测试中使用PowerMockito隔离static native method

在单元测试中,如果被测类使用了某些static native接口,会使测试不太好写,因为Native API需要装载某使用Native库。我们可以使用强大的PowerMockito对这些接口进行隔离。

下面是个小例子。

Class with Native Static Method

Class which consumes the native static methods

Unit Test

Mock了Static Native方法,并做了Verify.

这只是个简单的例子,实际运用中Native方法往往比较复杂。在写单元测试时应该明确被测的对象,把不必要的接口Mock起来,会使测试变得非常清晰。

PS: 此例的Maven dependencies

  • junit:junit:4.8.1
  • org.powermock:powermock-mockito-release-full:1.6.2