Despite collectively being referred to as "computer science (CS)", the processes of computer programming are couched in mathematical or logical terms solely because programming is run on a logic-based device, the computer. Nonetheless, the actual process involved in CS is in practice a liberal art, not a science: more akin to languages and linguistics. I would contend that CS is incorrectly categorized and the educational process of CS is at fundamental odds with the actual practice of computer programming.
I would contend there are two classes of programmers: there are system architects, and there are script architects. A system architect is a programmer who has typically been given a traditional CS education, and is responsible for developing underlying code. These programmers will typically develop operating systems, drivers, middleware, and enterprise class applications- applications whose primary purpose is to serve the needs of the computer hardware. Script architects, on the other hand, typically have little to no formal CS education. These programmers are often responsible for developing application macros, extensions, stored procedures, reports, and other user-faced solutions.
It is not uncommon for both types of programmers to attempt to stretch beyond their typical roles. In project management, there is supposed to be a bridging role, that of analyst, who can communicate the user-based needs to system architects, and in turn, provide system support to script architects to maximize the efficiency of scripted usage of system software.
Because of the nature of each type of programmer, the software created by the individual will typically show flaws that are consistent with the type of architect class. A system architect will frequently create flaws in usability, whereby the design is efficient from a system perspective and inefficient from a user perspective. This leads to the creation of scripting routines, which take base operations from the system API and rewrites them in terms which automate inefficent user tasks and improve UI usability. A script architect, on the other hand, will typically make flaws in system utilization, whereby the focus on specific user needs may result in unintended effects at the system level. Code generated by a script architect, even if written at the 3GL level, is frequently difficult to read by typical system architects. Unlike the code process described from system architect to script architect, however, there is no well established process by which script architect code can be engineered back into more efficient system code. In fact, the lack of such a process typically results in a third class of developer, the former script architect, who has ceased to operate at the script level and almost exclusively develops software at the 3GL level.
More impressive, is the evolution of former "script kiddies". Akin to children raised in a truly bilingual environment, these are children who have had some familiarity with programming languages from an early age. Different from bilingual children, however, the inculcation of a programming skill is not the result of parental or familial exposure, but that of a chisen peer environment. This environment is increasingly available to children first through the greater availability of personal computers, and second, through the increasing usage of online communication, As with children of immigrants, the "script kiddie" evolves beyond the creole 4GL/3GL languages used by the adult generation and is formulating a true dialect set of programming languages. This would explaing the popularity of such developing languages such as PHP, which as a interpreted language not compiled to byte-code or VM code, is not the most efficient way of developing enterprise software, and yet we can observe PHP based software exploding onto the user scene.
As these languages become more prevalent, the need for a grammatical formalism becomes more apparent. However, I woulkd argue that CS is the wrong type of formalism to introduce to ensure maximal efficiency. If we accept that the evolution of 4GL languages appears to take more of a linguistic rather than logical or mathematical route, it would make sense that a liberal arts education should construct a humanities major in programming. Much the way a background in linguistic science is not necessarily the best educational base for a future novelist or English professor, there should be a humanities-based formalism developed to understand, interpret, and even deconstruct programming at a usage level, not at a technical level.
personal notes: I would think that this topic, well researched and backed up by footnotes, would make an excellent basis for a PhD thesis. It's times like this that I regret no having attained a PhD: though in truth, I'm not really sure what my barriers are, other than slavery to a mortgage and a desire to no be poor for the next umpteen years whil I (re)establish a name for myself. There are times when I want to AP-exam out of the whole treadmill of an education, but I remember the tremendous cost I had to pay last time I took that route. I managed to AP out of undergraduate biochem prerequisites and wound up lost in graduate level biochem coursework. That's probably one of the root causes of my dropping my PhD, along with just general immaturity.
I feel, sometimes, that I'm no dummy, nor a bullshit artist. But, I don't have any tangible way, nor any adequate mentoring, on how to properly make distinct my talents from such a perception.