很多程序员不善于沟通,尤其当他全身心投入工作后,这会带来很多问题,因为除了自己给自己做软件,很少有项目是一个人能完成的,软件研发不仅仅是程序员的事,需求、设计、进度、风险,还有用户,各方面都需要沟通。

软件研发过程中的沟通和我们日常的语言交流有所区别,日常交流可以通过表情、手势、动作来辅助沟,传达特殊含义,表达语言所难以描述的信息。软件研发过程中,程序员常常是面对着屏幕,一边看着代码一边与别人沟通,这时候的沟通尤其需要精准,所以很多程序员之间互相沟通时喜欢直接讲代码,否则脱离了代码,就说不清楚他在干嘛,也难听懂别人要他干嘛,行外人觉得这就是程序员的特点,这是个悲剧,程序员不应该这样的。

我把软件研发中的沟通分为两个过程,描述事物和提出问题。

软件项目因为复杂,所以才需要组建研发团队,不复杂就不用团队了嘛,假如所有人都会写程序,自己做软件给自己用,客户都是自己,什么沟通都不需要了,什么事都没有了,本文也不用写了。

描述事物的过程中,我们把沟通的双方称为描述方与接收方。对于复杂的事物,我们很难通过只言片语就能将它完整描述出来,不只是软件,任何复杂事物都是这样。比如我们给别人介绍大象,在需求文档上可能会按几步描述:

  1. 它的身体非常巨大
  2. 它有很粗壮的腿
  3. 牙齿很长
  4. 耳朵像扇子
  5. 有长长的鼻子

大多数人看到这几点就可以基本勾勒出大象的模样了,但是很难一开始就得出这个结论,单看身体巨大,鲸鱼最大了;加上粗壮的腿,恐龙算不算。甚至有些思路不同寻常的人看到第二点还会产生疑惑,这个东西是不是只有一条腿呢,那是什么东西呢?纠结这样的细节反而会影响后续的理解,导致思维混乱,偏差越来越远。这其中肯定有描述方法的问题,但最关键的还是需要接受方的理解能力。因为沟通需要大量的时间,这是沟通成本,复杂事物的描述,我们应当先从宏观的角度用少量的语言描述明显的特证,然后才是再针对各部分做细节的描述。接收方也是一样,在一步一步接受信息的过程中,肯定会存在大量的疑惑,这个时候要做的是,把这些描述信息都记下来,不要试图用少量的信息去猜测,没有这个必要,毕竟研发过程中沟通的目的就是为了描述事物,传递思想,而不是为了欺骗,打哑谜。如果接收方根据描述的信息无法得出结论,那就应该让描述方继续描述说明。说白了,听不懂就要问,打破砂锅问到底,千万不要去猜,猜测和推断是两马事。尤其需求和设计,不明白一定要问,领导没讲明白,那是领导的问题,该问就得问。

因此抛开描述方的口才、方法的因素,沟通过程中如何准确地描述事物,关键在于接受方的反馈。接受方可以通过侧面描述他的理解来确认沟通是否准确,或者提出进一步的问题来佐证事物。

开启新项目时经常遇到上述问题,尤其是新员工入职的时候,面对从来没见过的需求,往往茫然不知所措,这个时候不要慌张,一遍听不懂就问第二遍,反复问,不要轻言放弃。

如何精准地提出问题,也是一门学问。沟通过程中,我们把提出问题的双方称为提问方和应答方。首先提问方需要准确的描述清楚问题,应答方应当仔细倾听,如果不理解对方的问题,同样不要能去猜测问题。软件开发时,程序员们都很忙,应答方自认为自己了解问题,急于打断提问者,然后按照自己的理解去回答,这个时候很容易答非所问,从而浪费很多时间,还容易产生争执。应答方听清楚问题后,做出解答,这时候就是上文提到的“描述事物”的过程了。如果应答方不清楚答案,无法回答该问题,那也不能去猜测答案,应当明确表达“不知道”,尽量避免使用“我认为”、“我感觉”这样的表述,这会让提问者更加困惑,甚至误入歧途,担误更多时间。说白了就是,不要不懂装懂,否则别人打破沙锅问到底,你就露陷儿了。当双方可以展开讨论,讨论其实就是互相提出问题和描述问题的过程。

研发过程中的沟通就是提出问题与描述事物的过程,两者之间是“蛋生鸡,鸡生蛋”的关系,相铺相成。沟通需要心平气和,集中精力,这是对对方的尊重,别人问你问题,你下次也可能会向别人请教。精准沟通的表现就在于是否准确的达到了沟通的目标,语言的准确是一方面,团队长期磨合,心有灵犀,沟通也不一定要精确的语言,因此精准沟通的关键不在于口才和语言技巧。精准沟通一定是可以做到的,关键在于你达成沟通目标的决心,除非对方故意不想表达清楚,要相信团队成员是不会故意为难你的。