Improving the learning environment in first-year programming: integrating lectures, tutorials, and laboratories