# The Unrust blog

> Answers to developers' questions about coding with AI, recall and returning to programming, with original exercises and free tools.

- Canonical HTML: [https://unrust.dev/blog](https://unrust.dev/blog)
- Markdown representation: [https://unrust.dev/blog/index.md](https://unrust.dev/blog/index.md)

Questions from Reddit, X, Medium and Quora inform our practice articles. Each links to the original discussion and offers an original exercise.

- [How do I keep my coding skills while using AI?](https://unrust.dev/blog/keep-coding-skills-while-using-ai/index.md): Keep a small part of your workflow unassisted: predict behavior, explain one decision, then check it. Try an array-mutation exercise and a practical daily routine.
- [Why do I understand code but forget how to write it?](https://unrust.dev/blog/understand-code-but-cant-write-it/index.md): Turn a familiar-looking solution into something you can reconstruct. Use a small Python exercise, a changed requirement and a follow-up attempt without hints.
- [How do I review AI-generated code that looks correct?](https://unrust.dev/blog/review-ai-generated-code-that-looks-correct/index.md): Write the contract, find a counterexample and check the fix. Practise on a JavaScript validator that passes ordinary examples but accepts an empty batch.
- [How do I get back into coding after a long break?](https://unrust.dev/blog/get-back-into-coding-after-a-break/index.md): Find out what is rusty before restarting a whole course. Try a small debugging task, then use a one-week plan for recall, tracing and a working project change.
- [Format JSON without changing the data](https://unrust.dev/blog/format-json-without-changing-data/index.md): Make a payload readable while keeping large identifiers, string escapes and duplicate keys visible. Separate syntax validation from data validation.
- [Debug timestamps: seconds, milliseconds and timezones](https://unrust.dev/blog/unix-seconds-milliseconds-and-timezones/index.md): Trace one instant through Unix seconds, milliseconds and ISO offsets. Reject impossible dates and keep local scheduling separate from timestamp conversion.
- [Read a code diff for behavior, not just changed lines](https://unrust.dev/blog/review-a-code-diff-with-intent/index.md): Use a small default-value change to review a diff, separate whitespace noise and choose examples that expose changed behavior.
- [Find an off-by-one error before running the loop](https://unrust.dev/blog/off-by-one-loop-boundaries/index.md): Trace the first check, last visit and first failed condition in a JavaScript loop. Work through exclusive bounds, larger steps and reverse loops.
- [Keep zero: choosing between || and ?? in JavaScript](https://unrust.dev/blog/javascript-defaults-or-vs-nullish/index.md): Follow a zero-retry setting through logical OR and nullish coalescing. Compare false, empty strings, null and undefined before choosing a default.
- [Why a WHERE filter turns a LEFT JOIN into an INNER JOIN](https://unrust.dev/blog/sql-left-join-where-null-filter/index.md): Trace a three-customer report through LEFT JOIN, ON filters, WHERE predicates and COUNT(column) versus COUNT(*) without dropping zero-count rows.
- [Trace exhausted Python iterators and shared mutable defaults](https://unrust.dev/blog/python-exhausted-iterators-and-mutable-defaults/index.md): Follow two stateful Python bugs line by line: a generator partially consumed by any() before sum(), and a default list shared across calls.
- [Separate the first symptom from the root cause in service logs](https://unrust.dev/blog/trace-first-symptom-vs-root-cause-in-logs/index.md): Read an interleaved gateway, checkout and ledger log timeline. See how a tight caller timeout and a retry without an idempotency key cause duplicate writes.
