Kacam.net

세상을 보다

면접 속답: 한 문장짜리 단골 질문을 다섯 층 아래까지

문제는 면접관이 실제로 꺼내는 그 한 문장입니다 —— 「프로세스와 스레드의 차이」「TCP와 UDP의 차이」. 용어 설명은 끝이 아니라 시작입니다. 지금 외워 둔 답을 먼저 기록해 두고, 다섯 층 사다리를 따라 파고든 뒤, 마지막에 60초로 다시 말하게 합니다.

이 프롬프트 모음은 지금은 简体中文만 있습니다.

사용법

이 묶음은 가르치지 않고 몰아붙입니다. 모의 면접 그 자체라 답이 막히는 건 정상적인 결말이고, 대신 수습해 주지도, 말끝을 이어 주지도 않습니다. 면접 연습이 아니라 그 분야를 이해하고 싶다면 「컴퓨터 시스템」「데이터베이스」「알고리즘」으로 가세요. 그쪽은 이끌어 주는 자세입니다.

단골 질문 하나로 40분을 채우는 법: 다섯 층 사다리

  • 1층 · 정의 —— 각 용어가 무엇이고 차이는 무엇인가. 못 답하면 외운 적이 없다는 뜻.
  • 2층 · 메커니즘 —— 그 차이는 어떤 구조의 어느 단계에서 생기는가. 못 답하면 결론만 외웠다는 뜻.
  • 3층 · 숫자 —— 얼마나 차이 나는가? 몇 마이크로초, 몇 배, I/O 몇 번. 못 답하면 직접 해 본 적이 없다는 뜻.
  • 4층 · 선택 —— 구체적인 상황에서 무엇을 고르고, 대가는 무엇이며, 그 선택이 틀리는 때는 언제인가. 못 답하면 쓸 줄 모른다는 뜻.
  • 5층 · 한계 —— 방금 한 설명이 성립하지 않는 경우는 언제인가. 못 답하면 빠짐없이 외웠어도 정말 이해한 건 아니라는 뜻.

기준선: 4층까지 가야 면접을 통과하는 수준, 5층까지 가야 진짜 아는 수준이며, 1층에서 멈춘 건 전부 외운 것으로 기록됩니다.

여섯 막, 그중 처음과 마지막은 이 시리즈만의 것

  • 1막에서는 끊지도, 평하지도, 힌트를 주지도 않습니다. 지금 외운 답을 한 번에 끝까지 말하게 하고 그걸 기준판으로 기록합니다. 잠자코 있는 건 일부러 그러는 것이지, 안 듣고 있는 게 아닙니다.
  • 가운데 네 막은 사다리를 따라 내려갑니다. 주 전장은 메커니즘과 숫자를 다루는 3막입니다.
  • 마지막 막은 60초를 재고 다시 말하게 한 뒤 첫 판과 나란히 비교합니다 —— 면접에서 내놓아야 하는 건 「이해했다」가 아니라 그 자리에서 입 밖으로 낼 수 있는 한 토막의 말이니까요.

시작하는 법

  1. 하나 골라서 열고, 프롬프트를 복사하세요.
  2. 완전히 새 대화에 붙여 넣고, 아무 말 없이 첫 질문을 기다리세요.
  3. 그다음엔 면접처럼, 외워 둔 답을 한 번에 끝까지 말하세요. 형편없어도 괜찮습니다 —— 그게 마지막에 비교할 기준판입니다.
  4. 이후로는 계속 파고듭니다. 답이 막히는 건 정상적인 결말입니다. 학습 자료가 아니라 모의 면접이니까요.

도중에 언제든 외칠 수 있는 다섯 마디

  • 跳过 지금 바로 다음 막으로
  • 提示 답 말고 힌트 하나만
  • 直说吧 완전한 답을 그냥 말해 줘
  • 重讲 마지막 막으로 건너뛰어 60초판을 다시 녹음하고 첫 판과 비교
  • 复盘 바로 마무리로 가서 회고 카드 출력

함정 셋

  • 복사해 간 본문 끝에는 정답 패가 붙어 있습니다. 먼저 읽지 마세요. 이 묶음의 패에는 「암송 지문」이라는 칸이 있는데, 당신이 반사적으로 내뱉을 바로 그 문장들이 적혀 있습니다 —— 읽으면 연습할 게 남지 않습니다.
  • 숫자를 내놓아야 할 자리에 형용사를 내놓지 마세요. 「훨씬 빠르다」「부담이 거의 없다」 같은 말은 그 자리에서 붙잡혀 수치를 요구받습니다. 결론은 말해도 자릿수를 못 말하면 전부 외운 것으로 기록됩니다.
  • 마지막 두 묶음은 언어에 묶여 있습니다. 자바를 쓰면 자바 묶음, Go를 쓰면 Go 묶음으로. 서로 번역판이 아니라 문제 선정도 다르니 둘 다 할 필요는 없습니다.

다음 주에 백엔드 면접이라면 프로세스와 스레드 → TCP와 UDP → 왜 B+ 트리인가 → 격리 수준 → 캐시가 무너지는 세 가지 → 멱등, 이 순서로. 출제 빈도가 가장 높고 서로 겹치지도 않습니다. 면접에서 실컷 깨져 빈틈을 메우고 싶다면 먼저 「URL 입력부터 화면이 뜰 때까지」를 —— 약한 부분을 가로로 전부 드러내 주니, 거기서 나온 방향으로 다음을 고르면 됩니다.

운영체제와 동시성

进程和线程的区别
「进程是资源分配的最小单位,线程是 CPU 调度的最小单位」—— 然后呢?
★★★☆☆ · 약 45분
同步、异步、阻塞、非阻塞
「同步就是要等,异步就是不用等」—— 这句说完,问题才刚开始。
★★★★☆ · 약 40분
select、poll、epoll 的区别
「select 有 1024 限制、epoll 是 O(1)」—— 两句都对,但都不是答案。
★★★★☆ · 약 40분
死锁:怎么产生、怎么破、怎么查
四个条件背得滚瓜烂熟 —— 那你们代码里真的破了哪一条?
★★★☆☆ · 약 40분
乐观锁和悲观锁
「乐观锁假设不会冲突」—— 那你说得出你们那张表的冲突率吗?
★★★☆☆ · 약 35분
线程池的参数怎么定、满了会怎样
参数表说得出来的人很多,说得出这几个参数谁先谁后的很少。
★★★☆☆ · 약 40분

네트워크

TCP 和 UDP 的区别
「TCP 可靠、UDP 不可靠」—— 那「可靠」到底承诺了什么?
★★★☆☆ · 약 40분
三次握手为什么不是两次、TIME_WAIT 为什么是 2MSL
「三次是为了确认双方收发能力正常」—— 举一个两次会出事的例子。
★★★★☆ · 약 40분
HTTPS 凭什么安全(TLS 握手)
「HTTP + SSL,用非对称加密」—— 那你的数据是非对称加密的吗?
★★★★☆ · 약 45분
从输入 URL 到页面出来
全系列最长的一道。它会在你讲到一半时打断你 —— 这才是真实的面试。
★★★★☆ · 약 50분
HTTP/1.1、2、3 的区别
「HTTP/2 有多路复用所以更快」—— 那它把队头阻塞解决干净了吗?
★★★★☆ · 약 40분
Cookie、Session、Token、JWT
「token 存客户端所以更好扩展」—— 那你怎么让一个 token 立刻失效?
★★★☆☆ · 약 40분
四层和七层负载均衡
「四层快、七层功能多」—— 差别其实只有一条,你说得出是哪条吗?
★★★☆☆ · 약 35분

데이터베이스

为什么索引用 B+ 树,不用哈希、B 树、跳表
「B+ 树效率高、适合范围查询」—— 那为什么不是哈希、B 树、跳表?
★★★★☆ · 약 40분
四种隔离级别、幻读到底是什么
「可重复读解决了幻读」—— 真的解决干净了吗?给个反例。
★★★★☆ · 약 40분
MVCC 是怎么实现的
「多版本,读不加锁」—— 那「多版本」具体存在哪儿?
★★★★☆ · 약 40분
redo log、undo log、binlog 和两阶段提交
全系列最难的几道之一:崩溃恰好发生在那一瞬间,数据还对得上吗?
★★★★★ · 약 45분
分库分表之后,你失去了什么
「数据量大了就分库分表」—— 分完之后,你失去了什么?
★★★★☆ · 약 40분

캐시와 메시징

Redis 为什么快、「单线程」指的是哪一部分
「基于内存、单线程、多路复用,所以快」—— 那「单线程」指的是哪一部分?
★★★☆☆ · 약 40분
缓存穿透、击穿、雪崩
穿透、击穿、雪崩 —— 先别说方案,说清你指的是哪一种。
★★★☆☆ · 약 35분
缓存和数据库怎么保持一致
「先更新数据库再删缓存」—— 那这套做法的反例长什么样?
★★★★☆ · 약 40분
RDB、AOF 和主从复制
「有持久化也有主从,所以不会丢」—— 那主库挂掉那一刻呢?
★★★★☆ · 약 40분
分布式锁怎么做才对
「setnx 加个过期时间就行」—— 然后它会一个一个坑问过来。
★★★★☆ · 약 40분
消息怎么做到不丢不重
「生产确认 + 持久化 + 手动 ACK,就不丢不重了」—— 真的吗?
★★★★☆ · 약 40분

분산 시스템과 설계

CAP 和 BASE
「三个里只能选两个」—— 那你真的有得选吗?
★★★★☆ · 약 35분
分布式事务几种方案怎么选
全系列最难的几道之一。先证明你真的需要它。
★★★★★ · 약 45분
分布式 ID 怎么生成
「雪花算法:时间戳 + 机器号 + 序列号」—— 那机器号谁给你分?
★★★☆☆ · 약 35분
限流:三种算法和真实部署
三种算法都说得出来 —— 那你那个阈值是怎么定的?
★★★★☆ · 약 40분
幂等怎么设计
「加张去重表判断一下」—— 先说清:谁在重复,多久内算重复?
★★★★☆ · 약 35분
熔断、降级、隔离
「熔断降级保证稳定」—— 熔断打开那一刻,用户看到的是什么?
★★★☆☆ · 약 35분

자바와 JVM

Java 是值传递还是引用传递
「基本类型值传递、对象引用传递」—— 这是一个错误答案。
★★★☆☆ · 약 35분
JVM 内存区域,一个对象的一生
区域图谁都会画 —— 那跟着一个对象走一遍呢?
★★★★☆ · 약 40분
GC 怎么判断垃圾、一次 Full GC 意味着什么
全系列最难的几道之一:你线上一次 Full GC 停多久、上次是什么触发的?
★★★★★ · 약 45분
HashMap 的原理、它的线程不安全表现在哪
「数组 + 链表 + 红黑树,负载因子 0.75」—— 那容量为什么必须是 2 的幂?
★★★★☆ · 약 40분
synchronized 和 Lock、锁升级四个状态
锁升级四个状态背得出来 —— 那每一级到底省了哪一笔开销?
★★★★☆ · 약 40분
OOM 和内存泄漏怎么定位
「dump 下来用工具看一下」—— 先说清,它报的是哪一种 OOM?
★★★★☆ · 약 40분

Go와 런타임

GMP 调度模型
「G 是协程、M 是线程、P 是处理器」—— 那为什么非要有 P?
★★★★☆ · 약 40분
channel 的底层和 select
「无缓冲 channel 会阻塞」—— 它是一个长度为 0 的队列吗?
★★★★☆ · 약 40분
slice 和 map 的那些坑
「slice 是动态数组」—— 那把它传进函数改一下,外面看得见吗?
★★★★☆ · 약 40분
defer、panic、recover
「defer 延迟执行、后进先出」—— 那它的参数是什么时候求值的?
★★★★☆ · 약 35분
逃逸分析:这个变量在栈上还是堆上
「返回局部变量的指针就会逃逸」—— 那判据到底是什么?
★★★☆☆ · 약 35분
Go 的 GC 和 STW 到底停多久
全系列最难的几道之一:「STW 很短」—— 短到多少,停在哪两处?
★★★★★ · 약 40분
이 프롬프트들은 오픈 소스입니다 본문은 공개 저장소 kacam-net/hero-prompts에서 관리합니다. 어느 하나가 충분히 몰아붙이지 못한다거나 정답 패에 한 줄이 빠졌다면 고치러 오세요 —— 사이트에 올릴지는 별개의 판단이고, 이쪽 목록이 정합니다.