Мифы и реальность кода без ошибок

Мифы и реальность кода без ошибок

2 марта 2023 г.

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

Почему код без ошибок — это миф: точка зрения разработчиков программного обеспечения

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

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

Фон

Давайте рассмотрим мой пример, чтобы проиллюстрировать это. Я хочу описать задачу, которая возникла в первые дни моей карьеры

Технология

Я работал над технологией Node.js и использовал MongoDB, популярную базу данных NoSQL, которая использует ObjectID в качестве первичного ключа для своих документов. Хотя ObjectID полезны для уникальной идентификации документов, они также могут привести к проблемам, если они неправильно интерпретируются в коде.

Неверная интерпретация ObjectID в коде

В MongoDB ObjectID представляет собой 12-байтовый тип BSON, который состоит из метки времени, идентификатора машины, идентификатора процесса и случайного значения. Он разработан таким образом, чтобы быть уникальным в глобальном масштабе, что делает его идеальным первичным ключом для документов в базе данных.

При запросе документа с использованием его ObjectID в коде важно рассматривать ObjectID как объект, а не строку. Если ObjectID обрабатывается как строка, это может привести к непредвиденному поведению в коде.

Например, рассмотрим следующий фрагмент кода

const objectId = '602f3d93a1e74a0112345673';
db.collection('mycollection').findOne({ _id: objectId }, (err, result) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(result);
});

В этом коде ObjectID обрабатывается как строка, а не как объект. В результате при вызове метода findOne он не найдет документ с заданным ObjectID.

Изначально в моем коде я не преобразовывал в ObjectID, потому что, когда код запрашивается и передается этому условию, это будет другой идентификатор объекта, запрашиваемый из MongoDB, и у него не было проблем

Ошибка

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

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

Сбой логики кода

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

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

Стратегия отладки

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

Решение

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

const objectId = new ObjectId('602f3d93a1e74a0112345673');
db.collection('mycollection').findOne({ _id: objectId }, (err, result) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(result);
});

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

Усвоенный урок

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

Заключение

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

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

Большое спасибо, если вы дочитали до этого момента ✌🏻


Также опубликовано здесь


Свяжитесь со мной через Twitter, Github, Инстаграм

==Если вам понравилось читать этот блог, не забудьте поставить лайк ❤️, прокомментировать 👌🏻 и поделиться 🤩, чтобы показать свою поддержку, поскольку ваша поддержка очень много значит для меня.==< /сильный>


Оригинал