Programming is often taught as if every learner gets stuck in the same place, for the same reason.
They don’t.
One person needs to see variables change line by line. Another needs a different example.
Another understands the idea but needs to try it for themselves before it sticks.
And sometimes, the most useful thing is simply getting help at the exact moment you’re stuck.
Programming education should adapt to the learner—not force the learner to adapt to one fixed explanation.
That’s the idea behind @sharhdev — the personalized AI programming tutor I’m building.
I’ll share what I learn along the way: visual explanations, debugging, and how code actually works.
@GithubProjects Visual selection solves the first selector. The harder problem is selector decay after a redesign. I'd want saved tasks to flag when match counts or extracted shapes change, instead of quietly returning believable but wrong data.
@PythonPr Useful map, but the bottom layer is really cross-cutting. Data quality, orchestration and monitoring apply at every stage, not only after deployment. Bad data should fail near ingestion, not wait until a dashboard looks wrong.
@rauchg The interesting part is the vercel:// broker. Does it preserve Celery's usual acknowledgement and redelivery behavior when a function is interrupted, or does it map tasks onto a different retry model? That boundary decides how portable existing workers really are.
@amritasrc Good next exercise: request a path like /../../secret.txt and see how the server resolves it. A static file server needs to normalize paths and keep them inside the public directory. It shows why serving files safely is more than calling fs.readFile().
@iamprigandhi If that bundle was ever distributed, moving the key is only half the fix. Treat the old credential as exposed and rotate it too. Otherwise the code changes while the leaked key may remain usable.
@gregorojstersek Make the flaw interact with a real constraint: the code passes its tests, but retrying a request charges twice. Then the candidate has to find the missing idempotency rule, improve the spec and add the test. Much closer to actual engineering work.
@iannuttall@bot@Cursor The phone part is wild, but the planning and audit handoff is what I'm curious about. Did Grok and Cursor share one written spec, or did each agent infer the product from earlier output? That's usually where parallel builds start drifting.
@sadkatwt The useful tradeoff is that LSM trees defer more work into reads and background compaction, while B-trees spend more during updates to keep data immediately searchable. Neither is simply faster. The workload decides which cost matters.
@catsmirkk Before changing textures or backend code, profile one repeatable slow path. Record time and memory at load, parse, cache and save boundaries, then fix the largest measured cost. Otherwise it's easy to optimize whatever looks complicated instead of what is actually slow.
@e_opore The runtime boundary is the bit beginners usually miss. Once those types are erased, an API response is still just a JavaScript value. TypeScript can describe the shape you expect, but it cannot validate incoming data for you.
@adamgrag The first safety boundary here isn't prompt wording, it's permissions. An agent fixing credentials shouldn't have authority to delete production data, and a backup on the same failure domain isn't really a recovery boundary.
Making contract violations explicit is a big debugging win. One test I'd add is replaying captured streams through every layer, then checking that tool IDs, reassembled arguments and finish_reason stay semantically identical. Streaming bugs love hiding between interfaces that each look compatible alone.
@PlanetScale This makes pricing composable instead of trapping it in a calculator UI. Are price changes versioned in the schema? Without effective dates, an agent can quote today's number but can't explain why an older estimate changed.
When someone gets stuck, another tutorial is often the wrong answer.
They need the exact misconception exposed:
what they expected, what the program did, and where those paths split.
That's the teaching problem I'm trying to solve with @Sharhdev .
Logs usually record individual events.
A distributed trace connects the steps one request took across multiple services.
When a failure crosses system boundaries, that journey matters more than any single log line.
A retry is not reliability.
It is another attempt.
If the failure is deterministic, you repeat the same failure. If the dependency is overloaded, you may make it worse.
Reliability comes from deciding what is safe to retry, when, and how often.
I don’t mind AI writing unit tests.
I mind one model deciding what the feature means, writing the code, then grading itself.
If a person owns the spec and checks the important assertions, automation is useful. If not, green CI can just mean the mistake is consistent.