An epistemology for software tool design that promotes knowledge production: Experiences with students learning computer programming languages | IEEE Conference Publication | IEEE Xplore