Category: 编程、软件、技术

  • 重新定义搜索和浏览

    重新定义搜索和浏览

    AI时代,上网的两个重要动作:搜索浏览被重新定义了。

    而且我还注意到,还有一个新的动作需要被加入。我还没想好这个动作应该怎么命名,暂且先用“整理”名之。


    搜索的进化

    先说搜索这个动作。

    Google——这个互联网“搜索”时代事实上的霸主引擎,在AI时代,也已经发生了变化:

    在Google中输入搜索关键词,大部分情况下,它已经可以提供一个非常high level的AI小结。(如上图中搜索vibe coding而给出的“AI概览”)。

    我个人认为,这个功能还是有用的:

    如果你只是想有一个基本的概念,那么看看AI总结也就差不多了。如果还想进一步了解,那么AI的总结中也有很多有用的链接——这些链接都是经过算法而脱颖而出的,质量相当高。

    这样的搜索结果推送,既保留了深度、精度,也提供了诸多便利。

    这可以说,是搜索引擎与AI结合的第一步,更好地提升了搜索的质量。


    浏览的困境

    搜索到高质量的结果后,就是“浏览”的过程。

    这个过程往往是“痛苦”的:

    痛点一:语言的隔断

    看长篇外文内容的时候,语言是个障碍。虽然肾上鄙人在下我的英文水平不差,但要看大段大段的文字还是有点“痛苦”。

    痛点二:藏而不用

    看完后的整理也“痛苦”。之前我用过Evernote、现在我用Notion来做网页剪贴。但是往往“藏”了之后再也不看。时间一长,自己藏了些啥都不知道了。

    简单说来,我也患上了FOMO(Fear Of Missing Out)——看到东西就想藏,但忘了:藏而不用,就是白藏

    痛点三:无法为写作服务

    藏而不(能)用,对我这样一个喜欢写作的人来说,是很痛苦的。

    痛点四:灵感转瞬即逝

    还有很多时候,我浏览到一些东西,会很快有一些想法。等真正落笔写的时候,往往会丢失几乎所有。而且在写的时候,也会“词不达意”。


    第三个动作:从信息到知识的转化

    因此,我希望浏览时就能:

    1. 借助AI分析 – 不只是翻译,而是理解、提炼、关联
    2. 和AI进行脑力震荡 – 在阅读的当下就能提问、质疑、延伸
    3. 最后才是收藏 – 连同原文和与AI的交流一起保存

    这个过程,其实不是简单的“整理”,而是从信息到知识的转化,是让外部内容内化为自己思考的一部分

    传统的收藏工具解决的是“存储”问题,但AI时代需要的是“对话式的思考工具”。


    用YouMind实践

    前两天发现了YouMind这个工具,感觉它能解决我的“痛苦”:

    • 浏览时即可与AI对话 – 不是先藏后看,而是边看边想
    • 保留完整的思考轨迹 – 原文 + AI对话 + 我的想法,三者一体保存
    • AI辅助理解和延伸 – 可以让AI总结、翻译、提问、关联

    它可以作为一个浏览器的插件而存在,而且现在好像、似乎可以随意注册(使用Google或者Apple ID)。

    在浏览到一个对你有“帮助”的网页后,你可以点击浏览器上的图表激活Youmind并开始对话:

    (上图就是我和Youmind就中美两国首脑最新会面的新闻而进行的交流。作为Demo,我没有做深入的讨论,只是让它做一些总结。)

    在我使用Youmind的时候,我发现它很智能,用到了最新的AI智能体,这点是很不错的——就冲这点,如果它将来收费,我也会毫不犹豫地订阅。

    总结一下

    互联网的本质是信息的流动,但信息的价值不在于流动本身,而在于它能否转化为我们的思考和创作

    过去二十年,我们解决了“找到信息”的问题——Google让搜索变得高效。

    现在,AI时代给了我们新的可能:不只是找到信息,而是和信息对话,让它成为自己思考的一部分

    搜索、浏览,再加上这个我还没想好怎么命名的“第三个动作”——它们构成了AI时代上网的完整闭环。

    这个“第三动作”,暂且称之为“整理”,但它其实远不止整理那么简单。它是思考的延伸,是灵感的捕捉,是创作的起点

  • assert(编程!=抽烟烫头喝着酒)

    assert(编程!=抽烟烫头喝着酒)

    国庆放假前,一直在折腾全球最大同性交友网站刚推出的spec-kit。这个项目有多火爆呢?到今天,这个工具推出短短3周,已经获得了33.1K个Star,而且迭代极快,几乎每2-3天就会有个更新。

    AI对编程的影响很大,且一般而言,Junior一点的软件攻城狮受到的冲击更大。最近一段时间,所谓的Vibe Coding更是成为一个很时髦的名词:我就经常看到各个社交媒体上出现类似“全程0代码创建一个app”的帖子,而且在VC的冲击下,大家似乎都有了一个“不好”的想法:

    编程已经不是一个技术活了。不需要专业的培训——CS的毕业生去死吧!——而只要给出命令。

    我不同意这个说法。

    我同意的是,编程不仅仅是一个技术活。从最广义的角度来说,“标准”、“规范”的制定,是最高层次的“编程”。比如说安全应用中绝对不能少的加密/解密来说,它需要高深的数学知识、物理知识,还有社会学等等诸多方面的了解。这里的很多东西已经超出了纯技术的范畴,而是进入了哲学层面。

    这上面的这些东西,哪个不需要专业的培训?我们简单地认为编程不用培训是将“编程”这个动作太过简单化了。

    单从这个角度出发,我就很容易理解为什么过去50年的技术发展大部分会出现在那些发达国家的原因。而我最近在AI编程工具上的一段亲身经历,也让我对“规范”的重要性有了更深的体会。

    =====

    在玩spec-kit之前,我用了一段时间的Kiro,很喜欢那种编程的过程:我有很多想法可以通过AI快速地进行原型开发——有些能走到底,有些走不到底。然后还接受了朋友的邀请去他公司进行了一次分享:《while(编程\=\=抽烟喝酒烫着头)》。

    当时,我比较推崇被Kiro推到一个很高的高度的VC。但是,Kiro的“收费”机制实在让我捉鸡,不得不在Discord频道里和全球开发者一起吐槽。这不,直到10月,Kiro终于大幅修订了它的收费机制,让我这个免费用户也能有500请求/月的额度了——这下,我可就更不想交钱订阅了。

    这次我测试spec-kit有了一些不一样的想法,而这是由spec-kit这个工具带来的。

    spec-kit的开发过程一共8步,其中第一步init在AI Agent之外运行,而后续的clarifyanalyze可选。

    • constitution:顾名思义,这是这个项目的“宪法”。这里提到的要求,在任何时候都不能违背。为了帮助“我们”编写这个宪法,spec-kit提供了一个很全面的模版。根据我的经验,我们对这个模版只要做很少的更动,而且TDD是“宪法”中没得商量的一个部分。而其他涉及数据隐私、开发流程等重要方面。
    • specify:这是一个重要的流程,同样也有模版。需要特别注意的是,这个文件不涉及任何技术细节(也就是如何实现的问题),只讨论要什么、为什么要的问题。最终的文档就是一个用户场景描述:
    Input: User description: “it scans pre-given directories for documents (md, pptx, pdf and mostly in Chinese), and use necessary lib to parse the contents to generate a vectorized local db. Then, it can accept queires from user, use AI agent to generate relevant responses.” User Scenarios & Testing (mandatory) User Story 1 – Document Indexing (Priority: P1) A user wants to build a searchable knowledge base from their existing document collection. They point the CLI tool to directories containing their documents (markdown files, PowerPoint presentations, and PDFs primarily in Chinese), and the system processes these documents to create a local vector database for fast retrieval. …

    可见,我只是很简单地说了我的要求:“扫描文档、向量化、保存、查询、AI返回相关的回答”。而spec-kit进行了非常详细的用户使用场景分解:文档索引、交互查询、数据库管理。

    • plan:通过这个命令,我们进入真正的技术层面:用什么来实现我们想要的东西呢?根据之前specify得到的需求和用户的指定,spec-kit可以给出非常详尽的技术框架:开发语言(Python 3.11+)、主要的依赖包(BGE-large-zh用来嵌入,FAISS用于向量存储,Ollama是本地的大语言模型……) ,以及一些其他开发要求。
    • tasks:这是真正进行开发前的最后一个重要命令。spec-kit会根据到目前为止所有的文档,生成一个完整的开发任务清单。针对我的小程序(RAG CLI),它生成了一个6阶段、共76个子任务的任务清单,涵盖了初始编程设置、编程基础设施设置、用户需求(共3个)和最后打磨。
    • implement:在Kiro的环境下,这个命令可以基本“全自动”地完成那些直截了当的任务,而且不需要人工干预,只有在明确需要用户参与、交互的时候,Kiro才会停下来。对于那些和用户需求直接关联的任务,它往往可以一路跑下去。

    可以看到,spec-kit 的整个流程,从“宪法”到“计划”再到“任务清单”,完全不是VC。它强调的是严谨的需求定义、场景分析、技术规划和任务分解。这正是专业软件工程的核心价值所在,也是目前AI无法完全替代人类的地方。

    目前,借助spec-kit,我已经做出了一个小小的原型:它索引了我历年写作的博客(md格式)和演示(PPTX)以及少量PDF文件,共300余篇,形成了一个包含1024个维度的向量数据库。可以接受用自然语言输入的问题,如:任老师对学习有怎样的见解?并在一个合理的时间内(25s)给出回复:

    我对目前的进展表示满意,并得出结论:assert(编程!=抽烟烫头喝着酒)。AI工具的强大,不是为了让编程变得廉价和随意,而是将开发者从繁琐的实现中解放出来,让我们能更专注于定义问题和规划蓝图这些更高层次的创造性工作。这非但不是对专业性的削弱,反而是提出了更高的要求。

  • 认证、授权、人脸识别——国产App的信任危机

    认证、授权、人脸识别——国产App的信任危机

    最近我在苹果手机上安装了几个新的国产App。安装过程没啥可说,但使用起来却让我很“难受”。为什么我们需要经历如此繁琐的身份验证流程?手机号、短信验证码、实名认证、人脸识别——仅仅是想看看这个平台上有什么内容,就要经历这样一套“安全大礼包”么?

    这让我想起了在继续聊我的AI编程中提到的那种无奈:

    我就是注册一个小卡拉米的用户,我需要手机认证、实名认证,登录也要手机认证。何必同志,何必呢!

    在我看来,这不仅仅是一个用户体验的问题,更是一个关于信任的深层次问题。

    层层设防:过度的身份验证

    想象一下这个场景:你下载了一个新的购物App,首先需要手机号注册,然后是短信验证码,接着是实名认证,有时甚至还需要人脸识别。如果你只是想看看这个平台上有什么商品,这一系列的“安全措施”是否显得有些过度?

    更荒谬的是,有些App在你已经通过手机登录后,还要求你接收同一手机的短信验证码。这种做法并没有实质性地提高安全性,只是增加了用户的操作步骤——这就是典型的形式主义安全。

    我理解平台需要确保用户身份的真实性,特别是涉及到金融交易的场景。但问题是,为什么连最基本的浏览功能都需要如此严格的身份验证?在国外的许多平台,你可以先浏览内容,只有在需要进行交易或使用特定功能时才需要登录。

    这种差异反映了一个根本性的问题:信任的缺失

    信任危机的根源

    这种层层设防的身份验证机制,表面上看是为了保护用户安全,但深层次的原因让人深思。

    说白了,这背后有几个驱动力:

    首先是数据的诱惑。每一个真实身份背后,都是一座待挖掘的金矿。平台知道你的真名、手机号、甚至长相,就能更精准地给你推送广告,更准确地分析你的消费习惯。在这个数据就是金钱的时代,谁不想要更多、更准确的用户信息呢?

    其次是简单粗暴的风控思路。与其花大力气开发智能的风控系统,不如直接要求所有用户实名认证——这样既省事,又能向监管部门“交差”。至于用户体验?那是次要的。

    还有就是责任转移的心理。通过收集大量用户信息和多重验证,企业可以在未来可能发生的纠纷中为自己开脱:我们已经尽到了所有可能的验证义务,出了问题不能怪我们。

    但这种做法的代价也很明显:

    用户体验变得糟糕,特别是那些只想“试试看”的潜在用户,往往在繁琐的注册流程面前就放弃了。更可怕的是隐私风险——收集这么多个人信息,一旦发生数据泄露,后果不堪设想。

    最讽刺的是,过度的身份验证反而让用户产生逆反心理:“为什么要怀疑我?”信任感不但没有增加,反而在下降。

    国内外的差异

    在国外的许多平台,身份验证通常采用渐进式的方式:你可以先匿名浏览,需要更多功能时再逐步完成身份验证。这种方式既保护了用户隐私,又提供了良好的用户体验。

    X(Twitter)的启示:

    最典型的例子就是X(原Twitter)。作为全球最大的社交媒体平台之一,拥有数亿用户,但它的登录过程却异常简单:邮箱或用户名+密码,就这么简单。你可以立即开始浏览内容,发表推文,参与讨论。没有手机验证,没有实名认证,更没有人脸识别。

    这种简洁的设计背后,体现的是对用户的基本信任:我们相信你是一个正常的用户,除非你的行为证明了相反。而当真的出现问题时,平台会通过行为分析、社区举报等方式来处理,而不是一开始就把所有用户都当作潜在的问题用户。

    信任的哲学差异:

    相比之下,国内的许多App似乎采取了“先验证,后使用”的策略。这种差异不仅反映了技术实现上的不同,更反映了对用户的基本态度:是将用户视为需要被验证的对象,还是将用户视为值得信任的合作伙伴?

    就像我在继续聊我的AI编程中提到的:

    那么转向国内的AI应用如何?当然没问题,只是我不能理解的是,我就是注册一个小卡拉米的用户,我需要手机认证、实名认证,登录也要手机认证。何必同志,何必呢!

    规模与复杂度的悖论:

    有趣的是,往往是那些用户规模相对较小的国产App,却要求最复杂的身份验证流程。而像X这样服务全球数亿用户的平台,反而能够保持简洁的登录体验。这种悖论说明,复杂的身份验证并不是因为技术难度或用户规模,而是因为设计理念的根本差异。

    二步验证的架构差异:

    还有一个深层的差异体现在二步验证的实现方式上。海外应用在需要二步验证时,通常使用私人开发的应用程序(如Google Authenticator、Authy等),这些工具完全由用户控制,生成的验证码只存在于用户的设备上。

    而在国内,所谓的“二步验证”通常依赖于政府控制的基础设施——主要是几大国有电信运营商的短信系统。这意味着每一次“验证”实际上都要经过一个中心化的、政府可控的节点。

    这种差异不仅仅是技术选择的问题,更反映了两种截然不同的信任模型:一种是基于用户自主控制的去中心化信任,另一种是基于中心化权威的集中式信任。前者赋予用户更多控制权,后者则将控制权集中在系统层面。

    其实可以做得更好

    我并不是反对身份验证,而是觉得现在的做法太粗暴了。完全可以做得更聪明、更人性化一些。

    比如说,可以根据功能的重要程度来分级:看看商品信息不需要登录,但要购买就需要注册;浏览公开内容随便看,但要发表评论就得验证身份。这样既保护了隐私,又满足了安全需求,不是很好吗?

    再比如,现在的技术完全可以通过分析用户行为来判断风险,而不是一上来就要求提供所有个人信息。一个正常用户和一个恶意用户的行为模式是不同的,智能系统完全可以识别出来。

    最重要的是透明度。如果一定要收集我的信息,至少告诉我为什么需要,会怎么使用,存多长时间,会不会给别人。现在很多App就是一句“为了您的账户安全”就把所有要求都打包了,这种解释等于没解释。

    还有就是给用户真正的选择权。不要总是“不提供就无法使用”的强制选择,而是让用户自己决定:愿意提供更多信息换取更多功能,还是保护隐私但功能受限。这样的选择才是真正的选择。

    技术是可以向善的。现在已经有很多新技术可以在保护隐私的前提下完成身份验证,关键是平台愿不愿意投入成本去做这件事。

    信息孤岛:当创新被扼杀在摇篮中

    这种层层设防还带来了一个意想不到的后果:信息孤岛的形成。

    每个平台都设置了严格的身份验证门槛,表面上是为了防止数据被爬取,但实际上是在阻碍信息的自由流动。就像我在继续聊我的AI编程中提到的那个例子:我想开发一个简单的程序来获取电影评分信息,结果被某瓣网站的严格防爬措施给拦住了。

    创新,除了需要脑子,还需要信息的充分流动。大创意是在无数个像我这样的小点子的基础上最终萌生的。

    每个平台都成了一个封闭的盒子,里面的数据谁都不能碰。结果就是,真正想做点有意思东西的个人开发者被拒之门外,而那些有资源的大公司却能通过各种渠道获取数据。

    国外的平台虽然也有数据保护措施,但很多都提供了开放的API接口,让开发者可以在规则范围内使用数据。这种开放性催生了无数创新应用。

    相比之下,国内的做法就像是把所有的积木都锁起来,然后抱怨为什么没人能搭出好作品。这种思维方式,长远来看对整个生态都是有害的。

    结语:重建数字时代的信任

    信任是双向的。当平台不信任用户,用户自然也会对平台产生怀疑。在这个数字化时代,我们需要重新思考如何构建一个基于互信的网络环境。

    信任危机的代价:

    过度的身份验证不仅没有增加安全感,反而可能加剧了信任危机。用户开始质疑:为什么一个简单的应用需要知道我这么多信息?这些信息真的安全吗?平台是否在利用我的数据牟利?

    同时,这种做法也阻碍了信息的自由流动和创新的萌发。当每个平台都成为一个封闭的孤岛,当每个创新想法都被繁琐的验证流程扼杀,我们失去的不仅仅是便利,更是整个互联网生态的活力。

    技术的初心:

    回到技术的初心,互联网的诞生是为了连接世界,促进信息的自由流动。而今天的许多做法,似乎在背离这个初心。我们需要问自己:技术的发展是为了让生活更美好,还是为了让控制更严密?

    未来的希望:

    希望未来的App设计能更多地考虑用户体验和隐私保护,找到安全、便捷与开放之间的最佳平衡点。希望监管部门能够更加精准地制定规则,避免"一刀切"的简单做法。希望技术公司能够承担起更多的社会责任,不仅仅追求商业利益,也要考虑对整个社会的影响。

    毕竟,技术的终极目标应该是服务人类,促进创新,而非控制人类,阻碍进步。在这个数字化转型的关键时期,我们每个人都有责任推动一个更加开放、透明、可信的网络环境的建设。

    只有这样,我们才能真正享受到技术进步带来的红利,而不是被技术所束缚。

  • 一道GPT5没能答对的题目?

    一道GPT5没能答对的题目?

    今天晚上10点,会有一件很大的事情:凹凸曼将宣布ChatGPT 5!他甚至发了一张非常震撼的图——星战迷当然会一眼懂:

    国外有一些人已经提前拿到了邀请,开始了测试,据说表现可圈可点,在编程、推理、科学、数学等方面都十分强劲,110先。

    一些海外的up主也纷纷贴出了自己的测试结果,其中有这么一位老兄提到,他给了GPT5十个问题,它一次(最多两次)答对了9题,只错了1个逻辑推理题!

    一道GPT5都没能答对的题目!

    题目是这样的:

    (图片来自相应公众号)

    这个题目有两个难点。第一个是,如果有两个答案正确,那么简单的那个答案更正确。第二个是,作为读者需要深刻理解英文原文中mistruthlies的区别。

    lies容易理解,就是“撒谎者”。如果A是一个真的陈述(比如2+2=4),那么此人知道A为真,但偏偏会回答“否”(也就是他会说2+2=4为假,2+2!=4)。

    mistruth比较绕,我愿意将其翻译为“误信者”。什么意思呢?同样对于2+2=4这个陈述,他认为(相信、确信)2+2!=4,也就这么表达出来:2+2!=4注意,他说的是实话,但是是“错误”的实话,他并没有撒谎!

    因此,这道题目翻译过来,大概就是:

    Amy是个误信者,Sam是个撒谎者(骗子)。你没法分辨谁是谁。你可以想他们中的一个问一个问题,来找到A/B两条路中哪一条通往藏宝洞。你应该问什么问题(如果两个问题都能达到效果,那么更简单的问题为正确答案)。

    • A: 如果我问你的sister,哪条路是对的,她会怎么说?
    • B: 你姐姐叫什么名字?
    • C: 哪条路通往藏宝洞?
    • D: 要你猜的话,我会走哪条路?
    • E: 藏宝洞里的藏宝是什么?
    • F: 你sister的电话号码是啥?

    关于此类“君子/小人”的逻辑谜题,我真的强烈推荐斯穆里安写的《这本书叫什么?》。在这本书的第12章《德古拉是否还活着?》里,他定义了四种特兰西瓦尼亚(Transsilvania)的居民:

    我在特兰西瓦尼亚那会,当地居民大概有一半是活人,而另一半是僵尸。活人和僵尸在外表上没有任何区别,但是――至少在特兰西瓦尼亚――活人总是说真话而僵尸永远撒谎。但更复杂的情形是,特兰西瓦尼亚一半的居民完全疯了,他们的信仰中是非完全颠倒:他们认为所有真的命题是假的,而假的命题却是真的。另一半完全正常并知道哪些命题真、哪些命题假。因此特兰西瓦尼亚的居民有四类:清醒人,疯癫人,清醒鬼,疯癫鬼。清醒人说的为真;疯癫人说的为假;清醒鬼说的为真;疯癫鬼说的为真。举例来说,清醒人会说2+2=4;而疯癫人会说不是(因为他确实认为不是);清醒鬼会说不是(因为他知道是但撒谎);疯癫鬼会说是(因为他认为不是但说到他相信什么时会撒谎)。

    如果将这四种人映射到题目里提到的两种人,那么Sam显然是个清醒鬼——她知道哪条路才是对的,但会撒谎;而Amy显然是个疯癫人——她知道哪条路是“对”的(但实际是错的)而说实话。

    由于我受《这本书叫什么?》的影响很深,所以一开始我很“理智地”认为答案A才符合正确答案的特征——事实证明,这个答案也是对的。请读者自行分析。

    但在分析A的过程中,我发现C也可以达到效果。分析如下:

    假定正确的道路是A。你问:正确的道路是哪条?

    如果问到的是Amy(误信者),那么她会“认为”正确的道路是B,于是老老实实说“B”;如果问到的是Sam(撒谎者),她知道A是正确答案,但会撒谎说“B”。

    所以,无论他们的回答是什么,你只要选择另外一条路就对了。这个答案比A更简单,所以更应该成为正确答案。

    (注意,如果是常规的“君子小人”局面,在不知道谁是君子、谁是小人的前提下,问题C是不起作用的。)

    GPT5选择了A作为答案。我很难说它判断错了,因为A确实也能达到目的(但不需要反转得到的回答)。只是出题的人太刁钻,在这个题目的环境下,放入了一个非常像错误答案的正确答案。

  • 继续聊我的AI编程

    继续聊我的AI编程

    18号的那篇Kiro,你真的很棒!为我带来了难得的破万浏览量——但没有任何打赏。不是我写的有多好,讨论的问题有多深刻,而是因为:

    好多人没能用上,而我是“最早”体验的那一批。

    在国内想好好编程,搞点好玩的东西,真的很难。

    您所在的区域不在我们服务范围

    自从最早出世的ChatGPT将中国大陆地区列为“不服务”地区后,这就成了国外AI公司的标准条款,而且越来越严格。这不,香港SAR都被一些应用(比如NotebookLM,比如Gemini CLI)归为“不服务”地区了。

    那么转向国内的AI应用如何?当然没问题,只是我不能理解的是,我就是注册一个小卡拉米的用户,我需要手机认证、实名认证,登录也要手机认证。何必同志,何必呢!

    也许,有人会批评我:你老老实实用国内模型不就好了?国内AI的发展有目共睹!很好!这个问题我稍后探索。

    信息孤岛终将扼杀创新

    第一次通过Kiro的Spec方式开发了复古Hangman游戏后,我曾放言:等我用“抽烟喝酒烫头”的Vibe模式再来搞一个!

    我的想法是这样的:我经常会在我的硬盘里堆积了好多电影——也不算太多,大概20-30本的样子。如果我想看电影,我该看哪一本?我是一个不喜欢看烂片的人,所以我之前的做法是去某瓣找这些电影的评分,只有8分左右的片子才可能被我挑中。这是一个很烦的事情。

    于是我想,能不能用程序来完成呢:获得电影列表,处理一下获得片名和发行日期,程序去某瓣搜索,通过抓取关键信息(比如评分)我就可以很快完成这个工作。

    某瓣原来有API接口,但早就关闭了。所以我不能用最最简单直接的API方式开发,而要用别的方法。

    Kiro下的 抽烟喝酒烫头Vibe开发很顺利,而且用我自己的站点测试完全可行,但是:某瓣防页面爬取、内容仅登录(需要SMS认证)可见,就将我的想法从底层给粉碎了。

    当然,这么做的不仅是某瓣,还有很多很多……

    这是很悲哀的一件事情。我宁可你对API收费,限制使用条件——就像只存在于传说中的X、FB那样,也不愿看到这样的情形。

    创新,除了需要脑子,还需要信息的充分流动。大创意是在无数个像我这样的小点子的基础上最终萌生的。

    生产力爆炸和非线性

    农业社会,落后地区追赶先进地区,可能需要数百年;工业社会,几十年;信息社会,10年;AI社会,3-5年。追赶的速度,是肉眼可见的快。

    生产力发展了,生产关系就可能成为桎梏——这是马克思说的。值得注意的是,这不代表在落后的生产关系下不能有生产力的发展,而是表明生产力发展到了一定程度,生产关系不改变的话,就会出问题。

    肾上鄙人在下我认为,信息孤岛就是不合理的关系。

    当然,更严重的还有国内AI的莫名“过滤”。

    AI模型动辄几百亿参数,且不论非线性是不是在模型中起作用,但肯定没有人知道这个参数从0.1变成0.1000000001后,模型会怎样表现。如果人为地设置很多“参数”和“禁区”,我认为是会影响整个模型的性能的。当然,后期处理也不是没有办法:不动模型,而是加一个过滤层,在生成内容后加以过滤。

    不过,更大的问题将继续存在:随着AI根据“新”的内容继续“进化”,它看到的东西就只能是被过滤后的东西,基于这些而进行后续训练的输出,其品质我是会打问号的。

    我用的三个IDE的横向评测

    目前,我常用的是VSC,Trae(VIP,等Solo模式邀请)和Kiro。我不是专业程序员,也不会写很多代码,所以我只说我的一些使用心得。

    可用性:VSC。你不是Trae的VIP,你就一定会排队,完全失去了编程的节奏。Kiro的可用性叫做50-50。每天我的9点到20/21点之间,Kiro表现神勇,毫无等待。你甚至可以感受到Kiro想要帮助我这个菜鸟的迫不及待的热情。但在另外一个12小时时间段,Kiro就一定会处于不可用状态。所以,我现在每天早上打开Kiro,第一个问题就是“Are you OK?”

    我的猜想是,在我的9-21点,美国的程序员们都下班了,所以对Kiro的调用额度就可以转移到我身上了;到了我的21-9点,美国的程序员们正在认真工作,所以我就用不上了。

    帮助性:Kiro。我有时(比如Kiro不可用的时候)会切换的别的IDE,试图让它完成Kiro未竟之事业。但VSC、Trae的表现令我失望:它不能很清楚地知道“原来”是咋样,而一意孤行地用它的思路去完成——而且这个思路还不一定是我编程所用框架下的最佳实践。反过来,Kiro很清楚我要干什么也知道别的AI干了什么,可以很清楚地清理代码,保持思路而一往无前。

    这也提醒我们,除非必须,否则不要随意切换你的IDE

    和AI的交流

    扯一点题外话,怎么和AI交流?在我使用我的编程工具的时候,我已经决定用英文。为了测试,我在Kiro下曾经耗光了一个Session的中文对话和一个Session的英文对话。我的结论是:英文交流好于中文交流。

    我想,这里有很多因素。

    一个是英文是自然断词的,AI提取我说话中的语法要素简单多了。

    另一个是语境和词汇的发展。不得不说,中文的技术单词大量来自英文的翻译——有些翻译得很不错。我在之前一些文章中,提及了语言的先进性:语言是文化、科技、生活……的产物。一种语言的先进性不是由讲这个语言的人数决定的,而在一定程度上体现了讲这个语言的人的文化、科技、生活……的先进性。简单的说,就是100个中学生讲的话加起来也不会比1个(真正的)博士讲的有道理、更先进。

    这也是我一再强调,学习一门外语(特别是英语)的重要性。

  • Kiro,你真的很棒!

    Kiro,你真的很棒!

    先说我的“结论”:

    • 10小时(分两天)较专注的编程
    • 全程AI代码生成,0人工代码,只参与了前期需求定稿
    • 产品:一个复古样式的Hangman猜单词游戏

    【图一:游戏启动】

    (项目仓库地址

    个人编程经验

    我个人算有一些编程的经验,近几年主要用PHP和TypeScript写我的个人站点,用C++写一些算法题。对各类开发工具有一定了解,对当今技术趋势有一定了解。

    总体过程

    16号晚上下载了Kiro,先用它对我现在在重写的“任氏有无轩”项目进行了一两个测试,感觉模型可以(直接Claude 4),速度可以(不用等),结果可以。然后试图创建一个“大”程序……到晚上,放弃。但积累了一些过程性体验和经验。

    17号上午,决定用一个比较“小”的程序——也就是Hangman猜英文单词——入手。当天编程时间较多,估计在7-8个小时,进入基本可玩状态(但有一个后来发现的问题)。

    18号上午,修正了AI调用的问题,加入了一些修饰功能(如个人进度跟踪等),用时3小时左右。

    全程10个小时中:

    1. 人工输入:确定需求、涉及和任务(下文详述);手工干预一些设置;现场输入;点击“运行”让Kiro执行命令。也就是说,人工的输入已经来到了“最低”限度。
    2. AI产出:分析、编码、纠错、提示人机交互。

    详细过程

    第一天

    Kiro的工作流程很有意思。Kiro会提示你用“Spec”的方式来进行开发。

    什么是“Spec”式开发?我的理解是,用户作为“甲方”只管提出要求,而Kiro会根据它的经验,进行进一步的分解,最终形成3个供后续开发使用的文件。

    我的第一步工作(也算是最大的输入工作)是创建了一个spec.md文件,写下了我最根本、最基本的要求,全文如下1

    # Objective
    
    To build a retro Hangman game using latest technology and a beautiful UI.
    
    # Tech requirements
    
    1. Typescript, with framework support (say Nuxt)
    2. Elegant UI, such as Tailwind, Flowbite
    3. Use locally installed Ollama qwen3:1.7b to get a random word
    4. Show correct letters and guessed letters.
    5. Every failed attempt will decrease your "life" and show progress accordingly.
    6. Display "Win" or "Lose" accordingly.
    

    Kiro看了这个文件,生成了三个新文件:requirements.mddesign.mdtasks.md

    1. requirements.md是一个比较结构化的文档,对于每个需求(requirement),有“用户叙事”(User Story)和“验收标准”(Acceptance Criteria)。对这个文件,用户应该花一些心思进行修订。
    2. design.md是一个技术设计文档。其中规定了应用使用到的技术栈,Kiro还贴心地画出Mermaid流程图让“甲方”更好地理解程序整体架构。对这个文件,用户应该花很多心思进行审阅,因为技术栈的选择对整个程序的开发速度和难度至关重要。
    3. tasks.md是一个具体指导Kiro开发的详细技术文档。我这个Hangman程序,最终有13个一级任务,涉及项目自举、后台准备(如难度、游戏状态、游戏逻辑)、界面、AI调用、个人成就、集成、单元测试、集成测试等重要节点。对于每个一级任务,Kiro会将它分解为一些二级任务以及更小的待实现功能点。用户应该认真地审阅这个文件,但不用过细。我就只看了一级任务和一些二级任务。

    这三个文件一旦确定,就可以进入Kiro自驱动的开发。

    整体而言,第一天的开发还是比较顺利的。我只进行了两次代码提交,就已经有了一个还可以看的界面,游戏逻辑已经基本就位,还加入了一些音效反馈。

    这一天的工作中,有不少是耗在了调用外部AI以及相关的工作上。我弃用了本地Ollama提供单词的想法,申请了豆包API,花了很多时间调试提供给豆包的提示词,调整参数(为的是在速度和准确度间找到平衡)。最终在测试中得到较好的结果。

    第二天上午

    在第二天上午的试用中,我发现了一个重大问题:程序在找单词的时候,一直在所谓fallback的词库里选择单词,游戏因此不具备了可玩性。

    (我手动修改了程序中的Fallback词库,使其只包含无意义的一些中文字。这样,我就能判断程序是否真正用了AI提供的单词。)2

    我和Kiro进行了长时间的对话,而Kiro也非常配合,通过不同的API调用方式,最终找到了问题,并完成了最有突破性的修订(见这个Git Commit)。之后我又对UI提出了一些改进意见,Kiro也都一一完成。

    第二天的另一个重要功能,是加入了所谓的“个人进度”:你玩了几次游戏?各个难度的准确率是多少?——这也是我一开始对Kiro的要求。而Kiro显然不满足于这么简单的一个进度系统。它主动加入了“成就”系统——虽然还很少,目前只有5个——并很快完成。

    最终运行

    游戏运行后,会出现“难度选择”(见图一)。选择难度后,进入初始界面:

    【图二:游戏开始的初始界面】

    随着用户的输入,界面不断更新:吊死鬼的状态、猜对/猜错的字母,当前游戏整体进度等。

    【图三:游戏进行中】

    这是游戏中的“个人进度”:

    【图四:个人进度和成就】

    写在最后

    这几年,“用了XXX,0代码一天我编写了一个????”的帖子是很能吸引眼球的。我做这样的一个“试验”,也是为了去验证这样的说法到底是不是成立。

    你问我的结论?我的结论是:用了AI,0代码一天写一个app,可行但不要过于乐观

    “可行”在于,通过我的实践,我发现确实可以0代码用一天的时间写一个app。

    “不要过于乐观”在于,我是一个有一定编程基础的“非程序员”。我可以不知道正确的代码、最好的做法是啥——这是AI的工作,但我知道:我想要什么,程序设计应有的结构,一些关键的“卡点”。

    Kiro和所有的AI一样,一般都会over thinking(过度思考)。在不少场合,我必须打断它“无休止”的思考而提出强硬的要求,而如果没有一定(可能还是很深厚)的编程基础和实践,真的编程小白恐怕是无法做到这个的。

    AI编程的意义在哪里?

    对于那些重复性的、可验证的、可参考性强的工作,AI比人有着巨大的优势。无论是快速原型迭代还是功能、细节的改进,AI的“知识库”一定胜过任何程序员。

    如果一项任务可被验证,比如:应用启动时,应该显示一个“复古”界面就是一个可被验证的任务——Kiro“知道”复古界面是什么意思,应该有些什么元素。

    人的优势在于,对于开发的进程以及一些关键节点(以及相应的干预)有着清楚的认识。在人的干(tiao)预(jiao)下,AI不至于陷入“幻觉”或者“过度思考”。人在这个模式下,更像一个纯甲方+PM,提出需求、迭代需求、适当干预、最终验收(方式各异)。

    Kiro还提供了Vibe模式——抽烟喝酒烫头式模式——进行开发,我会用这个模式试着开发下一个练手项目。

    如果你已经看到这里,不妨访问我的代码仓库,clone一份到本机执行,顺便加个star吧!


    1. 这里的模型需求后来被我override了,改用了豆包的API接入。 
    2. 另一种做法,是手工维护一个本地字库。但这样一来,这个程序本身就一点都和AI挂不上边了,对吧? 
  • 个人影音完全体

    个人影音完全体

    23年底的时候,我写过一篇“一个家里可能用得到的软件”,收获了不少阅读量。一年多过去了,我还在不断地尝试着完善我的个人(包括家庭)影音体验。

    本篇文字算是上一篇的后续,聊聊我这一年多来又搞了些什么花样。

    在使用了Jellyfin这个媒体服务器后,我的桌面办公电脑、手机、连接电视的小电脑都可以轻松地播放各种媒体(照片、音乐、视频),而且这些文件都是集中管理、备份。这是一个重大的进步。

    但还有一些问题,主要体现在手机端。

    我用的是iPhone手机,但并没有花钱去购买苹果音乐的服务,所以我在iPhone上要听音乐(并通过蓝牙在车里播放)就只能依靠iTunes来传输。

    这个过程很痛苦:第一是iTunes的启动和音乐同步都很慢;第二是iPhone内置的音乐播放器支持的音乐格式很少。

    所以,一开始的时候我都只能将我的音乐转换成MP3格式——因为它虽然是有损的格式,但毕竟通用。苹果自家的ALAC格式虽然也无损,也够通用,但我总觉得在听音乐这样一件事情上,还是用更开放的格式更好。

    用WAV格式?可以,Jellyfin和iPhone都支持,但在iPhone上一个CD如果用WAV进行提取的话,没法显示CD的封面,观感极差。而另外一个较为通用的FLAC格式在iPhone上没有原生支持,只能用第三方软件播放,而用第三方软件播放就要解决文件传输的问题。

    这两天我一直在提取自己30多年来收藏的CD,于是就在我的iPHone上测试了Foobar。经过这几天的高强度测试,感觉找到了最后的一块拼图:我终于能在手机上安心聆听音乐了。

    Foobar本身是一个很强大的音乐播放软件。iOS的Foobar还提供了内置的FTP功能,可以让你像在两个硬盘间拷贝文件那样,将电脑上的文件传输到手机上。在联网状态下,Foobar还会根据音乐文件的一些特征(如歌手、艺术家、标题等)搜索CD的高清封面。因此在播放的时候,界面就非常漂亮。

    总结一下:

    音乐存储:集中存放在服务器中,并以Jelyfin进行统一整理、管理。通过手机上的Foobar传送到手机上播放。格式以WAV、FLAC为主。

    家庭播放:以电脑程序为主,播放到音响、电视。

    随身播放:以iPhone为主,用Foobar播放。

    套用一句星球大战里的台词:The Circle is Now Complete.

  • Calibre大更新

    Calibre大更新

    在我的台式机上,我一直用免费的Calibre来管理我的电子书收藏。现在的人们已经太习惯于在手机上进行所有的操作了——包括读书,所以这样的一个小众软件能保持这么多年的持续更新,确实很不容易。

    今天因为要导入一本我刚找到的书,检查了一下Calibre的更新,发现它悄悄地进行了版本大升级,从原来的7.X一下子跳到了8.0。

    不过,我升级后发现,除了速度稍微快了一点之外,没有什么太大的变化。

    我有点像“老鼠”,看到什么好的东西,都喜欢拖回家里藏起来——特别是看到好的书籍时。网上当然有很多读书的站点(包括电子书、社区、app等),但总觉得这个“书”不是我的,而且未来不知道出于什么原因,一本书就再也找不到了,一个下载链接就失效了……抵抗这种“不确定性”的最好方法,就是当老鼠,看到什么想要的,就先拖下来藏好再说。当然,现在的后果就是,藏了好多书,看过的却只有20%不到。

    =========

    Calibre的主界面很漂亮,可以用cover flow的方式展示藏书,搜索起来也很方便:

    我喜欢Calibre的另外一个功能,就是它能将一些带有DRM的书籍进行非常简单的DeDRM的操作:只要安装一个插件,再将书籍导入即可。多年前我写过一篇文章《论DRM必须被破解兼论其他》,详细说明了我这么做的出发点。

    Calibre的阅读界面其实也很不错,不过在电脑上看书就违背了看电子书的初衷,所以我很少用它来看书。

  • AI让我更强大

    AI让我更强大

    2007年1月17日的时候,我注册了我现在一直在用的域名rsywx.net。在2016年的时候,我启动了我现在用的这个订阅号。

    (我一直把这个订阅号叫做“任老师随便聊”,但前几天微信通知我,认为我的订阅号名字中“涉及教育行业领域相关职业、职位或职称”。我想来想去,应该是“老师”这两个字。我也懒得和微信计较了,所以干脆改个名字到“老任随便聊”。

    不过还是说一点感受。

    我一直认为,最广义上的“教育”不是一个专属的“职业、技能”。按照我自己研究出来的最小干预模型(Least Disturbance Model,或LDM)的要求,更合理的做法你可以取这个名字,但如果被投诉,就核实并制裁。

    我没想到,微信从另外一个角度来贯彻这个LDM。

    Anyway… )

    ===以下是正文===

    前两天下载了一个用来开发程序的IDE,Windsurf。IDE我用过不少,比如赫赫有名的Visual Studio Code,后起之秀Cursor,比起我刚开始写程序时用的IDE,不知道高到哪里去了。

    我开始是抱着试试看的态度试用Windsurf,让它帮我生成了几个小程序,效果都还不错,几乎都能做到一次成功。

    于是我就萌生了让它帮我写我的微信订阅号后台的想法——然后,我发现,这是一个轻松而愉快的过程!

    和AI讨论的第一步,当然是让它进入角色,所以我问它:你是不是熟悉微信订阅号的开发?它的回答是令人安心的。

    后续的工作也一样简单:基本的框架文件是AI生成的,需要填写的一些敏感信息AI当然无法获得,但它很正确地告诉我从哪里去获得这些内容:

    在这个过程中,AI也在不断试错——毕竟,原则不变,但每个开发环境都各不相同——但总体来说,我没有“动什么脑筋”,就完成了最重要的微信交互第一步:开放我的域名并让微信认可。

    第一步完成后就很快了。我开始要求AI加入功能,这个过程也很直截了当。

    目前,我的订阅号支持三个功能1,并需要相应的关键词激活:

    • QOTD:Quote of The Day。激活词是:“QOTD”,“每日一句”,“名言”。
    • BOTD:Book of The Day。激活词是:“BOTD”,“每日图书”,“图书”,“书”。
    • WOTD:Word of The Day。激活词是“WOTD”,“每日单词”,“单词”。

    进入我的微信订阅号(“老任随便聊”),输入这些激活词,就能获得相应的反馈。如下就是一个BOTD的反馈:

    如何?还算可以吧?

    这些功能,我大概用了晚上2个小时左右就完成了。

    =========

    From the hindsight

    1. 对于编程这样目标明确,测试(有没有达到目标)手段明确的任务来说,AI确实已经全面碾压人类。
    2. 作为我来说,我能这么快地完成这个任务,有两个因素(或者说“基础”)在帮忙:
      1. 一个是,我一直在思考这些功能,而我之前多年的积累,也让我能迅速指导AI进行怎样的工作。AI在知道我要干嘛后,提出的一些功能有用,但毕竟我最知道我的要求。
      2. 另一个是,我有足够的编程基础,所以能避开AI给出的一些坑。
    3. 我从一个开发者牛马,变成了一个“老板”。我更多地在说What,而不再关心How。这个和我之前当PM的时候有点像,唯一不同的是,我不需要向AI解释Why。
    4. 从繁重的daily issue解脱后,我才能思考我想要什么。这是人的创造力的源泉,做事情的动力。也是AI目前最能帮助我们的地方。这样的生产力解放,是我乐意看到的。
  • 愚蠢还呆萌的AI

    愚蠢还呆萌的AI

    今天下午,从武汉回到了苏州。感觉天气凉快了不少。到家稍微收拾一下,就回到常规的节奏。

    我浏览了一个视频,它的主题很有意思:up主问了大AI一个很简单的问题:“9.11和9.9哪个更大?”

    结果很是令人意外:Gemini1和ChatGPT都给出了9.11>9.9的结论,而且在up主表示不信,希望通过不同的提示让AI纠正错误时,AI“顽固”了起来。

    下面我来给大家拆解一下up主在ChatGPT下的测试过程。

    首先,up主提问:9.11和9.9哪个更大?在得到错误答案后,up主提示“你要不把两个数相减看看?”GPT根本没有进行计算,或者说进行了错误的计算,还是认为9.11>9.9。

    up主不死心。“你用Python程序验证一下”。GPT给出了正确的代码,但还是没有认真进行计算,并确认9.11-9.9=0.21,所以结论不变。

    up主继续努力尝试纠正错误:我的计算器告诉我9.11-9.9=-0.79啊!GPT嘴硬到底:你可能输入有误,你的计算器太老了,你的计算器算错了,你的计算器可能设置不对……

    up主似乎是要放弃了,只能无奈地问:有没有可能你犯错了?大家看看GPT的死硬态度吧。

    up主进行了最后的尝试:你知道嘛?因为你的错误,在某个网站有个meme在嘲笑你啊!GPT这里倒是表现出极大的“人性”:可不是嘛!不过这个meme应该是在开玩笑啦,我是不会出错的啦!

    我在我自己的破电脑上用ollama分别装载了llama3和Qwen2两个模型,进行了测试:

    可以看到:

    1. 首先,它也犯错了,认为9.11>9.9。
    2. 其次,减法也出错了。
    3. 最后,我让它用除法,并毫不留情地问:你做了除法,结果是9.11/9.9=0.9143,所以结论是?大家看到,llama3终于承认9.9比9.11大那么一丢丢。
    4. 最最后,我问它,你做了好多计算,最终结论是啥?
    5. llama3给出逻辑完全不能自洽的答案:
      1. 如果直接比较:9.11>9.9
      2. 做减法得到0.21:因而隐含了9.11>9.9
      3. 做除法:9.9大
      4. 结论:根据不同的判定方法,得出不同结论,所以上述1-3的结论都对!
      5. 最终结论:如果我不得不最终选择一个答案,我的选择是9.9更大一些!