{"course":{"slug":"ai-careers","title":"Working in AI","url":"https://addaly.com/learn/ai-careers","level":"beginner","track":"work"},"lesson":{"slug":"building-with-an-assistant","title":"Building a project you can still defend","url":"https://addaly.com/learn/ai-careers/building-with-an-assistant","position":49,"of":85,"minutes":9,"answer":"Type the parts a reviewer would ask \"why\" about, delegate the rest, and never move past generated code you cannot explain, because generated data code fails by being plausible rather than by breaking.","keyIdea":"Type the parts a reviewer would ask \"why\" about, delegate the rest, and never move past generated code you cannot explain, because generated data code fails by being plausible rather than by breaking."},"body":{"format":"markdown","text":"## The interview that ends it\n\nYou submit a project. The interviewer opens it and says: *\"Walk me through this function. Why a left join here rather than an inner one?\"*\n\nIf a model wrote it and you accepted it, you will not know. There is no recovery from that moment, and it is not because anybody objects to the tool: it is because the entire purpose of the artefact was to show how you think, and it now shows how something else thinks.\n\n## The rule that survives contact\n\n**Anything you would be asked about in an interview, you type yourself.**\n\nThat is a small set, and it is not the whole project. Concretely:\n\n- **Type yourself:** the schema and the joins, the metric definitions, the evaluation, the decisions about missing data, anything you will describe as a judgement.\n- **Delegate happily:** boilerplate, argument parsing, the matplotlib incantation for a second axis, a regular expression, a Dockerfile skeleton, converting a script into a module, writing the docstrings.\n- **Delegate and then read carefully:** anything that touches correctness, because of the next section.\n\nThe dividing line is not difficulty. It is whether a reviewer would ask why.\n\n## Silently wrong is the real risk\n\nGenerated data code fails in a particular way: it runs, produces plausible output, and is wrong. Three examples that recur:\n\n- **`df.groupby('region')` drops rows where `region` is null**, because `dropna=True` is the default. Your totals are quietly short and nothing errors.\n- **A join that should be one-to-many is written as one-to-one**, so rows multiply and every sum is inflated. The code is fine; the arithmetic is not.\n- **A deprecated argument** from a version two years old, which either warns or silently changes behaviour.\n\nThe defence is not vigilance, which fails. It is a check that runs: assert the row count after a join, assert that totals reconcile to a number you computed by hand on ten rows, print the null counts before and after. Twenty lines of assertions catch all three of the above and cost less time than finding one of them the hard way.\n\n## Learning while using it\n\nThere is a real tension here and it deserves a straight answer rather than a slogan.\n\nReading a correct solution feels like learning and mostly is not. What encodes a skill is the effort of producing something and being wrong. An assistant removes exactly that effort, which is why it can make you faster this month and no better in six.\n\nThe practical compromise that works:\n\n1. **Attempt first, then compare.** Write your version, however clumsy, then ask for a critique. You keep the productive struggle and still get the correction.\n2. **Never move on from code you do not understand.** When something appears that you cannot explain, stop and ask what each part does until you can. This is the single habit that separates people who learn with an assistant from people who do not.\n3. **Keep a decisions file.** `DECISIONS.md`, one line per choice: what you did, what you rejected, why. Written as you go, it takes seconds; reconstructed later, it is fiction. It is also, conveniently, the raw material for the case-study page.\n4. **Delete and rewrite one component from memory** at the end. If you cannot, you did not learn it, and now you know that before an interviewer does.\n\n## Disclosure\n\nSay what you used. A line in the README (\"Used an assistant for boilerplate and plotting; the schema design, join logic and evaluation are mine\") costs nothing, is increasingly expected, and pre-empts the suspicion.\n\nNobody competent will reject you for using the tools their team uses daily. They will reject you for not being able to explain your own submission, and those are different failures with different fixes.\n\n## The limitation\n\nThe evidence on assistants and learning is unsettled. Studies find real productivity gains on well-specified tasks and weaker or negative effects on retention and on debugging unfamiliar code, and the picture differs sharply between novices and experienced developers. Anybody telling you confidently that assistants either destroy learning or do not affect it is ahead of the evidence.\n\nWhat is not in dispute is the interview: you will be asked to explain your work by somebody who is good at telling. Build so that you can."},"check":{"question":"A learner's assistant-written pipeline runs cleanly and produces a regional sales report. Which check would most reliably catch the errors this kind of code typically contains?","options":[{"text":"Running a linter and type checker over the code to catch quality issues.","correct":false,"tempting":"Catches style and type problems in code that is already syntactically valid, while the failure mode here is arithmetic that runs perfectly."},{"text":"Asking the assistant to review its own output for bugs.","correct":false,"tempting":"Re-runs the same generator over the same assumptions, so a wrong join or a dropped null group is as likely to be endorsed as found."},{"text":"Asserting the row count before and after each join and reconciling the totals against ten rows computed by hand.","correct":true},{"text":"Comparing the output to last month's report to see whether the numbers look reasonable.","correct":false,"tempting":"Uses plausibility as the test, which is precisely what silently-wrong output is good at passing."}]},"prev":{"slug":"practising-out-loud","title":"Rehearsing with a model that wants to please you","url":"https://addaly.com/learn/ai-careers/practising-out-loud"},"next":{"slug":"the-shape-of-the-process","title":"The stages, and what each one is really testing","url":"https://addaly.com/learn/ai-careers/the-shape-of-the-process"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'Building a project you can still defend', in Working in AI. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/ai-careers/building-with-an-assistant (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Building a project you can still defend","courseTitle":"Working in AI","module":{"index":5,"slug":"searching-with-ai","title":"Using AI in your own search"},"answer":null,"keyIdea":"Type the parts a reviewer would ask “why” about, delegate the rest, and never move past generated code you cannot explain, because generated data code fails by being plausible rather than by breaking.","hero":{"kind":"plate","image":null,"alt":null,"caption":null},"blocks":[{"t":"h2","id":"the-interview-that-ends-it","runs":[{"text":"The interview that ends it"}]},{"t":"p","runs":[{"text":"You submit a project. The interviewer opens it and says: "},{"text":"”Walk me through this function. Why a left join here rather than an inner one?”","i":true}]},{"t":"p","runs":[{"text":"If a model wrote it and you accepted it, you will not know. There is no recovery from that moment, and it is not because anybody objects to the tool: it is because the entire purpose of the artefact was to show how you think, and it now shows how something else thinks."}]},{"t":"h2","id":"the-rule-that-survives-contact","runs":[{"text":"The rule that survives contact"}]},{"t":"p","runs":[{"text":"Anything you would be asked about in an interview, you type yourself.","b":true}]},{"t":"p","runs":[{"text":"That is a small set, and it is not the whole project. Concretely:"}]},{"t":"ul","items":[[{"text":"Type yourself:","b":true},{"text":" the schema and the joins, the metric definitions, the evaluation, the decisions about missing data, anything you will describe as a judgement."}],[{"text":"Delegate happily:","b":true},{"text":" boilerplate, argument parsing, the matplotlib incantation for a second axis, a regular expression, a Dockerfile skeleton, converting a script into a module, writing the docstrings."}],[{"text":"Delegate and then read carefully:","b":true},{"text":" anything that touches correctness, because of the next section."}]]},{"t":"p","runs":[{"text":"The dividing line is not difficulty. It is whether a reviewer would ask why."}]},{"t":"h2","id":"silently-wrong-is-the-real-risk","runs":[{"text":"Silently wrong is the real risk"}]},{"t":"p","runs":[{"text":"Generated data code fails in a particular way: it runs, produces plausible output, and is wrong. Three examples that recur:"}]},{"t":"ul","items":[[{"text":"df.groupby('region')","b":true,"code":true},{"text":" drops rows where ","b":true},{"text":"region","b":true,"code":true},{"text":" is null","b":true},{"text":", because "},{"text":"dropna=True","code":true},{"text":" is the default. Your totals are quietly short and nothing errors."}],[{"text":"A join that should be one-to-many is written as one-to-one","b":true},{"text":", so rows multiply and every sum is inflated. The code is fine; the arithmetic is not."}],[{"text":"A deprecated argument","b":true},{"text":" from a version two years old, which either warns or silently changes behaviour."}]]},{"t":"p","runs":[{"text":"The defence is not vigilance, which fails. It is a check that runs: assert the row count after a join, assert that totals reconcile to a number you computed by hand on ten rows, print the null counts before and after. Twenty lines of assertions catch all three of the above and cost less time than finding one of them the hard way."}]},{"t":"h2","id":"learning-while-using-it","runs":[{"text":"Learning while using it"}]},{"t":"p","runs":[{"text":"There is a real tension here and it deserves a straight answer rather than a slogan."}]},{"t":"p","runs":[{"text":"Reading a correct solution feels like learning and mostly is not. What encodes a skill is the effort of producing something and being wrong. An assistant removes exactly that effort, which is why it can make you faster this month and no better in six."}]},{"t":"p","runs":[{"text":"The practical compromise that works:"}]},{"t":"ol","start":1,"items":[[{"text":"Attempt first, then compare.","b":true},{"text":" Write your version, however clumsy, then ask for a critique. You keep the productive struggle and still get the correction."}],[{"text":"Never move on from code you do not understand.","b":true},{"text":" When something appears that you cannot explain, stop and ask what each part does until you can. This is the single habit that separates people who learn with an assistant from people who do not."}],[{"text":"Keep a decisions file.","b":true},{"text":" "},{"text":"DECISIONS.md","code":true},{"text":", one line per choice: what you did, what you rejected, why. Written as you go, it takes seconds; reconstructed later, it is fiction. It is also, conveniently, the raw material for the case-study page."}],[{"text":"Delete and rewrite one component from memory","b":true},{"text":" at the end. If you cannot, you did not learn it, and now you know that before an interviewer does."}]]},{"t":"h2","id":"disclosure","runs":[{"text":"Disclosure"}]},{"t":"p","runs":[{"text":"Say what you used. A line in the README (“Used an assistant for boilerplate and plotting; the schema design, join logic and evaluation are mine”) costs nothing, is increasingly expected, and pre-empts the suspicion."}]},{"t":"p","runs":[{"text":"Nobody competent will reject you for using the tools their team uses daily. They will reject you for not being able to explain your own submission, and those are different failures with different fixes."}]},{"t":"h2","id":"the-limitation","runs":[{"text":"The limitation"}],"role":"limit"},{"t":"p","runs":[{"text":"The evidence on assistants and learning is unsettled. Studies find real productivity gains on well-specified tasks and weaker or negative effects on retention and on debugging unfamiliar code, and the picture differs sharply between novices and experienced developers. Anybody telling you confidently that assistants either destroy learning or do not affect it is ahead of the evidence."}]},{"t":"p","runs":[{"text":"What is not in dispute is the interview: you will be asked to explain your work by somebody who is good at telling. Build so that you can."}]}],"check":{"question":[{"text":"A learner’s assistant-written pipeline runs cleanly and produces a regional sales report. Which check would most reliably catch the errors this kind of code typically contains?"}],"options":[{"text":[{"text":"Running a linter and type checker over the code to catch quality issues."}],"correct":false,"tempting":[{"text":"Catches style and type problems in code that is already syntactically valid, while the failure mode here is arithmetic that runs perfectly."}]},{"text":[{"text":"Asking the assistant to review its own output for bugs."}],"correct":false,"tempting":[{"text":"Re-runs the same generator over the same assumptions, so a wrong join or a dropped null group is as likely to be endorsed as found."}]},{"text":[{"text":"Asserting the row count before and after each join and reconciling the totals against ten rows computed by hand."}],"correct":true,"tempting":null},{"text":[{"text":"Comparing the output to last month’s report to see whether the numbers look reasonable."}],"correct":false,"tempting":[{"text":"Uses plausibility as the test, which is precisely what silently-wrong output is good at passing."}]}],"order":[1,2,3,0],"why":null},"prev":{"slug":"practising-out-loud","title":"Rehearsing with a model that wants to please you","minutes":8},"next":{"slug":"the-shape-of-the-process","title":"The stages, and what each one is really testing","minutes":7}}}