[Перевод] JAVA преступно недооценена
Вероятно, вы прочитали заголовок этого поста и подумали: «Что этот парень курит? Java повсюду!» Вы правы, Java по-прежнему доминирует в отрасли и c ее помощью запускаются одни из крупнейших в мире критически важных приложений. Но распространение Java — это не то, о чем я говорю, я говорю о шумихе вокруг нее. Я провожу много времени с неопытными программистами. А что любят делать неопытные программисты? Быть взволнованным и самоуверенным в отношении таких инструментов, как языки программирования. Ни один из студентов CS, с которыми я встречаюсь, не восхищается Java, и я думаю, что так не должно быть.
Молодые/наивные разработчики (включая меня) часто попадают в ловушку фетишизации новых языков и инструментов в ущерб производительности и здравомыслию. До работы в Halp (теперь принадлежащей $TEAM) у меня были почти романтические отношения с серверным TypeScript. Я думал, что экосистема node.js была самой крутой вещью: мне понравилась идея транспилированного кода, отладки в реальном времени, огромной библиотеки пакетов и даже странных и фрагментированных систем сборки. Когда я действительно использовал его в разработке и поговорил с более опытными инженерами, магия быстро исчезла.
У меня была иррациональная привязанность к экосистеме JS, потому что это была горячая новинка; это было шумихой. Реальность не оправдала моих ожиданий. Сегодня я получаю удовольствие от чудесных вещей, которые я ожидал от JavaScript, когда набираюсь опыта в Java. Я чувствую себя обманутым тем, что шумиха не привела меня к Java раньше. Java — это весело писать, она продуктивна и пользуется среди новых разработчиков несправедливой репутацией динозавра.
Эргономика — вот что делает Java отличным языком программирования
Это нельзя недооценивать: на Java просто приятно писать. Во многом это связано с мастерством, которое JetBrains вкладывает в IntelliJ IDEA. Все заполняется автоматически, переход к определению выполняется быстро, использование find работает хорошо, а рефакторинг выполняется легко. Однако в чем действительно проявляется Java, так это в опыте разработчиков со сторонними библиотеками.
Зависимость тяжелых рабочих нагрузок и отраслевые тенденции
Мой опыт ограничен, но я чувствую, что ветер сдвинулся в сторону либерального использования внешних зависимостей. Not Invented Here уже не в моде, в моде — Not Invented There. В частности, разработчики JavaScript с большой вероятностью будут включать сторонние библиотеки даже для таких тривиальных операций, как заполнение числа слева. Я не думаю, что нынешняя привязанность к сторонним зависимостям особенно вредна, но изменения API в восходящем потоке могут нанести ущерб нетипизированным базам кода JS/Python.
При использовании сторонних библиотек в Java вы всегда точно знаете, какие типы нужно передать методу. Самое главное, что неправильное использование функции приведет к появлению красных волнистых линий в вашем редакторе. Учитывая, что широко используются библиотеки, я думаю, что больше людей должны быть в восторге от Java.
Номинальный набор экономит время
У динамической/неявной/слабой/любой типизации есть ряд недостатков. Когда зависимость изменяет метод API, и ваше приложение дает сбой во время выполнения, а не во время сборки, это проблема. Когда разработчик должен вернуться к реализации метода, чтобы выяснить, какие типы передать, это пустая трата времени. Подсказки типов TypeScript и Python немного решают эту проблему, но им не хватает возможности проверять переданные типы во время выполнения без дополнительного кода.
Защита типов — моя наименее любимая функция TypeScript. По сути, это неявная типизация, которую вы должны реализовать сами и верить, что она реализована правильно. На мой взгляд, это худшее из обоих миров. Рассмотрим следующее:
interface Dog {
bark: () => void;
}
/* The developer has to manually implement
a heuristic check for interface adherence!
When they update the interface, they have
to update the type guards too! */
function isDog(pet: object): pet is Dog {
return (pet as Dog).bark !== undefined;
}
const dog: any = {bark: () => console.log('woof')};
if (isDog(dog)) {
// TS now knows that objects within this if statement are always type Dog
// This is because the type guard isDog narrowed down the type to Dog
dog.bark();
}
Есть что-то в объявлении типа AND необходимости написания логики валидации для указанного типа, что меня действительно беспокоит. Приведенный выше код выглядит так, как будто кто-то использовал не тот инструмент.
В отличие от определений TypeScript, системы номинальных типов Java снимают нагрузку с мозга программиста, кристаллизуя определения типов и гарантируя защиту типов по умолчанию.
Снятие ответственности за оптимизацию
Разработчики Java могут с уверенностью доверять JVM, чтобы делать лучшие приложения. Независимо от того, реализуют ли они многопоточное приложение или хранят большой объем данных в куче, они могут быть уверены, что не выстрелят себе в ногу из-за управления памятью или гонок данных. Это преимущество прежде всего по сравнению с C++, который содержит множество ножных ружей.
Это часть эргономического опыта Java. Когда разработчику нужно меньше беспокоиться о технических деталях, он может больше сосредоточиться на текущей проблеме.
Святой Грааль продуктивности
Сколько языков вы можете вспомнить, которые удовлетворяют следующим условиям?
- Качественный менеджер пакетов и система сборки (Maven)
- Номинальный набор
- Большое сообщество
- Автоматическая оптимизация
Я думаю, что единственным подходящим инструментом является Java, но дайте мне знать, если есть другие!
edit: Как отметил Jwosty, конкурент Java — Microsoft C# имеет все эти характеристики и больше/новые языковые функции. Я никогда не использовал C# вне игрового движка Unity, но я собираюсь изучить его.
Удивительное отсутствие в университетской программе
В настоящее время я учусь в Университете Колорадо в Боулдере; это отличная школа, но она точно не известна за CS. Однако большая часть наших учебных программ по информатике для старших классов беззастенчиво украдена из CMU или Стэнфорда. За время учебы в CU я использовал следующие языки программирования:
- C++. Этот язык был выбран для всех необходимых основных курсов: компьютерные системы, операционные системы, структуры данных и т. д. Этот язык является разумным выбором, поскольку он обеспечивает прямое управление памятью, создание модулей ядра и представляет множество проблем и возможностей для обучения.
- Python и Julia. Как и следовало ожидать, эти языки были любимцами профессоров численных вычислений и дискретной математики.
- Scala. Этот язык использовался в Principles of Programming Languages, в первую очередь для его функционального программирования и функций сопоставления шаблонов. Хотя Scala использует JVM и взаимодействует с Java, у него совсем другой опыт разработки, чем у Java.
- Веб-языки (HTML/CSS/JS). Они использовались только в одном курсе под названием «Методы и инструменты разработки программного обеспечения», посвященном отраслевым тенденциям.
Я заканчиваю этот семестр, а Java не появлялась ни разу; Я считаю это позором.
Заключение
Единого истинного способа создания приложений не существует, но я думаю, что Java не получает должного внимания, особенно среди стартапов и сообщества новичков в программировании. Нетипизированные языки — полезные инструменты, но я не думаю, что они должны быть выбором по умолчанию для создания больших приложений. Если вы полнофункциональный разработчик и никогда широко не использовали Java, я думаю, вы будете приятно удивлены, если попробуете его в своем следующем проекте.
Java и JVM были раскручены до небес в 90-х и начале 2000-х, но я не думаю, что они когда-либо должны были исчезнуть! Опыт разработки, который я получил с IntelliJ и Java, заслуживает восхищения.
Мне любопытно, почему Java вообще потеряла ажиотаж. История культуры программистов плохо документирована, и если у вас есть понимание, напишите мне или оставьте комментарий (на reddit/Hacker News).