I believe that it is fundamental to have an overview of the history that later formed Computer Science. People know work of individuals such as Dijkstra. But, there are several individuals who led to computers even existing. It was a process that started in the early 800s, and started to grow in the 1800s and the 1900s.
How did simple changes in voltage develop machines such as computers? It is incredible that the works of individuals across different centuries led to computers. It is important to explore the process of how these concepts are discovered.
In 300 BC Euclid writes a series of 13 books called Elements. The definitions, theorems, and proofs covered in the books became a model for formal reasoning. Elements was instrumental in the development of logic & modern science. It is the first documented work in Mathematics that used a series of numbered chunks to break down the solution to a problem.
300 BC — 800 AC
Following Euclid, notes about recipes, etc. were the closest thing to how we think at algorithms today. Also, there was also the inventions of mathematical methods. For example, Sieve of Eratosthenes, Euclid’s algorithms, and methods for factorization square roots.
It seems common to us now to list things out in the order we will do them in. But, in Mathematics at that time — it was not a common idea.
The story really starts in the 800s where we meet a person named al-Khwārizmī. His name roughly translates to Algoritmi, in Latin, and he develops a technique called Algorism. Algorism is the technique of performing arithmetic with Hindu-Arabic numerals.
Al-Khwārizmī is considered to be the grandfather of Computer Science. He is the first one to develop the concept of the algorithm in Mathematics.
Then came Ramon Llull, who is considered the pioneer of computation theory. He started working on a new system of logic in his work — Ars magna. Ars magna influenced the development of a couple subfields within mathematics. Specifically:
- The idea of a formal language
- The idea of a logical rule
- The computation of combinations
- The use of binary and ternary relations
- The use of symbols for variables
- The idea of substation for a variable
- The use of a machine for logic
All these led him to pioneer the idea of representing and manipulating knowledge using symbols and logic.
Next came Blaise Pascal. Pascal was a French Mathematician and at an early age he pioneered the field of calculating machines. Pascal invented the mechanical calculator, and Pascal’s calculator after roughly 10 years, in 1642. This was an important milestone in Mathematics, and in engineering. It showed the general public that tools can be built, using Mathematics, to simplify things e.g. accounting. (fun fact: he built the first prototype for his father — an accountant!)
Following Llull’s and Pascal’s work there was Gottfried Leibniz. He made an incredible achievements in symbolic logic, and made developments in First-order logic. These were important for the development of theoretical computer science. His work still remains:
- Leibniz’s law (in First-order logic)
- Leibniz’s Rule (in Mathematics)
Leibniz also discovered the modern binary system that we use today . He wrote about it in his paper “Explication de l’Arithmétique Binaire”.
Charles Babbage, the father of computing, pioneered the concept of a programmable computer. Babbage designed of the first mechanical computer. Its architecture was like the architecture of the modern computer — he called his mechanical computer the Analytical Engine. The Analytical Engine was a general-purpose computer (to today’s standards). It was the first design that we, now, would call Turing complete. It incorporated an Arithmetic and Logic unit (ALU), integrated memory, and control flow statements. He designed it, but it wasn’t until 1940s that it was actually built. When he designed it was programmed by punch-cards, and the numeral system was decimal.
Working with Charles Baggage on his Analytical Machine was Ada Lovelace. She was the first computer programmer. In her notes on the engine she wrote the first algorithm that ran on any machine. The algorithm was to compute Bernoulli numbers! Most of her work contributed to creating the subfield of Scientific Computing. (fun fact: her name inspired the programming language Ada!)
Then came a man most computer scientists should know about — George Boole. He was the pioneer of what we call Boolean Logic, which as we know is the basis of the modern digital computer. Boolean Logic is also the basis for digital logic and digital electronics. Most logic within electronics now stands on top of his work. Boole also utilized the binary system in his work on algebraic system of logic. This work also inspired Claude Shannon to use the binary system in his work. (fun fact: the boolean data-type is named after him!)
Gottlob Frege defined Frege’s propositional calculus (first-order logic), and predicate calculus. These were vital in the development of theoretical computer science. (fun fact: the Frege programming language is named after him!)
In the early 1900s, Bertrand Russell invented type theory to avoid paradoxes in a variety of formal logics. He proposed this theory when he discovered that Gottlob Frege’s version of naive set theory afflicted with Russell’s paradox. Russell proposed a solution that avoids Russell’s paradox by first creating a hierarchy of types, then assigning each mathematical entity to a type.
After Russell came the amazing Alonzo Church who introduced Lambda calculus to the world. Lambda calculus introduced a new way of viewing problems in Mathematics, and inspired a large number of programming languages. Lambda calculus played a big part in the development of functional programming languages. (Why it is important, and here).
You might know Claude Shannon from his work on the Shannon-Fano algorithm. Shannon founded the base of the sub-field of information theory. He concentrated his work on efficiently and reliably transmitting and storing information. At MIT he wrote a paper that demonstrated the powerful applications of boolean algebra and its electrical applications.
Next, we all know the great Alan Turing. He formalized a lot of concepts in theoretical Computer Science with his work on the Turing Machine. Turing also contributed heavily to Artificial Intelligence theory — a notable example being the Turing Test. Apart from his research, he was a codebreaker at Bletchley Park during WW2, and was deeply interested in mathematical biology theory. (His work and his papers are deeply insightful — you should give them a glance)
Grace Hopper was first exposed to Computer Science when she was assigned a role to work on the first large-scale digital computer at Harvard. Her task was to design and implement a method to use computers to calculate the position of ships. In the early 1950s she designed the language COBOL, and built the first program that interprets english code to binary code. Her vision played an incredible part in the formation of Computer Science and she foresaw a lot of trends in computing. (fun fact: she is credited for popularizing the term debugging!)
John von Neumann is a highly notable physicist and known for being on the manhattan project. But, he’s also important in the history of Computer Science. He designed and the Von Neumann architecture. Basically if you have not heard of it — I am very certain you have seen the model he came up:
One of his biggest principles was the idea that data and program can be saved on the same space. This idea implies that a machine can alter both its program and its internal data.
TLDR; Neumann was just on another level with his work. He contributed to pretty much everything that has any relation to Mathematics.
John Backus was the inventor of the FORTRAN language with his team at IBM. Backus many important contributions to functional programming languages and systems. Also, he served on committees developing the ALGOL system of programming languages. Alongside Peter Naur he also developed the Backus-Naur Form. The Backus-Naur Form is used to describe and depict programming languages.
Interestingly, Backus wrote an article on “Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs”, which is worth reading!
Alongside Backus, Peter Naur made major contributions in the definition ALGOL 60, and pioneered the Backus-Naur Form.
Noam Chomsky is known for being a linguist. But, he has made some indirect and direct contributions to Computer Science. His work on Chomsky Hierarchy and the Chomsky Normal Form are well known in the study of formal grammars.
Edsger Dijkstra is someone we all learn in algorithms class. In 1956 he was given the task of showing the power of the ARMAC computer. To show off the power of the ARMAC computer he came up with the shortest-path algorithm (Dijkstra’s algorithm). Next, ARMAC engineers wanted to cut the copper wire costs. To solve that task, Dijkstra rediscovered and applied a version of the shortest sub-spanning tree algorithm (Prim’s algorithm).
Donald Knuth is a pioneer in the field of analysis of algorithms. He worked on developing both the aspect of finding the computational complexity of algorithms and also the mathematical techniques for performing analysis on algorithms. He’s also widely known to be the creator of TeX typesetting system, for The Art of Computer Programming book, for the KMP (Knuth–Morris–Pratt) algorithm, and much much more.
Leslie Lamport laid out the foundations for the field of distributed systems. (fun fact: he won the Turing Award in 2013! He also lives in New York — so meet him if you have a chance. He also has a magnificent beard.)
Vint Cerf & Bob Kahn are known as the fathers of the Internet. They designed the TCP/IP protocols, and the architecture of how the Internet would be laid out.
Following their progress, in 1989/1990, Tim Berners-Lee invented the worldwide web. Alongside his colleague Robert Cailliau, he sent the first HTTP communication between a server and a client. This as you all know was an important milestone in Computer Science as it represented a new era of communication, and also demonstrated the practical nature of theories in Computer Science.
Let me know if I have gotten anything incorrect or have not made anything clear! Also I wasn’t able to include every individual along the way, but let me know if I’ve missed anyone obvious. Please expand on things I have written through comments.
I also did not go into much detail with every individual. In the future, I am also going to be doing individual posts about each of these individuals. The posts will go in more details of their accomplishments.
Resources to learn next:
Key things to research after:
First-order logic, Jacquard loom, Analytical Engine, Boolean algebra, and much more!
- First-order logic: http://cs.nyu.edu/davise/guide.html, http://cs.nyu.edu/faculty/davise/ai/pred-examples.html
- Analytical, Difference Engines: http://en.wikipedia.org/wiki/Analytical_Engine#Comparison_to_other_early_computers
- Type Theory:
- The Chomsky Hierarchy: http://athena.ecs.csus.edu/~gordonvs/135/resources/ChomskyPresentation.pdf
One of my favorite talks have been by Donald Knuth. His talk is titled “Let’s Not Dumb Down the History of Computer Science”. If you get a chance, please watch it!
Couple of books:
— Out of their Minds: The Lives and Discoveries of 15 Great Computer Scientists, Dennis Shasha and Cathy Lazere
— Selected Papers on Computer Science, Donald Knuth
Thanks for reading! If you’d like to checkout some of my other projects — visit my portfolio!