Какие типичные ошибки в программировании совершают новички — отвечают эксперты

Нам в редакцию Tproger пришел вопрос от подписчика, которым мы хотим поделиться с вами:

«Какие типичные ошибки в программировании совершают новички?»

Мы обратились за разъяснениями к нашим экспертам, а полученные ответы предоставляем вашему вниманию.

Ильназ Гилязов

Ильназ Гилязов, эксперт курса «Профессия веб-разработчик» университета digital-профессий Нетология

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

Сегодня существует большое количество источников информации различной степени качества: начиная от классики Computer Science, написанной 10-15 лет назад, до современных школ обучения, где преподают практики. Я бы рекомендовал с особой осторожностью относиться к современным инфо-бизнесменам, за неделю обещающих из вас сделать программиста.

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

Отсутствие практики. Я очень часто сталкивался с тем, что на первых порах некоторым начинающим все понятно и они просто не делают практические задания, потому что там все просто. Через какое-то время они банально ничего не могут написать из того, что в их понимании уже не так просто, так как нет практического навыка.

Ключевые критерии: наличие практики по изучаемому материалу и приближенность практики к реальной жизни.

Непонимание контекста задачи. К сожалению, с детства нас учат тому, что в задаче сформулированы все первоначальные данные и условия, а также четко определено, что нужно сделать.

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

Андрей Коваленко

Андрей Коваленко, сооснователь и CTO Voximplant

Главная ошибка новичка заключается в том, что он спешит. Вместо того, чтобы изучать язык, платформу или фреймворк, он вводит вопрос в Google/Stack Overflow и просто копирует результат. Это плохо не только потому что без системных знаний невозможно понять новые технологии «изнутри», но и просто потому что в скопированных ответах могут быть ошибки. Если не разобраться досконально, вместо кода получится «лоскутное одеяло» из кусков Stack Overflow, в котором сам автор разбирается крайне поверхностно. Как следствие, развивать это решение дальше будет крайне сложно.

Михаил Субботин

Михаил Субботин, преподаватель израильской высшей школы IT и безопасности HackerU

Я бы задал этот вопрос иначе: «Какие опасности подстерегают новичка в программировании?». По моему мнению, самая главная из них — самоуверенность. Если новичок решил задачу с первого раза, то у него может сложиться впечатление, что все легко и можно расслабиться. Но это не так — наоборот, если задача была решена, надо работать еще больше, чтобы выйти на тот уровень, на котором возникают ошибки, или ты не можешь предложить решение. Иначе тебя обойдут те, кто не был столь уверен в своих знаниях, но много и усердно работал. С другой стороны, решение задачи может быть не самым оптимальным, но без стремления найти другие решения и «поиграть» с ними новичок может запомнить свое первое решение и предлагать его всегда, даже если оно больше не уместно.

Андрей Кузьмичев

Андрей Кузьмичев, заместитель генерального директора RU-CENTER

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

Какие же основные ошибки могут совершать начинающие программисты?
1. Не пытаться искать информацию. Если вы начинающий программист, наверняка кто-то уже сталкивался с вашим вопросом, и решение есть в открытом доступе, мануалах, FAQ и т/ д. Поиск ответа также может показать выбранное решение проблемы с другой стороны. И возможно, это решение только ухудшит ваш проект. Очень полезно использовать опыт других программистов.
2. Не бросать неверное решение. Если Вы поняли, что выбранное решение – не самое лучше, смело отбрасывайте его и начинайте заново. Плохой код и много “костылей” в программе не сделают её удобной для эксплуатации, даже если в итоге она заработает.
3. Ошибка вытекает из пункта два – ухудшать, а не улучшать код. Всегда нужно стараться, пусть и понемногу, улучшать код, но не ухудшать его временными решениями.
4. Не планировать. В этом вопросе важно найти оптимальный вариант, т.к. чересчур подробное планирование может только затруднить подготовку проекта. Нет идеальных планов, но, особенно для крупных проектов, планирование необходимо.

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

Диана Гомонова

Диана Гомонова, руководитель отдела маркетинга в веб-студии Craft Group

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

Сергей Вересов

Сергей Вересов, руководитель проектного офиса «Павелецкая» компании «Первый БИТ»

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

2. Склонность к «красивым» решениям. Если есть возможность решить задачу сложно и красиво или просто и утилитарно, новичок выберет «красоту». Естественно, такие «решения» сложнее поддерживать, масштабировать и использовать вторично. Избавиться от такой склонности поможет работа в команде и получение регулярной обратной связи от коллег, которые вынуждены мучиться с такой «красотой».

3. Использование объектов не по назначению. Связано также с недостатком опыта. Это можно исправить регулярной практикой в команде и постоянным изучением инструментов работы.

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

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

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

Кирилл Меженцев

Кирилл Меженцев, программист группы разработки карты рассрочки «Совесть»

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

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

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

Перерабатывать.Работая с утра до полуночи, не отдыхая и не высыпаясь, вы берете у себя здоровье и силы в долг. Когда-то придётся его вернуть. Если я не справляюсь с нагрузкой за рабочие ~8 часов, значит: а) я не настолько компетентен и переоценил свои способности, б) у меня проблемы с тайм-менеджментом, и я взял больше работы, чем реально выполнить за это время. Оба варианта — повод задуматься и исправить положение. Перерабатывая вы делаете хуже не только себе, но и работодателю. Кому нужен неделями не высыпающийся сотрудник, который от усталости не может перевернуть бинарное дерево? Да, бывают случаи, когда дедлайн горит, все пошло не так и «надо было вчера». Но после таких ситуаций обязательно нужно отдохнуть и провести оценку: что я должен сделать, чтобы не допускать этого в будущем?

Алексей Рузин

Алексей Рузин, ведущий разработчик Kokoc Group

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

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

3. Непрозрачные названия переменных или функций.
Чтение кода занимает в 10 раз больше времени, чем написание, поэтому важно, чтобы он хорошо читался и программист быстро понимал, что именно этот код делает. Возьмем для примера язык Python.
Неопытные программисты могут назвать переменные так:

def a(b):
    return math.pi*b

Но лучше написать так:

def circle_length(diameter):
    return math.pi*diameter

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

Например, такой код:

def print_tree(tree)
    nodes = list_tree(tree)
    for node in nodes:
        print get_node_data_from_database(node)

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

def print_tree(tree)
    nodes = list_tree(tree)
    nodes_data = get_data_from_database(nodes)
    for node_data in nodes_data:
        print node_data

5. Погоня за модными технологиями.
Как правило, новые технологии имеют превосходство в одних областях за счет проигрыша в других. До тех пор, пока у начинающего программиста нет понимания этих особенностей, лучше использовать проверенные временем универсальные решения. Например, если программист разрабатывает приложение, которое хранит какие-то данные, не стоит спешить использовать самое последнее NoSQL-решение, только потому, что это модно. В большинстве случаев подойдет обычная SQL база-данных (MySQL, PostrgreSQL, SQLite) с большим объемом документации, стандартизированными подходами, описанными и давно решенными проблемами.

Напоследок:
• Всегда тестируйте свой код, в идеале, пишите автоматизированные тесты;
• Делайте бэкапы данных, в том числе, систему контроля версий кода;
• Не выкладывайте новый код на продакшн-сервер в пятницу вечером, потому что есть вероятность, что придется провести выходные, исправляя ошибки.

Александр Донсков

Александр Донсков, системный архитектор REG.RU

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

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

Многие начинающие разработчики используют технику copy-paste. Мы живем в прекрасное время, где любая проблема может решиться за несколько секунд с помощью поисковика. Но не стоит этим злоупотреблять. Бездумное копирование решений со stackoverflow не только не добавит в вашу копилку опыта, но и может что-то сломать в проекте. После того, как вы нашли проблему, постарайтесь ее решить с помощью документации, если это не получается сделать за вменяемый срок, то уже можно обращаться за помощью к великому Google. После того, как было найдено решение, необходимо понять, как оно работает, и только после этого, можно использовать его в коде.

Бывают ошибки с  использованием неподходящих инструментов. Многие джуниоры, не успев дописать свой первый hello world, уже бегут осваивать новые технологии и прорывы в мире ПО,при этом не желая изучать фундаментальные вещи, которые являются основой всего современного стека технологий и кардинально не меняются десятилетиями. Как следствие появляется  несколько значительных проблем:

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

Непонимание, где, как, а главное зачем использовать ту или иную технологию или инструмент, негативно сказывается на качестве кода и проекта в целом.

Приверженность к одному конкретному языку/технологии/OS/IDE и попытки навязать их другим (евангелизм), тоже часто говорит о том, что человек не понимает или не может объективно сравнить тот или иной инструмент для решении конкретной задачи.

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

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

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

Денис Цыплаков

Денис Цыплаков, Solution Architect DataArt

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

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

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

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

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

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

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

Алексей Алексеев

Алексей Алексеев, программист отдела мобильной разработки DIRECTUM

Если бы 15 лет назад кто-то рассказал мне об этих 5 ошибках, думаю мой путь разработчика был бы легче. Делюсь своим опытом с вами.

Типичные ошибки новичка-программиста:
1. Изобретает велосипед. Многие задачи уже сделаны до, надо просто погуглить и найти хороший пример с открытым кодом.
2. Хватается за первое попавшееся решение. Как правило, если подумать подольше можно выйти на лучшее решение проблемы.
2. Не думает об архитектуре. Решает проблему в текущем месте, не анализируя как новый код может повлиять на другие места программы.
4. Костыли. Вместо того, чтобы докопаться до сути проблемы, разработчик на скорую руку начинает вставлять в код заплатки, которые уродуют программу.
5. Не пишет тесты. Тесты нужны, они упрощают жизнь.

Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.

Ещё интересное для вас:
— Биты, байты, Ада Лавлейс — тест на знание околоIT.
— Level Up — события и курсы, на которых можно поднять свой уровень.
— Работа мечты — лучшие IT-вакансии для вас.