A lot of the material in this book—particularly at the beginning of Part One— may seem overly simplistic to experienced programmers. This is because much of object technology is founded on basic software engineering principles that have been in practice for many years, and, in many cases, just repackaged slightly differently! There are indeed a few new tricks that make OO languages extremely powerful and which were virtually impossible to achieve with non-OO languages—inheritance and polymorphism, for example, which you'll learn more about in Chapters 5 and 7, respectively. (Such techniques can be simulated by hand in a non-OO language, just as programmers could program their own database management system (DBMS) from scratch instead of using a commercial product like Oracle, Sybase, or MS SQL Server—but who'd want to?)
The biggest challenge for experienced programmers in becoming proficient with objects is in reorienting the manner in which they think about the problem they will be automating.
Software engineers/programmers who have developed applications using non–object-oriented methods often have to "unlearn" certain approaches used in the traditional methods of software analysis and design.
Paradoxically, people just starting out as programmers (or as OO modelers) sometimes have an easier time when learning the OO approach to software development as their only approach.
Fortunately, the way we need to think about objects when developing software turns out to be the natural way that people think about the world in general. So, learning to "think" objects—and to program them in C#—is as easy as 1, 2, 3!