Поделиться

суббота, 17 июля 2010 г.

Жизненный путь: Java и Java-script

Смысл последующего изложения легче понять, если прочитать преамбулу здесь.

Что касается языка программирования Java и его производных, то тут, надо признать мне похвастаться особо нечем. Я начал изучать его из соображений чистого энтузиазма где-то в 1996 году по книге одного из его создателей Патрика Нотона (эту книгу потом "заныкала" моя сокурсница, утверждая, что не отдаст, пока я не выдам ей подарок на день рождения, на который меня, кстати, не пригласили; подарок так и не получила, так что книжку так и не отдала). В то время Java не была таким монстром, как сегодня - воспринималась как средство для анимации картинок на веб-страницах, создания часиков и прочей мишуры. Этой мишурой был набит до отказа каждый второй сайт (с появлением Dynamic HTML от Microsoft ситуация еще более усугубилась). Только спустя несколько лет стало понятно, насколько мощным может быть этот язык в умелых руках - мне доводилось видеть и работать над огромнейшими и полезнейшими приложениями целиком или большей частью реализованными на Java.

Помню в той самой книге Нотона меня привлекло несколько тезисов относительно Java. На сегодняшний день все это не ново, не уникально или уже показало свою несостоятельность, а вот тогда было и ново, и уникально, и хотелось верить во все это:
  • наличие автоматической сборки мусора;
  • неотделимость объявления класса от его реализации;
  • строгая типизация;
  • отсутствие непосредственной работы с указателями;
  • интерпретация и переносимость;
  • безопасность ПО для клиентского компьютера благодаря "sandbox" или, согласно Нотону, "железному занавесу" (это к вопросу о несостоятельности - первый вирус на Java появился еще в августе 1998);
  • отсутствие goto и так далее.
По поводу последнего из приведенных особенностей, мне каждый раз вспоминается пара предложений, которые у Нотона стояли в книге рядом:

В Java нет оператора goto... Оператор break в Java работает с метками.

Да, у оператора break с метками в Java имеются определенные особенности, ограничивающие его бесконтрольное применение, и все же у меня тогда прочтение приведенного текста вызвало отчетливое: "Хех! Ну вы, блин, даете"! В итоге, отчасти благодаря скептицизму, я не ушел на Java дальше пробы пера, так что наколдовал за всю свою программистскую жизнь лишь 2 791 строку кода на этом языке в трех десятках аплетов, среди которых были:
  • мини-программы для рисования;
  • динамические фильтры для изображений;
  • простейшие прыгающие надписи (с музычкой в формате AU!);
  • те самые электронные часики;
  • примитивная по интеллекту противника и графическому исполнению игра с компьютером в крестики-нолики (истинное мастерство игрока в нее проявляется не в выигрыше, а в способности проиграть или хотя бы свести к ничьей) и т.д.
Что касается пользы Java в ИТ-производстве, то тут вопросов уже нет - время уже все решило. Относительно этого языка в обучении, я думаю, что он вполне может выступать даже первым и основным - на его базе можно научить практически всем аспектам разработки приложений каких угодно типов (привет переносимости и универсальности), только нужно понимать, что программист, который получится в итоге, будет не тем же самым, который был обучен на базе "Паскаль + Ассемблер + Си + C++". Почему? Потому что примеры, на которых будет обучаться Java-программист, за пределами круга базовых, будут и должны быть, наверное, иными, концепции и парадигмы опять-таки за пределами базовых и их реализация однозначно будут иными (ну, самый простой пример - в Java отсутствует множественное наследование реализаций), книги и их авторы будут иными (со своим видением, так сказать). Java, вообще, стала одним из первых и первым мега-популярным языком, который ставил своей целью не только и не столько эффективность исполнения кода, но и удобство, простоту и заботу о программисте при одновременном наличии широчайших возможностей, а это - совершенно иной мир и иная доктрина.

Спору нет - хороший программист может изучить и второй, и пятый, и десятый язык, но программисты на всех языках, изученных ими после первого, пишут также как на этом первом, но в другом синтаксисе. Страуструп высказал это очень четко (правда, по поводу C++):

C++ поддерживает множество стилей программирования. Все они основаны на строгой проверке типов, и целью большей их части является достижение высокого уровня абстракции данных и непосредственного отображения идей программиста. Каждый стиль может эффективно достичь этих целей, в то же время обеспечивая эффективность выполнения и использования ресурсов. Программисты, приходящие из различных языковых сред (например, C, Fortran, Lisp, ML, Ada, Eiffel, Pascal или Modula-2), должны понять: для того чтобы воспользоваться преимуществами C++, необходимо потратить время на изучение и применение стилей программирования, приемлемых для C++. Тоже самое касается программистов, пользовавшихся более ранней и менее выразительной версией C++.

Бездумное применение в новом языке методов, эффективных в другом языке, обычно ведет к неуклюжему, медленному и сложному в сопровождении коду. Такой код к тому же еще и неприятно писать, потому что каждая строка кода и каждое сообщение компилятора об ошибке напоминает программисту, что используемый язык отличается от "старого языка". Вы можете писать в стиле Fortran, C, Smalltalk и т.п. на любом языке, но это и неприятно и неэкономично в языке с другой философией. Любой язык может послужить щедрым источником идей о том, как писать программы на C++. Однако для того, чтобы быть эффективным в новом контексте, эти идеи нужно трансформировать в нечто другое, более соответствующее общей структуре и системе типов C++. Над базовой системой типов возможны только пирровы победы. (Б.Страуструп "Язык программирования C++", 3-е изд. - СПб.: М.: "Невский диалект" - "Издательство БИНОМ"), 1999 г.)

Первый язык откладывает значимый отпечаток (это нужно помнить и при обучении программистов на четверке языков, указанных ранее, но там можно обойти этот минус, если на Паскаль и Ассемблер не давать слишком уж много времени). Иными словами, всегда нужно понимать, кого вы воспитываете.

2 комментария:

  1. научить программированию на конкретном языке несложно. гораздо сложнее подготовить такого программиста, который:
    - решает ту задачу, которую поставят, а не пытается заменить ее одной из тех, которые решать умеет;
    - решает так, как требуется заказчику, а не так, как умеет. т.е. способен обучаться "на лету" новым концепциям, подходам и т.д.

    ОтветитьУдалить
  2. Дело в том, что ты этого не сделаешь - вся академическая культура противоречит этому (это по первому пункту). Теоретики практиков не слушают, также и наоборот - говорить о том, что ты можешь научить людей решать ту задачу, которую поставят, - это все равно, что слепой учит глухого в цветах разбираться. Для того, чтобы это делать, нужно чтобы каждый, каждый преподаватель одновременно был практиком, а задачи, ставящиеся перед студентами были практическими, а не "лабораторными".

    По второму пункту: это-то как раз и происходит в силу пункта первого. Способность быстро обучаться (самостоятельно или по необходимости) - это как раз то, что отличает хорошего спеца от нехорошего. :)

    ОтветитьУдалить