Раз уж мы затронули тему логов, то давайте поговорим о них чуть подробнее. Да, это будет разговор со звездочкой, но почему бы не начать его именно сейчас?
И в нашем первом разговоре о том, зачем нужен пример «Hello, World!», и в недавнем разговоре в разделе “Log, Forest, log!” мы озвучили важную мысль:
очень важно в первую очередь научиться видеть, чем занимается программа в процессе своей работы
Почему это важно?
Не только потому, что это позволит нам лучше понимать как работает наша программа.
Допустим, мы уже написали рабочую программу, она успешно скомпилировалась, мы её запустили и она работает (!). Казалось бы, всё — успех! Можно удалять все операции логирования, которые мы расставляли в программе, чтобы понять, что в ней происходит.
Но не всё так просто! Дело в том, что наш успех может быть временным. Да, сейчас программа работает правильно, но она работает правильно с теми входными данными, которые в неё поступают прямо сейчас. А что если возникнет такая ситуация, которая приведет к краху программы, потому что мы не учли какой-то вариант?
Давайте в качестве примера возьмем сайт Госуслуги. Предположим, вы один из разработчиков этого сайта и сделали форму для подачи заявления. В одном из разделов формы надо ввести адрес. Вы сделали стандартные поля: город, улица, номер дома, номер квартиры. Всё работает! Пользователи приходят, заполняют форму, жалоб нет. И вдруг поступает жалоба от пользователя, что при попытке заполнить форму страница сайта «ломается», появляется сообщение об ошибке и дальше пользователь ничего не может сделать. Вы проверяете у себя, вводите разные данные — всё работает! В чем же дело?
А если бы у вас были логи, то, заглянув внутрь них, вы могли бы увидеть, что, оказывается, программа падает при отправке формы из-за того, что одно из полей не заполнено: пользователь не указал улицу! Но как же так? Ведь в адресе обязательно должна быть улица!? Оказывается, не всегда: например, в городе Зеленоград адрес может звучать так: г. Зеленоград, корпус 412, кв. 11. А где же улица? А её нет, потому что город поделен на микрорайоны 1-й, 2-й, 3-й и так далее, и первая цифра в корпусе — это микрорайон, а дальше идёт номер дома в этом районе. Неожиданно, правда?
Пока входные данные соответствовали вашим ожиданиям, программа успешно работала. Но при определенном сочетании входных данных всё пошло наперекосяк. И если бы не логи, нам было бы трудно понять из-за чего конкретно произошел сбой (failure) в нашей программе.
Примечания
-
напомню, что такие случаи, как наш пример про Зеленоград, называются крайними (corner/edge cases);
-
в реальной ситуации пользователь даже не смог бы отправить форму, потому что программист, скорее всего, сделал бы поле ввода «улица» обязательным (для заполнения);
-
справедливости ради, в Зеленограде есть и улицы, например: улица Юности, а ещё есть аллеи (Яблоневая и Солнечная) и проспекты (Панфиловский).