psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2005-11-08 07:03 pm

О ярлыках в программировании

Есть в современном программировании такое расхожее мнение: "нельзя изобретать велосипед". Имеется в виду, что не надо писать с нуля какой-то код, если кто-то что-то подобное уже написал.

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


На деле фраза про велосипед - бред чистой воды. Вообще многие пословицы и поговорки - есть не "народная мудрость", а "народная глупость", стереотипы, передаваемые из поколения в поколения. Эти стереотипы вовсе не проходят естественный отбор: среди них выживают не самые правильные, а самые часто применяемые для тех или иных целей, в том числе и неблаговидных. Иногда стереотип раскритиковывается (как раскритикована поговорка "цель оправдывает средства"), но чаще они так и остаются властвовать умами в виде фантомов (так я называю привычную, но труднообнаружимую ложь).

Когда человек пишет функцию X, которая уже есть в какой-то библиотеке - он "изобретает велосипед"? Допустим. Тогда, если он _использует_ эту функцию в функции Y - он "изобретает велосипед"? Вообще-то да: ведь это до него уже делали многие другие. Не надо ли поискать библиотеку, которая реализовала функцию Y или что-то подобное дабы не "впасть в грех" изобретения велосипеда?

А как называется ситуация, когда человек подключает к своей программе 3-мегабайтную DLL только потому, что ему понадобилась ровно одна функция из нее, реализуемая десятком строк? Нежелание "изобретать велосипед" - достойное оправдание таким действиям?

А как называется ситуация, когда человек требует у начальства, чтобы его контора купила стороннюю библиотеку за $1000, в которой есть некоторая функциональность под предлогом нежелания "изобретать велосипед"? В то время как эта функциональность реализуется за человеко-неделю программистом с зарплатой в $1000, а использование других возможностей библиотеки не видится project manager-у даже в страшных снах (нах)?

А когда вы в очередной раз следуете некоему паттерну, вы разве не изобретаете велосипед в очередной раз, если уж на то пошло? Да, вы его изобретаете, просто вы не привыкли вешать клеймо "изобретать велосипед" именно на этот вид дейтельности.

Вред ярлыка состоит не в том, что он неверен, а в том, что он применяется бездумно. Таково свойство ярлыка: навесил, и кажется, будто что-то этим доказал. Избегание повторного написания кода рационально, но рационально оно при соблюдении ряда условий. А эти условия не обязаны соблюдаться всегда. Они часто и не соблюдаются, но привычка пугаться ярлыков даже не позволяет задуматься: а как в данном случае - принцип работает или нет?

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

[identity profile] firtree.livejournal.com 2005-11-08 08:49 pm (UTC)(link)
Ага. И стремление изобретать велосипед исключительно из чувства противоречия - тоже стереотип, провоцирующий бездумное применение.

[identity profile] psilogic.livejournal.com 2005-11-08 08:56 pm (UTC)(link)
согласен!

[identity profile] eugenebo.livejournal.com 2005-11-09 02:35 am (UTC)(link)
В целом, согласен: к правилам надо подходить критически. Но если уже что-то написано другими людьми, то я всё-таки дважды подумаю, прежде чем начну писать своё. Преимущества:

1. Оно уже протестировано, зачастую -- многими годами работы и миллионами людей.
2. Оно может быть куда сложнее, чем кажется. Так, многие криптографические алгоритмы выглядят весьма заманчиво в смысле "а сяду и щаз налабаю"; но потом выясняется, что в деле этом столько тонкостей, что задача оказывается незарешимой. В Mictosoft-е даже термин такой придумали для домашних криптобиблиотек: craptograpy. И он, увы, оправдан :(
3. Когда вдруг найдётся проблема в алгоритме написанного, куда проще обновить одну используемую всеми библиотеку, нежели выискивать клонов "блох", разбросанных по всему коду :)

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

[identity profile] psilogic.livejournal.com 2005-11-09 10:35 am (UTC)(link)
В принципе, согласен.
Кстати, заметил характерную фишку. Те же самые люди, которые призывают к повторному использованию:
a) не знают о том, что на том же предприятии кто-то уже решил подобную задачу (либо если речь идет о руководителе то не заботятся о том, чтобы довести до сведения работников информацию о том, у кого что сделано такое, что может пригодиться другим)
б) очень любят использовать copy/paste метод в кодировании, что есть фактически нарушение принципа :)

[identity profile] realsonic.livejournal.com 2005-11-09 07:58 pm (UTC)(link)
К сожалению, горький опыт подсказывает: не бери чужого, ибо в нём много недокументированных глюков. Оказывается, мы ужасно зависим от сторонних разработчиков. Иногда настолько глючит даже Windows (в developer-секторе), что хочется сесть и написать свою ОСь. :)

[identity profile] psilogic.livejournal.com 2005-11-09 08:14 pm (UTC)(link)
естественно, глюки есть везде. если большая библиотека, имеющая много продаж, то все равно куча глюков (потому как объем кода больше)

[identity profile] realsonic.livejournal.com 2005-11-09 08:24 pm (UTC)(link)
Вот поэтому иногда вместо того, чтобы искать что-то где-то, просто садишься и пишешь своё, а потом дебажишь до блеска. :)

[identity profile] realsonic.livejournal.com 2005-11-09 08:00 pm (UTC)(link)
Извиняюсь за оффтопик, но $1000 - какая это зарплата по величине? И где? (в каком городе)

[identity profile] psilogic.livejournal.com 2005-11-09 08:11 pm (UTC)(link)
это просто пример
по меркам Москвы для программера ну... так себе, средненько. для подмосковья - не шик, но нормально.

[identity profile] leo-sosnine.livejournal.com 2005-11-10 03:42 am (UTC)(link)
Когда есть ярлык, то даже умные люди поддаются его власти, потому что боятся быть высмеянными толпой, той самой тупой толпой, которая реагирует на ярлыки заранее запрограммированным образом как собака Павлова: смехом, ненавистью, пренебрежением и так далее.

Верно, верно. Толпа тупит. У меня на это контрреакция. "Мальчик наоборт"

Тут ещё есть один момент: часто пользуются "неизобретением велосипеда" по соображениям совместимости. Вместо того, чтобы сшить новый костюм, лепят заплатки и дошивают недостатющие части на уже существующий полуразвалившийся сюртук прошлого века. "Совместимость".

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

Есть ещё один момент: если программист напишет код самостоятельно, то в случае, если этот код будет работать не так как нужно, то ответственность за его работу будет нести именно он. А если воспользуется "библиотекой за $1000", то всегда можно перевести стрелки и оправдаться перед начальством. Ответственности люди не любят.

Стишок "Мальчик наоборот":

Все кладут
Сначала в рот
Бутерброд,
А потом
Едят компот.
Он - всегда
Наоборот.
Он сначала
Ест компот,
За компотом
Бутерброд.

Все сначала
Чистят зубы,
А потом
Влезают в шубы.
Он, надев
Пальто и шарф,
Льёт потом
Воды в ушат
И, надвинувши
Картуз,
Порошок
Несёт ко рту.

Все собрались
В огород, -
Он остался
У ворот...
Все остались
У ворот, -
Он собрался
В огород...
Он всегда
Наоборот.

- Ты всегда
Не как отряд, -
Октябрята
Говорят. -
Раз ты всё
Наоборот,
Ты ходи
Спиной вперёд.

- Ну и что же,
И пойду! -
И, толкаясь
На ходу
И шатаясь
Как больной,
Он идёт
Вперёд
Спиной.

- Ой, товарищи,
Бегите!
Берегите
Ваши лбы!
Что за странное
Событье:
Мальчик
Лезет на столбы?!

Поскользнулся,
Задом пятясь, -
И к милиции
В объятья.

- Почему идёшь
Спиной?
Ходят правой
Стороной!

- Отпустите! -
Он ревёт. -
Я хожу спиной
Вперёд!
Я всегда
Наоборот.