第二章 谈实践与认知
一、突破程序员思维
过去我曾一直认为程序员是依靠他们的技术在编程,也是因为技术使得程序员的水平有高低之分。但是,随着我写代码的时间越来越长,接触到的程序员越来越多,我渐渐发现程序员们其实是依靠他们所特有的程序员思维在进行编程,而他们中的佼佼者正是那些有着更高思维成熟度的优秀程序员们。
1.什么是程序员思维
那么,什么是程序员思维呢?我曾读到过一些文章,试图给它下一个明确的定义,比如,具备抽象和逻辑思维的能力,拥有面向对象编程和设计的能力,等等。我对这些所谓的定义有些不以为然,因为,我所体会的程序员思维更像是一种感觉,它是由常人的思维+编程思维,在长期相互作用下产生的一种思维模式。它能够帮助程序员快速找到以程序方式解决现实问题的最优解。
程序员们又是如何获得这种思维的呢?我想说,从你学习编程并写下你的第一个Hello World程序的时候,程序员思维就已不知不觉地开始建立了,并随着你不断深入地学习与实践,它也变得越来越完善和成熟。下面就是我认为对于提升程序员思维有所帮助的几点建议,虽然不做展开,但相信每个程序员都会认同吧:
•长期不间断地编程实践。
•持续地学习与借鉴(参考)。
•学会反思,并像专家一样思考。
2.为什么要突破程序员思维
既然程序员思维对程序员来说如此重要,那么我们又为什么要突破它呢?在我看来,主要有以下一些原因:
•随着技术的进步和专业领域的融合,程序员的职能正在不断扩展,你一定也听到过DevOps、全栈工程师、增长黑客这些词吧,新一代的程序员不仅需要具备很强的编程能力,同时还需要具备从设计、运营、测试等各种不同角度去进行分析和判断的能力。
•从程序员的发展角度来说,当你从程序员转变为一名高级程序员、架构师、系统分析师、项目经理、技术专家,甚至CTO的时候,需要你突破程序员思维,从更人性化的角度去识别和解决问题。
•突破程序员思维对你的生活也会有所帮助。有很多过于技术的程序员,随着编程时间的增加,他们会越来越不善与人沟通,甚至排斥与人交流。他们也往往无法扮演好自己在生活中的角色。
程序员思维对程序员来说是一把双刃剑,它既能帮助程序员写出优秀的代码,去解决一个又一个复杂的问题,但有时候它也会阻碍程序员们的发展,成为进阶路上过不去的一道坎。
3.如何突破程序员思维
在成为架构师及开始从事IT管理之前,我也是一个完全用程序员思维去进行思考的人。但我通过一些方法逐渐突破了程序员思维,相信这些方法也能给你以启发。
(1)透过技术发现问题的本质
我时常会组织开发团队做一些技术问题的讨论,但当一个问题被抛出时,比如,用户时常会在某段时间内重复地单击某一个功能,导致系统压力的上升。团队的大部分程序员都会很快给出他们的解决方案,比如,增加流量阈的控制或在用户会话中加入某些Token来防止用户的频繁重复提交等。但几乎很少有程序员会问,用户为什么会在短时间内频繁单击这个功能呢?是啊,解决问题的关键,往往不是如何通过技术手段禁止用户这样做,而是理解用户这样操作的原因,从而从根本上找出解决的办法。
多年的开发工作,使程序员们不自觉地首先想到如何用技术手段去解决问题,然而,真正优秀的程序员一定善于透过技术发现问题的本质。我想这就是我们突破程序员思维的第一步,也是最容易实现的一步吧。说到方法,我最常使用的是反复地追问一件事的原因,比如刚才这个例子,最终我们找到的原因只是系统没有给用户一个友好的提示,导致用户错误地认为系统并没有处理他的请求,而尝试反复点击。因此,我们的解决方案也与之前团队程序员们所提出的完全不同,只需花上几分钟,给系统加上一句友好的提示就行了。
(2)像专家一样给出意见
在很多场合下,比如,与用户沟通需求、与产品经理沟通方案时,程序员总是处于比较弱势的一方。他们只是被动地去接受这些需求和方案,然后回去将它们转换为代码的实现。
而那些真正优秀的程序员在与用户进行沟通时,总是试图去理解用户所提出需求背后的真正原因,因为他们知道用户往往会按照自己对问题的理解去给出他们认为正确的方案,而很多情况下,他们所给出的并不是正确或是最优的。那些优秀的程序员会站在用户的角度,认清问题,并像专家一样给出他们认为最优的方案。
如果你对一个问题有充分的理解,并具有足够的信心,那么你就应该站出来像专家一样给出自己的意见,这会让你显得与众不同。如果你每次提出的意见都被证明是正确的,那么不需要多久,你也会被大家认同为是一位真正的专家了。
(3)杂学并从中获得不同的视角
要做到看清问题的本质并像专家一样给出意见,其实并不简单,这不仅需要你具备极强的技术功底,更需要你对问题所涉及的相关领域有足够的认识。你必须通过大量地学习编程之外的各种知识来完善自己的知识体系,并从中获得不同的视角。
我经常听到程序员会抱怨用户提的需求质量有多差,设计师做的设计根本无法实现,而产品经理更是被很多程序员视为一文不值,等等。这其中一定存在一些客观的原因,但程序员无法跳出程序员思维,站在用户、设计师、产品经理的角度看待问题,也是一个重要的原因。
我在自学设计之后,获得的不仅仅是一项技能,对我帮助更大的是使自己能够从一名设计师的角度来看待问题,这反过来也促进了我的编程能力的提升。同样,你也可以学习某个行业的知识,即使你无法成为这个领域的业务专家,但这些知识能够帮助你更好地理解用户的需求,从而得到更优秀的技术解决方案。这也是为什么我总是鼓励身边的程序员们去尝试学习除编程之外不同东西的原因。
(4)找回创造力
虽然编程是一项脑力活动,但程序员们可能都知道,在大多数情况下这并不需要我们发挥创造力。也就是说,我们在按部就班地完成那些开发工作的同时,也正在失去我们的创造力。
创造性地解决问题是优秀程序员所需要具备的能力,但我恰恰发现很多具有多年编程经验的程序员,他们的思维却好像受到了禁锢似的,只能凭着那些已经有些过时的经验去给出他们的方案,而很难创造性地去解决问题。
其实,有很多方法都能让我们找回创造力,关键是你是否愿意坚持那样去做。而我的方法也很简单,每天进行阅读,每周写一篇博客记录自己想到的东西。另外,我也有一本小本子用来记录那些转瞬即逝的想法,虽然有些看起来是那么不切实际,但我都会把它们记录下来,没事的时候就去翻翻,这个过程中我可能会得到一些不错又可行的新点子,然后,我再尝试着花些时间把它做出来。虽然,它们中的大部分都不会产生什么实际价值,但我知道下一个优秀的创意或想法,可能就来自于它们。
突破程序员思维并不是要摒弃它,恰恰相反,突破正是建立在成熟的程序员思维之上的,这将帮助程序员以更全面的视角去思考和解决问题,同时也能为程序员这个职业创造出更多可能。