MoreRSS

site iconafoo | 王福强修改

连续创业者,20多年互联网与金融技术经验,前阿里巴巴高级技术专家,现福强科技CEO,分享技术、管理、商业和AI知识。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

afoo | 王福强的 RSS 预览

天才的宿命就是不被当世理解!

2025-03-06 00:00:00

天才的宿命就是不被当世理解! -王福强的个人博客:一个架构士的思考与沉淀

天才的宿命就是不被当世理解!

王福强

2025-03-06


今天估计都在熙熙攘攘Manus了,却少有人关注2024年图灵奖这个消息,

所以也不免感叹,天才的宿命,其实就是不被当世理解。

2024图灵奖这两位得主, Andrew G. Barto 和 Richard S. Sutton, 都是从上世纪八十年代(In a series of papers beginning in the 1980s)开始就在研究强化学习的主儿,从提出主要想法(idea, 其实也就是初始假设和思维)到构建数学基础,吭吭哧哧熬到现在,相当于三四十年之后,才得到一个象征性的肯定。

关于强化学习

对于普通人来说,这个小视频最能说明强化学习的想法,其实就是奖励正确,惩罚错误。

- https://weixin.qq.com/sph/Abx16A2da (这个是「福强私学」视频号的视频链接,估计得手机上才打开?!)

比较巧的是,昨天晚上正在看一本斯坦福大学社会学教授写的一本书,

他里面提到另一个人,也是类似的遭遇。

尤达⋅福克曼(Judah Folkman)原是波士顿儿童医院一名小儿外科医生,

假如他还活着的话,绝对是呼声最高的诺贝尔医学奖候选人。

1971年福克曼就提出了一个治疗癌症的想法和底层原理,

他提出癌细胞会与宿主细胞产生相互作用,发出信号欺骗周边组织,形成适合肿瘤生长的环境。

他的想法是,只要设计一种全新的药物,阻挡癌细胞发出的讯息,就能摧毁生产肿瘤的管道。

换句话说,就是一种让肿瘤饿死的药物。

在接下来的岁月里, 福克曼的想法每隔七年就会经历一次起伏,直到2003年6月1日,也就是福克曼提出新型癌症治疗疗法的三十二年后,

杜克大学一名肿瘤学家揭示了抗癌药物Avastin(癌思停)的最新研究成果,Avastin展现了历史上最佳的癌症治疗效果,极大延长了大肠癌患者的预期寿命。

当然,为什么伟大的想法都是要经历时间的洗礼才会成真呢?

很多时候也是受限于思想与现实之间的差距。

毕竟,落地牵扯的因素和资源投入要更多的多。

但正确的思维和方向,依然十分重要。

这其实也是智慧与智商之间的关系。

Caption leads, sailor sails




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)

42 与 《银河系漫游指南》

2025-03-03 00:00:00

42 与 《银河系漫游指南》 -王福强的个人博客:一个架构士的思考与沉淀

42 与 《银河系漫游指南》

王福强

2025-03-03


《银河系漫游指南》,又叫《银河系搭车指南》, 原名”The hitchhiker’s guide to the galaxy”

这本书很有名,电影也是,还有电视连续剧,但我都没看过,我印象里跟它唯一有关系的就是它里面提到的宇宙终极奥秘, 42

这就跟前一篇 「“焦糖布丁”你妹!」里提到的焦糖布丁一样,

其实我并不知道这个42到底怎么个来头,也不知道这个42背后到底有啥深意, 它其实更多就是geek之间聊天的社交货币,跟焦糖布丁一样。

今天看到一本书里提到这个42的典故,才真正知道42到底意味着什么…

42表面是数字,但其实是谐音梗儿。

  • 4 的英文是four,谐音单词是for;
  • 2 的英文是two, 谐音单词是to;

所以,42其实是for(what)和to(where),

也就是为了(什么), 去(哪里)

当然,这个to我又给延伸了,也可以是to(be what), 也就是你想成为什么或者说成为什么样的人。

不过结合搭车漫游的背景,在书和电影里可能更多是“去哪里”的灵魂拷问。

是不是感觉跟保安的灵魂三问可以媲美?🤣

“你是谁?”

“你从哪里来?”

“你要到哪去?”




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)

绝大多数人不懂的阿里黑话!

2025-03-02 00:00:00

绝大多数人不懂的阿里黑话! -王福强的个人博客:一个架构士的思考与沉淀

绝大多数人不懂的阿里黑话!

王福强

2025-03-02


在上一篇「“焦糖布丁”你妹!」下面,有同学留言:

抓手, 拉齐, 闭环

怎么说呢? 我理解他想说啥意思,但这几个阿里黑话术语,其实还是可以从字面到背后的意思关联起来的,这焦糖布丁没两三层绕,是真联系不起来…

其实,上面三个黑话,都换成英文你就好理解了。

为啥是换成英文?

一个是因为英文对单词都是unique待遇,一就是一,二就是二,没啥歧义;

第二个就是,阿里也好,字节也罢,其实背后的做事机制,很多都是来自欧美,只有组织管理层面基于本土做了因地制宜。

抓手

一提到抓手,你们是不是脑子里马上浮现这幅图?

虽然是调侃,但其实也大查不查。

做事终归需要对过程和资源进行管控,要管控总得有些工具和手段, 这就是抓手。 与之对应的英文我个人认为是handle(注意,不是handler),至于你们觉得恰当不恰当,我就不管了,我的地盘我做主🤣

拉齐

拉齐或者对齐其实就是 alignment。

一个事情大家认识不到位,参差不齐,这个事儿基本也很难推进,所以要求大家拉齐、对齐认识和认知,然后才开始推进,这个没问题啊,拿破仑军队要平推,不也得排枪队一排排对齐了才能开干嘛🤣

闭环

我一上来给闭环按了个iteration的对应关系,有同学懵逼了…

这个怪我,其实,直接上iteration,相当于多进了一层。

直接上PDCA,你可能就更容易理解了:

看到环了吗? 🤣

但是Plan-Do-Check-Adjust(我不喜欢Act这个解释,我的地盘还是我做主)这个事情是可以持续迭代,让事情的过程和结果可以螺旋上升的,所以,我用iteration来对应闭环,当然,这个升华的有点儿高,一上来可能确实对应不上。😉

小结

其它黑话其实也都有其效用和场景,就不展开讲了,毕竟,这种内容不会有啥流量,只是给少数上进的同学展开说说,大部分人都更喜欢喷这些黑话的内容,毕竟,那样的内容看起来更轻松,不用过多的用脑子。

昨天看到一个表格,说, 你写的内容只有五年级水平的人能看懂,你的内容才能被70%以上的人看, 显然,我写的以上内容得本科以上才能看,少于30%的人才能看🤣

最后,如果你正处于职场上升期,对组织管理也感兴趣,欢迎看看「福强私学」视频号付费合集里的「管理者从入门到精通」专栏。

啥? 黑话对应英文怎么说?

Jargon?




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)

用Scala编写一个MCP Server

2025-03-02 00:00:00

用Scala编写一个MCP Server -王福强的个人博客:一个架构士的思考与沉淀

用Scala编写一个MCP Server

王福强

2025-03-02


aka. Build a MCP Server with Scala

接[一篇看懂MCP])(https://afoo.me/posts/2025-02-26-mcp-explained.html) 1, 我们今天讲如何实操。

基础知识

首先铺垫一点儿背景知识, MCP的通信采用JSON-RPC 2.0规范作为wire format(为啥用英文呢?比较精确些), 交互嘛,就是Client-Server架构的RPC模式(远程过程调用,Remote Procedure Call)。

简单来说就是, 双方通信的时候该传什么数据格式,根据 JSON-RPC 2.0 规范指定。

比如, 我们如果用下面的schema定义:

{
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string",
    },
    "age" : {
      "type" : "integer",
    }
  },
  "required" : [ "name" ],
  // ...
}

那么服务器和客户端之间传输的数据可能就是这样的:

{
    "name": "Fuqqiang"
    // age 可选,不一定非要传
}

其次,与基于REST(ful)规范所用的多个endpoints的实践方式不同, JSON-RPC 2.0 用的是单一endpoint来承接所有请求(可以类比GraphQL,如果还有人记得它的话),只不过,因为MCP有两种Transport类型, 在使用SSE类型的Transport的时候(也就是HTTP),其实会设置两个endpoint来承接客户端请求,一个是常规的endpoint来承接所有请求,一个是建立SSE通道。

动手开干

有了上面两个铺垫之后,我们开始着手用Scala来编写一个MCP Server(其实用啥语言都可以,社区有用py的,有用ts的)。

我们使用Spring团队新近跟Anthropic团队(MCP背后的公司)一起合作搞的MCP Java SDK,将其加到项目的依赖中(哥用的老牌Maven):

        <!-- https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp -->
        <dependency>
            <groupId>io.modelcontextprotocol.sdk</groupId>
            <artifactId>mcp</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp-spring-webmvc -->
        <dependency>
            <groupId>io.modelcontextprotocol.sdk</groupId>
            <artifactId>mcp-spring-webmvc</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp-spring-webflux -->
        <dependency>
            <groupId>io.modelcontextprotocol.sdk</groupId>
            <artifactId>mcp-spring-webflux</artifactId>
            <version>0.7.0</version>
        </dependency>

后面两个,即mcp-spring-webmvc和mcp-spring-webflux, 根据自己喜好选就可以了,不用非得都要,一个提供同步 API,一个提供 Async 异步 API。

然后我们就可以开始编写主体代码了:

val stdioTransport = new StdioServerTransport(new ObjectMapper());
val mcpServer: McpSyncServer = McpServer.sync(stdioTransport)
  .serverInfo("my-server", "1.0.0")
  .capabilities(ServerCapabilities.builder()
    .resources(true, true) // Enable resource support
    .tools(true) // Enable tool support
    .prompts(true) // Enable prompt support
    .logging() // Enable logging support
    .build())
  .build();
Runtime.getRuntime.addShutdownHook(new Thread() {
  override def run(): Unit = mcpServer.closeGracefully()
})

val jsonSchemaGenerator = new SchemaGenerator(new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON).build())
case class Hello(var name: String)
val schema = jsonSchemaGenerator.generateSchema(classOf[Hello])

val demoTool = new McpServerFeatures.SyncToolRegistration(new Tool("hello", "say hello world", schema.toPrettyString), arguments => {
  val name = arguments.get("name").asInstanceOf[String]
  new CallToolResult(util.Arrays.asList(new McpSchema.TextContent(s"Hello ${name}さん")), false);
});

mcpServer.addTool(demoTool)

之后,打包: mvn clean package, 一个可以本地使用的MCP Server就准备好了。

NOTE

因为用了Spring boot的build plugin, 所以,mvn package直接打包成了一个可执行的jar文件,如果你不用这个插件,也可以用其他的maven插件,只要最终打包成一个可执行的uber/onejar就可以了。

你是放到Cursor里面用,还是Windsurf里面用,或者debug的时候用,直接配置如下启动命令就可以:

java -jar mcp-starter-1.0.0-SNAPSHOT.jar

后续改进

json schema的构建

我们上面的演示代码中用了如下依赖在Java或者Scala代码中构建JsonSchema:

        <dependency>
            <groupId>com.github.victools</groupId>
            <artifactId>jsonschema-generator</artifactId>
            <version>4.37.0</version>
        </dependency>

不过,个人其实更喜欢Vert.x提供的DSL:

        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-json-schema</artifactId>
            <version>4.5.13</version>
        </dependency>
    import io.vertx.json.schema.common.dsl.Schemas._ // 各种类型
    import io.vertx.json.schema.common.dsl.Keywords._ // 属性限制

    val jsonSchema = objectSchema()
    jsonSchema.requiredProperty("name", stringSchema())
    jsonSchema.property("age", intSchema())

    println(jsonSchema.toJson.encodePrettily())

启动命令

如果要推广,而不只是自己用,那么,有必要降低用户环境的依赖门槛,比如,你不能指望每个用户都得预装Java SDK/JRE,这时候,可以考虑通过GraalVM的native-image将程序打包成特定操作系统独立可执行文件。(类似golang的编译结果)

关于Transport

我们上面只是提供了Stdio方式的Transport,也就是只能本地调用, 如果企业内部,可能基于HTTP/SSE的Transport应用范围更广(当然,安全治理成本估计也会更高)。

写在最后

如果说过去的计算机系统都是通过Web API来实现尽量通用的互联互通,那么,或许 MCP Server 将会是 AI 时代的Web API。

更多MCP相关内容,可以参考架构百科中的MCP条目


  1. MCP = Model Context Protocol↩︎




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)

DeepSeek这一周都开源了什么?

2025-02-28 00:00:00

DeepSeek这一周都开源了什么? -王福强的个人博客:一个架构士的思考与沉淀

DeepSeek这一周都开源了什么?

王福强

2025-02-28


首先说明下,DeepSeek这一周开源出来的所有项目,对于绝大多数公司来说没有意义,唯一的意义就是你会间接的享受到它们提供的好处,但不需要真正了解他们是怎么回事。 尤其是对于应用开发公司或者SaaS公司,更不要说传统企业。

DeepSeek开源的这些项目只对两类公司有深入了解的必要:

  1. 做AI技术基础设施的公司,包括各家云厂商
  2. 做ToB交付的方案或者项目公司,因为你家甲方大多数情况下会要求你给他私有部署,这个时候你就得有方案对接并有实施能力

该说的说完了,如果你还想往下看,那说明你属于这两类公司的一员 ;)

第一天开源了 FlashMLA

MLA是多头注意力的缩写(Multihead Latent Attention), FlashMLA就是服务于AI计算的一种内存/显存优化方法。

说简单点儿就是怎么省内存,花小钱办大事儿, 硬件烂点儿没关系,咱可以用FlashMLA来优化硬件的使用,让小马拉大车。

谁让咱禁运前就有万张老款GPU呢,得好好压榨下呀,😉

第二天开源了 DeepEP

DeepEP is a communication library tailored for Mixture-of-Experts (MoE) and expert parallelism (EP). It provides high-throughput and low-latency all-to-all GPU kernels, which are also as known as MoE dispatch and combine. The library also supports low-precision operations, including FP8.

有些时候觉得吧,干计算机跟tmd种地没啥区别,都是地块跟路的问题。(嘿嘿,开玩笑啦)

  • 内存是地,内存与内存之间通信的bus是路;
  • (单台)计算机是地,连接计算机的网线是路;

要让庄稼长得好就得优化土质, 这就是第一天开源的FlashMLA干的事儿;

要让庄稼收获了能快速流通,就得路宽路好跑, 这就是DeepEP干的事儿;

DeepEP就是个优化通信效率的库

第三天开源了 DeepGEMM

“DeepGEMM”是与矩阵运算(GEMM 通常代表“General Matrix Multiply”,即通用矩阵乘法)相关的高效算法或工具,专门用于加速深度学习模型的训练或推理过程。矩阵乘法是深度学习中的核心操作,尤其是在 Transformer 模型(像 DeepSeek 的 V3 或 R1 这样的 LLM)中占据了大量的计算开销。

纯AI领域的核心库,优化矩阵计算,太高深,略过 🤣

第四天开源了 DualPipe 和 EPLB

DualPipe 是 a bidirectional pipeline parallelism algorithm for computation-communication overlap in V3/R1 training.

简单来说就是,AI底层计算通常前者两个关键指标:

  1. Pipeline
  2. Parallelism

Pipeline管串行, 但一个个排着走效率不行,所以,一般会错峰出行,通过多条Pipeline编排来提高效率,我估计DualPipe就干这事儿(非专业领域,不保证准确)

至于EPLB则是 an expert-parallel load balancer for V3/R1.

说得挺清楚了,R1是MoE模型, 专家模型之间并行运行的负载均衡器(load balancer, 简称LB)

第五天开源了 3FS

Fire-Flyer File System (3FS) - a parallel file system that utilizes the full bandwidth of modern SSDs and RDMA networks.

模型训练和推理需要很多数据存储, 估计原来传统的分布式文件系统不能满足需求? 所以自己重新搞了套分布式文件系统3FS, 专门为AI场景优化的。

据说单节点基于DuckDB? 这个我喜欢,单机分析神器,之前我也介绍过。

小结

看文章开头🤣




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)

“焦糖布丁”你妹!

2025-02-28 00:00:00

“焦糖布丁”你妹! -王福强的个人博客:一个架构士的思考与沉淀

“焦糖布丁”你妹!

王福强

2025-02-28


在产品以及营销领域经常听到一个词儿叫“焦糖布丁”理论,说的是,顾客买你家的电钻,不是真的需要电钻这个产品,而是为了在墙上钻个洞。 假如他是超人,能用手指头戳一个洞出来,那么,他也不需要电钻这个产品。

也就是,顾客买你的产品,其实是为了完成某项工作(达成某个目的), 产品本身不是目的。

这个理论正式名称叫Jobs to be done,也就是“需要完成的工作”。

也不知道哪个大聪明把Jobs to be done先首字母缩写为JTBD,然后再用拼音搞了个联想,弄出来个焦糖布丁(jiāo táng bù dīng)理论,这tmd跟学渣背单词搞的小抄有啥区别?

最搞笑的是,tmd还流行起来了。

试问下各位做产品或者营销的同学,你们真的理解这“焦糖布丁”到底怎么来的嘛? 这中间绕了起码3层…

你们不是天天声称Don’t make me think吗?

我不think,我都搞不清楚这焦糖布丁跟jobs to be done怎么挂钩上,更搞不清楚这焦糖布丁跟它所谓的理论背后的内容怎么挂钩上。

也怪不得有人讨厌简体西文,学渣话语体系的东西(还tmd自诩叫说人话),能学到啥真材实料啊,都是套了又套,把你绕晕了正好可以浑水摸鱼?🤣

今天正好刷到一个短视频: 「换一种说法的不同结果」

以前土匪抢劫,抢劫这个词儿不好听,所以改叫劫富济贫;

流氓杀人呢,杀人也不好听,所以改叫替天行道。

大概就是这么个生态吧~


补充内容:

有人说,焦糖布丁这个术语就跟爱马仕或者保时捷一样,只是社交货币或者meme那样的效用,这个我当然知道。

但这篇文章是要深究这个词儿背后到底怎么来的,所以,不是借这个词儿扯淡。

我现在不喜欢聊天,因为大部分聊天都是扯淡,对面那个人干没干过,有没有真材实料,几句话就清楚了。 我现在更喜欢跟有切身经历、真正做过事的人聊,而不是为了什么情绪价值互相吹牛逼。

扯淡很容易,做事则不然。

只是呈个口舌之快,又有什么意思呢?

毕竟, “言多生嫌,福过招灾”




「福强私学」来一个?

「福强私学」, 一部沉淀了个人成长、技术与架构、组织与管理以及商业上的方法与心法的百科全书。

视频号 付费合集

footer img for kb.afoo.me

开天窗,拉认知,订阅「福报」,即刻拥有自己的全模态人工智能。

订阅「福报」
Copyright © 王福强个人版权所有 - Since 2004 (Everything is homebrewed with Pandoc and Markdown, little Scala also included.)