Pull to refresh

Comments 133

О, они наконец-то разродились на бесплатную Community Edition. Беда в том, что я уже вообще не помню, как писать на Delphi. Десять лет назад бы…

Java как язык лично для меня умер, и я теперь понимаю что всегда его ненавидел. Уродливый и громоздкий. А вот JVM жива и процветает, под неё огромное кол-во прекрасный языков.
Собственно если уходить от Java то в отрасле должен начаться фундаментальный сдвиг от ужаса называемого ООП, потому что все более менее популярные на сегодня языки не так уж и далеки от Java.

> от ужаса называемого ООП

так, а ООП то чем не угодил?

В 2018 году на хабре можно спрашивать "чья версия ООП не угодила ?". Теряюсь постоянно чей ООП более правильный.

Слабые умы не могут осилить ООП — это основной недостаток ООП
Я всегда считал, что ООП как раз призван упрощать восприятие программ человеком. Куда проще строить в голове картину связей сущностей, нежели отдельных функций и структур данных. То есть необходимая вычислительная мощность мозга для ООП может быть ниже, чем для процедурного подхода.

Однако же оказалось, что ООП таит в себе ужасы.
UFO just landed and posted this here
> спагетти из extends

Егора Бугаенко читал?) Может быть, так и надо?
UFO just landed and posted this here

Вот бы увидеть хоть исходный код проект где ООП применили как надо и получилось красиво и понятно.)

UFO just landed and posted this here
Скорее, ООП призван упрощать восприятие хорошо спроектированных программ человеком. Но мир, как обычно, оказался неидеален. А ужасы можно везде без особого усердия призвать к существованию.
Слабые умы не могут осилить ООП — это основной недостаток ООП
Или же — слабые умы не могут понять что оно не нужно и продолжают верить своим кумирам продвигавшим ООП?) И писать пухлые от лишнего кода проекты.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
А можно тезисно изложить основные ужасы ООП и то, как нивелируются эти ужасы в других парадигмах?
И посоветуйте язык заодно.
Ну как же. ООП подразумевает сущности с состоянием. А в мире математики и розовых пони нет состояний, потому что у поней от состояний случается диарея радугой. Очевидно, что нужно использовать языки, избавленные от этой мерзости, такие, как божетвенный Haskell. И функции. Вы ведь понимаете, что всё — есть функции. Функции от функций. Функции высшего порядка. Жонглировать функциями. Вычислять функции. Но не сохранять результат. Потому что результат — это состояние, не Вы понели.
любой файл на компьютере — это своего рода состояние. Да и куча других вещей с исчезновением состояний станет невозможной. Не думаю, что нужно везде повально избавляться от этого.

В ФП конечно же есть состояния, комментатор выше или неточно сформулировал, или не очень разбирается в вопросе.

UFO just landed and posted this here
Так ведь инкапсуляция как раз и спасает от того, чтобы думать о состоянии сущности.
Мой комментарий получил девять плюсов и один минус. Тут либо уровень невежества у ещё девяти человек Вас мог бы поразить, либо просто они могут в юмор, а Вы — нет. Но в целом, Вы конечно правы, я в этих Ваших Хаскелях действительно не «рублю».

Тезис прост, объект в 99% задач не нужен — то есть объединение состояния + действия. У вас или данные или действия. Чем проще тем лучше.

А что теперь вместо Джавы? O_O
(Java вроде для Веба и Андроидов используется? Что теперь на них?)
UFO just landed and posted this here
Scala много лет взлетает-взлетает, но все никак не взлетит. Я бы на нее уже не рассчитывал, она заняла свою довольно узкую нишу и вряд ли из нее уже выберется. Даже наоборот, думаю новые версии джавы и котлин отъедят у нее еще немного популярности.
Для веба я недавно ASP.NET Core открыл. Cross-platform, open source.

Когда перейдем на Java 11, я попробую в своих проектах протолкнуть запрет на var. Мне кажется это одна из существенных вещей, которые делают Scala и Kotlin сложными для чтения: методы с двадцатью+ объявленными переменными, без единого типа.

в AppCode на свифте, подсвечивает какой тип используется в этой переменной. По идеи в Idea так же будет. Не мешает чтению кода, от слова совсем.
По идеи в Idea так же будет.

В Rider нет подсветки, но есть тултип.

Код далеко не всегда просматривается в среде. А даже когда в среде, не удобно гонять курсор повсюду, чтобы увидеть типы, и кешировать их в мозгу, вместо того, чтобы просто их видеть все.


Вот честно, не понимаю, кому мешают эти типы написанные. Код читается в 10 раз чаще, чем пишется.


У нас еще, кстати, статические импорты запрещены, и это хорошо.

Ну, иногда тебе не нужно видеть тип. Потому что там мап листов мапов мапов мапов хэшсетов листов кверибилдеров тредэкзекьюторов, и от взгляда на это может начать бить лихоманка. А ты просто пишешь все в стримо-реактивно-функциональном стиле, и когда-нибудь этот ад заредуцируется в .toList, но не сейчас.

А как такое хозяйство ревьюить, чтобы не надо было выкачивать ветку из VCS локально, переключаться на нее в идее, и раскуривать, в итоге тратя столько же времени, сколько автор кода? "LGTM"?

Ну а как ты читаешь код на каком-нибудль кложуре или хашкеле? Промежуточные представления могут быть совершенно дичайшими, но часть магии именно в том, что их никто не сохраняет в промежуточные переменные и не выделяет в отдельные переменные-сущности. «Не сломается того, чего нет». Грубо говоря, у тебя не сломается счетчик цикла, если нет циклов со счетчиком. Не сломаются переменные, если у тебя нет переменных (привет, Ерланг). Не сломается понимание типов, если ты их не видишь.

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

Ну это так, для примера. Надо подумать. Наверное, lany про это лучше скажет)
Ну а как ты читаешь код на каком-нибудль кложуре или хашкеле? Промежуточные представления могут быть совершенно дичайшими, но часть магии именно в том, что их никто не сохраняет в промежуточные переменные и не выделяет в отдельные переменные-сущности. «Не сломается того, чего нет». Грубо говоря, у тебя не сломается счетчик цикла, если нет циклов со счетчиком. Не сломаются переменные, если у тебя нет переменных (привет, Ерланг). Не сломается понимание типов, если ты их не видишь.

А кто сказал, что читать код на Clojure и Хаскеле — проще, чем на Java? Очевидно, что сложнее, это если не полностью write-only языки, то приближаются к ним. И может быть это та причина, по которой на большие долгоиграющие проекты эти языки редко берут?


Кстати, хотя читать Clojure и Хаскель сложнее, чем Java, я не спорю что они при этом гораздо безопаснее. Одно из другого не следует.

UFO just landed and posted this here
UFO just landed and posted this here
Признак того, что пора делать POJO.

Внимание вопрос. Что такое, по вашему мнению, POJO?

UFO just landed and posted this here
А если там написать var, то это читается еще легче: это просто можно не читать и не видеть.

Ну и как этим управлять? Тысячи проверок на get, put. Легче сделать враппер, который всем этим будет управлять. Сам код станет чище.
В этом случае — var это просто способ засунуть всё под ковёр, а не решить проблему.

Ты предлагаешь человеку делать то, что может сделать автоматика. А потом эти POJO будут ломаться постоянно, и придется их поддерживать. Не говоря уж о том, что весь этот сейф программинг с перекладыванием пустого в порожнее, DTO в DTO — это адские тормоза. Не лучше ли компилятору заниматься этой грязью, в то время как человек займется чем-то более человеческим — ну, высокоуровневыми вопросами, постановкой задач, вот этим всем. Точно так же когда-то мы отказались от ручного управления оперативной памятью, и это была огромная победа. «Не сломается то, чего нет». Нет памяти, которую можно вручную размечать — нет проблем с памятью. Есть стандартный алгоритм сортировки в коллекциях — нет проблемы с сортировкой. Нет типов, которые нужно вручную выводить — нет проблем с организацией типов. Итп.
UFO just landed and posted this here
А в чем проблема?
Только записать стримами, чтобы не пришлось проверять на null, итп.

Мне очень нравится вот этот чувак: blog.ploeh.dk

У него есть очень стройная теория по применению функционального подхода к C#. Он берет какие-то приемы из Haskell, адаптирует на F#, и потом рассуждает, как это можно применить в C#, несмотря на то, что C# не имеет всяких продвинутых фичей.

В качестве примера рассуждений, есть его доклад на прошлом DotNext 2017 Moscow про Dependency Injection. Ну да, C# это не совсем Java, но с точки зрения общего дизайна они близнецы-братья.

Имхо это вопрос не столько конкретно о варах, или о стримах, или еще в какой-то конкретной фиче, а в общем вижене способа кодирования

UFO just landed and posted this here
Ну, в данном случае — наверное, никак нельзя :-) Я просто попытался сказать, что можно изначально пытаться все писать в функциональном стиле (именно труЪ-функциональном), и тогда вопрос «какой там промежуточный тип» будет стоять сильно меньше. Не знаю, как это рассказать коротко, придумаю — напишу статью. Марк Симанн очень много написал размышлений, как превратить изначально не функциональный язык C# во что-то относительно похожее. К сожалению, опять же, применения этого на реальном проекте я показать не могу, это все пока только идеи.
А можно как-нибудь протолкнуть запрет на неиспользование мозга? Вары не нужно пихать вообще везде — только там, где типы мешают
А можно как-нибудь протолкнуть запрет на неиспользование мозга?

Многие пытались, но запрещать фичи языка получается лучше. Ну, то есть результаты лучше, если запретить фичи языка, вместо того, чтобы запрещать неиспользование мозга.


Вары не нужно пихать вообще везде — только там, где типы мешают

С таким же успехом можно сказать, что goto не надо использовать везде, а надо использовать только там, где условные операторы мешают.

Таааак. А goto то чем не угодил?
Таааак. А goto то чем не угодил?

Дейкстра целую статью на эту тему написал, не думаю, что у меня получится сказать лучше ))). Хотя конкретно в джаве goto это, конечно — добро. Благодаря ему урлы в джаве стали конструкцией языка, которые можно класть прямо в код.

UFO just landed and posted this here
Можно, к примеру, делать break из проименованного if (вообще-то любого блока, но не суть).
И единственное, почему это мало кто любит — это то, что конструкция выглядит непривычно. А выглядит она непривычно потому, что так мало кто делает. А делают так мало потому, что не любят. Ну и так далее. А началось с того, что это не любил Дийкстра. Весьма нерациональный подход, на мой вкус.
насколько я помню, там идентификатор goto наоборот зарезервирован, но по факту не работает

Вот я и говорю, в джаве goto — добро. Использовать его нельзя, поэтому он ничего не портит, а http ссылки в конструкции языка добавляет )))

UFO just landed and posted this here

Ну, вот этот код компилируется и работает.


public class Main {
    public static void main(String[] args) {
        https://google.com
        System.out.println("duck duck go rules!!!");
    }
}
В си это нормальный такой подход для каких-то системных штук. Весь линукс так выглядит, получается чисто и опрятно. Разве это не прекрасно:

do A
    if (error)
        goto out_a;
do B
    if (error)
        goto out_b;
do C
    if (error)
        goto out_c;
        
goto out;

out_c:
    undo C
out_b:
    undo B:
out_a:
    undo A
out:
    return ret;
UFO just landed and posted this here
UFO just landed and posted this here
Многие пытались, но запрещать фичи языка получается лучше. Ну, то есть результаты лучше, если запретить фичи языка, вместо того, чтобы запрещать неиспользование мозга.

Сплошную линию пересекают реже, если она из бетона и 40см в высоту?
Если ты именно про высоту, то похоже, даже чаще :mrdestructoid:

С когнитивными искажениями невозможно бороться. Одно из них — когда человек только что написал метод, он кажется ему очевидным. Поэтому не пишут комментарии, и поэтому будут лепить var — "ну тут же очевидно какой тип, а выглядит короче и элегантнее".

Тем временем вывод параметров-типов у дженериков никого не смущает)

Мне особенно нравится, когда компилятор ругается на <> и люди просто стирают их оставляя сырой тип, зато все компилируется теперь :)

Разве компилятор ворнингами в ответ не бросается?
В Идее при этом всё желто-коричневым перечёркнуто с сообщением, что звать что-то в сыром типе — плохо

А ещё там в rhs части — анонимный класс на 500 строк, и идея делает его весь жёлтым. Делая проблемы в самом классе неразличимыми. Очень удобно

Вары именно что нужно писать везде. Шарписты смотрят с недоумение на этот срач. Мы это прошли лет пять(?) назад. Код либо читается либо нет. Если код читается то вар только помогает. Ибо нефиг мусорить (масло м = новое масло() )! Если код не читается, то ему прописаны типы не помогут.

В шарпе программисты многое прошли раньше джавы, которая появилась раньше шарпа. И теперь не нарадуюсь смотреть на то, как шарписты какую-то фичу давно съели и выкакали, а джависты — только ждут в новой версии.
Вары именно что нужно писать везде.
Очень сильно утвереждение. Если var myData = new Data() — все понятно, но если же дерьмо вроде
var data = GetData();
var convertedData = GetConvertedData(data);
return convertedData.ToString();

return convertedData.ToString(); это паттерн бюррократии. Вместо того, чтобы зайти в нужный кабинет сразу, ты сначала по соседним помотайся методам и типам помотайся, а вот потом уже к нам.
Часто я код смотрб в системе контроля версий или блокноте, потому что пока его склонируешь или откроешь в IDE уйдет вагон времени.
мне кажется, стоит протолкнуть запрет на создание методов с 20+ переменными)
А заодно и запрет на создание функций с названием более, например, 50 символов тогда уж)
UFO just landed and posted this here
Я конечно пишу на шарпе, но вроде как чисто при объявлении var не возможно использовать без присвоения чего либо ему.
И в Java это точно так же. Потому что var — это не динамическая типизация, это вывод типа.
UFO just landed and posted this here

Запрет не нужен, нужны giudelines когда использовать, а когда нет. Очевидно, на один borsch в Borsch borsch = new Borsch() это благо. Всё хорошо в меру и без фанатизма. И использование var, и запреты на него.

Я бы сказал, что это будет работать на пет- и соло-проектах, максимум — проектах на два-три человека. В больших проектах с "текучкой" разработчиков бороться с безответственностью невозможно никак кроме полного запрета каких-то вещей.

Стоит попробовать практиковать код-ревью.

Код-ревью обычно в три раза безответственнее чем само написание кода. Только в мире розовых пони бывают проекты на десять разработчиков, люди приходят и уходят каждые несколько месяцев, но при этом все одинаково ответственны и квалифицированны.

Вот что-что, а поспорить насчет оформления кода — это же любимый холивар программистов. Табы vs пробелы, няшное ручное форматирование vs автоформатеры, как лучше обозвать переменную… А в «чужую» бизнес-логику вникать — удел сильных. (=
Но все же именно в «текучих» крупных командах и окупается даже бестолковое поверхностное код-ревью, против полного его отсутствия. Если есть какие-то правила, то следить за их исполнением должен кто-то уполномоченный таской, а не просто самый ответственный и по настроению достать соседа.
Заодно расскажите, как в Java 11 создать методы без указания типов… очень интересно как вы это делаете.

Методы с 20+ объявленными переменными не станут проще только от того, что вы объявите их типы. Декомпозируйте.

За редкими исключениями, весь мир дотнета пишет var везде, где можно. Абсолютно никого не смущает. Java, конечно, не C#, и вам виднее, и тем не менее чтению не мешает от слова совсем, даже наоборот. Если, конечно, вы не смотрите код из блокнота, но не знаю что может привести человека к такому в 2018.

Да это понятно, в Скале и Котлине эти вары тоже никого не смущают.


Я едва ли не большую часть времени смотрю на код "из блокнота", который называется Гитхаб :)

>Абсолютно никого не смущает.
Вы вот прям всех знаете, чтобы утверждать с таким абсолютизмом?

>что может привести человека к такому в 2018
Чтение кода в интернете

>тем не менее чтению не мешает
Мешает, я уже начинаю на гитхабе сталкиваться с не читаемым джава кодом, где используют var. Приходиться материться, что мою джаву превращают в очередной джаваскрипт.

Я согласен, что var можно использовать, но в очень ограниченных случаях. К сожалению это не все понимают. Очень много людей до сих пор считают, что важно количество написанных букв, а не скорость чтение написанного кода, пусть и частично избыточного. Прям вот экономят на буквах, как будто они в 70-х. И это очень печально, такой код потом очень тяжело поддерживать.
Мне кажется, что методы с 20+ объявленными переменными — это, в общем случае, повод не избавляться от var, а повод избавляться от таких методов.
Опять таки, если это действительно такой уникальный метод, в котором просто необходимы 20+ переменных, то никто не мешает конкретно для этого метода расставить типы.

Java помрёт также как Cobol, вроде помер, а с другой стороны ещё как живой...

Delphi ещё. Хороший инструмент для своего времени был.
Да и сейчас вполне хорош.
Когда читаю про java то приходит беспокойство о php. Ведь он в каком-то смысле ее наследник. Да еще и js постоянно набирает обороты.
В PHP все плохо. Недавно как раз ключевые разрабочтики Zend Engine написали, что сбегают из конторы, которая оплачивает банкет и ищут нового работодателя
Помню что уходил основатель. Но если судить чисто по php то php 7.0 просто огромный шаг вместе с 7.1 и 7.2. Сложно сказать что дела идут плохо.
ZendEngine — это и есть сам PHP. Если за него не будут платить (а про это намекали ушедший сооснователь и 2 ключевых разработчика), то PHP дальше чем сейчас никуда не уйдет. Ну то есть, это хорошо что теперь есть 7.2, но если теперь никогда не станет 8, то это фиаско
Посмотрим как будет. В принципе, лет на 5-7 этого хватит если совсем не будет развития.
Хватит то оно хватит, но лично бы я линял с тонущего корабля одним из первых, и считайте меня кем хотите. Если технология загибается, то я считаю нецелесообразным заниматься ею целых пять лет, а потом впопыхах искать, на что бы перейти… лучше перейти сразу и пять лет в ней стать профессионалом.
То неловкое чувство, когда решил перейти от нативных языков к высокоуровневым, выбрав Java, и наткнулся на обсуждение этого поста…

Возможно Вас утешит тот факт, что подобное обсуждение можно найти про любой язык вообще ;-)

Пользуясь случаем, расскажите пожалуйста, а уже есть альтернатива Spring Boot для (например) Scala? Чтобы раз — два и вот тебе готовый базовый REST проект, сильно много настраивать не надо, бойлерплейт не писать; потом, когда хочешь добавить ещё возможность, всё уже есть из коробки с готовыми настройками по умолчанию. Когда я вспоминаю старый Slick, мне тошнота подступает к горлу…

Slick и новый не айс, но разве хибер лучше?

Когда он стоит за Spring Data JPA замечателен. Просто определи интерфейс и всё сгенерируется само.

"Магия" интерфейсов хорошо работает для простых кейсов, а чуть что посложнее — пиши SQL в аннотации. Переодически приходится что-то подкручивать напрямую через EntityManager.


Плюс Spring Data JPA же не изолирует от написания энтитей с кучей аннотаций и кучей бойлерплейта в виде с геттеров, сеттеров, equals/hashcode. Это конечно тоже решают с помощью Lombok. Выходит, что сликом на скале можно пользоваться самим по себе, а хибером — нет.

Так замечательно же, когда будет сложнее — буду писать сам. А вот в Slick 2.x каждый запрос надо было писать ручками, через боль и слёзы.
И Энтити с кучей анотаций описывают связи и взаимоотношения, которые помогают разобраться в структуре проекта, что нельзя сказать про запросы.

Дисклеймер, я очень люблю Скалу, но очень не люблю ту экосистему, с которой я работал в 2015. Это чтобы вы не думали, что я из лагеря староверов :-)

А, понятно. Я приобщился к слику в 2017, не знаю как он выглядел во времена 2.х. Сейчас запросы пишутся через специальный type-safe DSL, что имхо очень удобно. У современного слика проблемы с поддержкой, пару раз натыкался на баги, которые открыты и не пофикшены уже больше года.


Но опять-таки, по моему мнению, слик и хибер — это как небо и земля, даже если брать хибер со всеми спринговыми нашлепками.

Есть Play framework, который позиционируется для веб-приложений. Можно еще извернуться REST-API на Spark сделать.

Вы сейчас про который спарк?

Спасибо автору за статью.
P.S. Дорогие котлинисты и страдающие от «УЖАСЁВ))» ООП, Java никогда не умрёт. Не нравится, не используйте этот язык.

Я с вами полностью согласен.

На Java написано (и пишется до сих пор) до черта финтехсофта, как минимум потому и не умрет. Однако Котлин — все же серьезная заявка на кусок JVM-пирога.
UFO just landed and posted this here
Delphi всё таки не стоит ставить в один ряд с Коболом. Последняя движуха у Кобола была в нулевых, а для Delphi буквально на днях вышел очередной релиз.

Если посмотреть Википедию, то внезапно выясняется, что последний релиз Кобола был в 2014

Котлин интероперабелен с джавой в обе стороны, так что можно постепенно мигрировать проект, было бы желание.

>Котлин интероперабелен с джавой в обе стороны, так что можно постепенно мигрировать проект,
Для молодежи, которая дальше пет проектов не вылезала. А в нормальном проекте по голове постучат за такие идеи.
>Котлин — все же серьезная заявка на кусок JVM-пирога
Сомнительно. Про груви так же говорили и где он теперь? Для джавы готовят очень много вкусных фич, после которых котлин станет не нужным. Он сейчас не особо нужен, но молодёжь клюёт на рекламу. Еще бы нет, его в IDEA (46% рынка IDE) даже в контекстное меню встроили, причём во многих местах он там отсвечивает.
  • Что вы скажите о Котлин?
  • Котлин шмотлин
  • Вы приняты!!!
Если кто-то спросит, можно ли программировать на чём-то кроме IntelliJ IDEA… похоже, иногда можно


Улыбнуло. Учитывая, что James Gosling написал в твиттер, что он фанат netbeans 10, но как говорится из колхоза видней, как правильно Джаву приготовить.


А Eclipse уже все забыли?(

Это всё звучит забавно — про споры о IDE для Java. Без которого на языке писать мягко говоря тяжко.
С учётом того что есть языки которые позволяют писать код без IDE и продуктивноться не падет.)
Хорошо бы разработчики одного языка с ними познакомились, бывает если выйти за пределы совего "села" всё привычное уже не кажется каким хорошим. :)

Любопытно что за язык, которому IDE не добавила бы продуктивности.

UFO just landed and posted this here
Есть просто огромная куча софта, которая написана на Java и которая еще будет поддерживаться кучу лет. С этих проектов уходят люди, требуются новые и новые. Поэтому, Java будет еще долго актуальным языком.
Вопрос в том, будут ли проекты, на которые зовут программистов, чем-то новым или это будет допиливание модулей на имеющуюся систему?
Сложно судить, лично я не стану делать новый проект на Java. Если уж на то пошло и JVM обязателен, то я сделаю его на Kotlin.
И не последнюю роль тут играет Oracle с её людоедской нынешней репутацией.

Прикол в том, что и новые фичи в своем старом проекте на джаве вы можете пилить на Котлине;)

Умрёт, когда нормальный ЯП запилят, сейчас на рынке одни выскочки со смузи, которые тяжелее члена, ничего в руках не держали. Живут в своём выдуманном мирке, не понимая требований «работников на земле». Но в целом, старички с легаси продолжают держать рынок. И джава, даже со своим легаси, на всём этом фоне еще очень приятно смотрится.
Sign up to leave a comment.