Since writing about teaching agility to computer science students
, I've had a few more ideas, plus excellent suggestions from Patrick Linskey and Michael McCracken
Patrick's suggestion (which I can't believe I didn't think of myself) is to teach them more about the history of our field. We don't have to make computer science students scholars of computer history, but we should give them some idea of the rich scope of the topic. Introductory computer courses tend to cover Babbage, Turing, and von Neumann, and then skip straight to Bill Gates. And for most CS students, that's the end of it.
Michael's suggestion is this:
... professors often understand the distinction between teaching skills for their own sake and teaching them as applications of more general principles. It's important to convey that to the students as well. Giving an idea of trends and perspective helps breed the kind of healthy skepticism about tools and paradigms that Glenn mentions.
That's absolutely right. All too frequently I meet young programmers who are confused about that -- they think the particular techniques and tools they were taught are
the fundamental things.
Here are the other things I've thought of:
- Computer science students should learn, even as undergraduates, to read technical papers, and how to find them. (I have suggestions for anyone who's looking for seminal papers that are well written and approachable.)
- Along the same lines as Patrick's suggestion: teach them about the great personalities of the field. Knuth, Hoare, Dijkstra, Englebart, Kay, Moore, Cray, Cocke, Hopper, Dahl, Thompson, Ritchie, Kernighan, McIlroy, Bentley, McCarthy, Minsky, Wirth, Steele, and many, many others are important not just for their technical contributions, but also for the color and vibrance they've brought to our field and its history. Learning about them and their relationships helps bring our past and present to life.
- Help students to understand that there are communities of developers that they will be joining, and that those communities are where much of the advancement comes from. User groups, mailing lists, wikis, and blogspace are just some examples. Show students how they can be contributors, not just users.
- Somewhere, years ago, I heard that one of the characteristics of "the professions" (medicine, law, architecture, engineering, etc.) was that professionals were expected to keep their education current. I have some friends who are doctors, and their homes and offices are always full of current medical journals. I often hear people complain that as a field we are not more "professional," and yet few programmers take that responsibility seriously. It's amazing how many programmers with years of experience have never read a book about programming (as opposed to just an API reference or tutorial) since they left school. That ethic of continued self-education should be taught to CS students, if they are to call themselves professionals.
- Students need to leave school with some knowledge of ideas that are out of the mainstream. ZUIs, magic lenses, pie menus. Plan 9, BeOS. AOP, intentional programming, multiparadigm programming. Mob software. And many, many more.