关联知识库:【摘录】InfoQ圆桌对话:AI 时代下软件行业发展趋势及开发者职业成长路径

摘录

底层与应用层的“知名度”差别
比如把基础软件公司和小红书、TikTok、抖音去对比,这就好比不能拿美国的 ARM 和苹果对比。ARM 虽然是更基础的软件公司,但它的市值跟苹果没法比,苹果每天跌掉的市值可能都比 ARM 高。这说明越靠近消费市场、越靠近最终用户的产品,声浪越大、市值越高、收入越高。但这并不意味着底层的技术提供商和供应商不重要。苹果公司几乎全世界人都知道,但除了从业者,知道 ARM 的人并不多。

“老汤换新料”
我曾在社交媒体上吐槽,中国之前没有所谓的科技公司,只是利用科技做传统行业的公司,如利用科技做电商、媒体、聊天等。在没有科技时,用传统方式不也能进行吗?所以科技是造福其他行业的,但我们没有真正意义上的自己的科技行业。严格来说,2010 年以后,随着 GDP 增长,中国大公司有钱投入,才有了真正的计算科技公司,像华为,早期也是通信领域的设备公司。

制度和“出卷子”
关于影响力的问题,我们不太擅长掌握规范、话语权,我觉得责任主要在教育。中国教育让学生都在做题,做题的人怎么去研发新试卷呢?Oracle 数据库诞生后,创造了数据库行业,这张卷子是谁出的?亚马逊做云之前连云都没有,这张卷子又是谁给的?如果把所有优秀的人才在 20 岁前都困在屋里做卷子,以此筛选人才,筛选出来的人将来却要开创,这不是开玩笑吗?这就相当于培养赛跑运动员去游泳,通过跑步选拔了你,但家里却没有水。现在你长大了要去游泳,这本来就是缘木求鱼。我觉得从业者要思考这个问题,更关键的是整个行业的上下游,上游是生产人才的学校,下游是招聘方和消费者,我们是中间环节,学校培养人才,我们生产商品再卖出去,形成闭环。美国大学靠校友捐款培养人才。

概念赛道定义 与 技术本身 相关却不完全对等
我完全认同这个结论,虽然可能不是全部原因,但至少这是一个从宏观上看很重要的能力缺陷。就拿 Databricks 来说,大家都知道它最近融了一大笔钱。回顾其历史,在大概三年前甚至更早一点的时候,Databricks 推出了一款新的云端计算引擎叫 Photon,这个引擎并未开源。当时它原有的产品线还是基于 Spark 的批量处理云平台。但有了 Photon 这个新东西后,Databricks 做的第一件事并不是急着去卖,而是先定义了一个市场,叫做 Delta Lake,宣称自己的产品就是 Delta Lake,说以前的数据仓库已经过时了,它的 Delta Lake 最厉害。这么一宣传,赛道里就成了它一家独大,用户一试,确实不错。从技术层面剖析,它用的还是那些老技术,如存算分离、存储引擎优化等。我觉得中国在性能、数据量等方面很擅长“内卷”,但在像 Databricks 这样定义赛道方面,确实与美国差距较大。

数学题与数学家
李令辉:首先,我觉得这个问题还是得让教育来背锅,但咱们就不深入展开了,大家只要记住是教育的问题就好。我们太喜欢做题了,我有个朋友曾跟我说他孩子数学考试分数不错,但数学本质上不是算数比赛,而是抽象概念的比赛。真正的数学家一辈子没算过几个数,他们主要是推导公式。

规模人数的反噬? —— 抽象思维
其次,从我个人的创业感受以及在大公司工作的经历来看,我发现创业过程中我的抽象思维不断提高,这是一个被动的过程。核心原因是我手里的研发资源变少了,抽象能力就提高了。当我手下有 200 个程序员时,我就不想费劲去抽象,直接把子功能、子模块拆分给大家做就行。但当我发现手里只有两个人时,我就会想着要么写个代码生成器,要么写个编译器。所以我觉得很多时候创新是被逼出来的,我真的是这么觉得的。我自己创业时,公司研发人员很少,对外却宣称有百万大军,其实也就不到 10 个人。我觉得我们的代码其实就是个代码生成器,先生成一堆代码,再生成一堆代码,原因并非后来发现这样做有很多好处,起初完全是因为人手不够。如果我像华为那样有上万开发人员,我干嘛费劲写代码生成器呢,直接给每人分配一个 SQL 去优化就行。

人力成本低的陷阱:稳定但很难又挑战和创造
我觉得美国人这么做也有一个原因是他们人力成本太高。这件事很可能在我们的人均 GDP 越来越高时发生变化,当大家发现与其雇 10 个人,不如让一个人闲下来,冷静下来,抽象一下更划算时,情况就会改变。有个很好的比喻,他说只要看中国什么时候洗碗机普及了,就说明人均 GDP 上去了,因为总有人算账,觉得让老婆洗碗比用洗碗机便宜。只有当洗碗机比人工洗碗更划算时,我们才会更愿意使用机器。想想大公司里那些年薪五六十万、七八十万的程序员,他们在做一些非常细节、具体的小优化,比如一个页面分给三个人,这三个人写了 10 年,这是真的。有什么必要把这三个才华横溢的年轻人限制在一个页面上呢?还是因为页面优化和人力成本差不多,差不多 1000 个页面,就分配 500 个程序员,每人两个;或者两个人一个团队,分四个页面。我觉得核心还是行业从业者应该提高要求,让工作更有挑战性,有更多的事情可做,这是一种被动提高的方法,主动提高我觉得挺难的。

非线性思考 —— 思考惰性:加入是最简单的动作
黄东旭:我每年都会回头看团队的效率,特别关注这个指标,即多少人能干出多少事。对我们这样的公司来说,大部分成本是人力成本,而人力成本里绝大多数是程序员。所以一个优秀的程序员,他产生的影响一定比很多人要大。我在做事时,倾向于不轻易说“给你 10 个人去做”。因为一旦给团队说 10 个人去做,团队就不思考了。加人是最简单的动作。有时为了防止大家陷入思考惰性,我会故意提出一些看似疯狂的要求,比如让系统性能提升 100 倍,成本下降 1000 倍。如果目标只是让性能提升 10%,大家就不会去思考和创新,因为 10%的小修小补很容易实现。但如果目标是优化 1000 倍,虽然你自己心里得先有可行性验证,但不能直接告诉团队答案,因为思考过程也是达成共识的过程。总之,优秀的程序员通过自己的思考,产生的影响是非线性的,一定要用好这种能力。

学习经典
从刚才聊的宏观层面,如思考方式、抽象能力,单从程序员个人发展角度看,如何锻炼这些能力呢?我的经验是,程序员不要自己乱思考。世界上很多好东西已经发明出来了,比如 Unix 等,人家已经做出来了,背后的思考成果和过程都以博客、文章、访谈等形式存在。我的建议是,动手前先多看经典的东西,多思考,写代码并非关键动作。我会花很多时间看一些老东西,如 Unix、Plan9 等漂亮的设计,这个过程也是学习过程,思考人家为什么要这么做。

摘录 —— 关于自我提升的建议

- 尽量提高信噪比
- 微信公众号避雷
微信公众号上肯定无法让你看到真正的经典,那上面的内容大多很表面。因为这世界上所有不花努力、茶余饭后花 10 分钟就能获得的东西,一定不是好东西,也不会让你有实质性的收获。

**索引,起点,而非真正的内容。** 同样适用于短视频等信息密度低的媒介。
零食也可以吃吃,别当主食。

- 经典,历史,追根溯源 —— 从设计思想,设计哲学开始,然后深入细节
第一,要去找到经典,从历史入手,追溯到最根源、最接近经典源头的地方,看第一手资料。不一定非要看具体代码,我以前就犯过这个错误,初中、高中时对 Linux 很感兴趣,一上来就看源码,但感觉没什么用,当时虽然看起来很努力,最后却没什么收获,看过就忘了。反而是去看一些访谈,了解设计思想、作者背后设计系统的哲学,先理解这些,再深入细节,这才是看经典的好方式。

- 实践和肌肉记忆
第二,即使你理解了系统为何精妙、设计为何出色、经典为何是经典,也还不够,关键在于实践。实践部分其实更重要,就像成为钢琴家必须练琴一样。前面听音乐、了解好东西是在培养品位,不能只听低俗音乐,要听经典,培养审美。然后通过练习,让手形成肌肉记忆。我觉得知行合一,把这两者结合起来是比较好的。以前我和很多年轻人交流,他们说平时天天 996,没时间干别的。但我认为,现在大环境变差了,996 拿的钱也有限,不如趁这时候多提升自己,把心态放平,这也不耽误挣钱。

- Taste 品味 : 意味着放弃和取舍

在我看来,什么是品味?我从 Linus Torvalds 的观点说起。虽然我不太喜欢他的品味,但他讲的有道理。在庞大的 Linux kernel 项目中,保持简洁的代码,不搞魔法,用基础的 C 语言而非高级语言,是完全正确的。这样能有效维持项目的简单直白和可维护性,也不易被黑客埋后门。但这换到其他项目未必适用。很多程序员讲品味时,会引用 Linus Torvalds 的观点,但 Linus Torvalds 也只是在 Linux kernel 中如此。所以,我认为所谓品味,你应该问自己:解决这个问题该用什么方法最优雅?这包括几方面考虑:一是你面临的脑力负担,需不需要了解全貌才能解决;二是你要承担多大风险,作为工程师,首先要考虑的是项目会不会因你的选择而失败;三是收益。灵活且因地制宜

不同项目的品味是不一样的,但核心是,如果你不能量化为什么做这个选择,那这个选择很可能是人云亦云。中国人其实很谦卑,我面试时喜欢问程序员都看什么技术文章和博客。如果他列举超过 3 个,我就不太想要;超过 10 个,我觉得这人肯定有问题。因为中文媒体没什么可读的,有那么多时间看中文媒体,不如去干别的。这也说明他品位差,看不出哪些是垃圾。更可怕的是,他很可能被这些垃圾影响。我最害怕的是,一些程序员在项目讨论中搬出大名词,却不知道这些人的真实水平。你放着权威的教材不看,去看中文博客,如果你要相信权威,就找最权威的。东旭读经典的做法是对的,因为经典被那么多人筛选过,你获得营养的概率远高于垃圾,时间不会白费,比订阅一些不靠谱的博客强多了。

黄东旭:我觉得品位这种事,最终体现在你做选择时。作为一名 CTO 或资深程序员,设计众多系统,每时每刻都在做决定,比如这个接口设计成什么样,或者这个地方要不要抽象成一个模块。品位就是在这些决定中的一种行为准则。你会觉得某个地方需要这么设计接口,虽然当下看不到收益,但相信未来你会感谢自己当初的决定。

- 简洁的品味 KISS原则
有意思的是,现在我回头去看 PingCAP 系统,至少是我参与决策的那些部分,发现大多数正确的决定在当时看起来都非常反直觉。如果当时按照那个环境下所谓的大 V 或主流设计方案去做,最后回头看你会庆幸自己没听那些微信公众号或主流人士的说法。尤其是当你的组织变大后,作为技术掌舵人或决策者,你做出反直觉的决定,就意味着底下的人会问为什么要这么做,眼前的利益明明应该这么做,为什么不做呢?所以我自己在做重大决定时,第一个倾向是能不做就不做,能晚点做就晚点做,保持系统的简洁,也就是所谓的品味。作为古典程序员流派,我更倾向于以简单为美。

摘录 —— 关于解决问题 的 生态和“超越”

- 考核制度催生重复,代码层面的复用可以延伸到工具层面的复用,人均Raft确实没必要

我觉得程序员这个职业和传统职业最大的不同在于,我们不需要做前人做过的工作。传统工作比如做面,你做不到别人做的面,所以你要不断练习,做到接近那碗面的水平,才能成为好厨师。但程序员不是这样,别人把一个库放到 GitHub 上,你拉下来就能用。TiDB 开源了,你直接用就好了,何必换种语言再写一遍呢?大厂最喜欢做这种事,他们喜欢把别人的东西换种语言再写一遍,然后证明自己更厉害,评完级就把项目扔掉。我觉得这是考核机制的问题,一个人把别人做过的事再做一遍,这没什么了不起,甚至在这个行业是可耻的。如果所有人都重复做一件事,我们就不会有现在的计算机科学和互联网。我们是在前人的肩膀上再走一步,才形成了现在的巨塔。Google 那么厉害,它重写 Nginx 了吗?它做的 GFS、BigTable 等都是以前世界上没有的东西,它需要这些东西。至少一开始,Google 的初心不是为了考试。我觉得不存在超越,你可以做最好的自己。看看世界上需要什么,有什么问题需要解决,把问题解决好,你就厉害了。你不需要和任何人比较,你就是最厉害的。

我们应该庆幸现在的年轻人比我们那时候卷多了。比如东旭他们刚创业时,用 Rust 写的 Raft 应该是市场上的第一家。现在你知道市场上有多少家吗?大厂几乎人均一套 Raft。有什么必要每个年轻人都写一遍?写完了又怎么样?也没有发明 Raft。为什么要把别人的工作再做一遍呢?如果你觉得这就是一种超越,那我觉得你永远超越不了,这就是最大的问题。

在我之前两三年,经济还没这么差的时候,我面试了很多大厂的年轻人,人人都擅长 Raft,每个人都精通。我不知道我们为什么需要这么多精通的人,硅谷可能都没有这么多精通的人。Google 也就一个组在做这个事,Meta 也是一个组在做,而且那些组也不是专门做这个事的,我觉得没必要这样。

AI之外 这段不是很扣题

有趣的挑战 —— 探索新技术的应用

黄东旭:我觉得我做很多事情的出发点,不仅仅是公司业务上的探索,更多的是因为有趣,或者是因为我自己需要。比如我现在的助理不够智能,我想用人工智能来整理我的日历、邮件和个人数据。这可能看起来是一个有趣的挑战,或者是我自己需要的东西。在做的过程中,我至少会倾向使用以前没用过的那些技术。

抬杠和祛魅

马驰改变了我的一个观点。我以前觉得抬杠很没意义,虽然我自己以前也爱抬杠,后来反思觉得挺浪费时间,就不怎么抬了。但后来我发现抬杠有两个好处:一是去魅。你不抬杠,容易在我们这个文化体系里把位高权重人的话奉为圭臬,觉得他说什么都是对的。其实你抬抬杠,会发现没人总是对的。在这个过程中,你能了解对方是怎么想的,想想这个想法对不对。如果这个人连思考过程都没有,就是拍脑袋,你不用听了。抬杠的过程有助于去魅,并且强迫自己找证据、了解真相。拍人马屁时你不需要时间,只要付出点尊严就行,但抬杠不一样,你不学习就不能抬杠。敢于抬杠是一个挑战权威的过程,并且强迫自己学习。对很多想从事真正有价值事情的人来说,这是有意义的。无论是创业还是做科研,其实都是挑战别人的共识。没有跟一万个人抬杠的勇气和决心,很难做成事。无论做什么创新的事,都是这样。

黄东旭:我觉得“去魅”这件事在程序员或软件开发行业里特别重要。老实说,编程本质上是个手艺活。编程语言其实没那么了不起,无非就是那几个关键字。程序这东西,你写多了,自然就熟练了,大家水平也差不多。所以,没必要因为谁说过什么就觉得他特别厉害。这种盲目崇拜权威的做法其实不太好。

“去魅”之后 能够发自内心地欣赏曾经的“敌人”做得好的地方

我也不是完全反对抬杠这件事。抬杠更多是一种心态。现在我年纪大了,有时候会说“你说得都对”,但心里其实会想一遍抬杠的过程。这种内心的质疑很重要。我回想一下自己,编程能力最强、精力最充沛、头脑最开放的时候大概是在初中和高中。那时候我学编程比较早,正好处于叛逆期,又赶上了开源运动的浪潮。90 年代中后期的开源社区,大家的共同“敌人”是微软,一提到微软大家都嗤之以鼻。大家都觉得自己是民主战士,这种氛围让我在各种论坛里很活跃,也让我对权威有了更多的质疑。但后来我发现,真正重要的不是怼天怼地,而是完成“去魅”之后,能够发自内心地欣赏曾经的“敌人”做得好的地方。比如以前我觉得微软的东西都不好,但后来才发现,微软的 IOCP(输入/输出完成端口)在并发和异步处理方面做得非常好。这就是我想说的最后一个建议:当你完成内心的质疑和“去魅”之后,能够真正欣赏对手的优点,这就是一种成功。放弃自己的自我优越感,你会发现无论是朋友还是曾经的“敌人”,都有值得学习的地方。

马驰:我觉得在很多领域,我抬杠都能抬胜,但这并不是因为我经验丰富或能力超强。我觉得有一点特别重要,尤其是在中文圈子——就是要和国际上最先进的技术和社区保持接触。开源社区就是一个很好的例子,它不分国籍,是世界上最前沿的圈子。如果你能融入这个圈子,就能站在巨人的肩膀上。当你再去看一些封闭行业里的所谓权威、老师傅或大 V 时,就会发现他们其实已经和时代脱节了十几年甚至几十年。

Cursor在复制系统面前的有限性

黄东旭:现在很多工具可以自动生成代码,比如 Cursor,它在局部生成代码可能还算可以,但如果一次性生成几百行代码,我觉得这种做法完全不可靠。现在很多人还在鼓吹 Coding Agent 之类的东西,但在我看来,除非你只是开发一些简单的系统,比如食堂管理系统,或者做一些前端的简单功能,这些工具或许还能用。但如果指望它们能替代一个优秀的工程师,那我觉得还差得很远。

S3分布式存储的工作原理
说到学习建议,我还是觉得要回归一些万变不离其宗的基础知识。比如现在大家都在讨论 Serverless、Lambda,包括我们自己也在用,TiDB 的云服务也很快会完全运行在 Lambda 架构上。但你会发现,很多基础的东西其实并没有变。比如,一个系统的性能瓶颈在哪里?吞吐量和延迟受什么影响?在这个快速变化的时代,我对年轻程序员的期望是不要丢掉基本功。举个简单的例子,最近大家都在说云原生对象存储,S3 是新的磁盘。很多年轻人看到这个结论,就觉得 S3 很厉害,是新的存储方式。但如果你真正去设计系统,会发现当 S3 遇到瓶颈时该怎么办?S3 本身也是一个大型的分布式系统,可能需要扩容。你不一定非要自己做一个 S3,但你得了解这个系统是怎么工作的。所以在这个日新月异的时代,我还是要建议大家去看经典的东西,这些才是根本。

严肃与低幼化

马驰:我观察到在云计算和技术软件领域,很多产品经理有一种“低幼化”的倾向。他们会把一些很严肃的生产力工具,比如数据库、操作系统或对象存储,设计得过于可爱、甚至做一些布偶。这其实是一种非常独特的中国现象。在欧美,这种情况很少见到。我认为这种做法其实显得很不专业。

黄东旭:在美国,一些基础软件创业公司,尤其是近几年的小公司,也出现了类似的“低幼化”倾向,这其实随着“开发者关系”岗位的兴起而逐渐显现。你会发现,这些公司大多处于早期阶段,可能只有三五个人。他们这么做,一方面是为了招聘,因为这个群体大多是年轻人,公司需要打造一个酷炫的形象。但你会发现,这些公司一旦发展到一定规模,有了企业客户,他们的形象就一定会向更严肃的方向转变。举个例子,大家都知道的小强数据库(CockroachDB),其实有不少企业客户因为名字的问题而不喜欢它。当然,他们的 CEO 个性也比较强,但我个人认为,如果面向企业客户或做严肃的基础软件,还是应该更严肃一些。