Книги: [Классика] [Базы данных] [Internet/WWW] [Сети] [Программирование] [UNIX] [Windows] [Безопасность] [Графика] [Software Engineering] [ERP-системы] [Hardware]
Предисловие
Я намекнул своему брату Тодду, переходящему из производства компьютеров в программирование, что следующая большая революция произойдет в генетике.
У нас будут микроорганизмы, созданные для производства пищи, горючего и пластмассы; они очистят окружающую среду от загрязнения и позволят нам управлять миром гораздо меньшими усилиями, чем сейчас. Я утверждал, что компьютерная революция будет выглядеть совсем скромно по сравнению с этим.
Затем я осознал, что совершил ошибку, свойственную писателям-фантастам: потерялся в дебрях технологии (что легко происходит в научной фантастике). Опытный писатель знает, что повести не бывают про вещи - они всегда про людей. Генетика окажет очень большое влияние на нашу жизнь, но не остановит развитие компьютерного мира (который помог развиться генетике) - по крайней мере, не остановит информационной революции. Что действительно важно, так это наше отношение к окружающему миру. А большую часть его составляют средства общения и коммуникации.
Эта книга является хорошим примером. Большинство людей думало, что с моей стороны было самоуверенно или немного безрассудно полностью опубликовать ее в сети Web. "Кто же ее тогда купит?" - спрашивали они. Если бы я был более консервативным человеком, я вряд ли решился бы на это, но мне на самом деле не хотелось писать книгу по-старому. Я не знал, что произойдет, но вышло так, что это оказалось самым умным, что я когда-либо делал с книгой.
Во-первых, люди начали присылать поправки. Это было действительно здорово, потому что они заглядывали в самые укромные уголки и щели книги, находя как технические, так и грамматические ошибки, так что я смог их исправить, а иначе они бы там и остались. Люди делали это просто потрясающе, часто говоря: "Знаете, это совсем не страшно..." - и присылая мне целую коллекцию ошибок, которые я сам бы в жизни не обнаружил. Ощущение от этого было, как от коллективного труда, и все это сделало книгу чем-то особенным.
Затем я начал слышать предложения, подобные таким: "Да, чудесно, что вы выложили электронную версию, но я бы купил напечатанную и переплетенную книгу от настоящего издателя". Я очень старался сделать книгу доступной для распечатки в хорошем формате, однако это не снизило спрос на печатную версию. Большинство людей не хотят читать всю книгу на экране монитора, и копаться в ворохе бумаг, неважно, как хорошо напечатанных, их тоже не прельщало. (И потом, это не так дешево, в смысле цены печатающего картриджа.) Судя по всему, компьютерная революция все же не оставила издателей без работы. Между прочим, один студент предположил, что такой подход может стать стандартным: сначала книгу публикуют в Web, а затем, При проявлении определенного интереса, ее можно печатать на бумаге. Сейчас большинство печатаемых книг неудачны в плане продаж, так что этот подход может сделать издательский бизнес прибыльней.
Эта книга пролила для меня свет и на кое-что еще. Сначала я полагал, что Java всего лишь "еще один язык программирования", чем Java во многом и является. Но с тех пор, как прошло некоторое время и я изучил его лучше, я начал понимать, что основной замысел этого языка отличается от всех других известных мне.
Программирование состоит в управлении сложностями, а именно, в управлении сложностью задачи, которую вы хотите решить, наложенной на сложность системы, в которой она решается. Именно эти трудности становятся причиной большинства неудавшихся программ. И до сих пор ни один из языков, которые я знаю, не был смоделирован и создан в расчете на преодоление сложности разработки и поддержки программ. Конечно, многие решения при создании языков были сделаны в расчете на устранение сложностей, но при этом всегда находилось что-то, считающееся более важным при планировании языка. Все это неизбежно приводило программистов к проблемам использования этого языка. Например, C++ был создан в расчете на продуктивность и совместимость с С (чтобы легко переходить с этого языка на C++). Оба решения, несомненно, полезны и стали одной из причин успеха C++, но также привели к дополнительным трудностям, что не позволило успешно воплотить в жизнь некоторые проекты. (Конечно, можно винить программистов и управление проектом, но если язык может помочь в устранении ошибок, почему не воспользоваться этим?) Как другой пример подойдет Visual Basic (VB), привязанный к BASIC'y, который изначально не был предназначен для расширения, так что все расширения языка, созданные для VB, производят весьма запутанный и сложно поддерживаемый синтаксис. Perl был создан на основе Awk, Sed, Grep и других средств Unix, которые он должен был заменить, и в результате его работы часто получается, что "программу можно только написать" (то есть через несколько месяцев понять вы ее не сможете). С другой стороны, C++, VB, Perl и другие языки, подобные Smalltalk, были частично созданы в расчете на решение трудностей и, как результат, стали успешными в решении определенных типов задач. '
Больше всего удивило меня при ознакомлении с Java то, что при его создании, похоже, решили сосредоточиться на уменьшении трудностей для программиста. Все равно, что сказать: "Мы не заботимся ни о чем, кроме уменьшения времени и трудности создания надёжной программы". Раньше такое намерение привело бы к созданию не очень быстрых программ (несмотря на постоянные обещания того, как быстро будет работать Java со временем), но оно действительно произвело изумительное сокращение времени разработки программ - до половины и меньше от времени, требуемого для разработки эквивалентной программы на C++. Уже одно это сэкономило бы колоссальные деньги и много времени, но Java на этом не останавливается. Он делает больше, встраивая все сложные задачи, ставшие важными в последнее время, такие как многозадачность и сетевое программирование, в язык или его библиотеки, что быстро делает эти задачи легко решаемыми. И, наконец, он энергично берется за действительно сложные проблемы: платформенно-переносимые программы, динамическое изменение кода и даже безопасность. Каждая из этих проблем может быть просто задержкой для вашей программы, а может легко стать непреодолимым препятствием. Так что, несмотря на известные проблемы производительности, перспективы Java потрясают: он может сделать нас гораздо более продуктивными.
Одно из самых больших влияний это производит на сеть Web. Сетевое программирование всегда давалось тяжело, a Java делает его простым (и дизайнеры Java работают над дальнейшим упрощением). Сетевое программирование - это возможность говорить друг с другом гораздо эффективней и дешевле, чем когда-либо с помощью телефонов (одна лишь электронная почта революционизировала многие дела). А когда мы говорим друг с другом больше, происходят удивительные вещи, пожалуй, затмевающие обещания генетики.
Во всех случаях - при создании программ, работе в командах для создания программ, формировании пользовательских интерфейсов для общения программы с пользователем, запуске программ на компьютерах разных типов, простом написании программ, использующих Интернет, - Java увеличивает скорость общения для людей. Я полагаю, что, возможно, перемещение больших пакетов с битами не есть главный результат информационной революции; мы увидим настоящую революцию, когда сможем легко говорить друг с другом: один на один, в группах и, наконец, как одна планета. Я слышал предположение, что следующей революцией будет формирование единого разума, созданного из многих людей при достижении достаточной взаимосвязи. Java может быть катализатором этой революции, а может и не быть, но по крайней мере возможность этого заставляет меня чувствовать, что я делаю что-то значимое, пытаясь обучать этому языку.
ПРЕДИСЛОВИЕ КО ВТОРОМУ ИЗДАНИЮ
Люди сделали очень много прекрасных отзывов о первом издании книги, которые были мне очень приятны. Однако всегда были и есть жалобы, и по какой-то причине постоянно существует недовольство по поводу того, что "книга очень велика". По-моему, это не очень строгая критика, если "очень много страниц" - ваше единственное замечание. (Оно напомнило мне замечание Императора Австрии Моцарту о его композиции: "Очень много нот!". Заметьте, что я никоим образом не сравниваю себя с Моцартом.) Вдобавок я могу предположить, что подобные замечания, исходят от людей, не знакомых еще с обширностью самого языка Java и не видевших других книг, посвященных, этому предмету, например, я предпочитаю в качестве справочника книгу Кая Хорстманна и Гари Корнелла Core Java, которая разрослась настолько, что ее пришлось разбить на два тома. Кроме того, во втором издании я попытался убрать из книги устаревшие части или, по крайней мере, те, которые не очень важны. Я легко расстался с ними, потому что этот материал остался в сети Web в виде свободно доступного для загрузки первого издания. Если вам понадобится этот материал, он все еще там, и это замечательно для автора. Например, вы можете заметить, что последней главы "Проекты" из первого издания больше нет; два из проектов теперь интегрированы в другие главы, а остальные уже не соответствуют книге. Глава "Модели разработок" стала очень велика и оформилась в отдельную книгу (также доступную в сети Web). Значит, книга просто обязана была стать поменьше.
Но, увы, этому не суждено было случиться.
Наибольшую вину за это несет продолжающееся развитие самого языка Java, и в особенности расширяющиеся интерфейсы прикладного программирования (API), которые обещают предоставить интерфейсы буквально для всего, что вам захочется сделать (не удивлюсь, если в скором времени появится интерфейс "Тостер"). Описывать все эти интерфейсы не является задачей данной книги, оставим это для других авторов, но некоторые вещи пропустить нельзя. Важнейшие включают применение Java на сервере -в основном сервлеты (servlets) и серверные страницы Java (JSP). Они представляют отличное решение проблемы World Wide Web, где обнаружилось, что платформы различных Web-броузеров недостаточно совместимы друг с другом для поддержки клиентского программирования. Вдобавок существует целая проблема создания приложений, взаимодействующих с базами данных, использующих транзакции, безопасность и другие подобные решения, которая затрагивается технологией Enterprise Java Beans (EJBs). Эти темы объединены в главе, прежде называвшейся "Сетевое программирование", а теперь переименованной в "Распределенное программирование", знание которого теперь необходимо для любого. Вы также обнаружите, что эта глава была расширена, чтобы включить описание технологии Jini (произносится "джини" (genie), что значит "джин", и это не аббревиатура, а название), которая является передовой разработкой, позволяющей изменить наше представление о взаимосвязанных приложениях. И конечно же, книга теперь повсюду использует библиотеку графического интерфейса Swing. Опять-таки, если вам понадобится старая информация о Java 1.0/1.1, вы можете получить ее из первой книги, свободно доступной с www.BruceEckel.com.
Помимо небольших изменений языка, добавленных в Java 2, и исправлений, сделанных в книге, еще одно большое нововведение в книге - глава о коллекциях Java 2, сосредоточенная на этом новшестве языка Java. Я также доработал эту главу, чтобы лучше рассмотреть некоторые важные вопросы о коллекциях, в особенности это касается работы хэш-функций (так, чтобы вы понимали, как правильно их создавать). Были и другие изменения и перемещения, включая заново написанную первую главу, а также устранение некоторых приложении и других материалов, которые я счел более не нужными в напечатанной книге. В основном я старался пересмотреть всю книгу, убрать то, что не нужно во втором издании (но все это осталось в первом), включить все изменения и улучшить все, что только можно. С дальнейшим изменением языка - хотя он меняется уже не с такой головокружительной скоростью, - несомненно, появятся и новые издания книги.
Тем, кто все же не удовлетворен размером книги, я действительно приношу свои извинения. Верите вы или нет, но я очень старался уменьшить ее размер. К тому же я думаю, что существует достаточно альтернатив. Во-первых, книга доступна в электронном формате с Web-сайта, и если у вас есть ноутбук, то вы можете носить книгу с собой без особых нагрузок. Если же и после этого вы теряете в весе, существует версия книги и для мини-компьютера Palm Pilot. (Один человек сказал мне, что будет читать книгу в постели с помощью Palm Pilot, с включенной подсветкой, чтобы не раздражать свою жену. Остается надеяться, что это поможет ему заснуть.) Если вам понадобится книга на бумаге, я знаю людей, печатающих по одной главе и носящих ее с собой, чтобы прочитать в метро.
JAVA 2
Сейчас приближается выпуск комплекта разработки программ Java (Java Development Kit, JDK) компании Sun версии 1.3, и уже были опубликованы предстоящие изменения, последующие в выпуске 1.4. Несмотря на то, что номера этих версий все еще начинаются с единицы, принято называть любую версию языка, старшую или равную 1.2, "Java 2". Таким образом обозначается весьма существенная разница между "старым Java" - который имеет очень много недостатков, на которые я сетовал в первом издании книги, - и более новым и улучшенным языком, имеющим гораздо меньше изъянов и гораздо больше новшеств и хороших замыслов.
Эта книга написана для платформы Java 2. Я получил большое удовольствие, избавляясь от старого языка и используя только новый, улучшенный, потому что вся старая информация сохранилась в электронной версии 1-го издания книги (которую вы и можете использовать, если уж остаетесь верными старым версиям Java). Также, благодаря тому, что любой может бесплатно загрузить JDK с cama.java.sun.com, я не ввергаю никого в финансовый кризис тем, что заставляю обновлять систему до Java 2.
Здесь, однако, есть свои хитрости. JDK 1.3 имеет несколько улучшений, которые я действительно хотел бы использовать, но для ОС Linux текущей версией Java является JDK 1.2.2, и эта система очень важна, потому что быстро становится наиболее важной серверной платформой - быстрой, крепкой, надежной, защищенной, хорошо поддерживаемой и бесплатной, что представляет настоящую революцию в компьютерном мире (я не помню, чтобы видел соединение всех этих характеристик в одном инструменте). К тому же Java удалось занять очень важную нишу в серверном программировании с помощью сервлетов - технологии, дающей значительные преимущества по сравнению с традиционным CGI-программированием (подробнее это обсуждается в главе "Распределенное программирование").
Так что, несмотря на то, что я хотел бы использовать новейшие возможности языка, очень важно, чтобы все компилировалось в системе Linux, то есть если вы распакуете исходный текст программы и скомпилируете его под Linux (используя последний JDK), у вас все должно запуститься. Однако вы увидите, что в книге постоянно встречаются заметки о JDK 1.3.
Начало
Полное содержание
Введение
Структура книги
Компакт-диск
Заказать книгу в магазине "Мистраль"