Я сказал моему брату Тоду, который перешел от аппаратного обеспечения к программированию, что следующая большая революция будет в генетической инженерии.
У нас будут микробы, предназначенные для приготовления пищи, горючего, пластмассы;
они будут очищать загрязнения и вообще позволят нам управлять всеми манипуляциями
в физическом мире, а их стоимость будет гораздо меньше,
чем сейчас. Я утверждаю, что это заставит выглядеть революцию компьютерной техники
не столь значительной в сравнении с этим.
Тогда, наверное, я сделал ошибку общую для всех писателей-фантастов: заблудился в технологии (которую очень просто использовать в фантастическом рассказе). Опытный писатель знает, что истории никогда не пишутся о вещах - они пишутся о людях. Генетика окажет очень сильное воздействие на нашу жизнь, и я не уверен, что это помешает развитию компьютерной техники (которое повлечет революцию в генетике), или, по крайней мере, информационному развитию. Информация - это общение друг с другом: да, машины, обувь и особенно генетические препараты важны, но, в конце концов - это все атрибуты. Что действительно имеет значение, это как мы относимся к миру, а также общение.
Эта книга - актуальна. Большинство людей думали, что либо я слишком самоуверенный, либо слегка сумасшедший чтобы опубликовать такое в интернете. "Зачем кто-то будет покупать это" - спросили они? Если бы я был более консервативным, я бы ее не закончил, однако, я действительно не хотел ее писать по-другому. Я не знал что случится, однако это стало самой умной вещью, которую я когда-либо делал с книгой.
Вначале люди начали представлять исправления. Это был удивительный процесс, потому что люди заглядывали во все уголки и щелочки, собирали все грамматические и технические ошибки и у меня была возможность устранить ошибки всех сортов, которые иначе, я знаю, были бы пропущены. Люди немного пугали меня, очень часто говоря: "Ну, я не думаю, что это опасно...." - и затем выдавая мне коллекцию ошибок, которые, я уверен, никогда бы не нашел. Мне хотелось бы, чтобы это был совместный процесс, и это, в действительности, сделало книгу особенной.
Но затем я стал слышать: "О`Кей, отлично, как здорово, что вы опубликовали электронную версию, но мне хотелось бы получить напечатанную и в переплете копию книги от настоящего издателя". Я трудился очень усердно, чтобы упростить для всех распечатку книги в виде, приятном для чтения, однако необходимость в издании книги все же осталась. Большинство людей не хотят читать полностью всю книгу на экране, и копание в стопках бумаги, неважно насколько хорошо и красиво отпечатанной, не привлекает их вовсе. (К тому же, я думаю, что это не так уж дешево, учитывая стоимость тонера для лазерных принтеров). Наверное, развитие компьютеров не выбросит издателей за пределы бизнеса полностью. Но, тем не менее, один студент предположил, что это вполне может стать шаблоном для будущих публикаций: вначале книги публикуются в интернете, и как только к ним проявится достаточный интерес, они будут переложены на бумагу. Сейчас большинство книг - это финансовые неудачи, и, может быть, этот новый способ сделает издание книг более выгодным.
Эта книга стала поучительным опытом для меня. Я первоначально изучал Java, просто как еще один язык программирования, который во многом таким кажется. Но прошло время, я изучил Java глубже, и начал видеть, что основная идея этого языка отличается от всех остальных языков, которые я встречал.
Программирование - это управление сложностью: сложность проблемы, которую Вы хотите решить, накладывается на сложность машины, на которой она будет решена. Из-за этого большинство наших программных проектов терпят неудачу. И все же, из всех языков программирования, с которыми я знаком, ни один из них не стал полным и не решил что его основная цель должна быть - преодоление сложности разработки и поддержка программ. Конечно, многие языки разрабатывались с упором на сложность, но в то же время были некоторые другие проблемы, которые были достаточно важными для включения в язык. Неизбежно, эти другие проблемы были тем, что заставляло программистов “биться головой об стену” при использовании этих языков. Например, C++ должен быть обратно совместим с C (чтобы обеспечить простой переход для программистов C), а также эффективным. Это весьма полезные цели, и, в основном, их достижением объясняется успех C++, однако они еще увеличивают сложность программных проектов (конечно, вы можете осудить программистов и руководителей проекта, но если язык программирования помогает найти ошибки, почему бы этим не воспользоваться?). Другой пример, Visual Basic (VB) создан на основе BASIC'a, который не был спроектирован как расширяемый язык, так что все расширения в VB имеют совершенно ужастный и некрасивый синтаксис. Перл обратно совместим с Awk, Sed, Grep и другими инструментами Unix, и как результат получается код (который через несколько месяцев Вы не сможете прочитать). С другой стороны, C++, VB, Perl и другие языки наподобие Smalltalk'а проектируются и прекрасно подходят для решения конкретных типов проблем.
В Java меня сильно поразила неотступная цель - снижение сложности для программиста. As if to say: нас не заботит ничто, кроме снижения времени и сложности создания устойчивого кода. Раньше результатом этой цели являлся код, который работал не очень быстро (хотя насчет Java тоже было много обещаний - как быстро она будет работать), но это несомненно привело к сокращению времени разработки - половину или даже меньше времени создания эквивалента программы на C++. Одно это может сохранить много времени и денег, но Java на этом не останавливается. Он охватывает сложные задачи, такие как многопоточность и сетевое программирование, реализованные в библиотеках или дополнениях, которые, зачастую, делают эти задачи тривиальными. И, наконец, в нем решены действительно большие и сложные проблемы: межплатформенные программы, динамический код и безопасность, каждая из которых может внести в Ваш спектр сложности все, что угодно, начиная от препятствия до полной остановки. Так что, несмотря на проблемы с производительностью мы видим, что перспективы Java просто потрясающи: он может сделать нас намного более продуктивными программистами.
Одна из областей, где, по-моему, будет сильное развитие Java, это Web. Сетевое программирование всегда было тяжелым, а Java его упрощает (и создатель Java работают над тем, чтобы сделать его еще проще). Сетевое программирование - это способ общения друг с другом эффективней и дешевле, чем по телефону (только электронная почта привела к революции в бизнесе). Когда мы начинаем общаемся, начинают происходить поразительные вещи, возможно даже более поразительные, чем перспективы генной инженерии.
При любом способе создания программ: работа в команде над программой, создание
пользовательского интерфейса, запуск программ на различном аппаратном обеспечении,
и просто написание программы, которая общается через Internet - Java увеличивает
ширину канала коммуникации между людьми. Может быть, революция в коммуникациях
не будет заметна на фоне перемещения больших объемом битов туда и обратно, но
мы увидим настоящую революцию, потому, что мы сможем общаться друг с другом
намного проще: один к одному, в группе и даже всей планетой. Я слышал, что следующая
ступенька развития - это создание глобального разума, состоящий из достаточного
количества людей и связей. Java может быть, а может и не быть инструментом,
который приведет к такой революции, но, по крайней мере, его возможности заставляют
меня чувствовать, что я делаю что-то значительное, пытаясь учить этому языку.
Люди сделали очень много удивительных комментариев на первую редакцию этой книги, которые действительно были очень приятны мне. Однако, время от времени у кого-то появляются жалобы. Одна из них, появляющаяся периодически, это то, что книга слишком большая. По-моему, это незначительная критика - если слишком много страниц - Ваша единственная жалоба. (Это напоминает недовольство императора Австрии работой Моцарта: "Слишком много нот!" Но этим я не сравниваю себя с Моцартом.) В дополнение, могу предположить, что такого рода жалобы идут от тех, кто еще должен познакомиться с просторами Java, и не видел остальные книги по этой теме, например, моя любимая ссылка на книгу Cay Horstmann & Gary Cornell’s Core Java (Prentice-Hall), которая растет так быстро, что уже была разбита на два тома. Несмотря на это, одна вещь, которую я пытаюсь сделать в этой редакци книги, это удаление частей, которые уже устарели, либо являются несущественными. Думаю это правильно, потому что оригинальные материалы остаются на Web сайте и на компакт-диске, который идет с этой книгой, в форме бесплатно-загружаемой первой редакции книги (на www.BruceEckel.com). Если Вам нужен старый материал, он тоже находится там, и это большое утешение для автора. К примеру, Вы можете заметить, что последняя глава из оригинала под названием "Проекты" больше здесь не присутствует, две части из которой были перенесены в другие главы, а оставшееся устарело. Также, глава “Design Pattens” слишком разрослась и стала отдельной книгой (ее также можно загрузить с Web сайта). Так что, в результате, книга должна быть тоньше.
Но, увы, такого не должно быть.
Преимущество Java в том что он продолжает дорабатываться, в частности, расширяются
API, которые позволят предоставить интерфейс всего, чем бы Вы не занимались
(и я не удивлюсь, если вдруг в API случайно появится класс JToaster). Описание
всех этих API, очевидно, выходит за рамки этой книги, это задача для других
авторов, однако некоторые реализации не могут быть проигнорированы. Самая
большая из их включает server-side Java (в основном сервлеты и Java Server
pages - JSP), которая действительно является превосходным решением проблем
World Wide Web, где, как мы знаем, различные платформы для Web браузеров не
очень подходят для программирования клиентской части. К тому же, существует
раздел - создание приложений без труда работающих с базами данных, транзакциями,
безопасностью и т.п., включенные в Enterprise Java Beans (EJBs). Этот раздел
включен в главу, имеющую раньше название "Сетевое программирование",
а теперь "Распределенные вычисления", - тема, которая становится
необходимой для всех. Вы также увидите, что эта глава расширилась и теперь
включает обзор Jini (произносится "genie", причем это не акроним,
а просто имя), технологию, которая может изменить наше представление о сетевых
приложениях. И, конечно, в книге произошли изменения
в описании библиотеки Swing GUI. Итак, если Вы хотите получить материалы по
старым версиям Java 1.0/1.1 - Вы можете загрузить их бесплатно с www.BruceEckel.com
(там также есть CD ROM, включенный в новую редакцию).
Отдельно от дополнительных возможностей языка, добавленных в Java 2, и корректировок сделанных во всей книге, еще большие изменения произошли в главе с описанием коллекций, которая сейчас сосредоточена на коллекциях Java 2, используемых на протяжении всей книги. Я также улучшил эту главу, более глубоко описав наследников коллекций, например, как работают хэш-функции (так что Вы будете знать, как корректно создавать их). Еще было множество изменений и перемещений глав, включая переработку Главы 1, удаление некоторых приложений, а также, материала, который я больше не считал нужным включать в электронную версию книги, к тому же имеющего большие размеры. В основном я попытался просмотреть все, удаляя то, что не нужно (но это осталось в электронной копии первой редакции книги), включая все изменения и дополнения, которые у меня были. Поскольку язык продолжает изменяться, хотя и не так быстро как раньше, нет сомнений, что появятся последующие редакции этой книги.
Для тех кто еще не может терпеть размеров этой книги, приношу свои извинения. Верьте или нет, я старался сделать его меньше. Несмотря на размеры, по-моему, есть некоторые альтернативы, которые рассеют Ваше недовольство. Первое - книга в электронном виде, т.е. если Вы носите портативный компьютер - Вы носите книгу - никакой дополнительной массы. Если Вы худеете, существует версии книги для Palm Pilot'а (карманный компьютер). (Один человек рассказывал мне как он читал эту книгу в постели на своем Palm'е с подсветкой, чтобы не разражать свою жену. Я только могу надеяться, что это способствовало хорошему сну.) Если Вам нужна бумажная копия, я знаю людей, которые печатали одну главу за раз и носили ее в своем портфеле, читая ее в транспорте.
При написании этой книги, реализация Java Development Kit (JDK) 1.3 была самой последней. Для версии JDK 1.4 были опубликованы изменения. Хотя эти номера версий все с единичками, это стандартный способ именовать новые версии JDK 1.2 и выше и называть их все Java 2. Т.е. старый Java (до версии 1.1), имеющий множество неудобств, о которых я рассказывал в первой редакции этой книги, претерпел значительные изменения и теперь существует более современная и улучшенная версия, имеющая много дополнений и отличный дизайн.
Эта книга написана для Java 2. Я получил море удовольствия, освобождаясь от старого, описывая только новый усовершенствованный язык, хотя старая информация еще хранится в электронной копии 1-й редакции на Web и на CD ROM (к которым Вы можете обратиться, если, вдруг, захотите использовать старые версии языка). Учитывая также, что Вы можете бесплатно загрузить последний JDK с java.sun.com, я не обрекаю никого на финансовые лишения, навязывая переход на новую версию.
Есть еще кое-что. JDK 1.3 имеет некоторые усовершенствования, которые я часто использую, однако версия Java, реализация которой существует для Linux это JDK 1.2.2. Linux это очень важная разработка в соединении с Java, т.к. она почти сразу стала серверной платформой - быстрой, надежной, устойчивой, защищенной, с хорошей поддержкой и еще бесплатной - настоящая революция в истории компьютеров. (Я думаю, мы до этого не встречали инструмента с такими возможностями). И Java занимает очень важное место в программировании серверной части в форме сервлетов, а технология является более совершенной в сравнении с традиционным программированием CGI (это подробно описывается в главе "Распределенное программирование").
Итак, хоть мне и хотелось описывать только новое и последнее, необходимо, чтобы все это работало под Linux, так что когда Вы распакуете исходные коды и откомпилируете их под этой OS (с самым последним JDK), Вы увидите, что все работает. Несмотря на это, я добавил описание особенностей JDK 1.3.
Еще одно дополнение к первой редакции - это CD ROM, на внутренней стороне обложки книги. Я сопротивлялся включению CD ROM в книгу, потому, что чувствовал неоправданными дополнительные расходы за несколько килобайт исходных кодов на этом ужасном CD, предпочитая, чтобы читатели загружали это с моего Web сайта. Как бы то ни было, Вы увидите, что содержание CD ROM'а изменилось.
CD сейчас содержит исходные коды из книги, а также содержит всю книгу, в различных электронных форматах. Мой любимый из них - HTML, потому, что он быстрый и полностью индексированный - Вы просто щелкаете на любом разделе в содержании и сразу оказываетесь в нужном месте книги.
Более 300 Мб на CD - полный мультимедиа-курс названный Thinking in C: Foundations for C++ & Java. Я первоначально поручил Чаку Алисону (Chuck Allison) создать этот семинар на CD ROM как отдельный продукт, но решил дополнить их вторыми редакциями Thinking in C++ and Thinking in Java, из опыта встреч с людьми на семинарах без достаточного знания языка C. Стандартное мышление: "Я - способный программист и я не хочу изучать C, а только C++ и Java, так что я пропущу C и перейду к C++/Java. После прибытия на семинар, эти люди начинают понимать, что понимание синтаксиса языка C необходимо. Итак, включая этот CD ROM в книгу, мы можем гарантировать, что все посещают семинар с достаточной подготовкой.
CD также может привлечь более широкую публику. Хотя Глава 3 (Управление течением программы) раскрывает основы частей Java, взятых из C, этот CD является более простым введением и рассказывает даже меньше о студенческом программировании, чем это делает книга. Я надеюсь, что с помощью этого диска больше людей будет входить в мир программирования Java.
[1] Я вернулся к
этому во 2-й редакции: Я верю, что язык Python приблизится к тому, чтобы сделать
это точнее. Смотрите www.Python.org.