- 1
- 2
- 3
public void read(InputStream is) throws Exception {
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−51
public void read(InputStream is) throws Exception {
...
}
Когда человек совсем не уверен в себе
rotretS 27.11.2016 13:19 # −1
И вообще, что за манера, кидать одну строчку кода!
Hanazono-Satoshi 28.11.2016 21:44 # −1
bormand 28.11.2016 21:48 # 0
Вот именно! А клиенту метода теперь придётся ловить (или прокидывать дальше) этот сраный экцепшен, с которым он ничего путнего сделать не сможет.
barop 28.11.2016 21:51 # −1
bormand 28.11.2016 22:03 # −1
barop 28.11.2016 22:08 # −1
bormand 28.11.2016 22:13 # −1
http://govnokod.ru/14254
barop 28.11.2016 22:15 # −1
В апаче коммнос даже closeSilently завезли
но ты и сам контракт нарушил: зачем ты клозишь стрим после IOException?
bormand 28.11.2016 22:17 # −1
Ткни носом, где. Разве что flush() не позвал перед close(). Но кто ж знал, что close() у FilterOutputStream молча жрёт исключения (хоть и throws IOException)...
barop 28.11.2016 22:24 # −1
bormand 28.11.2016 22:26 # −1
barop 28.11.2016 22:28 # −1
Это не ты контракт нарушил, а джависты: нельзя ничего делать со стримом после того что он кинул exception.
Ну и пидары-же
-------
или не пидары?
из close полетит excception?
bormand 28.11.2016 22:30 # 0
barop 28.11.2016 22:33 # −1
Сам попробуй
А раз нежрет то и проблемы нет. Ща проверю была-ли она в седьмой
------
Да, в седьмой именно так)
Ну ок, значит стримы научились юзать только к восьмой джаве
bormand 28.11.2016 22:35 # −1
barop 28.11.2016 22:35 # −1
Выходит что в 6-7 джаве джависты сами насрали на свой контракт
Hanazono-Satoshi 28.11.2016 22:24 # −1
guest 28.11.2016 23:04 # 0
Hanazono-Satoshi 28.11.2016 23:08 # −1
barop 28.11.2016 23:10 # −1
Смелая армия просто геройская.
Непобедимейшее войско.
В самом жестоком бою.
Припев:
А я обосрался в строю!
Все коммунисты и все комсомольцы.
Нужно подохнуть вперед добровольцы.
С песнями рота идет.
Только вот я не пою.
Припев:
Я обосрался в строю!
Родина мама спи не ворочайся.
Сыны твои гордо на стреме стоят.
Дали мне тоже большой автомат.
Стой говорят я стою.
Но вот обосрался в строю
Hanazono-Satoshi 28.11.2016 23:17 # −1
barop 28.11.2016 23:22 # −1
и убивать
убивать
roman-kashitsyn 29.11.2016 00:14 # −1
Вообще говоря, чекед-эксепшены -- принципиально унылое говно и попоболь. Их невозможно готовить правильно, нету языковых средств.
Вот хочешь ты, к примеру, написать функцию высшего порядка, в которую коллбэк передается. Какое исключение должна кидать эта функция высшего порядка? Это зависит от того, что кидает коллбэк. Как в языке выразить мысль, что метод кидает то же самое исключение, что кидает его функция-параметр? Никак.
Разве джависты пишут функции высшего порядка, спросите вы? Конечно пишут, только не знают об этом. Особенно, теперь, когда им лямбды с потоками подарили.
Помню как-то визитор по простенькому "AST" запилил. Какое исключение нужно бросать из visit у объекта? А хрен его знает. Зависит от того, что бросает визитор.
Захотел сконвертить дерево в JSON или распечатать в поток -- пиши унылые обёртки, которые конвертируют IOException во какой-нибудь специальный RuntimeExeption, и обёртку, которая достаёт родное исключение обратно.
Лютое количество бойлерплейта для простой, казалось бы, задачи.
barop 29.11.2016 00:22 # −1
1) выйти из метода
2) вернуть null или передать ссылку на результат (ах да, в жабе так нельзя), но это не заставит тебя проверить результат и можно легко проебать ошибку, да и писать 10 ретурнов не всегда комильфо.
Если в рантайме у тебя отвалился диск или удаленный сокет или от пользователя пришел мусор, то эксепшен будет ебать мозг пока его либо его ЯВНО не поймают, либо он угандошит весь тред (ну или весь реквест в случае серверов), и это очень круто, просто у этого есть одно узкое применение.
Джависты пишут функции (особенно с тех пор как туда завезли лямбды), но вот именно там чекдэксепшены красиво не заюзать, увы. Это проёб.
Рантайм эксепшены вообще нужны для совсем другого, они просто случайно "так же называются" и сигнализируют о нарушении контракта. Их не надо ловить (разве что если они летят из плагина) а надо пиздить программиста по голове. В идеале они вообще не должны быть Exception, а должны быть Error
roman-kashitsyn 29.11.2016 00:32 # −1
Проблем от них гораздо больше, чем пользы, вот в чём поинт. Нормальные пацаны не выпендриваются, не плодят лишные сущности и энкодят ожидаемые ошибки в типе возвращаемого значения.
barop 29.11.2016 00:37 # −1
Тогда нужно на выбор
1) везде вертать туплу (Pair<Result, Error>)
2) в классе Object сделать поле lastError (щтоб он автоматом везде был)
3) научиться принимать указатель на объект чтобы заполнять его ошибкой.
Третий пункт очень любят яблочники в Objc:
Какой из этих вариантов тебе менее противен? Ну или предложи свой
roman-kashitsyn 29.11.2016 00:48 # −1
StatusOr<T>
Or_error в Ocaml, MonadError в Haskell.
Подход Go тоже вполне сносен.
barop 29.11.2016 00:53 # −1
Я подумаю еще до чего доебаться)
roman-kashitsyn 29.11.2016 01:02 # −1
Александреску про него как-то рассказывал
barop 29.11.2016 01:14 # −1
Ох, сколько же времени прошло прежде чем люди поняли как правильно хендлить ошибки, да?
Тернист путь от errno/GetLastError
wvxvw 05.12.2016 19:37 # +1
Ну в Го вообще ничего хорошего нет, кроме горутин. Но ошибки там - это вообще эпический пиздец. Это так плохо, что даже Вижуал Басик покажется нормальным языком.
С другой стороны, на Го пишут либо дети которые хотят (хотели) прославится на Гитхабе, либо люди, которые повелись на красивую рекламу, и теперь не знают, как от этого говна избавиться. Все без исключения библиотеки на Го такого хуёвого качества, что даже Нода и ПХП на их фоне выглядят надежными и провереными временем.
Посмотреть на код того же Докера, etcd, Тераформ. О, Тераформ, это отдельный пиздец, который даже в горячечном бреду невозможно представить. Так можно в кровавых слезах утонуть. И не в последнюю очередь изза "работы с ошибками".
Начнем с того, что, если по-честному, в Го нет ошибок, как концепции. Есть какая-то хуйня под названием error, которя никого ни к чему не обязывает. И есть убогий механизм для работы с крешами програмы, который даже до уровня trap в Баше не дотягивает. И это, блять, при активно использующейся многопоточности и отсутствующем отладчике.
Изза того, что механизма бросания ошибок нет, нет и стектрейсов, и каждая библиотека дрочит как хочет, но в 90% случаев стектрейсов просто не будет. А в остальных 10% они будут указывать в произвольные места в програме.
Изза отстутсвия каких либо средств для работы с языком, однострочники в Го разрастаются в полотна бессвязных if err != nil { return err }. Статистика по моему проекту:
А вот билт-ин говно:
Из нашего отдела люди готовы уходить с понижением зарплаты туда, где пишут на Питоне, лишь бы только это говно не видеть.
bayan 05.12.2016 19:38 # +2
>>Из нашего отдела люди готовы уходить с понижением зарплаты туда,
Когда я работал программистом в маленькой психиатрической больнице (С)
roman-kashitsyn 05.12.2016 19:56 # +3
Вообще говоря, нет, не факториал. Веб-приложение -- аналог https://kapeli.com/dash, которое индексирует локальные доки (либу для парсинга я писал на сишке, в го использовал FFI) и позволяет делать fuzzy-поиск (на биграммах) по документации с динамической подгрузкой результатов. Честно говоря, я в основном упирался в тормознутость стандартных структур данных из-за отсутствия нормальных шаблонов. Ручной инлайнинг ускорил тогда мой поиск в 8 раз.
В последнее время я мало пишу на Го (в основном на C++), но воспоминания в основном положительные. В плане обработки ошибок подход у нас аналогичный.
> нет и стектрейсов
Это большая проблема, очень серьёзная. В C++ тоже стектрейсов нет из коробки. Можно сбоку прикрутить при большом желании, но большинство этим не занимается.
Когда пишешь асинхронный код, стектрейсы вообще бесполезны -- коллбэки дёргаются из реактора, интересного в них ничего не увидишь.
> где пишут на Питоне
О да, больше всего на свете я "люблю" программы на питоне, которые в любой непонятной ситуации кидают в меня Key/Value/WhateverError. Возможно, стектрейс поможет разработчику ткнуть пользователя в нужную строчку документации или понять, где он накосячил в типах, но никак не поможет ему побороть свою неспособность нормально обрабатывать ошибки. Пользователю они скорее мешают.
Универсальное средство обработки ошибок -- это миф, исключения им не являются.
bayan 05.12.2016 20:05 # 0
А плохие программы (в случае мусора на входе) дают говно.
Нативная программа дает General Protection Fault.
Программа на питоне дает KeyError.
Жаба дает NPE и 150 строк маловразумительных трейсов
Итд
roman-kashitsyn 05.12.2016 20:07 # +2
Охотно верю. Жаль, что мне такие практически не попадались.
bayan 05.12.2016 20:15 # 0
bormand 05.12.2016 21:13 # 0
Да ты их даже в пыхе не увидишь, если сервер правильно настроен... Кто в 2016 году ошибки в браузер срёт?
roman-kashitsyn 05.12.2016 21:54 # +2
Яндекс.Музыка
inkanus-gray 06.12.2016 00:00 # 0
bayan 05.12.2016 21:58 # 0
отак с ходу
https://toster.ru/q/61278
1024-- 05.12.2016 20:18 # 0
Это задача того же уровня, что и построение полного (совсем полного) списка уязвимостей системы.
roman-kashitsyn 05.12.2016 20:22 # 0
Я уже говорил, что не против исключений в случае ошибок программиста (в go для этого есть panic).
Правда, в C++ для этого полезней крэшится -- можно потом в core-дампе как следует поковыряться, ибо стэк-трейс зачастую не содержит информации, которая поможет исправить ошибку.
bayan 05.12.2016 20:26 # 0
"программа содержит ошибку и будет закрыта, напишите программисту"
roman-kashitsyn 05.12.2016 20:20 # 0
Go сам по себе программистов не исправит. Тот, чья стратегия обработки ошибок заключалась в ловле всего что можно в main и печати в stdout, так и будет писать при любом удобном случае if err != nil { return err } и ругать Go. Иногда return err -- это именно то, что нужно. Часто имеет смысл вернуть новую ошибку, с описанием того, что пытались сделать, с какими аргументами, и почему не получилось. "Exception translation", только с менее громоздким синтаксисом и более полезными для пользователя сообщениями.
wvxvw 05.12.2016 20:29 # 0
А про асинхронный код: да, насмешил. Бесполезные говоришь. А что ошибки никогда искать и исправлять не приходилось? Просто потому, что в Го этого практически нереально добиться, не переписав рантайм с нуля - тебе просто в голову не прийдет, что это вообще возможно. А оно ведь все тут, рядом, и существует уже много лет.
А ты не подумал, что над разработкой програмы, и над чтением ее стектрейсов вызваных некорректным поведением програмист проводит 99% от рабочего времени? И что без этой информации, програма вообще никогда не попадет к твоему чисто теоретическому заказчику?
В соседнем отделе, продукт, аналогичный нашему писало два человека на Питоне. (В моем отделении нас было шестеро, но двое уволились, и еще двое перешли в другие отделы). Они все сдали и уехали в Аргентину на месяц курить гашиш, а у нас что ни неделя, то добалвяется 100-200 if err != nil. Потому, что билт-ин библиотека - говно. Чужие библиотеки - говно. В своем коде невозможно проследить логику выполнения изза того, что приходится бороться с некорректной работой всего остального.
Я молюсь чтобы меня перевели либо на Питон, либо на Руби. Я бы даже на Яве писал, лишь бы это говно больше никогда не видеть.
bayan 05.12.2016 20:39 # +2
--Докажи
--Ну у нас на Language1 программу написали быстрее, чем на Language2.
У Сёмы достойный конкурент
3_14dar 05.12.2016 22:41 # +1
>--Ну у нас на Language1 программу написали быстрее, чем на Language2.
Значит она им дешевле вышла, понимаешь? ДЕНЕШКИ. В мире апинсорса такого нет.
bayan 05.12.2016 22:43 # +2
--ахахаха openssl не используют в серьезных конторах
--докажи
--ну я слышал что в amazon его не используют
--хахаха l2tp не настроить в линуксе
--докажи
--ну я чатился с долбоебом который не осилил l2tp в freebsd
Вы с wvwvwcwv два сапога пара
3_14dar 05.12.2016 22:52 # 0
>--докажи
>--ну я чатился с долбоебом который не осилил l2tp в freebsd
Сама додумала, обезьянка? Где я это утверждал?
>--ахахаха openssl не используют в серьезных конторах
>--докажи
Хром. Существование форков.
bayan 05.12.2016 22:57 # +1
http://govnokod.ru/21736#comment360570
>>Хром. Существование форков.
Cryptography Functions из Windows не используются в Chrome под Mac OS X. Следовательно, Windows Crypto API не используется в серьезных проектах.
Бугага.
3_14dar 06.12.2016 02:38 # 0
>http://govnokod.ru/21736#comment360570
Где ты там прощел "l2tp не настроить в линуксе" и "l2tp в freebsd"? Конкретно эти цитаты приведи, питушок косоглазый.
barop 06.12.2016 02:48 # +3
В том числе он не мог в L2TP. Когда я попыталася рассказать тебе о прелестях L2TP на винде, ты начал нести нелепые отмазки про какого-то неосилятора, который не смог L2TP во фрибзд.
Тут дело даже не в том, что FreeBSD не имеет отношения к линуксу (незнание этого факта я тебе прощаю, ты и более простые вещи не знаешь), а в том что для доказательства утверждения "Foo это сложно" ты приводишь аргумент "питушок не смог Foo".
Это характеризует только петушка. Ну и тебя, как человека который с ним общается.
guest 06.12.2016 03:19 # +1
bayan 05.12.2016 22:46 # 0
Мне даже лениво объяснять насколько не в тему тут это твое глупое замечание.
3_14dar 05.12.2016 22:53 # +1
Ясно.
bayan 05.12.2016 23:38 # +3
Наверное нужно последние 15 лет прожить в пузыре, чтобы всерьез думать что в линуксах драйверы компилируют вручную, а опенсурсные разработчики не получают зарплату.
Люди в RedHat, Apple и Google, разработчики Android, Darwin, llvm -- им всем ужасно приятно будет узнать что они не получают зарплату.
bormand 05.12.2016 22:54 # +1
> значит она им дешевле вышла
Ахуенная логика.
3_14dar 05.12.2016 22:56 # 0
bormand 05.12.2016 22:58 # 0
В выводе, достойном британских учёных - "если программу написали быстрее, то она им дешевле вышла".
3_14dar 05.12.2016 23:01 # 0
bayan 05.12.2016 23:02 # 0
И что программисты в мире опенсурса тоже получают зарплату.
А потом ты научишься читать, почитаешь первоначальный высер своего брата по разуму, и узнаешь что деньги и скорость написания тут вообще не причем
bormand 05.12.2016 23:05 # +1
И что зарплата у разных программистов, внезапно, разная... И что сложность программ могла отличаться...
> она тоже не бесплатна
Скупой платит джважды ;)
3_14dar 06.12.2016 02:42 # 0
Как на это влияет ЯП? Я имел в виду написать ту же программу с тем же качеством. Если ее можно написать быстрее, то почему нет?
bormand 05.12.2016 23:09 # +1
Т.е. премий и повышений у вас там не бывает? :) Грустно как-то...
guest 06.12.2016 16:05 # 0
defecate-plusplus 06.12.2016 17:05 # +2
guest 06.12.2016 17:13 # 0
roman-kashitsyn 06.12.2016 17:17 # +3
Go виноват?
guest 06.12.2016 17:21 # +1
defecate-plusplus 06.12.2016 17:25 # +1
но я бы не сказал, что сейчас на рынке труда всё плохо
bayan 06.12.2016 21:17 # 0
guest 06.12.2016 21:28 # 0
bayan 06.12.2016 23:12 # +2
Ну поищи контору которая тебе нравится, узнай что ей надо и выучи.
А то вот так люди страдают до тридцати пяти лет, а потом оказывается что лет им уже много, а кроме просиженных штанов опыта и нет.
guestinho 07.12.2016 01:46 # 0
3_14dar 07.12.2016 04:38 # 0
barop 07.12.2016 04:40 # 0
Можно сказать 42 или 29.
AnalniyTerzatel 07.12.2016 05:11 # −1
O____O 07.12.2016 13:36 # −1
1024-- 06.12.2016 01:47 # 0
По количеству фич? По количеству программистов? По количеству проектов? По математической каноничности? По строчкам кода для решения эталонной задачи? По количеству правил грамматики?
Тут хотя бы человек публикует данные, каким-то образом относящиеся к реальности.
barop 06.12.2016 02:29 # +1
да
>>По количеству программистов?
нет
>>По количеству проектов?
да
>>По математической каноничности?
не очень
>> По строчкам кода для решения эталонной задачи?
да
>> По количеству правил грамматики?
не очень
>>каким-то образом относящиеся к реальности.
Один мой знакомый ходил в синей кепке, и его сбила машина.
А другой ходил в красной и его не сбила.
Отсюда я делаю вывод что синие кепки носить опаснее.
roman-kashitsyn 05.12.2016 20:40 # +3
Собственно, это основная часть моей работы -- чинить нетривиальные ошибки. Когда люди нормально обрабатывают ошибки, ты либо сразу понимаешь, в чём проблема (даже не открывая сорцов), либо вставляешь кусок текста ошибки в git grep/code search и практически сразу находишь нужное место.
Кстати, ты может раньше не замачал... Твои доводы на 96% состоят из эмоций и не содержат информации для размышления.
subaru 05.12.2016 21:33 # 0
bayan 05.12.2016 21:51 # +1
Багинтродьюсеры делают баги, а багфиксеры их правят.
так и живут.
subaru 05.12.2016 21:53 # −1
bayan 05.12.2016 21:55 # 0
subaru 05.12.2016 21:59 # −1
bayan 05.12.2016 22:01 # +1
subaru 05.12.2016 22:02 # −1
bayan 05.12.2016 22:04 # 0
Видимо ты пытаешься перенести свое доширачерство на галерах на гугл.
Этакий обратный карго-культ.
roman-kashitsyn 05.12.2016 22:29 # +1
Я каждое утро прихожу на работу, открываю логи сервиса, и создаю баги на все крэши и ERROR записи, которые считаю ошибкой. Часть назначаю на ответственных, часть чиню сам.
Мне вообще стрёмно писать новый код, пока старый делает хрен пойми что.
Ты так не делаешь, @subaru?
bormand 05.12.2016 22:32 # +4
Прям начало копипасты о Воване.
guest 05.12.2016 23:14 # 0
wvxvw 06.12.2016 13:54 # 0
По поводу метрик, и почему раньше сделаный продукт в соседнем отделе - это показательно.
Потому, что, как я уже говорил, продукт аналогичный. Наш отдел пишет инфраструктуру для тестов, другой отдел пишет инфраструктуру для самой системы. Под инфраструктурой понимается установка, настройка, отладка, аггрегация статистики и первичный анализ.
Наши задачи очень похожи, и по объему и по назначению.
Код написаный на Питоне вызывает минимум проблем: за последние три месяца в ночных сборках + тестах этот код проявил себя всего два раза (один раз забыли добавить какую-то программу в системный путь, и другой раз поменялся механизм раздачи SSH ключей в кластере, который они не предусмотрели).
Код написаный на Го вызывает проблемы раз в два-три дня. С банальными ошибками, которые прошли мимо код-ревью потому, что на Го можно писать только говнопортянки, и просто нету достаточно человек, чтобы уделить достаточно внимания чтению этого бреда. Ошибки типа: после парсинга Ясона забыли проверить длину массива. Перепутали местами строчку с сообщением об ошибке и строчку, где предполагается, что ошибка уже обработана. Ну, и иногда билт-ин АПИ подсыпает всяких крашей в абсолютно безобидных местах. Типа "попытка закрыть уже закрытый канал, блять" - очень серьезная ошибка изза которой програма закрывается без строчки логов.
roman-kashitsyn 06.12.2016 14:15 # +1
Нет, я же написал, что понимаю под нормальной обработкой ошибок -- внятное семантическое описание проблемы, понятное пользователю, вместо унылых стектресов. Например, довелось мне как-то запускать чей-то питонокод, обучающий классификатор. Через пару минут работы обучателя вываливался невнятный стэктрейс из глубин skikit-learn с сообщением ValueError: 1 < 2. Оказалось, что обучающий набор был кривой и содержал только примеры с одной меткой. Нормальной обработкой ошибок я бы назвал сообщение "Your training set contains only 1 label, the classifier expects at least 2. Check your data." Это сообщение бы мгновенно указало мне на мою проблему, и мне не пришлось бы пару часов изучать кишки skikit, чтобы понять, как я пришёл к 1 < 2.
> это показательно.
Это было бы показательно, если одни и те же люди, имеющие одинаковую экспертизу в обоих языках, писали одно и тоже. Откуда мне знать, какие вы там профессианалы, если вы каналы по два раза закрываете.
> парсинга Ясона забыли проверить длину массива
В питоне такую ошибку, несомненно, невозможно допустить.
> Перепутали местами строчку с сообщением об ошибке и строчку, где предполагается, что ошибка уже обработана.
Исключения, очевидно, решают эту проблему.
> безобидных местах. Типа "попытка закрыть уже закрытый канал
Это в основном показывает, что вы не умеете в понятие "владение ресурсом". И да, это означает ошибку программиста.
> програма закрывается без строчки логов.
Чего? Паника происходит. Если вы не печатаете её в лог -- это ваша проблема.
panic: close of closed channel
wvxvw 06.12.2016 15:25 # 0
Тебе о профессионализме не судить, если ты думаешь, что это очень нужный краш при повторном закрытии канала. Краш всей программы, Карл! Нахуй нужен такой close() в высокоуровневном языке с потоками и селектами? Просто у этих долбоебов "так получилось", вот поэтому так и работает. Они не планировали, не думали о том, как лучше сделать. Налабали какой-то хуйни и в продакшн. Благо, все, что они делают - для внутреннего пользования, а там видимо инженерам нечем руки занять, вот и тестируют. Вот и пишут ёба-недоинерпретаторы Питона на Яве для сборок своих проектов и подобную хуету.
Я же говорю, что в Го эти тривиальные ошибки тяжело найти изза того, что код размазан на 100500 строк бессмысленной повторяющейся хуйни. Ревьюер не в состоянии читать одно и то же, и не ошибаться никогда.
Да чего там дальше объяснять... Ну, вот, продукт "известной" компании. Типа хай-энд продукт. Семинары, платные специалисты, все дела: Твои же братья-долбоебы написали. У меня просто руки опускаются, когда мне говорят, что мне нужно это говно использовать в своем проекте. Они, блять, ошибки все одного типа возвращают, принтэфами. Без стак трейсво. Полотно из функций на 200 строк. Пидарасы. Уебаны. Слов нет.
subaru 06.12.2016 15:35 # 0
Мне бы твои проблемы. У меня тут функции по 2к строк очень плохого спагетти. Хнык :'(
guest 06.12.2016 15:38 # +3
bayan 06.12.2016 16:02 # +1
Попробуй PHP, серьезно. Там можно и файлы 2 раза закрывать, и к неинициализированным переменным обращаться.
Главное собачку поставить в начале.
Вообще управление ресурсами и памятью это скучно. Лучше всегда рандомно выделять память и освобождать её, захватывать ресурсы и отпускать. Пусть ЯП и его рантайм сам обо всем позаботятся
roman-kashitsyn 06.12.2016 16:04 # +2
Ну ок, давай посмотрим глазами трезвого человека на то, что ты написал.
В соседнем отделе люди пишут на питоне, и не ноют, и вообще всё давно сделали. У вас много детских ошибок: потерянные проверки, перепутанные местами педали строки, не знаете, кто владеет каналами, не печатаете паники в лог. Вы ноете и хотите уволиться. И виноват в этом, разумеется, Go. Потому что там писать много надо.
Нет, ну всякое бывает, я тоже раз в год continue в каком-нибудь цикле забываю в чейнджлисте на 100 строк, и ревьюер этого не замечает, но язык-то тут причём.
> повторном закрытии канала
Повторное закрытие канала в "в высокоуровневном языке с потоками и селектами" это потенциальный рейс кондишен. Вероятно, две горутины конкурентно гадят в один канал, и не знают, кто его должен закрыть. Лучше просигналить эту ошибку сразу, чем ждать, пока через полгода что-нибудь закрэшится при попытке записи в закрытый канал.
Если ты так не считаешь, то вам следовало писать на PHP: там можно делить на нуль и игнорить ворнинги.
> ошибки все одного типа возвращают
И чем тебе помогут ошибки разных типов в этом случае? Ты напишешь код, который сам будет устанавливать отсутствующий сертификат, если получит MissingCertificateError? Видимо, тут все ошибки unrecoverable, код не сможет починить сам себя, требуется внимания программиста. На первый взгляд ничего откровенно плохого не вижу. В пистоне была бы такая же портянка, только отовсюду летел бы какой-нибудь KubernetesError или, ещё хуже, ValueError.
bormand 06.12.2016 19:09 # 0
> ревьюер не в состоянии читать одно и то же
Ну х.з. У нас вот тоже код с ручной обработкой ошибок (+RAII для всех ресурсов). Если кто-то где-то забывает обработать ошибку - на ревью это прям режет глаза, т.к. выбивается из общего стиля и нарушает однородность ;)
DypHuu_niBEHb 12.01.2023 00:37 # 0
сивоконь конечно редкостный апиздабол
inkanus_gray 12.01.2023 03:14 # 0
bormand 05.12.2016 21:19 # +3
> Чужие библиотеки - говно
A bad workman blames his tools.
subaru 05.12.2016 21:32 # +1
Как ты справляешься с такими ситуациями, борманд?
bormand 05.12.2016 21:47 # +1
> стектрейс
У тебя есть стектрейс и дампы. Мне бы твои проблемы...
> Как ты справляешься
Культурой кода - проверки указателей, ассёрты, RAII и т.п. Больше, походу, никак.
З.Ы. Хотя, после проезда по памяти, все эти коры и бектрейсы - просто бесполезный мусор, показывающий на какой-нибудь невинный код...
bayan 05.12.2016 21:50 # 0
Ты под ios пишешь чтоли? Это когда твоя программа упала у Васи и всё что ты знаешь это "твоя программа упала"?
subaru 05.12.2016 21:56 # 0
Ну это не очень полезный совет. "Чтобы программа не падала, надо просто не писать баги."
bormand 05.12.2016 22:00 # 0
Ну раз не хочешь ему следовать - пиши хуйню @ читай крешдампы до утра. Пока не обретёшь просветление.
CHayT 06.12.2016 18:14 # 0
Use Erlang @ Let it crash
guest 06.12.2016 18:22 # 0
CHayT 06.12.2016 18:26 # +2
Я вас умоляю. У нас две недели даётся на изучение с нуля вместе со всем ФП. Потом, конечно, некоторое время на гк наблюдаются "фирменные ревью от Снаута".
bormand 06.12.2016 18:30 # +1
У меня на прошлой работе гуйня для терминала так работала - сегфолтилась, супервизор её перезапускал, прога подтягивала стейт с сервака, обрабатывала кнопочки-датчики, отправляла стейт на сервак, рисовала новый фрейм, сегфолтилась... Сегфолт каждый кадр, но по ощущениям вполне нормально работало, просто трафика много на сервер. Заметил не сразу :)
CHayT 06.12.2016 18:37 # 0
bormand 06.12.2016 18:39 # 0
Тогда вообще бы не заметил?
З.Ы. Супервизором там был тупой sh скрипт с бесконечным циклом :)
CHayT 06.12.2016 18:46 # +2
Наоборот, через некоторое время супервизор отправил бы чайлда мыться под струю сам бы покрешился, ибо поддерживать сервис -- это хорошо, но поддерживать _неправильно_ работающий сервис -- немного другое.
> Супервизором там был тупой sh скрипт с бесконечным циклом :)
Это тогда не надзиратель, а сообщник.
bormand 06.12.2016 18:52 # 0
Т.е. в итоге самый главный супервизор понимает, что жизнь - тлен. И делает харакири себе и всем оставшимся в живых?
CHayT 06.12.2016 19:15 # +1
Именно. Если не помогает даже, скажем, рестарт на уровне кластера, главный супервизор говорит, мол, "вызывайте этих говнокодеров из отпусков, выходных и заказывайте им ведро вазелина, а я отправляю трафик в другой дц и ухожу в спячку".
wvxvw 06.12.2016 14:06 # 0
По-поводу чужих библиотек. Ну, взять тот же парсер для Ямла на Го. Это уебищная копи-паста из сишного кода, без понимания того, что происходит в оригинале. Он примеры с оф. сайта в половине случаев не может распарсить. А когда может - выбрасывает нужную информацию. Ну и кроме всего прочего - не потокобезопасный.
Есть, например генерилки для Трифта / Сваггера. Код сгенерированый для Трифта ни один линтер не пройдет, а кроме того, в сгенерированом коде не просто невозможна многопоточность, он вообще больше одного запроса одновременно обработать не может. В Сваггере сгенерированом полно string.ToUpper("POST") и т.п. хуйни. Они наверное вообще ни разу не смотрели на то, что генерировали. А до запуска дело вообще не дошло.
Из гугловского говна: реализация SFTP, но без сжатия. Зато они туда нахуярили асинхронную сборку и чтение файлов. Типа, можно читать файл одновременно с разных отступов. Но интерфейс у этого говна все-равно последовательный. Т.е. если попытаться патч написать для этого бесполезного говна, на это уйдет несколько месяцев.
А вообще, на говнокоде просто места не хватит рассказывать про всю уебищность библиотек на Го. Выше - только промиля из всего, что там творится.
bormand 06.12.2016 18:37 # 0
bormand 06.12.2016 18:44 # 0
3_14dar 06.12.2016 19:12 # 0
guestinho 07.12.2016 01:52 # +1
У гошников явный тренд писать все снуля на го. У них даже собственная реализация tls на го вместо опенссл.
bayan 07.12.2016 01:56 # +1
никому не рассказывай что у жабы и дотнета тоже есть такой тренд.
guest6 12.01.2023 04:33 # 0
ого, вот это реально стращно
bayan 06.12.2016 21:04 # 0
bormand 06.12.2016 21:06 # 0
Всего года на 3, если верить вики :)
А насчёт того, что фреймворк лучше - только последние. Второй тем ещё говном был. А первый - имхо, даже хуже жабы.
bayan 06.12.2016 21:12 # 0
И уж конечно он в тысячу раз лучше пхп
3_14dar 07.12.2016 04:37 # 0
Зачем они нужны?
bayan 07.12.2016 16:45 # 0
AnalniyTerzatel 08.12.2016 14:10 # 0
O____O 08.12.2016 14:53 # 0
guest 29.11.2016 00:38 # −1
barop 29.11.2016 00:39 # −1
В корпорации добра такие NDA что папа не горюй
guest 29.11.2016 00:40 # −1
barop 29.11.2016 00:46 # −1
Я вот слыхал что там до такой степени своя атмосфера, что даже кодстайлы у них не всегда совпадают с оф. рекомендациями (типа питонячьего pep8)
guest 29.11.2016 02:44 # −1
roman-kashitsyn 29.11.2016 13:26 # −1
Не совсем понятно, что ты ожидаешь услышать. Всё, что я могу рассказать, уже давно и так опубликовано и широко известно (собственно, поэтому я и могу это рассказать).
> Как без стл живется?
Кто сказал, что без стл? Либы тут отличные, кстати.
> Как процесс разработки устроен?
guest 29.11.2016 13:34 # −1
Ну я в общем не настаиваю. Если нет охуительных историй, то и не надо.
guest 29.11.2016 14:17 # −1
guest 29.11.2016 14:44 # −1
guest 29.11.2016 15:57 # −1
barop 29.11.2016 15:46 # −1
>> master, XP coach…) it was possible to carefully
>> introduce agile practices into Google
Круто:) Я единожды видел скрам в аутсорсе. Продуктовые компании редко его умеют. Гугл молодец
CHayT 29.11.2016 16:06 # −1
barop 29.11.2016 16:07 # −1
CHayT 29.11.2016 16:10 # −1
barop 29.11.2016 16:11 # −1
--добавили в беклог, попробуем впихнуть в следующий спринт на планировании
Пленниг покер: сколько времени займет замена мыши?
CHayT 29.11.2016 16:13 # −1
barop 29.11.2016 16:26 # −1
bormand 29.11.2016 06:40 # −1
guest 29.11.2016 11:35 # −1
roman-kashitsyn 29.11.2016 13:14 # −1
> с исключениями в уме
Лол, в каком месте? Весь STL exception-agnostic, iostreams вообще унылое говно на флажках.
bormand 29.11.2016 17:35 # −1
Все контейнеры stl, которые никак не могут просигналить об out of memory. Разве что тупо abort()'ом.
guest 29.11.2016 17:40 # −1
bormand 29.11.2016 17:54 # 0
А на линупсе оно вообще редко прилетает... Скорее OOM киллер кого-то убьёт в подворотне, чем ядро признается в недостатке памяти.
dxd 29.11.2016 18:19 # −1
roman-kashitsyn 29.11.2016 17:42 # −1
std::set_new_handler
bormand 29.11.2016 17:43 # −1
guest 29.11.2016 17:45 # +3
roman-kashitsyn 29.11.2016 17:49 # +1
Вызов Borg, который перезапустит бинарник на машине с большим кол-вом RAM.
bormand 29.11.2016 17:52 # −1
barop 29.11.2016 18:48 # −1
guest 29.11.2016 17:42 # −1
roman-kashitsyn 29.11.2016 17:48 # 0
Какова вероятность, что некая строка является валидным числом? Небольшая. Значит, ошибка в этой функции вполне ожидаема. Если ошибка ожидаема, какое-же это тогда "исключение"?
Разумеется, для этого есть вменяемые эквиваленты, возвращающие StatusOr<T>.
guest 29.11.2016 17:52 # −1
roman-kashitsyn 29.11.2016 17:58 # −1
Ну ок, ты нашёл пару функций в стандартной библиотеке, которые зачем-то кидают исключения.
Я всё же утверждаю, что большая часть кода там exception-agnostic (контейнеры, алгоритмы, стримы, сишные легаси, етц). А то, что не агностик -- не нужно.
От bad_alloc никуда не денешься, но там можно просто крэшится, большинство приложений не могут обработать эту ошибку.
guest 29.11.2016 18:47 # −1
А я утверждаю, что такой хуйни там навалом. А еще есть буст.
roman-kashitsyn 29.11.2016 19:30 # −1
Ок, продолжай утверждать.
А я и дальше буду юзать умные указатели, *map, vector, string, подмножество буста, етц.
bormand 29.11.2016 19:32 # −1
roman-kashitsyn 29.11.2016 19:40 # −1
Нам оно без надобности, у нас тут свои эпичные конфиги.
guest 29.11.2016 19:45 # −1
> string
http://en.cppreference.com/w/cpp/string/basic_string/at
http://en.cppreference.com/w/cpp/string/basic_string/insert
http://en.cppreference.com/w/cpp/string/basic_string/erase
http://en.cppreference.com/w/cpp/string/basic_string/append
en.cppreference.com/w/cpp/string/basic_string/replace
http://en.cppreference.com/w/cpp/string/basic_string/substr
http://en.cppreference.com/w/cpp/string/basic_string/copy
defecate-plusplus 29.11.2016 21:57 # −2
так ты хвалишься или жалуешься?
guest 29.11.2016 22:34 # −1
Касательно моей оценки ситуации:
- Исключения - говно. Я бы хотел, чтобы в плюсах их не было.
- Гугл - заебись. Это плохо, что я не работаю там CTO.
AnalniyTerzatel 29.11.2016 22:45 # −1
roman-kashitsyn 29.11.2016 23:09 # −1
Все перечисленные методы кидают правильные исключения (в отличие от stol). Причина выбрасывания этих исключений -- халатность программиста. Перечисленные методы можно спокойно вызывать в любом гугловом коде, просто ошибка в коде приведёт к std::abort().
> По этой же причине я не буду следовать этому стайлгайду.
Можно подумать, тебя кто-то заставляет.
barop 29.11.2016 23:10 # −1
Исключений в том смысле, в каком они используются в Objc например, или в смысле "RuntimeException / AssertError" в жабе?
Ну например сказано "не передавать сюда NULL", а его передали и получили исключение?
AnalniyTerzatel 29.11.2016 23:19 # −1
roman-kashitsyn 29.11.2016 23:24 # +1
Нет, не против. Суть в том, чтобы отличать ожидаемые ошибки от исключительных ситуаций.
Проблемы с I/O при записи в файл -- ожидаемая ошибка, которую можно и нужно предусмотреть заранее и обработать.
Выход за границе массива -- это ошибка в программе, которую нельзя предусмотреть и правильно обработать.
OutOfMemory означает, что программист неправильно оценил ресурсы, которые требуются для корректной работы программы, с этим в большинстве случаев ничего не сделаешь.
AnalniyTerzatel 29.11.2016 23:31 # −1
guest0 30.11.2016 00:30 # −1
И да, я не считаю, что at() у мапы должен кидать исключение или крашить программу. Из-за такого at'а я использую find и ебу итераторы (хорошо хоть auto завезли).
barop 30.11.2016 00:34 # −1
а можно подробнее?
guest0 30.11.2016 00:42 # −1
barop 30.11.2016 00:43 # −1
Сдыхает он срязу там, или наверху колстека?
guest0 30.11.2016 00:49 # −1
roman-kashitsyn 30.11.2016 00:59 # −1
Деструкторы же
barop 30.11.2016 01:08 # −1
roman-kashitsyn 30.11.2016 01:15 # −1
barop 30.11.2016 01:23 # −1
да, я о них, финалайзеры это вообще атавизм он тут не при делах
roman-kashitsyn 30.11.2016 00:48 # −1
Используй вместо него operator[], нет?
guest0 30.11.2016 01:06 # −1
barop 30.11.2016 00:35 # −1
тогда зачем городить иерархию таких исключений?
И зачем механизм их отлова?
-------------
Воепрос тебе на засыпку: Для тупого веблога является ли недоступность СУБД ожидаемой или это исключительное?
roman-kashitsyn 30.11.2016 00:47 # −1
Недоступность любого внешнего процесса является ожидаемой. Проектировщики апи клиента СУБД не знают, где он будет использоваться -- в веблоге или нет.
barop 30.11.2016 01:15 # −1
Автор серьезного софта его ловит и обрабатывает.
Автор веблога ловит ВСЕ exceptions, пишет пользователю "temporary down", текст эксепшена (toString()) пишет в лог, и шлет письмо админу.
Админ видит текст эксепшена и все фиксит.
Все. Одинаково хендлятся ВСЕ эксепшены, буде-то место кончилось на БД или коннекшен упал.
В твоем же случае StatusOr<T> придется тащить буквально везде, до самого верху чтобы записать его в лог и сделать тоже самое.
А если метод одновременно подключается к СУБД и REST API удаленного сервиса?
Там будет уже две ошибки.
Представь как засрется API, нет?
roman-kashitsyn 30.11.2016 02:06 # −1
Очевидно, автор этого веблога пишет на PHP и вообще живёт счастливо без всяких исключений, connect() or die(), вот это всё.
Посмотрим, как админу понравится получать письмо каждый раз, когда KeyError какой-нибудь случится.
AnalniyTerzatel 30.11.2016 02:44 # −1
barop 30.11.2016 02:53 # −1
KeyError это одноразовая ошибка, а no space left on device явно волнует админа, разве нет?
AnalniyTerzatel 30.11.2016 03:00 # −1
barop 30.11.2016 01:24 # −1
Ремоутинг, значит.
Ты правда будешь пихать в КАЖДЫЙ (даже войд, лол!) метод status?
guest0 30.11.2016 01:55 # −1
barop 30.11.2016 03:02 # −1
А с другой стороны проблема напоминает nullify.
В современных ЯП принято иметь для Nullable и notnull разные типы, и заставлять юзера явно проверять что значение не null.
Kotlin e.g.
Тут почти тоже самое
guest0 30.11.2016 03:20 # −1
barop 30.11.2016 03:24 # −1
AnalniyTerzatel 30.11.2016 05:18 # −1
roman-kashitsyn 30.11.2016 01:55 # 0
А в чём, собственно, проблема? Идея относится к удалённому сервису так, будто он ничем не отличается от локального -- уже плохая. Даже жабисты это поняли на заре RMI, поэтому чекед RemoteException кидается из каждого прокси.
barop 30.11.2016 02:52 # −1
Другой пример это прокси-классы на SOAP.
>>Не отличается от локального -- уже плохая
Во ты сейчас просто взял, и насрал на целый пласт архитектуры, понимаешь?
А если у меня есть алогритм который должен быть агностик на тему того локальный он или удаленный?
Конечно, удаленный будет работать в 38 раз медленее, но и пофиг. Это ентерпрайз, он асинхронно обрабатывает заказ, и мне не важно что он занимает не 15 секунд а 15 минут.
Почему я должен его менять?
bormand 30.11.2016 06:28 # 0
Ну вот и пусть всегда считает, что он удалённый, даже если исполняется локально ;)
AnalniyTerzatel 30.11.2016 06:52 # −1
guest 29.11.2016 13:16 # −1
Кашицын всей моей жизни
Иду по вечному кругу
guest 06.12.2016 19:12 # 0
Ебут тебя во все дыры, да? )
barop 29.11.2016 00:34 # −1
Вот это кстати хуйня полная. Это же элементарно было бы сделать. Так почему не сделали?
Пусть функция, чей формальный параметр есть другая функция с эксепшеном E явно говорит (ну или при вызове ее явно указывается): "я прокину E" либо "я обязуюсь поймать и обработать E".
А знаешь почему эта, казалось бы элементарная, мысль не пришла никому в голову?
Потому что никто не умеет checked exceptions, даже в Oracle:) Все думают что это "говно какое-то и всё равно его никто не юзаеот"