执行与责任的天平

被取代与不可取代:一个前数据科学从业者和 AI 产品经理的十年职业回望

站在 2026 年的当下,如果你在科技互联网行业工作,大概率会有这种切身的体感:AI 的能力边界扩张得太快了。 我们经常在各种讨论群、咖啡馆里听到这样的焦虑:“我的工作会被 AI 取代吗?” 要回答这个问题,我不打算搬出冰冷的宏观报告,而是想“解剖”一下我自己的职业生涯。从 2011 年毕业至今,我干过数据清理和数据开发、写过无数的脚本规则、搭建过数仓和指标体系、 做过很长时间的数据分析挖掘以及机器学习开发工作,也做过一线车企和头部 AI 公司的 AI 产品经理。而到了 2024 年底,我转身进入了一家国际顶尖的第三方检测认证机构,开始围绕欧盟 AI 法案(EU AI Act)以及汽车相关 AI 标准和法规,开展 AI 系统的合规评测、评估与指导业务。 如果把我的这段履历切分成两半,你会发现一个非常残酷但也极其清晰的真相:我前半段职业生涯积累的绝大部分硬技能,现在都已经可以被 AI 完美取代;而我现在正在做的事情,AI 却几乎无从下手。 这中间的逻辑分界线到底在哪里? 为什么我过去的很多工作,现在可以直接交给 AI? 让我们先把时间拨回到 2011 年到 2024 年这十几年间。 在早期的外企网络安全数据运营中,我的日常工作是处理海量的垃圾邮件。我需要写大量的 Perl、Python、Shell、PHP 等脚本,精雕细琢复杂的正则表达式(Regular Expressions)去构建规则。 后来进入几家头部的智能可穿戴和智能手机厂商,我成为了业务数据 BP(Business Partner)和高级数据分析工程师。我的日常变成了:不仅要写复杂的 SQL 语句提数、做 ETL 数据清洗、构建底层数据仓库、梳理用户埋点,用 Tableau 或 Superset 搭建起漂亮的数据看板;我还会频繁使用 Python 的 PySpark,以及基于 Java 或 Scala 的 Spark,去开展更加复杂的大规模数据分析与挖掘。同时,我也负责开发基于传统机器学习方法,以及更为先进的神经网络等机器学习服务。 甚至在 2023 年到 2024 年期间,我在一线车企和头部 AI 企业做智能座舱产品经理和智能问答服务的产品负责人时,我的核心工作是:梳理需求、协调各方(运营、研发、测试)的动作,撰写和优化需求文档(PRD),推动产品功能落地。 站在今天回看,这些工作本质上可以归结为两个词:翻译与搬砖。 翻译属性工作:将一种人类语言转化为另一种机器或其他部门能理解的指令。可以想象成一个“人肉编译器”,把业务方说的“我要看昨天活跃用户下降的原因”翻译成底层的多表关联 SQL 代码。 ...

April 26, 2026 · 1 min · 188 words · s-ai-unix
一碗淮南牛肉汤

非Cook眼中的淮南牛肉汤

那家店要搬走的那天早上,我照常去吃牛肉汤。 图1:清晨六点的牛肉汤店门口,永远是一座城市最诚实的地方。 老板正在跟接手的下家交代怎么做汤。我坐在旁边吃,有一搭没一搭地听着。骨头要泡多久,什么时候下锅,冷水还是热水,火开多大,沫子怎么撇,什么时候放姜,什么时候下香料包,香料包里几颗八角、几片桂皮、草果要不要拍开,牛肉煮到什么程度捞出来,捞出来怎么放凉,放凉多久才能切,切多薄…… 那一长串步骤、火候和时间节点,说了足足二十分钟。 我端着碗愣住了。眼前这碗汤,粉丝透亮,千张薄如纸,牛肉贴着碗壁铺开,汤面上一层薄薄的牛油和辣椒红油,香菜碎和葱花安静地浮着。我以前一直觉得,牛肉汤嘛,不就是汤水加料?能有多复杂? 那天我才知道,这碗看起来朴素到极致的汤,背后是一整套精密的时间表。 淮河边的早餐工程 图2:一碗标准的淮南牛肉汤:汤清而鲜,千张薄而窄,牛肉片若纸,辣椒油在汤面画出一道红弧。旁边是刚出炉的芝麻烧饼。 淮南在安徽北部,淮河从城市中间穿过。这座城市不大,但坐落在肥沃的农业区中心,牛肉、大豆和小麦都不缺。淮南牛肉汤的起源没有确切的文献记载。有把它追溯到宋元时期游牧饮食影响的说法,也有拿刘安、赵匡胤来讲故事的地方传说。但更稳妥的判断是:它形成于淮河流域的牛肉、豆制品、小麦和早市文化的交汇之中,经过一代代街头摊铺的打磨,慢慢沉淀成了今天的样子。 它的本质不是一道精致宴席菜。它更接近一种高频消费的城市早餐系统:要快,要热,要鲜,要便宜,要能批量稳定供应,还要在几十秒内完成一碗的最终组装。 这些约束条件叠在一起,就把它逼成了一门手艺。 一锅汤的秘密 图3:凌晨三点,大锅已经在火上了。牛棒骨、脊骨、肋骨在琥珀色的汤里轻轻翻滚,浮沫被一勺一勺撇去。 好牛肉汤的根基是骨汤。这一步没有捷径。 牛骨要在头天晚上泡水,换几次,把血水泡出来。第二天凌晨冷水下锅,慢慢升温。水开之前会浮起一层灰白色的沫,那是受热凝结的蛋白质和杂质。必须耐心撇干净。如果图省事让汤翻滚,这些东西会被卷回汤里,整锅汤就脏了,入口会有一股闷闷的腥味。 焯水、冲洗之后才是正式吊汤。牛骨、部分牛肉、姜块、葱段、香料包,小火慢熬四到六个小时。火不能大。大火会让脂肪乳化,汤变得浑浊油腻。小火熬出来的汤是清亮的琥珀色,轻轻晃一下,能看到汤面微微荡开的油花,喝一口,有骨髓的厚度、牛肉的鲜甜和胶质黏唇的绵密感。 骨料的搭配也有讲究。棒骨带骨髓,提供脂香和厚度;脊骨和肋骨带肉,补充肉味。只用棒骨,汤油而不鲜;只用瘦肉,汤鲜而不厚。两者搭配,互相补足。 香料的角色很微妙。八角、桂皮、草果、花椒、白胡椒、小茴香、香叶,这些都可能出现在香料包里,但用量必须极克制。香料的作用是托住牛肉和骨头的底味,压一下腥膻,留一点温暖的回甘。如果香料味盖过了牛味,那这碗汤喝完你只记得八角和桂皮,记不住牛肉。那就错了。 好汤喝完,嘴里应该记得的是牛肉的鲜。 碗里的每一样都不简单 图4:一碗牛肉汤的全部主角:薄切牛肉、红薯粉丝、窄条千张、香菜、葱花、蒜末、辣椒油。每一样都有自己的临界点。 牛肉要薄。这一点怎么强调都不为过。牛腱或牛腩煮到刚好熟透,捞出来,放凉到能下刀的温度,逆着纹理切。薄到什么程度呢?理想状态是铺在碗壁上能微微透光。薄牛肉入口即化,汤汁能渗进每一丝肌肉纤维里。厚牛肉就不一样了,再嫩也会显得跟汤分离,像是汤里放了几片卤肉,各吃各的。 千张要薄、要窄。千张是大豆蛋白和脂质在豆浆加热时形成的薄膜,天然就该是轻盈的。切宽了、买厚了,入口像在嚼橡皮片,会把汤的鲜味割裂。切成窄条,它就像面条一样融入整碗汤的节奏,吸汤快,入口轻,带着一丝干净的豆香。 粉丝要滑。红薯粉丝比绿豆粉丝更有韧性,在淮南牛肉汤里更常见。关键是不能煮过头。粉丝泡软后短烫即可,不能在锅里久待。它一泡长了就糊、就断、就吃掉汤。好的粉丝应该有弹性,用筷子夹起来能看到汤水顺着它滑落。 这三样东西,牛肉、千张、粉丝,食客每一口吃到最多的就是它们。汤底再好,如果这三样处理得粗糙,整碗汤的口感就会打折扣。很多店只盯着汤,忽视了碗里的配角。其实,配角演不好,主角再出色也撑不起一场戏。 最后一厘米留给你 图5:辣椒油是整碗汤的点睛之笔。好的辣椒油不是单纯的辣,而是辣椒的焦香、芝麻的油香和几味香料的暗劲合在一起。 淮南牛肉汤有一个特别好的传统:佐料自取。 葱花、蒜泥、香菜、醋、辣椒油,排成一排摆在台面上,你自己拿小勺加。这不是偷懒,这是智慧。好汤底应该是干净的、有骨肉底味但不过分调味的。最后那一点个人化的刺激感,交给食客自己完成。 有人爱蒜泥的冲劲,有人受不了蒜味;有人要香菜的清香,有人觉得那是肥皂味;有人无辣不欢,有人只要一碗清汤。所有这些偏好,都在最后一厘米里被照顾到了。 辣椒油值得单独说。很多店的差距,就差在这一小勺上。好辣椒油是用热油激过辣椒碎和几味香料做成的,油温要够高但不能烧焦,辣椒要有焦香而不是生辣或苦味。香料在油里会释放脂溶性的风味物质,这就是为什么一勺辣椒油能一下子「点亮」整碗汤的香气。如果辣椒油有陈油味、焦糊味、或者只剩干辣,那第一口就毁了。 饼要现炕 图6:芝麻烧饼从炉膛里铲出来的那一刻,焦香、麦香和芝麻香混在一起。这个温度,只有现炕才有。 牛肉汤配饼。这个「饼」不是随便什么饼,是贴着炉壁或铁板现炕出来的芝麻烧饼。 外皮焦脆,一咬会碎,芝麻在牙齿间迸开香气。内里是一层一层的面皮,带着麦香和微微的油润。掰一块泡进汤里,饼吸了汤,外面那层脆还没完全化开,内里已经柔软了。这口咬下去,同时吃到了脆、软、鲜、香四种质感。 凉饼没有这种魔法。凉了以后芝麻香散了,面皮回硬,泡进汤里只剩面坨的口感。所以真正讲究的店,饼是一批一批现炕的。你坐下来的时候饼还在炉子里,等你的汤端上来,饼也正好出炉。 一家店愿不愿意把饼做好,能看出它经营的态度。只想卖一锅汤的店,饼是凑合的。把饼也当回事的店,通常汤也不会差。 三十秒的组装 图7:一碗牛肉汤的最后三十秒。滚烫的骨汤从大勺里倾泻而下,瞬间激活碗里所有的香气。这个动作要快、要准、要烫。 一碗牛肉汤的前期准备可能花了五六个小时,但最终呈现给你的那一碗,从组装到上桌只有三十秒。 烫碗。放入粉丝和千张,快速过一下热水或直接在碗里用滚汤烫熟。铺上牛肉片。撒一把香菜和葱花。然后,一大勺滚烫的骨汤从锅里舀起来,高高地冲进碗里。 这个「冲」的动作不是随意的。汤要足够烫,冲下去的时候能激起蒸气,把香菜的清香、葱花的辛香、牛油的脂香同时蒸腾起来。端到你面前的那一瞬间,你闻到的那股复合香气,就是这三十秒里组装出来的。 汤如果不够烫,所有的香气都打不开。粉丝会显得黏腻,千张会有豆腥味,辣椒油浮在表面动都不动。很多店的问题不是汤不好,是出餐时汤温不够。一碗温吞的牛肉汤,哪怕底汤是用真骨头熬出来的,端上桌也会让人觉得差点意思。 牛大骨:一根骨头的信号 图8:牛大骨不只是加分项,它是一种信号。骨髓化在舌尖上的那一刻,你知道这家店的汤底是认真熬出来的。 有些店会提供整根牛大骨,和汤一起端上来。 大骨不是必选项,但它是一个非常好的判断指标。骨头煮得够烂,说明火候到了、时间到了。骨髓能用勺子轻轻一刮就出来,入口即化,带着浓郁的骨脂香。如果骨头硬邦邦的,骨髓还是固态的,说明这家店熬汤的时间不够,或者骨头是后来加进去做样子的。 大骨的存在还意味着另一件事:这家店真的在用大量骨头熬汤。汤里的胶质感、厚度和骨香不是调味料能伪造的,它们只能来自长时间、大用量的真实熬煮。 十年几百碗之后 吃了十几年,走过很多城市的牛肉汤馆子,我慢慢攒出了一套判断标准。 汤入口第一秒要热,第二秒要鲜,第三秒要有骨和肉的厚度。喝完一口之后,嘴里有回甘和微微的脂香,没有腥味、没有香料苦味、没有粉末感、没有口干感。粉丝要滑而不烂,千张要薄而不碎,牛肉要薄、软、有肉味。香菜、蒜、葱和辣椒油是「点亮」而不是「遮盖」。饼要热,要有焦香。 如果一碗汤只有重辣、重盐、重味精,那只是刺激,不是好喝。如果一碗汤清淡到像热水泡粉丝,那说明汤底没有骨肉支撑。真正好喝的淮南牛肉汤,应该在「清爽」和「厚重」之间找到一条细细的线,稳稳地走在上面。 你问我为什么那么多店做得不行?因为牛肉汤的难不在某一步,而在每一步。骨肉比例、预处理、熬煮时间、火候控制、香料用量、出餐节奏、粉丝千张的处理、牛肉的切工、辣椒油的品质、碗要不要预热……这些变量任意两三个凑合了,整碗汤就会从「好喝」滑向「也就那样」。 那天那位老板交代下家的二十分钟,本质上是在传递一张看不见的参数表。每个参数的容错空间都很窄。这也是为什么同一条街上,两家牛肉汤店用的食材可能差不多,端出来的汤却是两个世界。 牛肉汤不是「把东西煮熟」。它是一套被早市、成本、火候、刀工和口味共同打磨出来的地方工程。看上去越简单的东西,背后越可能藏着一张密密麻麻的时间表。 下次你走进一家牛肉汤店,看到老板凌晨三点就在熬汤,饼是现炕的,千张是手切的,辣椒油是自己炝的,那就坐下来,好好喝这碗汤吧。这种朴素的、不声不响的用心,在这个什么都求快的时代,越来越稀缺了。

April 25, 2026 · 1 min · 56 words · s-ai-unix
数学之美

高等数理统计学前言摘录

陈希孺在他的《高等数理统计学》一书的前言中, 关于学习方法的建议,真的让人十分认同。我们自己或者观察别人就会发现,很多时候对一个概念的理解很肤浅,又或者以为对理论的内容已经知道了,但是要做题或者真的上手的时候,有会不知从何下手。现在将陈希孺的建议摘抄在下面,以供自勉。 书中习题及提示占了近半的篇幅,从写作时间言,则占了四分之三以上. 总计得题五百,若计小题,则不止千数. 其中除少量选摘自有关著作外,大半属作者自创. 有时一题之设,累日始成,可以说倾注了不少心力. 这样做完全是因为,多做习题,尤其是多做难题,对掌握并熟练数理统计学基本的论证方法和技巧,有着不可替代的重要性. 如果通过一门基础课的学习,只是记住了若干概念,背了几个定理,而未能在这方面有所长进,那就真是"入宝山而空返"了. 技巧的熟练固非一日之功,但取法乎上,仅得乎中,必须在开始学基础课时就设定一个高目标. 日后进入研究工作,克服难点的能力如何,相当一部分就取决于在这上面修为的深浅了. 同时,经验表明,在打基础的阶段因忽视习题而导致素质上的缺陷,在日后不易弥补,或事倍功半. 笔者在学生时代及其后的几年中,对做习题未给予足够重视. 当时误认为做题费时间,不增长新知识,不如多读些书,占得实地. 以后试做研究工作,就日渐感到其不良后果,表现在碰到问题办法少,容易钻死胡同,克服难点的能力弱,以致对自己缺乏信心. 对许多方法,都似雾里看花,似曾识面,而不能切实掌握和灵活运用. 有如十八般兵器,样样都见过,但拿到手里,就使不动或很笨拙. 欲以此克敌制胜,自难有成. 以后稍明白了这一点,做了些亡羊之补,终究晚了一些,所谓"困而学之,又其次也". “熟能生巧”,前人的经验不诬. 而要达到"熟",舍大量做题,无他捷径可循. 几十年来,审了大量的杂志稿件,每见某些工作,由于未经深思,为一个并不难克服之点加上了若干不必需的繁复条件,从而使整个工作流于肤浅. 这根子,大略也在于早先在习题上下的工夫不够,以致难以产生别出心裁的想法. 以本书的习题量,要求学员在课程时间范围内做完,恐不现实. 但作者本意并非把这一组题全作为课内习题,而是把它作为"打基础"这个工作的一环,一两年、两三年完成都可以,有空就做一点. 根据题的难易,将其分为三类:加*号的难度较大,加◇号的相对容易,教师可考虑作为课外作业;不加任何记号的,其难度介乎二者之间. 对自学者、已经研究生毕业的青年教师和研究者,可利用这组题测试一下自己解题的能力如何. 可能会有一种意见,认为这组题过于偏难. 作为课程作业,这的确如此. 但笔者觉得,从"打基础",锻炼技巧和提高能力诸目标看,非做难题不行,这道理正如训练运动员要加大运动量,做高难动作,不然,在训练的过程中舒服了,就别指望出好成绩. 各题都有详细提示,大多数较难的题都给出了完整解答. 这是因为,鉴于这些题的难度,需要有一个解答文本在,以作为依据. 对读者而言,笔者切望这部分是备而不用、备而少用. 如碰到一个题一时做不出来,宁肯暂时搁一搁,也不要轻易翻看解答. 譬如登山,经过艰苦努力上了峰顶,自有其乐趣和成就感. 反之,如在未尽全力之前就任人抬上去,则不惟无益,实足以挫折信心. 以上就习题一事唠叨了半天,读者也许烦了,就此打住. 千言万语,归结到一点:希望大家多做题,做难题. “千里之行,始于足下”,就从今日开始吧!

February 16, 2020 · 1 min · 38 words · s-ai-unix
数据分析思维导图

对数据分析工作的深度思考

前言 如果把之前做anti spam的工作也算是数据分析的话(确实跟数据分析沾边,当时招聘的时候就说懂机器学习是个加分项。其实我们当时所做的工作,可以用"专家系统"来概括:通过我们的知识和经验,去写规则和脚本去anti spam),再加上在华米科技的这3年多做大数据分析的经历,也算是一个在数据分析领域浸淫了快7年之久的人了。如果再加上大学四年的"信息与计算科学"这个专业的学习经历(其实是3年,因为大一上半年是在农学类专业,大一下学期转到信息与计算科学),那就是跟数据打交道了快10年的人了。往多了说10年,往少了说3年多,也是该写点总结了。 BTW,最近在看《谁说菜鸟不会数据分析》这本书,发现自己的很多思考跟书中提炼的内容竟然不谋而合,看来这本书还是不错的,哈哈哈。 数据分析的分类 从技巧和方式来看 描述性数据分析(Descriptive Data Analysis) 对数据进行概括性描述 计算基本统计量:均值、中位数、方差等 可视化展示数据分布 探索性数据分析(Exploratory Data Analysis) 发现数据中的模式和规律 提出假设 为进一步分析奠定基础 验证性数据分析(Confirmatory Data Analysis) 验证假设 确认发现的显著性 得出结论 从作用来看 现状分析 了解当前业务状况 监控关键指标 发现异常情况 原因分析 分析问题产生的原因 找到关键影响因素 为决策提供依据 预测分析 预测未来趋势 建模预测 支持战略决策 数据分析的六步曲 在《谁说菜鸟不会数据分析》这本书中,作者总结了数据分析的6步曲: 明确分析目的和思路 理解业务需求 定义分析目标 制定分析框架 数据收集 确定数据源 提取数据 数据质量评估 数据处理 数据清洗 数据转换 特征工程 数据分析 选择分析方法 建立模型 验证结果 数据展现 选择合适的可视化方式 制作图表 突出关键发现 报告撰写 总结分析结果 提出建议 沟通汇报 实际上,只要是在企业里做过数据分析的人,这几步应该都是做过的。或许在报告撰写这块,不是每次都需要,尤其是做临时业务分析,并非每次都要写结论报告。 数据分析的难点 针对上面的6步曲,以我丰富的"描述性数据分析"经验来看,1-5都不难,只要: 受过专业的数学或统计方面的训练 加上一定的数据分析专业工具和知识的培训 就可以上手了 但是第6点就比较复杂了,可能跟我这边"报告"撰写的少有关系,毕竟我们很多都是临时业务分析,不需要出报告。而且报告的撰写需要: ...

July 20, 2019 · 1 min · 186 words · s-ai-unix
R语言统计分析

R语言实用技巧与数据分析实践

前言 R语言是专为统计分析和数据可视化而设计的编程语言,在数据科学、生物信息学、金融分析等领域有着广泛的应用。本文将分享R语言在数据分析中的实用技巧和最佳实践。 向量操作 处理NA值 在R语言中,NA(Not Available)表示缺失值。正确处理NA值是数据清洗的重要步骤。 过滤NA值 如果我们有一个vector叫x,x的值中有NA,如果我们想要过滤掉x中的NA,并把过滤后的结果赋值给变量y: # 创建包含NA的向量 x <- c(1, 2, NA, 4, 5, NA, 7, 8, NA, 10) # 过滤NA值 y <- x[!is.na(x)] print(y) # [1] 1 2 4 5 7 8 10 组合条件过滤 如果我们再想找出y中元素大于0的元素: y[y > 0] # [1] 1 2 4 5 7 8 10 以上两步合在一起: # 方法1:先过滤NA再过滤值 y <- x[!is.na(x)] result <- y[y > 0] # 方法2:一步完成 result <- x[!is.na(x) & x > 0] 常见错误 如果我们直接使用x[x > 0]是不可行的,会得到如下的包含NA值的一个vector: x[x > 0] # [1] 1 2 NA 4 5 NA 7 8 NA 10 原因:NA与任何值的比较结果都是NA,所以NA会保留在结果中。 解决方法:总是先检查NA,再做其他操作。 # 错误方式 result <- x[x > 0] # 正确方式 result <- x[!is.na(x) & x > 0] 矩阵操作 创建矩阵 创建一个4行5列的matrix,包含的数值是从1到20: ...

July 5, 2019 · 5 min · 940 words · s-ai-unix
Python数据分析

Python数据分析完整指南:NumPy、Pandas与可视化实战

Python数据分析生态系统包含了多个强大的库,它们各自承担不同的职责。本文将整合NumPy、Pandas、Matplotlib和Seaborn的核心功能,提供一份完整的数据分析实战指南。 环境配置与最佳实践 Jupyter Notebook优化设置 在Mac上使用Jupyter时,通过以下配置可以显著提升绘图质量。在~/.ipython/profile_default/ipython_kernel_config.py中添加: c.IPKernelApp.matplotlib = 'inline' c.InlineBackend.figure_format = 'retina' 绘图样式设置 使用更美观的绘图样式: import matplotlib.pyplot as plt plt.style.use('seaborn') # 查看所有可用样式 print(plt.style.available) 推荐使用的样式包括:'seaborn'、'ggplot'、'bmh'等。 核心库导入 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris NumPy:高效数值计算基础 NumPy是Python数据分析的基石,提供了高性能的多维数组和数值计算功能。 数组创建与基本操作 # 加载示例数据 iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] # 选择特定列 data = np.array(df.iloc[:100, [0, 1, -1]]) print(f"DataFrame shape: {df.shape}") # (150, 5) print(f"Data shape: {data.shape}") # (100, 3) 数据提取技巧 从ndarray提取数据和标签: # 假设最后一列是标签,前面是特征 X = dataset[:, 0:-1] # 或 dataset[:, 0:8] y = dataset[:, 8] 从DataFrame提取数据和标签: X, y = data.iloc[:, :-1], data.iloc[:, -1] 分离特征和标签: # 获取前两列特征和最后一列标签 X, y = data[:, :-1], data[:, -1] print(f"X shape: {X.shape}") # (100, 2) print(f"y shape: {y.shape}") # (100,) 数组切片的重要区别 理解切片的维度差异至关重要: ...

July 4, 2019 · 6 min · 1161 words · s-ai-unix