Module III: Frontiers
“What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.”
—Alan J. Perlis (1 April 1922–7 February 1990) quoted in epigraph of Harold Abelson and Gerald Jay Sussman, with Julie Sussman, Structure and Interpretation of Computer Programs, 2nd ed., MIT Press, 1996
By now we have seen how binary logic can be used to construct programmable computational machinery, and we have improved our knowledge of abstractions, and analysis.
In doing so we have learned the foundation of computing and the programming techniques that can be used to control it. But computing is central to today’s technological society: computers and programming is under constant pressure to innovate, to handle even more demanding problems.
In the early days of computers the computer were made faster by building CPU and data buses with faster clock frequencies. But, there are technical and ultimately physical limitations to how fast computation can be made using a processor: power consumption (and with it excess heat) increases with clock frequency in a CPU. For almost two decades the frequency scaling of processors have more or less stood still. The innovation has instead favoured multiple compute cores in a processor, multiple processors, and clusters of computers.
At the same time, the need to process huge amounts of data - larger than what a traditional computer could store or handle - has increased the need for programming abstractions that hide such distributed data and for virtualized systems where resources can be increased on demand.
Finally, data complexity means that it can be hard to get an overview of it and create an explicit model or a program. This has increased interest in statistical models and machine learning where a program is trained on data.
In this module we will briefly look at these three aspects of modern computing and how to program them in Scala.