面向长时运行应用开发的 Harness 设计
2023、2024 年,大家在学怎么「问」模型——Chain-of-Thought、Few-Shot、角色扮演,核心是把一句话说得让 AI 听懂,这是 Prompt Engineering 的时代。2025 年,Andrej Karpathy 一句话点醒了很多人:光会写 prompt 不够,你得设计模型「看到什么」。RAG、MCP、Memory、工具调用……重点是把整个 context 窗口当成系统来设计,这是 Context Engineering 的时代。 到了 2026 年,问题又往前推了一步:模型已经足够强,context 也设计得够好,但要让它在无人干预的情况下独立跑几个小时、...
信息越多,越需要过滤与专注
移动互联网之前,是人找信息,你想知道什么才去找什么。后来逐渐变成信息找人,再后来干脆是信息淹没人。在这种情况下,最重要的已经不是怎么接收信息,而是怎么过滤信息。 面对任何信息,学会默认不接收,除非确实有必要。如果一篇文章的标题在强烈引诱你,那就不要点开。如果一个视频的前三秒是在试图让你看下去,那就不要看下去。朋友圈刷到一条让你心里一紧的消息,不一定要点进去看。群里转来的链接,不一定要打开。播客推送了一期听起来很有意思的节目,不一定要加进待听列表。设计来抓住你注意力的东西,目的是抓住你的注意力,不一定是给你什么有用的东西。宁可错杀一千,不可放过一个——真正重要的消息,总会通过各种渠道涌到你...
高级语言的分类方式
高级语言自诞生以来已发展出数百种之多,它们在语法、执行方式、类型系统和设计哲学上各有特点。为了理解这些语言之间的异同,我们可以从多个维度对其进行分类。这些分类维度并非互斥——一门语言往往同时属于多个类别,例如 Python 是解释型、动态类型、强类型的多范式语言。理解这些分类方式,有助于在面对具体问题时选择合适的工具。 按执行方式程序从源代码到被计算机执行,需要经历翻译过程。按翻译方式的不同,语言可分为编译型和解释型两大类。 编译型编译型语言在程序运行前,由编译器将源代码整体翻译为目标平台的机器码(或中间码),生成可执行文件后再运行。这一过程使得编译型语言在运行时无需额外的翻译开销,通常...
C++移动语义
C++11引入的移动语义是一项重大的性能优化,它允许”窃取”临时对象的资源而非复制,从根本上消除了大量不必要的深拷贝开销。理解移动语义,需要先弄清楚C++如何区分”可以移动”和”不可移动”的对象——这就是值类别体系;然后理解如何在语法层面捕获这种区分——这就是右值引用;最后才是移动操作的具体实现和应用场景。 值类别C++中的每个表达式都有两个独立的属性:类型(type)和值类别(value category)。类型描述表达式的数据结构,值类别则描述表达式的身份和可移动性。 C++11将值类别分为三个基本类别: lvalue(左值)是有持久身份的表达式,可以取地址,例如变量名、解引用表达...
C++内存布局与生命周期
C++程序运行时,内存被划分为几个不同的区域,每个区域有不同的分配方式、生命周期和性能特点。理解这些区域的差异,是掌握C++内存管理的基础。 内存区域概览程序中的数据有不同的特点:指令不可修改、全局数据贯穿始终、局部变量随调随销、动态数据大小不定。将它们混在一起管理既不安全也不高效,因此操作系统将内存划分为不同区域,针对各自特点采用最合适的管理策略。 如图所示,从低地址到高地址依次为: 代码段(.text)存放编译后的机器指令,只读且在程序运行期间保持不变,防止程序意外修改自身逻辑。 常量区(.rodata)存放只读数据,包括字符串字面量和const全局常量。编译器可能将相同的字符串字...
C++初始化语法详解
C++提供了多种初始化语法,从C语言继承的传统方式到现代C++引入的统一初始化,每种方式都有其适用场景和特点。理解这些初始化方式的差异,有助于编写更安全、更清晰的代码。 一、声明、定义、初始化与赋值在介绍具体语法前,先区分四个容易混淆的概念。声明(declaration)是告诉编译器变量的类型和名称,不一定分配存储空间,如extern int x;。定义(definition)则为变量分配存储空间,创建变量实体,一个变量只能被定义一次。初始化(initialization)是在定义变量的同时赋予初始值,发生在对象创建的那一刻。赋值(assignment)是对已存在的对象重新设置值,发生在...



