A programming language functions at many different levels and has many roles, and should be evaluated with respect to those levels and roles. Historically, programming languages have had a limited role, that of writing executable programs. As programs have grown in complexity, this role alone has proved insuffi- cient. Many design and analysis techniques have arisen to support other necessary roles. Object-oriented techniques help in the analysis and design phases; object-oriented languages to support the implementation phase of OO, but in many cases these lack uniformity of concepts, integration with the development environment and commonality of purpose. Traditional problematic software practices are infiltrating the object-oriented world with little thought. Often these techniques appeal to management because they are outwardly organized: people are assigned organizational roles such as project manager, team leader, analyst, designer and programmer. But these techniques are simplistic and insufficient, and result in demotivated and uncreative environments. Object-orientation, however, offers a better rational approach to software development. The complementary roles of analysis, design, implementation and project organization should be better integrated in the object-oriented scheme. This results in economical software production, and more creative and motivated environments. The organization of projects also required tools external to the language and compiler, like ‘make.’ A reevaluation of these tools shows that often the division of labor between them has not been done along optimal lines: firstly, programmers need to do extra bookkeeping work which could be automated; and secondly, inadequate separation of concerns has resulted in inflexible software systems. C++ is an interesting experiment in adapting the advantages of object-orientation to a traditional programming language and development environment. Bjarne Stroustrup should be recognized for having the insight to put the two technologies together; he ventured into OO not only before solutions were known to many issues, but before the issues were even widely recognized. He deserves better than a back full of arrows. But in retrospect, we now treat concepts such as multiple inheritance with a good deal of respect, and realize that the Unix development environment with limited linker support does not provide enough compiler support for many of the features that should be in a high level language.(C++ was developed in the mid-eighties supported non-specialized tools found in the Unix program development environment.) There are solutions to the problems that C++ uncovered. C++ has gone down a path in research, but now we know what the problems are and how to solve them. Let’s adopt or develop such languages. Fortunately, such languages have been developed, which are of industrial strength, meant for commercial projects, and are not just academic research projects. It is now up to the industry to adopt them on a wider scale. C++, however, retains the problems of the old order of software production. C++ has an advantage over C as it supports many facets of object-orientation. These can be used for some analysis and design. The processes of analysis, design, and organization, however, are still largely external to C++. C++ has not realized the important advantages of integrated software development that leads to improved economies of software production. Java is an interesting development taking a different approach to C++: strict compatibility with C is not seen as a relevant goal contrary to the initial goal of C++ to be as compatible as possible with C. Java is not the only C based alternative to C++ in the object-oriented world. There has also been Objective-C from Brad Cox, and mainly used in NeXT’s OpenStep environment. Objective-C is more like Smalltalk, in that all binding is done dynamically at run time. A language should not only be evaluated from a technical point of view, considering its syntactic and semantic features; it should also be analyzed from the viewpoint of its contribution to the entire software development process. A language should enable communication between project members acting at different levels, from management, who set enterprise level policies, to testers, who must test the result. All these people are involved in the general activity of programming, so a language should enable communication between project members separated in space and time. A single programmer is not often responsible for a task over its entire lifetime, let alone responsible for the whole development process and product.