[Перевод] JAVA преступно недооценена

Точка зрения невежественного студента информатики
image

Вероятно, вы прочитали заголовок этого поста и подумали: «Что этот парень курит? 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. Когда разработчику нужно меньше беспокоиться о технических деталях, он может больше сосредоточиться на текущей проблеме.

Святой Грааль продуктивности


Сколько языков вы можете вспомнить, которые удовлетворяют следующим условиям?
  1. Качественный менеджер пакетов и система сборки (Maven)
  2. Номинальный набор
  3. Большое сообщество
  4. Автоматическая оптимизация

Я думаю, что единственным подходящим инструментом является Java, но дайте мне знать, если есть другие!

edit: Как отметил Jwosty, конкурент Java — Microsoft C# имеет все эти характеристики и больше/новые языковые функции. Я никогда не использовал C# вне игрового движка Unity, но я собираюсь изучить его.

Удивительное отсутствие в университетской программе


В настоящее время я учусь в Университете Колорадо в Боулдере; это отличная школа, но она точно не известна за CS. Однако большая часть наших учебных программ по информатике для старших классов беззастенчиво украдена из CMU или Стэнфорда. За время учебы в CU я использовал следующие языки программирования:
  1. C++. Этот язык был выбран для всех необходимых основных курсов: компьютерные системы, операционные системы, структуры данных и т. д. Этот язык является разумным выбором, поскольку он обеспечивает прямое управление памятью, создание модулей ядра и представляет множество проблем и возможностей для обучения.
  2. Python и Julia. Как и следовало ожидать, эти языки были любимцами профессоров численных вычислений и дискретной математики.
  3. Scala. Этот язык использовался в Principles of Programming Languages, в первую очередь для его функционального программирования и функций сопоставления шаблонов. Хотя Scala использует JVM и взаимодействует с Java, у него совсем другой опыт разработки, чем у Java.
  4. Веб-языки (HTML/CSS/JS). Они использовались только в одном курсе под названием «Методы и инструменты разработки программного обеспечения», посвященном отраслевым тенденциям.

Я заканчиваю этот семестр, а Java не появлялась ни разу; Я считаю это позором.

Заключение


Единого истинного способа создания приложений не существует, но я думаю, что Java не получает должного внимания, особенно среди стартапов и сообщества новичков в программировании. Нетипизированные языки — полезные инструменты, но я не думаю, что они должны быть выбором по умолчанию для создания больших приложений. Если вы полнофункциональный разработчик и никогда широко не использовали Java, я думаю, вы будете приятно удивлены, если попробуете его в своем следующем проекте.

Java и JVM были раскручены до небес в 90-х и начале 2000-х, но я не думаю, что они когда-либо должны были исчезнуть! Опыт разработки, который я получил с IntelliJ и Java, заслуживает восхищения.

Мне любопытно, почему Java вообще потеряла ажиотаж. История культуры программистов плохо документирована, и если у вас есть понимание, напишите мне или оставьте комментарий (на reddit/Hacker News).

© Habrahabr.ru