Хардкодинг, Говнокодинг и Шизокодинг / Хабр
Есть 3 проблемы кода, с которыми встречаешься в программировании: Хардкод, Говнокод и Шизокод.
Давайте поговорим об этом.
Хардкод
Это известная всем проблема, когда программист из-за спешки или лени пишет код без учета переменных. Пожалуй самый частый случай — домен сайта. Он может меняться от окружения к окружению и часто доставляет массу хлопот. Тут все просто. В разных платформах это решается по разному. Главное соблюдать соглашения и правила принятые в рамках платформы.
Обычно проблемы этого класса быстро обнаруживаются и легко лечатся.
Говнокод
Это более сложная проблема. Часто субъективная. Грубо говоря — это нарушение стиля кода, принятого в голове, команде или сообществе.
Есть разные стили кода в зависимости от платформы и даже иногда внутри платформы:
- Symfony Coding Standards
- WordPress Coding Standards
- PSR — PHP Standards Recommendations
Это из мира php. В других сообществах ситуация похожая. Сюда же можно отнести истории про таб, таб через 2 пробела или таб через 4 пробела и т. д.
Здесь же возникает проблема чистого кода… например длинные функции на 3-4 страницы, что критикуется. Это не всегда конечно плохо, но часто можно такие функции сделать короче, разбить на ряд коротких функций, каждая из которых решает свою задачу.
Обычно эти проблемы легко лечатся через софт и контроль принятых стандартов в конкретной команде.
Высший пилотаж, когда разработчик может переключаться между разными стилями кода в зависимости от проекта.
Плохо когда разработчик нарушает стиль кода принятый в команде или считает свой любимый (часто единственно выученный) стиль кода единственно правильным.
Не бывает правильных стилей кода. Бывают утвержденные стили в команде или общепринятые стили.
Тоже относительно простая проблема и легко решаемая.
Шизокод
Вот это менее популярная проблема, но часто наиболее дорогостоящая.
Шизокод — происходит от понятия шизофрении. Выжимка из Википедии:
Шизофрени́я (от др.-греч. σχίζω «расщеплять», «раскалывать» + φρήν — «ум, мышление, мысль»), ранее лат. dementia praecox («слабоумие преждевременное») или схизофрени́я — эндогенное полиморфное психическое расстройство или группа психических расстройств, связанное с распадом процессов мышления и эмоциональных реакций.
Тут 2 важных тезиса: раскалывание и слабоумие. Которые являются причинам шизокода.
Идеальный код — тот который не написан. Шизокодеры не знакомы с этим понятием.
Если коротко то шизокод, это код, который нарушает принцип Бритвы Оккама.
Выжимка из Википедии:
«Бритва (лезвие) О́ккама» — методологический принцип, получивший название по имени английского монаха-францисканца, философа-номиналиста Уильяма Оккама. В упрощенном виде он гласит: «Не следует множить сущее без необходимости»
Выражается в том что разработчики начинают усложнять код и архитектуру без веских на то причин. Или вескость причин существует только в их воображении.
Воображаемые проблемы — корень плохого ПО
Есть 2 основных симптома: изобретение велосипедов на костылях и размножение слоев абстракции.
Изобретение велосипедов на костылях
Выражается в том что разработчики ввиду плохой способности обучаться вместо поиска оптимальных решений/методов в рамках платформы и существующей архитектуры начинают изобретать велосипеды/костыли.
Примеры:
- Написание своих CMS/фреймворков птм что у существующих есть фатальный недостаток
- Блог на Symfony. При том что весь мир для этого использует WordPress.
- Интернет-магазины на Laravel, при том что есть WooCommerce (№1 в мире), Magento (тоже хорошо), 1С-Битрикс (на худой конец, лучше чем Laravel)
- Встречал ситуацию когда верстка была на Bootstrap, но разработчик решил написать свои стили для меток (label). Что мешало добавить класс label, который уже есть в Bootstrap?
- Излишним функциям, методам и классам нет исчисления, которые можно было избежать используя уже готовые библиотеки и методы в используемых платформах
Бесконтрольное размножение слоев абстракции: лишние классы, наследования, методы
Внимательный читатель мог заметить конфликт с говнокодом. В одном случае проблем в том что функция или класс слишком длинный, а тут проблема в том что возникает наоборот избыточное дробление сущностей.
Тут нужно отметить что это одна из крайностей, границу которой не всегда просто соблюсти.
С одной стороны плохо все пытаться решать одной функцией на 3 страницы или класс который содержит в себе HTML и механики шаблона и где-то выгоднее разбить код на несколько функций/классов/компонентов, каждый из которых решает свою задачу. Это одна крайность.
С другой стороны плохо простой код разбивать на 5 классов в каждом из которых 3-4 метода по 3-4 строки, со множеством бесполезных наследований, когда можно обойтись одним или двумя с минимальным наследованием или даже без наследования если этого можно избежать.
Последствия лишних и плохих абстракций
Размножение методов, классов, наследований без веских причин — это лишний код и рост слоев абстракции.
У всего есть цена, как и у лишних абстракций:
- удоражается обучение новых разработчиков
- чем больше кода, тем больше точек отказа, тем больше ошибок
- усложняется диагностика и отладка кода
Проблема конечности мыслетоплива
Чем больше слоев абстракции, наследований, методов, тем больше нужно мыслетоплива для изменений, улучшений и диагностики проблем.
А рабочий объем мыслетоплива конечен и часто его нехватка влечет очень большие затраты на разработку.
Каждый разработчик, который делал диагностику и изменение шизокода упирался в дефицит мыслетоплива. Но не все это осознавали.
Видео, в котором объясняется что такое мыслетопливо и дается простое упражнение на 1 минуту, которое позволяет вспомнить ощущение дефицита мыслетоплива на простом примере:
Это наезд на ООП, классы и наследование?
Отнюдь. Однако доля правды в этом есть. В функциональном стиле проще наговнокодить, но шизокодить там сложно. ООП же с одной стороны дает множество преимуществ, но и открывает простор для шизокода.
ООП, классы и наследование — это не плохо и не хорошо. Это инструменты. Я лично их использую.
Однако у меня есть ряд собственных правил:
- Классы пишу почти всегда из-за инкапсуляции, но часто мне хватает Синглтонов, статических методов и stateless
- Там где есть частоиспользуемый метод — пишу функции, которые часто являются лишь обертками для методов какого-либо класса, но иногда функция это просто функция без класса и это хорошо там где уместно.
- Классы stateful — да, но реже и опять же только там где есть веские причины
- Наследования еще реже, и только там где на то есть веские причины (стараюсь уменьшать слои абстракции и экономить мыслетопливо в команде)
Резюме
Мы много говорим о хардкоде и говнокоде т.к. они понятны и легко осязаемы. А вот шизокод часто остается безнаказанным, птм что его сложнее выявить и понять объем вреда от него. А объем вреда от него возможно больше чем можно представить с наскоку.
Мой манифест простой:
- лучше изучить принцип Best of breed, прежде чем изобрети очередной никому не нужный велосипед на костылях
- давайте писать меньше шизокода
- давайте учиться соблюдать принцип Бритвы Оккама и не усложнять код без причины
- давайте экономить свое мыслетопливо и своей команды
Ну и буду рад комментариям как в поддержку манифеста, так и его критике.
Что такое Бритва Оккама — Узнай Что Такое
Бритва О́ккама (или «лезвие О́ккама»; лат. lex parsimoniae — закон бережливости) — принцип в философии и науке, который утверждает, что не следует делать ненужных предположений, т. к. по всей вероятности, правильным ответом является самое простое из них. Т. е. обычно, самое простое объяснение — правильное.
Ещё называется принципом бережливости.
Принцип Оккама был представлен в 14 веке Уильямом Оккама (английский философ-схоласт, жил приблизительно в 1284 – 1347).
Суть принципа Оккама
Простым языком этот закон звучит так:
“Если существуют две конкурирующие теории, которые обе могут оказаться правдой, значит нужно выбрать наиболее простую из них”.
Очень часто встречается такая формулировка принципа Оккама:
«Не нужно множить сущее без необходимости».
Иногда этот принцип выражается и в таких словах:
«Что можно объяснить посредством меньшего, не нужно выражать посредством большего».
Все эти фразы говорят об одном и том же — всё это отражает содержание одного и того же принципа.
Примеры применения принципа бритвы Оккама
Две гипотезы о больной голове
Представьте ситуацию: у вас заболела голова. Ваш собеседник сразу же предложил гипотезу, что у вас Синдром потери ликвора — это очень редкая болезнь, но один из симптомов этой болезни головная боль.
Используя бритву Оккама, лучше будет предположить что-то проще — простуда. Сразу будет очевидно, что вероятнее всего это второе.
Две гипотезы о вспышке света
Вы сидите дома, идёт дождь. Вы увидели яркую вспышку света сквозь шторы. У вас появились два возможных объяснения:
а) это молния;
б) это НЛО;
Мы не можем быть уверены на 100%, но наиболее вероятная гипотеза всё-таки «а».
Две гипотезы о доске
Одна доска забора отвалилась. Появились две гипотезы:
а) слепой лось, потерявшись в поисках своего друга птички-синички, выбежал из леса, и в отчаянии, врезался в забор;
б) проржавели гвозди и доска отвалилась.
Опять же, мы не можем быть уверены на 100%, но намного более вероятно всё-таки самое простое объяснение с ржавыми гвоздями.
Пример из медицины
Профессора часто говорят своим студентам-медикам: «Если слышишь стук копыт, думай о лошади, а не о зебре».
Это утверждение было придумано доктором Теодором Вудвордом. Он использовал эту фразу для того, чтобы научить своих студентов искать более распространённые медицинские диагнозы.
Можно ли порезаться бритвой Оккама или в чём состоит опасность упрощения?
Бритва Оккама — это ещё одна ментальная модель (наш способ понимания, как работает мир). Она не является неуязвимой и должна быть использована рассудительно.
Из любого правила существуют исключения. Никогда нельзя слепо следовать ментальным моделям, в противовес логике и опыту.
Самые умные — это те, кто знает правила, но также знает, когда их следует нарушать.
Когда вы слышите стук копыт, в большинстве случаев вы должны думать о лошадях, не о зебре, но если вы находитесь в Африке, ситуация несколько меняется.
Использование бритвы Оккама в науке
В этой среде использование бритвы Оккама является вопросом практичности, т. к. более простую гипотезу зачастую дешевле доказать (и легче получить финансирование).
Не усложнять, но и не упрощать
Знаменитая фраза Эйнштейна:
«Всё должно быть сделано просто на сколько возможно, но ничуть не проще».
Альберт Эйнштейн
Реальный смысл фразы от Харлана Кобена
Американский писатель Харлан Кобен считает, что Оккама не поняли до конца, делают её проще, когда выбирают самый простой вариант.
Писатель объяснил реальный смысл таким образом:
«Вы не должны усложнять или «громоздить» теорию, если более простое объяснение уже было наготове».
Харлан Кобен
Краткая биография Уильяма Оккама
Философ родился около 1284 года в Оккам (Англия).
Насколько известно, он был совсем молодым, когда вступил во Францисканский орден. Его обучение во францисканском монастыре было сосредоточено на изучении логики, и на протяжении всей жизни его интерес к этому предмету так и не уменьшился.
Монах-францисканец получил степень в богословских исследованиях в Оксфордском университете. Считается, что он baccalaureus formatus, т. е. кандидат в магистры теологии.
Осенью 1324 года он покинул Англию и отправился во Францию (Авиньон), папа Иоанн XXII призвал его к ответу за обвинение в ереси. Оккам не был официально осуждён, но в 1328 году он был отлучён от церкви.
Долгое время считалось, что Окхам умер в монастыре в Мюнхене в 1349 году, во время Чёрной смерти (ещё называется Чёрный мор). Но возможно, он умер там ещё раньше — в 1347.
Бритва Хэ́нлона
Это ментальная модель, которую можно объяснить так: не приписывать злой умысел тому, что может быть простой человеческой ошибкой.
Например:
- ваш коллега не пришёл на совещание? Возможно это произошло не вам назло, а потому, что он перепутал время;
- официант перепутал ваш заказ? возможно на него только что накричали;
- новый знакомый долго не отвечает на ваше сообщение? Возможно вы просто неправильно указали адрес?
Применение бритвы Хэнлона в повседневной жизни позволяет улучшить межличностные отношения, помогает стать менее осуждающим и повышает рациональность. Используя бритву Хэнлона, человек проявляет больше сочувствия.
Таким образом, ценность бритвы Хэнлона может проявляться в личных и деловых отношениях.
Понимание Бритвы Оккама. Введение | Автор Nikhil Samuel
Чтение: 4 мин.·
30 октября 2017 г. но философский те, в частности, бритва Оккама.Согласно Википедии, философская бритва — это принцип или эмпирическое правило, позволяющее исключить («сбрить») маловероятные объяснения явления.
Понимание бритв
Почему важно понимать бритвы? Они могут быть очень важными из-за их способности решать сложные проблемы с помощью эвристики, чтобы мы могли принимать лучшие решения. Какая-то проблема слишком сложная? Попробуйте использовать бритвы, чтобы упростить его. Это легче сказать, чем сделать. Нужно потренироваться использовать их в разных ситуациях.
Бритвы существуют уже почти два тысячелетия. Бритва Оккама, в частности, приписывается Уильяму Оккаму, который жил в конце 1200-х годов, но эта идея существует со времен Аристотеля. (Также см. Эффект Линди).
Итак, что такое бритва Оккама?
Среди конкурирующих гипотез следует выбрать ту, в которой наименьшее количество предположений.
В основном это означает, что при столкновении с конкурирующими гипотезами следует выбирать ту, которая делает наименьшее количество предположений и, таким образом, наиболее открыта для проверки, и не умножать сущности без необходимости.
Это, конечно, предлагалось много раз до него, но это было приписано ему из-за того, что он часто использовал этот принцип. Когда я впервые столкнулся с этим, было довольно сложно понять и применить его, поэтому я использую более свежую формулировку этого принципа. Это изречение Теодора Вудворда, в котором говорится:
Когда слышишь стук копыт, думай о лошадях, а не о зебрах
Принцип основан на двух других принципах, а именно — на принципе множественности (множественность не должна постулироваться без необходимости) и на принципе экономии (бессмысленно делать с большим количеством того, что делается с меньшими затратами).
Важно помнить, что бритва Оккама ничего не доказывает. Вместо этого он служит эвристическим приемом — руководством или предложением, — утверждающим, что при наличии двух объяснений одного и того же явления более простое из них — 9.0037 обычно правильный.
Проблемы
Есть две проблемы с использованием бритвы Оккама в качестве инструмента для доказательства или опровержения объяснения. Во-первых, определение того, является ли решение простым, является субъективным, поскольку интерпретатор должен решить, простое оно или нет. Во-вторых, то, что это просто, не обязательно означает, что это правда.
Был отличный пример, который я видел, когда изучал этот материал. Это выглядит так:
«Есть некоторые креационисты, которые говорят, что бритва Оккама доказывает правильность их идеологии. В конце концов, не проще ли объяснить, что Бог создал жизнь, вселенную и все остальное, чем сказать, что это было создано Большим взрывом, за которым последовала поразительная серия взаимосвязанных совпадений?»
Заключение«Это объяснение предполагает, что Бог существует, а у нас нет эмпирических доказательств того, что он существует».
На практике бритва Оккама используется для отсекания элементов теорий, которые нельзя наблюдать. Следует помнить, что это не обязательно доказывает, что одна теория верна.
Ознакомьтесь с другими бритвами (Источник: Википедия):
- Бритва Оккама: столкнувшись с конкурирующими гипотезами, выберите ту, которая делает наименьшее количество предположений и, таким образом, наиболее открыта для проверки. Не умножайте сущности без необходимости.
- Бритва Грайса: из принципа экономии следует предпочесть разговорные импликации семантическому контексту для лингвистических объяснений.
- Бритва Хэнлона: Никогда не приписывайте злому умыслу то, что вполне можно объяснить глупостью.
- Бритва Юма: «Если причина, назначенная для какого-либо следствия, недостаточна для его производства, мы должны либо отвергнуть эту причину, либо добавить к ней такие качества, которые придадут ей правильную пропорцию следствию».
- Бритва Хитченса: «То, что можно утверждать без доказательств, можно отвергнуть без доказательств».
- Бритва Альдера: Также известная как «Пылающий лазерный меч Ньютона», она утверждает, что если что-то не может быть установлено экспериментальным путем или наблюдением, то это не заслуживает обсуждения.
- Принцип фальсифицируемости Поппера: чтобы теория считалась научной, она должна быть фальсифицируемой.
- Бритва Рэнда: концепции не следует умножать без необходимости — следствием чего является: они также не должны интегрироваться без учета необходимости.
- Бритва Дарвина
Документация по ключевым словам ABAP
SAP NetWeaver AS ABAP, выпуск 740, © Copyright 2014 SAP AG. Все права защищены.
Документация по ключевым словам ABAP → Руководство по программированию ABAP → Общие правила →Принцип ПОЦЕЛУЯ
Фон
Принцип KISS гласит, что вы всегда должны выбирать самое простое решение проблемы.
- Будь проще, тупица.
- Небольшой и простой.
- Будьте милыми и простыми.
- Будьте проще и понятнее.
- Пишите кратко и просто.
- Будьте проще и умнее.
- Будьте предельно простыми.
Основное утверждение принципа KISS похоже на бритву Оккама, которая гласит, что в науке предпочтительна теория, которая делает наименьшее количество предположений для объяснения наблюдений (см. статью в Википедии о принципе KISS).
Правило
Следуйте принципу KISS
Следуйте принципу KISS и максимально ограничивайте сложность ваших программ.
Подробности
Лучшим решением проблемы обычно является то, которое является максимально простым, минималистичным и легким для понимания, обеспечивая при этом стабильность, понятность и ремонтопригодность в дополнение к функциональной корректности.
Есть много плохих примеров принципа KISS. Почему это?
- Программы слишком сложны с самого начала. Это может быть связано с плохим дизайном или просто с необдуманным, недисциплинированным стилем программирования.
- Программы сохраняются в течение длительного времени. Вместо того, чтобы создавать новые реализации для старых и новые функции вместе, новые функции просто добавляются (обычно с помощью IF структуры управления) к старым функциям. Программы, изначально простые, становятся все более сложными, хотя это и не оправдывается сложностью решаемой задачи.
Чтобы разрабатывать по принципу KISS, вы должны с самого начала убедиться, что сложность программы остается управляемой. Правила, поддерживающие этот подход, касаются структура и стиль программ, в частности комментарии и сложности.
Примечание
Если существующие программы не соответствуют принципу KISS, и эти программы нуждаются в дальнейшем развитии, мы рекомендуем провести рефакторинг по мере необходимости. Рефакторинг относится к процессу ручного или автоматического улучшение структуры программ при сохранении наблюдаемого поведения программы. Улучшает разборчивость, понятность, ремонтопригодность и расширяемость, а также значительное сокращение усилия по устранению неполадок и улучшению функциональных возможностей (см. статью в Википедии о рефакторинге). (дополнительный) рефакторинг существующей программы полезен не только для соблюдения вышеуказанного правила, но и для всех следующих правил.
Рефакторинг существующего кода поддерживается требуемым покрытием модульные тесты. Комплексные модульные тесты могут гарантировать, что программа будет вести себя одинаково после процесса рефакторинга.
Пример
На рисунке ниже показана структура метода, который не следует принципу KISS. Метод состоит примерно из 160 утверждений и достигает глубина вложенности 12 уровней. Метод, показанный лишь схематически, представляет собой реальный пример из работающей ABAP-программы, которая достиг состояния, показанного слева, после непрерывных дополнительных разработок.