I first learned to code in 7th grade. Our math teacher required a graphing calculator and in the first few weeks of class, he showed us briefly how it could solve math problems if we gave it the right set of instructions. Awesome, right? Not really. What could possibly be more boring than learning a cryptic, unforgiving set of machine instructions to simply do the math I could already do by hand?
That all changed one day when a classmate showed me how to play Tetris on his TI-82. When I asked him how this was possible, he said his brother had made it using that “Program” button that seemed so useless. Suddenly, the calculator became much more to me. It wasn’t a device for doing calculations, it was a Game Boy. I found my owners manual, cut out and mailed the form a LINK cable so that I could transfer the program to my calculator (my classmate had transcribed the program by hand from his brother’s calculator!). Four weeks later the cable arrived in the mail, and I was in business, ready to play my very own poor man’s version of a Game Boy in math class!
Unfortunately, the game was abysmally slow. I could watch the pieces erase and redraw themselves, pixel by pixel. The glacial pace of the rendering made the game impossible to play. Something in me found this unacceptable and I spent the next several weeks trying to figure out precisely how the game worked, hoping that I might find some way to make it faster and more playable.
I learned about variables, which were for storing information about the state of the game. I learned about control statements, which allowed the game to change its response based on state. I learned about user interfaces, which govern how information from the player could be provided and structured and re-presented. I learned about data structures, which helped organize information about the shape of Tetris pieces and the game grid. Most of all, I learned about software architecture, which helped keep the monstrous 5,000 lines of TI-BASIC, viewed through the 8 line display, organized and understandable, but also determined how information flowed from the player, to the game, and back to the player.
I emerged from those arduous weeks not only with a much faster version of the game (using the text console instead of the graph to reach interactive speeds), but also a realization that has shaped my life for over two decades: information is a thing, and algorithms and data structures are how we create, structure, process, search and reason about it.
But what is the relationship between computing and information? For instance, is all programming really about information, or are there some kinds of programming that are about something else? How much overlap is there between computer science and information science as academic disciplines? Should departments of computer science and information science really be separate? As a 12 year old, the relationship between these two perspectives was powerful and exciting, because they represented untapped potential for creativity. Twenty one years later, as a professor of information science fundamentally concerned with computer science, the relationship between computing and information is something deeply fascinating as an intellectual perspective.
Let’s consider the disciplinary relationship first. Both computer science and information science think about search, both study how to organize information, both are concerned with creating systems that help people access, use, and create information. Many of the fundamental questions in computer science are fundamentally about information. What information is computable? How can information be stored and retrieved? How can information be processed? If computer science is about more than information, what else is it about?
Perhaps the difference isn’t the phenomena they investigate, but the media and methods through which the phenomena flow. Computer scientists are strictly concerned with information as it is represented and processed in Turing machine equivalents, whereas information scientists are more concerned with how information is represented in minds, on paper, through metadata, and other, older media. Computer scientists also often view information as context free, whereas information scientists are often more interested in the context of the information than the information itself. Because of this different emphasis, the disciplines methods are also quite different, with computer scientists reasoning about information through mathematical abstractions, and information scientists reasoning about it through the empirical methods of social science. It’s not that the fields study something different, they just study it differently.
And what of the role of information in programming and software engineering? I’ve been writing software for twenty years now, and the more code I write, the more it becomes clear that great software ultimately arises from a deep understanding of the information that will flow through it and the contexts in which that information is produced and consumed. The rest of the details in programming—language, architecture, paradigm—they’re all conveniences that facilitate the management of this information flow. The right programming language, framework, or library is the one that best represents the information being processed and the types of reasoning that must be done about that information. Perhaps its not surprising that the biggest, most impactful software organizations in the world such as Google, Facebook, and Baidu, are explicitly interested in organizing the worlds information, factual, social, or otherwise.
I don’t know yet whether intellectual questions like these matter so much to the world. Something inside me, however, tells me that they do, and that understanding the nature of computing, information, and their overlap might be key to understanding how and why these two ideas are having such a dramatic impact on our world. Somehow, it also feels like these ideas aren’t simply human tools for thought, but something much more fundamental, something more natural. Give me twenty more years and maybe I’ll have the words for it.