Computing context

People, including programmers, do their computing very differently. Apart from tasks that get performed, individual requirements, and preferences, the differences are caused by previous experience, and by familiarity with different computing aspects: history, theories, technologies, software. For a beginner it is a mystery how everything works: a model consisting of "I do X, Y happens" rules forms, immediately visible parts of systems are perceived as fundamental. While it is often sufficient to achieve one's goals, including software development, generally it is rather inefficient and leads to poor results.

Better judgements require a more complete picture (even though it's always somewhat incomplete, and there are controversies even in mathematics and history). Here I'm collecting materials that I find helpful with that.


History is useful for putting things into perspective, generally doesn't become outdated, stays relevant throughout one's life, and it's just amusing to observe how new and hot topics are the same as they were decades ago. Some bits of it can be learned from CS books and papers, but there are dedicated books, articles, and documentary films as well: History of computing in Wikipedia, Finite of Sense and Infinite of Thought: A History of Computation, Logic and Algebra, BBS: The Documentary, Computer Chronicles and BYTE magazine, RFC 2235 - Hobbes' Internet Timeline. Old books, papers, articles, and mailing list conversations are also helpful for reconstructing the picture.


Underlying theories tend to stay relevant considerably longer than particular applications of those. CS ones tend to rely on broader areas of mathematics, with even longer lifespans.

Wikipedia has a list of important publications in CS (along with similar lists for mathematics, theoretical CS, etc), which doesn't seem to be comprehensive, but at least may provide some pointers. It also lists some CS books.

Personally, at different periods of time I was excited about algorithms and data structures (plenty of books), AI (though books on statistics weren't that fun, and it seems dull to list them under "AI"; and apparently since the beginning of computing the term is abused, making it hard to separate actually fun bits from whatever is currently marketed as "AI"), cryptography (Applied Cryptography), compilers and PLT (Dragon Book, SICP, Jones' Forth), formal verification (Software Foundations, TTFP), networking and operating systems (Tanenbaum's books). The mentioned books are educational and entry-level, after which one can proceed to more advanced books and papers.


Computing-related standards (POSIX, programming language specifications, instruction set architectures, ISO standards, Internet standards and other RFCs, Web standards, etc) have yet shorter lifespans, based on both theory and practice, and are closer to everyday programming.

Many mistakes, poor decisions, and/or reinventions seem to arise out of poor familiarity with existing standards.


Operating systems provide a lot of useful functionality, as do common daemons and libraries. But as with standards and theories, often it gets ignored and reimplemented. Tanenbaum's "Modern Operating Systems" book pops up here again, as well as distribution-specific manuals (e.g., The Debian Administrator's Handbook), and just reading through info manuals and man pages. Though it's mostly useful for getting familiar with core OS functionality, while general software landscape is harder to map. Perhaps Debian Popularity Contest (and/or similar statistics of other operating systems) is worth checking to get familiar with most commonly installed software, though that alone would be far from a comprehensive picture. News websites and link aggregators tend to mention interesting software from time to time, though often it's just fashionable, new, and/or amusing software.


Philosophy and ideologies behind software (as well as behind standards, and even behind mathematics) vary, affecting not just what programs do, but how they do it, how they are written, licensed, distributed, maintained (including used communication channels and tools), documented. This includes software- and technologies-related topics (e.g., which paradigms work better, generally how it's better to build things, which technical qualities should be prioritised), as well as broader views on the purpose of software development (e.g., "software should be useful to people", "all that matters is the value it adds to business(es)", or "one should be proud of their work and/or enjoy it"), and world views contributing to those.

Perhaps it is worth mentioning Free Software Movement here, but a relevant picture could best be formed by reading public discussions: mailing list archives of prominent projects (which is a pretty good list of technologies and software worth checking; some of the other large archives are GNU Mail Archives, LKML archive, Debian Mailing Lists), discussions on web forums and Usenet, technological news websites, issue trackers, chat logs. It won't shed much light on commercial/enterprise software cultures, though less project-focused discussions cover those sometimes.