LINUX.ORG.RU

Напутствие в трудной жизни.

 


9

3

Дисклеймер. Этот пост всесторонне вдохновлен каким-то древним видео в интернете, автора которого я благополучно забыл. Если автор сейчас читает это - респект тебе и увага, бро!

Итак.

Помойму программисты сильно перегибают палку.

Засрали всю джаву мусором.

Хотите вы бин, и что-то в нем хранить тупо, сделайте все поля public! Вместо лесов геттеров-сеттеров.

Боитесь, что такой класс (с пабликами) будет не thread-safe и хомяки не смогут писать с ним хороший многопоточный код? Да побойтесь б-га, хомяки вообще не напишут хорошего многопоточного кода, всё это миф. Дайте среднестатистическому человеку треды и локи, и он напишет код в миллион раз более медленный, чем аналогичный на готовом TransferQueue. Вот и пишите свой продюсер-консумер на TransferQueue, не выпендривайтесь.

ООП, и конкретно механизм наследования, очень плохо подходит для увеличения реюзабельности кода. Глупому заказчику можно втирать рекламу ООП=реюзабельность, но мы тут все грамотные люди, линуксоиды, как минимум с 8 классами образования, мы же все понимаем как оно на самом деле. Трейты/миксины и препроцессор и то с этим лучше справляются иногда.

Но сидят сумрачные гении, и ночами напролет пишут какие-то иерархии классов, чтобы одну строчку копипасты сэкономить. Всё это фигня! В такой надуманной иерархии классов еще сложней разобраться, чем отрефакторить копипасту. И уж точно ее сложнее модифицировать. Мой совет: копипастите смело и открыто! Если коллеги будут придираться, спокойным голосом, глядя на правое ухо поциента, говорите: «вот сам и поправь», 90% что коллега посинеет от страха и сдрыснет в ужасе, в остальные 10% можно утешаться тем, что эту лажу писать пришлось хотя бы не тебе.

Никто не заставляет писать Factory которые производят Factory, которые производят Factory! Хочешь посмотреть, откуда берется объект, а там целый стектрейс на 50 этажей, можно блуждать пока не умрешь от голоду. Хотите сделать объект - ставите new и поехали. Сразу понятно - вот тут делается объект. Фактори нужно изничтожать безбожно (только если это не Spring, Spring надо пожалеть).

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

Никаких фреймворков! Ехал фреймворк через фреймворк, и все - говно. Каждый день кто-то еще производит новый фреймворк. Потом набигают ПМы-хипстеры и такие, а что у нас популярно? Ахххаха, гороскоп показывает, что в эту фазу луны популярен Wicket, давайте нафигачим на нем гуй для Международной Космической Станции. Потом где-то там эта чушка не распарсила XML, свалилась в корку обосравшись стектрейсами, и все космонавты сварились. Отлично! Зато фреймворк!

Особенно радуют люди, которые боятся эти фреймворки чинить. Ололо, всё работает через задницу, но трогать не будем. Потому что - потом поддерживать же свой «форк» надо! Лучше нагородим еще костылей вокруг кривого фреймворка! Мотивируется это тем, что «на дальней дистанции» хомякам проще будет писать костыли, чем фиксить фреймворк. Но это ложь, через пару лет развития проекта уже совсем в этих костылях не разобраться. Совет тут такой: не использовать фреймворков, а если использовать - то понимать как они работают, и чистой душой фиксить их, а коммиты стараться засылать в апстрим.

Это всё от другой болезни, называется «Архитектура». Ее нужно долго придумывать, и потом всех насиловать. Можно сказать, архитектура передается половым путем, как сифилис и гангрена. Кто-то из великих говорил, что архитектура - это самая стрёмная, самая зачерствевшая и неизменяемая часть кода, то что фиг изменишь. Нормальный код должен легко меняться. Но во все времена были люди, поклоняющиеся говну. И вот тут, обязательно найдутся поклонники архитектуры. Совет тут такой: шлите архитектуру в зад, пишите гибко изменяемый код, так чтобы (если такая возможность потребуется) двумя легкими движениями рефакторинга текстовый процессор превращался в графический редактор и наоборот. Софт - это не паравоз, нельзя взять три семьнадцать колес, паровой бачок, сложить их по чертежу(архитектуре) и получить паровоз. Софт - это непрерывный процесс рефакторинга.

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

Самая жуть, это всякие ынтерпрайзные сервера, портлеты, фигеты, шушпанчики. Вот притащил ты себе в проект WebLogic или еще какой-нибудь архитектурно-окаменевший кусок, и что изменилось? Кстати, вы видели чтобы на одном реальном хайлоадном сервере запускалось больше одного приложения? Обычно бывает как раз наоборот - на куче серверов запускается ОДНО приложение! А сколько бед от этой псевдофункциональности по огранизации шаред хостинга! Что ынтерпрайзные сервера лучше делают, чем Jetty запущенная прямо из функции main? Собственно в этом и совет, запускайте джетти откуда-нибудь руками, или из мавена, и не парьте мозг.

Надо писать так, чтобы код отражал СУТЬ. Чтобы деплой отражал СМЫСЛ. Посмотрел на код - и сразу понятно, что там написано. Запустил сервер - и сразу понятно, что и как он обслуживает, где скачать его исходники и пофиксить, если чо.

Если вы последовали перечисленным советам, но вас никто не понимает, скажите что stevejobs с лора разрешил.

В общем, идея понятна, теперь можно приступать к критике :)

Привет.

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от lazy_aleks

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

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

1. Не совсем верная постановка вопроса. Не правильно писать код под специфику JIT, конкретную реализацию виртуальной машины, под что угодно, что не является частью спецификации jvm.

2.В хотспоте TCO нет и непонятно когда будет. Т.к. реальная необходимость в этом есть только для функциональных языков JVM.

dycore
()
Ответ на: комментарий от anonymous

Параллельность - это о том, что вот мы взяли одну задачу, и нужно ее как-то побыстрее выполнить, для этого мы раскидываем ее на кластер или что-то такое. Конкурентность - это когда у нас есть много разных задач, которые выполняются одновременно и конкурируют за общие ресурсы (eg shared mutable state).

Иначе говоря, конкурентность - это problem domain, неотъемлемая характеристика предметной области. А параллельность - это solution domain, способ решить проблему медленной скорости вычислений.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от slyjoeh

Лучше, когда для парсинга даты не выбирают кучу фреймворков, которые потянут весь maven central (утрирую).

Не так уж и далеко от истины, именно по датам я такое видел, бред полный. Когда заведомо на 100% известен формат строки дата/время, ибо задан ранее в этом же проекте, для парсинга тянут в проект кучу библиотек, вместо того что бы воспользоваться обычным substr. Итого: куча лишнего говна, плюс уменьшение скорости работы.

anc ★★★★★
()
Ответ на: комментарий от lazy_aleks
Seq<Long> xs = Seq.of(1L, 2L, 3L, 4L, 5L, 6L);
Seq<Long> ys = Seq.of(1L, 2L, 3L, 4L, 5L, 6L);

xs.zip(ys).filter(xy -> !xy.v1.equals(xy.v2)).collect(toList());
anonymous
()
Ответ на: комментарий от umren

и тут залетает Галочка из бухгалтерии

«Заводите тикет, будет обрабатываться в режиме очереди в зависимости от приоритета» и да, наймите уже QA.

С «Галочкой из бухгалтерии» может и сработает, но вот когда вместо нее кто-то из «биг боссов» уже нет. Сам проходил такое, и много раз, хуже всего в этом случае то, что еще и программистов приходилось заставлять выполнять такие поручения. Ведь и сам знаешь, что нафиг не нужно и в скором времени эта же фича уже будет в другом проекте, но нет, надо сейчас и здесь наговнокодить.

anc ★★★★★
()
Ответ на: комментарий от umren

Как это? в мелкософтовском мире как раз нету кучи гавна, а есть ряд стройных ГОВНОфреймворков и ГОВНОтехнологий на которых ГОВНОпишут

Исправил.

anc ★★★★★
()
Ответ на: комментарий от stevejobs

Самый большой мой проект был Госуслуги

Так вот кому еб^ бить «спасибо» сказать за эти порталы. :)
По серьезному, с прошлого года пришлось столкнуться с народом разрабатывающим софт (не портал, а внутренний софт) в мск, очень удивлен, насколько адекватный и грамотный народ, реально респект, давно в ынтерпрайзе с такими не сталкивался, причем как со стороны заказчика так и со стороны подрядчика.

anc ★★★★★
()
Ответ на: комментарий от anonymous

Там выше написано задание. Xml'ки по 150 мб.

XML схема для обоих документов одинаковая.Ноды не упорядочены, как и атрибуты как и дочерние ноды.Id есть у всех нод дочерних к Root node. Нужно выдать ноды отсутсвующих в первом, втором документе, ноды одинаковыми Id но с любыми отличиями на любом уровне вложенности. Точно не помню, но по моему у node с ID могут быть дочерние с атрибутами но глубже вложенность не идет.

На шарпе это пяток строк и пара секунд выполнения. Дерзайте!

lazy_aleks
()
Ответ на: комментарий от lazy_aleks

Я не работаю в Microsoft, и это инсайдерские данные многолетней давности, не уверен что это вообще стоило говорить.

stevejobs ★★★★☆
() автор топика

Уж больно много взаимно исключающих параграфов) ))

ii8_ ★★★★
()
Ответ на: комментарий от stevejobs

StackOverflow большой сайт на .NET. Вполне себе хайлоад.

Legioner ★★★★★
()
Ответ на: комментарий от stevejobs

Вот есть у нас конкурент - эрланг

ты должен мне новый монитор. этот полностью затёк жиром.

anonymous
()

Никто не заставляет писать Factory которые производят Factory, которые производят Factory! Хочешь посмотреть, откуда берется объект, а там целый стектрейс на 50 этажей, можно блуждать пока не умрешь от голоду.

Как это знакомо.

sambist ★★
()
Ответ на: комментарий от stevejobs

Джависты обычно специализируются на нестандартных решениях. В частности написании сложного конкурентного-параллельного кода

сам то в это веришь? джависты в основном сидят в бодишопах и интеграторах и пилят n-ый проект на спринге в 99% случаях.

Scala, Clojure, либы типа Akka - всё это на JVM

F#, Orleans, Akka.net - все это на .NET

и C# > Scala+Java вместе взятые, async и linq изкаропки, что ты будешь «добивать» фреймворками уже есть.

umren ★★★★★
()
Ответ на: комментарий от stevejobs

Джависты обычно специализируются на нестандартных решениях.

LOL.

anonymous
()
Ответ на: комментарий от umren

и C# > Scala+Java вместе взятые

пример.

linq - косой язык работы с коллекциями.

И вообще, как только появится возможность пробросить в async task исключение, дабы его безопасно завершить, придешь сюда и будешь эту лажу нести. А пока шарп - недоязык для гуятины под винду.

anonymous
()
Ответ на: комментарий от ados

ABCL на .NET нету.

Хорошая шутка, ну да ладно.

umren ★★★★★
()
Ответ на: комментарий от umren

ART поддерживается в JVM?

Этот вопрос вообще не имеет смысла. Но я понимаю к чему ты клонишь. Видишь ли, java не нашла широкого распространения в десктопном и мобильном сегменте. По этой причине, ей не нужен нэйтив, и сравнивать две эти платформы по этим параметрам неуместно.

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

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

То есть если бы я сделал такую классную утилитку для десктопа на JavaFx, то возможности ее запускать без старта и наличия JVM нету, мда.. я бы лучшего мнения о Java мире.

umren ★★★★★
()

и не лень было столько говна пейсать?

emulek
()
Ответ на: комментарий от umren

То есть если бы я сделал такую классную утилитку для десктопа на JavaFx, то возможности ее запускать без старта и наличия JVM нету, мда.. я бы лучшего мнения о Java мире.

Не делай классные десктопные утилитки на java.

RedPossum ★★★★★
()
Ответ на: комментарий от umren

Ты лучше и правда скажи, как в твоём чудо шарпе безопасно завершить асинхронный таск? (т.е. задиспозить все диспозабалы, как минимум)

RedPossum ★★★★★
()
Ответ на: комментарий от umren

что ты будешь «добивать» фреймворками уже есть.

имхо, в данном случае это добро. Вместо того, чтобы замусоривать базовый язык, нужно его делать максимально настраиваемым. И подключать возможности под конкретную задачу. Лучше всего вот именно чтобы даже конструкции языка подключались отдельными библиотеками. И чтобы в самом базовом языке почти ничего не было. Хочешь парсить текст - подключаешь DSL для парсинга текста, хочешь юзать акторы и синтаксис посылки сообщений - подключаешь DSL акторов, хочешь писать BDD тесты прямо в языке программирования - подключаешь DSL bdd-тестов, у тебя синтаксис изменяется под нужную задачу. Вот так правильно. А замусоривать язык всем что надо и не надо - это фу.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от umren

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

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от umren

так зачем им натив, если и без натива всё отлично работает? Наверное всё таки джит говно, а? :) Кстати, покажи симки под управлением .NET, интересно.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Обычная джава имеет мало общего с той джавой, что в симках.

lazy_aleks
()
Ответ на: комментарий от stevejobs

Натив нужен для того, чтобы лучше работал на мобилках/планшетах. Где же ваша хваленая жабная кроссплатформенность? Где жаба на мобильных виндах? Ох, как неожиданно, но «некроссплатформенный» шарпец охватывает больше платформ.

lazy_aleks
()
Ответ на: комментарий от stevejobs

Наверное всё таки джит говно, а? :)

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

Так что продолжайте не замечать бревно в своем глазу какая убогонькая жабка ваша, если с такой простой задачей справиться не можете. Дело 5 минут.

lazy_aleks
()
Ответ на: комментарий от stevejobs

Java это кроссплатформенность. Native в мире Java считается недостатком. .NET изначально был исключительно Windows-only. В Windows существует огромный пласт функционала (WinAPI и другие библиотеки), которые просто глупо переписывать в .NET, если он уже написан и за 30 лет отшлифован до блеска. Поэтому в .NET интероперабельность с native важна и хорошо сделана, а в Java этому не уделяется много внимания.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Native сделали для большей производительности universal apps, что критично, но джава такое не надо, т.к. она не умеет в мобильную кроссплатформенность.

lazy_aleks
()
Ответ на: комментарий от Legioner

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

lazy_aleks
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.