Everyone has added a lot of great ideas! Like Ben I took a different tack and I tried to think of some of the common complaints I remember hearing in grad school:
- My program is crashing!
- Novice: changes things at random, adds print statements
- Intermediate: knows how to read a Python traceback, understands common error cases
- Advanced: uses a debugger, logs program state, uses assertions to enforce program validity
- My results are wrong and I don’t know why!
- Novice: changes things at random, adds print statements, spends a lot of time reading source code
- Intermediate: keeps intermediate results
- Advanced: writes code in small, functional units and uses unit tests to ensure correctness
- I don’t know if my results are right!
- Novice: eyeballs things or assumes correctness
- Intermediate: manually compares results to previous runs or other codes
- Advanced: writes code in small, functional units and uses unit tests to ensure correctness. uses regression tests to compare to known results.
- I want my computer to do X, but I don’t know how!
- Novice: guesses, googles, uses naive solutions
- Intermediate: checks online knowledge bases like stackoverflow or looks in books
- Advanced: asks colleagues/computing specialists
- I want to use package X, but I can’t get it installed!
- Novice: try for a few hours, give up.
- Intermediate: read the instructions, try for a few minutes, give up.
- Advanced: re-write the install script and compile core libraries for days until it works.