# 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

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.

## Theory

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, philosophy, 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 and online exercises), 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 (Tanenbaum's "Computer Networks"; there is also a freely available Computer Networks: A Systems Approach, which I only skimmed, but it looks fine) and operating systems (also Tanenbaum's, "Modern Operating Systems"). The mentioned books are educational and entry-level, after which one can proceed to more advanced books and papers. I collected more links to freely available maths-related learning materials (often relevant to CS), along with related tools, in "online courses and math notes".

Recent papers sorted by an area may be handy to browse on arXiv, while for more targeted search there are CiteSeerX, Google Scholar, Sci-Hub, and others.

Computer Science from the Bottom Up looks like a fine introduction to CS for beginners, and freely available under the CC BY-SA 3.0 license.

## Standards

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.

Less technical standards, along with written down practices and recommendations, provide useful (though sometimes overly bureaucratic) information on best practices. As examples, there are NIST cybersecurity guidelines, SEBoK, all kinds of books attempting to teach programming, management, and related skills.

## Software

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.

## Cultures

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 or perspectives contributing to those.

Familiarity with different views (both historical and contemporary) is generally useful for putting things into a perspective: while philosophy studies seem to comprise of studies of views more explicitly, even physics and mathematics include different perspectives, up to different foundations of mathematics. As with those other subjects, a complete picture requires to study it as an evolving set of approaches, not to pick a single one and declare computing to be solved.

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.