Форум программистов, компьютерный форум, киберфорум
Storm23
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Общие ошибки начинающих разработчиков

Запись от Storm23 размещена 12.04.2017 в 08:00
Показов 6327 Комментарии 13

Здесь приводится обзор наиболее частых ошибок начинающих (и не очень) программистов.
Эти ошибки не привязаны к какому либо конкретному языку программирования, а являются общими проблемами начинающих разработчиков ПО.

1. Отсутствие плана действий.

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

Реализация должна начинаться только после разработанного алгоритма решения.

2. Они кодируют решение, и не задумываются о его эффективности.

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

Решение задачи должно быть не только правильным но и эффективным.

3. Нет четкой архитектуры, беспорядочное форматирование кода.

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

Всегда задавайте архитектуру проекта перед его реализацией.

4. Дублирование кода.

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

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


5. Отсутствие четких принципов именования переменных, методов, классов.

Соглашение об именовании - очень важный аспект всего программного проекта и играют важную роль для успешного его завершения и дальнейшего развития. Имена переменных типа a, b, c, d - это наилучшие примеры наихудших имен переменных. Они плохи, потому что они ничего не означают. Аналогично, бессмысленные или слишком общие имена классов/методов/функций делают программный код нечитабельным, если не сказать бессмысленным.
Правильное именование делает код самодокументируемым, делает ненужными комментарии, снижает вероятность случайных ошибок и опечаток. Также правильное именование облегчает ведение логов и вывод сообщений об ошибках - они становятся гораздо более информативными.

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

6. Неправильное исправление ошибок, приводящее к новым ошибкам.

Исправление ошибок является одним из основных видов деятельности всех программистов. И тут есть один важный момент. Просто исправить ошибку - это еще не все. Более важным моментом является исправить эту ошибку правильно. Часто возникают ситуации, когда новички сосредотачиваются только на симптоматическом устранении ошибки. При этом, они игнорируют контекст и не решают проблему в целом. В результате, исправление ошибки провоцирует возникновение новых ошибок - сразу или в перспективе.
Например, мы ведем базу клиентов, в которой есть поле City. Разумеется, это поле очень важно для нас. И вот пользователь сообщает программисту, что при попытке внести данные о клиенте, программа выдала сообщение об ошибке: "Невозможно вставить NULL в столбец City". Что бы решить эту проблему, предположим, программист просто открыл таблицу базы данных и присвоил полю City значение nullable, таким образом разрешив использовать NULL в качестве значения поля City. Казалось бы проблема решена, и ошибка исправлена. Но на самом деле, своими действиями программист создал целый каскад других ошибок - связанных с тем, что обрабатывающие алгоритмы не ожидают значения NULL в поле City, либо связанные с потерей полезной информации (поскольку у пользователя теперь будет возможность не вводить это поле).

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

7. Плохое знание IDE, языка программирования и других средств разработки.

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

8. Редкое использование средств отладки.

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

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

9. Игнорирование бекапов и систем контроля версий.

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

10. Неправильное использование технологий, методов, алгоритмов и структур данных.

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

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

11. Изобретение колеса.

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

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

________________________________________ ________________________________________ __

Этот пост является вольным переводом статьи Common-Mistakes-By-Beginners-In-Programming-World, с дополнениями из обсуждения на LinkedIn и компиляцией собственных мыслей по этому поводу. Также я вырезал и исправил некоторые спорные моменты.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 13
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Тут важно бы понимать о насколько "начинающих" речь, об уровне начинания.
    И от этого плясать. Если совсем начинающих, то некоторые советы плохо применимы.

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

    То же касается написания своих "велосипедов" с целью изучения.
    Запись от Avazart размещена 12.04.2017 в 13:22 Avazart вне форума
  2. Старый комментарий
    Для исчерпывающего понимания по каким правилам стоит программировать можно всегда посоветовать "Code Complete". Правда, лично по мне, уж чересчур исчерпывающего .
    Знание "велосипедов" можно даже отнести к культуре программиста, да и для мозгов полезно. Но в реальных условиях, конечно, стоит пользоваться готовыми и проверенными решениями.
    Запись от Garcian размещена 12.04.2017 в 15:32 Garcian вне форума
  3. Старый комментарий
    Аватар для Storm23
    Цитата Сообщение от Avazart
    К примеру вместо того что бы гонять отладчик, полезнее было бы напрячь мозги и найти ошибку самому проглядывая код.
    Ну одно другому не мешает. Конечно думать нужно, но часто складывается такое впечатление, что люди просто не знают о существовании отладчика. Иначе откуда инфантильные вопросы типа "а у меня вот 20 строк кода и в конце ВНЕЗАПНО неправильный результат" или "У меня ошибка" (это полный текст вопроса )
    Запись от Storm23 размещена 12.04.2017 в 16:36 Storm23 вне форума
  4. Старый комментарий
    Аватар для Storm23
    Цитата Сообщение от Garcian
    Знание "велосипедов" можно даже отнести к культуре программиста, да и для мозгов полезно. Но в реальных условиях, конечно, стоит пользоваться готовыми и проверенными решениями.
    Я сам люблю писать велосипеды. Но одно дело писать просто так для себя, а другое дело профессиональная разработка.
    Запись от Storm23 размещена 12.04.2017 в 16:38 Storm23 вне форума
  5. Старый комментарий
    Аватар для mozgotron
    Жесть. Для меня самые трудновыполнимые пункты 7 и 9.
    Запись от mozgotron размещена 15.07.2019 в 10:07 mozgotron вне форума
  6. Старый комментарий
    Аватар для Rius
    Жесть. Для меня самые трудновыполнимые пункты 7 и 9.
    Разве вам кто-то мешает это осваивать?
    Запись от Rius размещена 15.07.2019 в 11:47 Rius на форуме
  7. Старый комментарий
    2. Они кодируют решение, и не задумываются о его эффективности. (?)
    ...
    Лучше верное решение, чем эффективное, но не верное.
    Медленную, но верную программу можно потом доработать до быстрой.
    Запись от wer1 размещена 16.07.2019 в 06:58 wer1 вне форума
  8. Старый комментарий
    11. Изобретение колеса. (?)
    ...
    Кто-то сказал... Что легче решить задачу самому, чем найти её на просторах интернета.
    Действительно, поиск может быть долгим, если не вечным! А найденное решение, если оно есть, может вам не подходить. Зачем человеку мозги? Искать можно всю жизнь и не найти!
    Запись от wer1 размещена 16.07.2019 в 07:05 wer1 вне форума
  9. Старый комментарий
    7. Плохое знание IDE, языка программирования и других средств разработки. (?)
    ...
    Программирование тут ни при чём.
    Запись от wer1 размещена 16.07.2019 в 07:07 wer1 вне форума
  10. Старый комментарий
    6. Неправильное исправление ошибок, приводящее к новым ошибкам. (?)
    ...
    Нет логики. "Неправильное исправление ошибок" - Такой термин ещё придумать надо!
    Ошибка либо исправляется, либо нет. Третьего не дано!!!
    Запись от wer1 размещена 16.07.2019 в 07:11 wer1 вне форума
  11. Старый комментарий
    4. Дублирование кода. (?)
    ...
    Почему нет? Хороший проверенный код можно дублировать многократно.
    Это не ошибка! Это наше русское авось да небось!
    Запись от wer1 размещена 16.07.2019 в 07:16 wer1 вне форума
  12. Старый комментарий
    Аватар для wmysterio
    Ох же этот номер 5 ) Сколько же мне пришлось прочитать решений задач, где эти "a, b, c, d" всё прут и прут. Ладно там "x, y, z", которые по контексту понятно за что отвечают или "i, j, k" в циклах, которые есть в примерах во многих учебниках и применяются как индекс массива/списка.
    Это не ошибка!
    Пока не придётся переписывать все эти N дублей...
    Запись от wmysterio размещена 12.08.2019 в 18:02 wmysterio вне форума
  13. Старый комментарий
    Аватар для Avazart
    Медленную, но верную программу можно потом доработать до быстрой.
    Потом уже поздно, время на разработку невозвратимо потрачено, а программа не соответствует требованиям(если есть требования к скорости).

    С таким же успехом можно сказать что "эффективное решение можно потом доработать до верного".
    Запись от Avazart размещена 13.08.2019 в 11:44 Avazart вне форума
 
Новые блоги и статьи
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »