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>