Answers.Body: <p>CS Unplugged has some great CS activities that focus specifically on exercises that can be done without a computer. I think this takes away a lot of the abstractness that puts many students off. </p>
  
  <p><a href="http://csunplugged.org/activities/" rel="nofollow noreferrer">http://csunplugged.org/activities/</a></p>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-23T16:53:21.927Z
Answers.Text: Welcome to CSEducators. Your profile indicates a lot of interests. For this answer it would be good if you would expand it. Which exercises do you think are especially relevant to the question and why. (We value longer answers more than shorter ones here).
Answers.UserDisplayName: Buffy
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-23T17:10:01.087Z
Answers.Text: I'd be happy to try to expand on it but I'm not quite sure what information I can provide that isn't redundant to the website. They are all novice level activities that are tangible and help students reach that "a-ha" moment. I could copy/paste one of the activities I particularly like as an example perhaps?
Answers.UserDisplayName: Jemmeh
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-23T16:38:55.253Z
Answers.LastActivityDate: 2018-01-23T16:38:55.253Z
Answers.UserDisplayName: Jemmeh
Answers.Body: <p>I just wanted to put in the word that before people expand their thinking toolbox, they need to have mastered the very first and most essential tool: the concept of named variables and mutability. Without that they will do no better than driver's education students will do with their eyes closed.</p>
  
  <p>I don't understand <em>why</em> the idea of variables and assignment gives people so much trouble, but the evidence is in: <strong>it does.</strong> Perhaps it is because nothing else in the universe works this way, and so we do not encounter such things in our daily lives. But if students do not learn right away that the whole point of programming is basically this mental game called symbolic thinking -- give a name to an arbitrary idea and then manipulate the contents of the name -- they will fail.</p>
  
  <p>I also do not know the best way to inculcate this understanding. I learned the "Post Office Box Model" sitting in front of a teletype 40 years ago when I was in middle school. Is that the best way? I don't know. Maybe the little 'ding' that the teletype made caused Pavlovian Conditioning, so that I just associated names with content and assignment of variables. If so, we need to dredge up some teletypes, or start ringing little bells in class. But there is no secret to this association, and no way around learning it.</p>
  
  <p>To a kid with a variable, everything is a program. One of my students the other day said in exasperation, "Everything is a <em>variable</em>!" as if he expected that programming would turn out to be something else. It hasn't and won't. Everything (in programming) is indeed a variable.</p>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-08T17:24:58.260Z
Answers.Text: Hello! Welcome to [cseducators.se]! Thank you for sharing your thoughts here. To me, this doesn't really answer the question, which asks for "problems and exercises." Can you please edit to try to better address the question?
Answers.UserDisplayName: thesecretmaster
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-08T17:56:55.773Z
Answers.Text: I'm also not sure how this answers the question.  Can you edit the answer to clarify this a little?  The downvotes will be removed if the link is clear.
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-08T18:11:08.710Z
Answers.Text: This view of programming seems too narrow. It is relevant, at most, to programming in languages "close" to machine code. It would be harmful to those learning Scheme or Haskell, for example. Students can learn to think from the start at a higher level than "boxes with numbers".
Answers.UserDisplayName: Buffy
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-08T21:33:06.863Z
Answers.Text: Oh, also --! I hope you won't be deceived by first appearances; we're actually quite a warm community.  I hope that we will hear much more from you, and welcome to [cseducators.se].
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-08T15:27:35.913Z
Answers.LastActivityDate: 2018-01-08T15:27:35.913Z
Answers.UserDisplayName: user3858
Answers.Body: <p>Since there are two slightly different questions here</p>
  
  <p>one in the topic</p>
  
  <blockquote>
    <p>What student exercises force them to modify and extend their own thinking process and methods?</p>
  </blockquote>
  
  <p>and one in the detail section</p>
  
  <blockquote>
    <p>In the context of extending their thinking and problem solving skills, what particular problems and exercises would you suggest to use at the novice level for teaching computer science?</p>
  </blockquote>
  
  <p>I am going to give an answer about exercises that focus on problem solving skills. The odd thing when I was building this list is how much it reminded me of those aptitude test they give you in grade school.</p>
  
  <p>When it comes to problem solving one first has to be aware that there is no one way to solving problems that always works and there may not always be an answer to a problem or there may be an answer but getting the answer is not practical.</p>
  
  <p>Algorithms commonly used<br>
  <a href="https://en.wikipedia.org/wiki/Depth-first_search" rel="nofollow noreferrer">Depth First Search</a><br>
  <a href="https://en.wikipedia.org/wiki/Breadth-first_search" rel="nofollow noreferrer">Breath First Search</a><br>
  <a href="http://Divide%20and%20conquer" rel="nofollow noreferrer">Divide and Conquer</a><br>
  <a href="https://en.wikipedia.org/wiki/Inference" rel="nofollow noreferrer">Inferencing</a> - Analogy: <a href="https://dictionary.cambridge.org/dictionary/english/connect-the-dots" rel="nofollow noreferrer">Connecting the dots</a>  </p>
  
  <p>and also thinking in <a href="https://en.wikipedia.org/wiki/Orthogonality" rel="nofollow noreferrer">orthogonality</a> of dimension/<a href="https://en.wikipedia.org/wiki/Field_(computer_science)" rel="nofollow noreferrer">field</a>.</p>
  
  <p>For one of the simplest exercises of using depth first search is the game <a href="http://store.steampowered.com/app/357600/Unium/" rel="nofollow noreferrer">Unium</a> which is to simply draw a line connecting a set of selected squares. This basically has only one dimension, a line and one method, depth first search. The puzzles get harder and harder, but you basically start drawing the line, see a problem, back up to where the problem occurred and then choose a different option and keep going and repeating until you complete the object and onto the next image to cover. This teaches that for some problems you can go back to a decision and change it to get the correct solution.</p>
  
  <p>For breath first search the game <a href="https://en.wikipedia.org/wiki/Draughts" rel="nofollow noreferrer">checkers</a> works as you can't make your next move until your opponent has made theirs and so can't resort to DFS. OK I know it really is a min-max game but BFS still applies. This teaches one that you have to look at all options available before moving.</p>
  
  <p>For divide and conquer you will needs something that has simple rules and allows you to move off a sub-problem if it is to hard but still allows you to solve the problem. For this <a href="http://www.freeminesweeper.org/minecore.html" rel="nofollow noreferrer">MineSweeper</a> is a good game. This teaches that if you get stuck on something hard try some place else and you can still get the answer; in other words some paths to the solution are easier than others.</p>
  
  <p>For something a little harder try <a href="http://store.steampowered.com/app/316610/A_Good_Snowman_Is_Hard_To_Build/" rel="nofollow noreferrer">A Good Snowman Is Hard To Build</a> as this requires at least one good a-ha moments to build a snowman. The rules are simple but is uses three dimensions. When I did this with my small class it seemed most of the students had the same a-ha when building a certain snow man because the way to the solution seemed illogical, but until one learned to do the illogical they were stuck. I won't say what lead to the a-ha moment but I suspect that if you play the game you too will be saying a-ha at one point.</p>
  
  <p>So far the way of thinking has been procedural but to add some functional thinking take a look at the <a href="http://store.steampowered.com/app/319270/Great_Permutator/" rel="nofollow noreferrer">Great Permutator</a> as this adds functions, e.g. partition using every other, accumulate, dup, swap among others. I like this one also because you can try out different combinations of the function parts before solving the whole problem.</p>
  
  <p>For a game that adds the dimension of <a href="https://en.wikipedia.org/wiki/Concurrency_(computer_science)" rel="nofollow noreferrer">concurrency</a> take a look at <a href="http://store.steampowered.com/app/92800/SpaceChem/" rel="nofollow noreferrer">SpaceChem</a>. While this doesn't look like programming if you know how to program with <a href="https://en.wikipedia.org/wiki/Lock_(computer_science)" rel="nofollow noreferrer">locks</a> and <a href="https://en.wikipedia.org/wiki/Fork%E2%80%93join_model" rel="nofollow noreferrer">fork-join</a> you will see the patterns and the best part is that it is visual. If my teacher had used this when teaching OS design it would have been a lot easier.</p>
  
  <p>Getting back to procedural and adding in variables and the Jump instruction take a look at <a href="http://store.steampowered.com/app/375820/Human_Resource_Machine/" rel="nofollow noreferrer">Human Resource Machine</a>. One of the better parts of this is that it has challenges for the least number of steps and the least number of instructions. The answers to these challenges are not intuitive but get you to realize that machines don't have to work like we think to get a better solution. </p>
  
  <p>For more advanced procedural/functional and back to the essence of what a microprocessor/ALU does check out <a href="http://store.steampowered.com/app/684270/Silicon_Zeroes/" rel="nofollow noreferrer">Silicon Zeroes</a>. This one also covers the idea of parameters and state.</p>
  
  <p>To get out of the algorithm type problems have fun with the <a href="http://store.steampowered.com/app/206410/Crazy_Machines_Elements/" rel="nofollow noreferrer">Crazy Machine Elements</a> collection. This will make you think and sometimes you can even find solutions that don't use all of the parts. What is nice about these problems is that some of the elements affect others in nonintuitive ways like reversing gravity. This teaches that you can't always have orthogonality of dimension.</p>
  
  <p>When you start playing with the dimension of time things really get interesting but finding a game that is simple but alters just time is not so easy to find, but <a href="http://store.steampowered.com/app/40930/The_Misadventures_of_PB_Winterbottom/" rel="nofollow noreferrer">The Misadventures of P.B. Winterbottom</a> seems to do the trick. This game reminds me of a single person composing a song by recording a melody, playing the melody back and adding on another melody and so on. Get one melody wrong and you have to start over. This is interesting in that it teaches one that time is also a critical dimension for solving some problems.</p>
  
  <p>Speaking of playing with different concepts what about having cooperating concepts? That brings us to <a href="http://store.steampowered.com/app/400/Portal/" rel="nofollow noreferrer">Portal</a> and <a href="http://store.steampowered.com/app/620/Portal_2/" rel="nofollow noreferrer">Portal 2</a>. I only wish they took the idea of cooperating concepts further and used other fields such as time, color, etc, and also have them competing some how. This is really interesting because it bring lots of a-ha moments if you don't look for the answers online. </p>
  
  <p><a href="http://store.steampowered.com/agecheck/app/499520/" rel="nofollow noreferrer">The Turing Test</a> changes out different dimensions/fields for solving the problems in different rooms but makes them harder as you go so that you are continuously being challenged. This helps to teach you that different properties of certain things can be used for other than their primary use, e.g. a block has weight but it can also block a beam.</p>
  
  <p>For more of a real world problem but still simple enough for learning an essential concept common with neural networks being <a href="https://en.wikipedia.org/wiki/Classification" rel="nofollow noreferrer">classification</a> would be <a href="http://store.steampowered.com/app/239030/Papers_Please/" rel="nofollow noreferrer">Papers Please</a>. I have not yet played this one, but if it doesn't live up to what other say I will strike it from the answer.</p>
  
  <p>Another game I have yet to check out but seems to deal with graphs which are essential to so many data structures in computer science is <a href="http://store.steampowered.com/app/287980/Mini_Metro/" rel="nofollow noreferrer">Mini Metro</a>.</p>
  
  <p>For the concept of <a href="https://en.wikipedia.org/wiki/Function_composition_(computer_science)" rel="nofollow noreferrer">composition</a> I have on my list <a href="http://store.steampowered.com/app/300570/Infinifactory/" rel="nofollow noreferrer">Infinifactory</a>; again one I have not personally vetted.</p>
  
  <p>So as you can see to learn how to problem solve start with simple methods and limited dimensions and keep adding on slowly with fun using games and one can learn a lot about problems solving.</p>
  
  <p>In the real world when there are known to be exact solutions to a problem I tend to find that brining in <a href="https://en.wikipedia.org/wiki/Combinatorics" rel="nofollow noreferrer">combinatorics</a> helps to solve the problem and one puzzle that quickly jumps to mind here is a <a href="https://en.wikipedia.org/wiki/Rubik%27s_Cube" rel="nofollow noreferrer">Rubik's Cube</a>. If you know the basic moves and how to apply them you can even find <a href="https://ruwix.com/the-rubiks-cube/gods-number/" rel="nofollow noreferrer">God's Number</a> which will teach you a lot of good math and computer programming algorithms.</p>
  
  <p>For more look at puzzle and logic problem books as they have lots of exercises. I did one of these books decades ago using <a href="https://en.wikipedia.org/wiki/Prolog" rel="nofollow noreferrer">Prolog</a> before it had <a href="https://en.wikipedia.org/wiki/Constraint_satisfaction_problem" rel="nofollow noreferrer">constraint satisfaction</a> and after seeing how constraint satisfaction worked with Prolog find it to be one of my favorite languages for problem solving when dealing with <a href="https://en.wikipedia.org/wiki/Closed-world_assumption" rel="nofollow noreferrer">closed world assumptions</a>.</p>
  
  <p>So by now for problem solving with computers you can see the need for algorithms (methods) and data structures (dimensions/fields) which is why the book <a href="https://rads.stackoverflow.com/amzn/click/0262033844" rel="nofollow noreferrer">Introduction to Algorithms</a> is so popular.</p>
  
  <p>If you have reached this far then check out the book <a href="https://rads.stackoverflow.com/amzn/click/069116407X" rel="nofollow noreferrer">"How to Solve It"</a> by G. Polya. While it is useful to both students and teacher, it is limited in that it was written with math in mind.</p>
  
  <p>If you are learning programming and reading this, I can not stress enough how much you should learn other paradigms of programming, e.g. <a href="https://en.wikipedia.org/wiki/Procedural_programming" rel="nofollow noreferrer">procedural</a>, <a href="https://en.wikipedia.org/wiki/Functional_programming" rel="nofollow noreferrer">functional</a>, <a href="https://en.wikipedia.org/wiki/Logic_programming" rel="nofollow noreferrer">logic</a>, and other concepts like <a href="https://www.mathworks.com/help/matlab/learn_matlab/matrices-and-arrays.html?requestedDomain=www.mathworks.com" rel="nofollow noreferrer">matrices</a> in <a href="https://www.mathworks.com/products/matlab.html" rel="nofollow noreferrer">MatLab</a>, <a href="https://www.youtube.com/watch?v=bxe2T-V8XRs" rel="nofollow noreferrer">neural networks</a> and learn as much <a href="https://www.youtube.com/channel/UCs4aHmggTfFrpkPcWSaBN9g/videos" rel="nofollow noreferrer">math</a> as you can. </p>
  
  <p>One last point that AFAIK seem to be the only one I know who uses this rule when faced with a problem I can't solve. Most advise is to back off, break the problem apart and tackle a simpler part. However at times I find that finding a harder problem and reading about it then makes my problem easier and more enjoyable. So go regularly read about <a href="https://www.sciencedaily.com/news/matter_energy/quantum_physics/" rel="nofollow noreferrer">quantum mechanics</a> and theoretical physics, <a href="https://www.technologyreview.com/s/609901/the-best-of-the-physics-arxiv-week-ending-january-6-2018/" rel="nofollow noreferrer">etc</a>., and you hopefully you will see that your problem is not that hard.</p>
  
  <p>I can spend much more time on this question but hopefully I have given you enough to get started and shown you the path to expanding on how to build out ones problem solving toolbox.</p>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-01-06T20:59:29.333Z
Answers.LastActivityDate: 2018-01-06T22:20:41.840Z
Answers.LastEditDate: 2018-01-06T22:20:41.840Z
Answers.UserDisplayName: Guy Coder
Body: <p>Beginners in CS will generally benefit from changing and expanding their thinking skills. Some of our thought processes may not be intuitive to a beginner and exercises can help them expand their thinking <em>tool box</em>. </p>
  
  <p>Lectures that make these new ways of thinking explicit can help, of course, but exercises can deepen and reinforce the knowledge. Especially helpful are exercises that lead a student to an <em>a-ha</em> moment in which that was unclear has become clear. </p>
  
  <p>In the context of extending their thinking and problem solving skills, what particular problems and exercises would you suggest to use at the novice level for teaching computer science?</p>
  
  <p>In discussions in the <a href="https://chat.stackexchange.com/rooms/59174/the-classroom">CSEducators Classroom</a> it was originally noted that "puzzle problems" may be especially helpful in this regard - especially those problems for which a person's ordinary intuition might not be helpful, but which lead the student to a deeper understanding of the essence of CS thinking.</p>
  
Comments.ContentLicense: CC BY-SA 3.0
Comments.CreationDate: 2018-01-06T15:53:23.790Z
Comments.Text: I learned a lot of programming from my homework for other subjects.  In high school,  it was physics and social studies problems. In university, it was digitizing video and computing center of mass and energy transfer for athletes performing various activities
Comments.UserDisplayName: pojo-guy
Tags: <lesson-ideas>
Title: What student exercises force them to modify and extend their own thinking process and methods?
ThreadText: # What student exercises force them to modify and extend their own thinking process and methods?
  
  (Asked by: username_0 on 2018-01-06)
  
  Beginners in CS will generally benefit from changing and expanding their thinking skills. Some of our thought processes may not be intuitive to a beginner and exercises can help them expand their thinking *tool box*.
  
  Lectures that make these new ways of thinking explicit can help, of course, but exercises can deepen and reinforce the knowledge. Especially helpful are exercises that lead a student to an *a-ha* moment in which that was unclear has become clear.
  
  In the context of extending their thinking and problem solving skills, what particular problems and exercises would you suggest to use at the novice level for teaching computer science?
  
  In discussions in the [CSEducators Classroom](https://chat.stackexchange.com/rooms/59174/the-classroom) it was originally noted that "puzzle problems" may be especially helpful in this regard - especially those problems for which a person's ordinary intuition might not be helpful, but which lead the student to a deeper understanding of the essence of CS thinking.
  
  **Tags:** lesson-ideas
  
  > **Comments:**
  > **username_1**: I learned a lot of programming from my homework for other subjects.  In high school,  it was physics and social studies problems. In university, it was digitizing video and computing center of mass and energy transfer for athletes performing various activities  
  
  ---
  
  ## 3 answers
  
  ### Answer by username_7 on 2018-01-06. Score: 2 | Accepted answer
  
  Since there are two slightly different questions here
  
  one in the topic
  
  > What student exercises force them to modify and extend their own thinking process and methods?
  
  and one in the detail section
  
  > In the context of extending their thinking and problem solving skills, what particular problems and exercises would you suggest to use at the novice level for teaching computer science?
  
  I am going to give an answer about exercises that focus on problem solving skills. The odd thing when I was building this list is how much it reminded me of those aptitude test they give you in grade school.
  
  When it comes to problem solving one first has to be aware that there is no one way to solving problems that always works and there may not always be an answer to a problem or there may be an answer but getting the answer is not practical.
  
  Algorithms commonly used  
  [Depth First Search](https://en.wikipedia.org/wiki/Depth-first_search)  
  [Breath First Search](https://en.wikipedia.org/wiki/Breadth-first_search)  
  [Divide and Conquer](http://Divide%20and%20conquer)  
  [Inferencing](https://en.wikipedia.org/wiki/Inference) - Analogy: [Connecting the dots](https://dictionary.cambridge.org/dictionary/english/connect-the-dots)
  
  and also thinking in [orthogonality](https://en.wikipedia.org/wiki/Orthogonality) of dimension/[field](https://en.wikipedia.org/wiki/Field_(computer_science)).
  
  For one of the simplest exercises of using depth first search is the game [Unium](http://store.steampowered.com/app/357600/Unium/) which is to simply draw a line connecting a set of selected squares. This basically has only one dimension, a line and one method, depth first search. The puzzles get harder and harder, but you basically start drawing the line, see a problem, back up to where the problem occurred and then choose a different option and keep going and repeating until you complete the object and onto the next image to cover. This teaches that for some problems you can go back to a decision and change it to get the correct solution.
  
  For breath first search the game [checkers](https://en.wikipedia.org/wiki/Draughts) works as you can't make your next move until your opponent has made theirs and so can't resort to DFS. OK I know it really is a min-max game but BFS still applies. This teaches one that you have to look at all options available before moving.
  
  For divide and conquer you will needs something that has simple rules and allows you to move off a sub-problem if it is to hard but still allows you to solve the problem. For this [MineSweeper](http://www.freeminesweeper.org/minecore.html) is a good game. This teaches that if you get stuck on something hard try some place else and you can still get the answer; in other words some paths to the solution are easier than others.
  
  For something a little harder try [A Good Snowman Is Hard To Build](http://store.steampowered.com/app/316610/A_Good_Snowman_Is_Hard_To_Build/) as this requires at least one good a-ha moments to build a snowman. The rules are simple but is uses three dimensions. When I did this with my small class it seemed most of the students had the same a-ha when building a certain snow man because the way to the solution seemed illogical, but until one learned to do the illogical they were stuck. I won't say what lead to the a-ha moment but I suspect that if you play the game you too will be saying a-ha at one point.
  
  So far the way of thinking has been procedural but to add some functional thinking take a look at the [Great Permutator](http://store.steampowered.com/app/319270/Great_Permutator/) as this adds functions, e.g. partition using every other, accumulate, dup, swap among others. I like this one also because you can try out different combinations of the function parts before solving the whole problem.
  
  For a game that adds the dimension of [concurrency](https://en.wikipedia.org/wiki/Concurrency_(computer_science)) take a look at [SpaceChem](http://store.steampowered.com/app/92800/SpaceChem/). While this doesn't look like programming if you know how to program with [locks](https://en.wikipedia.org/wiki/Lock_(computer_science)) and [fork-join](https://en.wikipedia.org/wiki/Fork%E2%80%93join_model) you will see the patterns and the best part is that it is visual. If my teacher had used this when teaching OS design it would have been a lot easier.
  
  Getting back to procedural and adding in variables and the Jump instruction take a look at [Human Resource Machine](http://store.steampowered.com/app/375820/Human_Resource_Machine/). One of the better parts of this is that it has challenges for the least number of steps and the least number of instructions. The answers to these challenges are not intuitive but get you to realize that machines don't have to work like we think to get a better solution.
  
  For more advanced procedural/functional and back to the essence of what a microprocessor/ALU does check out [Silicon Zeroes](http://store.steampowered.com/app/684270/Silicon_Zeroes/). This one also covers the idea of parameters and state.
  
  To get out of the algorithm type problems have fun with the [Crazy Machine Elements](http://store.steampowered.com/app/206410/Crazy_Machines_Elements/) collection. This will make you think and sometimes you can even find solutions that don't use all of the parts. What is nice about these problems is that some of the elements affect others in nonintuitive ways like reversing gravity. This teaches that you can't always have orthogonality of dimension.
  
  When you start playing with the dimension of time things really get interesting but finding a game that is simple but alters just time is not so easy to find, but [The Misadventures of P.B. Winterbottom](http://store.steampowered.com/app/40930/The_Misadventures_of_PB_Winterbottom/) seems to do the trick. This game reminds me of a single person composing a song by recording a melody, playing the melody back and adding on another melody and so on. Get one melody wrong and you have to start over. This is interesting in that it teaches one that time is also a critical dimension for solving some problems.
  
  Speaking of playing with different concepts what about having cooperating concepts? That brings us to [Portal](http://store.steampowered.com/app/400/Portal/) and [Portal 2](http://store.steampowered.com/app/620/Portal_2/). I only wish they took the idea of cooperating concepts further and used other fields such as time, color, etc, and also have them competing some how. This is really interesting because it bring lots of a-ha moments if you don't look for the answers online.
  
  [The Turing Test](http://store.steampowered.com/agecheck/app/499520/) changes out different dimensions/fields for solving the problems in different rooms but makes them harder as you go so that you are continuously being challenged. This helps to teach you that different properties of certain things can be used for other than their primary use, e.g. a block has weight but it can also block a beam.
  
  For more of a real world problem but still simple enough for learning an essential concept common with neural networks being [classification](https://en.wikipedia.org/wiki/Classification) would be [Papers Please](http://store.steampowered.com/app/239030/Papers_Please/). I have not yet played this one, but if it doesn't live up to what other say I will strike it from the answer.
  
  Another game I have yet to check out but seems to deal with graphs which are essential to so many data structures in computer science is [Mini Metro](http://store.steampowered.com/app/287980/Mini_Metro/).
  
  For the concept of [composition](https://en.wikipedia.org/wiki/Function_composition_(computer_science)) I have on my list [Infinifactory](http://store.steampowered.com/app/300570/Infinifactory/); again one I have not personally vetted.
  
  So as you can see to learn how to problem solve start with simple methods and limited dimensions and keep adding on slowly with fun using games and one can learn a lot about problems solving.
  
  In the real world when there are known to be exact solutions to a problem I tend to find that brining in [combinatorics](https://en.wikipedia.org/wiki/Combinatorics) helps to solve the problem and one puzzle that quickly jumps to mind here is a [Rubik's Cube](https://en.wikipedia.org/wiki/Rubik%27s_Cube). If you know the basic moves and how to apply them you can even find [God's Number](https://ruwix.com/the-rubiks-cube/gods-number/) which will teach you a lot of good math and computer programming algorithms.
  
  For more look at puzzle and logic problem books as they have lots of exercises. I did one of these books decades ago using [Prolog](https://en.wikipedia.org/wiki/Prolog) before it had [constraint satisfaction](https://en.wikipedia.org/wiki/Constraint_satisfaction_problem) and after seeing how constraint satisfaction worked with Prolog find it to be one of my favorite languages for problem solving when dealing with [closed world assumptions](https://en.wikipedia.org/wiki/Closed-world_assumption).
  
  So by now for problem solving with computers you can see the need for algorithms (methods) and data structures (dimensions/fields) which is why the book [Introduction to Algorithms](https://rads.stackoverflow.com/amzn/click/0262033844) is so popular.
  
  If you have reached this far then check out the book ["How to Solve It"](https://rads.stackoverflow.com/amzn/click/069116407X) by G. Polya. While it is useful to both students and teacher, it is limited in that it was written with math in mind.
  
  If you are learning programming and reading this, I can not stress enough how much you should learn other paradigms of programming, e.g. [procedural](https://en.wikipedia.org/wiki/Procedural_programming), [functional](https://en.wikipedia.org/wiki/Functional_programming), [logic](https://en.wikipedia.org/wiki/Logic_programming), and other concepts like [matrices](https://www.mathworks.com/help/matlab/learn_matlab/matrices-and-arrays.html?requestedDomain=www.mathworks.com) in [MatLab](https://www.mathworks.com/products/matlab.html), [neural networks](https://www.youtube.com/watch?v=bxe2T-V8XRs) and learn as much [math](https://www.youtube.com/channel/UCs4aHmggTfFrpkPcWSaBN9g/videos) as you can.
  
  One last point that AFAIK seem to be the only one I know who uses this rule when faced with a problem I can't solve. Most advise is to back off, break the problem apart and tackle a simpler part. However at times I find that finding a harder problem and reading about it then makes my problem easier and more enjoyable. So go regularly read about [quantum mechanics](https://www.sciencedaily.com/news/matter_energy/quantum_physics/) and theoretical physics, [etc](https://www.technologyreview.com/s/609901/the-best-of-the-physics-arxiv-week-ending-january-6-2018/)., and you hopefully you will see that your problem is not that hard.
  
  I can spend much more time on this question but hopefully I have given you enough to get started and shown you the path to expanding on how to build out ones problem solving toolbox.
  
  
  ---
  
  ### Answer by username_2 on 2018-01-23. Score: 1
  
  CS Unplugged has some great CS activities that focus specifically on exercises that can be done without a computer. I think this takes away a lot of the abstractness that puts many students off.
  
  <http://csunplugged.org/activities/>
  
  > **Comments:**
  > **username_3**: Welcome to CSEducators. Your profile indicates a lot of interests. For this answer it would be good if you would expand it. Which exercises do you think are especially relevant to the question and why. (We value longer answers more than shorter ones here).  
  > **username_2**: I'd be happy to try to expand on it but I'm not quite sure what information I can provide that isn't redundant to the website. They are all novice level activities that are tangible and help students reach that "a-ha" moment. I could copy/paste one of the activities I particularly like as an example perhaps?  
  
  ---
  
  ### Answer by username_4 on 2018-01-08. Score: -1
  
  I just wanted to put in the word that before people expand their thinking toolbox, they need to have mastered the very first and most essential tool: the concept of named variables and mutability. Without that they will do no better than driver's education students will do with their eyes closed.
  
  I don't understand *why* the idea of variables and assignment gives people so much trouble, but the evidence is in: **it does.** Perhaps it is because nothing else in the universe works this way, and so we do not encounter such things in our daily lives. But if students do not learn right away that the whole point of programming is basically this mental game called symbolic thinking -- give a name to an arbitrary idea and then manipulate the contents of the name -- they will fail.
  
  I also do not know the best way to inculcate this understanding. I learned the "Post Office Box Model" sitting in front of a teletype 40 years ago when I was in middle school. Is that the best way? I don't know. Maybe the little 'ding' that the teletype made caused Pavlovian Conditioning, so that I just associated names with content and assignment of variables. If so, we need to dredge up some teletypes, or start ringing little bells in class. But there is no secret to this association, and no way around learning it.
  
  To a kid with a variable, everything is a program. One of my students the other day said in exasperation, "Everything is a *variable*!" as if he expected that programming would turn out to be something else. It hasn't and won't. Everything (in programming) is indeed a variable.
  
  > **Comments:**
  > **username_5**: Hello! Welcome to [cseducators.se]! Thank you for sharing your thoughts here. To me, this doesn't really answer the question, which asks for "problems and exercises." Can you please edit to try to better address the question?  
  > **username_6**: I'm also not sure how this answers the question.  Can you edit the answer to clarify this a little?  The downvotes will be removed if the link is clear.  
  > **username_3**: This view of programming seems too narrow. It is relevant, at most, to programming in languages "close" to machine code. It would be harmful to those learning Scheme or Haskell, for example. Students can learn to think from the start at a higher level than "boxes with numbers".  
  > **username_6**: Oh, also --! I hope you won't be deceived by first appearances; we're actually quite a warm community.  I hope that we will hear much more from you, and welcome to [cseducators.se].  
  
  ---
  
  