Software tools can aid in learning computer science concepts by offering different ways to make the abstract more concrete and providing immediate feedback to improve learning outcomes. At Duke, we develop software tools at all levels of the curriculum that are integrated into the classroom experience. JFLAP allows students to visualize and experiment with theoretical concepts including proofs, automata, grammars, parsing, and L-systems. APTs are small algorithmic problem-solving exercises, with included test cases, that allow students to practice coding with immediate feedback about the correctness of their solution. Checklist combines analyses from a variety of open source static analysis tools to provide immediate feedback on software design, showing students what things are being done well and what things can be improved.