I based my questions on what I find most important in my work. I think this can generalize to most science. I would love to know the expert answer to these.
- How do I document what I’ve done so that my work is repeatable by someone else?
Novice: Don’t
Intermediate: In line comments. Keep a notebook. Provide big picture information in a doc string at the beginning.
Expert: All of the above. Write a readme file. Keep examples of how to run the code. Version control the code and output as an example. I haven’t ever used make files, but would this be an appropriate place for one?
- How do I write programs which I can reuse? How do I organize my work so that I can reuse it?
Novice: Don’t write reusable programs.
Intermediate: Write short functions with optional input parameters. Keep a central program folder for each project.
Expert:
- How do I test my code in a time efficient manner (I know this is very context specific)?
Novice: Test everything once you’ve finished the whole program. Make sure you get the reasonable results on the analysis you wrote your program for.
Intermediate: Test each function as you write it on a know case.
Expert: Write a set of test functions? Use assertion to catch common errors?
- How do I make my work available to others?
Novice: Email upon request
Intermediate: Put on shared storage location
Expert: Use a version controlled repository
- How do I track things I’ve tried that haven’t worked?
Novice: Don’t
Intermediate: Keep a notebook
Expert:?
- What should my code output and to where?
Novice: Data and plots to the screen and terminal windows
Intermediate: Data and plots written to files
Expert: In addition to writing data and plots to files write a log detailing the execution.