编程 || 如何沟通
这是系列文章第五篇。
作为程序员的我们,往往都非常在意技术。但是我也时常考虑技术是什么。如果看了我之前的一些文章,那么你也许已经有了些微不同的感悟。
我理解的技术是解决技术领域问题的能力。那么这里有两个要素,一是解决问题,而是技术知识。
解决问题的能力是极其通用的,我们看到侦探说的破案,医生治病,公司做生意,都是在解决问题。
解决问题有一套流程,定义问题,澄清问题,制定解决方案,执行解决方案,验证,调整,复盘。这是一整套科学的过程。如果学了非常多具体的知识,却不知道解决问题,那么也只会是在低水平徘徊。
光有解决问题的能力还不够,还是需要具体的知识。比如医生就要有完整的医学知识体系、病人的检查检验信息、病历信息等,有了这些,医生才可以给出治疗方案。
所以,解决问题的能力,具体的技术知识。二者缺一不可。其中第一项是可以迁移在各个领域,所以我们也能看到技术出身的管理者们,往往能力也很强。而第二项就来自于多年的积累,长年份的技术人,同样也是不可多得。
那么和沟通是什么关系?无论是解决问题的能力,或者是具体知识的获得,都离不开沟通。你要通过沟通去获得信息,通过沟通去组织大家按照你所制定的解决方案来执行。可以说沟通就是如何高效获得信息,解决问题的核心能力。
对于技术新人来说,我们常会在写代码的时候遇到问题,遇到问题之后就要请教,那么此时,你就需要将你完整的上下文梳理给那位“老师”,他才好依据你的问题给出好的解答。这是技术问题的沟通,如果是更加复杂的项目问题,恐怕这时候就没有人能给你好的答案了。更多时候是借鉴,因为项目中的信息实在太多,最终的方案大概率就是权衡,不可能像一些技术bug一样,通了就通了。
那么怎样才是一个好的沟通者呢?对于一线技术人员来说,我觉得这个答案非常简明。就是,你具备能客观讲清楚问题的能力。当然,这个容易的答案,可能也不是每个人都做到。
首先,你要把你程序的业务背景讲明白。其次,你要把技术环境讲清楚,比如是windows还是linux,本地还是测试,哪个版本的语言或框架,这些都是你需要交代的信息。随后你还要把你为此付出的努力讲明白,比如你查过了csdn,查过了Stack Overflow,自己尝试过了哪些方法,等等。当然,你还需要把你的目标告诉对方,比如你要消灭这个bug跑通程序就好,还是需要一个更优良的设计。所以,光是把问题描述清楚,就是一个结构化的能力。
已经不那么简单了,但是,为什么说技术人员之间的沟通很容易。因为大部分时候,技术和技术之间交流都比较平和,大家思维在同一个层面。而和业务的沟通却不是,双方的思维方式可能有80%是不一样的。80%不一样的情况下,你们双方会不断地互相否定。如果是理性人的互相否定,那么一定会最终形成共识。但是但凡有一方不理性,那么你们必然会走向争执。这时候,你就会发现影响你沟通的另一个重要因素——情绪。情绪会带来厌恶,带来恨意,最终团队的凝聚力也会消散。于是项目就不可能做好。
我做技术负责人时,真的不是在技术层面卡壳,实际上做项目多年后,我认为大部分项目失败的原因都不是来自技术。有一半在于前期的顶层规划,一半在于执行。而执行之中,产品运营技术的合作,又是最重要的。业务同学与技术的沟通,往往会非常困难。双方的思维不是一个层面,如果不是理性对理性的沟通,那就会变成菜场的辩论和讨价还价。实际上对技术来说,我们只是想客观表达而已。
那么,如果,业务同学一定是不理性的怎么办。要改变别人是非常难的事,所以最好的方法还是改变自己。如果你是那个最想做成一件事的人,你就会获得比那些啥也不想做就直接躺平的人更高的薪资,并且,你也会在这个过程成为一个越来越能成事的人。并且,你也应该在以后的生涯中去不断找出这些和你一样努力的人,去做更大的事。
你要依据对方的想法去沟通,观察他需要什么,如何去打动他,如何去推动他。唯有这样,才可以让你做的事更好的完成。当然,我们一定要做有价值的事,让你的目标,和你的计划相匹配。根本上,我不在乎与我同行的人是一个聪明人。我希望他是一个正派的人,公正的人,善良的人。一切的能力和知识,都可以去学习。是一个好人,比他是个聪明人,重要的多得多得多。