Programming
Programming tutorials for people who want code that actually runs, not code that only looks right. Pick a language, start at the beginning, and don't skip the basics. They are where most problems come from.
A traceback is not the problem. It's the first clue. Four questions you ask every time, tried on real tracebacks that try to mislead you: errors in one file caused by another, errors deep inside Python's own code, two tracebacks in one message, and syntax errors that point to the wrong line.
If a person reads your output, format it. f-strings let you mix text and values, round numbers, add thousands separators and line up a table, with very little code. Formatting is for people, not for data files.
The four list moves you need on day one: make a list, add to it, remove from it, and loop over it. Plus the one mistake that gives wrong results without any error. Nothing more. The rest can wait until you need it.
Reproduce an interpreter mismatch, compare executable, pip and module paths, then verify the repair from the Python environment that runs the application.
Validate a defined spreadsheet-export contract, record rejected rows with reasons and line ranges, and reconcile accepted and rejected outputs without changing the source.
A dictionary comprehension builds a dictionary in one line. Good for transforming, filtering and building lookups. Bad for nested logic, side effects and anything that needs error handling. Shorter code is not always better code.
A decorator is just a function that wraps another function. Build a real timing decorator step by step: functions as values, the wrapper, the @ syntax, and functools.wraps. After that, the syntax stops looking like magic.
Reading a big file into a list can kill your program. A generator handles one line at a time. See the memory difference measured on a real file, learn what yield does, and chain small generators into a pipeline.
Python ignores type hints when it runs. A checker like mypy doesn't. See one file crash on its first bug, then see mypy find both bugs before anything runs, and learn where to start adding hints in an existing project.
asyncio.gather runs many waiting tasks at once in one thread and returns results in order. Avoid await in a loop and blocking calls, keep failures with return_exceptions=True, and limit concurrency with a Semaphore.
Catch a missing package resource by inspecting a wheel and testing its import, version, data file and console command in a clean environment.
A bare except hides typos and real bugs behind wrong results. Catch the specific error you expect, keep the try block small, and let everything else crash where you can see it.