Files
CategoryResourceRepost/极客时间专栏/职场求生攻略/加餐/28 | 沟通中的冲突:什么时候应该妥协,什么时候应该坚持?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

99 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="28 | 沟通中的冲突:什么时候应该妥协,什么时候应该坚持?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ce/6c/ce518112b1edb7fdb79c16e108241b6c.mp3"></audio>
你好,我是臧萌。本专栏进入到加餐模块啦,第一篇加餐,我们又来谈沟通了。
按照我们之前谈沟通的顺序,先是从工作的基本素质上,我们要重视沟通,主动沟通。然后从职场情商的角度,我们要重视沟通的方式方法,重视沟通的效果,尊重沟通的对象。从这两个方面来看的话,沟通还是正面与合作为主。但是我们在日常沟通里,面对的远不止这些和谐画面。
很多时候,我们还会遇到很多观念观点的冲突。如果冲突可以通过短时间的讨论达成一致,那就不能算有冲突。当然,也有可能大家心里的想法都不是很明晰,讨论下来也没有一个明确的结果,这也不能算冲突。我们这里说的冲突,是双方或者多方的想法都非常明确,然后经过反反复复的讨论,大家的想法也无法达成一致的情况。
接下来在这一节里,我们就从处理冲突的角度来聊聊沟通。
## 有些冲突,程序员要主动退到一边
发生冲突的一个很大的原因,是有直接的利益冲突。比如谈地盘、谈系统归属、谈责任等等。这些情况是经理等管理者的主要战场,我们程序员打好辅助就可以,一般不需要主动露面谈。如果遇到这些相关的讨论找上自己,可以先简单应付,但是真正到了讨论核心问题的时候,一定要记得把自己的经理拉进来。
需要强调的一个点,千万不要做超出自己权利范围的承诺。大白话就是,自己说了不算的话,不要跟自己组之外的人说。
一般来说,大家都是会找对等的人来交流。比如说,如果这个会议上有对方的经理,那么自己组的经理也是要出面的。这不是排场面子的原因,而是对等的人,才能聊得下去,把事情敲定。举个简单的例子,一个国家的总统,和另一个国家的经济部长,是没办法聊的,因为很多事情经济部长无法拍板。
## 如何应对沟通中的冲突
属于我们程序员相关的冲突和争论,一般都是与技术和架构相关的。那么我们程序员应该如何应对沟通中冲突呢?我下面举几个例子,我们一块来看一下。
### 代码方面的个人偏好
每个人都有自己的偏好比如说有人喜欢用Lambda有人喜欢用for循环有人喜欢这样去命名方法和变量有人喜欢另外一种风格。从我个人的建议来说谁负责写code谁就有权利决定用自己喜欢的风格写代码。只要功能可以完成代码足够鲁棒那外人就没权利多加干涉。毕竟我们不是流水线上的工人不可能生产出一样的代码。
当然不是说代码就没有标准。就Java来说Java编译器有warning还有Sonar、PMD、Findbugs、Checkstyle等工具。这些工具里有很多检查代码的规则这些都是业内实际的标准和共识。从这个角度来说你没必要用自己的个人偏好去指点别人。当然如果被人指点你也可以拿这个反击。毕竟行业内的标准都没说什么你有什么资格说我
### 接口的设计
接口的设计其实非常考验一个人的能力。它比具体的实现代码更抽象,但是比架构设计更具体,是连接两者的桥梁。
简单来说接口就是程序世界的标准。标准的规定有一个公认的原则就是要足够的包容。比如Iterator、Collection和List作为参数兼容性逐渐降低。当然这个例子没什么大问题大不了调用方自己转一下。但是如果用了File做参数而实际上只需要InputStream读取数据那调用方如果没有把数据存在File里就不好弄了。
从参数的角度说开去,接口就是这样一个越包容,越优秀的东西。如何能用最少的约束,把事情描述清楚,就是接口的一大目的。面临接口设计的争论时,大家可以就这个点展开,各抒己见。最终得出结论,也不是难事儿。
### 系统架构
系统架构上的争论,则更是因人而异。因为做系统架构的过程,其实是每个人对一件事情理解和建模的过程。就好像扔给两个人一堆积木,让他们每人搭一个大楼,肯定俩人搭建的大楼不会一样。即使你指出方向,比如一个商业摩天大楼,外表也会不一样。即便是再规定得详细一点,比如要有广场、要有裙楼等等,细节部分也不会一样。那就更别说软件架构设计了,俩人架构的系统肯定不一样。
如果在软件架构上有冲突,应该怎么处理呢?软件架构结果的冲突只是表象。根源是大家对问题的理解,对系统如何应对问题的方式理解不同。这时候,如果只是纠结于架构的不同,是无法得出一个结论的。所以,为了解决冲突,应该大家都回退一步,先从问题入手,让大家对问题的理解能够统一,对解决问题的方式能够统一。这样,即使架构上有所不同,也是容易解决的。
当然,我在前面也提到过:令出多门,兵家大忌。如果就是不能统一呢?这种情况下,就得有一个总的架构师,能够维护整体解决方案的统一性,避免因为彼此的认识不同,导致系统无法统一。其实很多时候,系统架构很难说谁对谁错。但是如果各个子系统的风格不统一,那大概率就会有问题。
### 功能现在就要
很多时候,需求方会提出很多现在架构下不支持的功能。这时候我们就有两个选择,一个以快糙猛的方式,放弃遵循现在的架构,把功能怼出来。一个呢,是从长计议,深入理解需求、升级架构,然后支持新的功能。
我来打个比方,系统架构就像是一张交通图。普通的需求就像是走高架,不需要绕路,没有红绿灯,可以用最短的时间到达。特殊的需求就像是走地面,甚至是走单行道,需要走走停停,甚至需要绕路,虽然费点劲,但是也能到,而且不和架构冲突。
架构不支持的需求,则是交通图上根本没有路的情况,就好比需要跨过一条河,但是河上并没有桥。这时候,第一种选择就是硬怼,比如放下车、找条船、甚至直接游泳过去。
第二种选择是先深入了解用户过河的需求,包括过河干什么、频次是多少、运载量是多少、能够接受的交通时间是多少等等。然后再根据需要来选择是修建码头、修建跨河大桥、还是修建隧道。
看似第一种选择是客户至上。但其实很多时候第一种选择是短视的表现。一方面你快糙猛做出来的东西很可能无法完成用户接下来的需求。比如说随着需求的发展用户要求一天来回1000趟每趟不能超过3分钟游泳自然不可能。坐船的话你去哪里找这么多的快船呢换句话说违背现有架构快糙猛地实现客户的需求是对客户的溺爱而非真的的客户至上。
另一方面,没有深入理解用户的需求,其实会错过和客户一起深入理解系统和业务的机会。系统架构不支持,确实是系统本身的限制。但是如何让系统更完美呢?就是你要通过这样的机会,深入思索业务模型的限制,通过升级系统来让系统建模更加通用,可以应对客户以后的新需求。
## 方式方法可以妥协,原则和目标必须坚持
上面的几个例子中一个共性是大家先后退寻找共识common ground然后以此为基础把事情向前推进。这里我总结一下上面几个例子里所说的共识。
1. 代码偏好findbugs等业内标准。
1. 接口设计:接口设计应该包容。
1. 系统架构:大家对问题的理解要统一。
1. 新功能:理解新需求,升级架构,以支持新功能。
回到我们标题上提出的问题,我们在交流中遇到冲突时,什么时候应该妥协,什么时候应该坚持呢?这里我给出一个自己的标准,那就是做事情的方式方法可以妥协,但是目标本身必须坚持。
对比上面的四个例子你就能发现,所谓的标准,越来越模糊。什么是包容、什么是对问题的理解、什么又是新功能的本质,越来越没有绝对的正确。每个人,在自己不同的阶段,都会有不同的理解,更不用说在不同的人之间。
这就带来一个实际的问题,就是冲突的情况不可避免。这时候我们程序员千万不要怕冲突,只要你是冲着做事情去,而不是冲着搞事情去,就一定要将自己心中的疑惑说出来。
说出来的好处,首先是可以互相切磋,提升彼此的认识。正所谓不打不相识,很多时候大家的认识都不够全面,通过冲突的方式,可以让彼此都拓展自己的认识。
其次,要说出来可以逼迫自己深入思考。想和别人刚,自己得先把自己的想法理清楚。很多时候,自己的想法是想当然的,当这种想当然和别人发生冲突的时候,就需要自己深入思考,或者找出自己的理由,或者放弃自己的成见,接受别人的观点。无论是哪种,对自己来说都是成长。
最后,有疑惑就说出来,可以让彼此合作更默契。我们经常说一个团队有默契,其实默契就是这样磨合出来的。不磨合,只是表面的迎合,并不能让一个团队里的成员配合无间。
## 总结
我想特别强调的一点是,程序员不要一味地逃避冲突。你如果用妥协来避免冲突,这绝对不能很好地解决问题。当然,我不是说要做一个“杠精”,而是要在做事情的基础上,充分表达自己的观点和认识。
如果自己明知道别人的做法有问题,但是你选择不表达自己的看法,长久下来,只会让别人觉得你没想法。和自己有关的东西,更要在自己不认同的时候发声。如果你只是一味地委屈自己,成全别人,其实只会让人觉得你软弱。
很多程序员不喜欢交流,不喜欢拒绝别人,更不要说和人争论、冲突。说实话,我也非常不喜欢和人冲突。但是正是自己这种避免冲突的倾向,让我吃了不少亏。举个例子,我之前觉得架构设计有问题,我也不会说什么,觉得只要能做出来,实现功能就可以。后来发现,这些架构设计的问题,会慢慢变成坑,变成阻碍一个组发展的绊脚石。
现在我只要在工作中遇到觉得有问题的事情,马上就会要求展开细聊。如果其他人时间不够,就另外找时间聊。我从原来逃避冲突的人,变成了主动制造冲突的人。
根据我的观察,这种冲突,往往都能够让事情得到更好的结果。如果一味地为了避免冲突而保持缄默,其实长期来看,是无法融入到一个团体的。当然,如果一个团体里经常就相同的事情冲突来冲突去,那很可能说明大家就是无法磨合得很好。在这种情况下,如果你不打算离开这个团体,在面对冲突的时候千万别打退堂鼓。
<img src="https://static001.geekbang.org/resource/image/33/ab/331fd86e302702ee867c195564abb7ab.png" alt="">
## 思考题
你在工作中,有遇到过哪些让你记忆深刻的冲突?这些冲突是以双方都满意结束,还是以双方不欢而散结束呢?你有哪些处理冲突的经验和教训?
好了,今天的课到这里就结束了。欢迎你在评论区和我交流。也欢迎把这篇文章分享给你的朋友或者同事,一起交流一下。