社区还是公司里,经常会有人讨论,A实践比B实践好。比如下面这样的讨论。
A:我用 Go+Go-xorm+Grpc+Gorouting 搭建框架,开发效率非常高,真的超好我跟你讲。balabala
B:我用 Spring
A:我跟你讲,SVN 的代码一致性最好,所有人的代码都是一样的,真的超好我跟你讲。balabala
B:我用 Git
A:我跟你讲,我用 JMI 协议和Dubbo协议,用得超舒服我跟你讲。balabala
B:我用 Grpc
于是就引发了一个问题,究竟某一些技术在某一些场景某些团队里面,孰优孰劣,经常是争得死去活来。孰优孰劣,真的那么重要吗?在一个集体里面,永远使用最佳的实践,与大家尽量使用一个统一但是可能没那么好的实践,哪个更有利于团队?
我们都知道技术栈统一的重要性,如果一些人总是急着自己造轮子,每个人都搞出一套自以为是最佳实践的套路,这样对于团队来说是好是坏?我觉得某种程度上来说,是一件好事,可以让团队里的人提高自己的见识,知道在自己的做法之外其实还有其他做法,也在实现着一样的目标。但是如果团队的其他人并不认可这种新的做法,那又怎么办呢?
我的答案是,在大规模协作里,统一比优劣重要。
我们都知道 HTTP 协议存在着大量的问题,比如显而易见的安全问题。
通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改
如果我创造了一种新协议,叫 dajiao.HTTP 协议,在 http 的基础上解决了上面的问题,可以说我的协议比 http 更加优秀,全世界人民,都应该使用这个协议吗?显然是不可能的。你还觉得优劣比统一重要吗?
众所周知,HTTP 协议被诟病的还有 head 很重的问题,如果在超大规模集群里,我需要压缩每个请求的量,我自己创造了一种 mini.dajiao.http,整个请求的网络传输量只有 HTTP 的 10%,可以说我的协议比 HTTP 更加优秀,大家都用我这个协议吗?显然,在一定程度的团队内是可行的,但是要推广到全世界,抱歉,你还得付出比你预想要更加巨大的代价。
还是回到 mini.dajiao.http 的问题,在一定程度的团队内,在工具不完善的情况下,所有人跟你的系统交互,都要理解你第一个字节代表什么,第二个字节代表什么,要背诵下来,每次对接都要小心翼翼,对接一个接口可能需要花掉2个工程师10天的工作。在这个场景下,你还觉得你的协议比较好使吗?
我理解每一种方案都有它适应的地方,单纯讨论孰优孰劣,意义其实仅仅在于学术讨论阶段。到了大规模协作实战层面,谁能把一种方案做到大规模统一,就算它比其他方案要差一点点,必然是做了某些 trade-off,只要是统一的,就是好的。
因为毕竟,只要统一了,就可以投入更多更多的精力,对它进行重点优化了,会出现很多的周边工具,出现很多的配套设施,出现更加完善的文档,出现更加完善的兼容性设计。到最后,未必比你以为的好方案,表现更差。
一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝。扁担的设计就是一个人一组效率最高,标准做法就是一个人挑两桶水,非要来个人说,两个人挑那就是 1/2,一百个人挑每个人就是 1/100,更省力了,必然更好。
你品,你细品。