0
每年的LLVM开发者大会都是十月底, 这一年刚开始的时候我就在参加会. 刚好几个不住湾区的同事都在, 我manager Chris就叫着所有人一起吃饭.
Chris身上有很多上一辈程序员的特质. 慈眉善目的白人, 带一点儿婴儿肥, 90年代就开始写代码; 深谙软件发展的坑坑洼洼, 因而对这个世界有一份很独特的看法. 整体画像有点像 亿万图谋 里的 Juri Müller.
Chris很爱他的俩女儿, 每次吃饭都会成为话题的中心. 这次是PTA (家长教师委员会?), 他刚好因为PTA的会议来迟了. 席间的时候他又提起了这句话.
Software is easy, people are hard
软件轻而易举, 人性难于登天
我刚入职的没多久就听他说过. 在之后的一年里又会反复在不同场景下听他说到这句话. 不过当时的我并没有那么深刻的见解, 在我听来他只是在抱怨:
有多少冗长的PTA或者HOA (业主委员会?) 会议, 大家口干舌燥的讲来讲去, 本质上就是用礼貌的方式表达
Dave, don’t be a dick.
Dave, 你当个人吧
我还没有小孩儿, PTA这个概念在我听来遥不可及; 我也没有房子, HOA这个概念更是日常被Helen口诛笔伐. 至少在那时这句话听起来更像是他在说带小孩儿可比带工程师困难多了. 那时的我还是俩月大的牛马, 根本还想不到这句话在未来的一年, 在各个场景都会不时地绕回我脑子里.
2
AI
牛马上了一年多班是什么体验?
我已经忘了是从什么时候起我上班的日常就是和AI聊天. 一开始只是一些小的修修补补单纯是因为AI打字的速度比我快. 逐渐的变成了小的feature或者bug的修复; 直到现在我基本上很少动手写代码. 写代码从来没有如此简单过. Tech lead说AI抹平了人们写代码的能力, 十年老工程师和刚入职的大学生写出来的代码是一样的, 都是AI.
AI也不是没有坏处, “改不对测试所以干脆删了测试”都是AI能干出来的事儿, 而我今年已经不知道修复了多少这样的问题. 诸多啼笑皆非的SEV已经在公司内部被发起, 我也毫不意外AI会在肉眼可见的未来捅出更多幺蛾子,
我有时会想起C++刚推出的90年代. 各种如今习以为常的高级特性在当时的程序员看来颇为高效. 星际争霸制作的时候程序员就滥用了类的继承, 因为那是用惯了C的人第一次见到这么好用的玩意儿. 而一些现在如果还不熟悉可能都进不了面试的C++特性/用法, 在当时完全是无人知晓的. 所谓的”常识”, 也不过时行业内这么20年积攒下来的经验和共识.
Good decisions come from experience, experience come from bad decisions.
好决策总结自经验, 经验汲取自坏决策
换个比喻方式, 设想现在是20世纪初, 飞机刚刚被发明出来. 而我们现在缺少的就是一些”共识”:
飞机到底解决了什么问题? 到底是富家公子的玩具, 还是用来横跨跨美洲送信? 后者是美国历史上真是存在的项目, 在1930年代左右, 双翼机搭载邮政包裹从三番飞纽约, 耗时33小时经停13个城市. 这个用途在有电报的情况下意义不明, 我们应该取消飞机这个项目吗?
你说一百年以后一架飞机可以带着大几百号人在15个小时里飞过太平洋? 不不不, 我们现在造不了那么大的飞机, 我们甚至没有足够的航空燃料. 但我要怎么说服你这个项目不是硅谷圈钱的泡沫?
什么时候新的技术是可以用的, 什么时候需要格外小心, 什么时候你其实有更好的工具来解决问题? 这些问题对任何技术都是一样的. 回到AI, 他绝对好用, 在一些问题上有无可比拟的优势; 在这个时点上也只有”打不过就加入” 这个选项; 但也会在三五不时触发灾难级的后果.
牛马
AI可以提生产出不意味着任何人的工作可以变得更简单. AI也许可以写代码, 但并不能解决问题. 当一个问题有三个解决方案, 而每个解决方案都涉及到不同甲方和乙方的时候; 我非常意外地发现很多工作并不涉及AI, 更多的时间反而花在了沟通, 协商和扯皮上.
工作以后意识到, 工业代码的底层逻辑从来都不是为了获得更好的软件. 就拿我们公司举例好了, 作为美股七姐妹之一, 全世界的投资人都直接或者间接的拿着我们的股票. 投资人想要每年20%的增长, 压力传导到高管那里转变成每个季度的资产负债表, 再向下到中层领导细化成每个部门的KPI, 最后传导我们头上变成每个大头兵的绩效.
每个人都在优化自己的绩效, 鱿鱼厂员工更是深谙此道. 直到有一天我突然意识到, 更好的软件从来都只是帮公司挣钱的副产品.
服务各种各样的客户, 永远是事儿多人少. 不能满足所有人就得按需排序, 谁先谁后这里面的弯弯绕绕可就多了.
同样的, 想让人帮忙? 那就得好说歹说这个活儿怎么对大家都有好处了. 这个”好处”不见得和”更好的软件”有关, 而是如何能帮大家达成更好的绩效.
夏天的时候修了个bug, 花了一周. 修完了我和本应维护这个代码的团队说, 你们这个代码有两份拷贝很难维护, 有空把这两份代码合并下吧. 就为了这个前后扯皮俩月, 最后结论是说拖到年底再做. 有更有影响力的事情要做, 还有年底的绩效要优化, 我懂.
这时候我都会想起老板的那句话:
Software is easy, people are hard
软件轻而易举, 人性难于登天
Burnout不至于, 我的同事都很给力, 能力强且和善, 需要的时候总是给我很大支持. 我们也仍然有很多有意思的问题要解决.
但除此之外游戏规则就是这样了: 优化绩效而不是优化代码. 爱玩玩不玩滚 (literally).
哪怕我的内心真的很想去做一些事儿, 心里知道这事儿对我的绩效没好处就得说”我知道你很急但你先别急”或者”你这个我下周再忙”.
每次都觉得蛮难受的, 感觉失去了当学生时”写更好的代码会让我快乐”的纯粹和热情.
年轻牛马还会心存不安, 老年牛马估计直接当不紧急的需求是放屁
有的人认为我们厂”毒”, 大概也就因为这个吧. 我猜所有”挣钱”的公司都离不开这个问题. 也许他们包装了一下游戏规则不至于那么露骨.
4
上班有一个好, 下了班你的时间就是你的.
至少暂时是; 在Meta可能偶尔得加班, 但你的同事和老板在名义上不能无缘无故来打扰你. 这额外的时间就被我开发了各种乱七八糟的爱好. 但是每样都玩得很杂, 都没有很玩得很好.
国象
先入坑的是国际象棋. 没有花太多时间去记谱, 更多漫无目的的瞎玩和看视频. 印象深刻的是Igor Smirnov的一场比赛解说, 实在是找不出原视频了, 但是说了一句很有意思的, 大意类似于:
高手过招很少直接进攻, 因为都能算到对方的想法, they provoke
这句”provoke”我想不到怎么翻译, 中文类似的意思是”挑衅”, “试探”, 或者”撩拨”; 但我总觉这里应该是一个中性偏褒义的词. 大概意思是他们会试探对方的想法, 甚至布好陷阱等着对方进攻. 也是这个”provoke”让我喜欢起了这个东西, 我之前经常觉得国际象棋这个东西是一个dead game: 因为计算机引擎可以精确地算出每一步的最好招法, 通过棋盘边的引擎条快速显示一步棋导致的胜率变化.
不过真正下棋的时候去掉引擎条还是手足无措. 搞到最后, 引擎只是一个旁观者, 而真正的决策者还得是我自己.
丁立人争夺世界棋王故事里有一句我深以为然:
观众唯一能看到的就是引擎条, 他们不会分析, 只知道谁优势; 而选手唯一看不见的就是引擎条, 他们只能分析, 而不知道谁优势
德扑
最近还有在玩德州扑克. 这也是个丢下了好几年的没碰的玩意儿. 我发现德州和国象有类似的逻辑:
你可以用GTO把每一步的最优行动路线算出来, 但你只能算出一个概率分布. 换言之机器可以告诉你你要多大的概率该跟注, 有多大的概率该加注.
最终靠人来执行这些, 概率分布会在玩家行动的时候被坍缩成一个具体的决定. 而德州让我着迷的就是, 不同性格的人在执行上也会出现不一样的偏差; 以至于我学到的最好的经验并不是直接和打牌相关的, 而是
你在桌子上坐下来的头几牌别下打注, 而是观察同桌的人有什么偏好.
打球
为数不多让我觉得满意的是羽毛球. 这一年的羽毛球强度比以往任何一年都高. 和Helen每周六晚上固定要去球场打球到12点; 球场就是羽球人独有的夜店.
我们经常一起打混双, 情侣打球是真的会吵架. 吵完和好也就完了, 该犯的错误下次还敢. 人教人教不会, 事儿教人一遍就会.
我后来尽量只提她打得好的地方, 打得不好的也没必要提; 最多提醒下”这样经常丢分”差不多就得了.
“球场上那么多人, 要是觉得伴侣打得不好, 干啥不找一个打得好的搭档?”
我打得烂吵架的时候我就这么回她; 她打得烂我就心里默念这个压下怒火. 说到底大家都是菜鸡, 非要斤斤计较没意思.
当我停止”纠正”她的错误而是预判她的行动以后, 我的球技突然开始进步. 我知道她什么球防不了, 就尽量不要打出能被回到她手里, 又不好处理的球.
如果有什么球她没处理好, 我都得先自省一下为什么不打fool proof的球.
所以我现在生气的主要来源是她的前三拍, 因为我没有太多的能力调整
虽然说”与其提升自己不如责怪他人”是更简单的解决方案, 到头来提升自己还跟实在一点. 我们introvert不想和人拌嘴就是这样的.
露营
今年开始更多地去露营。 Helen说露营就是在当野人, 野人有野人的好玩之处.
秋天的时候去了一趟Crater Lake。 就和很多其他的国家公园, Crater Lake偏僻, 安静; 适合独处。 其中有一个晚上起夜的时候, 意外发现深夜的营地不是我以为的漆黑, 而是被月光点亮。 那月光亮的恰到好处就像夜灯一样,刚好能照亮脚下的路; 但又不够看得太远。
相比之下Big Sur的露营地则更小资, 更热闹一点. 进可以到海边冲浪Carmel逛街, 退可以去山里hiking水边泡脚. 虽然我们自己带了碳但还是需要出去捡柴火, 原因无他, 木头烤出来的肉更好吃; 要是偷懒也能去园区外面的饭店吃饭.
白天出去观景晚上回来做饭天黑了就可以休息, 简单的日出而作日落而息非常适合散心.
4
到了月底又回了LLVM开发者大会. 十月底的会议充满了万圣节的气氛.
第二天的keynote是arm的工程师介绍他们这么些年是怎么从企业专有的编译器逐渐转移到开源的LLVM. 其中说到大约在2010年左右他们同时支持内部专有的编译器, GNU和LLVM. 三个团队做一件事儿不合理, 肯定要砍掉一个. 从现在的视角看砍掉内部工具拥抱开源是显而易见的, 但是在当时这个决策并不容易做: 三个工具各有优劣
还在学术上的时候看论文的日常不是看结果好坏, 而是看他衡量的方式是否合理: 能发出来的论文一定有”好”的结果一定. 一辆开得很快但只能装一个人的车和一辆能装五十个人公交车谁更好? 那得看你是在下赛道还是在送人通勤.
而这个问题到工业界的时候就更加模糊, 往往是高层的领导确定我们的衡量标准. 悟到这一层以后突然就想起了默克尔的自传 Freedom 中的一句话, 颇有点成王败寇的意思:
Factual questions in politics are almost always questions of power too.
事实问题在政治上几乎从来都是权力问题
定义现状, 批判好坏, 分析问题和提出方向; 你不需要AI, 你需要有话语权且能说服别人的人, 最好这个人是你自己.
这个时候在绕回去想想”软件轻而易举”. 你别说, 也许代码从来都不重要, 软件不重要, AI更不重要.
People are hard.