Java породила разумные идеи и сделала их реальностью для целого поколения программистов
Elliotte Rusty Harold InfoWorld | 21 мая 2015 года
Вспомнить, каким был мир программирования в 1995 году, — задача не из легких. Возьмём, например, объектно-ориентированное программирование, уже общепринятую, но редко тогда применявшуюся парадигму. Большая часть так называемых объектно-ориентированных программ была немногим больше, чем ребрендированный код C, который использовал >> вместо printf и class вместо struct. Программы, которые мы писали в те дни, обычно дампили ядро из-за арифметических ошибок пойнтера или страдали нехваткой памяти из-за ее утечек. Исходный код вряд ли можно было портировать на разные версии Unix. Результат запуска одного бинарного файла на разных процессорах и операционных системах был непредсказуем.
Java все это изменила. Платформенно-зависимый, индивидуально адаптируемый процедурный код C будет оставаться с нами, по крайней мере, в течение следующих 20 лет. Java доказала, что это был вопрос выбора, а не необходимости. Мы впервые начали писать реальный промышленный код на кросс-платформенном, объектно-ориентированном языке со сборкой мусора; и нам, миллионам из нас, это понравилось…. Языки, появившиеся после Java, особенно C#, должны были установить новую, более высокую планку производительности разработчиков, заданную Java.
Джеймс Гослинг, Майк Шеридан, Патрик Нотон и другие программисты из проекта Sun Green не были авторами большинства важных технологий, которые Java ввела в широкое употребление. Большинство ключевых особенностей, которые они включили в то, что тогда было известно как Oak, пришли из других языков:
- Базовый класс Object, от которого происходят все классы: язык Smalltalk.
- Строгая типизация на этапе компиляции: Ada.
- Множественная реализация интерфейсов: Objective-C.
- Встроенная документация: CWeb.
- Кросс-платформенная виртуальная машина и байтовый код с JIT-компиляцией: снова Smalltalk, точнее, его вариация Self от Sun.
- Сборка мусора: Lisp.
- Примитивные типы и управляющие конструкции: C.
- Система двойной диспетчеризации с необъектными типами примитивов для повышения производительности? С++.
Однако именно Java стала пионером-первопроходцем. Ничего подобного проверяемым исключениям не было в других языках ни до, ни после. Java также стала первым языком, использующим unicode во внутреннем представлении строк и в файлах исходного кода. Но основная сила Java заключалась в том, что она была выстроена как практический инструмент для работы. Она популяризировала хорошие идеи из предшествующих языков, переупаковав их в формат, знакомый среднему программисту на C, хотя (в отличие от C++ и Objective-C) Java не была строгим надмножеством C. На самом деле, именно готовность не только добавлять, но и удалять функции сделала Java намного проще и удобнее в освоении других объектно-ориентированных наследников языка Си.
В Java не было, и до сих пор нет structs, unions, typedefs, и заголовочных файлов. Объектно-ориентированный язык, не скованный требованием запуска устаревшего кода, не нуждался в них. Точно так же Java разумно отвергла идеи, опробованные и оказавшиеся несостоятельными в других языках: прежде всего множественное наследование, арифметика указателей и перегрузка операторов. Хороший вкус, проявленный в начале, обеспечил, то, что и 20 лет спустя Java все еще довольно свободна от предупреждений “здесь будут драконы”, которые засоряют руководства по стилю ее предшественников.
Но мир программирования не стоит на месте. С тех пор как мы впервые начали программировать на Java выросли тысячи языков программирования, но большинство из них никогда не достигали более чем крошечной доли коллективного внимания, а затем исчезали. На Java писались апплеты, небольшие программы, работавшие внутри веб-страниц, способные взаимодействовать с пользователем и обладавшие большим функционалом, чем отображение статических текстов, изображений и форм. Сегодня это не особенно впечатляет, но вспомните: в 1995 году еще не было JavaScript и DOM, а новинкой были HTML-формы, обращавшиеся к серверному CGI-скрипту, написанному на Perl.
Ирония заключается в том, что апплеты никогда не работали хорошо. Они были полностью изолированы от содержимого страницы, не могли читать или писать HTML, что в итоге смог JavaScript. Ограничения безопасности не позволяли апплетам взаимодействовать с локальной файловой системой и сторонними сетевыми серверами. Из-за ограничений апплеты подходили для немногим большего, чем простые игры и анимации. И даже применение этих тривиальных возможностей затруднялось низкой производительностью виртуальных машин ранних версий браузеров. К тому времени, как недостатки апплетов были исправлены, браузеры и разработчики интерфейсов уже давно обошли Java. Flash, JavaScript и совсем недавно HTML5 привлекли наше внимание как гораздо более эффективные платформы для доставки динамического веб-контента, которую обещала нам Java, но не смогла реализовать.
Тем не менее апплеты вдохновили нас на работу с Java, и мы нашли в ней чистый язык, сгладивший многие острые углы и болевые точки, с которыми мы боролись при использовании альтернатив, например, C ++. Одна автоматическая сборка мусора оправдывала переход. Апплеты могли быть переоценены или недоделаны, но это не значит, что Java не была чертовски хорошим языком для решения других проблем.
Java была задумана как кроссплатформенная клиентская библиотека, но настоящий успех ждал её в мире серверов. Реальные задачи кодеров и бизнеса решались сервлетами, серверными страницами Java и множеством корпоративных библиотек, которые периодически собирались вместе и переименовывались в одну невнятную аббревиатуру. Если оставить в стороне маркетинговые неудачи, Java почти достигла статуса стандарта в IT-отделах по всему миру. (Вкратце: в чем разница между Java 2 Enterprise Edition и Java Platform Enterprise Edition? Если вы решили, что J2EE является преемником JEE, вы поняли все наоборот.) Некоторые из этих продуктов, ориентированных на предприятия, были громоздки и вдохновили опенсорсные альтернативы и дополнения, такие как Spring, Hibernate и Tomcat, каждое из которых, тем не менее, основывается на платформе от Sun.
Возможно, самый важный вклад открытого исходного кода в Java и в расширение искусства программирования — это JUnit. Разработка через тестирование (TDD) была опробована ранее со Smalltalk. Однако, как и многие другие нововведения этого языка, TDD не получил широкого распространения до тех пор, пока не стал доступен на Java. Когда Кент Бек и Эрих Гамма выпустили JUnit в 2000 году, TDD быстро превратился из эксперимента нескольких программистов в стандартный способ разработки программного обеспечения 21 века. Как сказал Мартин Фаулер: «Никогда еще в области разработки программного обеспечения так много людей не зависело от столь немногих строк кода», и эти несколько строк кода были написаны на Java.
Спустя двадцать лет с момента своего создания Java больше не является выскочкой. Она стала крепким бойцом, против которого восстают другие языки. Высокоуровневые языки, такие как Ruby и Python, глубоко вторглись на территорию Java, особенно в мире стартапов, где скорость разработки важнее, чем надежность и масштабируемость — компромисс, которым сама Java воспользовалась в первые дни, когда из-за низкой производительности виртуальных машин сильно лагал скомпилированный код.
Java, конечно, не стоит на месте. Oracle продолжает внедрять хорошо зарекомендовавшие себя технологии из других языков, такие как обобщения, автоупаковка, перечисления и, совсем недавно, лямбда-выражения. Многие программисты впервые познакомились с этими идеями на Java. Не каждый программист знает Java, но знает он ее или нет, Java оказала влияние на каждого программиста.
Перевод Академии Progwards