Have students work in small groups to solve logic puzzles so they develop algorithmic thinking and good problem-solving habits.
To show that algorithm design is difficult, have students write algorithms, exchange their work, and then attempt to execute each others instructions.
Remind students about steps of the problem-solving process as they develop algorithms to solve programming problems.
Even if students are developing useful strategies for problem solving, they can be easily discouraged if they don’t see immediate, good results.
Students often get stuck because they start working on a problem without thinking about what they need to know and do in order to get a working solution.
Do not have students write code for common algorithms. Instead, incorporate common algorithms into your class in novel course-specific variants
Use graphs, visualizations, and examples to help make seemingly ‘ill-defined’ topics like Big-O feel more concrete.
Often, intuitive examples trump overly-technical description for introductions to tricky concepts such as Big-O runtime.
When teaching introductory courses, teach students to use “top-down thinking” and “bottom-up implementation.”