Вот я часто вижу тут: "говнокод, говнокод"...
А ведь говнокод имеет право на жизнь, и причем нехилое такое право.
Я заглядывал под капот некоторым библиотекам, которые позиционируются как
самые такие-то или самые такие-то (например, самые быстрые). Вижу кашу из
макросов, прагм, кое-где пестрит ассемблер, все намешано, переменные из одной
буквы, отступы не соблюдаются, лычки на погонах у всех разноцветные и идут не в ногу...
Короче, вроде как говнокод чистой воды (странное словосочетание, надо бы запатентовать).
Тем не менее, библиотеки успешно держатся на плаву уже несколько лет и,
что самое важное, умеют выжимать эти последние 3-5%, когда остальные пасуют.
Лично для себя я давно открыл разделение кода на библиотечный и клиентский (или интерфейсный).
Все, что внутри библиотечного кода, клиентов интересовать не должно, это черный ящик.
То, что он доверху набит дерьмом, клиента не заботит. Важнее то, что ящик сшибает
конкурентов и делает работу на пять с плюсом, а то, как он написан — забота авторов.
Клиентский код, напротив, обязан быть предельно прозрачным и аккуратным, с разделением на
всякие там абстракции, слои, и т.д.
Готов провести линию и дальше — есть "библиотечные" языки, а есть "клиентские".
Например, C — типичный "библиотечник", а C++/.NET/Java — скорее для клиентского кода.
Отлично понимаю, что все это — открытие Америки, просто довольно часто вижу,
как тут на RSDN кто-то выкладывает код, и его (код) тут же начинают поливать грязью за
"смешивание в presentation layer", за "невнятное именование", за "использование A там,
где логичнее было бы использовать B", и так далее в том же духе.
А задумайтесь — вдруг от эффективности этой библиотеки будет зависеть жизнь людей.
Что, красивый код важнее тех плюс трех-пяти процентов, которые иногда можно получить с
помощью некрасивого решения типа goto ?
P.S. Отвечать быстро не смогу, так как занят написанием кода (красивого и быстрого).
Но троллинг и минусятничанье приветствуются.
Здравствуйте, okman, Вы писали:
O>Вот я часто вижу тут: "говнокод, говнокод"... O>А ведь говнокод имеет право на жизнь, и причем нехилое такое право.
Говнокод безусловно имеет право на жизнь... если его не мне сопровождать
O>А задумайтесь — вдруг от эффективности этой библиотеки будет зависеть жизнь людей.
Действительно, ошибки в запутанном коде — это как раз то, что нужно для критичных приложений
Здравствуйте, okman, Вы писали:
O>Тем не менее, библиотеки успешно держатся на плаву уже несколько лет и, O>что самое важное, умеют выжимать эти последние 3-5%, когда остальные пасуют.
говнокод — это не тот код который не работает, или который работает плохо,
этот тот код который сложно читать\поддерживать.
Здравствуйте, Abyx, Вы писали: A>говнокод — это не тот код который не работает, или который работает плохо, A>этот тот код который сложно читать\поддерживать.
Приведу примеры, взятые из нескольких популярных библиотек.
Все это взято из библиотек, которыми многие, как я подозреваю, пользуются, и которые
заслуженно занимают свои позиции в своих нишах.
Здравствуйте, okman, Вы писали:
O>Приведу примеры, взятые из нескольких популярных библиотек. O>Все это взято из библиотек, которыми многие, как я подозреваю, пользуются, и которые O>заслуженно занимают свои позиции в своих нишах.
O>А теперь вопрос — говнокод ли это ?
O>[... 3 примера]
да, да, и да.
в 1м и 3м случае потому что человек впервые видя этот код не может сказать что и как этот код делает
во 2м случае это не то чтобы "говнокод", он просто неоптимален и потребует много усилий чтобы переименовать make_error_condition
Здравствуйте, okman, Вы писали:
O>А задумайтесь — вдруг от эффективности этой библиотеки будет зависеть жизнь людей.
Ага, вдруг она на АЭС применятся будет.
Жизнь людей обычно не от 3-5% перформанса зависит, а от наличия багов. В каком коде багов будет больше, а?
O>Что, красивый код важнее тех плюс трех-пяти процентов, которые иногда можно получить с O>помощью некрасивого решения типа goto ?
В 99.99% — да. Хотя бы потому что в красивом коде очень часто легче сделать не выжимание битов, а алгоритмическую оптимизацию, дающую плюс 30-50%.
Здравствуйте, okman, Вы писали:
O>Вот я часто вижу тут: "говнокод, говнокод"... O>А ведь говнокод имеет право на жизнь, и причем нехилое такое право.
Смотря что понимать под говнокодом. Прикол в том, что цели клиентского кода и библиотечного различны. Клиентский — требования к скорости чаще всего не важны, а требуется максимальная понятность, поддерживаемость и расширяемость. А к библиотечному критерии другие — это не должно тормозить и это должно работать на чем угодно, максимально используя ресурсы. Понятность в библиотечном коде на 10-м месте, туда все равно никто не полезет. Соответственно если в коде библиотеки сам черт ногу сломит, но работает максимально быстро — это не говнокод. Главное чтоб багов не было.
Здравствуйте, elmal, Вы писали:
E>Смотря что понимать под говнокодом. Прикол в том, что цели клиентского кода и библиотечного различны. Клиентский — требования к скорости чаще всего не важны, а требуется максимальная понятность, поддерживаемость и расширяемость. А к библиотечному критерии другие — это не должно тормозить и это должно работать на чем угодно, максимально используя ресурсы. Понятность в библиотечном коде на 10-м месте, туда все равно никто не полезет. Соответственно если в коде библиотеки сам черт ногу сломит, но работает максимально быстро — это не говнокод. Главное чтоб багов не было.
А сопровождать эти библиотеки кто-то будет или нет?
Качество кода — это такая шутка, она не для пользователя продукта (библиотеки), а для тех, кто её пишет и поддерживает.
Здравствуйте, elmal, Вы писали:
E>Смотря что понимать под говнокодом.
А что, есть в этом вопросе разночтения?
E> Прикол в том, что цели клиентского кода и библиотечного различны.
Как интересно. А есть вот такая, резкая граница, между библиотечным кодом и не библиотечным? Ты вот как определяешь — если некий метод вызывается из одного места — это, наверное, клиентский? А если из двух? Из трех? Из десяти? В какой момент и почему происходит смена цели?
E> Клиентский — требования к скорости чаще всего не важны
Обоснуй.
E>а требуется максимальная понятность, поддерживаемость и расширяемость
А в библиотечном коде не требуется?
E>А к библиотечному критерии другие — это не должно тормозить
Это всегда главный критерий качества библиотечного кода? И как определить, тормозит он или уже достаточно быстродействия? Есть какие то нормативы? Или надо потратить не менее ХХХ баксов на тюнинг YYY строчек библиотечного кода?
E> и это должно работать на чем угодно
В каком смысле?
E>максимально используя ресурсы
Какие и зачем?
E>Понятность в библиотечном коде на 10-м месте, туда все равно никто не полезет
Даже автор библиотеки? Ты часто такой код сам пишешь?
E>Соответственно если в коде библиотеки сам черт ногу сломит
Во всех твоих библиотеках черт ногу сломит?
E>Главное чтоб багов не было.
Как считаешь, количество багов зависит от чистоты кода?
Здравствуйте, elmal, Вы писали:
E>Соответственно если в коде библиотеки сам черт ногу сломит, но работает максимально быстро — это не говнокод.
Дело в том, что даже битовыжималку можно написать так, чтоб она достаточно легко читалась.
Здравствуйте, okman, Вы писали: O>А теперь вопрос — говнокод ли это ?
Оценка есессна исключительно по внешнему виду, т.к. понять насколько кривым является решение поставленной задачи по таким кусочкам просто невозможно. O>
для разминки
Не говнокод, небольшая стилистическая правка улучшит читабельность. O>
вариации switch-case
Как минимум форматирование "табличкой" сильно улучшит читабельность. O>
мое любимое
Хехе. Ну, оформление исключительно отвратительное.
Но тем не менее даже это можно привести в легкочитаемый вид, ничего не сломав в производительности алгоритма.
Переименовать переменные, написать комментарии, дать функциям осмысленные имена. Код от этого не станет медленнее, но зато потеряет приставку "говно"
Здравствуйте, okman, Вы писали: O>Здравствуйте, Abyx, Вы писали: A>>говнокод — это не тот код который не работает, или который работает плохо, A>>этот тот код который сложно читать\поддерживать. O>Приведу примеры, взятые из нескольких популярных библиотек. O>Все это взято из библиотек, которыми многие, как я подозреваю, пользуются, и которые O>заслуженно занимают свои позиции в своих нишах. O>А теперь вопрос — говнокод ли это ? O>
O>Вот я часто вижу тут: "говнокод, говнокод"... O>А ведь говнокод имеет право на жизнь, и причем нехилое такое право.
Поясняю для прессы.
Для того чтобы писать красивый код, надо иметь мозг и опыт на пару порядков превышающий уровень задачи. Так товарищ Кнут показывает нам пример литературного программирования на примере задачи о 8ми ферзях.
Я могу писать суперкрасивый литературный код в стиле test-first при условиях что:
а) Я сравнительно трезв
бе) Это какой-нибудь идиотский парсер даты
це) Когда мои временные ресурсы (почти) не ограничены
де) Я хочу показать что я хуже многих и тоже могу много (выпивать).
В тех случаях, когда я заранее не знаю (хотя бы примерно) чего мне нужно написать, то вначале неизменно получается говнокод. Он решает задачу, но это единственное что можно о нем сказать хорошего. Часто он сопровождается тестами, которые оказываются много ценней в дальнейшей перспективе.
Затем этот код ревьюится сначала мной (переписывается) затем товарищем (переписывается), затем каллевтивом (переписывается, подчас даже не мной). И только потом-потом-потом он приобретает некую даже я бы сказал элегантность.
O>Я заглядывал под капот некоторым библиотекам, которые позиционируются как O>самые такие-то или самые такие-то (например, самые быстрые). Вижу кашу из O>макросов, прагм, кое-где пестрит ассемблер, все намешано, переменные из одной O>буквы, отступы не соблюдаются, лычки на погонах у всех разноцветные и идут не в ногу... O>Короче, вроде как говнокод чистой воды (странное словосочетание, надо бы запатентовать).
Бывает так что все эти ваши соображения о красоте погон идут лесом и на передний план выступают совсем иные требования. Самое типичное — скорость. Еще типичное — интеграция (тут нужно сделать не очень красиво с точки зрения модуля, но красиво с точки зрения всей системы/архитектуры). Менее типичное — сопровождаемость. Как это ни странно, далеко не всегда очевидный и логичный код более сопровождаем.
O>Тем не менее, библиотеки успешно держатся на плаву уже несколько лет и, O>что самое важное, умеют выжимать эти последние 3-5%, когда остальные пасуют.
Выжимка 3-5% в моих задачах (кластерные вычисления) редко играет роль. Вот, положим 50% это да.
O>Лично для себя я давно открыл разделение кода на библиотечный и клиентский (или интерфейсный). O>Все, что внутри библиотечного кода, клиентов интересовать не должно, это черный ящик. O>То, что он доверху набит дерьмом, клиента не заботит. Важнее то, что ящик сшибает O>конкурентов и делает работу на пять с плюсом, а то, как он написан — забота авторов.
Это примитивисткий взгляд. Очень часто приходится-таки копаться в кишках библиотек, ибо автор совершенно не представлял, что его библиотеку будут иметь в таких положениях. Хорошо, если автор приложил усилие и сделал код худо-бедно читаемым. Не сделал — ну что-ж, вина тут не автора, это мы пользуем библиотеку не в той позе.
O>Клиентский код, напротив, обязан быть предельно прозрачным и аккуратным, с разделением на O>всякие там абстракции, слои, и т.д.
Где клиент, а где библиотека ? Одно переходит в другое и обратно.
O>Готов провести линию и дальше — есть "библиотечные" языки, а есть "клиентские". O>Например, C — типичный "библиотечник", а C++/.NET/Java — скорее для клиентского кода.
Мысль ясна, но Java в последнее время становится в позицию библиотечного языка для Scala, Groovy, Jython. Все тут зыбко.
O>Отлично понимаю, что все это — открытие Америки, просто довольно часто вижу, O>как тут на RSDN кто-то выкладывает код, и его (код) тут же начинают поливать грязью за O>"смешивание в presentation layer", за "невнятное именование", за "использование A там, O>где логичнее было бы использовать B", и так далее в том же духе.
Разные люди, разные мнения. Прислушиваться можно, но в голову не берите. Те самые плюсы, которые вы внесете по советам с RSDN будут восприняты вашими коллегами (по проекту) как явные минусы. Лучше советоваться с коллегами. Все субъективно, и я с радостью изуродую свой код если мои коллеги — уроды.
O>А задумайтесь — вдруг от эффективности этой библиотеки будет зависеть жизнь людей. O>Что, красивый код важнее тех плюс трех-пяти процентов, которые иногда можно получить с O>помощью некрасивого решения типа goto ?
Бросьте. Никогда нам с Вами не писать кода, от которого будет зависеть чья-то жизнь. Там совсем другие требования, другой инструментарий, другой уровень абстракции. Навскидку — автоматически доказуемая корректность (это для уровня АЭС) и model-driven development (это для уровня самолетов, оно попроще).
O>P.S. Отвечать быстро не смогу, так как занят написанием кода
Вот это прально. Фигачте, товарищ, фигачте. Именно это и приведет Вас в царствие небесное.