Original discussion moved to ProgrammerLiteracyHistory.
As several responses effectively showed, I was originally asking the wrong questions and looking for the wrong answers. This is refactored to reflect a change in the definition of ProgrammerLiteracy.
There are two meanings of 'literate':
ProgrammerLiteracy -- Things that a well-informed, educated programmer should know, but are not generally known by well-informed, educated non-programmers. We added the last clause to the definition to avoid listing all those things that well-informed, educated persons, in general, should know. --Glenn
In which case - you need at least TWO programming languages, preferably in two different programming paradigms. Otherwise (IMHO) you're doomed to 'see everything as nails', as the saying goes. Personally I wouldn't really consider someone to be a literate programmer in the second sense, though, until they have at least a passing knowledge of:
Having taught programmers, it seems to me that the language doesn't matter, until they can solve problems no amount of drag and drop UI can help them. -- BrianEwins
Important theoretical concepts every programmer should know:
The fundamental skills of a programming are not technical---a brilliant technician who doesn't listen to their client will produce less useful code than an average technician who works closely with their user. That's why the start of ThePragmaticProgrammer has no code in it at all--the foundation is human, not hardware.
Beyond that, there are process skills in team working, abstract skills in structuring (for example DontRepeatYourself or OnceAndOnlyOnce, understanding orthogonality and decoupling) testing, and the like. There are attitudes towards quality, documentation, debugging. ---DavidThomas
Hmm, how about
Most of us will have come across people in this industry who really understand what software is about and others who somehow don't, even though they may be great at specific tasks such as low-level coding. I was recently trying to capture an answer to the question WhatIsSoftwareAllAbout? but ended up getting very woolly and vague. One thing that seems fundamental to me is that creation of software is a form of human communication (some parts of which just happens to be machine readable). From there I went looking for the types of things we need to communicate well and came up one thing: a clear capture of the EssentialDifficulty of our systems. Everything else (OnceAndOnlyOnce, AbStraction, DoTheSimplestThingThatCouldPossiblyWork, etc) seems to be a means to this end. Perhaps I'm barking up the wrong tree but understanding this could be necessary not just to be a good programmer but to be JustaProgrammer. Perhaps there is a defined skill set for human communication that could serve as a starting point? --NeilGall
''Does this imply that programming is inherently an AsynchronousSocialActivity?
Actually I think that people are the only things that are important to people when you bring life to its most basic parts, therefore, everything is about communication. --ShaeErisson''