One Man's View of Computer Science

In this episode, I read from One Man's View of Computer Science, the 1968 ACM Turing Lecture by Richard Hamming.

Transcript

"We are not engaged in turning out technicians, idiot savants, and computinics. We know that in this modern, complex world, we must turn out people who can play responsible, major roles in our changing society, or else we must acknowledge that we have failed in our duty as teachers and leaders in this exciting, important field, computer science." Good morning. My name is Eric Normand, and this is a reading of Richard Hamming's 1968 ACM Touring Award Lecture. Richard Hamming is known for his error correcting codes, so the Hamming code, and a few other things. Just a little bit of background on his biography, he was born in 1915 in Chicago, in 1945. He joined the Manhattan Project, and there he formed a view of mathematics arising from his Los Alamos experience that computation was of major importance, but it made him skeptical of the standard approach that emphasized formal abstract mathematical theories. This is ironic because he has a PhD in pure mathematics. So there's this tension that goes through all of his work that you need the mathematics, but it's not a mathematical field. This whole lecture is about trying to define computer science in a practical way, so we know what to teach, we know how to fund it, and things like that. We'll see that going forward. He formed a view of, oh I said that, at Bell Labs he was able to work with both Claude Shannon, with whom he shared an office and John Tukey. Can you imagine sharing an office with Claude Shannon? That would be amazing. And I don't know, I've heard this before, that there was this golden age around World War II, where there were just amazing people that you could actually meet and work with. And that time has passed, even in the early part of this century before World War II, there's pictures of this physics conference, 20 people, and 15 of them got the Nobel Prize. If you went to that conference, you got a Nobel Prize, and that just doesn't happen anymore, at least, as far as I know, maybe in 50 years, 100 years, we'll look back and say, oh this was a beautiful time, and you could have worked with anybody. A lot of people I've studied have said things like that, like Minsky talks about how, yeah, you could just go over to Einstein's office and talk to him. I don't know if that would happen anymore, if someone would become so famous in his lifetime and his or her lifetime that you would know that they were special before they got old and retired anyway. Maybe that does happen at big universities, you know, I've never been at a like famous university that could afford someone that, that famous. Okay, so he, he's going to talk a lot about this in the lecture, but in the biography, and I always recommend reading them, they're not long, they're like two pages of like the highlights of their life, just to understand their background and, well, their experiences, where they worked, like what led to the discoveries, that kind of thing. I always recommend reading these, and these are all online. You just search for a touring award and the person, and you'll get, you'll get it. It's hosted by the ACM. Okay, so he wanted to change the way mathematics was taught. And so he has these quotes that they pull out in the biography, I thought they were important. We live in an age of exponential growth and knowledge, and it is increasingly futile to teach only polished theorems and proofs. We must abandon the guided tour through the art gallery of mathematics, and instead teach how to create the mathematics we need. In my opinion, there is no long term practical alternative. So this idea of like, oh, here's a, here's a cool idea, here's a cool idea in math, and you just kind of teach that stuff, you can't do that anymore. You have to teach the practical, like, how do you do it? How do you make new ones? Because they're coming out all the time, these new theories where they were in an exponential growth phase. The way, and this is another quote, the way mathematics is currently taught, it is exceedingly dull. In the calculus book we are currently using on my campus, I found no single problem whose answer I felt the student would care about. The problems in the text have the dignity of solving a crossword puzzle, hard to be sure, but the result is of no significance in life. So the thing that this makes me think of, I haven't studied math that thoroughly, to have an opinion on math, but in computer science, I have had discussions with the professors, and I was a grad student, and we would discuss like, how do you teach these things, and what needs to be taught, and they felt like there was this big challenge that if you make it to real world, it's too challenging. If you make it too pat and given to them, the answer is a problem well understood enough that there is a well defined answer, then they get this idea that it's just about regurgitating. There's a real challenge there, and I think it's on the professors to figure out how to teach the real world stuff, that's the skill, and I mean in my experience speaking with the professors, in my experience going to school, I felt like they didn't teach programming. People came knowing programming already, they were kids who had computers at home and had learned the rudiments of programming, and so it was a lot of just polish, and because there were so many people like that, and they had a head start on people who didn't know programming, the professors could get away with not teaching how to program, and it's very unfortunate, but that's the world we live in, like people grow up with computers at home now, and they do have access to all these courses on how to program, often it's done in high school or elementary school even, and so more and more, it's going to be like writing for instance, when you get to the university, you're expected to know how to read and write, and the people who haven't had that experience are going to be more and more of a disadvantage, which is unfortunate because professors have the chance of teaching it in a structured, a good way, and someone has to learn how to teach it, right, okay. So the last thing I want to quote from this biography is just that he published one paper in 1950, I mean one of the papers he published in 1950, it's called Error Detecting and Error Correcting Codes, and this paper created an entirely new field within information theory. Again remember he shared an office with Claude Shannon, but it introduced the ideas of Hamming Codes, Hamming Distance, and Hamming Metric, we still use his name to describe these ideas. Okay, so that's what he was primarily known for, also numerical methods and automatic coding systems, but there you go. This paper, this lecture, was published in 1969, the lecture happened in 1968, and it's called One Man's View of Computer Science, R.W. Hamming, again he was at Bell Labs, Bell Telephone Laboratories in New Jersey when he gave this lecture. Now this is a lot less technical than the other ones we've read. This one is more about education and defining the field, and computer science as a discipline that would get its own department, its own funding, was pretty new at this time in 1968. And so he's describing the challenge ahead, and I think it's really fascinating, this was what, 40, 50 years ago, that we are still dealing with a lot of the same issues. Some of them have been solved, but I think in general, these are going to be challenges that we face forever. Okay, so I'm just going to start, excerpting, I don't read the whole thing if this is your first time, just know I don't read the whole thing, I have excerpted stuff. This one is pretty challenging to do as the way I'm doing it, because he's such a clear writer that I don't feel like I need to explain or like pick apart what he says, so I'm just going to read it and comment, okay, I mean maybe here or there I will expand on what he's trying to say, try to paint a picture for what it was like back then, but mostly I'm just going to comment, okay. So this one sentence I thought was really fascinating, what is computer science? Question, what is computer science? It's argued endlessly among people in the field. What is computer science? I mean we still talk about that, you know, is it a science, is it really a science? Is it more like engineering, is it like a trade? What is it? We're still talking about that, and so he's bringing up this topic, because he thinks that it's worth talking about in the high profile place like this. So in trying to define mathematics, he says, mathematics is what mathematicians do, which is followed by mathematicians are people who do mathematics, that's a circular definition. There is often no clear sharp definition of the field, it's true of mathematics, it's true of computer science. In the face of this difficulty, many people, including myself at times, feel that we should ignore the discussion and get on with doing it. However, it does matter what people in Washington DC think computer science is, they tend to feel that it is a part of applied mathematics and therefore turn to the mathematicians for advice in the granting of funds. Although we cannot hope to settle the question definitively, we need frequently to examine and to air our views on what our subject is and should become. He's saying from this practical perspective, where we need money, our field needs money, we need to ask Washington at this point, but other sources of funds, they need to know what we're doing and have an idea of what that should be and so if they're asking mathematicians, maybe they're getting the wrong impression for what's important to fund. For me, it would be more satisfying to give a talk on some small technical point in computer science, but that is exactly one of the things that I wish to stress, the danger of getting lost in the details of the field. We must give a good deal of attention to a broad training in the field. Specialization leads to triviality. Okay, so he's talking about how we're going to have all these new papers coming out, that there's this exponential growth of the field and it's going to be more and more appealing for someone to specialize than to get a broad understanding and he thinks that the broad understanding is more is what we need. In many respects, the classical concept of a scholar who knows at least 90% of the relevant knowledge in his field, his or her field, is a dying concept. I apologize for the masculine nouns. Matter and narrower specialization are pronouns. Matter and narrower specialization is not the answer, since in part the difficulty is in the rapid growth of the interrelationships between fields. It is my private opinion that we need to put relatively more stress on quality and less on quantity and that the careful, critical, considered survey articles will often be more significant in advancing the field than new, non-essential material. So I can comment on this a little bit, you know, I was a graduate student, I have a master's in computer science and the field has very much fractured. You could spend a lifetime studying a small part of it and I mean almost never even hear of hamming, never hear of these, you know, early pioneers because there's so much to learn, not because it's not important to your work, it's just there's so much to learn of what's going on now and you're trying to find some new increment of a published, the smallest publishable unit, some like new thing that you could write a paper about because that's how you, you know, prove your worth is by publishing more papers and it's a shame that someone who's just kind of fundamentally understanding the big ideas doesn't have much to publish on, that's my opinion, but I think it's echoed in what he's saying. Alright, so now he's going to talk about science versus engineering. Let me make an arbitrary distinction between science and engineering by saying that science is concerned with what is possible while engineering is concerned with choosing from among the many possible ways, one that meets a number of often poorly stated economic and practical objectives. So I want to pause here because I think that this really shows his clarity of thought. I've read a largest book by him and I mean it's just, it's just full of stuff like this where he's really thought about what is the difference between science and engineering and can just say in a sentence or two something that is so clear and concise and precise. So I'm going to read it again because I feel like this like this captures him like perfectly. Let me make an, and I haven't read all the preface up to this, which also is kind of like very, very much like his writing where he's trying to say like these arbitrary distinctions, like they're doing violence to the truth, that's what he says. But there's no other way, you have to make some like, you know, bad, like you know it's not perfectly true, but you need to make some kind of distinction. Okay, let me make an arbitrary distinction between science and engineering by saying that science is concerned with what is possible while engineering is concerned with choosing. From among the many possible ways, one that meets a number of often poorly stated economic and practical objectives, so science is generating theories that say what is possible, right, theoretically possible, and then engineering is looking at those and choosing well we're going to do this way because we know how to do it for on time and on budget, right. We call the field computer science, but I believe that it would be more accurately labeled computer engineering, we're not this too likely to be misunderstood. Okay, so the misunderstanding is, are you building computers, right, because that's not what software people do, I've never built a computer. And if you go to a university and you said you majored in computer engineering, that's what it would be, is like how do you lay out the circuits and the transistors and stuff like that. So much of what we do is not a question of can it be done as it is a question of finding a practical way. So you're saying even in the study, in the academic study, that's what he's talking about, the academic study, it's about finding a practical way. It's not just about like what is possible. While I would not change the name from computer science to computer engineering, I would like to see far more of a practical engineering flavor in what we teach than I usually find in course outlines. So recommendation here, there is a second reason for asking that we stress the practical side. As far into the future, as I can see, computer science departments are going to need large sums of money. Here he's just showing his practical side that this field needs to be funded, right? We need to pay for grad students, to pay for research. We're going to need equipment, offices, you know, everything that comes with, that comes with, you know, paying people, right? Now society usually, though not always, is more willing to give money when it can see practical returns than it is to invest in what it regards as impractical activities, amusing games, et cetera. If we are to get the vast sums of money, I believe we will need, then we'd better give a practical flavor to our field. Okay, this is a very practical side, you know, this is someone who worked at Bell Laboratories where they were super well funded and had a reputation for both being a little eager to chase wild ideas, but also could get practical things done, right? So it's an interesting perspective that he's bringing. And I've, as a grad student, you know, you have these discussions with the chair of the department, with the, and this is my experience, that, yeah, a lot of it is about money. Like we chose to write this paper because we could get this grant, right, or you're always looking for the next grant. So it's a very important aspect of academic research. At the heart of computer science lies a technological device, the computing machine. Without the machine, almost all of what we do would become idle speculation, hardly different from that of the notorious scholastics of the Middle Ages. I do not regret the initial choice. I still, that we use machinery in the title of association for computing machines machinery. I do not regret the initial choice. I still believe that it is important for us to recognize that the computer, the information processing machine is the foundation of our field. This is, this is hard for me to reconcile, you know, a future, I think maybe the next one is Laureate, ACM Turing or Laureate is Dykstra, and Dykstra said something like, computer science is about computers, like astronomy is about telescopes, something like that. So it's a direct contradiction of, of what Hamming is saying here, that he's saying it's the machine. And we've heard that from the three past Laureates, right? It's about the machine, that's what unifies us, that's what makes it practical. And in large part, I'm warming up to that idea. You know, we take for granted, I think that computing is like pervasive now and it's only getting more so. We have so many computers, they're more homogenous than I think we like to think. You know, we've got Intel has a basic, you know, but pretty much a monopoly. And the, even if the, how do I say this, even if the instruction set is different from other machines, the basic architecture is largely set, it's this von Neumann architecture of our CPUs. And so there isn't that much difference between them. And I think we take for granted that we can always just buy a bigger one. And so the importance of the machine itself can get diminished, right? Because oh, I'll just get a new one, right? They can just go to the store and buy them. This time you could not do that. I could just spin up another virtual machine, right? It's been virtualized. It's almost all software, like where does your computer actually run? So I'm warming to this idea that the machine is actually the heart of it, that without it running, it is actually meaningless. How shall we produce this flavor of practicality that I am asking for, as well as the reputation for delivering what society needs at the time it is needed? We need to avoid the bragging of uselessness and the game playing that the pure mathematicians so often engage in. Again, remember, he got a PhD in pure mathematics. So he spent a lot of time with them and was one of them. And the bragging is like it's not practical and we know it and we're going to do it anyway. And the game playing is just like, let's see what cool, fun things we can invent that have no practical purpose, but what what gyrations of symbols can we do? We need to avoid making computer science look like pure mathematics. Our primary standard for acceptance should be experience in the real world, not aesthetics. I think that's pretty clear. So he's talking about the curriculum. I would require every computer science major, undergraduate or graduate, to take a laboratory course in which he, of course, apologized again for the male pronoun. He designed, he/she designs, builds, and debugs and documents a reasonably sized program, perhaps a simulator or a simplified compiler, for a particular machine. The results would be judged on style of programming, practical efficiency, freedom from bugs, and documentation. Okay, now this is, this is still an ongoing debate, I believe. And the flavor of the debate that I'm familiar with from my time at university, and I think is still ongoing because I hear people talk about it, is whether computer science departments should be more like trade schools. Should they prepare people to go get a job as a programmer and be immediately able to be practical, right? So this often takes the form of we should be teaching source control, get to computer science students. We should be teaching agile product management methodologies. We should teach the practical languages that they're going to use every day so that they can just jump right into the job. And that the other side of the debate is that those things are not computer science. Computer science is an academic field and it is largely about the theory and less about how do you make money with a job in programming, right? And of course, you know, you can go deep on this and talk about the role of universities in society when a university degree is more and more required to get good jobs. Is the university's role to turn out tradespeople, people who are ready to get those jobs? Or is it, as it used to be, like in the middle ages, right, when you're talking about the early universities, is it just a place for a safe place for people to be with like-minded people who just want to study, right? They just want to learn stuff and make new leaps of invention and innovation in their field, right, and they're less concerned about commerce and making practical, practical things they want to study, right? And maybe, you know, you're a biologist and you just want to study, you know, insects, right? You just want to just learn how insects work and you want to write books on that and you want to talk to other people who like insects, stuff like that. You know, is the role of a computer science department to make someone who's ready to pump out JavaScript and use JIRA and do all the practical things that professionals do in the field. And so there's always this tension because people are going to university for that, right? They're doing it to get a job, a better job, and, you know, then we complain that they're not trained to do it. So what would it look like if we did teach Git, right? Because it was not created, it's not an academic idea, right? There's a lot of academic ideas like underlying academic, you know, scientific, theoretical ideas, you know, the idea of hashing, right? That is something that, a practical thing that came, that you could teach from, you know, with mathematical framework and stuff like that. Git itself was just developed by Linus Torvalds so that he could better manage the source code for Linux, right? So it's a very, very much more industrial than academic, right? And I think that this is one of the other issues that perhaps wasn't so important here in that's time in like 1968, but it was coming and I think having foresaw it, there's hints of it that the commercial side of computing has way outpaced the academic side. There's more code written in commercial software than in computer research, right? I mean, that's obvious. And so, so much of the tooling and the practices are being developed outside of academia. Okay, so the reason I thought of this is they're making, he's suggesting that undergraduates or graduate students have to build some practical thing, you know, it has to do a job. He says a simplified compiler is an example. And then it would be judged on the style of programming, the practical efficiency, the freedom from bugs and documentation. So a lot of these things are, let's call it the practice of writing software, as opposed to, hey, your compiler had you under like, I understand from your compiler that you get the theoretical underpinnings of what a compiler does and how it works, right? It's on style of programming, the efficiency, the freedom from bugs, the documentation. So he's talking about we do need to have this other practical side, right, that you can't just code the ideas in some haphazard way and get credit for it. It has to have a style, it has to have, it has to be efficient. So he's trying to come up with the more engineering style. And so there's this tension, right? Like at some point you could go the full nine yards and say, okay, and it needs to have, you know, it needs to be done in JIRA with Git and you have to do a scrum or a stand up every day and like go in more and more practical or not practical, but just more and more like an actual commercial industrial software programmer. So I think that he's found a pretty good balance of having to justify your system with documentation, write it in a clear, readable way, make it work, you know, get rid of the bugs and make it efficient. Like you can't just, it can't just run forever. I think that this is a good balance between the purely pure ideas and the sort of how jobs, you know, how things get done at work. I would also require a strong minor in some field other than computer science and mathematics without real experience in using the computer to get useful results. The computer science major is apt to know all about the marvelous tool except how to use it. Such a person is a mere technician, skilled in manipulating the tool but with little sense of how and when to use it for its basic purposes. I believe we should avoid turning out more idiot savants. We have more than enough compute nicks now to last us a long time. What we need are professionals. This one hurts. Computer scientists, computer programmers, I believe have a reputation for being nerds. That they're spending endless hours on the computer, don't really have a practical understanding of how people work, how organizations work, how anything besides computers work. And so he is suggesting that they need to go take something that's not nerdy. That's not so nerdy or at least it's so different from computer science and mathematics that their nerdiness gets rounded out. And I think this is still true today. I mean from, well, I graduated 20 years ago, I say today, but I have been back to university and I have seen the people who excel are still the nerds, right? They're still the ones who don't know, you know, they have poor hygiene, all the stereotypes, poor hygiene. They dress well. They don't know how to speak with other people, have a chit chat conversation, you know, all those social norms they're just not not good at. Okay. In the past, I have argued that to require a strong mathematical content for computer science would exclude many of the best people in the field. So he's talking about how some a lot of the early pioneers of computer science were not strong in mathematics and they didn't need to be. They could have been electrical engineers who understood, you know, the circuitry and they could have been even stuff like audio engineers, right? But they were just good at dealing with, like, remember we talked about the acoustics, that a lot of the original material was made with acoustic equipment. Okay. But he's saying that, so they would be excluded, they just weren't strong enough in mathematics. So he's also saying that, okay, but we do need to do some mathematics. If we do not give such training, then the computer science major will find that he is a technician who is merely programming what others tell him or her to do. I am forced to believe that in the future, a good mathematical background will be needed if our graduates are to do significant work. So this is one of the times when I think that his own perspective is clouding his judgment. He did significant work and if you look at it, you know, it's like numerical methods and error codes, like he did a lot of mathematics and in his other, you know, the thick book I've read, the art of doing science and engineering, he is doing a lot of advanced math that was hard for me to follow, you know, he's very clear. So you can do it if you sit through it. But he has a PhD in pure mathematics, like he knows how to reason mathematically. He knows the important ideas in mathematics. And so to, from that perspective, I think he sees math as obvious and easy. You know, it's the curse of the expert. And so he's just playing down the importance of math to actually advancing the field. He will eventually conclude that you need it. But the facility with which he uses math and switches between like high level concepts and math is it just shows that he doesn't really get that other people can't do that and that it is one of the reasons why he was, he could successfully come up with new ideas. But he is saying that mathematical background will be needed. But this is after saying that he thinks it's not, you know, we shouldn't be so mathematical. So there you go. History shows that relatively few people can learn much new mathematics in their 30s, let alone later in life. So if mathematics is going to play a significant role in the future, we need to give the students mathematical training while they are in school. Okay. So he's saying that, you know, it's the job of the universities to teach that. They're not going to learn it later. The planning of the mathematics courses is probably the most vexing part of the curriculum. For a lot of thinking on the matter, I currently feel that if our graduates are to make significant contributions and not be reduced to the level of technicians running a tool as they are told by others, then it is better to give them too much mathematics rather than too little. I realize all too well that this will exclude many people who in the past have made contributions, and I am not happy about my conclusion, but there it is. He thinks math is important, and it will be more important in the future. I mean, I'll just give my opinion on it. I have very similar, um, a very similar reluctance. I want programming and computer science to require less background, meaning I want it to be more accessible to more people. And the amount of math that, for instance, I want to make it like this is my own goal is to make it so that you need to understand less math to make something practical, to make use of the machine, because I feel like just like reading and writing, the computer is a new medium that would benefit people's lives if they could program it. Not the computer as a media consumption device, but as a programmable thing and literacy is something we all believe in nowadays, like everyone should learn to read and write, it makes your life better in many ways. Not only is it easier to get a good job, but you can read a book, and that's just, that's just good. You can educate yourself, you can have the pleasure of reading a novel or poetry or whatever, it just enhances your life. And likewise, I believe that making it easier to program would make it, we're still at a stage where, you know, sort of like Charlemagne, when he had trouble learning to read because the script was so complicated, so he had his scholars simplify the script so that, you know, standardized the shapes of the letters basically, so that there wasn't so much to learn, it was easier, right? So I feel like we need to do that. We're still at this stage where it's just really complicated, there's all sorts of stuff going on, and we need to simplify programming. That's my opinion, there's not anything to do with this. But then, but then when I look at the sort of better ideas in programming, and what I don't like about the design of some software and better design of other software, it's mathematical ideas that explain why one is better than the other. And I'm talking about stuff that is taught in high school, like associativity and commutativity and stuff like that, like these are needed, these are fundamental to making a working distributed system. You have to understand the idea of the order of operations, or the order of arguments, right? So that's associativity and commutativity. And if you don't have that idea, then, you know how to code, but you don't have those ideas, like it's going to be very hard to write a working distributed system. And that saddens me. I'm reluctant, just like he says. I'm not happy about my conclusions, but there it is. I think that we need, there is a fundamental, you know, amount of background that you need to make good software. And unfortunately, we also don't know what that, what those are. I mean, it's sort of like, yes, everyone can read and write, but like that person's not a writer, they can write, you know, but they're not clear, they're not able to like make a story that's compelling. And, you know, there's all sorts of stuff that goes on behind the writing. They can, you know, write the letters, they can put sentences together, etc. Okay. One of the complaints regularly made of computer science curriculums is that they seem to almost totally ignore business, business applications and COBOL. I think that it is not a question of how important the applications are, nor how widely a language like COBOL is used that should determine whether or not it is taught in the computer science department. Rather, I think it depends on whether or not the business administration department can do a far better job than we can. And whether or not what is peculiar to the business applications is fundamental to other aspects of computer science. Okay. So people complain, just like I was saying before, people complain that you're not teaching like business applications, accounting. And you're not all the businesses at that time, we're using COBOL. Why aren't you teaching COBOL? Like that would prepare the students for a job. And he's saying it's not a question of how important the applications are. Yes, accounting is that is very important. But that's not what computer science is about, nor how widely a language like COBOL is used. Yeah, it's not about popularity. If you want to learn COBOL, if you want the university to teach COBOL, you should go to the business department, the business administration department. Because that's what they do. They teach the business side. You want to learn accounting, you go to the business department, and accounting, you can learn to program accounting systems. And they will probably use COBOL because that's what everybody else is using. That's that's what he's saying. If you want to learn how to, you know, rotate a red black tree, you know, come to us, you need to learn COBOL and figure out how those banking systems work, you go to them. I agree with that. And I think more and more the departments themselves, you know, if you want to do, if you want to apply computing to, I don't know, pick a field anthropology, you know, that should be an anthropology course, that should be in the anthropology department. That's, you know, that's like, you want to learn how to write an anthropology paper, that's in the anthropology department, it's writing, it's not in the English department, right? And I think more and more we need to think of, it's interesting that he said this back in 1968. But I think there's still a bias that like, oh, that's a computing thing, right? You should go to the computer science department. And no, it is, and more and more, we're going to realize that that is a, that is an anthropology concern, how to use a computer for anthropology, not a computer science concern. That this medium is going to be, it's going to become clear that this medium is so pervasive that every department is going to have to use it and teach their own stuff. I agree with that. And that's good because it takes a load off of the computer science department. All right. Let's talk about the, the nerds again. He calls them compute nicks, which is a pretty funny term. I don't think we use that that much anymore the Nick at the end, like a beat Nick, you know, okay. I hear repeatedly from friends who want to hire good software people that they have found the specialist in computer science is someone they do not want. Their experience is that graduates of our programs seem to be mainly interested in playing games, making fancy programs that really do not work, creating trick programs, etc. And are unable to discipline their own efforts so that what they say they will do gets done on time and in practical form. Okay. So again, this is more like an engineering side. I don't know what to say except I think that this is still a problem that that people still hire a computer scientist out of school and they just want to code for fun. They just like the idea of coding something and have no discipline to make it practical. Are we going to continue? So now he's getting like he's pushing, pushing pointing fingers here. Are we going to continue to turn out a product that is not wanted in many places and the product is the computer science student? Or are we going to turn out responsible, effective people who meet the real needs of our society? One of the reasons that the computer scientists we turn out are more interested in cute programming than in results is that many of our courses are being taught by people who have the instincts of a pure mathematician. So I'm not sure about the pure mathematician but from my experience, a lot of the professors were on an academic track, had no real world experience programming. Okay. So they might not have been mathematicians. And I think at this time in 1968, a lot of people because computer science as a discipline was new, newish, and there weren't departments teaching it yet. So the professors of computer science, you know, the professors in the computer science department necessarily had PhDs and some other subject. And maybe they got into computers, but they had to take a mathematics degree or a physics degree or an engineering degree, something. And he's saying it's often mathematics because that's where, you know, you had the the grades of the field touring and the girdle and people like that, that's all mathematics. They came, they started getting into computers, they made all these machines and advances. And now they're professors and they still think in terms of the theoretical mathematical side. But I still think it applies today that you have people teaching software design who have never written a serious program. You know, they've never worked on a team. They've never had to make their code, maintain it over time, you know, those kinds of things. Okay, we need therefore in our teaching of computer science to stress the assuming of responsibility for the whole problem and not just the cute mathematical part. This is another reason why I have emphasized the engineering aspects of the various subjects and tried to minimize the purely mathematical aspects. Okay, so I want to be clear here, like he's using his terms very precisely. We need therefore in our teaching of computer science to stress the assuming of responsibility for the whole problem and not just the cute mathematical part. So we do need them to take responsibility for the mathematical part, the cute mathematical part. But also they need to assume responsibility for the whole problem, the rest of the problem. Okay, so I want to make that clear that he's, he's, the mathematical part is important to him. But because the mathematical part has already been taken care of, the professors are mathematicians. He wants to emphasize that there's this whole rest of the problem. How is it going to work? How fast is it? How are you going to deploy it? What machines is it going to run on? There's all the people side of it. Who's going to maintain it? Can it? Is it readable? Is it documented? The business needs to hire people. Can they work on it? Right? There's all sorts of other aspects that are more engineering aspects than, you know, the cute code that you wrote that does that neat, you know, clever trick to make use of the cue, you know, things like that, which are fun, you know, but there's a whole other side to it. I think it's unfortunate that in his talk, maybe he doesn't have time, maybe it wasn't that clear to him. I'm not sure. But what is the rest of the problem? You know, that's that might need to be just spelled out. Like what are all of the concerns that we need to be, you know, addressing besides the mathematical part? It is unfortunate that in the early stages of computer science, it is the talent and ability to handle a sea of minutiae, which is important for success. But if the student is to grow into someone who can handle the larger aspects of computer science, then he must have, he or she must have and develop other talents, which are not being used or exercised at the early stages. Okay. So what he's saying is there's this filter that you become very successful and the early stages of computer science by keeping all these little details in your head. It's about memory and and and being focused on these trivial things. Tri I say trivial. They're important, but small, small details. But then what's needed when you're more advanced is a broad view. So we're filtering out the people who can do this gymnastics of in their head. And then what, you know, the people who can actually make real contributions need this other skill, which hasn't been filtered for hasn't been developed until later. Many of our graduates never make this second step. The situation is much like that in mathematics. In the early years, it is the command of the trivia of arithmetic and formal symbol manipulation of algebra, which is needed. But in advanced mathematics, a far different talent is needed for success. What is needed in the higher levels of computer science is not the black or white mentality that characterizes so much of mathematics, but rather the judgment and balancing of conflicting aims that characterize engineering. So again, unfortunately, I think he doesn't spell out enough of what is what we should be teaching to get people through this second step. He's just saying we're failing them. I can give a couple of examples. You know, I feel like a lot of people. Oh, I mean, maybe this this is too much of a rant, but every language has warts and a lot of the skillfulness in a programming language is developing tricks and idioms and things to avoid those warts or to deal with the warts. And you see people proudly sporting their knowledge of the minutia of the warts. Like, oh, if you use this construct, a block in Ruby does this, but a proc does that and a lambda does this, and so you know, it's needed. Like if you're using Ruby, you have to know that stuff. But for the, you know, broad view of the architecture of the system, which is much more important for the long term viability of the software project, that kind of detail is not is too much to tail. Like you shouldn't be thinking about the difference between a proc and a block and a, you know, it. And so I see people like this who are like so proud and they one up each other. Just there's a little competition because it's hard. It's hard to memorize all these things. You see this competition. And, you know, as you get older, it's like, that's not important. I actually want a language with with fewer of those fewer of those things to learn. So anyway, that's my, my experience in that. There is so much truth in his friend's characterization of software as an ad hockery that it is embarrassing to discuss the topic of what to teach and software courses. So he's talking about software now. It's interesting hasn't been teaching talking about programming has been talking about computer science, like data structures and the like. So much of what we have done has been in an ad hock fashion. And we have been under so much pressure to get something going as soon as possible that we have precious little, which will stand examination by the skeptical eye of a scientist or engineer who asks, what content is there in software? How few are the difficult ideas to grasp in the field? How much is mere piling on of detail after detail without any careful analysis? And when 50,000 word compilers are later remade with perhaps 5,000 words, how far from reasonable must have been the early ones. So I mean, he's basically bringing up the mess that is software. We don't know how to program. We don't. And there's nothing significant there, not academically significant. At least at that time, but I tend to agree. I think that so much of it is piling on of like if statements and you know, where is the important content here? What are you know, is this going to stand the test of time? Is this something for the ages? Are we building I mean, even a bridge that might last a hundred years, let alone building like a theorem or a theory that could be studied in 200 500 years in software? No, it's all throw away. It's all throw away. Yeah, it works, but it's like tinker toys. I feel that too, that all too often we have been satisfied with such a low level of quality that we have done ourselves harm in the process. We seem not to be able to use the machine, which we all believe is a very powerful tool for manipulating and transforming information to do our own tasks in this very field. We have compilers, assemblers, monitors, et cetera, for others. And yet, when I examine what the typical software person does, I'm often appalled at how little he uses the machine in his own work in apologies. These are her own work. Two few people even tried to use the machine on their own work. I recall a non expert with a very long Fortran program from the outside wanting to convert it to our local use. So he wrote a simple Fortran program to locate all the input output statements and all the library references. So they're trying to port this program for their local machine. In my experience, most programmers would have personally scanned long listings of the program to find them and with the usual human fallibility missed a couple the first time. I believe we need to convince the computer expert that the machine is his or her most powerful tool and that he or she should learn to use it as much as he or she can rather than personally scan the long listings of symbols as I see being done everywhere I go around the country. It's so funny. We don't use the machine ourselves enough. I have a personal, just a personal anecdote. This is from grad school. We were doing team projects and it was like do the next day. So everyone's up late on the floor, our computer science department had a floor in the building and they're all in the labs trying to get the done work done at the last minute. There was one team. Our assignment was to build some machine learning task and we were given this big data file. The spec said there's like a label and then the text and then a new line and a label and a text and a new line and a label of text. I wrote this according to the spec and I parsed it in and it failed after like a hundred records. There are thousands of records. It failed and it turned out that there was like the spec said something like there was a comma or a colon but there was an extra space. So I thought okay the spec is not precise enough. There are this parser that I wrote is assuming that it is perfectly correct but there are extra spaces and who knows what else. I'm only on the hundredth record. There's got to be more errors in this. So I'm going to write the parser to ignore extra spaces. Let me run it and I've probably found a couple other problems and I addressed them in the code and then it read in the probably you know it probably took 20 minutes to write this code to parse in this data file and then I could get to work on the actual assignment. There was another team who came to me and said how have you parsed this data file? There are so many errors. I'm like well I just ignored extra spaces and you know other little details and this was ours later. The student said I've been going through line by line deleting the extra spaces for hours and we're now afraid that we're not going to be able to even start the assignment because I'm like I'm not even an attempt at the way through and I was like I mean you're a programmer. You get a data file. You just deal with the extra spaces in your code. It's really like an if statement or a for loop or something. It's not a big deal but this is I think it's pervasive. Nothing against them but they don't they weren't thinking of using the machine to their advantage. They would rather put in the brute force of scanning it themselves and manually modifying the data file than to actually use the computer. So when he says this I know that there are people out there who do that. Who, man, who don't use the computer. They don't know how to use the computer. They're programmers. Is it their fault? I don't know. Is it the specs fault? You know, maybe but that's just the real world and the fact that they didn't think to do that or didn't stop after 20 minutes of going through the file and saying well maybe this isn't as efficient as we thought. We thought we could do it faster. I still feel sorry for them. Like they spent hours doing that. You know, we're out there brain. They couldn't even do the assignment. To parody our current methods of teaching programming we give beginners a grammar and a dictionary and tell them that they are now great writers. Like writing programming is a difficult and complex art. When you consider how we teach good writing the exercise is the compositions and the talks that the student gives and is graded on by the teacher during his or her training in English. It seems we have been remiss in this matter of teaching style in programming. As a result few programmers write in flowing poetry most write in halting prose. I think we don't know how to teach programming. I think we try to come up with principles and rules of thumb but they're not enough. What we need is what he's talking about is we need writers workshops and editing sessions. How do you make a writer and they somehow figure out how to make writers, how to take a person who's not a writer not very good at it and through practical work give them assignments, have them write essays, have them write you know short stories and then you discuss it when you have these workshops and you break it apart and you pull it apart. Like eventually the person becomes a competent writer. And a lot of it is not even just like coming up with the principles and what to teach. It's just the practice. You have someone who is good talking to someone who is bad. You have someone who's bad who's also learning but from the outside can see why your thing is bad. That's what the workshop is. All the writers are at the same level but they can critique each other somehow you know. How does that work? I'm not sure but we're able to see more from the outside and you just put people together and you make them write a lot and like eventually some good writers come out of it. Okay. I should perhaps point out that I came to computer science with a PhD in pure mathematics. Okay so he's saying that like really almost at the end. When I ask that the training in software be given a more practical engineering flavor I also loudly proclaim that we have too little understanding of what we're doing and that we desperately need to develop relevant theories. We don't know what we're doing. We didn't know then I think we still don't know what it is we're doing. We don't have theories of what computer science is or even theories in computer science that you could point at. Like what are the academic understanding? How is our understanding of computer science progressing? We don't have such a thing. And what I mean by that is like you can look at let's say physics is kind of a straw man because it's an old field really and so they have a lot of theories. But there are theories and the paradigm shifts in physics are a nice narrative history of what's going on and there are theories that are sort of disproven and there are theories that are that seem to still work and where it keeps sticking to them and like what do we have in programming? In computer science. I mean not much. Something like biology they have stuff they might claim they don't but they do you know there's like the cellular theory of life. All life is in cells but then what about viruses? Oh yeah viruses those are the thing. Okay so all life is about DNA. Let's say that and let's see where that takes us and it takes you pretty far right and do we have that in programming and software and computer science? I'm not sure. Not sure. One of my major complaints about the computer field is that whereas Newton could say if I have seen a little farther than others it is because I have stood on the shoulders of giants. I am forced to say today we stand on each other's feet. Perhaps the central problem we face in all of computer science is how we are to get to the situation where we build on top of the work of others rather than redoing so much of it in a trivially different way. Science is supposed to be cumulative not almost endless duplication of the same kind of things. Alan Kay has a quip that we're not reinventing the wheel. We're reinventing the flat tire. We'd be better off reinventing the wheel. And then he also says he said something like there have been no significant advances in programming for 30 years so it's like since the invention of the spreadsheet that was the last one. The invention of the spreadsheet was the last significant advance. He has a whole stack overflow thread where people throw out ideas and say what about this one? That's a significant advancement. He's like no that actually started in 1964. It's not new. Spreadsheets were late 70s early 80s. He's like nope that came before nope that came before. And no one on that thread could come up with one. So I mean are we stuck? Are we due for a paradigm shift? Are we due for something? And I have not much hope that we will find it. I mean looking at the way funding works. You know I was a grad student. I could see that people were just digging into a specialty like oh I can make this algorithm for searching this thing a little bit more efficient. You know things like that. And that's where the money was. And the focus in the commercial world is maybe too practical. It's just trying to apply what we have to get attention so that we can make some more money to sell that attention to the highest bidder. So it's not finding fundamentally new things. This brings me to another distinction that between undirected research and basic research. I am choosing to define basic research as being work upon which people will in the future base a lot of their work. I have come to the conclusion that what determines whether or not a piece of work has much chance to become basic is not so much the question asked as it is the way the problem is attacked. Unfortunately he doesn't go too much into this to describe the way it is attacked and like what way should be attacked. But there you go. Many of the courses in the proposed computer science curriculum are padded. This is a curriculum 68 that he mentioned before. It was a proposed computer science curriculum that many computer science departments got together and collaborated on so that everybody could have a better one. Many of the courses in the proposed computer science curriculum are padded. What does he mean by padded? We do not need to teach every method for finding the real zeros of a function. We need to teach a few typical ones that are both effective and illustrate basic concepts in numerical analysis. There do not seem to me to be enough fundamental ideas in all that we know of software to justify the large amount of time that is devoted to the topic. We should confine the material we teach to that which is important in ideas and technique. The plotting through a mass of minutiae should be avoided. He thinks that we are not focusing on enough of the important ideas and spending too much time on trivial things that maybe flesh out the minutiae, different ways of doing the same thing. We don't need to do all that. I don't know. This is an interesting idea. Let me now turn to the delicate matter of ethics. It has been observed on a number of occasions that the ethical behavior of the programmers in accounting installations leaves a lot to be desired when compared to that of the trained accounting personnel. The accounting personnel have a sense of ethics, but the programmers who are programming the accounting system do not. We seem not to teach the sacredness of information about people and private company material. That's starting to hit close to home nowadays with privacy concerns at an all time high. There's a lot of fingers pointed now at why didn't the Facebook developers stop doing what they're doing? I point to that Facebook, but it's a lot of companies. Why did they let that happen? They coded it. They shouldn't have. There should be some kind of ethical standard just like an accountant would say, "I'm not going to do that with your accounting. That would be wrong. I'm not going to give your accounting book to somebody else. I'm not going to take it for myself." That is wrong. I'm not going to leak it out. I'm going to lock it up every day. That's part of my pride in my profession, my professionalism. We should look at and copy how ethical standards are incorporated into the traditional accounting courses and elsewhere because they turn out a more ethical product than we do. We talk a lot in public of the dangers of large data banks of personnel records, but we do not do our share at the level of indoctrination of our own computer science majors. Again, this large data banks that he calls them, of personnel records, so personal information. Once you make it large enough, it becomes a target. What about the security ? What about the privacy? All that stuff. They were looking at it back then. The data banks have only gotten bigger. In the hands of people who are less concerned with privacy, a company would be concerned about the privacy of their own employees. There is plenty of evidence that other professions do manage to communicate to their students professional standards, which, while not always followed by every member, are certainly a lot better instilled than those we are presently providing for our students. Again, we need to examine how they do this kind of training and try to adapt their methods to our needs. I believe these three topics, ethics, professional behavior, and social responsibility must be incorporated into the computer science curriculum. They can best be taught by example, by the behavior of the professor. Thus, it is the professor who must first be made conscious that a significant part of his or her teaching role is in communicating these delicate, elusive matters and that he or she is not justified in saying they are none of my business. These are things that must be taught constantly all the time by everyone or they will not be taught at all. I don't know if you can really point the finger just at the professor, but at the professor, at least there is a control point where the university can kind of mandate it. All professors have to teach this. Obviously, what he is saying near the end is that it has to be done all the time by everyone. It has to be part of the culture. It is part of the culture of accounting that the book is sacred, that you take your time, you write it in ink, and you do it well. There is a certain pride, a certain craft's person ship in doing the books that you need to take. There is a kind of professional ethics around it. We don't have that. Even today, I did computer science and we hardly ever talked about this. Even when it was mentioned, it was a separate course. It was like a computing and ethics course. It wasn't something that was pervasive. You always, always hash your passwords. We didn't have that kind of thing. We are not engaged in turning out, oh, this is the thing I read at the beginning. This is the last paragraph, by the way. We are not engaged in turning out technicians, idiots of aunts, and compute nicks. We know that in this modern complex world, we must turn out people who can play responsible major roles in our changing society or else we must acknowledge that we have failed in our duty as teachers and leaders in this exciting important field, computer science. I wonder what he would say today, because our society has already largely changed to computers and is changing faster all the time. The people who are doing the changing are not trained in ethics, not trained in professionalism. The universities are not serving the needs enough. I'm just talking about pure numbers. Now, a large reason why there is a market for boot camps is simply the universities can't make programmers fast enough. The field is just growing so fast. We are in the midst of what he was talking about in 1968. I don't know if we are doing better than we were then, but I would say that the universities are at even more of a disadvantage than they were back then. Because more and more work is done, computing work is done outside of academia, outside of the computer science departments. They are swamped and outnumbered, and there are a lot of pressures on them. I don't know, like the university I went to, which is not a big name or anything, but there was very little fundamental research going on there. It was all specialization, or in some cases, it was partnerships with businesses who needed particular things studied, so it was basically like one of the topics that my university specialized in was computer security and forensics. There was a lot of like, "Hey, does your computer science department anyone there know how to unlock an encrypted hard drive?" It was stuff like that. Then they would say, "No, but if you give us $20,000, we can start looking into how to do that." There was this partnership that happened where they would say, "Okay, well, this sounds like a long-term investment. We're going to invest in this, and we're going to work together, and we'll send you hard drives. We need decrypted, and we'll give you money, and you'll put graduate student labor on it and figure out how to do it, and you'll publish papers out of it." It was things like that, but it was not fundamental stuff. Now, I think that it's very interesting in this whole lecture, there is a real tension between basic research and the engineering and practical side. Basic research, it seems, is not about practical. It's about what are the fundamental ideas here. There's also this practical side that it says we're not making people practical enough. I don't know. There's a big tension, and I think that that tension is still there. I think we're just going to have to live with that forever. We've separated out, just as an example, the physics department from the civil engineering department, the electrical engineering department. A physicist is definitely on the theoretical basic research side, and then if you want to actually build stuff, well, you go to the engineering department, and I wonder if we might have a split like that one day, or whether the department itself is going to have to live with that split. Never satisfy both, always kind of pinging back and forth, finding some balance between them. Anyway, like I said before, this was not a highly technical topic, but I think the stuff that he brought up in 1968 is still relevant to our field today. What is computer science? Should it be more practical? And then even if it's theoretical, what are the big ideas? What are the things that in 100 years, we are going to look back on and say, wow, that was it right there. That's where everything changed, especially in software, in programming. We don't know what we're doing. I mean, we know how to make if statements and for loops and function calls and stuff like that, but like, we don't know how to actually build this thing into something that can stand the test of time. All right, I'm going to sign off now. It's been over an hour and a half. I hope you've enjoyed this. I am reading the Turing Award lectures starting from the beginning. This one was from 1968. And I think it's important because we don't learn enough history. And these things are out there, they're free on the internet. We could be learning history, but we're not. We don't do it. And so I don't expect people to read these. They should, but I don't expect them to. But you know what, I can expect people to listen to a podcast. Some people are listening to this. And so I thought, well, why not bring up these big ideas in podcast form if they're not going to read the whole paper. So here I am. And my name is Eric Normand. I teach functional programming. If you're interested in this topic, in this idea of reading these papers and learning about history, then subscribe to the podcast. You can go to lispcast.com/podcast. And it's all, it's all there, all the old episodes. I've recorded these in video, audio, and then I make transcripts. So you can get all of that. You can even subscribe on YouTube to the videos. And then, of course, reach out. If you got questions, comments, I love to get into discussions about this stuff. So again, my name is Eric Normand. This has been my reading of an excerpt excerpt from Richard Hamming's 1968 ACM Turing Award. Lecture. Thank you for listening. And as always, rock on.