Норвиг:
Да. Но просто поглядев на методы, применяемые в тестах, вы поймете, что они не годятся для этого, что в них не предусмотрена такая возможность. Я поражаюсь тому, насколько этот подход распространен в Google. Работая в Junglee, я однажды читал об этих вещах лекцию в отделе контроля качества. Мы занимались исследованиями покупок и сказали тогда: “Нужен тест - можем ли мы по такому-то запросу получить 80% верных ответов”. Они спросили: “Хорошо, а неверный ответ - это ошибка в программе?” Я сказал: “Нет, один неверный ответ здесь не будет ошибкой”. И они удивились: “Как так, неверный ответ не считается ошибкой?” Как будто здесь был выбор только между “да” и “нет”, в то время как это скорее напоминало компромисс.Сейбел:
Однако вы по-прежнему верите в модульные тесты. Как программисты должны продумывать тестирование?Норвиг:
Нужно писать много тестов, думая о разных условиях. Нужны и модульные тесты, и сложные регрессионные тесты. Нужно думать о вариантах отказа оборудования. Помнится, один из лучших уроков программирования я получил однажды в аэропорту Хитроу, когда там не было электричества и все компьютеры не работали. Тем не менее мой самолет улетел вовремя.У них были распечатки для всех рейсов. Не знаю, откуда они взялись, возможно с какого-то компьютера за пределами здания. Может, они распечатали их именно в то утро, а может, делают это каждую ночь, а днем выбрасывают, если с электричеством все в порядке. Но распечатки были, и работники на каждом выходе пользовались ими вместо компьютеров.
Отличный урок проектирования программ. Мало кто задается вопросом: “Как будет работать моя программа, если отключат электричество?”.
Сейбел:
А как в этом случае идет работа в Google?Норвиг:
Работа в Google в этом случае идет так себе. Но у нас есть резервное питание и множество дата-центров. Мы продумываем такие варианты: что будет, если сервер, с которым идет соединение, недоступен? Что будет при каком-либо другом отказе? Программа выполняется на тысячах машин - что будет, если одна выйдет из строя? Можно ли это вычисление перезапустить в другом месте?Сейбел:
В очерке о разработке ТеХ Кнут говорит о переключении сознания: как стать своим собственным инспектором по качеству и начать беспощадно крушить свой же код. Как по-вашему, разработчикам в целом это удается?Норвиг:
Нет. И в качестве примера могу привести свою программу проверки правописания. Я сделал ошибку в коде, который оценивал мое правописание, и одновременно немного изменил реальный код. Запустил его - и получил для себя результаты гораздо лучше обычных. И я поверил им! Будь результат очень плохим, я бы стал разбираться. Но тут я поверил в свои хорошие результаты, которые получились из-за небольшого изменения в программе. А надо было трезво все оценить и понять, что результаты не могут так сильно отличаться, что где-то допущена ошибка.Сейбел:
Как вы избегаете чрезмерной универсализации и создания того, что не понадобится, а только приведет к лишней трате ресурсов?Норвиг:
По этому вопросу идет борьба, даже горячая борьба. Но меня лучше не спрашивать - я всегда предпочитал изящные решения практичным. Поэтому я вынужден сражаться с собой, напоминая себе, что в своей работе не могу себе этого позволить. Приходится повторять - и себе, и своим коллегам: “Мы ищем самое разумное решение, и если есть идеально красивое, не факт, что оно применимо” или так: “Мы занимаемся тем, что важнее всего в данный момент”. Есть поговорка “Лучшее - враг хорошего”. Каждый инженер обязан ее помнить.Сейбел:
Почему так соблазнительно решать задачи, которые на самом деле не актуальны?Норвиг:
Мы любим чувствовать себя умными и любим завершенность. Мы хотим как можно скорее завершить работу - закончить и двигаться дальше. Мне кажется, так устроен человек - он может чем-то позаниматься, но потом ему хочется сказать: “Все, готово, выкидываю это из головы и иду дальше”. Но надо еще подсчитать рентабельность полностью завершенной работы. Это кривая в форме S - после 80- или 90-процентной готовности рентабельность неуклонно снижается. И у вас есть сотня других проектов, где вы находитесь внизу кривой и рентабельность намного выше. В какой-то момент вы говорите: “Хватит с этим, переходим к более рентабельным вещам”.Сейбел:
Как научить программистов понимать, на каком отрезке кривой они находятся?Норвиг:
Нужна правильная рабочая среда, ориентированная на результат. Думаю, люди способны учиться сами. Вы хотите оптимизировать что-то, но предоставленные сами себе, вы оптимизируете ваше личное удобство. А надо иметь в виду другое, одни говорят - рентабельность, другие - удовлетворенность клиента. Что лучше для клиента - если я закончу эту программу с 9 5-процентной готовностью или примусь за десять других, где готовность 0%?