Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Золотой молоток.

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

Золотой молоток, также известный как закон инструмента, закон молотка или молоток Маслоу, — это когнитивное искажение, заключающееся в чрезмерной опоре на привычный инструмент. В программной инженерии так называют антипаттерн: знакомую технологию, язык или архитектурное решение применяют к каждой новой задаче, в том числе к тем, для которых они плохо подходят, просто потому что команда их уже знает. Абрахам Маслоу писал в 1966 году: «Заманчиво, если единственный имеющийся у вас инструмент — молоток, относиться ко всему так, будто это гвоздь».

Эта идея приписывается как Маслоу, так и Абрахаму Каплану, хотя фраза про молоток и гвоздь, возможно, не принадлежит изначально ни одному из них.

История

Английское выражение «бирмингемская отвёртка» (a Birmingham screwdriver), означающее молоток, отсылает к практике использования одного инструмента для всех целей и предшествует и Каплану, и Маслоу как минимум на столетие.

В 1868 году в лондонском периодическом издании Once a Week содержалось такое наблюдение: «Дайте мальчику молоток и стамеску, покажите, как ими пользоваться, — и он тут же начнёт рубить дверные косяки, обтёсывать углы ставен и оконных рам, пока вы не научите его лучшему применению этих инструментов и тому, как держать свою активность в рамках».

Каплан

Первая зафиксированная формулировка этой идеи принадлежит Абрахаму Каплану, 1964 год: «Я называю это законом инструмента, и его можно сформулировать так: дайте маленькому мальчику молоток, и он обнаружит, что всё, с чем он сталкивается, нуждается в забивании».

В феврале 1962 года Каплан, тогда профессор философии, выступил с банкетной речью на конференции Американской ассоциации педагогических исследований, которая проходила в Калифорнийском университете в Лос-Анджелесе (UCLA). В статье в июньском номере Journal of Medical Education за 1962 год говорилось, что «кульминацией трёхдневной встречи... стало замечание Каплана о выборе методов исследования. Он призывал учёных проявлять здравый смысл при выборе подходящих методов для своих исследований. То, что определённые методы оказываются под рукой или что конкретный человек был обучен пользоваться определённым методом, ещё не гарантирует, что этот метод подходит для всех задач. Он привёл закон инструмента Каплана: „Дайте мальчику молоток, и всё, что ему попадётся, придётся забивать“.»

В книге The Conduct of Inquiry: Methodology for Behavioral Science (1964) Каплан снова упомянул закон инструмента, сказав: «Нет ничего особенно удивительного в том, что учёный формулирует задачи так, что для их решения требуются именно те методы, которыми он сам особенно хорошо владеет». А в статье 1964 года для The Library Quarterly он снова сослался на этот закон и заметил: «Мы склонны формулировать свои задачи так, чтобы создавалось впечатление, будто их решения требуют именно того, что у нас уже случайно есть под рукой».

Томкинс и Колби

В сборнике эссе 1963 года Computer Simulation of Personality: Frontier of Psychological Theory Сильван Томкинс писал о «тенденции подгонять задачи под инструменты, а не инструменты под задачи». Он писал: «Если у человека есть молоток, он склонен искать гвозди; и если у человека есть компьютер с объёмом памяти, но без чувств, он скорее займётся запоминанием и решением задач, чем любовью и ненавистью». В той же книге Кеннет Марк Колби прямо сослался на этот закон, написав: «Первый закон инструмента гласит, что если вы дадите мальчику молоток, он внезапно обнаружит, что всё нуждается в забивании. Компьютерная программа может быть нашим нынешним молотком, но её необходимо испробовать. Невозможно решить из чисто кабинетных соображений, будет от неё какой-либо толк или нет».

Абрахам Маслоу

Молоток Маслоу, в популярной формулировке звучащий как «если всё, что у вас есть, — это молоток, всё выглядит как гвоздь» и его варианты, происходит из книги Абрахама Маслоу The Psychology of Science, опубликованной в 1966 году. Маслоу писал: «Помню, я видел сложную автоматическую мойку для автомобилей, которая прекрасно справлялась с их мытьём. Но она умела только это, и со всем остальным, что попадало ей в лапы, она обращалась так, будто это автомобиль, который нужно вымыть. Полагаю, заманчиво, если единственный имеющийся у вас инструмент — молоток, относиться ко всему так, будто это гвоздь».

Проявления

Программирование

Понятие золотого молотка, «знакомой технологии или концепции, навязчиво применяемой ко множеству программных задач», было введено в литературу по информационным технологиям в 1998 году как антипаттерн — практика программирования, которой следует избегать.

Разработчик ПО Хосе М. Гильгадо писал, что этот закон по-прежнему актуален в XXI веке и в высшей степени применим к разработке программного обеспечения. Он отмечал, что разработчики ПО часто «склонны использовать одни и те же знакомые инструменты для совершенно нового, другого проекта с новыми ограничениями». Он связывал это с «состоянием зоны комфорта, в котором вы ничего не меняете, чтобы избежать риска. Проблема в том, что, используя одни и те же инструменты всякий раз, когда это возможно, вы не имеете достаточных доводов для выбора, потому что вам не с чем сравнивать, и это ограничивает ваши знания». Решение состоит в том, чтобы «продолжать искать наилучший возможный вариант, даже если мы не очень хорошо с ним знакомы». Это включает использование языка программирования, с которым человек не знаком. Он отметил, что продукт RubyMotion позволяет разработчикам «оборачивать» незнакомые языки программирования в знакомый язык и тем самым избегать необходимости их изучать. Но Гильгадо счёл такой подход нецелесообразным, поскольку он закрепляет привычку избегать новых инструментов.

Пример

Команда, свободно владеющая регулярными выражениями, применяет их даже для чтения JSON. Шаблон находит первое попавшееся поле "total" — в примере ниже это сумма отдельной позиции, — неверно читает числа вида 1.5e3 и молча возвращает 0.0, если поля нет.

import re


# order_total('{"items": [{"total": 5}], "total": 1.5e3}') вернёт 5.0, а не 1500.0
def order_total(payload: str) -> float:
    match = re.search(r'"total"\s*:\s*([0-9.]+)', payload)
    return float(match.group(1)) if match else 0.0

Парсер JSON понимает формат целиком и явно сообщает об ошибке при некорректных данных: выбирайте инструмент, подходящий к данным, а не тот, который команда знает лучше всего.

import json


def order_total(payload: str) -> float:
    return float(json.loads(payload)["total"])

Адаптировано по статье Википедии “Law of the instrument” (версия 1352498338), распространяется по лицензии CC BY-SA 4.0; текст переведён и отредактирован, добавлены примеры.