Why do we have 501 and 502?
Why should anyone take pains to learn programming in the Fall of 2026? Humans are now ranked second among the autonomous intelligent organisms that compose computer code in the known universe; and the gap separating us and machines is so swiftly widening that even the comparison might stop making sense before the end of the year. The problem – if you want to name it that way – is not that machines program better, faster, etc. It is rather that the level of complexity at which they autonomously operate (motivation, design and implementation) seems, at the time of writing, to have already surpassed human-level intelligibility. Sooner or later, there will remain no place for humans in this business; not even as supervisors or auditors of what machines (might plan to) do.
In the face of this state of affairs, we still find some value in offering 501/2, as an introduction to computation, programming, probability theory, and linear algebra, though a very brief one.
First of all, cognitive science belongs in the broader field of informatics. It takes cognition principally to be information processing carried out by organisms above a certain level of complexity.1 Naturally, a student of cognitive science must ideally have a thorough understanding of what information is, and what does it mean to process it. Of course, it is arguable whether taking courses, let alone taking these specific ones, is the best way to achieve this, but, as long as science remains a primarily human institution that aims to improve our knowledge and understanding, no one can get very far in cognitive science without understanding the subjects listed above.
Another motivation for these courses can be found in the following quote from a prominent cognitive scientist, Philip Johnson-Laird (1980):
Computer programming is too useful to cognitive science to be left solely in the hands of the artificial intelligenzia [UO: he means engineering work on intelligence back then]. There is a well established list of advantages that programs bring to a theorist: they concentrate the mind marvelously; they transform mysticism into information processing, forcing the theorist to make intuitions explicit and to translate vague terminology into concrete proposals; they provide a secure test of the consistency of a theory and thereby allow complicated interactive components to be safely assembled; they are “working models” whose behavior can be directly compared with human performance.
The use of programming in Johnson-Laird’s sense, namely as a tool for design and understanding, is, I think, more doable now than before, thanks to code writing machines. Before them, writing working code beyond a certain level of complexity was so difficult that achieving the level of abstraction essential for human understanding was considered a nicety everyone praised but no one achieved. Now it is possible to sit back and concentrate on what is essential, leaving the tedious, unimportant details to machines.
Doable, however, does not mean easy. Using programming in Johnson-Laird’s sense requires a genuine understanding of some fundamental concepts. And this is not easy to achieve. On one hand, programming, like every sophisticated subject, requires hard work. On the other hand, it may not be easy to realize that you are totally missing some important concepts. Without such realization, there is no chance for improvement.
It is very easy to spend an entire coding career without ever understanding what is worth understanding about coding and computation. You can simply go on writing code without much intellectual improvement. This, I think, is largely due to the interactional nature of coding. Computers/programs are responsive, so you can have long and consuming stretches of trial-and-error that will eventually land you on some useful territory. Or, if you are smart enough, you can conjure up nice tricks that will keep the wheels turning no matter what. Compare this with mathematics. The paper or the board, where math’s engine runs on, are dead silent; you are on your own, and there is no alternative to genuine understanding.2
For this reason, I believe learning programming requires guidance and discipline; a discipline that needs to be externally enforced, unless you are already a very good learner.
To sum up, programming and mathematics teach one how to organize, develop, and express their thoughts. They are equally useful in understanding what others mean, an essential skill in research and collaboration. With 501 and 502, our aim is to very briefly introduce you to some fundamental concepts of these fields, with occasional glimpses into their significance in the study of cognition.