Dayward AI
Week 2 · D14About 6 hours

A Five-Episode Season: Batch Production, Portfolio Packaging, and a Short-Drama Pipeline Interview Deep Dive

Produce a five-episode season in one run, package the whole pipeline into a portfolio piece that reads in three minutes, and turn fourteen days of engineering judgment into interview answers that hold up.

Today's goals 0/3

Sign in to tick these off and save your progress.

Today's Goals

  1. Produce a five-episode season in one run, and explain how cross-episode consistency was kept
  2. Package this project into portfolio material someone else can understand in three minutes
  3. Handle follow-up questions clearly on this pipeline's architecture trade-offs, cost control, and failure handling

Over thirteen days you built a line from nothing to something that ships. Today does two things: make it produce a season in one run, then turn it into something other people can understand and you can explain. When you finish, scroll back up and tick the three goals off.

Plain-Language Walkthrough

From one episode to a season: rely on the record, not on memory

Wrap day has a fixed ritual: reconciling the continuity log. Across dozens of shooting days, who wore which jacket in which scene and whether the prop sat left or right of the table all live in that book. Nobody maintains continuity from memory; everyone maintains it from one record they all accept.

Cross-episode consistency is the same thing. Most people's first attempt at multi-episode generation copies episode one's prompts into episode two, hand-edits a few words, copies into episode three. The first two look fine; by episode four the lead's coat has changed color, and by five the hairstyle has changed too. The reason is no mystery — every copy is another opportunity for a human edit, and after five episodes the drift is visible.

The correct approach is the world-bible record built on D2: character cards, style tokens, location table, stored exactly once. Then one hard rule:

Every shot's prompt may only be assembled from "the record plus this shot's storyboard description," never hand-written.

That rule converts "stay consistent" from something requiring discipline into something structurally impossible to violate. Appearance comes verbatim from the record's appearance field, style tokens are appended to every prompt, the voice comes from the character card's voiceId — as long as the assembly function reads only the record, episode five's lead cannot change coats.

prompt.js
// Prompts are assembled only from the record: appearance verbatim from cast, style tokens appended
function imagePrompt(world, shot) {
  const who = shot.characters
    .map((id) => world.cast.find((c) => c.id === id))
    .filter(Boolean)
    .map((c) => `${c.name} (${c.appearance})`)
    .join(', ')
  return [shot.visual, who, `${shot.shotSize} shot`, ...world.styleTokens]
    .filter(Boolean)
    .join(', ')
}
 
// Cross-episode hooks: episode N's hook must equal episode N+1's pickUp word for word
function checkHookChain(season) {
  const broken = []
  for (let i = 0; i < season.length - 1; i += 1) {
    if (season[i + 1].pickUp !== season[i].hook) {
      broken.push(`E${season[i].n} -> E${season[i + 1].n}`)
    }
  }
  return { pass: broken.length === 0, broken }
}

The second thing a season adds over an episode is cross-episode hooks. An episode is self-contained; a season has to make people keep watching, so each episode ends on a question the next one picks up. Do not rely on memory for that either: pin hook and pickUp fields in each episode's plan, require episode N's hook to equal episode N+1's pickUp word for word, and validate before the run starts. A broken chain raises an error rather than being discovered after all five episodes are generated.

The lab's consistency check has five items, all looking at inputs rather than pictures: every character exists in the record, voices are unchanged across episodes, appearance descriptions come verbatim from the record, style tokens are present on every shot, and hooks chain end to end. Why only inputs? Because whether the picture is good is D11's machine review; this day checks whether the inputs drifted — and only undrifted input makes undrifted output possible. The two checks are complementary and neither substitutes for the other.

And once a season has run, what do you actually hold? For that, look at the books.

Reviewing one real run: four numbers

A review that reports one total duration or one "it ran" is useless. A run must leave at least four numbers: elapsed time, spend, failure rate and human touches. Missing any one and the line is still a black box to everyone else.

Each answers a different question:

  • Elapsed time answers "can we deliver on schedule," deciding whether you dare take a five-episodes-a-week job.
  • Spend answers "can this be profitable." Per-episode cost times episode count is your cost floor.
  • Failure rate answers "is it stable." Note the denominator is calls, not episodes — twenty calls in an episode with one failed retry is a 5% failure rate, not 20%. The lab injects no failures by default; add INJECT=taskfail and the failure column comes alive.
  • Human touches answers "can this scale." That number is the most overlooked and the most important: if an episode needs three human interventions, how many episodes a week this line can produce depends on a person's time, not a machine's.

The season bill the lab prints looks like this:

TextText
-- Season bill --
   ep  title         elapsed   img  video s  tts chars  calls  fail  human  spend (est)
   E1  Found          1257ms    2       8      18     6     0     0  CNY 4.0563
   E2  Obituary       1270ms    2       8      22     6     0     0  CNY 4.0577
   E3  Father's watch 1171ms    2       8      24     7     1     0  CNY 4.0584
   E4  The same watch 1154ms    2       8      16     6     0     1  CNY 4.0556
   E5  Powered off    1144ms    2       8      13     6     0     0  CNY 4.0545
   total 5 episodes, 6.0s, 31 calls, 1 failure (failure rate 3.2%), 1 human touch
   spend (estimated) CNY 20.2825, CNY 4.0565 per episode

Two conventions must be stated, because they decide whether this bill is trustworthy.

First, failed calls go into the bill too. A failed retry consumed time and quota, even if it may not have been billed. Leave it out and your "calls per episode" comes out low, and capacity planning is wrong throughout — projecting concurrency against D9's rate-limit table with the wrong denominator will walk you straight into rate limiting in production.

Second, spend is still an estimate, and the three tiers are not equally trustworthy. Images at CNY 0.025 are officially listed; speech publishes only package pricing, so the per-character rate is derived; and video is the subtlest — the pay-as-you-go page lists per-second rates for several resolution tiers, while the video API used here is deducted officially as video credits, two non-interchangeable regimes, so the per-second constant in the code is a ledger demonstration value not attached to any specific model id (D12 covered this). Put those three sentences verbatim into the portfolio document so nobody mistakes it for a real invoice.

An observation in passing: CNY 20.28 for the season, of which video is still over ninety percent. In fourteen days, this line's cost structure has never changed. Which is the best footnote to D12's judgment — every engineering decision orbits calling the video API one fewer time, not because it is elegant but because that is what the arithmetic says.

ledger.js
function summarize(records) {
  const attempts = records.reduce((s, r) => s + r.attempts, 0)
  const failures = records.reduce((s, r) => s + r.failures, 0)
  const totalCny = Number(records.reduce((s, r) => s + r.estimatedCny, 0).toFixed(4))
  return {
    episodes: records.length,
    totalMs: records.reduce((s, r) => s + r.ms, 0),
    totalCny,
    perEpisodeCny: records.length ? Number((totalCny / records.length).toFixed(4)) : 0,
    // Denominator is calls, not episodes - the wrong one makes capacity planning optimistic
    failureRate: attempts ? Number((failures / attempts).toFixed(4)) : 0,
    // This number decides whether the line can scale: it is bound by human time, not machine time
    manualTouches: records.reduce((s, r) => s + r.manualTouches, 0),
  }
}

Packaging the portfolio: three artifacts for three readers

Finishing the code is not finishing the portfolio. A project that is only a repository link reads to others as "ran a script," because nobody reads source code to understand your project.

A portfolio needs three artifacts, aimed at three completely different readers.

A demo reel, for people who give you three minutes. Hiring managers, recruiters and non-technical interviewers will not run your code. Thirty seconds showing "one sentence in, a season out" beats a thousand words of description. The lab takes each episode's first shot and stream-copies them into one clip — note there is no re-encoding here either; with identical encoding parameters, -c copy is enough, and a season plus a reel means six joins, each of which would otherwise recompress, slowly and lossily.

An architecture diagram, for the technical interviewer. The diagram's job is not to look good; it is to let the reader know within thirty seconds where to aim their questions. So it must show not only the flow but the horizontal infrastructure blocks — workflow engine, concurrency gate, budget breaker, review console — because those are what separate this project from "called a few APIs."

one-sentence premise script Agent: structured storyboard and auto review world bible: cast, style, hooks character and set assets per-shot first frames shot videos: async task polling dubbing and subtitles ffmpeg assembly: vertical cut QC and compliance multi-platform release: render once package many workflow engine: idempotency and resume concurrency gate and quota cost routing and budget breaker human-in-the-loop review console data feedback: retention mapped back to stages
Mermaid source
mermaidmermaid
flowchart TD
  idea[one-sentence premise] --> script[script Agent: structured storyboard and auto review]
  world[(world bible: cast, style, hooks)] --> script
  script --> assets[character and set assets]
  assets --> frames[per-shot first frames]
  frames --> clips[shot videos: async task polling]
  script --> voice[dubbing and subtitles]
  clips --> compose[ffmpeg assembly: vertical cut]
  voice --> compose
  compose --> qc[QC and compliance]
  qc --> release[multi-platform release: render once package many]
  engine[workflow engine: idempotency and resume] --- clips
  gate[concurrency gate and quota] --- clips
  budget[cost routing and budget breaker] --- clips
  console[human-in-the-loop review console] --- qc
  release --> data[data feedback: retention mapped back to stages]
  data --> script

A written document, for people who will actually read. It must answer three questions up front: what this is, what one real run's numbers are, and how to run the code. The lab fills the season bill's numbers into that document automatically, so what you hand over is not a template but a report carrying real results.

Missing any one of the three costs you: with only a reel, a technical interviewer thinks you make videos; with only a diagram, non-technical readers understand nothing; with only a document, nobody has the patience to finish.

One more thing that is easy to overlook: all three must speak for themselves with you absent. The most common use of a portfolio is being forwarded — the hiring manager sends it to an engineering lead, who glances at the diagram and decides whether to book you. So the reel's first three seconds must say what this is, every block on the diagram needs a name rather than an abbreviation, and the document's first paragraph must give the scale and the numbers. Anything that needs you standing beside it saying "well, this part is actually..." breaks the forwarding chain.

How to tell it in an interview: three technical stories

The last section is about interviews. This project offers too much to tell, and interviews last tens of minutes, so converge on three stories first, each tellable in two minutes and each hitting a different class of question.

Story one: the whole engineering design orbits one judgment. Open with the number — video is over ninety percent of an episode's cost and is also the slowest and most failure-prone. Then hang idempotency keys, artifact caching, reference-image reuse, draft-tier routing and the budget breaker off it, showing they are all corollaries. This story tests whether you have systemic trade-off judgment, not whether you can use a library. Its force is that whichever component the interviewer asks about, you can bring the thread back to the same spine.

Story two: how to write an async task client that does not strangle itself. Submit, poll, collect, download — four steps, each of which can fail, and failures split into retryable and not. A state machine plus exponential backoff, plus timeout abandonment, plus classification by error code, plus billing rules like "failed and safety-blocked calls are not billed." This story tests density of engineering detail and is the easiest to be probed on — be ready for "how many retries," "how long a backoff," "how do you set the timeout."

Story three: which cell of the line the human occupies. Fully automatic produces a pile of films nobody watches; fully manual cannot keep up. The review console places the human between QC and release, and translates "change one line" into "which downstream nodes need recomputing." This story tests product sense, and most candidates cannot answer it — it proves you thought about who this system is for.

The three map to three classes of question: system trade-offs, engineering detail, product judgment. Two general rules while telling them: every story carries a concrete number (ninety percent, four steps, one cell), because numbers are where credibility comes from; and every story leaves a hook to be probed, steering the interviewer toward what you prepared best.

As for "what would you change if you did it again," honesty beats inventing a perfect plan. What genuinely deserves changing on this line is right there: the console's recomputation scope is currently computed per node dependency and the granularity could be finer; and the derived unit prices in the cost table should be replaced with measured values once real invoices arrive. Being able to state your solution's boundaries proves you built it better than the solution itself does.

Where this line can go next

Fourteen days are over, and the line has one natural next step: lift the judgments it uses repeatedly out of the code.

Your project now holds a body of material that is neither general code nor business data but experience: how to cut a storyboard, how to assemble a prompt, how to classify a failure, when to call a human. It is currently scattered across functions, comments and constant tables. Change genre or change vendor and most of that experience still holds, but you have to lay it out again in new code.

Distilling it into a reusable capability package is the natural next move — and that is what this platform's Agent Skills course is about: separating the work instructions from the code so the same experience can be loaded repeatedly across projects. If you plan to push this line toward a product, that is the right place to continue.

Source Reading

Hands-On Lab

🧪 D14 lab: a batch script producing a five-episode season in one run, plus portfolio material

Code location: labs/ai-drama-pipeline/day-14-season-portfolio

Acceptance criteria:

  1. One run produces five episodes, with episode-1.mp4 through episode-5.mp4 under output/.
  2. All five cross-episode consistency checks pass; changing one episode's hook turns the "hooks chain end to end" item red immediately.
  3. The season bill prints per-episode elapsed time, image count, video seconds, speech characters, call count, failure count, human touches and estimated spend; re-running with INJECT=taskfail moves the total row's failure rate from 0.0% to 3.2%.
  4. output/portfolio/demo.mp4 is stream-copied from each episode's first shot, with no trace of re-encoding in the log.
  5. The numbers in output/portfolio/README.md match this run's bill, and the three technical stories' skeletons are written.

Before starting, be clear on one thing: this lab's deliverable is not only code but that portfolio/README.md. The program fills in the numbers and builds the skeleton; the flesh of the three technical stories is yours to write — and that is this day's real deliverable.

  1. Run the starter unmodified, and use the consistency check's failures and the bill's zeros to judge which logic is not implemented yet.
  2. Change prompt assembly to read only from the record, re-run, and confirm "appearance verbatim from the record" and "style tokens on every shot" turn green.
  3. Add the hook comparison, then deliberately change one episode's hook and confirm that item turns red on the spot.
  4. Implement spend estimation and stream-copy joining, confirm the bill is no longer all zeros and the log shows no re-encoding, then run with INJECT=taskfail and confirm the failure column and rate move.
  5. Open the generated portfolio/README.md, expand each of the three technical stories into a two-minute version, then answer the interview follow-up list to yourself and mark what you still cannot answer.

Interview Questions

Today's 3 questions are in the question bank below, focused on the engineering means of cross-episode consistency, how to structure the telling of a project, and this line's overall architecture trade-offs. Read the analysis before the key points — practicing the derivation beats memorizing them. The cn / global labels let you pick by target market.

Checklist and Tomorrow

  • I can produce a five-episode season in one run, and explain how cross-episode consistency was kept
  • I can package this project into portfolio material someone else can understand in three minutes
  • I can handle follow-up questions clearly on this pipeline's architecture trade-offs, cost control, and failure handling
  • I can name the four numbers a run must leave behind, and why the failure rate's denominator is calls
  • I can tell all three technical stories in two minutes each, with a concrete number in every one
  • All 5 lab acceptance criteria pass
  • I can answer at least 2 of the 3 interview questions without looking at the key points

Course end, and what comes next. There is no day fifteen; the course ends here. Look back at day one's task graph: what you write now has idempotency, concurrency, review, QC, cost control, distribution and season-scale batching on top of it. Two things are worth doing next: run this line for real on a subject of your own and replace the portfolio's numbers with your own run's; and follow the section above on distilling this line's experience into a reusable capability package. Good luck with the shoot.

Interview questions

  • Walk me through the AI content pipeline you built. What was the hardest part?介绍一下你做的这条 AI 内容生产线,它最难的地方在哪?
    Common in ChinaCommon overseasBasic#project-storytelling#system-design

    How to reason about it · think before answering

    1. This is an open question that tests convergence. Narrating two weeks of work chronologically loses the interviewer in three minutes; delivering one through-line in thirty seconds is what counts as telling a project well.
    2. Open with positioning and scale: an automated pipeline from a one-line premise to publish-ready vertical episodes, one run producing a five-episode season, with humans stepping in only where judgment is required. Numbers first, detail second.
    3. Then answer hardest. That word should not be spent on debugging pain; spend it on a judgment that generates every downstream decision: video generation is the most expensive, slowest and most failure-prone stage at over ninety percent of per-episode cost, so the whole design revolves around issuing one fewer video call.
    4. Attach the chain of consequences in one sentence: idempotency and caching avoid duplicate calls, reference-image reuse reduces retries, the draft tier makes experimentation cheap, and the budget breaker stops a runaway. The chain proves your choices are derived rather than collected.
    5. Leave a deliberate hook for follow-up, such as saying the async task client turned out far harder than expected. That steers the interviewer toward your strongest material instead of a corner you never considered.
    6. Expect the follow-up: do you have real numbers? Keep four from every run: wall time, spend, failure rate and manual interventions. If spend is estimated, say so, rather than letting them assume you pasted a real invoice.

    分析过程 · 先想清楚再作答

    1. 这是一道开放题,考的是收敛能力。把十四天的东西按时间顺序流水账讲一遍,面试官三分钟后就走神了;能在三十秒内给出一条主线,才算会讲项目。
    2. 开头两句要立住定位与规模:从一句话选题到多平台可发布成片的自动化流水线,一次运行产出一季五集,人只在需要判断的地方介入。数字先给,细节后给。
    3. 然后回答「最难」。这个词不该答成「调试很麻烦」,要答成一条能推出后续所有设计的判断:这条线上最贵、最慢、最容易失败的是视频生成,占单集成本九成以上,所以整套工程都是围着「怎么少调一次视频接口」转的。
    4. 接着一句话挂上推论链:幂等与缓存是为了不重复调,参考图复用是为了少试几次,草稿档路由是为了试错时用便宜规格,预算熔断是为了失控时能停住。这条链子证明你的技术选择不是攒来的最佳实践。
    5. 最后主动留一个可被追问的钩子,比如「异步任务的客户端比我预想的复杂得多」——把面试官引到你准备最充分的地方去,而不是等他随机挑一个你没想过的角落。
    6. 可预期的追问是「有真实数据吗」。所以复盘时必须留下四个数字:耗时、花费、失败率、人工介入次数。花费是估算的就要主动说明是估算,别让人以为你贴了张真实账单。

    Key points

    • Position first: from a one-line premise to multi-platform episodes, one run per five-episode season
    • Frame the hardest part as a judgment: video dominates cost and is the slowest, most failure-prone stage
    • Show the derivation chain: idempotency and caching, reference reuse, draft tier, budget breaker
    • Bring four numbers: wall time, spend, failure rate, manual interventions, flagging estimates as estimates
    • Plant a follow-up hook that steers the conversation to your strongest area

    答题要点

    • 先定位再展开:从一句话到多平台成片,一次运行产出一季五集
    • 把最难点答成一条判断:视频占单集成本九成以上且最慢最易失败
    • 用推论链证明设计是导出来的:幂等缓存、参考图复用、草稿档、预算熔断
    • 带上四个数字:耗时、花费、失败率、人工介入次数,估算值要主动标注
    • 主动留一个追问钩子,把话题引向准备最充分的部分
  • How do you keep characters and visual style consistent across many generated episodes, and what breaks at a hundred episodes?多集连续生成时,人物与画风的跨集一致性你是怎么保证的?如果要做一百集会遇到什么新问题?
    Common in ChinaCommon overseasIntermediate#consistency#prompt-assembly

    How to reason about it · think before answering

    1. The discriminator is whether you rely on discipline or on structure. Writing the prompt the same way every time drifts by episode five, because every copy is another chance for a human edit.
    2. The right shape makes inconsistency structurally impossible: keep one archive (character cards with appearance and voice id, style tokens, scene list) and enforce one rule, that every shot's prompt is assembled from the archive plus that shot's description, never hand-written.
    3. Then turn the rule into decidable checks: are all characters in the archive, did any voice id change across episodes, is the appearance fragment verbatim from the archive, does every shot carry the style tokens, and does each episode's hook match the next one's pick-up. These five inspect inputs only; picture quality belongs to the automated review pass, and the two are complementary.
    4. At a hundred episodes three new problems appear. First the archive itself evolves as characters restyle and new ones appear, so it needs versions and each episode must record which version it used, or you cannot explain why episode thirty differs from episode ten.
    5. Second, the hook chain gets long and manual maintenance fails, so hook validation has to be a hard gate before the run starts. Third, the asset library bloats, so reference sheets need an index and deduplication or one character accumulates dozens of contradictory base images.
    6. Expect the follow-up: does consistency fight variety? Separate the layers. The archive locks identity traits such as appearance, voice and style, while randomness lives in camera movement, framing and lighting. Locking the wrong layer gives you a hundred identical episodes.

    分析过程 · 先想清楚再作答

    1. 这题的区分度在于你是靠自律还是靠结构。答「每次都把提示词写得一样」的人做到第五集就会漂,因为每复制一次提示词就多一次人为改动的机会。
    2. 正确形态是把一致性变成结构上做不到不一致:建一份唯一的档案(人物卡含外貌与音色、风格词、场景表),再立一条硬规矩——每一镜的提示词只能由「档案加本镜描述」拼出来,不允许手写。
    3. 然后把这条规矩做成可判定的检查:角色是不是都在档案里、音色跨集有没有变、外貌片段是不是逐字来自档案、风格词每一镜有没有带上、集间钩子有没有首尾相接。注意这五条只看输入不看画面——画面质量是机器审片的职责,两道检查互补,谁也替代不了谁。
    4. 一百集会冒出三类新问题。第一是档案本身会演化:人物换了造型、加了新角色,需要给档案做版本,并记录每一集用的是哪个版本,否则回头没法解释第三十集为什么和第十集不一样。
    5. 第二是钩子链变长之后容易断,人工维护五条还行、维护九十九条一定出错,得让钩子校验成为开跑前的硬闸门。第三是资产库膨胀,定妆图与参考图要有索引与去重,否则同一个角色会攒出几十张互相矛盾的基准图。
    6. 可预期的追问是「一致性和多样性冲突吗」。答案是把两者分开:档案锁死的是身份特征(外貌、音色、风格),随机性留给运镜、构图与光线——锁错层就会得到一百集一模一样的片子。

    Key points

    • Rely on structure: one archive plus a rule that prompts may only be assembled from it
    • Five decidable input-only checks: cast membership, voice stability, verbatim appearance, style tokens, hook chain
    • Input checks complement automated picture review; neither replaces the other
    • At scale add archive versioning, a hard pre-run hook gate, and an indexed deduplicated asset library
    • Lock identity traits in the archive and leave randomness to camera, framing and lighting

    答题要点

    • 靠结构不靠自律:唯一档案加一条硬规矩,提示词只能从档案拼出来
    • 五条只看输入的可判定检查:角色、音色、外貌逐字、风格词、集间钩子
    • 输入检查与机器审片互补,一个查有没有漂,一个查画面好不好
    • 上百集会新增三类问题:档案要版本化、钩子校验要变成硬闸门、资产库要索引去重
    • 档案锁身份特征,随机性留给运镜构图光线,锁错层会一百集雷同
  • If you rebuilt this pipeline from scratch, what would you change architecturally?如果让你重做一遍这条生产线,架构上你会怎么改?
    Common in ChinaCommon overseasDeep dive#architecture-review#trade-offs

    How to reason about it · think before answering

    1. This tests the quality of your self-critique. Saying nothing needs changing ends the conversation; listing trendy technologies is just as bad, because it shows you learned nothing from the build. A good answer is specific, has a cost analysis, and traces back to a concrete stumble.
    2. Set a filter first: only discuss places where you actually got tripped up and now know the right approach. Say plainly where you are still unsure, because naming the limits of your solution proves more than the solution itself.
    3. First, recomputation scope. Editing one line of dialogue currently recomputes the whole downstream subgraph. Better would be for each node to declare which input fields it depends on, so a dialogue edit triggers only speech and subtitles, never video. The cost is more complex node definitions; the benefit is redoing one synthesis instead of a whole shot.
    4. Second, the cost model. The rate card today mixes derived prices with deliberate blanks, which is fine for projection but useless for reconciliation. Once real invoices exist, back out measured unit prices from them and keep a drift alert that fires when projection and reality diverge past a threshold, which beats after-the-fact reconciliation.
    5. Third, the concurrency model. Gates are currently keyed by provider, but modeling them as quota buckets matches reality better, since different endpoints from one vendor have independent quotas while different vendors are fully independent. Rate-limit diagnosis gets far more precise.
    6. Expect the follow-up: why not build it that way originally? Answer honestly that you shipped the smallest working version and spent complexity only where data justified it. That sentence is itself an architectural judgment, and distinguishing necessary complexity from premature complexity is exactly what the interviewer is listening for.

    分析过程 · 先想清楚再作答

    1. 这题在考自我批判的质量。答「没什么要改的」直接出局;答一堆花哨的新技术也不行,因为那说明你没从这次的实践里学到东西。好答案是具体的、有代价分析的、并且能追溯到某一次踩坑。
    2. 先立一个筛选标准:只讲那些我这次真的被绊过、而且知道正确做法的地方。不确定的部分坦白说不确定——说得出方案的边界,比说得出方案本身更能证明你做过。
    3. 第一处可以讲重算范围。审核台上改一句台词,现在是按节点依赖整体重算下游,粒度偏粗;更好的做法是让每个节点声明自己依赖输入的哪几个字段,改台词只触发配音与字幕,不碰视频。代价是节点定义变复杂,收益是重做成本从一整镜降到一次语音合成。
    4. 第二处是成本模型。现在的单价表里有折算值和留空项,估算够用但不能对账;接了真实账单之后应该改成从账单反推实测单价,并保留一个偏差告警——估算和实际差超过阈值就报警,这比事后对账有用得多。
    5. 第三处是并发模型。现在闸门是按 provider 分类做的,更贴近现实的做法是按「配额桶」建模,因为同一家厂商的不同接口配额独立,而不同厂商之间又完全独立。改了之后限流的定位会准很多。
    6. 可预期的追问是「为什么当初不那样做」。诚实回答:当时先做能跑通的最小版本,把复杂度留给已经被数据证明值得的地方。这句话本身就是架构判断——面试官想听的正是你会不会区分「必要的复杂度」和「过早的复杂度」。

    Key points

    • Only discuss stumbles you actually hit and now know how to fix; admit what you are unsure about
    • Move recomputation to field-level dependencies so a dialogue edit skips video regeneration
    • Back out measured unit prices from real invoices and add a projection-versus-actual drift alert
    • Model concurrency gates as quota buckets rather than per provider, matching per-endpoint quotas
    • Explain the original choice: ship the smallest working version and spend complexity only where data justifies it

    答题要点

    • 只讲真的踩过且知道正确做法的地方,不确定的坦白说不确定
    • 重算范围改成按字段级依赖,改台词只触发配音与字幕而不重生成视频
    • 成本模型接真实账单后反推实测单价,并加一个估算与实际的偏差告警
    • 并发闸门从按 provider 改成按配额桶建模,贴合各接口配额独立的现实
    • 解释当初为何没这么做:先做最小可跑版本,把复杂度留给数据证明值得的地方

Comments