HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Разбираемся, почему иногда разработчики пишут непонятный код, что с этим делать и при чем тут макароны.</strong></p>
1 <p><strong>Разбираемся, почему иногда разработчики пишут непонятный код, что с этим делать и при чем тут макароны.</strong></p>
2 <blockquote><p>Вы читаете обновленную и улучшенную версию нашей старой статьи</p>
2 <blockquote><p>Вы читаете обновленную и улучшенную версию нашей старой статьи</p>
3 </blockquote><h2>Содержание</h2>
3 </blockquote><h2>Содержание</h2>
4 <ul><li><a>Что такое спагетти-код</a></li>
4 <ul><li><a>Что такое спагетти-код</a></li>
5 <li><a>Как избавиться от спагетти-кода</a></li>
5 <li><a>Как избавиться от спагетти-кода</a></li>
6 <li><a>Откуда берется спагетти-код и как появился этот термин</a></li>
6 <li><a>Откуда берется спагетти-код и как появился этот термин</a></li>
7 <li><a>Как избежать спагетти в коде</a></li>
7 <li><a>Как избежать спагетти в коде</a></li>
8 </ul><h2>Что такое спагетти-код</h2>
8 </ul><h2>Что такое спагетти-код</h2>
9 <p>Спагетти-код - это сложный и запутанный код, который состоит из множества одинаковых кусков. Выглядят они так, словно их копировали с помощью Ctrl+C и Сtrl+V, но разбавили разными цифрами и данными.</p>
9 <p>Спагетти-код - это сложный и запутанный код, который состоит из множества одинаковых кусков. Выглядят они так, словно их копировали с помощью Ctrl+C и Сtrl+V, но разбавили разными цифрами и данными.</p>
10 <p>Вот пример такого спагетти-кода:</p>
10 <p>Вот пример такого спагетти-кода:</p>
11 <p>Этот спагетти-код написал наш студент, выполняя один из проектов профессии "<a>Фронтенд-разработчик</a>".</p>
11 <p>Этот спагетти-код написал наш студент, выполняя один из проектов профессии "<a>Фронтенд-разработчик</a>".</p>
12 <p>В таком коде куски путаются и дублируют друг друга. В спагетти-коде сложно найти ответы даже на самые простые вопросы. Например, где реализуется эта функциональность, где создается экземпляр объекта, когда и какое вложенное условие сработает и какой кусок нужно исправить, чтобы починить программу. Файл с кодом похож на тарелку с пастой: все запутано настолько, что непонятно, где начало и конец у каждой макаронины.</p>
12 <p>В таком коде куски путаются и дублируют друг друга. В спагетти-коде сложно найти ответы даже на самые простые вопросы. Например, где реализуется эта функциональность, где создается экземпляр объекта, когда и какое вложенное условие сработает и какой кусок нужно исправить, чтобы починить программу. Файл с кодом похож на тарелку с пастой: все запутано настолько, что непонятно, где начало и конец у каждой макаронины.</p>
13 <p>Спагетти-код - большая проблема для любого разработчика. С программой, состоящей из спагетти-кода, трудно работать: в нее нельзя добавлять новые функции и исправлять элементы. В ней постоянно что-то ломается, но чинить баги сложно, так как приходится следовать за каждым элементом с начала и до конца.</p>
13 <p>Спагетти-код - большая проблема для любого разработчика. С программой, состоящей из спагетти-кода, трудно работать: в нее нельзя добавлять новые функции и исправлять элементы. В ней постоянно что-то ломается, но чинить баги сложно, так как приходится следовать за каждым элементом с начала и до конца.</p>
14 <h2>Как избавиться от спагетти-кода</h2>
14 <h2>Как избавиться от спагетти-кода</h2>
15 <p>Если в работе вам встретился спагетти-код, не опускайте руки - его можно исправить. Вот что предстоит сделать:</p>
15 <p>Если в работе вам встретился спагетти-код, не опускайте руки - его можно исправить. Вот что предстоит сделать:</p>
16 <ol><li>Разобраться с функциональностью проекта: проверить, какие участки кода за что отвечают.</li>
16 <ol><li>Разобраться с функциональностью проекта: проверить, какие участки кода за что отвечают.</li>
17 <li>Написать тесты, которые проверяют основные сценарии.</li>
17 <li>Написать тесты, которые проверяют основные сценарии.</li>
18 <li>Начать поэтапный рефакторинг - процесс улучшения кода, то самое "распутывание спагетти".</li>
18 <li>Начать поэтапный рефакторинг - процесс улучшения кода, то самое "распутывание спагетти".</li>
19 <li>Структурировать код по модулям. У каждого из них должна быть своя цель, не зависящая от остальной логики кода - только так удастся избавить от запутывающих код зависимостей.</li>
19 <li>Структурировать код по модулям. У каждого из них должна быть своя цель, не зависящая от остальной логики кода - только так удастся избавить от запутывающих код зависимостей.</li>
20 <li>На важные или сложные части кода написать модульные тесты - они помогут защитить продукт от внезапных поломок, когда из-за рефакторинга вдруг перестанет работать вся система.</li>
20 <li>На важные или сложные части кода написать модульные тесты - они помогут защитить продукт от внезапных поломок, когда из-за рефакторинга вдруг перестанет работать вся система.</li>
21 </ol><p>Распутать спагетти-код непросто: это долгий и сложный процесс, в который будет вовлечена вся команда. Неважно, кто вы - начинающий или опытный разработчик. Главным правилом должен стать чистый код, который важно сразу писать хорошо. Или хотя бы не забывать перерабатывать его, если сначала пришлось написать черновик.</p>
21 </ol><p>Распутать спагетти-код непросто: это долгий и сложный процесс, в который будет вовлечена вся команда. Неважно, кто вы - начинающий или опытный разработчик. Главным правилом должен стать чистый код, который важно сразу писать хорошо. Или хотя бы не забывать перерабатывать его, если сначала пришлось написать черновик.</p>
22 <blockquote><h3>Читайте также:</h3>
22 <blockquote><h3>Читайте также:</h3>
23 <p>Как правильно читать<a>чужой код</a></p>
23 <p>Как правильно читать<a>чужой код</a></p>
24 </blockquote><h2>Откуда берется спагетти-код и как появился этот термин</h2>
24 </blockquote><h2>Откуда берется спагетти-код и как появился этот термин</h2>
25 <p>Есть несколько причин, почему программисты невольно продолжают писать спагетти-код:</p>
25 <p>Есть несколько причин, почему программисты невольно продолжают писать спагетти-код:</p>
26 <ul><li><strong>Нужно быстро написать код и протестировать, работает он или нет.</strong>Скопировать готовые куски кода проще, чем тратить время на выстраивание красивой логики. Поэтому программисты пишут спагетти-код, чтобы потом, когда будет время, исправить. Времени, конечно, всегда не хватает.</li>
26 <ul><li><strong>Нужно быстро написать код и протестировать, работает он или нет.</strong>Скопировать готовые куски кода проще, чем тратить время на выстраивание красивой логики. Поэтому программисты пишут спагетти-код, чтобы потом, когда будет время, исправить. Времени, конечно, всегда не хватает.</li>
27 <li><strong>Ход программы не продуман заранее</strong>. Если логики нет, ее пытаются настроить в процессе с помощью множества вложенных условных операторов (if). Правда, потом разработчики сталкиваются с тем, что добавить новую функциональность или что-то переписать будет уже невозможно.</li>
27 <li><strong>Ход программы не продуман заранее</strong>. Если логики нет, ее пытаются настроить в процессе с помощью множества вложенных условных операторов (if). Правда, потом разработчики сталкиваются с тем, что добавить новую функциональность или что-то переписать будет уже невозможно.</li>
28 <li><strong>Программу пишут разные команды разработчиков</strong>. У каждой из них нет времени и ресурсов распутывать клубок, созданный предыдущими программистами: проще использовать те же самые методы и сказать, что это "они первые начали".</li>
28 <li><strong>Программу пишут разные команды разработчиков</strong>. У каждой из них нет времени и ресурсов распутывать клубок, созданный предыдущими программистами: проще использовать те же самые методы и сказать, что это "они первые начали".</li>
29 <li><strong>У разработчика мало опыта</strong>. Он даже не догадывается, что что-то делает неправильно и не трогает код, который работает.</li>
29 <li><strong>У разработчика мало опыта</strong>. Он даже не догадывается, что что-то делает неправильно и не трогает код, который работает.</li>
30 </ul><p>Сегодня термин "спагетти-код" используют применительно к любому плохому коду. Но на самом деле не каждый плохой код - спагетти. Исторически этот термин использовали в ситуации, когда разработчик создавал запутанную, сложную для запоминания структуру за счет избыточного оператора goto.</p>
30 </ul><p>Сегодня термин "спагетти-код" используют применительно к любому плохому коду. Но на самом деле не каждый плохой код - спагетти. Исторически этот термин использовали в ситуации, когда разработчик создавал запутанную, сложную для запоминания структуру за счет избыточного оператора goto.</p>
31 <p>Если представить день из жизни как программу, то, предположим, последовательность действий будет такая: выпить кофе, проехать в метро, зайти в офис. Оператор goto позволит изменить эту последовательность в любом направлении: скажем, сначала мы выпьем кофе, потом зайдем в офис, а затем проедем в метро. Или наоборот: метро, кофе - а далее окажемся в той части дня, где мы на дне рождения у троюродной тети.</p>
31 <p>Если представить день из жизни как программу, то, предположим, последовательность действий будет такая: выпить кофе, проехать в метро, зайти в офис. Оператор goto позволит изменить эту последовательность в любом направлении: скажем, сначала мы выпьем кофе, потом зайдем в офис, а затем проедем в метро. Или наоборот: метро, кофе - а далее окажемся в той части дня, где мы на дне рождения у троюродной тети.</p>
32 <p>Фрагмент спагетти-кода с оператором goto<a>с сайта Stack Overflow</a>:</p>
32 <p>Фрагмент спагетти-кода с оператором goto<a>с сайта Stack Overflow</a>:</p>
33 <p>Goto есть во многих языках программирования. Но в высокоуровневых языках - Python, JavaScript - использование этого оператора ограничено. Среди разработчиков применение оператора и вовсе считается плохим тоном. Goto может основательно испортить код: сделать его беспорядочным и запутать ход выполнения программы.</p>
33 <p>Goto есть во многих языках программирования. Но в высокоуровневых языках - Python, JavaScript - использование этого оператора ограничено. Среди разработчиков применение оператора и вовсе считается плохим тоном. Goto может основательно испортить код: сделать его беспорядочным и запутать ход выполнения программы.</p>
34 <p>Goto не используется повсеместно примерно с 70-х годов XX века - именно тогда вышла статья нидерландского ученого<a>Эдсгера Дейкстры</a> "<a>Доводы против оператора GOTO</a>", которая стала "началом конца" для оператора. Но спагетти-код никуда не исчез и по-прежнему остается актуальной проблемой.</p>
34 <p>Goto не используется повсеместно примерно с 70-х годов XX века - именно тогда вышла статья нидерландского ученого<a>Эдсгера Дейкстры</a> "<a>Доводы против оператора GOTO</a>", которая стала "началом конца" для оператора. Но спагетти-код никуда не исчез и по-прежнему остается актуальной проблемой.</p>
35 <h2>Как избежать спагетти в коде</h2>
35 <h2>Как избежать спагетти в коде</h2>
36 <ul><li><strong>Напишите спецификацию или ТЗ к коду</strong>. Продумайте основные сценарии использования программы и распишите, какие части кода за что будут отвечать. Изучите логику проекта, посмотрите, какие методы и стили уже используются или будут использоваться в нем. Это поможет лучше понять структуру кодовой базы и начать сразу писать красивый чистый код.</li>
36 <ul><li><strong>Напишите спецификацию или ТЗ к коду</strong>. Продумайте основные сценарии использования программы и распишите, какие части кода за что будут отвечать. Изучите логику проекта, посмотрите, какие методы и стили уже используются или будут использоваться в нем. Это поможет лучше понять структуру кодовой базы и начать сразу писать красивый чистый код.</li>
37 <li><strong>Пишите тесты до создания самого кода</strong>. Тогда вы начнете задумываться об интерфейсах программы, и дальше будет легче рефакторить код. Для сложных частей программы можно создать модульные тесты - они изолируют кусок кода и проверяют корректность его работы на промежуточном этапе, задолго до финального релиза. Чем больше таких тестов, тем выше вероятность того, что удастся очистить код от лишних элементов.</li>
37 <li><strong>Пишите тесты до создания самого кода</strong>. Тогда вы начнете задумываться об интерфейсах программы, и дальше будет легче рефакторить код. Для сложных частей программы можно создать модульные тесты - они изолируют кусок кода и проверяют корректность его работы на промежуточном этапе, задолго до финального релиза. Чем больше таких тестов, тем выше вероятность того, что удастся очистить код от лишних элементов.</li>
38 <li><strong>Изучите, как пишут код другие разработчики</strong>. Посмотрите на код в опенсорс-проектах, почитайте про<a>нейминг</a>. Изучите, как другие разработчики борются с побочными эффектами.</li>
38 <li><strong>Изучите, как пишут код другие разработчики</strong>. Посмотрите на код в опенсорс-проектах, почитайте про<a>нейминг</a>. Изучите, как другие разработчики борются с побочными эффектами.</li>
39 <li><strong>Проводите код-ревью</strong>. Это поможет обнаружить признаки спагетти-кода до того, как программа уйдет в релиз. Если же вы работаете в одиночку, то просто старайтесь не усложнять код - в любом языке программирования сейчас доступны фреймворки и библиотеки, которые помогут реализовать сотни функций парой строк.</li>
39 <li><strong>Проводите код-ревью</strong>. Это поможет обнаружить признаки спагетти-кода до того, как программа уйдет в релиз. Если же вы работаете в одиночку, то просто старайтесь не усложнять код - в любом языке программирования сейчас доступны фреймворки и библиотеки, которые помогут реализовать сотни функций парой строк.</li>
40 <li><strong>Если в код пришлось добавить комментарии, то<a>пишите их правильно</a></strong>. Так всем членам команды - этой и последующих - будет гораздо проще разобраться, за что отвечает конкретный кусок кода.</li>
40 <li><strong>Если в код пришлось добавить комментарии, то<a>пишите их правильно</a></strong>. Так всем членам команды - этой и последующих - будет гораздо проще разобраться, за что отвечает конкретный кусок кода.</li>
41 <li><strong>Больше практикуйтесь</strong>. Во время работы с кодом чаще задавайте себе вопрос: "А не сделал ли я спагетти?". Также читайте статьи на Хекслете под названием "Совершенный код" и смотрите<a>видеолекции Кирилла Мокевнина</a>.</li>
41 <li><strong>Больше практикуйтесь</strong>. Во время работы с кодом чаще задавайте себе вопрос: "А не сделал ли я спагетти?". Также читайте статьи на Хекслете под названием "Совершенный код" и смотрите<a>видеолекции Кирилла Мокевнина</a>.</li>
42 </ul><blockquote><h3>Продолжайте учиться:</h3>
42 </ul><blockquote><h3>Продолжайте учиться:</h3>
43 <p>На Хекслете есть несколько больших профессий, интенсивов и треков для джуниоров, мидлов и даже сеньоров: они позволят не только узнать новые технологии, но и<a>прокачать уже существующие навыки</a></p>
43 <p>На Хекслете есть несколько больших профессий, интенсивов и треков для джуниоров, мидлов и даже сеньоров: они позволят не только узнать новые технологии, но и<a>прокачать уже существующие навыки</a></p>
44 </blockquote>
44 </blockquote>