×Закрыть

Java-8 и порог вхождения

С одной стороны, код стал лаконичнее,
с другой, под этой красотой таятся грабли.

Поделитесь, плз, своим субъективным мнением по поводу того, как изменился порог вхождения в Джаву с появлением вот этих всех функциональных фишек со стримами и лямбдами.

Молодёжи будет легче всё это освоить?

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

скоро джава 9 выйдет, а они всё 8-ую мусолят...

скоро джава 9 выйдет, а они всё 8-ую мусолят...

Скоро ... как скорый поезд :) (скажем спасибо ИБМу и РедНату)

Собеседование,
Вопрос: а как у вас с Джава-9?
— Никак, она ещё не вышла,
— Хм, плохо. Выйдет 9-я, а вы её не знаете.

документация и принципы/примеры работы уже есть, кто не ленивый (в отличии от меня :D ) может уже и знать %)

Вроде и кажется, что Java 8 проста, но достаточно сюрпризов и неожиданностей. Об Optional я написал небольшую статью it-simulator.com/#/articlefull/274

полезная статья.
С Джавой нужен глаз-да-глаз: тут читаем, тут не читаем, тут рыбу заворачивали.
youtu.be/hOrLrLPsv1k?t=32s

Сделать всё круто, но кое-где криво -это старая традиция ещё со времён Sun.

c Параллельными Стримами тоже не всё однозначно, есть грабли:
www.coopsoft.com/ar/Calamity2Article.html

Да, параллельные стримы не всегда улучшают быстродействие. В каждом конкретном случае нужно тестировать быстродействие.

По-моему, порог никак не изменился. Для работы на джаве надо знать довольно много помимо собственно языка, и на этом фоне новшества восьмерки слишком малы, чтобы делать погоду.

когда Джава была простым языком (JDK 1.4), даже и тогда всё было непросто,
и даже без Спрингов\Хибернейтов бывало ппц непросто.

Теперь же, Джава уже не простой язык, имхо.

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

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

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

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

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

Для того, чтобы знать о новых фитчах — да, два-три дня достаточно. Что уметь использовать — где-то пару недель знакомства.

вот, не благодарите

Много интересного- но все же это не rocket science.

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

стримы и лямбды это просто мелочь по сравнению со всем остальным

стримы в джаве довольно таки куцые

scala

Это про какие стримы ?

col.stream().filter().map() и так далее

Слышал много плохого об этих стандартных стримах. Типа утечки памяти, плохой ресурс памяти, никоторые фиговые операции, итд, Источник лень гуглить.

это как с котами, смотря как приготовить

Стал немного выше, так, как для освоения новых фич надо хорошо знать основу.
До 8 java разбор разных анонимных классов и подобного можно было оставить на потом, а теперь надо знать.

как если-бы автомобиль пропатчили, и руль стал ходить вперёд-назад.
Зашибись, фича. Теперь автомобиль может взлетать и садиться.
Это круто, это многим нравится. Вау, ага.
Но некоторые не умеют не то что взлетать-сажать, но и толком ездить.

При нынешней идеологии быстрокодинга и наплевательском (местами) отношении к ревью и устранению технического долга — х\з вот что это выльется. Но это уже оффтоп. Посмотрим.

Вопрос был по порогу вхождения. Спасибо за ответ.

как изменился порог вхождения в Джаву с появлением вот этих всех функциональных фишек со стримами и лямбдами.
Для начала нужно одбросить, в основном маркетологические, бредни про «функциональные фишки». Если это сделать, то приходит понимание что ничего не помянялось в плане порога вхождения. За счет чего он должен значимо вырости не понятно. За счет АПИ для 5 классов и пары довольно простых синтаксических конструкций? Так это соизмеримо с апдейтом любого фреймворка.
С одной стороны, код стал лаконичнее,
с другой, под этой красотой таятся грабли.
Основная проблема — это люди которые еще «не наигрались». Например, вместо построения стрима (даже если там простая мап-коллект операция), заменяют цикл на метод forEach в котором набрасывают с список и радуются что заюзали новое АПИ.
заменяют цикл на метод forEach в котором набрасывают с список и радуются что заюзали новое АПИ.
некоторые люди просто не любят for-statement

хотя сам по себе forEach тоже плохо, лучше map или reduce

map не терминальная операция, не является эквивалентом.

ясен пень, но пости всегда вы либо делаете ремап либо аггрегируете данные

а коллект то зачем? Чтоб рядом ещё стрим открыть и потом ещё?

а коллект то зачем?
Потому что мап или фильтер какой-то, как вы написали выше, «не терминальная операция» :)
Чтоб рядом ещё стрим открыть и потом ещё?
Вот этот посыл не очень понял.

Да постоянно же встречается когда один метод выполняет стримовые операции, нпример тот же мап, затем собирает результат в какой-то лист и уже этот лист передаёт дальше, где тоже открывается стрим, выполняется, например фильтр и коллект затем снова и снова.
Думаю от этого и появляются мысли что стримы тормозят, текут и прочее. Т.е. когда создания стрима+коллект в коде больше ччем полезных действий.
Идея то была раз открыть стрим и закрыть его терминальной операцией совсем на выходе.

та насрать если чесно, я бы еще больше накинул вкусного что бы народ испужался
после haskell не страшно бгггг

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

Посмотри на Го. Мне он решительно не нравится, но если напрягают разные модные свистелки, Го — как раз то что нужно. Как С со сборщиком мусора и многопоточностью. Проще некуда.

Забыли добавить что он без дебаггера. Или что-то поменялось? И на C не было/нет многопоточности?

Дебаггер уже сделали по требованиям трудящихся — github.com/derekparker/delve . Встроен во все популярные IDE для go.

надеюсь ты им не пользуешься?

Не пользуюсь — дебаггер для слабаков :)

И на C не было/нет многопоточности?
Есть, но ей намного сложнее пользоваться по сравнению с:

go doThisInGoroutine(foo, bar, baz)

Мене нові фічі порадували. До того писав за допомогою Апач коммонс колекшнс тому особливих проблем з розумінням не мав. Щодо молоді — не знаю, мабуть, що важче буде, але не дуже.

чисто имхо, новичкам придётся осваивать 2 Джавы:
— старую-добрую
— новую-модную

т.о., она теперь оправдывает своё название: Java-2
(или лучше Java х2)
***
мои первые впечатления от Джавы −8 были условно такими:
— а чо это вы сделали с моей любимой Джавой? она какая-то не такая, вся посинела.
— она стала круче, вот и вот, правда круто?
— хм, а почему у неё топор из спины торчит?
— а это функционально.
— маать вашу за ногу.

как-то так, но потом сживаешься со всем этим,
программист-же не собака, привыкает.

Меня всегда интересовал вопрос оно то можно и лаконично, но а как с перформансом ;)

граблей стало больше, как я понимаю.
покрывать код пифоманс-тестами теперь не роскошь, а необходимость.

Шипилев показывал, что все не так уж и плохо. Даже хорошо. Так что если вопрос не в милиссеках то пользуйтесь без проблем.

граблей стало больше, как я понимаю.
покрывать код пифоманс-тестами теперь не роскошь, а необходимость.
Мда. Среднестатистическое джава приложение:
— получам ХТТП-запрос из сети
— парсим все в ПОДжО с помошью ревлексии
— пробрасываем через спринговые прокси и возможно какой-то АОП
— делаем бизнесс-логику
— передаем данные в какой-то мутный «ДАО-фремворк» (хибер или скорее спринг-дата + хибер)
— делаем сетивой запрос в БД
— и все в обратном порядке.
---
Сто пудов торвозить будут лямбды и стримы!

Но есть маленькая плюшка в виде параллельных стримов, правда малоприменимая в энтерпрайзе

В скале со временем на перформанс тупо забиваешь) .
Ну не совсем тупо, алгоритмическая оптимизация есть, но считать сколько объектов выделолось для того чтобы простой редьюс сделать — не барское это дело :-)

но считать сколько объектов выделолось для того чтобы простой редьюс сделать — не барское это дело :-)
И это правильно в некотором смысле:
Какая разница сколько чего создалось, если оно чистится за __приемливое__ время? Какая разница насколько длинная цепочка вызовов, если она отрабатывает за __приемливое__ время? Почему-то никто (помимо ХТФ и тд) не парится про итеретор для цикла или про аррейлисты вместо массивов.

Давайте, пожалуйста, обсуждать перфоманс языка после IO перфоманса. А так-то конечно все эти Groovy, лямбды, AOP и прочий Lombok добавляют лаконичности и выразительности, но ценой миллисекунд же!

Или у вас именно такой проект, что большие объёмы данных в памяти обрабатываются?

В новых требованиях SLA прописаны до миллисекунд. Можно сказать каждая наносекунда на счету.

Оу! Я с таким не работал, плохо представляю специфику. Если не затруднит, пару вопросов. А как же всё таки с IO? Всё закешировано? Или вообще IO нет? Трейдинг? Почему Java в конце концов? Как с GC?

Я почему-то думал, что если нано-милисекунды, то такие вещи делают в железе на ASMе-С.

Не трейдинг, но рядом. Потому джава и не на железе.
В начале дня все в память а потом слушаем риалтайм апдейты. В текущей системе используется Oracle Coherence. Все впринципе весьма быстро, но надо намного быстрее :)

Проблемы: неконтролируемое использование потоков фреймворками, тем же кэшэм. Что влечет за собой спайки в SLA и огромная нагрузка на GC той же природы.

Недавно бизнес захотел все сделать быстро, понимает что все не моментально будет. Вот смотрим в сторону LMAX подобных подходов сейчас.

Недавно бизнес захотел все сделать быстро

знакомо.
при том, что метрология, как предметная область в целом, и SLA tools — адокъ тот ещё,
доводилось пилить, но не для банка, к счастью.
Один проект был «пожилым стартапом», второй «кацапским распилом»,
такие мсье, шо хай им грець.

Основными проблемами было:
— а для чего вам это надо?
— не скажем, вы вот делайте, а мы не скажем зачем
или
— вот сделайте сюда график, красненьким и зелёненьким.
— а эти данные на сервере есть? как их аггрегировать, откуда?
— а мы х*йегознает, вы нам график красненьким и зелёненьким, и быстренько.
— ну нате, вот.
— а чёто неточный он у вас.

Быстренько, я т мел ввиду по отношению к приложению. Чтобы быстро работало :))

А на счёт методологий — то это даже не смешно, когда работаешь во Фронт Офисе:)

Можно сказать каждая наносекунда на счету.
ИМХО Java как то не выглядит наилучшим инструментом

Системе лет 10 не я придумал. Иначе бы попросил Ви на Го все написать ;)

ваяют на Джаве и трейдинг и SLA, и живёт норм

Видел интересные штучки. Когда кабель соединяют с коробкой где уже все есть и быстро работает. Грубо вместо кабеля с сетевой коробочка котора все делает мгновенно.

Да знаю что ваяют, но все равно удивляет

foreach цикл и явное использование итераторов самые быстрые. Бенчмарки и разборы граблей в сети есть.

Не понимаю. Код понятнее и лаконичнее. Может даже lazy выполнение, которое отменится вообще. Задержки на IO, навскидку, на 4 порядка больше(!). Если это так, как практически заметить быстроту foreach цикла-то?!

Если нет, и борьба идёт за наносекунды, как в треде выше, то почему вообще Java?

Я только ответил на вопрос без учета IO и т.д.

Серьезно ?
То ты скалу еще не юзал.
Я уже который год пишу на скале, и каждый год понимаю что не знаю о ней почти ничерта ).

Подписаться на комментарии