JavaRush /Java блог /Random UA /Кава-брейк #131. Роль Java у розробці у веб- та мобільних...

Кава-брейк #131. Роль Java у розробці у веб- та мобільних додатків. Функціональне програмування - за і проти

Стаття з групи Random UA

Роль Java у розробці у веб- та мобільних додатків

Джерело: DZone Java - одна з найбільш використовуваних мов програмування. Він активно застосовується у розробці корпоративних, веб- та мобільних додатків. Java має застосування у провідних технічних галузях, від Data Science до AR/VR. Незважаючи на те, що корпоративна розробка на Java є найбільш популярним варіантом використання цієї мови, веб- та мобільні програми також вважаються однією зі сфер застосування Java. Кава-брейк #131.  Роль Java у розробці у веб- та мобільних додатків.  Функціональне програмування - за і проти.Давайте подивимося, чому за останні два десятиліття розробка на Java набула такого поширення в Інтернеті та на мобільних пристроях. Одна з основних причин використання Java для Інтернету та мобільних пристроїв полягає в тому, що це високопродуктивна мова програмування. Він гарантує, що ваші програми зможуть працювати швидко і без будь-яких помилок обробки. Існують також інші причини:

1. Відкритий вихідний код

Будучи мовою програмування з відкритим вихідним кодом, Java має низку переваг. По-перше, він знижує витрати на процес розробки програм. По-друге, розробники легко змінюють мову і часто оновлюють її, оскільки вона має відкритий код. Крім того, Java має простий для читання синтаксис, який спрощує розробку додатків для інтернету та мобільних пристроїв. І нарешті, розробники можуть використовувати наявну кодову базу мови та покращувати її.

2. Кросплатформенність

Ще однією перевагою програмування на Java є те, що це кроссплатформенна мова. Розробники можуть писати код у Windows та запускати його в macOS та Linux. Тут діє принцип "написав один раз, запускай скрізь". Це спрощує роботу для розробників, що працюють на різних системах, та спрощує процес тестування на різних машинах. Наприклад, розробники можуть перевірити, чи програма правильно працюватиме на різних розмірах екрану та операційних системах.

3. Зручність для мобільних пристроїв

Java – популярна технологія для мобільних додатків. Розробники додатків для Android в основному використовують мову Java, тому що його легко реалізувати, він має функції безпеки та кросплатформні можливості. Для Android потрібна потужна мова для масштабування програми, а Java пропонує чудові можливості масштабування. Він також спрощує процес тестування програм для Android. Все це говорить про те, що це надійна та динамічна мова програмування для створення мобільних додатків.

4. Інструменти та бібліотеки

Однією з значних переваг Java є його сумісність із різними інструментами. Такі фреймворки як Spring, Hibernate, Struts, Spark та інші значно спрощують процес розробки. Всі ці інструменти пропонують різні функції для створення інтерактивних та динамічних програм. Такі бібліотеки як Apache Commons, стандартні бібліотеки Java, Maven, Jackson і т. д. дозволяють розробникам додавати функціональні можливості без написання коду з нуля.

5. Активна спільнота

У світі налічується понад 7,6 мільйонів Java-розробників. Вони постійно оновлюють мову програмування та додають до неї нові функції. Оскільки Java оновлюється кожні 6 місяців, розробники мають можливість швидко вчитися і створювати якісніші продукти. Ви також можете використовувати Java-спільноту для пошуку відповідей на різні запитання.

Зростання Java у розробці веб-додатків

З моменту свого створення в 1995 році компанією Sun Microsystems мова Java стала одним із пріоритетів в індустрії програмування. Сьогодні компанії з усього світу використовують цю програмну мову для створення веб-додатків. Google, Netflix, Spotify і Pinterest - ось лише кілька компаній, які використовують мову Java у своєму стеку технологій. Експерти підрахували, що понад 60% компаній, що працюють в IT, у тій чи іншій формі використовують Java. Більш того, він залишається популярною мовою програмування через його впровадження в інші області веб-розробки, а саме у хмарні обчислення, соціальні мережі, корпоративну розробку, AR, VR та багато іншого. Це чудова і потужна мова програмування для використання на підприємствах, яким зараз потрібна хмарна архітектура. У поєднанні з JavaScript Java дозволяє створювати високопродуктивні веб-програми, які можна запускати на будь-якій платформі.

Зростання Java у сучасних сценаріях використання

Крім веб-розробки та мобільної розробки, Java залишив свій слід у сучасному технологічному світі. Сьогодні Java - дуже корисна мова програмування для наукових додатків. Він пропонує безпечне, швидке та портативне середовище для наукових розрахунків. MATLAB - одна з найпопулярніших бібліотек для наукових програм на основі Java.
  • Java також корисний при розробці зовнішнього та внутрішнього інтерфейсу наукових програм. Ви можете використовувати Struts і Java Server Pages для розробки зовнішнього інтерфейсу та ядро ​​Java для внутрішнього інтерфейсу наукових додатків.

  • Java корисний для аналізу даних. Він дозволяє розробникам створювати рішення для аналізу даних, використовуючи різні бібліотеки та інструменти. Сьогодні Java знайшов застосування у сегменті Інтернету речей. Це ключова технологія у вбудованих системах, таких як смарт-картки та датчики. Тому компанії використовують цю мову програмування в промисловості домашньої автоматизації. Крім того, він активно застосовується при розробці технологій потокових пристроїв та Smart TV.

  • Платформа великих даних Hadoop написана Java. Оскільки ця мова з відкритим вихідним кодом і об'єктно-орієнтована, вона є наріжним каменем для програм Big Data. Такі мови програмування, як Scala, можуть легко працювати на віртуальній машині Java та спрощувати аналіз великих даних.

  • Ігри - це галузь, що розвивається і швидко зростає, в якій Java широко використовується для різних ігрових додатків. Наприклад, він пропонує підтримку jMonkeyEngine, найбільшого двигуна для розробки тривимірних ігор з відкритим вихідним кодом. Крім того, віртуальна машина Dalvik (DVM) переважно підтримується Java і використовується для створення інтерактивних ігор для Android.

Функціональне програмування - за і проти

Джерело: Dev.to Незважаючи на моє традиційно скептичне ставлення до незнайомих технологій, я визнаю перевагу функціонального програмування. Нижче наведено зразковий список із плюсів, які описують цю парадигму програмування. Кава-брейк #131.  Роль Java у розробці у веб- та мобільних додатків.  Функціональне програмування - за і проти - 2

Безпечний паралелізм

Функціональний підхід заохочує безпечний паралелізм, тобто можливість запускати завдання в окремих потоках без конфліктів потоків і колізій модифікацій. Причина в тому, що, на відміну від об'єктного підходу, ви не поділяєте об'єкт, стан якого можна змінити під час обробки. Є входи та виходи, і вхід не змінюється через вас. У Java, навіть якщо ви використовуєте "потік-орієнтовані" об'єкти, ви не можете гарантувати, що вони будуть мати однакові значення під час виклику вашого методу. У наведеному прикладі ми бачимо, що цикл, який обробляє елементи по одному, може бути легко оброблений паралельно за допомогою лямбда-функції всередині потоку.
for( String item : items ) {
   process(item);
}
А тепер він стає:
items.parallelStream().forEach( item -> process(item) );

Швидке введення/виведення

Функціональне програмування підтримує підхід, який відрізняється від багатопоточності. Це означає, що у нас більше немає окремих потоків, які чекають на відповіді на введення-виведення, таких як виклики бази даних. Тобто ми максимізуємо використання процесора та пропускної спроможності. Для високопродуктивних програм це явна перевага. Це реалізується з ідеєю, що виклик функції може повернути Future, яка не є фактичним результатом виклику, а швидше за обіцянку повернути результат у якийсь момент у майбутньому. У якийсь момент у майбутньому виходить значення, що повертається, яке запускає функцію. Це означає, що потоки процесора не чекають завершення викликів баз даних або REST і можуть займатися чимось іншим.

Стислість виразу

Розробники програмного забезпечення хочуть мати можливість витончено висловлювати складні ідеї. Функціональне програмування дозволяє робити це лаконічно. Наприклад, загальні конструкції, такі як цикли for можуть бути замінені потоками, які абстрагують загальні операції for, для яких використовуються цикли. Немає жодних сумнівів у тому, що додавання функцій Lambda та потоків у Java розширило можливості для вираження ідей, які раніше були неможливими.

Чому б не стати функціональним?

Просто повторю вищевикладене: функціональне кодування має багато переваг, тому в цій статті ми не намагаємося узагальнити все в один випадок і сказати, що вам обов'язково потрібно займатися функціональним програмуванням або навпаки. Таке рішення потрібно приймати з чітким розумінням причин переходу та потенційних проблем.

Інтуїтивно розуміти завжди важко

Під час написання коду ви намагаєтеся спілкуватися з комп'ютером? Якщо вам таке важливе спілкування з комп'ютером, чому б не писати машинним кодом? Зрозуміло, це дуже складно, тож для полегшення вигадали комп'ютерні мови. Вони також дозволяють програмістам створювати вирази, зрозумілі іншим програмістам. Оскільки програмне забезпечення стає більшим і складнішим, нам потрібні стратегії для управління складністю. Ми досягаємо цього за рахунок абстракцій та приховування інформації. Клас, який ви використовуєте в Java для надсилання електронної пошти, є досить складним, але інтерфейс цього класу простий. Він приховує детальну реалізацію, відкриваючи нам лише зовнішній бік управління. Особливості мови, такі як фігурні дужки та квадратні дужки, повідомляють нам структуру, таку як умовні оператори та цикли. Тільки тепер ми переміщаємо цикли, або, вірніше, рекурсію, та умови у функції:
for( String item : items ) {
    System.out.println(item);
}
Виходить:
items.foreach( item -> System.out.println(item) );
Потоковий та лямбда-підхід, безумовно, коротший. Ви можете виразити ту ж функціональність із меншою кількістю коду. Проблема в тому, що тепер приховуємо фактичну поведінку всередині методів, які ми повинні знати. Цикли Java використовують ключові слова. З іншого боку, лямбда-функції можуть реалізовувати різні форми рекурсії, і лише ім'я вказує на те, що воно робить. Наприклад:
boo.fooble( item -> System.out.println(item) );
Ви не можете просто читати код, щоб зрозуміти структуру. Це ускладнює відстеження потоку виконання. Інша особливість — ланцюжок функцій, коли результат однієї функції є наступним введенням без призначення проміжної змінної.
boolean result = boo
    .fooble( /*some code*/ )
    .bobble( /*some code*/)
    .goober( /*some code*/);
Для автора цього коду це може мати сенс, тому що він начебто написав кожну функцію і знає, що вона робить. Однак для тих, хто погано знайомий з кодом, це мало що говорить про параметри, процеси або значення кожної функції, що повертаються. Але якщо ви напишете те саме в чомусь, що надає типи, ви отримаєте:
Car car = boo.fooble( /*some parameters*/);
Tyre tyre = car.bobble( /*some parameters*/);
int pressure = tyre.goober( /*some parameters*/);
Можливо, це не ідеальна аналогія, оскільки параметри та анонімні функції — це не те саме, але сенс тут у тому, що довгу пропозицію з невідомими результатами та параметрами важко читати без глибшого розуміння того, що виконують функції, описані нижче. І тому можливо, що функціональне програмування одночасно дуже виразне в напрочуд коротких сегментах коду, але не піддається розумінню для людей, погано знайомих із програмним забезпеченням. Сенс класів та інтерфейсів пов'язані з приховуванням даних, зі створенням повторно використовуваних фрагментів коду, які вимагають від розробника розуміння чи, можливо, навіть перегляду реалізації. Вони існують для того, щоб розробники могли працювати з більшими складними системами без головного болю. Це зручний спосіб організації коду, що з конкретними сутностями. Проте я погано розумію, як функціональне програмування допомагає структурувати великі складні проекти. Ймовірно, це є суб'єктивні причини.

Щоб справити враження на інших своїми навичками

Деякі розробники програмного забезпечення настільки не впевнені у своїх навичках, що намагаються справити враження через написання надмірно складного коду. Будучи senior-розробником, я не особливо захоплююсь іншими розробниками програмного забезпечення, які намагаються писати “розумний” код. Звичайно, це стосується не тільки функціонального програмування; те саме може статися в будь-якому стилі кодування. Але я помітив певне інтелектуальне марнославство прихильників функціонального програмування. Суть у тому, що розробники програмного забезпечення не працюють у вакуумі. Цей "розумний" код потрібно буде підтримувати, і якщо його важко зрозуміти, потім його буде важко читати і змінювати, важко налагоджувати. При управлінні командами у нас є люди на всіх рівнях, тому найрозумніше писати код так, щоб він був зрозумілий усім причасним. Ось чому ми зрозумілі довгі імена змінних, тому ми обмежуємо довжину методів. "Розумний" код забере зайвий час, тому писати його не надто розумно. Я вважаю, що функціональне програмування використовує самі аргументи щодо коротких і потужних висловів, що й Perl багато років тому. Прихильники Perl пишалися його виразністю, тим, як вони могли писати програми, які були б дуже потужними і при цьому займали всього кілька рядків коду. Це було правдою. Проблема полягала в тому, що їх було важко зрозуміти. Можливо, функціональне програмування потрапило в ту ж пастку.

Тому що це нова мода

Завжди є “гаряча” нова технологія чи парадигма. Постійно з'являються нові технології, мови та підходи. Ми повинні постійно кидати собі виклик та вивчати нове. Бути розробником програмного забезпечення означає просувати технології. Але як розробники софту ми повинні оцінювати, які технології нам необхідні для створення продукту. Вивчення нової популярної технології тільки тому, що вона є популярною, не є розумним використанням часу. Це не означає, що ви не повинні вивчати функціональне програмування, швидше ви повинні оцінити плюси та мінуси цієї парадигми для тієї програми, яку ви пишете.

Тому що це єдиний вірний спосіб

Багато разів я бачив, як розробники просувають той чи інший підхід як єдино вірний. Але, як мені сказав один друг, для різних робіт потрібні різні інструменти. Наприклад, особисто я використовую Python та PyTorch для штучного інтелекту, хоча є безліч інших інструментів та технологій, кожен з яких має свої переваги та недоліки. Існують вагомі причини розглядати функціональне програмування як варіант для сервісів, які потребують значної масштабованості. Це з безпекою паралелізму, запропонованої цим підходом. Але ви також повинні знати про витрати та потенційні ризики. Кілька років тому я мав схожий досвід із впровадженням залежностей і тим, що Spring вважався найкращим для цієї роботи. Коли я запитав прихильників Spring про те, яку користь він приносить, то чітких відповідей мені не дали. Зараз я спостерігаю щось подібне у деяких прихильників функціонального програмування, які, схоже, беруть участь у якійсь релігійній кампанії, а не у неупередженій оцінці технології. До речі, запровадження залежностей було чудовою ідеєю, і тепер я можу чітко визначити його переваги. Так само я думаю, що мої побоювання з приводу функціонального програмування пов'язані з тим, як воно використовується, а не з тим, чи це корисний і дійсний підхід.

Висновок

Сенс цієї статті — не дати чіткої відповіді на питання про те, чи варто займатися функціональним програмуванням. Суть у тому, як ви самі оцінюєте будь-яку нову технологію чи підхід. Головне: не дозволяйте своєму его закривати від вас об'єктивну оцінку. Розробка програмного забезпечення – це не доказ ваших інтелектуальних здібностей або ваших особистих якостей. Йдеться про створення цінності у реальному світі. Якщо вам допомагає функціональне програмування, використовуйте його.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ