Software Carpentry: Lessons Learned