Computer programming skills are useful for a wide range of professions. The ability to communicate effectively about code is essential to learning programming. For instructors, understanding the misconceptions and approaches in students' code helps them design instructional content and give useful feedback. For learners to understand programming tutorials, they need clear explanation of the rationale and code changes. I develop tools to support both synchronous and asynchronous communication about code at scale, through combining techniques from Human-Computer Interaction, Visualization, and Machine Learning.