Думай, как машина или зачем тестировщику алгоритмическое мышление?
Всем привет, народ!
Хочу с вами поделиться познавательной инфой по поводу седьмого задания в домашке вебинар SQL на ПОИНТ
Дело в том, что задание это взято из реальной рабочей ситуации-не полностью, конечно, а с изменениями.
Ситуация следующая: имеем 3 таблицы: с пользователями, с описанием товаров и с покупками пользователей (1 строка-1 покупка), необходимо найти всех пользователей, которые покупали только те товары, что выпущены в определённой стране в определенный год. В задании БД, конечно, другая, но структура и смысл задачи остались неизменны.
Ситуация эта случилась с моей коллегой. Девочка сукель знала, в принципе, неплохо, но на чисто техническом уровне-знала много операторов и могла их применять. К месту и не очень) А вот логическая сторона построения запросов хромала, в чем ее обвинять не могу и не стану — ну не поставлены у человека мозги, что тут поделаешь.
В общем, суть да дело-возилась девочка с задачей около часу (тестировщик-птица гордая, пока не приспичит — за помощью не пойдет!), написала соответствующий запрос и с задачей справилась. Ну справилась и справилась, умница и молодец, честь ей и хвала.
Но потом мне стало интересно, и я спросил у нее, какой запрос она наваяла. Она скинула мне текст запроса, и я одновременно восхитился и озадачился! Восхитился тем, по какому пути пошла коллега, а озадачился тем, что реализовано всё это было крайне неоптимально.
Решать данную задачу человек решил через сравнение общего количества товаров у пользователя и количества товаров у пользователя, подходящих под условие задачи!
Т.е., для каждого пользователя через подзапросы у нас определялись значения “общее кол-во купленных им товаров” и “кол-во купленных им товаров, подходящих под условие”, потом эти два значения сравнивались между собой (через IF-THEN-ELSE!) и, пользователь, для которого эти значения были равны, попадал в результирующую выборку. Ну превосходно же! Я действительно был в восхищении-мне бы такое даже в голову не пришло))
Но решение это столь же неоптимально, сколь и гениально! Посему мой внутренний перфекционист взбунтовался и потребовал от меня выдать на-гора более красивый и простой вариант. Я посидел, немного поскрипел извилинами и сделал всё проще и, на мой скромный взгляд, изящнее — одним-единственным подзапросом отсёк всех пользователей, которые купили хотя бы один товар, не подходящий под условие и вывел всех остальных.
Решил я сравнить производительность наших запросов, дабы удостовериться в том, что мой запрос действительно легче и быстрее. Думал, мой запрос будет обрабатываться шустрее хотя бы в пару раз, но результат меня очень удивил. 2 миллисекунды в моём запросе против 11 миллисекунд в запросе коллеги. Разница в 5.5 раз! Пять с половиной, КАРЛ!!!
Да, вы можете сказать, что на этих величинах такая разница значения не имеет. Но есть один нюанс — тестирование проводилось на нашей ПОИНТовской базе, на которой студенты учат сукель — а она маленькая. А теперь представьте себе БД какого-нибудь фейсбука или алиэкспресса, с их тысячами пользователей и миллионами связанных сущностей. Представили? То-то же! На таких объемах данных эта разница в быстродействии уже начинает приобретать вес (и весьма ощутимый!), не так ли?)
И ведь человек это сделал не из-за того, что чего-то не знает или недостаточно опытен в написании запросов, а из-за того, что не умеет думать, как машина.
Просто потому, что у нее не поставлено логическое “машинное” мышление. Ну, в принципе, оно и ожидаемо — этому мало где учат.
И вот эту вопиющую несправедливость мне хочется исправить в меру своих возможностей. Именно поэтому в моём будущем курсе лекций по SQL я буду, кроме обучения SQL, учить вас и логическому “машинному” мышлению)
Кстати, скоро выйдет бесплатный промо-вебинар этого курса! Если интересно — заполни вот эту коротенькую формочку
Всем резиновых дедлайнов и смачных блокеров, народ!
#ятренерпоинт