Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория

05.06.22

Разработка - Рефакторинг и качество кода

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

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

Общая благодарность за проявленный интерес, выставленные положительные оценки, лестные комментарии и конструктивное обсуждение. К сожалению, принять в этом обсуждении активное участие у меня сейчас возможности нет, но я постараюсь подготовить небольшой текст на поднятую в обсуждении актуальную тему «Все это хорошо в теории, но 95% реальной практики таковы что 😞». Можно считать небольшим анонсом и уж поверьте, показатель 95% слегка завышен.

Третья, практическая часть будет опубликована через неделю, редактура как раз завершается.

Disclaimer

Коллеги, вашему вниманию предлагается почти финальный вариант моей книжки. Была и остается идея издать это в бумажном варианте, но идея довольно зыбкая. К сожалению, имеются некоторые проблемы со здоровьем. Но очень хочется, чтобы труд не пропал, поэтому книжка отдается в открытый доступ. Можно публиковать где угодно, цитировать и так далее. Единственное условие – ничего в тексте не менять и указывать авторство. Автор текста – Никита Викторович Зайцев (также известный как WildHare).

Книжка повествует об эффективной разработке программного обеспечения. Можно сказать, что это дистиллят моей личной практики, наработанного опыта, знаний и умений.

Предыстория появления книжки в формате интервью порталу Инфостарт:

//infostart.ru/journal/news/mir-1s/nikita-zaytsev-ya-universalnyy-soldat-v-mire-1s_1250753/

Это уже не полуфабрикат, а почти готовый продукт, правда без нескольких не особо важных деталей. Если работу над книжкой получится продолжить, то эти недостающие детали будут добавляться именно сюда, в эти файлы.

Приятного чтения ;-)

 

Автор в естественной среде обитания – II

 

Сила светлой стороны

Как и почти в любом деле, сначала нужно изучить азбуку. Будущий специалист по космической связи начинает с изучения азбуки Морзе. Будущий капитан дальнего плавания начинает с парусной морской азбуки. Будущий такелажник начинает с такелажной азбуки, правда, она довольно короткая. Ну — и так далее.

 

Level zero

Будущему разработчику программного обеспечения так же стоит начинать с изучения азбуки. Не азбуки программирования, разумеется. Программирование — это искусство писать программы. Собственно, хрестоматийная работа Дональда Кнута так и называется. Попробуем сформулировать, в чем разница.

Разработка программного обеспечения это искусство писать программу так, чтобы издержки на ее написание, на работу с ней, а также на ее сопровождение и развитие были минимальными.

Программист оперирует понятиями изящности, оптимальности, оригинальности. Разработчик программного обеспечения оперирует принципом экономии сил, экономической эффективностью и коэффициентом полезного действия. Это вовсе не значит, что можно писать кривые и неряшливые программы. Разумеется, программа должна быть красивой и оптимальной. Но важно помнить, что сама по себе красота может украсить только музей или подиум. А у нас, извините, но так уж вышло, промышленное производство.

Азбука никогда не бывает длинной, иначе это уже букварь. В нашем случае под азбукой понимается несколько крайне простых, но безусловных принципов. Базовые принципы разработки очень похожи на уставы караульной и конвойной службы. Эти принципы написаны кровью убитых систем, проваленных под землю проектов и утопленных в болоте талантов.

 

Принцип DRY

По-английски это значит Don’t Repeat Yourself. По-русски — Не Повторяй Себя. Есть и альтернативная аббревиатура, DIE. Duplication Is Evil. Копирование-вставка Есть Зло.

Смысл принципа: одинаковый или почти одинаковый программный код не должен располагаться в двух или более местах. Если ты скопировал фрагмент кода и хочешь вставить в другое место, а потом слегка поправить — бей себя по рукам линейкой. Ну, как раньше делали школьные учителя (и очень жаль, что такую практику запретили, любуйтесь теперь на плакаты и вывески, не говоря о письмах и документах).

Казалось бы, это все-таки принцип программирования, причем здесь разработка? А вот причем. Разработчик пишет не просто программу, он пишет код, устойчивый к изменениям. И допускает, что изменения будут вносить совсем другие люди. У этих людей не будет технической документации, потому что времени составить спецификацию кода, как всегда, не хватило. Эти люди добросовестно перекопают все модули, найдут два места из трех, и доработают логику. А вот до третьего места они не доберутся, слишком уж глубоко закопано. Что будет после обновления? Правильно, именно маленький и пушной. На экране все выверено и правильно, ну а что в налоговую уехали немного другие суммы, потребитель программы узнает чуть позже. Из повестки, например.

Этот же принцип касается не только кода, но и заголовочных комментариев. Просто возьмите любую конфигурацию и посмотрите на однотипные функции. Довольно поучительное зрелище.

Копирование — зло. Не копируйте, пишите. Руки не отвалятся.

 

Принцип GIGO

По-английски это значит Garbage In Garbage Out. Русский аналог — Мусор на Входе Мусор на Выходе.

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

Пример из личной практики автора. Некоему программисту, назовем его Петр, поручили реализацию довольно сложной отчетной формы. Там нужно было собрать хитрые агрегаты из огромного массива сырых данных, а потом еще и вывернуть наизнанку. На выходе одна страничка, что-то вроде черты под балансом. Петр написал изумительно красивую и оптимальную расчетную механику. Но когда стали проверять на продуктиве, вышло примерно так:

— Петр, позвольте, но здесь же отрицательная прибыль. Это как такое может быть? Вы же сами тестировали, вас не смутило?

— Ну и что из того? Отрицательное число такое же число, как и прочие. Алгоритм отработал правильно, что в базе, то и на выходе.

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

Принцип GIGO действительно является законом природы. Разница в практическом следствии. Программист заботится только о корректности работы своих алгоритмов. Разработчик программного обеспечения проверяет и валидирует входные данные, не допуская мусор дальше порога.

— Как вы могли выставить мне счет на два триллиона рублей?

— Ну вы же сами в форме заказа указали “по 31.12.2919”.

— <пять этажей 18+>

Пользователи ошибаются при вводе. Коллеги ошибаются при вызове ваших интерфейсов. Доверять нельзя никому. Проверяйте.

 

Принцип KISS

Согласно некоторым источникам, этот принцип был сформулирован проектировщиками US Navy в лохматых шестидесятых годах прошлого века. Но к разработке программного обеспечения он подходит идеально.

По-английски это значит Keep It Simple Stupid. Вольный перевод на русский звучит как Упрощай Где Можно Дурашка.

Суть принципа: простые системы всегда работают лучше и надежнее, чем сложные и навороченные. Если задачу можно решить простым способом, используя простые инструменты, именно так и нужно сделать.

Чтобы повесить картину на деревянную стену, достаточно вбить молотком обычный гвоздь. Пневматический молоток и лазерный дальномер в едином комплексе с бортовым микроконтроллером для развешивания картин слегка лишние. Хочешь, чтобы твое чадо не навернулось с продвинутого детского кресла (подогрев, пять режимов качания, встроенный дисплей с возможностью загрузки мультиков через WiFi), сажай на низкую трехногую еловую табуретку. Самая надежная конструкция. Ну, и так далее.

Собственно, KISS прямо запрещает использовать более сложные инструменты, алгоритмы, структуры данных и так далее, чем это необходимо для решения задачи. Не рекомендует, а именно запрещает, категорически.

Ну вот элементарный пример, известный всякому, кто имел дело с одной известной библиотекой. Нужно просто взять контрагента, и записать в базу контактный телефон. Казалось бы, один метод, да? Но это было бы слишком просто. Нужно применить магию типов и видов, вызвать несколько методов с последовательной передачей параметров, не напутать, что куда и откуда переставить, и вот тогда — если повезет, телефон в базу запишется. А если очень повезет, то потом даже и прочитается.

Автор ни в коем случае не хочет отнести крайнюю справа букву аббревиатуры KISS уважаемым коллегам, с которыми провел столько увлекательных совещаний. Но, парни, как так-то? Нужно просто вбить гвоздь, а плотнику вместо молотка выдают строительный станок с ЧПУ, который, если хорошо попросить, сумеет сыграть на перфораторе “Пещеру горного короля”.

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

 

Принцип YAGNI

Нет, индийская мифология здесь ни при чем. Про индийское кодирование мы поговорим в следующей главе. Все гораздо прозаичнее: You Aren't Gonna Need It. Иными словами, Вам Это Не Нужно.

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

Собственно, незнание этого принципа представляет собой первую ловушку для начинающего специалиста по работе с требованиями. Ну а в нашей отрасли таким специалистом является сам разработчик. И вместо того, чтобы поставить перед капризным заказчиком гранитную стену принципа YAGNI

— Какую задачу мы решаем этой свистелкой? Нет ответа? Вам это не нужно.

этот специалист зачем-то превращается в официанта

— Чего изволите? Восьмибитный свист? Хорошо. И чтобы дырочки были восьмиугольными? Запросто. И чтобы если нарисовать в воздухе скрипичный ключ, оно само свистело “Коробейников” из тетриса? Не вопрос, я все записал.

Это какой-то бич отрасли. Заказчику, пользователю, потребителю не нужны программные продукты, как таковые. Ему даром не нужны функции, формы, команды и прочее. Потребителю программного продукта нужно просто выполнить свою задачу с максимальным КПД. И только. Но сам он этого не понимает, и вместо того, чтобы описать задачу, сразу описывает способ решения. Но это ведь то же самое, если бы пассажир на калькуляторе показывал конструктору, какая форма фюзеляжа обеспечивает лучшую аэродинамику.

YAGNI действует и в обратную сторону. Когда разработчики слушают воображаемого заказчика. Собираются и думают, а какую бы еще свистелку приделать, чтобы порадовать наших пользователей? Реальный пользователь получает обновление — что это, зачем оно высвистывает “Коробейников” при расчете? Мне это не нужно!

Собственно, принцип YAGNI в первом приближении сформулировал еще Оккам. Не плодите сущности сверх необходимого.

 

Принцип недотроги

Описанные выше принципы можно назвать каноническими. Но ими азбука разработки не исчерпывается. Попробуем сформулировать еще один принцип, который относится не просто к разработке, но к самому трудному ее виду — сопровождению. Автор называет это “принципом недотроги”, но наверняка есть десяток других названий.

Прежде всего, что такое сопровождение и в чем отличие от поддержки? Поддержка подразумевает эксплуатацию системы без возможности внести какие-либо изменения. Специалист поддержки просто рассказывает пользователю, как правильно работать с системой, то есть выполняет роль проводника через болото. А вот сопровождение не просто разрешает изменения, но и требует их — мир меняется, бизнес меняется, правила меняются, и система тоже должна меняться.

Суть принципа: не уверен, не трогай. Даже когда в системе что-то кажется странным, ошибочным, избыточным, но нет четкого понимания, зачем оно такое, и что может случиться, если это что-то исправить — убери руки за спину, не трогай.

Этот принцип лучше всего показать на примерах, так что самое время запустить кофе-машину. Примеры, само собой, из реальной практики.

 

Кофе-пауза #4

Пример первый. На некоем предприятии эксплуатируется довольно серьезна система. Ведущий разработчик системы, назовем его Петр, условно первый (a.k.a. Петр-строитель), построил систему с нуля, запустил и наладил. Но поскольку первому поколению Петров гораздо интереснее строить, чем сопровождать, он заскучал и отчислился с предприятия, покорять новые вершины профессии.

Сопровождать систему был призван другой специалист. Назовем его Петр, условно второй (a.k.a. Петр-эксплуатант). Это был прирожденный специалист по сопровождению, строить он не любил, выходило как-то кривовато, а вот дорабатывать и развивать уже готовое — совсем другое дело. Петр-эксплуатант был очень аккуратным, терпеть не мог неряшливости, у него все и всегда было разложено по полочкам.

Первым делом Петр-эксплуатант обследовал конфигурацию. Фу, сказал он. Ну вот кто не сортирует метаданные по алфавиту? И отсортировал. Все, не только верхний уровень. Разумеется, Петр-эксплуатант знал, что нельзя сортировать только измерения регистров, все же он был настоящий специалист.

После обновления... После обновления система не просто упала. Если бы упала, то ничего. Но все расчетные функции стали выдавать на выходе какую-то немыслимую ересь. Петр-эксплуатант был в полном непонимании, он же ничего не делал, просто сортировка по имени?

Расследование показало, что в конфигурации есть незаметное перечисление, МесяцГода. Просто названия месяцев. И есть еще более незаметная функция в расчетном ядре системы, которая по ссылке на это перечисление формирует дату начала месяца. И какой месяц пришел на вход, эта функция определяет — правильно, базируясь на порядковый номер значения. То есть на тот самый лохматый порядок, когда Январь, Февраль, и так далее. Одним движением Петр-эксплуатант превратил Январь в Август, поменял местами Июнь и Май, ну и так далее, прямо как в сказке.

Уж как там икалось Петру-строителю, история умалчивает.

Пример второй. Тоже серьезное предприятие и серьезная система, и тоже написана с нуля. Система довольно сложная, спарка из двух информационных баз с крайне затейливой интеграцией. “Крайне” в данном случае следует понимать буквально.

Разработал и запустил систему коллектив неких добрых людей, но затем добрые люди не поладили с руководством предприятия по вопросу о стоимости сопровождения. К доводам “с этой системой справимся только мы” руководство осталось глухо, что же с шантажистами разговаривать? Добрые люди отправились искать новое поприще, и на царство, как водится, был призван Петр-эксплуатант. Возможно, даже тот самый, кто знает?

Петр-эксплуатант, разумеется, начал с ревизии своих владений. Ну а войдя во вкус, занялся любимым делом — привести в порядок, разложить по полочкам, убрать лишний мусор. В конфигурациях А и Б, назовем их так, обнаружились какие-то уж совсем диковинные вкрапления мусора, комментарии с какими-то кракозябрами прямо внутри кода. Ни малейшего смысла в кракозябрах, на первый взгляд, не было. Петр-эксплуатант был чистюлей, лишний мусор не терпел. Поэтому взял глобальный поиск, посидел вечерок-другой, и все лишнее из кода вычистил.

После обновления... После обновления система не упала, нет. Если бы упала. Система пошла в полный разнос и раздрай. Все горело и рушилось. Фильм “2012” в отдельно взятой операционной системе. Петр-эксплуатант был в ужасе, он же ничего не делал, просто вытер какие-то лишние комментарии?

А дело было вот в чем. Спарка действительно была крайне хитрая. База А была управляющим контуром, ее конфигурацию можно было обновить в любой момент. А база Б была рабочим, нагруженным контуром, для нее технологическое окно для обновления нужно было каждый раз согласовывать, и ответ на запрос мог иметь вид “завтра в 23:50”. Кому же из добрых людей хочется ждать до завтрашней ночи, чтобы чуть-чуть подправить логику в коде? Тем более, что пользователи шипят уже по-злому. Динамическому обновлению тогда никто не доверял, а расширения еще не придумали.

Было изобретено инженерное решение. Часть кода была написана, скажем так, в стиле “мехом наружу, дважды, с морским узлом”. В подробности вдаваться не будем, важна суть. Чтобы не останавливать рабочий контур, в конфигурацию вписывались кракозябры (был разработан свой псевдоязык), конфигурацию базы А обновляли, давали команду базе Б, та забирала конфигурацию А в файлы, читала их, разбирала кракозябры и соответствующим образом подстраивала свое поведение.

Автор понимает, что это звучит как сон разума. Собственно, это и был сон разума, об этом подробно будет в следующей главе. Какой там KISS, это hardcore SM в чистом виде. Почему было сделано именно так? Ирония в том, что добрым людям это показалось простым и надежным решением. Конфигурации А и Б полностью тождественны по метаданным и формам, а вот ключевые участки кода Б (в первую очередь, разнообразная расчетная механика) могли замещаться кодом из А, через сложносочиненный стек из “Выполнить/Вычислить”. Эрзац-расширение из ветхого полотна, компоста и фрагментов древесных стволов. Плюс все кракозябры в хранилище, никаких внешних файлов, просто пересобрать, обновить и нажать одну кнопку. Ну и заодно представьте себе, сколько заплатило предприятие добрым людям за разработку и отладку этого монстра. Лишний раз прокатиться к теплому морю никому не вредит, работа-то нервная, на износ.

Вопрос, а должен ли был Петр-эксплуатант знать о том, что кракозябры в коде не просто так? В теории — разумеется, должен был знать. Добрые люди оставили новому поколению пухлую пачку технической документации, где вся механика была описана в деталях, и даже с UML-диаграммами. Но кто читает документацию?

Тут автор должен сделать небольшое лирическое отступление и отдать дань уважения человеку, без которого эта книга никогда не была бы написана. Будем надеяться, что до этого места он дочитает и узнает себя. Уважаемый коллега и дорогой товарищ. Да, документацию действительно почти никто не читает. Горек хлеб технического писателя, и стезя его усыпана крупным гравием. Но Север — помнит.

 

Сила темной стороны

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

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

Чтобы избежать голословности, описание некоторых темных паттернов снабжено примерами, причем не синтетическими, а из реальных разработок.

И еще — эрудированный читатель наверняка заметит некоторые фразы с Lurkmore, в авторской, понятно, редакции. Но это не плагиат, а цитирование. Пушкина, например, тоже цитируют без указания авторства на каждой строке.

 

Простейшие

К группе простейших антипаттернов (именно так это называется) относится абсолютно бездумная деятельность по написанию кода. Если рассматривать такое творчество беспристрастно, возникает ощущение, что головной мозг при работе рук не был задействован от слова “совсем”. Каким-то странным образом у этого вида руками управляет даже не мозжечок, а сразу спинной мозг, и как бы даже не костный. Сном разума это назвать нельзя, для сна нужен хоть какой-то разум.

 

Китайский стиль

Этот стиль разработки (мы ведь говорим не только про написание кода, но про разработку на платформе в целом) обычно называют китайским. Простота, брутальность, и неспособность открыть для себя даже такой примитивный феномен, как цикл с локальной переменной.

Отличительный видовой признак китайского стиля — эталонное нарушение принципа DRY. Если что-то можно скопировать и вставить, это будет скопировано и вставлено. Если нельзя, то все равно будет скопировано и вставлено, упорство и труд перетирают в пыль любые законы природы. Когда рассматриваешь примеры, возникает впечатление, что им платят построчно, как поэтам начала прошлого века.

Рассмотрим пример. Задача: требуется преобразовать целое число к строке фиксированной длины с ведущими нулями.

Китайское решение:

 

 

Человеческое решение:

Подсчитать количество недостающих нулей и добавить их к исходному номеру в цикле.

 

 

Экспертное решение:

Воспользоваться встроенной функцией платформы.

 

 

Индийский стиль

Этот стиль обычно определяют как “написанный наиболее неочевидным и противоественным способом программный код, который каким-то образом все же работает (хотя и не факт, что правильно)”. Англоязычные товарищи дали индийскому стилю прозвище Write Only, поскольку чтению и анализу такой код не поддается в принципе. Это примерно то же самое, как пытаться понять, о чем же на самом деле повествует “Бхагават-гита”, имея в руках только исходник на санскрите.

Есть довольно известная шутка, что аутентичный индийский код настоящие мастера не пишут, а поют и танцуют. Затем переводят на хинди/суахили, а уже затем транслируют в необходимый язык программирования. Автор может поручиться, что это не совсем шутка, поскольку лично был знаком с настоящим мастером индийского стиля. Правда, вместо пения был художественный свист, а танцевать, сидя в кресле, не так и просто, но у него получалось. Процедура в три тысячи строк, на вход которой подается двадцать два параметра, причем поведение управляется не только значением параметра, но и его типом — это далеко не вершина мастерства, так, предгорья.

Рассмотрим пример. Фрагмент кода выполняет элементарную задачу: проверить, является ли переданное значение числом.

 

 

Специалист, которому будет поручено сопровождение этого кода, зависнет над этим фрагментом надолго. Зачем здесь Попытка? Зачем возвращать Число(0)? Почему именно при -1111 наша система будет считать валидные входные данные мусором?

 

Крестьянский стиль

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

Нужно сделать небольшую оговорку. Антипаттерны темной стороны вовсе не обязательно ведут к ошибкам и проблемам. Код, написанный посредством таких антипаттернов, может быть вполне работоспособен. Но мы говорим не просто о разработке, а об эффективной разработке. Если паттерн снижает эффективность, значит, это плохой, негодный паттерн.

В качестве эталонного примера перелистаем чуть назад и повторим фрагмент из китайского примера. Задача, напомним, проще не бывает: привести число к строке заданной длины и дополнить слева ведущими нулями.

Вместо того, чтобы решить задачу однократным вызовом оператора Формат, крестьянин будет трудолюбиво вспахивать поле мотыгой и делать всю работу руками. Ну а поскольку принцип DRY крестьянину неизвестен, этот фрагмент кода при необходимости будет размножаться копированием на все участки конфигурации. Смекалистый крестьянин даже внесет его в файл шаблонов, и вместо простой мотыги у него будет механизированная.

Тяжелый ручной труд — дело хорошее и правильное, с этим не поспоришь... Но с эффективной разработкой совмещается плохо.

 

Беспозвоночные

Группа беспозвоночных антипаттернов стоит на гораздо более высокой ступени развития, нежели простейшие. Здесь уже почти полный порядок с владением самыми базовыми методами (никого из беспозвоночных не удивишь, например, циклом), в деятельности уже задействован мозг, но, к сожалению, только одним полушарием. Причем какое именно это будет полушарие, правое или левое, диктуется не только личными качествами носителя антипаттерна, но и конкретной задачей, и даже расположением звезд.

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

Носители этого антипаттерна могли бы взять девизом слова известного литературного персонажа по имени майор Прыщ:

Новых идей не понимаю. Не понимаю даже того, зачем их следует понимать-с.

На практике беспозвоночный вид антипаттернов часто идет рука об руку с методикой Google-driven development. Поискать что-то похожее на решение своей задачи (как вариант, поклянчить на сетевых площадках у более опытных товарищей), стянуть к себе и попробовать из чужого кода выпилить лобзиком свой. Характерным является и отношение к языку программирования — он считается чем-то вроде набора заклинаний. Нужно просто подобрать правильные слова, вычертить мышкой определенную фигуру, а дальше волшебная сила все сделает сама. Эталонный представитель такой школы — небезызвестный Григорий Чайников (a.k.a. Harry James Potter).

— Filus chitatus exelus! Documentus convertatus!! Obmenus oshibkus sginus!!!

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

 

Школокод

Обычно такой стиль разработки называют более грубым словом, но мы постараемся от грубостей воздерживаться. Англоязычные товарищи называют носителей этого антипаттерна Code Monkey, что гораздо точнее раскрывает суть явления. В качестве видовых признаков можно перечислить абсолютное непонимание основных стандартов и особенностей используемого языка, незнание не только лучших, но и базовых практик, а главное, отсутствие желания со всем этим познакомиться хотя бы шапочно.

Как следствие, носитель антипаттерна принимает неочевидные, неверные, а часто и просто абсурдные решения — результат, как гласит поговорка, слегка предсказуем. Написанный посредством этого антипаттерна код находится даже не в световых годах от здравого смысла, а где-то в злой параллельной вселенной.

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

Представьте себе паренька в кепке, турецкой кожаной куртке, заправленной в тренировочные штаны, зажатой в зубах сигаретой, сидящего на корточках с пакетом семечек — это почти точное ощущение, которое возникает при просмотре такого программного кода. Любые правила, любые ограничения, любая строгость языка — все это воспринимается как личное оскорбление.

Зачем столько лирики? Тема действительно больная, поскольку носителей антипаттерна, к сожалению, в сообществе очень много, именно из-за них термин “1С-программист” в профессиональной среде обрел негативную и комическую коннотацию.

Разбирать конкретные примеры автор смысла не видит — будет очень много кода и очень много букв, а у нас все-таки теоретический блок.

 

Шизокод

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

Подчеркнем еще раз: в разборе этого антипаттерна термин “шизофрения” относится ни в коем случае не к разработчику, а только к написанному им коду. Также отблеск антипаттерна во всей красе можно увидеть в многочисленных сообщениях пользователям, особенно в сообщениях об ошибках.

— Обработка завершена. Внимание! При выполнении обработки возникли ошибки!!! Процедура успешно выполнена.

— WTF? O_O

Стоит привести пару простых примеров, из реальной практики. Просто представьте, что этот код пришел к вам на аудит.

Пример #1

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

 

 

Здесь:

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

Пример #2

Фрагмент кода выполняет крайне простую задачу: копирует значения реквизитов элемента справочника в реквизиты обработки.

 

 

Здесь:

  • Имя реквизита БанковскийСчетВыгрузки подразумевает (как это принято среди разработчиков на платформе 1С) тип значения СправочникСсылка.БанковскиеСчета. Но в реальности реквизит имеет тип СправочникСсылка.ПравилаОбменаКлиентаБанка – тот специалист, который будет заниматься сопровождением кода, слегка поцарапает себе мозг об это несоответствие.
  • Обращение к реквизитам объекта ссылочного типа «через точку». Грубейшее нарушение стандартов разработки.
  •  «Однотипные» реквизиты почему-то имеют разные имена в справочнике и в обработке. Это вызывает к жизни портянку кода вместо оператора ЗаполнитьЗначенияСвойств, и отнюдь не упрощает сопровождение кода.
  • Хардкод имени файла в модуле обработки. В подобных случаях константы, если параметрическая настройка для них является избыточной, должны располагаться в соответствующих функциях общего модуля ФункцииПовторногоИспользования.

Пример #3

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

 

 

Здесь:

  • Числовая константа в качестве кода «вида операции». Это абсолютно неестественное сопоставление: «0» ассоциируется с «пустым местом», «первым элементом», «началом списка», но никак не с «печать с предварительным просмотром».

Возможные правильные решения:

  • Использовать строковые константы: РежимПросмотр, РежимПечать.
  • Так как вариантов всего два, и расширение их количества не предполагается, достаточно использовать булевский флаг ЭтоПечатьНаПринтер.

 

TurDuсkEn

Этот стиль назван именем блюда североамериканской кухни. Технически блюдо представляет собой индейку (turkey), фаршированную уткой (duck), в свою очередь фаршированной курицей (chicken).  Блюдо невероятной калорийности и вредности, кулинарный гротеск, ночной кошмар диетолога — но любителей хватает.

 

В кулинарной аналогии этот паттерн кодирования выглядит примерно так.

 

Применительно к разработке программного кода словом TurDuсkEn называют манеру не просто приготовить “лапшу”, перемешав на одном участке принципиально разные сущности, но еще и сделать это на различных языках программирования одновременно.

Чаще всего антипаттерн применяется в разработке веб-приложений. Разработчик-кулинар Петр закатывает рукава и кладет первый слой, PHP-логику. PHP-логика генерирует HTML-разметку и JS-логику. JS-логика собирает фрагменты SQL-запросов. SQL-запрос при желании, и, если позволяет СУБД, тоже можно фаршировать чем-нибудь скриптовым. Которое будет формировать набор данных для другого, внешнего скрипта на каком-нибудь Python, который… ну, идею вы поняли. На выходе получается чистейший turducken, дополненный морской свинкой и парочкой анчоусов в придачу. Блюдо такой убийственной силы, что попытка вручить это для сопровождения сколько-нибудь опытному разработчику запросто может завершиться заявлением об уходе, а то и жалобой в общество защиты людей от животных.

Платформа “1С” обладает не такими богатыми возможностями для смешения языков, как веб-платформы, но и на нашей кухне антипаттерн встречается гораздо чаще, чем хотелось бы. Прежде всего это касается техники “собрать текст запроса сложным кодом с множеством ветвлений”. Казалось бы, уже довольно давно у объекта Запрос появился вполне сносный программный интерфейс, так зачем же собирать текст конкатенацией и заменами в двадцатиэтажной конструкции “Если - Иначе”, врагу на страх, себе на горе? Вопрос, к сожалению, риторический, “пишем, как привыкли”. В эту же категорию попадает ручная сборка shell-скриптов (bat, vbs, ps, etc.), запросов к внешним источникам данных (ADO, и иже с ним), HTML-разметки для внешних и внутренних страниц, ну — и так далее.

Почему turducken является безусловным злом? Применение этой техники на ровном месте усложняет код на порядок, а возможно, и больше. Отладка и сопровождение обычного кода сродни попытке уследить за разбегающимися в разные стороны сотнями тараканов, а в случае turducken-кода тараканы разбегаются сразу в пяти измерениях. Логика генерирует другую логику, ошибки в разных слоях накладываются друг на друга, вызывая самые неожиданные эффекты. Код при turducken-подходе стремительно теряет ключевые качества — понятность, прозрачность и, как следствие, управляемость. Взамен же разработчик получает не “гибкость”, а кратное увеличение трудозатрат на отладку.

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

 

Позвоночные

Как и в живой природе, более развитые существа являются и наиболее опасными. Антипаттернов разработки это касается в полной мере. Если носитель антипаттерна не умеет даже склепать простейший цикл, большой беды от его деятельности не будет. Например, на каком-то конкретном небольшом предприятии “система” будет стартовать десять минут, выполняя некую инициализацию прямым перебором всех объектов данных (пример из личной кунсткамеры автора). Или расчет заработной платы будет выполняться два часа, потому что из-за конструктивной особенности кода при расчете для каждого сотрудника проверка принадлежности к подразделению выполняется в среднем четыреста тысяч раз (другой пример из личной кунсткамеры автора). Это неприятно, конечно, но и только.

Гораздо хуже, когда носитель антипаттерна имеет довольно высокий уровень умения работать с платформой и получает возможность применить свой талант на больших проектах или, что гораздо опаснее, в тиражируемых продуктах.  Ведь почти весь код почти всех тиражных продуктов открыт, и начинающие специалисты пытаются по этому открытому коду учиться. И когда опытный тимлид, проводя аудит, пытается поднять с пола упавшую туда челюсть, диалог с джуниором получается примерно таким:

— Сынок, <18+>, это кто тебя научил такое <18+> отливать в коде?

— Так вот же, дяденька, в <не будем показывать пальцем> точно так и сделано. Написал по образцу.

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

 

Спагетти

Рассказу о феномене спагетти-кода следует предпослать замечательное высказывание одного из отцов-основателей нашей отрасли по имени Эдгер ван Дейкстра:

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

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

Можно и одним словом: месиво.

Нельзя сказать, что спагетти-код обязательно содержит ошибки или работает медленно. Такой код может быть почти идеально отлажен, может отвечать всем поставленным внешним требованиям, может выполнять поставленные задачи с высокой производительностью, и так далее. Тогда что же с ”лапшой” не так?

А вот что. Во-первых, такой код практически не поддается ни сопровождению, ни даже простому чтению. Во-вторых, обладает чудовищной трудоемкостью отладки и особенно локализации ошибок. И в-третьих, любое, даже совсем незначительное изменение или расширение требований почти в ста процентах случаев приводит к ситуации “проще это все переписать полностью, чем что-то здесь изменить”. Расширяемость “лапши” близка к нулевой.

 

Никого не напоминает этот трудящийся?

 

Памятка для самопроверки. Попробуйте поискать в своем коде следующие видовые признаки:

  1. Применение оператора GOTO (понятно, что этим оператором пугают детей, но все же).
  2. Процедуры и функции огромного размера, на несколько экранов.
  3. Многострочные блоки case (Если.. ИначеЕсли..), особенно с несколькими уровнями вложенности
  4. Обработка частных случаев, ломающих парадигму окружающего кода (например, добавление дополнительных условий вместо дополнительных значений переменной «состояние» конечного автомата).
  5. Общая неряшливость кода. Пренебрежение общепринятыми элементарными правилами форматирования и оформления.
  6. Укороченные и/или не имеющие смысла имена переменных.
  7. Отсутствие в коде внятных комментариев, начиная с заголовков процедур и функций.

Следует понимать, что каждый из приведенных признаков сам по себе не является абсолютным злом и при определенных обстоятельствах имеет право на существование (даже оператор GOTO, представьте себе). Но сколько-нибудь опытный разработчик всегда с первого же взгляда отличит, где вынужденное нарушение правил в человеческом коде, а где глубокая тарелка с ботвиньей.

Разберем простейший пример. Задача: в зависимости от неких внешних условий (состояние определенных объектов данных) выполнять определенные действия. Реализация в спагетти-стиле будет выглядеть примерно так:

  1. Единственная огромная функция СделатьВсеКакНадо(), двенадцать экранов длиной.
  2. Проверка внешних условий расположена внутри функции.
  3. Выбор действия реализован в формате многостраничного блока Если.. ИначеЕсли с тремя уровнями вложенности. Внутри каждой пары операторных скобок нижнего уровня расположен код, выполняющий действие. Причем действия принципиально разные, от “бросить исключение” до “прочитать и разобрать внешний файл данных”.
  4. Используется огромное количество переменных-флагов с ничего не говорящими (в лучшем случае) именами. В худшем случае это переменные вида ФлагОбработки23. В терминальном случае назначение переменной противоречит ее названию.
  5. Использование в case-блоке семантических конструкций вида Если Не НеДелать Тогда...
  6. Использование многоэтажных (от пяти и больше) условий И/ИЛИ в каждой ветке case-блока.
  7. Часть действий выполняется через Попытку, часть выполняется в транзакции. Операторные скобки попыток и транзакций перемешаны самым причудливым образом.
  8. Заворачивание некоторых (видимо, особо опасных) фрагментов кода в попытки без обработки исключений (“проглатывание исключения”).
  9. Функция решает несколько принципиально разных задач. По сути, это несколько функций, перемешанных в одну и имеющих некие общие фрагменты.
  10. Разумеется, никаких комментариев.
  11. Заголовок функции просто пересказывает ее название (“Функция делает все, как надо”). Описанные в заголовке параметры не соответствуют реальными ни по именам, ни по количеству.

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

Ничего не напоминает? Вот и автору тоже кое-что напомнило.

В чем же причина такого подхода к разработке со стороны многих и многих, казалось бы, квалифицированных (сертификаты на стене точно есть) разработчиков? Причины обычно самые банальные. У кого-то сложности с абстрактным мышлением, способностью проектировать сложные сущности и особенно их взаимодействие. Кому-то просто лень. А кто-то просто не знает, что можно разрабатывать программный код как-то по-другому.

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

Как избежать соблазна свалить все в одну неряшливую кучу и побыстрее покончить с задачей? Есть простой, но действенный принцип аутотренинга.

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

Если соединить этот принцип с японской ментальной техникой “сегодня меня ждет...” и представить живую картину — сырой подвал, ржавая батаре

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Рефакторинг и качество кода Программист 1С 8.3 1С 8.5 Абонемент ($m)

Внешняя обработка для 1С, которая ищет в коде нарушения стандартов БСП и платформы (модальные вызовы, запросы в цикле, незакрытый привилегированный режим и др.) и часть из них чинит автоматически. Работает по фрагменту кода и по всей выгрузке конфигурации, с фоновым режимом через БСП и отчётом по найденному.

5 стартмани

вчера в 15:40    146    0    KonMa    0    

1

Перенос данных 1C Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

Правила обмена умеют лежать в двух местах сразу: в макете конфигурации, где их находит глобальный поиск и где их так удобно поправить, и в регистре сведений, откуда они на самом деле исполняются. Пока не проверишь, какой источник включён у плана обмена, правка макета выглядит сделанной и не делает ничего. Разбор задачи, где одно и то же значение ставки оказалось зашито в четырёх местах трёх разных слоёв: карта соответствий в модуле веб-сервиса, обработчик "ПослеЗагрузки" в правиле обмена, числовой ВЫБОР с внутренним ИНАЧЕ 0 внутри сгенерированных правил и общий модуль интеграции с внешним поставщиком чеков. Отдельно - почему у истории с вернувшимися карточками нет доказанной причины, хотя признак сузили до одного вида номенклатуры, и как тестовый прогон на пяти записях сломал сходимость итогового отчёта.

вчера в 11:30    182    nedomolkov.ivan    0    

1

HighLoad оптимизация Рефакторинг и качество кода Системный администратор Программист 1С 8.3 Бесплатно (free)

Режим снимка(snapshot) убрал почти все дедлоки: с 73 в час до 7-8. Через несколько дней выяснилось, что разделяемые замки раньше сами обеспечивали сериализацию там, где код читал, решал и писал. После включения снимка эта защита пропала. Пришлось пересмотреть код: 234 места с намерением записи, 59 оставили разделяемыми, чтобы не получить взаимные блокировки. Проверка "хватит ли данных" часто стояла выше открытия транзакции - такие места линтер и ревьюер не видят. Дальше - про поддельные блокировки, опасность смены умолчания и шесть проверок.

25.08.2026    386    nedomolkov.ivan    1    

4

Инструментарий разработчика Рефакторинг и качество кода Программист 1С 8.3 Абонемент ($m)

Обработка читает исходники других внешних обработок и отчётов прямо из базы и отвечает на два вопроса: с какой из них начинать смотреть и что именно в ней смотреть. На выходе HTML-отчёт: индекс качества от 0 до 100, светофор, оценка технического долга в минутах и находки с номером строки, фрагментом кода и подсветкой синтаксиса. Двадцать восемь правил: запрос в цикле, транзакция без отката, небезопасное выполнение строки, тяжёлые схемы компоновки. Считается всё на чистом BSL, без интернета, внешних компонент и отдельного сервиса рядом, поэтому анализируемый код не покидает машину. Прогон по двум десяткам обработок выстраивает их по индексу качества, худшие сверху, и сразу видно, с чего начинать разбор.

10 стартмани

20.08.2026    488    2    nedomolkov.ivan    2    

4

Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

Библиотека из 6 слоев анализа, от внешней обработки до готового отчёта. Каталог из двадцати восьми правил, у каждого свой уровень и вес. И всё это крутится на чистом BSL, без Java, без git, без какого-то внешнего сервера анализа и без отправки чужого кода наружу. Разбираю, как устроен этот анализатор внешних обработок и по каким признакам он решает, что код плохой. Почему запрос в цикле получает шестьдесят баллов, как правило вообще проходит фильтр перед релизом и почему часть правил у меня помечена как сломанные. Проверял я его на себе: взял семнадцать своих обработок, которые лежат на площадке и продаются. Получил 239 замечаний и пятнадцать рабочих дней технического долга. У самой худшей индекс качества - 20 из 100 и красный светофор. А ещё расскажу, где у инструмента границы, за которые он не заходит, и про грабли - самая дорогая из них молчала.

20.08.2026    812    nedomolkov.ivan    0    

1

Рефакторинг и качество кода Программист 1С 8.3 Бесплатно (free)

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

20.08.2026    808    n_mezentsev    10    

2

Рефакторинг и качество кода Нейросети Программист Бесплатно (free)

Передача двух модулей BSL в Cursor AI для классического сравнения без использования искусственного интеллекта (ИИ) и для проведения code review с помощью ИИ.

12.08.2026    2705    ScaNNer    0    

5

Рефакторинг и качество кода Обновление 1С Программист 1С 8.3 1С:ERP. Управление холдингом Бесплатно (free)

К нам на проект сложного обновления пришла конфигурация «1С:ERP УХ» с доработанным отчетом, построенным на базе типового «Задолженность поставщикам по срокам». После обновления целевая форма открывалась без учета переданных данных.

05.08.2026    951    1c-izh    4    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maxdmt 28 22.06.20 18:04 Сейчас в теме
Как-то тревожно. Еще один 1с интелиженс нарисовался? :(
надеюсь будет по теме
2. CheBurator 3234 22.06.20 23:37 Сейчас в теме
Все хорошо. Все правильно.
Кроме одного.
Рассматривается сферический разработчик. в каком-то коммунистическом обществе...
CratosX; luckma; unknown181538; +3 Ответить
3. a_a_burlakov 292 23.06.20 07:11 Сейчас в теме
А поясните, пожалуйста, что есть такое "// tasks by workers, round Robin".
8. WildHare 618 23.06.20 13:31 Сейчас в теме
(3) Все просто. Есть массив заданий, допустим, на обработку данных (tasks). Есть массив исполняемых потоков обработки (workers). И есть простейший алгоритм распределения задач между исполнителями, «round Robin».

Его можно представить следующим образом. Управляющий процесс сидит с большим котелком каши, а исполнители сидят вокруг него с мисками, каждому по очереди наливают кашу из половника, и так по кругу, пока каша не закончится. Несложность при этом не оценивается, не учитывается. Ни сложность и трудоемкость обработки конкретной порции данных, ни конкурентность, ни загруженность сервера, на котором живет конкретный исполнитель, ну и так далее. Алгоритм из серии «Еловая табуретка».

Название алгоритма, если не ошибаюсь, произошло от французского делопроизводства, что-то связанное с коллективными исками или письмами.
a_a_burlakov; +1 Ответить
4. muskul 23.06.20 08:35 Сейчас в теме
Интересно, почему разработчиков тиражных продуктов не посылают на стажировку в поля? Два-три месяца сервисным инженером, мальчиком на все руки, на обновлениях и мелких доработках — вернется другим человеком. Level-up на десять уровней с гарантией.

А действительно почему?
5. smit1c 107 23.06.20 09:51 Сейчас в теме
(4) Потому что разработчик не пойдёт работать на ЗП сервисного инженера ))
6. muskul 23.06.20 10:18 Сейчас в теме
(5)Я не про это. а про то что наваял систему заказов в УТ иди теперь набей 1000 строчный документ. с несколькими складами или что то подобное.
Hobbit_Jedi; CratosX; +2 Ответить
9. WildHare 618 23.06.20 13:36 Сейчас в теме
(5) Дело не в зарплате, зарплата остается прежней, высокой. Дело в получении реальной полевой практики и реальной возможности побывать в шкуре пользователя. Раньше для будущих инженеров это называлось «производственная практика», сейчас-то от нее ничего не осталось. Если взять самый простой пример – это как разработчику различных бюрократических бумажных форм посидеть недельку другую третью над их ручным заполнением. Заменяет примерно годичный курс дисциплины «эргономика».
Hobbit_Jedi; CratosX; Drivingblind; JohnyDeath; mvxyz; maxx; CheBurator; +7 Ответить
12. smit1c 107 23.06.20 16:13 Сейчас в теме
(9) достаточно пары дней)
7. MikhailDr 23.06.20 13:10 Сейчас в теме
В чем же причина такого подхода к разработке со стороны многих и многих, казалось бы, квалифицированных (сертификаты на стене точно есть) разработчиков? Причины обычно самые банальные. У кого-то сложности с абстрактным мышлением, способностью проектировать сложные сущности и особенно их взаимодействие. Кому-то просто лень. А кто-то просто не знает, что можно разрабатывать программный код как-то по-другому.


Не написана главная причина это отсутствие времени. В тексте есть глава про прототипирование. Так вот очень большая часть разработки идет через этот механизм, но в итоге чистовой код никто не создает, а просто дорабатывают прототип.

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

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

В челом интересное чтиво. Спасибо за материал.
CratosX; CheBurator; WildHare; +3 Ответить
10. yarsort 143 23.06.20 15:06 Сейчас в теме
Никогда не понимал таких полотен статейных... И даже не читаю. Мозг можно поламать.
13. leemuar 63 23.06.20 19:38 Сейчас в теме
(10) спасибо за классику! "Не читал, не осилил, но осуждаю!". Повеселили
kaaasteeen; Relfirby; botokash; Kolobash95; +4 Ответить
11. pm74 208 23.06.20 15:31 Сейчас в теме
(0) спасибо за материал , читается легко
bulpi; EVKash; WildHare; +3 Ответить
14. mikukrnet 182 23.06.20 23:26 Сейчас в теме
Все искал в тексте (и не нашел) мой любимый антипаттерн - захерачить запрос в цикле без отбора по виртуальным и временным таблицам... Индийский код - безобидная фигня по сравнению с такими трактористами
Hobbit_Jedi; +1 Ответить
15. Vortigaunt 102 23.06.20 23:55 Сейчас в теме
Спасибо. Очень занимательно.
А как называется антипаттерн, когда пишут вот такое?
Если Строка(ВидДвижения) = "Приход" Тогда

Очень весело было отлавливать ошибки, возникшие на ровном месте, когда никто ничего не трогал и код не изменял. А всего-лишь обновили платформу, и при установке подтянулись украинские региональные настройки.
bulpi; Kolobash95; mikukrnet; +3 Ответить
16. leemuar 63 24.06.20 08:25 Сейчас в теме
(15) сравнение со строковым представлением объекта похоже на индусский код. Последний славится такими перлами:

ПеременнаяБулево = ...;
Если СтрДлина(Строка(ПеременнаяБулево)) = 6 Тогда
// ...
Hobbit_Jedi; +1 Ответить
17. mylogin2 24.06.20 09:00 Сейчас в теме
Можно поправить "ФлагУпр = Дожь" — видимо "ФлагУпр = Ложь"?
Хотя, с "Дожь" тоже интересно
18. orefkov 1158 25.06.20 18:59 Сейчас в теме
Имхо, используемое в примере "ЗаполнитьЗначенияСвойств" без указания списка свойств - тоже та еще бомба, подложенная под дальнейшее сопровождение, сродни тем, что перечислялись в первой части. Кто-то где-то что-то переименовал - алгоритм будет выполнятся не правильно, но никаких ошибок не возникнет, и неизвестно, сколько времени пройдёт, пока это выяснится.
karpik666; Denis S; +2 Ответить
19. user926954 26.06.20 04:49 Сейчас в теме
Паттерны, антипаттерны ....Забавно, современно, но, ....бесполезно.
Две статьи сводятся к двум словам - "здравый смысл". И что же это?, проповедь к неблагодарной пастве или глас вопиющего в пустыне?
Думающим людям это не интересно, они давно изучили тему на уровень глубже. Не включающим мозги на постоянный режим работы, эссе этого типа не помогут, как мертвому припарки.
Гораздо интереснее тема как подбирать, сортировать, отсеивать разработчиков (переучивать бесполезно), как организовывать и направлять команду, приемы работы с заказчиками, как быстро выстроить партнерские отношения ними. Интересны тенденции развития 1С-экосистемы, схемы аутсорсинга и т.д. То, до чего думающий разработчик дойдет и сам, но затратив время и набив шишек. Сократите нам время, благодаря своему опыту, снизьте наши издержки, и мы будем "очень признательными благодарными читателями" и поставим вашу книжку на вторую полку на видное место.
20. WildHare 618 26.06.20 10:26 Сейчас в теме
(19) Во-первых, категорически не соглашусь с тем, что «переучивать бесполезно», моя практика показывает обратное. Ну и во-вторых – не все сразу, даже небольшая книжка требует времени. Особенно когда речь идет не о разработке, а об управлении разработкой. В планах это есть, но по срокам сказать не готов.
Hobbit_Jedi; +1 Ответить
21. bulpi 218 01.07.20 18:26 Сейчас в теме
Отличная статья. Прочитал, не отрываясь.
Есть маленькое замечание.
"Обращение к реквизитам объекта ссылочного типа «через точку». Грубейшее нарушение стандартов разработки."
В своих конфигурациях я постоянно такое делаю. При этом я знаю, почему это плохо. Но ведь код становится проще в несколько раз. А выполняется на 1 миллисекунду дольше (возможно, не обязательно). Так что it depends.
Hobbit_Jedi; CratosX; +2 Ответить
22. WildHare 618 02.07.20 12:14 Сейчас в теме
(21) Тут все дело в паттерне эксплуатации. Для настольной системы или системы с пятью пользователями – действительно не важно. А теперь представим, что обращение через точку выполняется к элементу справочника Товары, у которого есть реквизит типа ХранилищеЗначения (архив с фотографиями), обращение выполняется в одном из наиболее частотных сценариев работы пользователей, конфигурация развернута в режиме сервиса («Облачная» база), и в каждой ноде сервиса обычной рабочей нагрузкой является ~750 конкурентных сеансов. Посчитаем, сколько избыточного тепла в окружающую среду будет выделять одна единственная строчка нашего кода.
Стандарт потому и стандарт, что в нем пытаются учесть не только благоприятные, но и неблагоприятные ситуации. Например, переход проезжей части белой питерской ночью в ясную погоду при полной тишине на красный сигнал светофора является абсолютно безопасным, но не очень понятно, как это записать в ПДД.
forseil; Drivingblind; Zerga; bulpi; +4 Ответить
23. serge_focus 4 13.07.20 21:50 Сейчас в теме
(22) [IS-QUOTE]Например, переход проезжей части белой питерской ночью в ясную погоду при полной тишине на красный сигнал светофора является абсолютно безопасным, но не очень понятно, как это записать в ПДД.[/QВ\

Включить мигающий желтый, отмониторив трафик и погоду.

А стандарт - на то и есть стандарт, чтобы действовать строго.
А в неопределенных ситуациях лучше сразу зафиксировать ограничения к требованиям. Пусть даже на уровне внутренних документов, которые и станут расширением стандарта, позволяющими переводить светофор в состояние мигающего желтым.
WildHare; +1 Ответить
28. Hobbit_Jedi 27.04.23 01:41 Сейчас в теме
(23) А нельзя в стандарте выделить разделы:
- Обязательно нужно делать так (обязательно к выполнению)
- Ни в коем случае нельзя делать так (строгий запрет)
- Рекомендуется делать так (рекомендация, которой лучше следовать, но не обязательно)
- Не рекомендуется делать так (рекомендация, как лучше не делать, но если сильно нужно, то можно)
?

И тогда пример с переходом на красный свет попадет в категорию рекомендаций:
Рекомендуется, не зависимо от цвета светофора, оценить ситуацию на дороге. И переходить ТОЛЬКО если это безопасно.
27. Hobbit_Jedi 27.04.23 01:37 Сейчас в теме
(22) Но при этом же представим, что нам нужно все эти картинки отобразить (например, на печать вывести или на сайт отправить). Причем, номенклатура в печатной форме должна вывестись несколько раз (в разных разделах, например). И с учетом того, что зачитанный объект Номенклатуры кэшируется платформой, то дерганье базы запросами может тормозить больше, чем доступ к её реквизитам через точку.
Так что само-по-себе обращение через точку не должно считаться нарушением стандарта. Нарушением стандарта должно считаться необоснованное обращение через точку.
26. Hobbit_Jedi 27.04.23 01:32 Сейчас в теме
(21) Полностью согласен. Более того, с учетом того, что зачитанный объект платформа кэширует, то в некоторых сценариях, обращение через точку более предпочтительно, чем запрос. Просто нужно понимать когда и что использовать.
24. CratosX 116 27.12.21 00:50 Сейчас в теме
техники “собрать текст запроса сложным кодом с множеством ветвлений”. Казалось бы, уже довольно давно у объекта Запрос появился вполне сносный программный интерфейс, так зачем же собирать текст конкатенацией и заменами в двадцатиэтажной конструкции “Если - Иначе”, врагу на страх, себе на горе? Вопрос, к сожалению, риторический, “пишем, как привыкли”

Что за программный интерфейс?
25. NicholasUzunov 25.03.22 13:24 Сейчас в теме
(24) Схема запроса я думаю.
29. Hobbit_Jedi 27.04.23 01:44 Сейчас в теме
техники “собрать текст запроса сложным кодом с множеством ветвлений”. Казалось бы, уже довольно давно у объекта Запрос появился вполне сносный программный интерфейс, так зачем же собирать текст конкатенацией и заменами в двадцатиэтажной конструкции “Если - Иначе”, врагу на страх, себе на горе? Вопрос, к сожалению, риторический, “пишем, как привыкли”


А Вы пробовали пользоваться этим программным интерфейсом?
Я пробовал.
Мало того, что код получается на несколько порядков менее читабельным (т.к. этот интерфейс жутко неудобный), так оно еще и работает на несколько порядков медленнее, чем делать то же самое, но конкатенацией строк (и подстановкой подстрок в шаблоны).
Для отправки сообщения требуется регистрация/авторизация