Теория языков программирования
PL Theory на интервью
Jane Street, Stripe, Airbnb, Bloomberg - эти компании спрашивают не 'напишите reverse linked list', а 'объясните variance в системах типов' и 'почему Rust ownership решает data races без GC'. PL theory на интервью - признак зрелой инженерной культуры компании. Это не академика - это фильтрация инженеров которые думают, а не просто кодируют.
- **Jane Street**: все интервью на OCaml. Вопросы о type inference, GADTs, functors. Без знания PL theory туда не попасть. Торговая платформа обрабатывает $17B/день
- **Stripe systems team**: вопросы о memory models, happens-before, lock-free structures. Stripe платёжная система: wrong concurrency = money bugs
- **Cloudflare Workers team**: вопросы о WASM, isolation models, V8 Isolates vs WASM sandbox. Понимание runtime internals обязательно для работы с edge platform
Вопросы о системах типов
Вопросы о системах типов на senior/staff интервью в компаниях с сильной инженерной культурой (Jane Street, Stripe, Airbnb, Bloomberg). Проверяют понимание tradeoffs, не заучивание определений. Типичные вопросы: structural vs nominal typing, variance, Hindley-Milner, soundness vs completeness.
Сильный ответ на variance включает пример: если List<Dog> <: List<Animal>, то можно добавить Cat в список Dogs (через reference List<Animal>). Это нарушение типобезопасности. Поэтому mutable коллекции invariant, readonly - covariant. Java arrays covariant + runtime check = ArrayStoreException.
Почему mutable List<T> должен быть invariant по T, а readonly - covariant?
Вопросы о компиляторах
Вопросы о компиляторах на интервью для ролей Platform Engineer, Compiler Engineer, или глубоких backend позиций. Часто спрашивают: pipeline компилятора, SSA, как GC влияет на производительность, difference между AOT и JIT.
Интервьюер спрашивает: почему LLVM выбрал SSA как внутреннее представление? Лучший ответ:
Модели конкурентности
Конкурентность - частая тема на senior/staff интервью. Вопросы: разница threads vs goroutines vs async/await, memory model (happens-before), lock-free vs wait-free, CSP vs actor model. Ожидается понимание tradeoffs, а не только API.
Почему async/await в Python не даёт parallelism, только concurrency?
Language Tradeoffs на интервью
Вопросы о tradeoffs языков - проверяют способность мыслить системно, а не 'какой язык лучше'. Типичные: почему Go выбрал простоту вместо дженериков до 1.18, почему Rust не имеет GC, как TypeScript совместим с JavaScript, зачем Kotlin избегает checked exceptions.
На PL theory интервью нужно знать все языки и запомнить их синтаксис
Интервьюеры хотят понимание трейдофов: почему дизайнеры языка сделали конкретный выбор, и когда этот выбор правильный или неправильный для конкретного контекста
Stripe engineering interview: 'расскажи о memory model языка которым пользуешься каждый день'. Не синтаксис - понимание. Jane Street: 'почему OCaml выбирает structural typing для объектов но nominal для типов?'. AWS: 'как Rust ownership решает data race без GC?'
Интервьюер: 'Почему стоит выбрать Erlang/Elixir для чат-сервиса?' Сильный ответ включает:
Итоги
- **Type systems**: structural vs nominal, variance (co/contra/in), soundness vs completeness. Конкретные примеры почему Java arrays covariant - design mistake
- **Compiler design**: pipeline (lexer->parser->AST->IR->codegen), SSA benefits, JIT tiered compilation, register allocation heuristics
- **Concurrency**: goroutines vs OS threads (M:N scheduling), happens-before semantics, CSP vs Actor model, lock-free vs wait-free
- **Tradeoffs**: Rust без GC (predictability + ownership), Go без дженериков (simplicity), TypeScript (safety vs erasure). Конкретные числа > абстрактные claims
Связанные темы
Интервью по PL theory охватывают весь курс:
- Системы типов — Variance, structural vs nominal, Hindley-Milner - основа вопросов о type systems
- Управление памятью — GC алгоритмы, ARC, ownership model - стандартные вопросы о memory management
Вопросы для размышления
- Jane Street использует OCaml для всей торговой системы. OCaml - нишевый язык. Какие конкретные свойства OCaml (не 'он функциональный') делают его выбором для financial systems?
- На интервью спросили: 'Rust guarantees memory safety, но Rust unsafe существует. Что это значит для safety guarantees?' Как ответить честно и показать глубокое понимание?
- Golang выбрал CSP (channels), Erlang - Actor model, Rust - ownership без runtime concurrency abstractions. Все решают concurrency. Какой подход правильный и при каких условиях?