There are many reasons for Java's success, but there are two technical ones that are worth looking at that may not be obvious to those who do not write programs. One is object-oriented programming (OOP), and the other memory management. Most of us already know that computers are really nothing but enormous and complex switches. All a computer really understands is on and off. When an image on a computer screen is manipulated in such a way as to create an extraordinary effect, the computer - at the lowest level - is still dealing with the binary values of 0 and 1. Despite all of the progress made in programming, a computer's central processing unit (CPU) still understands only numbers, and then it really understands only 0 and 1. We use this to trick it into behaving as if it understands much more. When we program a computer we can assign symbols or English words to represent the values that the CPU can understand. In this way, we can read the program easily (it will make sense, of course, only to those who can understand the symbols). At some stage, however, the symbols must be translated into the numbers that the computer understands, a process normally called compiling. When we speak of writing an application in C or Pascal, for example, we normally mean writing instructions according to the language rules of C or Pascal, and then compiling it for the CPU we are working on. With languages like C or Pascal, the emphasis was on the design of algorithms, or the code that handled the data. Only afterwards did you build the data structures. One consequence of this was that every time you needed a data structure, you had to ask the system for the memory to do it. After you were finished, you had to tell the system that you no longer needed the memory. This taking and giving back of memory has been one of the greatest sources of computer bugs. Known as memory management, this is one of the first places all programmers look when programs begin crashing. Until the arrival of Java, it still was. Structured programming has given way to object-oriented programming. In OOP, data structures come first, then manipulation. Before Java came along, the most popular language for OOP was C++, a language that attempted to be a bridge for C programmers so that they could retain the best of C but also have access to OOP. This was not a great idea as many C++ programmers avoid OOP bits and continue to write C code. Java code can only be OOP code and, far more importantly, the engineers at Sun who designed it decided that memory management was the job of the computer, not the programmer. These two aspects of Java, plus the fact that compiled code runs on a Java virtual machine (JVM) not a specific CPU, are the strongest reasons programmers have taken to Java. IBM already has built Java into its operating systems and others, including Microsoft and Apple, are to follow. When compiled Java code is able to be run directly in the OS, then it will be possible to write serious applications - not just the little applets that animate a logo on a Web page. Then Java will have arrived.