Гравитация как сила практически не существует в мире атомов и молекул, но она определяет, как устроен мир глобально: на уровне звезд, галактик и так далее. В программировании есть один трейдофф, который ведет себя точно так же: незаметен «снизу», но определяет практически все «сверху».
Мы, программисты, мыслим абстракциями. Не все одинаково, конечно. Там, где написанный код видно сразу, то есть например во фронтенде или в графическом софте, слой «абстрактности» потоньше и вещи немного поосязаемее. Но в общем случае программирование — это абстракции без конца и края.
Так вот, создавая в коде очередную абстракцию, мы обычно (и как правило, подсознательно) выбираем решение среди двух полюсов:
- Сделать абстракцию «мощной»
- Сделать ее сухой, вернее менее протекающей
Мощная абстракция — это штука, которая почти сразу получает подкрепление на уровне биохимии мозга. Написал — сразу кайфанул. Мощь абстракций одурманивает мозг. Но общее правило таково: чем абстракция мощнее, тем больше в ней мест, где она может «протечь». И вот протечки видно не сразу. Когда короткий код покрывает слишком большую область применений, мы теряем способность охватить их все, и в результате не получаем моментального наказания, когда написали протекающую абстракцию. С последствиями протекающих абстракций разберется «будущий я», а чаще и вовсе не я. В итоге мы живем в мире, который постоянно требует залатывания дыр, но эти дыры как бы возникли из ниоткуда. У них нет конкретного автора, мы как в сериале «разделение» вдруг внезапно оказываемся этими «будущими я» и начинаем повсюду вставлять заплатки.
Лично я проходил стадии эволюции, начиная с той, где любил абстракции, кончая той, где немного побаивался их. Абстракции обманчивы: они обольщают, обещают много выгоды, они приходят с дарами. Но они не желают тебе добра. Со временем я выработал свой подход к абстракциям, назовем это «плоскими» абстракциями. Что это значит? Написание абстракций «разгоняет», эффективная абстракция позволяет написать сложную штуку очень быстро. Возникает соблазн сразу надстроить поверх еще одну, и сверху еще одну. Мой подход состоит в том, чтобы остановиться на первой и уплотнять ее до некоторой критической прочности, которой уж точно будет достаточно, чтобы двигаться дальше. Что это за уровень? Это уровень инструмента.
Инструмент отличается от просто абстракции тем, что в идеале он полностью отчуждаем от текущего продукта. Это не значит, что он не может быть узким или специальным. Но важно, чтобы он был максимально отчуждаемым.
- Мне нужно колесо вообще, а не колесо для моей конкретной хонды
- Мне нужен гвоздь вообще, а не гвозь для конкретной стены
Этот подход тотален. Практически весь код, который я создаю, пишется по этим правилам (по крайней мере весь значимый). Создавать инструмент на основе абстракции — очень долго и дорого. Но это окупается.