What’s NOT Computational Thinking? Curly braces, x = x + 1, and else.

May 3, 2019 at 7:00 am 37 comments

In the previous blog post, I suggested that Computational Thinking is the friction necessary to make your problem solvable by a computer. It should be minimized unless it’s generative.  It’s a very different framing for computational thinking.  Rather than “what’s everything that we use in computing that might be useful for kids,” it’s closer to, “the day is full and students are already in so many subjects — what do they have to know about computing in order to use it to further their learning and their lives?”

What is NOT Computational Thinking

I have been talking to my students about what’s on the list of things that we typically teach but don’t fit into this model of computational thinking. Here’s what I’ve thought of so-far:

Here are criteria for what should NOT be part of teaching computational thinking:

  • These are hard for students — why go to that extra effort unless it’s worthwhile?
  • We have invented ways of framing problems for a computer that do not use these things, so they’re not necessary.
  • They are not generative. Knowing any of these things does not give you new leverage on thinking about problems within a domain.

If Computational Thinking is something we should teach to everyone, these are items that are not worth teaching to everyone.

Computational thinking includes programming, for me. It is generative.  It allows students to explore causal models that are tested with automation.  It’s the most powerful idea in computational thinking.

What is Computational Thinking for OTHER subjects

Then there are the ideas that are on most lists of computational thinking, like decomposition and abstraction. I absolutely believe that all programmers have those skills. They are absolutely generative. I believe that programming is a terrific place to try out and play with those ideas.

In the Rich et al. paper about learning trajectories that I reference so often, they talk about students learning “Different sets of instructions can produce the same outcome.” That’s a critical idea if you want students to learn that different decompositions can still result in the same outcome.

But does abstraction and decomposition belong in a Computational Thinking class?  They feel more like mathematics, science, and engineering to me.  Yes, use computing there, but don’t break them out into a separate class.  A mathematics teacher may be better prepared to teach decomposition and abstraction than are computer science teachers. It’s better to teach these ideas in a context with a teacher who has the PCK to teach them.

What’s more, it’s clear that you don’t need abstraction and decomposition to program computers as a way to learn.  Task-specific programming languages are usable for learning something else without developing new abilities to abstract or decompose. Our social studies teachers did in our participatory design study in March — they learned things about life expectancy in different parts of the world, using programming that they did themselves, in 10-20 minutes.

What is Computer Science that EVERYONE should know

There’s another list we could make that is ideas in computer science that everyone should know because it helps them to understand the computation in their lives.  Yes, there’s a lot in the school day — but this is worth it for the same reason that Physics or Biology is worth it. This is a different matter than what helps them solve problems (which is the guts of the computational thinking definitions we have seen earlier).  On my list, I’d include:

  • Bits, the atom of information processing.
  • Processes, what programs allow us to define.
  • Programming, as a way to define processes.

Other suggestions?

  • What’s on your list for what’s NOT necessary in Computational Thinking, and
  • What is in Computer Science that everyone needs but is not Computational Thinking?

Entry filed under: Uncategorized. Tags: , .

A new definition of Computational Thinking: It’s the Friction that we want to Minimize unless it’s Generative, Comparing performance in learning computer science between countries

37 Comments Add your own

  • 1. Robert R Gotwals  |  May 3, 2019 at 9:05 am

    Nowhere in any of these discussions is the term “computational science” discussed. In looking at Weintrop’s taxonomy, which that paper describes as “computational thinking”, it sure seems like it’s explicitly describing computational science. How did the well-established field of computational science get lost in all of these discussions? Is computational thinking really something new? Sure doesn’t feel like it.

    • 2. Mark Guzdial  |  May 3, 2019 at 9:47 pm

      Great question! No, I don’t know where “computational science” went in the discussion of CT.

      • 3. Robert R Gotwals  |  May 6, 2019 at 8:50 am

        As a long-time computational science educator (35+ years), it sure feels like CT is the new “shiny bauble” that everyone is excited about. The technologies, techniques, and tools of computational science are well-established in the scientific community, and the use of these in schools is pretty minimal. I don’t have numbers, but it’s likely that 90% of school kids can’t use a basic spreadsheet, so talking about higher-order skills such as abstraction may be putting the cart before the horse. As above, Weintrop’s taxonomy is computational science, pure and simple.

  • 4. Stephen Gilbert  |  May 3, 2019 at 2:51 pm

    Can you explain more (or give examples) about why you think the concepts you mentioned should not be taught to everyone? I’m almost certain that I am misunderstanding what you are saying.

    I can’t imagine how I could teach any kind of algorithm without while, if-else and x = x + 1, whether or not I was using a computer or computer language.

    • 5. Mark Guzdial  |  May 3, 2019 at 9:46 pm

      CT is about the computing you need to solve problems with a computer. You don’t need to know much about algorithms to do that — look at what students do with Scratch or in Bootstrap: Algebra. Neither of those look like traditional algorithms.

    • 6. Daniel Garcia  |  May 3, 2019 at 11:56 pm

      Look into functional programming, you don’t need x = x + 1 to teach algorithms

      • 7. Robert R Gotwals  |  May 4, 2019 at 9:12 am

        We are a heavy Mathematica school, a tool which really supports and encourages functional programming. I am using it for all of my (computational) classes as the foundational program for all students. We have 11 courses in computational science at our place, including a new course in digital humanities.

  • 8. Daniel Garcia  |  May 3, 2019 at 5:19 pm

    I’m not sure if these topics are related at all with Computational Thinking. But I feel people should learn how computers and networks work to have a better understanding of privacy, security, forgery and all kinds of tricks hackers use to steal information.

    • 9. Mark Guzdial  |  May 3, 2019 at 9:47 pm

      People probably do need to know about privacy and security, but that’s not CT and I’m not sure it’s computer science.

      • 10. Briana Morrison  |  May 4, 2019 at 2:09 pm

        If networks, privacy, and security aren’t CT then where do they go? Unfortunately the core topics of privacy and security today are completely intertwined with your digital footprint and digital devices. When do you use this device and what data does it store and who will have access to it: fits my definition of CT!

        • 11. Mark Guzdial  |  May 4, 2019 at 2:26 pm

          Maybe the skills that everyone needs to be a digital citizen? Maybe digital literacy? If our community is saying that CT is about problem-solving (e.g., see the ISTE definition), then it’s not also about how networks work and how to protect your private data.

  • 12. joek  |  May 3, 2019 at 6:42 pm

    I think abstraction and decomposition are key in handling the complexity of computational artefacts and deserve it to be taught as CS. Understanding and appreciating these ideas might be easier in the realm of computing than mathematics.

    I’m missing algorithms in the lists, as well as representation of information. Not specific algorithms or specific representations but the power they can provide.

    And something human.

    Inspired by the great poster of CAS Barefoot https://callysto.ca/wp-content/uploads/2018/10/Computational-Thinker_ENG_web.jpg

    And by the article started by Tim Bell which links back to a 2012 entry on this blog: https://www.canterbury.ac.nz/media/documents/oexp-engineering/BigIdeas-webdocument.pdf

    • 13. Mark Guzdial  |  May 3, 2019 at 9:34 pm

      I think I agree with you, because you said CS. That’s different from Computational Thinking.

      • 14. joek  |  May 4, 2019 at 7:48 am

        With my limited understanding of English I may well miss the subtleties in separating CT form CS. My comment might be off topic. However I feel all five of them (abstraction, decomposition, algorithms, representation and human impact) are constants in the field and have a place in

        “the day is full and students are already in so many subjects — what do they have to know about computing in order to use it to further their learning and their lives?”

      • 15. joek  |  May 4, 2019 at 7:57 am

        Or should I read

        “… what do they have to know about computing in order to use it to further their learning and their lives?”

        as CT are the transferrable knowledge/approaches of CS, the ideas with value outside CS.

        • 16. Mark Guzdial  |  May 4, 2019 at 8:10 am

          I think that’s part of the goal of CT. There’s little evidence that that works, that people transfer CT knowledge and apply it in new contexts.

  • 17. Jens Mönig (@moenig)  |  May 4, 2019 at 2:31 am

    Some more suggestions of things sometimes seen in CT activities that are hard for students, not necessary and not generative, and go beyond syntax:

    Binary numbers – cruel for beginners, just use decimals instead
    Bits and bytes – likewise, we have numbers and text
    Sorting algorithms – don’t even get me started
    Trigonometry – use turtle geometry instead
    Static typing – how to make variables harder yet
    Compiled languages – interpreters can be more interactive
    Robotics – intellectually shallow motivation for some, not all
    Imperative programming – assignment is NOT easy!

    All of these can be great fun in a CS setup, and most are probably good ideas to study, but perhaps not in CT.

    • 18. Mark Guzdial  |  May 4, 2019 at 9:00 am

      Great list, Jens! Thanks for engaging in the activity.

      About variables and x=x+1, I’ve been thinking about some of the well-designed blocks languages and HyperTalk. “Add 1 to count” or “increment counter” probably do work, though I know of no experiments that explicitly test them.

  • 19. Baker  |  May 4, 2019 at 9:14 am

    Where I thrash in my thinking about CT is related to distance from the machine itself. I also struggle with trying to separate algorithms from computational thinking as it seems like you’re trying to do. It’s quite provocative. I want to think about it more.

    You’re trying to tease apart CT and CS, which is I think a useful conversation for this community to have since, speaking for myself at least, my most powerful insights or feelings that I was thinking in a new way came when I first learned how to program – I can still channel those feelings – and it seems to me that’s what’s been driving us to define what this type of thinking is. The nom du jour is CT but, I have a hard time separating it from CS.

    For example: You’ve talked about student/user having some kind of mental models for the machine that, to me, is useful in terms of generating programs because it’s the closest thing we have in computing to having some kind of “natural laws” to guide (or constrain) our thinking about algorithms, and making choices about how to go about computational solutions. A language like bootstrap is very far away from the machine whereas, let’s say, assembly is not.

    Take the old trope of sorting algorithms (since it’s something we all know). Sorting is useful to study not because the idea of putting things in order is interesting in its own right, but because the techniques you learn, and the way sorting exposes how the underlying machine works are revelatory. By your working definition of CT, where does something sorting fall? You have bits on your list of useful CT knowledge and I would argue that knowledge of bits (information representation) is useful in sorting because it could help you realize that that if you have a list a numbers (v. strings) that an algorithm like radix sort is a possibility.

    But x=x+1 is not on your list. And while I agree the idea of variable re-assignment isn’t useful for CT on it’s own (maybe), the notion of of variable re-assignment is, and along with why it has to be that way. Also, I’ve made such enormous instructional use of “x=x+1” because that small statement conveys so much to the learner once you break it down: this isn’t math class, these symbols were chosen by humans to convey an idea because they were available on the keyboard, and it gives insight into a mental model for how memory works, and also informs how you might think about certain aspects of sorting.

    I agree you could teach all of these algorithms and computational thinking ideas divorced from the machine, but part of what makes them so elegant and powerful is due to an understanding of how the machine works.

    So where does all this sit with you? I imagine you’re going to say it’s not a two way street. That everything I’ve said above is obviously CS which also obviously involves CT. Are you arguing that everything in CT is not in CS? How can we call something CT without a notion of the machine (if that’s what you’re arguing)? Are you simply arguing for drawing the line for useful CT knowledge (let’s call it CT for all) at a different layer of abstraction? That CT starts on a foundation of taking certain computational tools for granted: i.e. you don’t need to know how a sorting algorithm works, you just to know that sorting is possible and a tool you can use as part of some higher order thing you’re working on?

    • 20. Mark Guzdial  |  May 4, 2019 at 9:21 am

      But it doesn’t have to be that way, Baker. That’s the point of this whole series of posts about task-specific programming language. There is nothing inherent to the structure of the computer that you have to do variable reassignment in order to increment a variable. HyperTalk had “add one to total” (yeah, spelled out 1-10 worked), as well as “increment counter.” Good blocks languages have that, too. Do you know where x++ and ++x in C came from? The PDP-11 had built in modes for addressing memory locations that incremented and decremented. Kernighan and Ritchie just exposed those machine level features in C. The idea of “just increment that piece of data” is far deeper in the machine than any notion of variable re-assignment.

      My point of this thread is that we’re settling for crappy tools. We know how to make better programming languages that allow us to focus on the problem domain and have only a minimal amount of computing knowledge needed to solve problems within the domain. My whole point is that we need to change our tools so that it does NOT “has to be that way.”

    • 21. gasstationwithoutpumps  |  May 4, 2019 at 11:59 am

      I tried to separate algorithmic thinking from computational thinking in https://gasstationwithoutpumps.wordpress.com/2010/08/12/algorithmic-vs-computational-thinking/

      The key distinction for me is that algorithmic thinking focuses on the methods, while computational thinking focuses on the data and using computational tools to examine the data. It can also be seen as a tool-builder versus tool-user emphasis.

      Computational thinking is about becoming a power user of tools, and so should emphasize things like using search tools to find data, analysis tools to make claims based on the data, and display tools to convince others of the claims. (Some would call this field “data science” rather than computational thinking.)

      There are many useful skills that learning computer science fosters: using multiple levels of abstraction, decomposition into subproblems, documentation, debugging, iterative design through prototypes, … , but computational thinking is rarely taught as part of computer science, as many CS faculty have a serious disdain for data.

      • 22. Briana Morrison  |  May 4, 2019 at 2:19 pm

        This^^^. Yes, yes. “Computational thinking is about becoming a power user of tools.” That’s my new definition, mantra, etc. But it doesn’t have to just be about data / data science: what’s the best tool to compose a new musical arrangement (and will it help me by suggesting interesting chord progressions, etc.)? what’s the best tool to create X, especially based on my previous knowledge?

        • 23. gasstationwithoutpumps  |  May 4, 2019 at 4:39 pm

          Briana, you’re right. Using other computational tools also falls under the rubric of computational thinking. I was being too narrow in my thinking.

  • 24. Briana Morrison  |  May 4, 2019 at 2:22 pm

    I disagree that we leave abstraction and decomposition to other disciplines. Why not cover in more than one discipline? Let students see it multiple times in multiple ways to encourage generalization (and thus potential transfer)?

    What’s definitely CT: debugging skills
    Definitely generative. Just a shame we don’t do more explicit teaching / assessment of it.

    • 25. Mark Guzdial  |  May 4, 2019 at 2:25 pm

      Totally love that we should visit and re-visit abstraction and decomposition many times. But it’s not part of the definition of Computational Thinking. It belongs just as much to mathematics, science, and engineering. I love the idea of using computing to teach abstraction and decomposition, but that might be in math class or science or engineering.

      I might be willing to concede the point about debugging skills — if I believed that there was such a thing as debugging skills that were transferable. There may be, but since our track record for teaching debugging is dismal (know of any study since Sharon Carver’s with Logo that demonstrated improvements in debugging ability over time?), I don’t know that we know enough to claim much about teaching debugging.

      • 26. gasstationwithoutpumps  |  May 4, 2019 at 4:45 pm

        As someone who has taught both electronics and programming, I see that there are definitely transferable debugging skills: such basics as observing both inputs and outputs, using a decomposition of the design to test components separately, documenting the design before building it, checking that assumptions for the components have been met by the inputs, starting with expectations of what the behavior should be and comparing observations with expectations, … .

        Some other debugging skills are more discipline specific (are power and ground connected, is the power turned on, did you save the file before recompiling, …).

        I agree that we’re generally bad at teaching debugging skills, in almost every discipline. I’ve written a chapter about debugging in my book Applied Analog Electronics, but I don’t see the advice having much effect on student actions in the lab.

  • 27. Tom Morley  |  May 4, 2019 at 3:34 pm

    So what’s the issue with these constructs? Why are they hard? I suspect the trouble with “else” is getting it to match back to the correct “if”. What’s hard about “while”? Pre vs post testing — “while” vs. “repeat…until “? Is “repeat… until “ easier? Is “i++” easier than the dreaded “i=i+1”? Indeed variable binding, order of internal evaluation, etc. will eventually have to tackled. When?

    • 28. gasstationwithoutpumps  |  May 4, 2019 at 4:50 pm

      I think that you are confusing teaching programming (where all these concepts are fairly important) with computational thinking, which is a much more nebulous concept that does not necessarily get down to the level of detail where these things matter.

      Incidentally, I very rarely use either “while” or “repeat…until” loops. Since switching to Python a few years back, almost all my loops are “for x in iterable”, which are far easier to read and write. (Particularly with generator functions to make the iterables, especially for input loops.)

    • 29. Mark Guzdial  |  May 4, 2019 at 10:07 pm

      Why do they have to be tackled? If we know better ways, we should build those into the tools.

      • 30. Tom Morley  |  May 4, 2019 at 10:34 pm

        That was the question. What are better ways? Can we tell better ways from not so good ways by some structural feature?

        • 31. Mark Guzdial  |  May 5, 2019 at 9:24 am

          Thomas Green showed in a series of experiments in the late 1970’s that a more explicit IF structure improved student ability to debug conditionals by ten times, over an ELSE clause.

          Bootstrap:Algebra has students build videogames by defining deltas between frames. Repetition is built into the system, so students don’t have to write it, yet they successfully build videogames and learn algebra.

          I wrote recently about Sarah Chasins’s amazing work where novices solved web-scraping tasks in 10 minutes, without training. She used block-based programming, with a programming-by-demonstration initial program synthesis.

          In our participatory design session with social studies educators, the teachers successfully built visualizations in Vega-Lite in less than 20 minutes, with no prior programming experience. No conditionals, no iteration.

          We CAN build better tools.

          • 32. Tom Morley  |  May 5, 2019 at 9:35 am

            So the result is entirely empirical. Interesting.

  • 33. Baker Franke  |  May 5, 2019 at 11:03 pm

    I see. I think I understand what you’re getting at now. I’m on board with the idea that CT4All involves presenting folks languages that make sense to them in terms of the thought processes (tasks) and information (data) they are already engaged in that domain and giving them access to computing power. And that those languages don’t necessarily need to look or feel anything like traditional programming languages. Makes sense.

    I think I got side-tracked because you defined what’s NOT CT as certain language features but what is CT as broad concepts. I am interested in thinking about what those concepts are.

    Getting to the concepts on the list for CT4All, I wonder if data structures play any role here. What I’m thinking about is that a lot of domain/task-specific tasks may require reshaping of data into structures that are appropriate for computation you want to do. Also understanding the implications of how the data you have is structured seems relevant. I’m not sure if data structures falls under your “processes” category or if its own thing.

    In teasing apart that “processes” category — what’s in there? It seems like iteration and conditional logic for sure. What else?

    • 34. Mark Guzdial  |  May 6, 2019 at 9:23 pm

      These are great questions, Baker. I don’t have answers for all of them.

      I don’t think we can easily separate language features and concepts. Language features can get in the way of learning concepts. Language features re-ify concepts. A well-designed language is a notation that scaffolds learning.

      By “processes,” I literally mean “processes” — the execution of a program in a thread. I completely agree that data is important. My list wasn’t even close to exhaustive.

      I’m not convinced that everyone needs to know iteration. Bootstrap:Algebra has iteration built-in. Squeak EToys and Boxer both used a “tick” model rather than have students explicitly encode iteration. Other models may be more powerful and easier to learn.

  • 35. Bonnie  |  May 6, 2019 at 9:38 am

    gasstationwithoutpumps said “Computational thinking is about becoming a power user of tools, and so should emphasize things like using search tools to find data, analysis tools to make claims based on the data, and display tools to convince others of the claims.”

    Sigh. So we are back to the old school “teach students to use tools” approach to computing for the masses. How is this different from the situation back in 2000, when schools taught everyone how to use Word and Powerpoint and called that computing? Your description is a little more data-science-y in feel, but in truth it is just the same as teaching students to do presentations with Powerpoint. The whole point of the computational thinking movement was to get away from that mentality. Algorithms are central to computational thinking!!

    And Scratch is totally about algorithms. You can’t do much with it without understanding algorithms, at least in an intuitive way. I watched my own kid get hooked on algorithms in middle school because he was trying to write a game in Scratch and needed to understand path planning. He tried to do what he needed in a stupid way and realized he needed more.

    • 36. gasstationwithoutpumps  |  May 7, 2019 at 11:59 am

      I agree with you, Bonnie. I don’t think that teaching computational thinking has much to do with teaching computer science. My attempt to define computational thinking was not a suggestion that we should be limiting ourselves to teaching computational thinking—just trying to get some clarity in a rather murky field of buzzwords.

      Teaching tools is useful and important, but has little to do with CS4All.

      Of course, I’m not convinced that CS4All is a reasonable goal either.

  • 37. Notes Section 1: Living Data – A Chip On Her Shoulder  |  June 26, 2019 at 6:38 pm

    […] National Academy Symposium summarizes “Computational Thinking” as defined by Jeannette Wing in 2006. To simplify this multiply-defined term, just think “abstraction, algorithms, accuracy”. “Computing Education” blog tracks related education. […]


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackback this post  |  Subscribe to the comments via RSS Feed

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 10,186 other subscribers


Recent Posts

Blog Stats

  • 2,060,868 hits
May 2019

CS Teaching Tips

%d bloggers like this: