Костыль
Костыль (научн.паллиатив, википид.Обходной приём) — средство добавления недостающей функциональности или исправления серьёзных дыр без должного редизайна системы. Каждый костыль затрудняет дальнейшее развитие. В тех случаях, когда костыль уничтожает незапланированную функциональность, называется заплаткой.
![]()
Рекурсивный костыль 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, вложенных в элемент свойство hover. Здорово нужен при написании разномастных выпадающих меню.
function cssmenuhover() if(!document.getElementById("cssmenu")) return; var lis = document.getElementById("cssmenu").getElementsByTagName("LI"); for (var i=0;ilis.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 года, когда открыли станцию «Российская», поезд сначала приезжал со станции «Спортивная» на один путь станции «Гагаринская», разворачивался в тупике, подходил ко второму пути этой же станции и дальше уже ехал до конечной станции «Московская».
- Также костылём водилы называют малоразмерное запасное колесо («докатку»). Вот такое, например. У прулеводов на Дальнем Востоке распространено название «банан», по-видимому, из-за жёлтого цвета диска у докаток японских машин.
См. также [ править ]
Ссылки [ править ]
| Обитель ОС-петушелл | |
|---|---|
| Люди | alphex_kaanoken • Generatorglukoff • GuttaLinux • JB • K48 • Komintern • Shaman007 • Sherak • Sikon • Silvy • Алексей Бабушкин • Анонимус • Батарейкин • Вилфред • Ганс Рейзер • Грегоре • Денис Попов • Луговский • Михаил • Патрик • Саныч • Тео • Шаман |
| Мемы | 128 bit • Dimmu Borgir — 51k • Just for Fun • libastral.so • TRUE-DEATH-PRIMITIVE-LINUX-MITOLL • Анальное рабство • А под Слакой это работает? • Вендекапец • Вещества • Донской табак • Ждём ебилдов • Закопайте обратно • К логопеду, быдло • Летающие коровы • ЛОР-эффект • Машина времени • Метанация • Не нужен • Не работай под рутом • Ничего не поделаешь, это Flash • Перестаньте насиловать труп! • Плазма не падает • Программа из одной строчки на Perl • Решето • Скриншот с ЛОР • Специалисты по всему • Телепаты в отпуске • Только закончил собирать • Убей себя, как Томми • УМВР • Шрифты — говно • Электролит из соплей девственницы |
| Программирование | Arch • Fedora • Gentoo • GIMP • GNOME • Java • KDE • Perl • Slackware Linux • TeX |
| Прочее | 12309 • Common Sense • GNOME vs. KDE • Nixburg • Аппрув • Великий Исход Модераторов • Костыль • Лолкс • Лузирс • Нытик-треды • Тукс |
| Это не баг, а фича | |
|---|---|
| Мета | Программа • DRM (SecuROM • StarForce • Аналоговая дыра) • Баг • Бот (Автоответчик) • Варез (Repack) • Глюк • Гуй • Донат • Копирайт (By design) • Лог • Нюк • Рут (Не работай под рутом) • Спортивное программирование • Мегапиксель • Компьютер • Версия 2.0 • Код • Обфускация • Скриншот • Датамайн • Плагин • Текстовый файл • Большие данные • Альфа и бета-тесты • Таймстамп • Кэш • Шаблоны • Hello World • Нейросети • Файл |
| Фичи | Багрепорт • 12309 • BSOD • Cookies • Embrace, extend and extinguish • FL Studio • Sheep.exe • Winlogon.exe • Бубен • Защита от дурака • Костыль • Машинный перевод • Пасхальные яйца • Свистелки и перделки • См. рис. 1 • Съешь ещё этих мягких французских булок • Termux • GNU Metro • Индусский код • Нескучные обои • Сжатие (За сжатие Джипега • Шакал • Шкала) • Работает — не трогай • Рандомайзер • PDF (Распознавание PDF) • Дело Google в ФАС • Чат-бот • XML • Макрос • Критическая ошибка |
| Вредоносное | Ботнет • Брутфорс • Винлок • Звонилка • Китайские пингвины • Пиксель смерти • Троян • Червь Морриса • BonziBuddy • MediaGet • Browser hijacking • Tinder • Миссис Мажор • Утечка буфера обмена |
| Компании | 1С • Apple / Apple (AppleScript) • Google • Microsoft • SAP • Яндекс |
| Движения | 8-bit • Open source (Красноглазики • Линуксоиды) • Вирусная сцена • Даунгрейд • Демосцена • Моддинг • MMD |
| Офис | 3DS MAX • GIMP • GNU Emacs • Movie Maker • MS Paint / Paint • OpenOffice • PowerPoint • vi • Microsoft Word • Блокнот • Фотошоп • Антивирус Касперского • Avast! • TikZ • ShareX • AlternativeTo • Скрепыш • Microsoft Office • Текстовый редактор • WeChat |
| ОС | Android • BSD • DOS • MenuetOS • ReactOS • Windows (Phone 7 • Phone 8 • 7 • 8 • Vista) / Маздай • Линукс • Русская ОС • Фантом ОС |
| Браузеры | Internet Explorer • Опера / Opera • Тормозилла (Огнелис • Lolifox • Mozilla Firefox • Firefox • Firefox Klar) • Хром (шпионаж) • Safari • Яндекс.Браузер • Уведомления в браузере • Vivaldi • Tor-браузер |
| Интернет | Adobe Systems (Flash) • I2P • Low Orbit Ion Cannon • Tor • Tunatic • Чат−клиенты (Miranda • QIP • Skype • Аська • Жаббер • Discord • VIPole) • HTTPS • Прокси-сервер (Proxifier) • Торрент (Magnet-ссылка • ΜTorrent) • JavaScript • CSS • HTML • Баннермейкер • Изменение TTL сетевых пакетов • Капча • ICQ • Fiddler • Viber • Zona • Steam • SillyTavern |
| Разработка | BrainFuck • C • C++ • C# • Java • Haskell • Ассемблер • Chaos Constructions • BAT • MySQL • GitHub • AutoHotKey (AutoHotInterception) • Sublime Text • APK (APKPure • запрет) • BASIC • Perl • Python • PHP |
| Люди | Веб-мастер • LovinGOD • Балмер • Гейтс • Генерал Фейлор • Джобс • Митник • Поттеринг • де Раадт • Спольски • Столлман • Торвальдс • Шахиджанян • Ache666 • Марк Цукерберг • Евгений Попов • Денис Кумпон • Массовая компьютерная безграмотность |
| Костыли | Cygwin • PunkBuster • T9 • Wine • Wishmaster • Антивирусы • Хакинтош • Сборки Windows • Denuvo • Чистая установка • Калькулятор Consul War • Microsoft Store • UBlock Origin • Lightshot • AdBlock • SearchApp.exe • CPU-Z |
| Команды | ^H • ^W • Alt+F4 • Ctrl+Alt+Del • man • /me • /quit • rm -rf |
| Глубокий смысл скрыт в этих неестественных языках | |
|---|---|
| Языки программирования | Промышленные: 1С • BAT • C# • C • C++ • Java • JavaScript (AJAX) • Pascal • Perl • PHP • Python • Ruby • ABAP • Ассемблер • Васик • Фортран Эзотерические: BrainFuck • HQ9+ • + • Erlang • Forth • Haskell • LISP (My other car) • Prolog • Tcl • Τ Ε Χ • Oracle • MySQL • Golang • В++ |
| Профессии | Быдлокодер • Программист • Тестировщик • Хакер • Хеллоуворлдщик • IT-звёзды |
| Методы и стили | Reverse Engineering • Анти-паттерн • Выстрелить себе в ногу • Грязный хак • Код (индусский) • Костыль • Метод научного тыка • Помолясь • Свистелки и перделки • Очередь • Спортивное программирование • Обфускация • Бета-тест • Альфа-тест • Шаблоны • RegReplace |
| Средства разработки | Sublime Text • Подсветка синтаксиса кода • Unstable Diffusion • API • PythonTutor • CodeWars • DataCamp |
| Люди | Илья Кантор • Юрий Ключевский • Эдуард Лаас |
| Прочее | ++i + ++i • Deadline • %s • 640 килобайт • CMS • Dummy mode • ЕГГОГ • Foobar • God is real, unless explicitly declared as integer • GOTO • Ifconfig • KISS • RegExp • SICP • sql.ru • Xyzzy • Дискета • Инжалид дежице • КОИ-8 • Лог • Ман • Рекурсия • СУБД • Тест Тьюринга • Умение разбираться в чужом коде • Фаза Луны • Фатальный недостаток • Проблема 2000 • Таймстамп • Кэш • Запись в файл без кэша (Perl) • Танцы с бубном |
Как правильно использовать костыли в разработке и не наплодить ошибок
В любом серьёзном проекте разработки найдутся костыли. Это естественный элемент пейзажа и процесса. Рассказываю, как ставить их правильно.



Денис Ушанков
Архитектор бизнес-систем

об авторе
Ссылки
Костыльное программирование — это, мягко говоря, не идеальное решение. Костыль чаще всего не оптимизирован с точки зрения эффективности и производительности. И всё-таки иногда они нужны. Причин, по которым костыли появляются в коде, великое множество. Чаще всего их используют для быстрого и простого исправления ошибки, чтобы не переписывать половину модуля. Но бывают и другие случаи.
Костыляем правильно
Виртуальный график количества костылей ко времени в коде живого проекта напоминает пилу, у которой каждый зубчик — итерация. Цикл итераций выглядит примерно так:
- Внедрили костыли.
- Накопили в определённой части проекта некую критическую массу костылей.
- Провели рефакторинг, встроили костыли в логику, переписав часть кода.
Помните, что рефакторинг — достаточно затратный процесс, так как на этом этапе нужно понять статус и общую картину, расписать текущий алгоритм, проверить все точки соединения с другими частями проекта и с внешними ресурсами, провести миграцию существующих данных.
Тестирование отрефакторенного проекта — это отдельная задача неочевидной на первый взгляд сложности. Следует проверить, не потеряли ли мы что-нибудь нужное в процессе отработки наших костылей.
Когда вы работаете на молодой развивающийся проект, создавайте набор точечных и специфичных утилит — такой вариант разработки долгое время будет одним из наиболее эффективных:
- Мы достаточно оперативно получаем рабочие инструменты, которыми бизнес может пользоваться.
- Мы копим данные в нашей базе.
- Мы получаем фидбек от бизнеса.
- Бизнес адаптирует свои процессы под наши инструменты и уточняет ТЗ на будущую разработку до того, как мы всё сделали по-своему.
В проекте, где бизнес-процессы неустойчивы, сложное целостное программное решение продержится до первой непредугаданной «хотелки» заказчика. А она прилетит очень скоро.
Архитектура кода не может быть стройнее и сложнее архитектуры бизнеса.
Стройная и красивая архитектура возможна только в случае, когда вы сразу видите полный объём решаемых задач. Для эволюционирующего бизнеса это условие практически невыполнимое. Поэтому очередной рефакторинг стоит проводить тогда, когда вы заново качественно переосмыслили, как должна работать определённая часть проекта.
Костыль усложняет и восприятие кода — код, напичканный обработчиками частных случаев, очень сложно поддерживать. И в какой-то момент такой код становится невозможно развивать.
Если ваш костыль живёт в коде достаточно долго, а тем более если он обрастает братьями и сёстрами, — следует запланировать рефакторинг в одной из ближайших итераций.
Когда пригодятся костыли
Такие частные решения всё-таки находят свое применение:
- Позволяют решать задачи и тушить пожары при недостаточности ресурсов разработчиков.
- Помогают, когда заказчик хочет протестировать какую-то гипотезу.
Так мы можем «быстро накостылять, а потом, если идея сработает, выпилить костыль и написать код с нуля как следует» — это хорошее решение для лёгких быстрых проектов. Но если речь идёт о высоконагруженных проектах, то неоптимизированный и не доведённый до ума код может поставить под угрозу работу всей системы.
И помните, что даже костыль нужно писать аккуратно, грамотно, соблюдая стилистику и максимально подробно описывая причину, по которой он создавался. Это нужно, чтобы, вернувшись к своему же коду год-два спустя, вы не испытывали неловкость, найдя ответ на вопрос «Кто писал этот бред?».
Читайте также:
- Татьяна Свиридова: «Если что-то не получается, спрячьте эмоции и решайте задачу»
- Windows vs macOS: за что разработчики ругают и хвалят популярные операционные системы
- Пишем простой редактор аватарок на JavaScript
Костыли в программировании — что это такое
![]()
Костыли — это неудобные, но работающие решения той или иной проблемы в коде программы.
Неудобные обычно в смысле трудности дальнейшего развития системы и относящиеся к плохому стилю.

Работают они как-то так:
Примечание: иногда (не так часто) делать костыли приходится вынуждено из-за чисто технических ограничений, например, существования разных браузеров, которые при этом и работают сильно по-разному.
Часто костыль делают именно как быстрое решение — когда лень (+ отсутствие времени и/или навыков) не позволяет сделать что-то более продуманное и осмысленное.
Костыли обычно чужие — не свои
Как говорит один уважаемый человек: костыли — относительное и субъективное понятие, и обычно их замечают только в чужом коде (почему-то 😉
В своём же коде программист под воздействием таинственных сил часто ничего плохого не видит!
Этот феномен не разгадан до сих пор.
А что у нас в реальности
Большинство реальных программистов так или иначе, хотя бы раз в жизни «костыляли» свои программы — то есть использовали быстрые, но неизящные решения, в связи с чем их (костыли) и отобразили на знаменитом гербе программистов.
Более того, некоторые программисты следуют только стилю костылей, практически не производя иных продуктов))
Как сервировать костыль — и подавать в «правильном» освещении
Если хочется приподнести быстрое решение проблемы в положительном смысле — назовите его хаком 😉
Что такое костыли в программировании?


Надо ли знать программисту историю ЭВМ, машинный код и уметь работать с низкоуровневыми языками?

Сергей Немчинский: Как решать задачи как программист?

Советы по карьере для программистов
Программирование — это творческий процесс, который требует нестандартного мышления и инновационных подходов. Однако в некоторых случаях, чтобы справиться с задачей, программисты прибегают к такому явлению, как «костыли». В данной статье мы рассмотрим, что такое «костыли» в программировании, почему они используются и какие проблемы могут возникнуть при их использовании. Также мы рассмотрим различные типы «костылей», советы по избежанию их использования и практические рекомендации по устранению уже существующих.
Что такое «костыли» в программировании?

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

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

Похожие материалы
Что программисту делать с чужим говнокодом?
5 привычек, мешающих писать хороший код
Надо ли знать программисту историю ЭВМ, машинный код и уметь работать с низкоуровневыми языками?
Сергей Немчинский: Как решать задачи как программист?
Советы по карьере для программистов
Что такое костыли в программировании?
Костыли — это временные решения, которые используются для исправления проблем в коде, но не являются оптимальными решениями.
Почему использование костылей может привести к проблемам в программировании?
Использование костылей может привести к сложному и неподдерживаемому коду, а также создать проблемы с производительностью и безопасностью.
Как избежать использования костылей в программировании?
Избегайте написания специального кода для исправления конкретных проблем. Вместо этого рекомендуется написать чистый, оптимальный и поддерживаемый код.
Какие примеры костылей в программировании вы можете привести?
Примеры костылей могут включать в себя написание специального кода для обхода багов или проблем с производительностью, использование временных файлов для хранения данных или включение магических чисел в код.