Programming
Last update: 11 Aug 2026 11:36First version: 10 March 1996
I've been programming since I was about ten --- that was on a delapidated TRS-80 Model I, with 16k RAM, which someone had donated to my school. It had no storage device (or maybe we just didn't have any disks?), so we wrote BASIC programs that could fit into our own memory. I remember being very proud to get it to plot quadratic functions.
I can handle BASIC. I've acquired some skill at Fortran, at any rate Fortran 90. (Heck, I wrote a genetic algorithm in it once.) I fell in love with LISP when I took freshman CS at Cal. I've even worked in assembly on, may the gods have mercy, a Commodore 64. But.
I'm learning C. I have delayed doing so as long as possible; now I have to deal with a simulation program which will only save its results in Windows bitmap graphics files. As initiation rites go, I think I'd prefer tattooing without anæsthesia. Malloc is evil. So is the distinction between "=", which is the assignment operator, and "==", which is the equality operator, said distinction having just cost me an evening. I have no words to express my feelings about things like "%=". C is, quite literally, taking over my mind: I very distinctly remember a dream last week which was about cooking but in C. [10 March 1996; the dreams went away.]
I've actually developed a great deal of affection for C (doubtless this is what the psychologists call "effort justification," also known as the sunk cost fallacy), and for instance now do all my numerical coding in it. I am however having to learn C++, which is such a silly instance of object orientation that I almost believe the joke about how it was invented to keep programmers in business indefinitely. On the other hand, I've also been learning Perl and Expect, and they are pure delights; in both cases I was writing useful programs within an hour of opening the manual. Expect in particular is wonderful for making Unix do things for you, and for hiding a physicist's idea of a user interface. --- Probably not the least reason for my affection for C is having to write control code for a fairly complicated and undocumented piece of hardware in Forth... [24 June 1998]
Learning a little Java was instructive. Now Jean-Baptiste Rouquier, who's my student for the summer, has persuaded me that I need to learn Caml. Unfortunately, there's no O'Reilly Caml in a Nutshell handbook (perhaps because it'd cause too much confusion with Programming Perl), just the 400-page manual. [2 July 2004]
--- Reflection, 2026: I have written non-trivial programs in BASIC, Logo, 6502/6510 assembly, Lisp, Fortran, C, C++, Forth, Perl, Expect, Java, OCaml, and R. (This is deliberately not counting various mark-up languages, or things like Mathematica.) I am tired of learning programming languages. It appears, however, that I am going to have to learn Python, because graduate students in the programs I teach in are coordinating on that....
- See also:
- Computers
- Abstract Computation
- Math I Ought to Learn
- Parallel and Distributed Programming
- Numerical Methods
- Christopher Alexander
- Computational Statistics
- Statistical Computing
- Recommended, big picture:
- Abelson and Sussman, Structure and Interpretation of Computer Programs
- Cormen, Leiserson, Rivest and Stein, Introduction to Algorithms
- William H. Press, Saul A. Teukolsky, William T. Vetterling, and Brian P. Flannery, Numerical Recipes in C and Numerical Recipes in Fortran [2nd editions of both are on-line]
- Recommended, close-ups:
- Timothy Budd, Understanding Object-Oriented Programming with Java
- John M. Chambers, Software for Data Analysis: Programming with R
- Jutta Degener, Programming in C page
- Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language
- Robert Kowalski, "Algorithm = logic + control", Communications of the ACM 22
- Don Libes, Exploring Expect and the Expect Home Page
- Peter G. Neumann, Computer-Related Risks [1994]
- Suley Oliveira and David E. Stewart, Writing Scientific Software: A Guide to Good Style [Would have been much more useful to me if I'd read it much earlier.]
- Steve Oualline
- Practical C Programming
- Practical C++ Programming
- C Elements of Style: The Programmer's Guide to Developing Well Written C and C++ Programs
- Randal L. Schwartz Learning Perl
- Peter Seebach, comp.lang.c Infrequently Asked Questions
- David Touretzky, Common LISP: A Gentle Introduction to Symbolic Computation
- Larry Wall and Randal Schwartz, Programming Perl
- To read, specific languages:
- C and C++:
- Frantisek Franek, Memory as a Programming Concept in C and C++ ["Most professional programmers learn about [the role of memory] entirely through actual experience of the problems it causes"]
- Richard Reese, Understanding and Using C Pointers
- Caml and OCaml:
- Allen Downey and Nicholas Monje, Think OCaml: How to Think Like a (Functional) Programmer
- Jon D. Harrop, OCaml for Scientists
- Xavier Leroy (et cie), The Objective Caml System
- Yaron Minsky and Jason Hickey, Real World OCaml: Functional programming for the masses [The O'Reilly OCaml book I dreamed of 20 years ago]
- Python:
- Allen B. Downey, Think Python: How to Think Like a Computer Scientist
- John V. Guttag, Introduction to Computation and Programming Using Python
- Hans P. Langtangen, Python Scripting for Computational Science
- Lutz and Ascher, Learning Python
- Wes McKinney, Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython
- David Mertz, Text Processing in Python [Review by Danny Yee]
- Mark Pilgrim, Dive Into Python
- Other:
- Keith Bradnam, Ian Korf, UNIX and Perl to the Rescue!: A Field Guide for the Life Sciences (and Other Data-rich Pursuits) [I've read about 3/4 of this and it's great so far...]
- Casey Reas and Ben Fry, Processing: A Programming Handbook for Visual Designers and Artists
- Larry Rockoff, The Language of SQL
- To read, craft:
- Beck, Extreme Programming Explained [A friend who actually does software development for a (partial) living raves about this]
- Mathias Felleisen et al., How to Design Programs: An Introduction to Programming and Computing
- Gamma, Helm, Johnson and Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software [Need to finish one of these decades]
- Daniel Jackson, The Essence of Software: Why Concepts Matter for Great Design
- Brian W. Kernighan and Rob Pike, The Practice of Programming
- Andy Oram, and Greg Wilson, Beautiful Code: Leading Programmers Explain How They Think
- To read, theory:
- Jeff Edmonds, How to Think About Algorithms
- Daniel Jackson, Software Abstractions: Logic, Language, and Analysis
- Jon Kleinberg and Eva Tardos, Algorithm Design
- Donald E. Knuth, The Art of Computer Programming [Review by Danny Yee, not that it needs one...]
- Glynn Winskel, The Formal Semantics of Programming Languages: An Introduction
- To read, profession:
- David Auerbach, Bitwise: A Life in Code
- Torie Bosch (ed.), "You Are Not Expected to Understand This": How 26 Lines of Code Changed the World
- Nathaniel Borenstein, Programming as if People Mattered: Friendly Programs, Software Engineering, and Other Noble Delusions
- Brookes, The Mythical Man-Month
- Martin Campbell-Kelly, From Airline Reservations to Sonic the Hedgehog: A History of the Software Industry
- To read, not otherwise, or not yet, classified:
- Ben Fry, Visualizing Data
- Nick Monfort, Exploratory Programming for the Arts and Humanities
- Chris Raistrick et al., Model Driven Architecture with Executable UML [If I understand this even close to correctly, this is something like compiling an abstract model specification into executable code, which would be cool. Of course I'd have to learn UML first...]
- Mike Silver (ed.), Programming Cultures: Architecture, Art and Science in the Age of Software Development
- Steve Skiena, The Algorithm Design Manual
- R. D. Tennent, Specifying Software: A Hands-on Introduction