From Reproducibility to Over-Reproducibility (2016)
rajlaboratory.blogspot.com
rajlaboratory.blogspot.com
I really don't understand where this is coming from. It sounds like the reaction of someone forced to do something difficult and time-intensive for no good reason other than because someone thinks it's "the right way", which I can get behind. But, from what I can tell, it's just doing a "git add" and "git commit" every once in a while. Does that really require "command-line ethos"?
This maybe because I don't really understand how using git to track changes to your code or text helps reproducibility. Once you have your experiment and plotting scripts where you want them, reproducibility should be a matter of making those scripts available to others. Before you are at that point, using git is useful because you can un-screw mistakes caused by big changes or changes two or three versions of your code ago. It doesn't help reproduce your work, just organise it so you don't end up making a big, steaming mess of it. So maybe I don't understand what the author means by "reproducibility"?
Finally, all the same points the author makes against using version control apply to software development also, or anyway I don't see why they shouldn't aply to software development also. Yet, an entire industry seems to agree that version control saves butts much more than it wastes time and one would probably be very hard pressed to convince software developers that they don't need to use version control. So either there's something that entire industry is getting awfully wrong, or software developers like to "torture" themselves, or the author is missing something, maybe?
About git's awkwardness, I recognise that people who are not trained as software developers may find the command line off-putting, but on the other hand having to keep track of changes to a couple dozen documents (scripts and article versions) by hand is, for me, the stuff of nightmares. This "awkwardness" pays for itself in spades when you realise that a change in a script you've written at the start of the project and haven't tested since is suddendly raising an error and you have no idea at which point it broke. This is a common thing that comes up in my projects. Git even has a special command to do this for you - "git bisect". I can't imagine the pain in the arse it would be to try and roll back maybe months of changes by hand, by copy-pasting backup files, I guess, or by making new untracked changes, until you have nothing to go back to that actually works.
I've been in situations like this, like I say. Having a bedrock of committed code that I can go back to anytime I like is a time saver of epic proportions. A bit of "awkwardness" or even worse once in a while, is totally worth it.
And conflicts happen for a reason. How do you merge work of two or three members of a team without something like version control? That sounds like an even worse nightmare.
Look at Git commands for merging and conflict solving. Look at those tutorials, they are typically bonkers complicated and don't even answer basic questions beginners have. Or, try to list all changes in one file only. In addition, you are way more likely to forget to add a file. In code, this shows up as error on jenkins or somewhere, but in document it wont.
Or, of course, sitting down and writing a better tool than git (or svn, mercurial, etc). Personally, that's too much hassle given that someone has already done the work and all I have to do is learn how to use the program, which is much easier and much less time consuming.
In general, that's why I use other peoples' software, even when I disagree with the logic behind them and I would do a better job if I had a go at it (which is, of course, always).
However, its user interface for simple projects is step back against what existed previously. By step back I mean much harder to use.
This might not be a nice way to write code, but in my experience it is a great way to write large multi-author text documents, and requires no teaching of new tools -- git is (in my experience) far too hard to teach non-coders, when you are just doing one project together. Even with a GUI, we still have to teach them about merging/conflicts.
I understand that git appears foreboding and hostile to people who aren't trained as programmers. Again all I have to say is that I don't find it that hard and I expect a researcher in a scientific field to be able to cope with it.
It does not say making research reproducible is not worth it - it just wants one exception - about the figure layout (fonts, colors, etc) and then it argues against using version control which is orthogonal. I don't agree with him that version control is too complicated - but I agree that version control is not really needed for reproducibility.
I think there's a more important idea of reproducibility: your ideas have to be reproducible in different settings. We expect scientific rules to apply across a range of settings. If they don't, it's a recipe, it's not science. So the real burden of reproducibility is communicating your ideas so that other people can see how to apply them to other settings, and moreover so that they want to.
All the fetishizing of "give me a repo where I can just run 'make'" is, I think, distracting people from this. I wonder if making such a big deal of reproducibility-of-analyses is actually harmful: maybe it'd be a better test of reproducibility-of-science if other researchers had to reproduce your findings based on how you communicated your ideas, i.e. based on your writeup.
A cookie recipe is reproducible - follow these steps and get tasty cookies. But will they be the tastiest cookies? For that, you need more detail, but the write-ups almost never have the full story.
Having put dozens of academic ML algos into production, anything short of `make reproduce` which bare minimum gives you a table of results on some validation subset, is merely reproducible-ish. Not having vcs cause it's "hard" is straight-up slacking (use svn if git is too hard).
What you end up with is endless versions, stemming from endless "what-ifs".
The argument that you won't go back is wrong. Often it's not that you want to reset everything to a specific version, it's that you forgot what the assumptions were at a certain time. You want to know why you were doing what you were doing as much as how you implemented it. Often it's only the comments you need.
What you also need is commit hooks to test that your assumptions continue to hold. Your dataset contained 1000 stocks? Boom, something changed and now for whatever reason it went down to 10. Now you know, and you didn't waste a bunch of time picking apart everything until you found it. Or mundane things like whether some data file has been downloaded, or whether the OS has enough free space to do the analysis. The more you have of this, the more you benefit in the long run.
The "git is hard" argument is a big red flag for me. Git is one of those things where I also had loads of weird issues when I was new to it. It's worth reading some books about how it works, and trying a few apps that help with it. However, I also get a strong "I just need it to work" vibe from this piece. It's unfortunate, but I think a couple of weeks worth of reading on how git works is well worth it. I'm bu no means a git guru, but I have read books about it, and I mostly stick to the simple commands.
The thing about the graphs seems a bit strange to me. There's libs for making graphs that you can customize to your liking. Once the graph (or any binary blob) is made you can hash it and check it in a unit test. I've done the same with video outputs, it tells me if something changed.
Dropbox seems like the cloud version of folder4/version8_final_last_ultimate_2.xls to me. I wouldn't touch it, I would do things in script.
> These rationales don’t really apply, though, to code that people will write for analyzing data for a particular project. In our lab, and I suspect most others, this code is typically written by one or two people, and if two, they’re typically working in very close contact.
This part is problematic. What are you gonna do when one of those people leaves the team? What's different about analyzing data? If anything, analyzing data for a project ought to be totally reproducible, since there's no moving parts. If you need a random seed, save that as well. When you move on, someone else should be able to clone your repo, and after slogging through all the test cases they should get the same numbers as you.