Home > Store > Software Development & Management

Application Reengineering: Building Web-Based Applications and Dealing with Legacies

Register your product to gain access to bonus material or receive a coupon.

Application Reengineering: Building Web-Based Applications and Dealing with Legacies

Book

  • Your Price: $68.00
  • List Price: $80.00
  • Usually ships in 24 hours.

About

Features

Leveraging Web, client/server and O-O technologies.

  • Engineering advanced Web-based enterprise applications.
  • Successfully coping with legacy systems.
  • Defining application and data architectures for maximum effectiveness.

Description

  • Copyright 1997
  • Dimensions: 7" x 9-1/4"
  • Pages: 624
  • Edition: 1st
  • Book
  • ISBN-10: 0-13-750035-1
  • ISBN-13: 978-0-13-750035-2


75003-4

Building advanced Web-based enterprise applications: a comprehensive, systematic approach.

Three technologies are converging to dramatically change the nature of application development: client/server, object-orientation, and the Internet. This book is a complete guide to successfully integrating all of these technologies in your new enterprise applications.

Expert consultant and project manager Dr. Amjad Umar shows how to establish data architectures, application architectures, and frameworks that enable successful Web-based software development. He presents a detailed methodology for using middleware to engineer new applications—or reengineer existing ones. He also offers a systematic approach to cope with legacy systems—including legacy data access, data warehousing and application migration/transition strategies.

For each major issue confronting developers, Umar considers the state of today's marketplace, as well as trends that will powerfully impact development projects in the near future. The book contains extensive guidelines, implementation examples and case studies, using a wide range of technologies, including:

  • CORBA.
  • ActiveX.
  • PowerBuilder.
  • Encina.
  • CGI and other Web gateways

The book includes short tutorials on object-oriented concepts, distributed objects, the World Wide Web, and client/server middleware. Each chapter is written as a self-contained tutorial—making the book a valuable resource not only for IT professionals, but also for trainers, teachers, and advanced students.

Sample Content

Table of Contents

PART I. GETTING STARTED.

1. Application (Re)Engineering--The Big Picture.

Introduction. Concepts and Definitions. General Framework. Application Concepts and Components. A Classification of Applications. Aligning IT with Business Needs. What is Application (Re)Engineering? Responding to Business Needs--Tying BPR to IT. Application Engineering--Building New Applications. Application Reengineering--Dealing with Legacies. Why This Book? State of the Practice: General Observations. State of the Market: General Observations. State of the Art: General Trends. Summary. A Case Study. Problems and Exercises. Additional Information.

2. Object-Oriented Client/Server Internet Environments.

Introduction. Client/Server Fundamentals. Definitions. Client/Server--A Special Case of Distributed Computing. Client/Server Architectures. OSF DCE--A Client/Server Environment. Internet and the World Wide Web (WWW). Internet, Intranets, and Extranets. Overview of World Wide Web. A Simple Example. Objects and Distributed Objects. Core Object-Oriented Technologies. Distributed Objects for Enterprisewide Applications. CORBA and ActiveX--Middleware for Distributed Objects. Object-Oriented Client/Server Internet Environments. Client/Server Processes--The Applications. Middleware for OCSI Environments. Network Services. Local Software. State of the Practice: Typical Examples. State of the Market: Commercial Products. State of the Art: Standards and Trends. Summary. Case Study: XYZCorp Review of IT Infrastructure Architecture. Problems and Exercises. APPENDIX 2A: Object-Oriented Concepts. Key Concepts. Object-Based Versus Object-Orientation. Additional Information.

3. Methodology Overview: Planning and Modeling.

Introduction. Application (Re)Engineering Methodology. Application Planning--The First Iteration. Overview. Step 1: Identify Business Drivers and Establish High-Level Requirements. Step 2: Investigate Application Architecture Approaches. Step 3: Assess and Plan Infrastructure Architectures. Step 4: Cost/Benefit Analysis. Object Modeling and Prototyping--Second Iteration. Overview. Object-Oriented Analysis--Building the Object Model. Architecture and Prototyping--Applying The Object Model. State of the Practice, Market and Art. Summary. Case Study: XYZCorp Embarks on Application (Re)Engineering. Problems and Exercises. Additional Information.

PART II. APPLICATION ENGINEERING--BUILDING WEB APPLICATIONS.

4. Building New (Web-Based) Applications.

Introduction. Modern Web-Based Applications. Static HTML-Based Applications. Server-Side (CGI-Based) Applications. Client-Side (Java-Based) Applications. Object-Oriented Client/Server (OCSI) Applications. Promises and Pitfalls of OCSI Applications. An Approach to Building OCSI Applications. Overview. Analysis. Application Architectures. Implementation. Deployment and Support. Customizing the Methodology. Overview. Building Web-Based Decision Support Systems (DSSs). Building Web-Based Operational Support Applications. Real-Time Application Development. Application Development Environments. State of the Practice: Examples and Case Studies. State of the Market: Products and Standards. State of the Art: Research Notes. Summary. Case Study: XYZCorp Builds New Applications. Problems and Exercises. Additional Information.

5. Enterprise Data Architectures.

Introduction. Concepts and Definitions. Enterprise (Corporate) Data. Data Life Cycle. Data Architecture. Step 1: Information Requirement Definitions. Step 2: Data Modeling. Step 3: Logical Database Design. Step 4: Data Partitioning and Clustering. Overview. Data Partitioning (Fragmentation). Clustering. Example of Partitioning (Fragmentation) and Clustering. Step 5: Data Allocation Strategies. Overview. Trade-offs in Data Duplication. Intuitive Data Allocation Analysis. Analytical Data Allocation. Step 6: Database Connectivity and Interoperability. Data Connectivity Strategies. Data Interoperability. State of the Practice: Case Studies and Examples. Short Case Studies (“Snippets”). A Detailed Example. State of the Market: Standards and Products. State of the Art: Research Notes. Summary. Case Study: Data Architecture for XYZCorp. Problems and Exercises. Appendix 5A: Two Analytical Data Allocation Method. Non-Redundant Best Fit Data Allocation Method. The Redundant Data Allocation Method. Additional Information.

6. Web-Based Application Software Architectures.

Introduction. Software Architecture Concepts. Definition. A Software Architecture Approach. Organizational Notes. Step 1: Refine/Extend the Object Model. Step 2: Separate Concerns (Layers). Step 3: Decompose Application into Tiers. Single-Tiered Applications Architectures. Two-Tiered Application Architectures. Three-Tiered Application Architectures. Mixed Architectures (Hybrids). Choosing Number of Tiers--The “Tiering Debate”, Step 4: Evaluate/Choose an Infrastructure. General Considerations. Evaluate Middleware for Remote Message Support (RPC, RDA, MOM, COBRA, DCOM). Choose Enterprise Data Management Middleware (TP-Lite or TP-Heavy). Evaluate Internet and Special Application Support. Evaluate Management and Support Services. Analyze Network Support. Understand Operating System Support. Keep Business Reality in Mind. Step 5: Performance and Allocation Analysis. Overview. Client/Server Performance: Issues and Guidelines. Estimating Response Time Performance. Optimal Allocation Algorithms. State of the Practice: Examples and Case Studies. State of the Market: Standards and Products. State of the Art: Research Notes. Summary. Case Study: Application Software Architectures for XYZCorp. Problems and Exercises. Additional Information.

7. Implementation Concepts and Examples (Web, CORBA, ActiveX, DCE, Encina, PowerBuilder).

Introduction. Implementation Issues: General Concepts. Overview. Implementation Approach. Step 1: Detailed Design. Step 2: Create Interface Definitions. Step 3: Build Server Programs. Step 4: Build Client Program(s). Step 5: Testing. A Sample Application. Developing Web-Based Applications. Overview. CGI-Based Application. Java-Based Applications. Object-Oriented Client/Server Internet (OCSI) Applications. COBRA for Developing OCSI Applications. Overview. Create COBRA Definitions. Build the Server. Build Client (Dynamic Invocation). Deploy and Run the Application. ActiveX for Developing OCSI Applications. OSF-DCE for Developing OCSI Applications. Overview. Create Interface Definitions. Build a DCE Server. Build a DCE Client. Deploy Application. Encina for Developing OCSI Applications. Overview. Construct a Transaction Model. Create Interface Definitions. Build an Encina Server. Build an Encina Client. Deploy Application. PowerBuilder for Developing OCSI Applications. Overview. Create an Application Object. Prepare the Server for Use. Build Client Application. Deploy the Application. State of the Practice: Case Studies. State of the Market: Standards and Products. State of the Art: Research Notes. Summary. Case Study: XYZCorp Implements Web-based Systems. Problems and Exercises. Additional Information.

PART III. APPLICATION REENGINEERING: DEALING WITH LEGACIES.

8. Dealing With Legacy Systems: An Overview.

Introduction. Legacy Application Concepts. What Is a Legacy Application? Legacy Application Reengineering Dilemma. Categories of Legacy Applications. Legacy Application Reengineering Strategies. Overview. Strategy 1: Ignore the Legacy Applications. Strategy 2: Rewrite from Scratch (Cold Turkey). Strategy 3: Provide Access in Place (Access/Integration). Strategy 4: Data Warehousing. Strategy 5: Gradual Migration. Planning for Legacy Application Reengineering. Overview. Opportunity Analysis. Choose a Solution Architecture. Implementation Considerations. Cost/Benefit Analysis. Justification and Scheduling. State of the Practice: Case Studies. Off-Shore Reengineering. University of Florida Reengineers via the World Wide Web. Hewlett-Packard's Migration to Client/Server Architecture. United Nations' Personnel Information Systems. Burlington Coat Factory Information System Reengineering. Short Case Studies (“Snippets”). State of the Market: Reengineering Tools. State of the Art: Research Notes. Summary. Case Study: XYZCorp Embarks on Application Reengineering. Problems and Exercises. Additional Information.

9. Access and Integration of Legacy Applications through the Web.

Introduction. Access and Integration Framework. The Basic Framework. Web Factor--Access/Integration through the Web. Legacy Information (Data) Access. Overview. Remote Data Access (RDA) Paradigm. Remote Function Access (RFA) Paradigm. Remote Presentation Access (RPA) Paradigm. Analysis of Paradigms for Legacy Information Access. Integration of Legacy Applications. What is Legacy Application Integration? Access versus Integration Trade-Off--An Example. Approaches to Integrate Legacy Application. Integration Technologies: Object Wrappers & Integration Gateways. Web Gateways--Enabling Access and Integration through the Web. Common Gateway Interface (CGI). Java-Based Gateways. Using Web Gateways. A Procedure for Legacy Application Integration. Step 1: Requirement Definition and Analysis. Step 2: Solution Architectures. Step 3: Implement and Test. Step 4: Deploy and Support. State of the Practice: Case Studies and Examples. Short Case Studies (“Snippets”). Example 1: Access/Integration of DB2 Applications. Example 2: Integration of an IMS Application. State of the Market: Products and Standards. State of the Art: Research Notes. Summary. Case Study: Access/Integration for XYZ Corp. Problems and Exercises. Additional Information.

10: Data Warehouses.

Introduction. What is a Data Warehouse?. Overview. Definitions. Examples. Who Uses the Data Warehouse? Why Data Warehouses? Key Characteristics of a Data Warehouse. Data Characteristics. Tool Characteristics. Data Warehouse Architectures. Localized Functional Warehouses (“The Data Marts”). Centralized Data Warehouse. Distributed Data Warehouses (“The Virtual Warehouse”). Data Warehouse Design Issues. Granularity. Partitioning (Fragmentation). Data Structures. Technologies for Data Warehousing. Data Extraction and Loading Software. Database Engine. Metadata Software. Tools for Data Warehouse Access and Manipulation. Middleware to Access the Data Warehouse. A Procedure for Data Warehouse Planning and Development. Overview. Step 1: Management Planning. Step 2: Requirements Gathering. Step 3: Data Modeling. Step 4: Design and Implementation. Step 5: Deployment and Administration. State of the Practice - Case Studies and Examples. IBM Shifts to Data Marts. ReliaStar Financial Data Warehouse for Competitive Advantage. 3Com's Data Warehouse. British Telecom's Data Warehouse. Banc One's Transition to Data Warehousing. Short Case Studies (“Snippets”). State of the Market. State of the Art: Research Areas. Summary. Case Study: Data Warehouse for XYZCorp. Problems and Exercises. Additional Information.

11. Migration Strategies.

Introduction. Migration Concepts and Strategies. User Interface Migration to Web. Data Migration. Overview. A Framework for Categorizing Data Migration. Data Migration Technologies. Complete Application Migration. Overview. Highly Structured (Decomposable) Application Migration. Semidecomposable (Program Decomposable) Applications. Unstructured (Monolithic) Applications. Migration Gateways--Technologies for Migration. System Migration - Mainframe Unplugs. System Migration Concepts. A Procedure for Migration. Step 1: Business Analysis and Migration Planning. Step 2: Develop and Justify a Migration Architecture. Step 3: Implementation. Step 4: Deployment and Support Considerations. State of the Practice: Examples and Case Studies. Short Case Studies (“Snippets”). A Detailed Example: Migration of a Project Management System. State of the Market: Products. State of the Art: Research Notes. Summary. Case Study: Migration for XYZCorp. Problems and Exercises. Additional Information.

Preface

xvii

Preface


This book explores the issues in building the new breed of Web-based applications that exploits object technologies, and deals with the large embedded base of legacy applications. The book is intended as a guide and a tutorial for the IT managers and practitioners who are involved in engineering of new applications and reengineering of existing (mostly legacy) applications.

The first part of the book reviews application (re)engineering issues, scans the IT infrastructure, and develops a general methodology for application (re)engineering. The second part concentrates on building Web-based object-oriented applications and explores enterprise- critical areas such as data architectures, application software architectures, and implementation issues (e.g., Web-Java, CORBA, ActiveX, OSF DCE). The third part presents critical examination of approaches to deal with legacy applications such as access/integration of legacy applications through the Web, data warehouses, and rearchitecture/migration strategies.

Several examples are presented and a single case study is developed throughout the book to illustrate the key points. Extensive references for additional information are provided.

Key Features of the Book

Focus on Applications. While many books are being written on the infrastructure (e.g., net- works, World Wide Web, Groupware, CORBA, etc.), this book concentrates on using the infrastructure to build applications for modern enterprises. In particular, application engineering as well as reengineering issues are discussed.

Web-Based Object-Oriented Applications View. We are interested in the class of enterprisewide applications that leverage powerful technologies such as the Web (e.g., Java, CGI), distributed objects (CORBA, ActiveX), and data access middleware (e.g., SQL gate- ways) to provide business value. These applications, termed object-oriented, client/server, Internet-based (OCSI) applications, are a special class of distributed applications for the enterprises of the 1990s and beyond. These three technologies are viewed as complementing each other to provide business value and not as replacements for each other.

Strategies to Deal with Legacy Applications. New applications must coexist with the large embedded base of existing (mostly legacy) applications. A systematic approach is suggested for dealing with legacy systems with discussion and analysis of legacy data access, data warehousing, and application migration/transition strategies.

Merging of Case Studies, Industrial Products, and Research Efforts. Each chapter is written as a self-contained tutorial with several case studies and examples to illustrate the key points throughout. State-of-the-market and state-of-the-art trends are noted in each chapter with numerous references for additional studies.

Integration with Infrastructure, in Particular Middleware, Issues. This book builds upon and uses the infrastructure and middleware discussed in the companion book ( “Object- Oriented Client/Server Internet Environments, ” A. Umar, Prentice Hall, 1997). Together, these two books form an invaluable source of information for modern enterprises.

Practical Hints, Guidelines, Checklists. Numerous practical hints, guidelines, and check- lists are highlighted throughout the book as sidebars for quick reference.

A Systematic Framework for Study. A framework for discussion and a general methodology is introduced early in the book to serve as a roadmap for study. The framework provides a basis for analysis and synthesis of the wide range of issues such as data architectures and application architectures.

In short, the reader of this book should develop a thorough understanding of how to engineer new applications and databases, and how to reengineer the existing terminal-host systems in an object-oriented client/server Internet world.


Book Outline

PART I: GETTING STARTED.

1: Application (Re)Engineering —The Big Picture.
2: Object-Oriented Client/Server Internet Environments.
3: Methodology Overview: Planning and Modeling.

PART II: APPLICATION ENGINEERING: BUILDING WEB APPLICATIONS.

4: Building New (Web-Based) Applications.
5: Enterprise Data Architectures.
6: Web-Based Application Software Architectures.
7: Implementation Concepts and Examples (Web, CORBA, ActiveX, DCE, Encina, PowerBuilder).

PART III: APPLICATION REENGINEERING: DEALING WITH LEGACIES.

8: Dealing with Legacy Applications: An Overview.
9: Access and Integration of Legacy Applications through the Web.
10: Data Warehouses.
11: Migration Strategies.
Intended Audience and Recommended Usage

This book is based on a synthesis of experience gained from three different sources. First, extensive project management, consulting, and system integration assignments in recent years in client/server systems, object-oriented technologies, Web-based applications, middleware evaluation, legacy data access, data warehousing, and data migration. Second, development and teaching of industrial training courses on client/server technologies and distributed systems that have been taught several times in the telecommunications industry and general IT community. Finally, teaching of graduate-level special topics courses in distributed systems for IT majors and computer-science students. This experience has indicated that this book should be useful as a reference for almost all IT managers and practitioners and also as a textbook for university courses and industrial training seminars. Specifically, this book should be of value to:


  • Architects and designers of information services (application designers, database designers, network designers).
  • Analysts and consultants of information technologies.
  • Planners of IT infrastructure and platforms.
  • Technical support personnel .
  • Managers of information technologies (CIO, MIS managers, database administrators, application development managers).
  • System integrators who combine databases, networks, and applications between different platforms.
  • Teachers of university courses in information technologies.
  • Technical trainers for professional development courses in information technology.
  • Researchers in computing and information technologies who need a broad coverage of the subject matter.
  • Students for an introduction to the subject matter with numerous references for additional studies.
    Depending on the background and interest of the reader, the book can be used in a variety of ways. This book has been, and can be, used in academic courses as well as in corporate training. Outlines of a university course and a two-day professional training course are suggested on the next page (the companion book “Object-Oriented Client/Server Internet Environments ” is used as a reference book). These outlines are based on experience of teaching several university courses and industrial seminars in the last three years. Specifically:

    University Courses. This book can be used in the information systems concentration in business schools and industrial engineering departments at most universities. The courses, usually graduate level, have been attended by students from management, computer science and industrial engineering departments.

    Professional Seminars and Corporate Training. This book has been used as a foundation for a two-day professional seminar under the title “Building Web-Based Applications. ”


    University Course Outline: Distributed Application Systems
    Week: 1 Topic: Introduction Reading: Chapter 1 Week: 2 Topic: IT platforms (Web technologies) Reading: Chapter 2 Week: 3 Topic: Middleware Reading: Chapter 2 Week:4 Topic: OO Concepts Reading: Chapter 2 Week: 5 Topic: A General Methodology Reading: Chapter 3 Week: 6 Topic: Web-based applications Reading: Chapter 4 Week: 7 Topic: Enterprise Data Architectures Reading: Chapter 5 Week: 8 Topic: Midterm Examination (or Project 1 Due) Week: 9 Topic: Application Software Architectures Reading: Chapter 6 Week: 10 Topic: Implementation Examples and Concepts Reading: Chapter 7 Week: 11 Topic:Legacy applications: The challenge Reading: Chapter 8 Week: 12 Topic: Access and Integration through the Web Reading: Chapter 9 Week: 13 Topic: Data Warehouses Reading: Chapter 10 Week: 14 Topic: Migration Strategies Reading: Chapter 11 Week: 15 Topic: Final Examination (or Project 2 Due) Professional Training Course: Building Web-Based Applications Session: 1 Topic: Introduction Duration: 1.0 Hour Reading: Chapter 1 Session: 2 Topic: IT Building Blocks: The Middleware Duration: 2.0 Hours Reading: Chapter 2 Session: 3 Topic: Web and distributed objects Duration: 1.5 Hours Reading: Chapter 2 Session: 4 Topic: A General Methodology Duration: 1.0 Hour Reading: Chapter 3 Session: 5 Topic: Web-based applications Duration: 1.5 Hours Reading: Chapter 4 Session: 6 Topic: Data and Application Architectures Duration: 1.5 Hours Reading: Chapters 5, 6 Session: 7 Topic: Implementation Examples and Concepts Duration: 1.0 Hour Reading: Chapter 7 Session: 8 Topic: Legacy applications: The challenge Duration: 1.0 Hour Reading: Chapter 8 Session: 9 Topic: Access and Integration through the Web Duration: 1.0 Hour Reading: Chapter 9 Session: 10 Topic: Data Warehouses Duration: 0.5 Hour Reading: Chapter 10 Session: 11 Topic: Migration Strategies and wrapup Duration: 1.0 Hour Reading: Chapter 11 Acknowledgments

    Many of my colleagues and friends at Bellcore graciously agreed to review specific chapters for content and/or style. Here is an alphabetical list of the reviewers who commented on at least one chapter (some reviewed 4 to 5): Dr. Aloysius Cornelio, Prasad Ganti, Bret Gorsline, Dr. Jon Kettering, Tom Knoble, Frank Marchese, Dr. Paul Matthews, Mike Meiner, KJ Shah, and Dr. Gomer Thomas. I really feel fortunate to have access to so many experts who are also very nice folks.

    In addition, many of my university friends read early drafts and made numerous suggestions. Professor Nabil Adams of Rutgers Graduate School of Business, Professor Ahmed Elmagarmid of Purdue University, Professor Peter Jurkat of the Stevens Institute of Technology, and Professor Jerry Luftman of Stevens Institute of Technology gave valuable suggestions about different topics.

    I should not forget the contribution of many university students at Stevens Institute of Technology, Rutgers, and Fordham who “suffered ” through very rough drafts of many chapters. In addition, many attendees of professional-training seminars volunteered to review different chapters. The list of topics included in this book is based on extensive discussions with the university students and seminar attendees.

    I want to express my gratitude toward my management (Dr. Satish Thatte, Rich Jacowleff, and Jac Simensen) for their understanding and support.

    Conventions Used

    We will use the following conventions in this book. Highlighted italics are used to indicate definition of new terms, italics are used for emphasis and bold letters are used for subject headings.

    Interrelationships Between Books and Personal Remarks
    Several people, especially faculty members from different universities, in the past few months have asked me how this book relates with my first book Distributed Computing and Client/Server Systems (Prentice Hall, 1993) and how/why did I decide to write two companion books instead of one large one. The following discussion, somewhat anecdotal, should help.

    My first book covered a broad range of issues in distributed computing (networks, middle- ware, applications, and management issues). Due to the size (it exceeded 700 pages), I eliminated about 100 pages of application related topics from that book. During 1993 and 1994, I became involved in numerous application engineering/reengineering and IT infrastructure projects and wrote a few tutorials, as part of my practice, on emerging topics such as data warehouses, application architectures, distributed objects, and legacy data access. During a 1994 year-end conversation with my friend Paul Becker, a senior editor at Prentice Hall, we both concluded that the world could most certainly use another book by me that concentrated on the distributed application issues (the first book had only one chapter on this topic).

    I started developing the manuscript at the end of 1994 but soon found that I needed to explain many of the IT infrastructure components, especially the perplexing middleware, before delving into the applications issues. So I did. The end result was that the new book was huge (more than 800 pages with roughly half on middleware and the other half on applications). After several conversations with Paul Becker, we both decided to break the material into two companion books: one on middleware and the other on application (re)engineering. This seemed to be a good idea because distributed computing is a vast and rapidly evolving field and it is difficult to discuss everything in one book. The following table attempts to show the interrelationships between my three books in terms of the following building blocks of distributed computing:

    lNetworks to provide the transport services in distributed computing environments lMiddleware to enable the distributed applications lApplications to provide business value lManagement and support issues to deal with administrative aspects of distributed computing Topics Discussed in Books on Distributed Computing
  • Topics “Distributed Computing and Client/ Server Systems ” (1993) “Object-Oriented Client/Server Internet Environments ” (1997) “Application (Re)Engineering: Building Web-based Applications and Dealing with Legacies ” (1997)
  • Networks Extensive coverage (6 chapters) Light coverage (1 chapter) No coverage Middleware Moderate coverage (3 chapters) Extensive coverage (9 chapters) Light coverage (1 chapter)
  • Applications Light coverage (1 chapter) No coverage Extensive coverage (10 chapters) Management and Support Moderate coverage (2 chapters) No coverage No coverage I received a great deal of help during this process from several people at Prentice Hall. Of particular note are Eileen Clark as the production editor of both books, Maureen Diana as an administrative assistant and fire fighter, and Paul Becker as an overall “spiritual leader. ” Of course, my best friend and my wife, Dolorese, valiantly saw me through this undertaking. She has, as always, shown exceptional patience and tolerance for which I am greatly indebted to her. She continues to advise me and helps me in editing and preparing the material. It is a good example of teamwork.

Updates

Submit Errata

More Information

Unlimited one-month access with your purchase
Free Safari Membership