{"course":{"slug":"building-apps-with-ai","title":"Building Apps with AI","url":"https://addaly.com/learn/building-apps-with-ai","level":"beginner","track":"build"},"lesson":{"slug":"where-you-have-to-learn-to-code","title":"Where you have to learn to code","url":"https://addaly.com/learn/building-apps-with-ai/where-you-have-to-learn-to-code","position":85,"of":87,"minutes":9,"answer":"The limit is not app size or traffic; it is nobody holding an accurate model of how the system works.","keyIdea":"The limit is not app size or traffic; it is nobody holding an accurate model of how the system works."},"body":{"format":"markdown","text":"## The ceiling is real, and it is not where people expect\n\nThe limit is not your app getting big. It is not your app getting popular. It is not a feature the model has never seen.\n\nThe limit is this: **at some point somebody has to hold an accurate model of how the system works, and the AI does not hold one.** It holds whatever is in front of it right now. If you do not hold one either, then nobody does, and the project starts moving sideways instead of forward.\n\n## Signs you have hit it\n\n- The same bug returns wearing different clothes. Fixed three times, back a fourth. Nobody understands why it happens, so every fix is a guess.\n- You cannot say what happens when a user clicks a button. Not the code: the sequence.\n- You cannot describe your data in one paragraph. What tables exist, what each one holds, how they connect.\n- Every change feels like a gamble. You ask for one thing and brace.\n- Something breaks in production and you have no idea where to look, because you have never opened a log.\n- You are afraid to touch a working part of the app.\n\nOne of these is normal. Four of them means more prompting will not help, and you have three real choices: learn enough to hold the model yourself, bring in someone who can, or keep the project small enough that guessing is affordable.\n\nAll three are legitimate. Pretending you are not at the ceiling is not.\n\n## Where AI-built is fine\n\nInternal tools. Prototypes to show someone an idea. Personal projects. Marketing sites. Small community apps. Anything where the worst outcome is that it stops working and someone is mildly annoyed.\n\nThis is a large category and it is not a consolation prize. Software that used to need a developer and a budget now takes a weekend. That is a real change in who gets to build.\n\n## Where unsupervised AI code is not fine\n\nOther people's money. Health information. Anything involving children. Anything with a legal duty attached, and depending on where your users are, storing personal data may already be one. Anything where an outage or a leak costs someone other than you.\n\nNot because AI writes worse code in those domains. Because in those domains the cost of the failure modes in lesson 8 is borne by people who did not choose your risk tolerance.\n\n## What to actually learn, in order\n\nThis is not four years of computer science. It is maybe sixty to a hundred hours, and the order matters more than the source.\n\n**1. Errors.** Read a stack trace. Find the line in your own code. Use the browser console and your host's logs. This alone removes most of the helplessness.\n\n**2. The path of one request.** Browser sends something, server receives it, server talks to the database, response comes back, screen updates. Trace it once for real, in your own app, out loud. Everything else attaches to this.\n\n**3. Your data model.** What tables you have, what each row means, how they relate. Write one SQL query by hand. Being able to look directly at your data changes your relationship with the app permanently.\n\n**4. Enough of one language to write fifty lines unaided.** Not fluency. Enough that reading a diff is reading, not decoding. Pick whatever your app is already written in.\n\n**5. Tests.** A small number of automated checks that prove the important things still work. This is what lets you accept a change without personally clicking through the app, and it is the point where you stop being the bottleneck.\n\nDo them in that order. Each one makes the next easier, and each one pays for itself immediately.\n\n## The position\n\nThese tools are extraordinary and the ceiling is moving up. Some of what is hard today will be routine in a year, and a course written then will say different things about the details.\n\nWhat will not change soon is the shape: a system that generates confident output, and a person who has to decide whether to trust it. The value has moved from typing the code to knowing what you want, checking what you got, and understanding the thing you have made.\n\nYou can build real software right now, today, without being a programmer. Build it. Then learn enough that you are not guessing, not because guessing is shameful, but because it stops being fun about six weeks in, and the sixty hours are cheaper than the six weeks.\n\n> Figure: Sixty hours, and the order matters more than the source. Steps: 1. Errors (Read a trace to the line in your own code); 2. One request (Click to database and back, traced out loud); 3. Your data (Write one query by hand and read the plan); 4. Fifty lines (Enough that a diff reads rather than decodes); 5. Ten tests (Five for functions, five through a browser). Each one makes the next easier and each pays for itself immediately. The last is where you stop being the bottleneck, because a change can be accepted by running something rather than by clicking through the app."},"check":{"question":"Which situation is the clearest sign that better prompting will not help and you need to understand the system yourself?","options":[{"text":"The project has grown past what the tool can read at once, so the model keeps missing relevant files.","correct":false,"tempting":"Frames the ceiling as a tooling limit that a larger context window or a better index would remove, rather than as a gap in anyone's understanding."},{"text":"A bug keeps returning in slightly different forms, and nobody can explain why it happens.","correct":true},{"text":"The app needs a feature that is unusual enough that the model has probably never seen anything like it.","correct":false,"tempting":"Assumes novelty is the constraint, when models compose unfamiliar features reasonably well and the risk is in verification, not invention."},{"text":"The app now has thousands of users and is starting to slow down under the load.","correct":false,"tempting":"Treats scale as the natural breaking point, when performance problems are usually specific, measurable and fixable without deep expertise."}]},"prev":{"slug":"handing-it-to-a-real-developer","title":"Handing it to a real developer","url":"https://addaly.com/learn/building-apps-with-ai/handing-it-to-a-real-developer"},"next":{"slug":"the-learning-path-from-here","title":"The learning path from here, with the model as tutor","url":"https://addaly.com/learn/building-apps-with-ai/the-learning-path-from-here"},"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) 'Where you have to learn to code', in Building Apps with AI. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/building-apps-with-ai/where-you-have-to-learn-to-code (Accessed: 31 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Where you have to learn to code","courseTitle":"Building Apps with AI","module":{"index":9,"slug":"what-it-costs-and-where-this-stops","title":"What it costs, running it, and where this stops"},"answer":null,"keyIdea":"The limit is not app size or traffic; it is nobody holding an accurate model of how the system works.","hero":{"kind":"figure","figure":{"t":"figure","label":"Figure","figure":{"type":"flow","steps":[{"label":"Errors","detail":"Read a trace to the line in your own code"},{"label":"One request","detail":"Click to database and back, traced out loud"},{"label":"Your data","detail":"Write one query by hand and read the plan"},{"label":"Fifty lines","detail":"Enough that a diff reads rather than decodes"},{"label":"Ten tests","detail":"Five for functions, five through a browser"}],"title":"Sixty hours, and the order matters more than the source","caption":"Each one makes the next easier and each pays for itself immediately. The last is where you stop being the bottleneck, because a change can be accepted by running something rather than by clicking through the app."},"alt":"Figure: Sixty hours, and the order matters more than the source. Steps: 1. Errors (Read a trace to the line in your own code); 2. One request (Click to database and back, traced out loud); 3. Your data (Write one query by hand and read the plan); 4. Fifty lines (Enough that a diff reads rather than decodes); 5. Ten tests (Five for functions, five through a browser). Each one makes the next easier and each pays for itself immediately. The last is where you stop being the bottleneck, because a change can be accepted by running something rather than by clicking through the app."}},"blocks":[{"t":"h2","id":"the-ceiling-is-real-and-it-is-not-where-people-expect","runs":[{"text":"The ceiling is real, and it is not where people expect"}]},{"t":"p","runs":[{"text":"The limit is not your app getting big. It is not your app getting popular. It is not a feature the model has never seen."}]},{"t":"p","runs":[{"text":"The limit is this: "},{"text":"at some point somebody has to hold an accurate model of how the system works, and the AI does not hold one.","b":true},{"text":" It holds whatever is in front of it right now. If you do not hold one either, then nobody does, and the project starts moving sideways instead of forward."}]},{"t":"h2","id":"signs-you-have-hit-it","runs":[{"text":"Signs you have hit it"}]},{"t":"ul","items":[[{"text":"The same bug returns wearing different clothes. Fixed three times, back a fourth. Nobody understands why it happens, so every fix is a guess."}],[{"text":"You cannot say what happens when a user clicks a button. Not the code: the sequence."}],[{"text":"You cannot describe your data in one paragraph. What tables exist, what each one holds, how they connect."}],[{"text":"Every change feels like a gamble. You ask for one thing and brace."}],[{"text":"Something breaks in production and you have no idea where to look, because you have never opened a log."}],[{"text":"You are afraid to touch a working part of the app."}]]},{"t":"p","runs":[{"text":"One of these is normal. Four of them means more prompting will not help, and you have three real choices: learn enough to hold the model yourself, bring in someone who can, or keep the project small enough that guessing is affordable."}]},{"t":"p","runs":[{"text":"All three are legitimate. Pretending you are not at the ceiling is not."}]},{"t":"h2","id":"where-ai-built-is-fine","runs":[{"text":"Where AI-built is fine"}]},{"t":"p","runs":[{"text":"Internal tools. Prototypes to show someone an idea. Personal projects. Marketing sites. Small community apps. Anything where the worst outcome is that it stops working and someone is mildly annoyed."}]},{"t":"p","runs":[{"text":"This is a large category and it is not a consolation prize. Software that used to need a developer and a budget now takes a weekend. That is a real change in who gets to build."}]},{"t":"h2","id":"where-unsupervised-ai-code-is-not-fine","runs":[{"text":"Where unsupervised AI code is not fine"}]},{"t":"p","runs":[{"text":"Other people’s money. Health information. Anything involving children. Anything with a legal duty attached, and depending on where your users are, storing personal data may already be one. Anything where an outage or a leak costs someone other than you."}]},{"t":"p","runs":[{"text":"Not because AI writes worse code in those domains. Because in those domains the cost of the failure modes in lesson 8 is borne by people who did not choose your risk tolerance."}]},{"t":"h2","id":"what-to-actually-learn-in-order","runs":[{"text":"What to actually learn, in order"}]},{"t":"p","runs":[{"text":"This is not four years of computer science. It is maybe sixty to a hundred hours, and the order matters more than the source."}]},{"t":"p","runs":[{"text":"1. Errors.","b":true},{"text":" Read a stack trace. Find the line in your own code. Use the browser console and your host’s logs. This alone removes most of the helplessness."}]},{"t":"p","runs":[{"text":"2. The path of one request.","b":true},{"text":" Browser sends something, server receives it, server talks to the database, response comes back, screen updates. Trace it once for real, in your own app, out loud. Everything else attaches to this."}]},{"t":"p","runs":[{"text":"3. Your data model.","b":true},{"text":" What tables you have, what each row means, how they relate. Write one SQL query by hand. Being able to look directly at your data changes your relationship with the app permanently."}]},{"t":"p","runs":[{"text":"4. Enough of one language to write fifty lines unaided.","b":true},{"text":" Not fluency. Enough that reading a diff is reading, not decoding. Pick whatever your app is already written in."}]},{"t":"p","runs":[{"text":"5. Tests.","b":true},{"text":" A small number of automated checks that prove the important things still work. This is what lets you accept a change without personally clicking through the app, and it is the point where you stop being the bottleneck."}]},{"t":"p","runs":[{"text":"Do them in that order. Each one makes the next easier, and each one pays for itself immediately."}]},{"t":"h2","id":"the-position","runs":[{"text":"The position"}]},{"t":"p","runs":[{"text":"These tools are extraordinary and the ceiling is moving up. Some of what is hard today will be routine in a year, and a course written then will say different things about the details."}]},{"t":"p","runs":[{"text":"What will not change soon is the shape: a system that generates confident output, and a person who has to decide whether to trust it. The value has moved from typing the code to knowing what you want, checking what you got, and understanding the thing you have made."}]},{"t":"p","runs":[{"text":"You can build real software right now, today, without being a programmer. Build it. Then learn enough that you are not guessing, not because guessing is shameful, but because it stops being fun about six weeks in, and the sixty hours are cheaper than the six weeks."}]}],"check":{"question":[{"text":"Which situation is the clearest sign that better prompting will not help and you need to understand the system yourself?"}],"options":[{"text":[{"text":"The project has grown past what the tool can read at once, so the model keeps missing relevant files."}],"correct":false,"tempting":[{"text":"Frames the ceiling as a tooling limit that a larger context window or a better index would remove, rather than as a gap in anyone’s understanding."}]},{"text":[{"text":"A bug keeps returning in slightly different forms, and nobody can explain why it happens."}],"correct":true,"tempting":null},{"text":[{"text":"The app needs a feature that is unusual enough that the model has probably never seen anything like it."}],"correct":false,"tempting":[{"text":"Assumes novelty is the constraint, when models compose unfamiliar features reasonably well and the risk is in verification, not invention."}]},{"text":[{"text":"The app now has thousands of users and is starting to slow down under the load."}],"correct":false,"tempting":[{"text":"Treats scale as the natural breaking point, when performance problems are usually specific, measurable and fixable without deep expertise."}]}],"order":[0,2,3,1],"why":null},"prev":{"slug":"handing-it-to-a-real-developer","title":"Handing it to a real developer","minutes":8},"next":{"slug":"the-learning-path-from-here","title":"The learning path from here, with the model as tutor","minutes":9}}}