3

技术选型的一点个人思考

 2 years ago
source link: https://www.cnblogs.com/eryuan/p/15223921.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

技术选型的一点个人思考

这个题目有点大。工作也有些年头,从开始入行的被动接受,什么流行就学什么;到有一些想法,会去思考为什么使用这种技术;再到主动去学习一些前沿框架。从开始的不理解,事不关已高高挂起,不在其位不谋其政;到也成为了团队中的中坚力量,去据理力争应该使用某些技术,把觉得好的技术安利给同事,试图引入到团队中;有成功有失败;也有迫于种种因素使用一些所谓“过时的技术”,有时候有在想,这种“被迫”或"过时"是“为了技术而技术”吗?


本人从事的是JAVA后端开发,从业七八年,时间不长,但也经历了不少。从需要使用juqery,easyui等各种前端技术,到前后端分离成为主流;
从一开始的hibernate+structs/structs2框架大行其道,到后来几乎消声匿迹;
从最初的redis/memcache两者之间还能一较长短,到redis一统江湖。
从spring mvc 到言必谈spring boot,微服务。不来两句服务化,降级限流熔断,高并发你都不好意思出门。


后来转战“大数据”领域。那时mapreduce已是明日黄花,strom以及阿里巴巴主导的汉化版jstorm也是江河日下。而spark正当其时,如日中天。遂入坑。
到flink异军突起,阿里巴巴再出汉化版blink,与spark分庭抗礼,直至略占上风。后来者只知flink,而鄙视spark之风气,怪异而可爱。

从传统关系型数据库到非关系型数据库,NOSql,NewSql,到数据湖,再到兼顾OLAP,OLTP的各种分布式数据库如雨后春笋般出现。
这时期的数据库已无法像传统关系型数据库那样三足鼎立(o+m+else)(java位面下),而是春秋时期百家争鸣的局面,各家大厂根据自身的业务需求订制化了许多产品,包括不限于Fusion,mariadb,OceanBase,TiDB,ClickHouse,greenplum,dorisdb,kudu等等。
对于普通开发者,这是好事?坏事?
对于技术团队,这是好事?坏事?
有了更多的选择权?要学的东西更多了?


怎么选择一种技术框架,从是否开源,是否KPI开源,开源社区是否活跃/持续/稳定(我没有说阿里,别乱说),是否有国内大厂使用,社区(特别是问答社区)是否活跃,中文资料是否够多,都是影响普通开发者/团队选择某种技术的原因。

下面将从效率(技术本身),环境(开源,社区),团队(负责人/骨干的技术水平和技术偏好)三个方面来谈谈我的看法。

为避免说教的意思,以及倚老卖老(并不老)的嫌疑,首先声明,以上以下只代表个人观点。

2.1没有绝对的效率

我有点害怕技术讨论会上,上来就说据XX公司/官网测试,XX比XX效率高出5%(8%or10%...).

这就有点像面试中上来就问QPS多少。不才曾经做过一个广告竞价平台,日均访问量几千万,听起来好像很牛逼的样子,但该系统是纯内存计算,严格限制单次访问时间,这种系统谈QPS根本不具备任何横向参考意义。

或者像面试中多次被问到spark/hadoop集群多少个节点的问题。我一般会回答一个大概的数字,然后补充一下集群cpu cores/内存/存储空间总数,必要时补充集群任务数,单日/总处理数据量。如果只是性能空间并不太好的有限物理机,用容器虚拟成上千个节点,那就达到了大厂的集群规模了吗?

只有在控制变量的前提下,谈论单一指标才有意义。

效率并非不重要。但为那点3%的效率牺牲其它东西,值得吗?这是值得衡量的。说句诛心的话,那点性能优势对于绝大多数公司,我觉得可能是你自己想多了。还不如好好优化一下那堆shit山。

2.2效率是否绝对重要

在RocketMq(阿里牛逼!)没有开源前,消息队列一般有三种选择RabbitMQ,ActiveMq,ZeroMq。
三者控制变量的前提下,TPS测试结果表明ZeroMq效率最高。但那些年我所待过的公司,我了解到的情况(同事,网络),消息队列基本都在RabbitMQ,ActiveMq两者之间选择,鲜少使用ZeroMq.

这个例子可能并没有很强的说服力。但大概就是这么个意思。

3.1国内开发大环境

最典型的例子就是mybatis vs hibernate.
除了银行之类的老项目,现在有新项目在使用hibernate吗?就算有,hibernate在国内也早就远离了主流。
可是,在国外,hibernate依然是绝对的主流。
在stackoverflow上的tags数量,看对比图,hibernate热度碾压mybatis,两者根据不是一个数量级.

600147-20210906162828167-1274703765.png

600147-20210906162840728-1694539249.png

按google搜索趋势,过去五年,hibernate的搜索量依然碾压mybatis.

600147-20210906162850414-1855221467.png

同样google搜索趋势,按国家地区划分。全球范围内,mybatis热度胜过hibernate的,只有东亚地区。中日韩东亚三国最喜欢mybatis。迷惑。。。

600147-20210906162902880-1789094848.png

为何会有这种地区之间的巨大差异?有人说是阿里巴巴的带动作用。阿里对国内JAVA整体环境的带动和影响是毋庸置疑的,但在mybatis之所以流行这件事情上,完全归于阿里,也无法解释韩国和日本同样流行mybatis这件事。

不管怎么说,不管公司,团队还是个人,都是一定程度上从众的。既然大环境都在使用mybatis,那么这样用就不会犯大错。公司好招人,个人也好找工作。大家的成本都在最低,皆大欢喜。

3.2技术社区的影响

有个笑话,外行人看到程序员在工作,觉得好牛逼,全英文的界面。知乎也常有提问,英语不好,学编程可行吗?
底下回答,很多鼓励,英语跟编程没有太大关系云云。

这句话有毛病吗?
这至少透露出来两层意思。

  • 不是说编程方面英语不重要。英语好,优势巨大。

  • 国内程序员很多英语不好。以本人常年混迹小公司的经验来说,好多程序员连eclipse或者idea上常用的界面按钮上的单词都认不全。唯手熟尔。不懂就百度。这个很多,是好多,无法统计,但个比例绝对不低。

  • 国内IT圈子是一个比较封闭的圈子。虽然,用的技术基本都是发源于国外,但国内的规模保证了资源的足够。比如spark/flink不需要去官网阅读一手资料,各个论坛网站上公众号各种二手三手N手的资料满天飞(这其中博客园已经可以算是一股清流了);比如出现了问题,第一时间打开百度,CSDN虽迟但到,虽然上面都是各种推广广告复制粘贴错误百出答非所问僵尸文章,但一个一个试嘛,多翻几页,总能解决问题嘛。(大雾)

有追求的程序员,或者大厂的大佬觉得嗤之以鼻,遇BUG先必称看源码,再次github issue,stackoverflow,搜索必须google,资料必须原文。对CSDN表示垃圾。

本垃圾表示CSDN是个好垃圾。就算是一条底裤,一张厕纸,都有它的用处。

所以英语跟编程没有太大关系,这不是一个疑问,对很多程序员来说,这就是事实。大量分布于各类中小型公司,严重依赖于国内各种社区学习(copy)技术,解(zhi)决(zao)问题,赚钱养家。

国内头部公司/团队用什么,大多数的公司/团队/个人就用什么。

这件事情的另一个力证是spring cloud vs apache dubbo,两者隐隐有在国内分庭抗礼之势。但在全球范围呢,我就不放google trend图了。有点欺负人。

但是因为apache dubbo是阿里巴巴出品,进而影响到了国内整个程序员圈子,社区,所以大家也逐渐愿意去用,虽然被之前的开源社区挺尸行为伤过。就像一个渣男,但他是高富帅啊,自带光环。

4.1 团队负责人及核心骨干的技术积累以及技术偏好

2017年新公司进行一个流计算项目。当时整个团队都是新组建,尚处于磨合期。当时我个人偏向于spark streaming,用得比较熟,上手快,能够提前排坑,能快速解决线上问题。但当时的技术负责人在召开技术研讨会,听取各方意见后,决定使用jstorm。

我当然服从决定。
当时的jstorm尚有余晖。而且据说那时jstorm在开源社区诈尸了。颇有几分卷土重来的架势。加上当时负责人力排众议,让我觉得很安心,他应该是很懂jstorm这项技术栈的。

后来项目顺利上线。再后来,不出意外,运行一段时间,遇到棘手线上问题。几次团队沟通后,我得出一个结论,决定使用jstorm的负责人并不了解jstorm,甚至应该不懂java技术栈(客观白描事实,无情绪输出,技术管理者并不一定要懂技术);所以,整个团队最懂jstorm的好像就是我了。
肝吧,骚年。在经历了好几个后半夜,并成功在国庆享受了三倍工资(并没有)后,BUG解决。

后来回想,如果当时上的是spark streaming就不会出现同样的问题,就算出现这样的问题,凭借对spark streaming的较深入了解,也能够快速解决。


上述这段经历,我想表达什么?

  • 一个程序员的竞争力包括什么?不是会用某一种技术,也不是能够快速上手某种新技术。

    • 学习新技术的欲望,动力,能力;快速上手,保证任务,这些只是基本功。对于新技术,能够利用经验,快速理解原理内幕,预排坑道,又快又好解决线上问题,更为重要。所以,当决定使用某种新技术(哪怕技术并不新,如果团队当中没人使用过,没有深刻了解过)时,并不能仅满足于“能快速上手”。
  • 技术本身没有立场。没有好的坏的,没有国外的国内的。有些技术栈,并没有mybatis和hibernater那么悬殊,如何抉择,很大概率就看技术团队的偏好,类似于spark vs flink,spring cloud vs apache dubbo,不管谁是胜出者,都很隐。

  • 除了团队的学习成本,还要考虑其它成本.

    • 比如,运维成本,比如,用scala还是java开发spark.
      用java的好处是虽臃肿但新手外行上手超快。用scala好处是它是spark开发语言,熟悉scala便于查看spark源码,语法强大,逼格高(我真见过scala开发spark的鄙视使用java的);坏处是,语法强大,语法糖很爽,但有时天马行空对于团队合作开发真的是灾难。
    • 行政成本比如招人成本。
      招一个使用scala的程序员不难,基本上会用java的都能快速上手,但要写出没有“java”味儿的scala代码,还真不容易。(scala的java味儿,就是那种,你一看就是java程序员转过来的痕迹,满屏都快溢出来)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK