Костыль

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

Костыль (научн.паллиатив, википид.Обходной приём) — средство добавления недостающей функциональности или исправления серьёзных дыр без должного редизайна системы. Каждый костыль затрудняет дальнейшее развитие. В тех случаях, когда костыль уничтожает незапланированную функциональность, называется заплаткой.

Определение из Community.gifkostylism:

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

В этом мире много т. н. «костылей». Четкого определения нету, но, в общем, костыль — это нечто, что навешивается на что-то для решения какой-либо возникшей проблемы (и/или добавления функциональности), вместо того, чтобы это «что-то» переработать (возможно, с нуля). Яркие примеры костылей — ipsec, smtp auth, pppoe, и прочее.

Если «костыль» отлично работает и не доставляет проблем ни пользователям, ни разработчикам, то можно считать его «технологическим крепежом».

Суть[править]

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

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

Окостылил говнокод?
Ляг, поспи и все пройдет.
Встал, покодил, все равно
Получается говно.

Как не патчил много лет,
Как не фиксил баги,
Все-равно велосипед
На костыльной тяге.

Что б совсем без костылей,
Великов и багов
Нанимайте, говорю,
Нанимайте магов!

Способы борьбы с костылями[править]

Пример[править]

При написании программ для Microsoft Windows некоторые программисты полагались на баги WinAPI. Позднее, при создании свободной реализации WinAPI Wine, эмуляцию соответствующих багов пришлось добавить специально, чтобы обеспечить совместимость этих программ с Wine. Некоторый лулз состоит в том, что в MS при разработке новых версий софта занимаются тем же самым ради совместимости с предыдущими версиями.

Я впервые услышал об этом от одного из разработчиков популярной игры SimCity, который поведал мне о критической ошибке в их программе: она использовала память сразу после ее освобождения. Главное табу, нарушение которого прощалось в DOS, но карается в Windows, где освобожденную память тут же стащит другое работающее приложение. Тестеры в команде разработки Windows протестировали множество популярных приложений, чтобы убедиться, что все работает без сбоев, но SimCity зависала. Они сообщили это разработчикам Windows, которые дизассемблировали SimCity, шаг за шагом в дебаггере найдя ошибку, и добавили специальный код, проверяющий наличие SimCity в памяти и запускающий распределитель памяти в специальном режиме, в котором SimCity разрешается использовать память после ее освобождения.
То есть даже когда они были лицом к пользователю, лицо всё равно было как жопа. Вкурочить! Костыль! Для КОНКРЕТНОЙ программы! Вместо того, чтобы просто галочку в свойства совместимости добавить — «удерживать за приложением высвобожденную память до следующей аллокации»! А если так уж хочется полной автоматики, пусть по умолчанию для СС она там стоит. Вот бы тогда бы уже понять, что M$ надо руки отпиливать по самую жопу :(

Или вот такой костыль для IE — добавляет для элементов LI, вложенных в элемент id=cssmenu, свойство hover. Здорово нужен при написании разномастных выпадающих меню.

function cssmenuhover()
{
        if(!document.getElementById("cssmenu"))
                return;
        var lis = document.getElementById("cssmenu").getElementsByTagName("LI");
        for (var i=0;i<lis.length;i++)
        {
                lis[i].onmouseover=function(){this.className+=" iehover";}
                lis[i].onmouseout=function() {this.className=this.className.replace(new RegExp(" iehover\\b"), "");}
        }
}
if (window.attachEvent)
        window.attachEvent("onload", cssmenuhover);

Костыли IRL[править]

При проектировании самолета конструкторы постоянно сталкивались с самыми разнообразными, ранее никогда не встречавшимися проблемами. Например, у компоновки самолета, выигравшего конкурс, шасси не вписывалось в предназначенный для него отсек. Для выхода из ситуации предлагались довольно экзотические решения – воздухозаборники выносились на «спину», а после выхода на заданный курс самолет должен был переворачиваться кабиной вниз и так совершать полет. При посадке бомбардировщик должен был снова переворачиваться в исходное состояние.
  • Наверное, наибольшее разнообразие костылей встречается в живых организмах, что на молекулярном, что на организменном уровне. Возможно, они даже целиком сделаны из костылей. Дело в том, что эволюция (случайная изменчивость+естественный отбор) попросту не умеет целенаправленно переделывать всё с нуля. Новые виды развиваются из уже существующих. Примеров имеется великое множество, и здесь будет разве что парочка, для понимания сути: у растений - реакции фотодыхания, начиная со второй, нужны, чтобы как-то утилизировать (а ещё лучше - заюзать с хоть каким-то профитом) гликолят, который образуется, когда фермент рубиско косячит (не хило так косячит, аж в 25% случаев), а у человеков, назвавших себя разумными, костылями можно считать надгортанник и мягкое нёбо, два хряща которые не дают жратве во время глотания попасть в дыхательные пути, которые пересекаются со жрательными.
  • В Петербургском метро в 99-м году обрушился козырёк над входом на станцию Сенная площадь. После под каждый похожий козырёк подставили подпорки, которые портят вид станции и мешают пассажирам. К концу нулевых большинство из них либо перестроили (как, например, наркоманского вида Горьковская), либо под козырьки запихали ларьки, либо козырёк убран вообще. Дольше всех подпорки продержались на Василеостровской.
  • В самарском метро в 2002 году открыли станцию «Московская», а на оборотный тупик или съезд денег не хватило. В результате, до конца 2007 года, когда открыли станцию «Российская», поезд сначала приезжал со станции «Спортивная» на один путь станции «Гагаринская», разворачивался в тупике, подходил ко второму пути этой же станции и дальше уже ехал до конечной станции «Московская».
  • Также костылём водилы называют малоразмерное запасное колесо («докатку»). Вот такое, например. У прулеводов на Дальнем Востоке распространено название «банан», по-видимому, из-за жёлтого цвета диска у докаток японских машин.

См. также[править]

Ссылки[править]

Lor opacity.png Обитель ОС-петушелл
Людиalphex_kaanoken • GeneratorglukoffGuttaLinuxJBK48KominternShaman007SherakSikonSilvyАлексей БабушкинАнонимус • Батарейкин • ВилфредГанс РейзерГрегореДенис ПоповЛуговскийМихаилПатрикСанычТео де РаадтШаман
Мемы128 bitDimmu Borgir - 51kJust for Funlibastral.soTRUE-DEATH-PRIMITIVE-LINUX-MITOLLАнальное рабствоА под Слакой это работает?ВендекапецВеществаДонской табакЖдём ебилдовЗакопайте обратноК логопеду, быдлоЛетающие коровыЛОР-эффектМашина времениМетанацияНе нуженНе работай под рутомНичего не поделаешь, это FlashПерестаньте насиловать труп!Плазма не падаетПрограмма из одной строчки на PerlРешетоСкриншот с ЛОРСпециалисты по всемуТелепаты в отпускеТолько закончил собиратьУбей себя, как ТоммиУМВРШрифты — говноЭлектролит из соплей девственницы
ПрограммированиеArchFedoraGentooGIMPGNOMEJavaKDEPerlSlackware LinuxTeX
Прочее12309Common SenseGNOME vs. KDENixburgАппрувВеликий Исход МодераторовКостыльЛолксЛузирсНытик-тредыТукс
App.png Весьма полезная вещь, позволяет машинам работать с помощью коммандычей
МетаПрограммаDRM (SecuROMStarForceАналоговая дыра) • БагБот (Автоответчик) • Варез (Repack) • ГлюкГуйДонатКопирайт (By design) • ЛогНюкРут (Не работай под рутом) • Спортивное программированиеМегапиксельКомпьютерВерсия 2.0КодОбфускацияСкриншотДатамайнПлагинТекстовый файлБольшие данныеАльфа и бета-тестыТаймстампКэшШаблоныHello WorldНейросетиФайлИнсталляция
ФичиБагрепорт12309BSODCookiesEmbrace, extend and extinguishFL StudioSheep.exeWinlogon.exeБубенЗащита от дуракаКостыльМашинный переводПасхальные яйцаСвистелки и перделкиСм. рис. 1Съешь ещё этих мягких французских булокTermuxGNU MetroИндусский кодНескучные обои • Сжатие (За сжатие ДжипегаШакалШкала) • Работает — не трогайРандомайзерPDF (Распознавание PDF) • Дело Google в ФАСЧат-ботXMLМакросКритическая ошибка
ВредоносноеБотнетБрутфорсВинлокЗвонилкаКитайские пингвиныПиксель смертиТроянЧервь МоррисаBonziBuddyMediaGetBrowser hijackingTinderМиссис МажорУтечка буфера обмена
КомпанииApple / Apple (AppleScript) • GoogleMicrosoftSAPЯндекс
Движения8-bitOpen source (КрасноглазикиЛинуксоиды) • Вирусная сценаДаунгрейдДемосценаМоддингMMD
Офис3DS MAXGIMPGNU EmacsMovie MakerMS Paint • OpenOffice • PowerPointviMicrosoft WordExcelБлокнотФотошопАнтивирус КасперскогоAvast!TikZShareXAlternativeToСкрепышMicrosoft OfficeТекстовый редакторWeChatZoomДиспетчер задачMicrosoft Cortana
ОСAndroidBSDDOSMenuetOSReactOSWindows (Phone 7Phone 878Vista) / МаздайЛинуксРусская ОСФантом ОС
БраузерыInternet ExplorerОпера / Opera • Тормозилла (ОгнелисLolifoxMozilla FirefoxFirefoxFirefox Klar) • Хром (шпионаж) • SafariЯндекс.БраузерУведомления в браузереVivaldiTor-браузер
ИнтернетAdobe Systems (Flash) • I2PLow Orbit Ion CannonTorTunatic • Чат−клиенты (MirandaQIPSkypeЖабберDiscordVIPole) • HTTPSПрокси-сервер (Proxifier) • Торрент (Magnet-ссылкаΜTorrent) • JavaScriptCSSHTMLБаннермейкерИзменение TTL сетевых пакетовКапчаICQFiddlerViberZonaSteamSillyTavernWickr Me
РазработкаBrainFuckCC++C#JavaHaskellАссемблерChaos ConstructionsBATMySQLGitHubAutoHotKey (AutoHotInterception) • Sublime TextAPK (APKPureзапрет) • BASICPerlPythonPHPФоркUnity3DSAISIPСАПРФлаг
ЛюдиВеб-мастерLovinGODБалмерГейтсГенерал ФейлорДжобсМитникПоттерингде РаадтСпольскиСтоллманТорвальдсШахиджанянAche666Марк ЦукербергЕвгений ПоповДенис КумпонМассовая компьютерная безграмотность
КостылиCygwin • PunkBusterT9WineWishmasterАнтивирусыХакинтошСборки WindowsDenuvoЧистая установкаКалькулятор Consul WarMicrosoft StoreUBlock OriginLightshotAdBlockSearchApp.exeCPU-Z
Команды^H^WAlt+F4Ctrl+Alt+Delman/me/quitrm -rf
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикФортран
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++Scala
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёзды
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplace
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3D
ЛюдиИлья КанторЮрий КлючевскийЭдуард Лаас
Прочее++i + ++iDeadline%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодач