务实

2026-08-06:几道题背后的知识断层

今天面试碰到的三个问题,我以前都读过资料,也写过笔记。可面试官继续追问节点故障、取消信号怎样落到子任务、最近邻到底算了什么时,我就接不下去了。

自适应学习 里有一个“点亮技能图”的比喻。这次才看清,节点亮了只说明我见过它。面试官把条件改成“上下游同时挂掉”,我说不清哪些状态还在、恢复从哪里开始;沿着 Run 追到子 Agent,取消信号停在哪一层也不清楚;让我从一个查询向量开始算最近邻,我又退回了几个算法名。

以后补一个技术主题,我不再把“知道术语、记得结论”当作完成。笔记里要留下这些可以亲手检查的东西:

  1. 用一个具体场景写清谁在依赖它,以及失败时对方会看到什么。
  2. 画出参与对象和状态,标明谁读、谁写、状态存在哪里。
  3. 从一条输入开始,顺着数据和控制信号走到输出。
  4. 在链路中制造崩溃、中断、重试或并发写入,看结果从哪一步开始变化。
  5. 写清承诺成立所需的前提,以及为此付出的延迟、存储或实现成本。
  6. 用测试、log 或故障注入验证,不再以能复述名词作为理解的证据。
  • FlinkExactly-Once 是怎样实现的?
  • 如果上下游节点同时挂掉,它如何保证恢复后的结果仍然只生效一次?

我当时只答到了“依靠 Checkpoint”,没能把 Checkpoint Barrier、分布式快照、状态恢复、数据源重放和外部 Sink 的事务串成一次完整的故障恢复过程。这部分以前记在 Optimize Kinds of Resource Use

长程任务如何取消到每一个子 Agent

  • 用户在长程任务执行中途发起取消,系统如何真正停下任务?
  • Agent 已经派生出多个子 Agent 时,取消信号如何沿任务树传播?
  • 正在进行的模型请求、工具调用和外部副作用分别怎样停止或收尾?

我以前讨论过 RunSubagent taskCancellation,也见过取消令牌、父子任务、协作式中断、超时和补偿动作这些词。面试时,我仍然说不清取消信号怎样抵达每一个正在运行的子任务,以及已经发生的外部副作用该怎么办。相关笔记在 相比层出不穷的 Agent 框架,不变的 Agent Protocol 是什么

Embedding 为什么能够表达语义

  • Embedding 所谓的“语义”是怎样从训练过程中形成的?它能保证什么,又不能保证什么?
  • 为什么两个相似词语会在向量空间中形成相近的位置或方向关系?
  • 一次最近邻搜索具体计算了什么?暴力 KNN 怎样遍历和排序,ANN 又牺牲了什么来换取速度?

余弦相似度、KNNANNHNSW 和倒排索引,我以前都记过。可一旦离开公式和索引名称,要从一个查询向量开始讲清训练目标、向量关系和最近邻计算,我还是停住了。语义表示从 one-hotWord2Vec 到上下文向量的变化整理在 Transformer,最近邻的计算和索引仍记在 vector-database

以往记录

  1. 帖子1

  2. 关于私有方法的测试,你有什么看法?平常你是怎么做的?这个没有固定答案,主要看你对单元测试的思考.

  3. 某些时候你对代码的优化可能使得你发现了错误或者提高了下一次需求的开发效率.你有过这样的时候吗?可以举个例子吗?(即如何利用了自己学到的知识) 业务方需要查看更多的字段信息,本来以为需要一顿操作,但因为之前定义的方法职责很清晰,所以简单替换了一个方法名就完成了该需求.

  4. IPC 和 RPC 的实现方式有哪些,有什么不同,为什么会有这些不同?

  5. UDF 在数据库中如何运行机制如何,对其使用方法有什么启示?

务虚

过去

  • 在你共事过的人中,你钦佩谁,为什么? 九霄,因为他技术好,发明了Alimock全链路mock数据的测试框架,更因为他始终对自己的作品保持谦虚,也不用它过分争取奖励.

  • 你在哪件事上发挥了超常的主动性?追问:能再给我讲一个吗? 对于业务未来方向的思考,包括和合作上下游沟通请教,从客户那里发现痛点,从日志和监控知道当前系统的不足等. 对许多事都想有提前的规划,比如百年阿里和百年技术中带头开启讨论项目和节目主题.

  • 你现在的工作好在哪里?为什么? 大平台本身的资源和基础设施完善,工作中优秀的人,以及工作的内容会接触到各种技术栈.

  • 你过去的成就? 独立地提出观点,实现这个观点;进而提出更大的想法,组织更多的资源实现它.

  • 你是如何准备这次面试的? 我整理好自己,于是也就有了面对任何面试的准备.那我是怎么整理自己的呢?…

  • 你认为当前职位最需要的3个特质是什么?你认为自己哪个最强,哪个最弱? 负责,对自己的代码,负责过的事情负责;好奇,好奇这个需求是怎么来的,合理吗,好奇每一行代码是怎么运行的?规划,明白这个岗位为什么存在,现在的价值在哪,之后要做什么? 我最负责,但最缺乏确定的规划,常常纠结,对价值本身理解不清.

  • 你与你的经理意见相左过吗?你是怎么让他相信你是对的? 数据证明

  • 分享一下你曾经遇到过的最好的和最差的老板,他们有什么不同?

  • 你把工作搞砸过吗,你是如何处理的?多分享几个? 上下游不够了解,因为粗糙的技术方案延期.(职责范围越小,犯的错误也就越小,甚至不会犯错)

  • 你的同事对你有什么误解? 我认为,当然只是猜测,他们会觉得我是一个内卷的人,但其实我只是想把份内工作做好,偶尔会在公司自主探究更多.

  • 那些对你评价不高的人一般会说些什么? 不够主动,对业务思考不够.

未来

  • 你想在下一个职位做些什么不同的事情?

  • 3年后的你和现在的自己有什么不同?

  • 有什么事情你很擅长,但你再也不想做了?

  • 你希望将你以前公司文化的哪一部分带到你的下一个公司?哪些你不希望有? 对业务价值的思考与鼓励主动立项的文化.不希望在这个过程中忽视团队中的其他人以及每个人的个人成长.

  • 你会给其他的面试者什么经验?

工作过渡期

只有在两份工作之间的间隙,人们才能完全独立地做出决定.没有哪个团队成员可以窃取他们的功劳,或者为他们出力.在他们的职业生涯中,这是唯一一次你能深入了解他们想法和动机的机会. — Alex Austin

  • 关于你最近工作的几家公司,带我了解一下:(1)你为什么离开?(2)你为什么选择了下一个? 重点在于如何讲一个好故事

  • 我们为什么不该聘用你? 如果你们想要的只是一个埋头干活的工人,那就不应该聘用我.

  • 关于在这里工作,你希望我告诉你什么?

2. 网络

  • 三次握手四次挥手
  • 输入网址发生了什么
  • http报错402,502,505什么的
  • http/https

3. 操作系统

几大组成 堆和栈 pagecache

4. Java

  • 多线程如何实现
  • Jvm内存泄漏

阿里笔试题

5. 数据库

  1. 高考考分数据库如何设计
    • 加的是什么索引
    • 数据库数据怎么导入

6. 框架

遇到哪些问题,怎么优化 hashMap 组合模式以及HashMap的设计分析

7. 算法

案例:

1 下面程序期望通过过设置stop=true,使得线程B停止,但程序未按照期望执行,请说明为什么,如下提供了三个选项,哪些选项(多选)能实现当设置stop=true,线程B停止
public class CPUCacheTest {
  private static boolean stop = false;
  public static void main(String[] args){
    Thread a = new Thread("B"){
      public void run(){
        while (!stop) {
          int a = 1;
        }
        System.out.println("exit");
      }
    };
    a.start();
    pause(100);
    //停止标记,但未能停止线程B
    stop = true;
  }
  public static void pause(int time){
    try {
      TimeUnit.MILLISECONDS.sleep(time);
    }catch(Exception ex){
    }
  }
}
a stop变量使用volatile 关键字
b 在线程B的while语句里,增加pause(1)
c 在线程B的while语句里,增加 System.out.println(stop)
2  下列代码来自俩个日志输出框架Slf4j和common log,前者有占位符,后者字符串拼接,你觉得哪个好,为什么spring源码使用了后者
log.info(" order id {},user id {}",order.getId(),order.getUserId());
log.info(" order id "+order.getId()+",user id "+order.getUserId());
3  while (true) 和 for (;;) 哪个运行快,为什么,如何验证?
4 请列出下面代码需要调整的地方
Connection conn = null;
PrepareStatement ps = null;
try {
   conn = .....
   ps = conn.prepareStatement(sql);
   this.setPreparedStatementPara(ps, objs);
   int rs = ps.executeUpdate();
   return rs!=0;
} catch (SQLException e) {
  e.printStackTrace();
} finally {
  try{
    if(ps!=null){
      ps.close()
    }
    if(conn!=null){
      conn.close();
    }
  }catch(Exception ex){
    ex.printStackTrace();
  }
}