[Notes] Clean Agile

Hope is the project killer. Hope is what makes a software team mislead managers about their true progress.

The date was chosen for good business reasons, and those reasons still hold. So let’s try to add staff. Everyone knows we can go twice as fast by doubling the staff. Actually, this is exactly the opposite of the case. Brooks’ law states: Adding manpower to a late project makes it later.

Producing crap does not make you go faster. It makes you go slower. This is the lesson you learn after you’ve been a programmer for 20 or 30 years. There is no such thing as quick and dirty. Anything dirty is slow. The only way to go fast, is to go well.

We developers should celebrate change because that’s why we are here. Changing requirements is the name of the whole game. Those changes are the justification for our careers and our salaries. Our jobs depend on our ability to accept and engineer changing requirements and to make those changes relatively inexpensive.

Humans make things better with time. Painters improve their paintings, songwriters improve their songs, and homeowners improve their homes. The same should be true for software. The older a software system is, the better it should be.

Customers, users, and managers expect fearless competence. They expect that if you see something wrong or dirty, you will fix and clean it. They don’t expect you to allow problems to fester and grow; they expect you to stay on top of the code, keeping it as clean and clear as possible.

In short, we cannot agree to deliver fixed scopes on hard dates. Either the scopes or the dates must be soft. We represent that softness with probability curve. For example, we estimate that there is a 95% probability that we can get the first ten stories done by the date. A 50% chance that we can get the next five done by the date. And a 5% chance that the five after that might get done by the date.

Refactoring is never a story. Architecture is never a story. Code cleanup is never a story. A story is always something that the business values. Don’t worry, we will deal with refactoring, architecture, and cleanup—but not with stories.

After the midpoint, if all the acceptance tests are done, QA should be working on the tests for the next iteration. This is a bit speculative since the IPM hasn’t happened yet, but the stakeholders can offer guidance about the stories most likely to be chosen.

Remember, the only failing iteration is an iteration that fails to produce data.

Business analysts specify the happy paths. QA’s role is to write the unhappy paths.

These two disciplines, double-entry bookkeeping and TDD, are equivalent. They both serve the same function: to prevent errors in critically important documents where every symbol must be correct.

The only way you get good at using a debugger is by spending a lot of time debugging. Spending a lot of time debugging implies that there are always a lot of bugs. Test-Driven Developers are not skilled at operating the debugger because they simply don’t use a debugger that often; and when they do, it is typically for a very brief amount of time.

Test coverage is a team metric, not a management metric. Managers are unlikely to know what the metric actually means. Managers should not use this metric as a goal or a target. The team should use it solely to inform their testing strategy.

You cannot write a function that is hard to test. Since you are writing the test first, you will naturally design the function you are testing to be easy to test.

So again, the bottom line from my point of view is this: There is no such thing as Agile in the large. Agile was a necessary innovation for organizing small software teams. But once organized, those teams fit into the structure that large organizations have used for millennia.

[Notes] 高绩效教练

教练是一种源于教练气质的修炼方式——它是一种坚定的信念,相信自己和他人的能力、智慧和潜能,使教练能够专注于他人的优势、解决方案和未来的成功,而不是弱点、问题或过去的表现。

我们并不是说不需要专家的输入,但大多不太好的教练会倾向于过度使用专家知识,并因此减少了他作为教练的价值,因为每一次输入都是在减少教练对象的责任感。

许多低水平的教练常用引导性问题,这表明他们并不相信自己在做的事情。而教练对象会迅速意识到这一点,从而导致其对教练的信任度降低。教练宁可给教练对象直接建议,也不要试图操控他的前进方向。暗含批评的问题也同样应该避免,比如“你到底为什么要这样做?”

一个很少失败的有价值的现状问题是“到目前为止你已经采取了哪些行动?”以及“那个行动的结果怎样?”人们经常会想问题想得很久,但仅仅当被问及他们做了什么的时候才意识到他们实际没有采取任何行动。