Мифы и реальность кода без ошибок
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, Инстаграм
==Если вам понравилось читать этот блог, не забудьте поставить лайк ❤️, прокомментировать 👌🏻 и поделиться 🤩, чтобы показать свою поддержку, поскольку ваша поддержка очень много значит для меня.==< /сильный>
Оригинал