程序员解决的问题,大多不是程序问题

软件行业里有一本名著叫《人月神话》,其中提到两个非常重要的概念:本质复杂度(Essential Complexity)和偶然复杂度(Accident Complexity)。本质复杂度就是解决一个问题时,无论怎么做都必须要做的事;偶然复杂度是因为选用的做事方法不当,而导致要多做的事。比如:你要做一个网站,网站的内容是你无论如何都要写的,这就是“本质复杂度”。如果你还在用汇编写一个网站,这类选错方法或工具而引发的问题就是“偶然复杂度”。作为一个在软件行业奋斗的程序员,我深刻意识到一个事实:大部分程序员忙碌解决的问题,都不是程序问题,而是由偶然复杂度导致的问题。只要选择了正确的做事方法,减少偶然复杂度带来的工作量,软件开发是可以有条不紊进行的。如何减少偶然复杂度引发的问题,让软件开发工作有序、高效地进行,这是我们希望通解决的问题。

思考框架

Where are we?(我们现在在哪?) Where are we going?(我们要到哪儿去?) How can we get there?(我们如何到达那里?)
这三个问题是帮我们确定:现状,目标,实现路径。如果一个人能够清晰地回答出这三个问题,通常意味着他对要做的事有着清晰的认识。这个框架虽然看似简单,但却非常有效,在我的职业生涯里,与很多人讨论不同的事时,都会用到这个思考框架的不同变体,而在这个专栏里,我也会用它来帮助回答“怎样高效工作、怎样做好软件”这件事。

四个思考原则:以终为始、任务分解、沟通反馈、自动化。

以终为始就是在工作的一开始就确定好自己的目标。我们需要看到的是真正的目标,而不是把别人交代给我们的工作当作目标。你可以看出这个原则是在帮助我们回答思考框架中,Where are we going?(我们要到哪儿去?)这个问题。

任务分解是将大目标拆分成一个一个可行的执行任务,工作分解得越细致,我们便越能更好地掌控工作,它是帮助我们回答思维框架中,How can we get there?(我们如何到达那里?)的问题。

沟通反馈是为了疏通与其他人交互的渠道。一方面,我们保证信息能够传达出去,减少因为理解偏差造成的工作疏漏;另一方面,也要保证我们能够准确接收外部信息,以免因为自我感觉良好,阻碍了进步。

自动化就是将繁琐的工作通过自动化的方式交给机器执行,这是我们程序员本职工作的一部分,我们擅长的是为其他人打造自动化的服务,但自己的工作却应用得不够,这也是我们工作中最值得优化的部分。

这四个原则互相配合,形成了一个对事情的衡量标准,在明确目标和完成目标的过程中,都可以尽量减少偶然复杂度。

总结

大多数人工作低效是由于工作中偶然复杂度太多造成的,只要能够更多地将注意力放到本质复杂度上,减少偶然复杂度造成的消耗,我们“真实”的工作效率自然会得到大幅度提升。而想要减少偶然复杂度的消耗,就要了解一些高效的工作方式和行业的最佳实践,而这一切是可以用统一的框架进行思考的。运用这个思考框架,我们需要问自己一些问题:
Where are we?(我们现在在哪?) Where are we going?(我们要到哪儿去?) How can we get there?(我们如何到达那里?)
为了把这个框架应用在我们程序员的工作中,我给了你四个思考原则:
以终为始,确定好真实目标;
任务分解,找到实施路径;
沟通反馈,解决与人打交道出现的问题;
自动化,解决与机器打交道出现的问题。

请记住:面对问题时,用思考框架问问自己,现状、目标和路径。