Evolution Of Programming 
                    Methodology, Part II
Programming Languages 
                    Constrain Productivity 
By Bill 
                    Nicholls 
March 27, 
                    2000 
                    
                    
One 
                    paradoxical aspect of computers and software is that the 
                    process of writing software, -- the price/performance of 
                    programmers, if you will -- has gained much less in 
                    productivity, compared to the evolution of computers and 
                    hardware themselves.
                    Last month, in Part 
                    I, I talked about why programmers' productivity has 
                    evolved much slower than hardware. Now, let's continue this 
                    examination and explore some ways to significantly improve 
                    matters. 
                    
Out of the chaos of early programming came insights into 
                    better methods and structures for writing programs. From the 
                    1950s through the mid 1970s, these insights centered on the 
                    program text, it's structure, layout, and partitioning. Even 
                    though the program could be well structured, large programs 
                    were difficult to write. Part of the problem was the huge 
                    number of details that each programmer had to remember, and 
                    part was because of the exponential growth of human 
                    communications as the program complexity increased. 
                    Something beyond program structure needed to be addressed. 
                    
Looking back on nearly four decades working with 
                    computers, certain elements of the programming process stand 
                    out as essentially unchanged. An obvious example is the 
                    knowledge and level of detail required to develop a program 
                    in C or C++. In some aspects, they compare unfavorably to 
                    using assembler. The syntax is more complex, the structures 
                    can be even more obscure than assembler-level data 
                    definitions and the potential hidden problems easily exceed 
                    those of assembler. 
                    
In return for the extra details of C and C++, we are 
                    supposed to get portability, readability, and 
                    maintainability. Sometimes we do, but it is well known that 
                    one can write obscure programs in many languages, even 
                    unintentionally. It isn't my purpose to make C or C++ a 
                    strawman to knock down. They fall in the class of languages 
                    that leaves every decision up to the programmer. It is this 
                    requirement that the programmer handle all of the 
                    details that characterizes the first generation tools. 
                    
A later generation of tools, still called languages, hide 
                    varying amounts of detail from the programmer and provide 
                    default routines that can do the job or be overridden by the 
                    programmer. For many simpler or one-shot jobs, the 
                    inefficiency of the run time process is inconsequential to 
                    the total cost when you consider the jump in programmer 
                    productivity. Well-known examples of this class of tools 
                    include Smalltalk, Perl, and Python. 
                    
A third generation of tools is focused and specialized, 
                    yet very powerful. Here, the appearance of traditional 
                    programming is hidden. The programmer deals on a functional 
                    level and all of the details are handled by the tool. Into 
                    this broad class fall Tcl/Tk, AWK, Bison, regular 
                    expressions, APL, Finite State Machines, BNF grammar 
                    processors, and VLSI logic processors. 
                    
None of these tools has eliminated the drudge work of 
                    general-purpose programming. Even the Interactive 
                    Development Environment (IDE), a standard of modern 
                    development, has not changed the basic requirement of 
                    in-depth knowledge and voluminous typing. It, too, is a 
                    first-generation tool. Creating a program should not be like 
                    an old-time garment worker who assembled suits one hand-cut 
                    piece at a time, yet this is the way most programmers still 
                    work, almost 50 years after Univac I was delivered to the 
                    Census bureau. 
                    
  
                        >>>Next 
                    Page