Изобретайте колесо

Автор оригинала: George
  • Перевод

Совет “не изобретать колесо” (в смысле “не искать собственных решений вместо использования имеющихся”) плох уже потому, что переизобрести буквальное физическое колесо — довольно неплохая идея. Колеса независимо придумывались бессчётное количество раз. Менялся дизайн и пропорции; используемые материалы эволюционировали от камня и дерева до металлических сплавов, а затем и композитов. Примерно круглый плоский камень с дыркой посередине - это совсем не то же самое, что идеально круглое тонкое колесо с десятками металлических спиц.

Эволюционировали компоненты, с которыми взаимодействует колесо (например, ось и шины), так что колёса эволюционировали вместе с ними. Необходимость ездить по таким поверхностям, по которым раньше никто и не пытался проехать, тоже заставляет изобрести подходящее колесо:

Создателей первых колёс в истории нельзя не уважать. Но нельзя не уважать также и тех, благодаря кому за мной не приезжает такси, стоящее на более-менее округлых дырявых камнях.

При чём тут программирование

Надеюсь, деконструкция метафоры поможет понять, насколько эта метафора бесполезна в программировании. Немалая часть софта, которым мы пользуемся каждый день — это как раз переизобретённые колёса и самопальные велосипеды. Линукс — это переизобретённый Unix; MariaDB — это переизобретённый MySQL, который в свою очередь не что иное, как переизобретённый PostgreSQL/Oracle DB.

Современный C++ — это многократно переизобретённый C++, который в свою очередь является переизобретённым C (восходящим к B, который происходит от BCPL). Rust — переизобретение C++/C. Clojure - это переизобретение LISP, который был переизобретением IPL и лямбда-счисления. Haskell — переизобретение System FC, который восходит к System F, который тоже восходит к лямбда-счислению. DOT — переизобретение объектов, Kotlin — переизобретение Java, Vim — переизобретение Vi, Wayland — переизобретение Xorg, systemd — переизобретение нескольких сотен разных программ, даже ядро OS X — не более чем кривое переизобретение BSD. Я могу продолжать хоть до завтра, но идея понятна.

Многие прорывы в ПО случились не путём развития одного великого проекта, а потому что кто-то посмотрел на имеющийся код и решил написать примерно такой же, но получше. Именно поэтому у каждого популярного репозитория на Гитхабе сотни форков, и именно поэтому для решения любой задачи у вас есть дюжины инструментов.

Изобретайте собственные колёса, оптимизируйте их под себя — и, может быть, они пригодятся всем остальным.

Велосипедостроение часто ругают, но развитием софта мы обязаны именно ему, а не созданию принципиально новых инструментов с чистого листа. Прогресс — штука инкрементальная: существующая идея слегка улучшается одним проектом, ещё слегка улучшается следующим, и вот после десятков итераций уже сложно себе представить, что всё начиналось с настолько слабого прототипа. И что самое приятное — строительство велосипедов не стоит ничего, кроме времени программиста. Код не строится из кирпичей и бетона, для него не нужны редкие полимеры и хирургическая сталь; если вы можете себе что-то представить — то вы можете за это взяться.

Вот когда, на мой взгляд, стоит переизобретать колесо:

Переизобретайте колесо, если имеющиеся колёса не подходят вашей телеге

Не пишите плохое ПО только потому, что плохи имеющиеся библиотеки. Вместо этого напишите сперва библиотеку: у вас будет и хорошая программа, и код, который наверняка пригодится кому-то ещё. Получится дольше, да, но это интереснее и даёт лучшее ПО на выходе.

Разумеется, не надо отказываться от здравого смысла. Истина где-то между “программистами” на C, которые каждый раз имплементируют собственные векторы, и “разработчиками” на JavaScript, которые обеспечивают библиотеки is_odd её 100 000+ скачиваний в день. Где именно — вопрос открытый, но хорошим примером может быть Julia. Это язык программирования, который похож на Python почти во всём, кроме трёх вещей:

  • Он легко деплоится без виртуальных сред

  • Векторные операции гораздо быстрее

  • Масштабный параллелизм изначально заложен в язык

И да, для всех трёх фич можно было бы не придумывать свой язык. Есть venv, есть Cython, есть байндинги к библиотекам на C/C++. На крайний случай всегда есть возможность использовать хороший стиль программирования и приложить немного терпения.

Вот только в Julia это всё работает из коробки. Достоинства Python никуда не деваются, а отсутствие его недостатков экономит время и делает разработку куда более приятным занятием, так что Julia может стать одним из лучших языков 21 века.

Переизобретайте колесо, если его давно не переизобретали

Ещё одна причина переизобрести колесо — это если в последнее время что-то не видать новых колёс. Это означает одно из двух: возможно, имеющееся колесо действительно не нуждается в совершенствовании. Но также возможно, что многим в принципе не помешало бы колесо получше; вот только у них не доходят руки и/или они не знают, с какой стороны подступиться.

Часто случается, что проблема “решена” каким-нибудь неидеальным образом и отложена на будущее, потому что имеющимися средствами лучше не сделать. Так вот, это самое будущее вполне могло наступить.

Хороший пример — распознавание образов классическими методами. До-нейросетевые классификаторы потихоньку эволюционировали, и к 2010 году штуки типа ядра Фишера выдавали довольно неплохие результаты. Им всё ещё нельзя было доверить автономный автомобиль или диагностику рака, но они таки достигли уровня где-то между особо сообразительным попугаем и средним слоном по точности, времени тренировки и числу распознаваемых вещей. Общепринятой мудростью было “не переизобретать велосипед, а взять имеющиеся методы и оптимизировать параметры”.

А потом кто-то вспомнил про свёрточные нейросети и запустил их на современных GPU. Эти модели придумали ещё в 90х, но сочли вычислительно неподъёмными и практически забросили. В 2012 вышла знаменитая AlexNet, и в распознавании образов случился прорыв. Современные нейросети уже обходят человека на датасетах среднего размера.

Переизобретайте колесо, если оно проприетарное

Многие великие Open Source-проекты (Linux, GCC, git) — не более чем переизобретение уже существующего ПО. Даже если изначально они были хуже проприетарных аналогов, бесплатный открытый код привлекает больше пользователей, некоторые из которых начинают слать пулл-реквесты. Постепенно проект превосходит своего проприетарного предка: git и Linux — дефолтные инструменты для своих задач, а их предшественники практически забыты.

Переизобретайте колесо, если вам этого хочется

Нет ничего плохого в том, чтобы попытаться переизобрести колесо, которое и так прекрасно работает. Даже если ничего не выйдет, вы по крайней мере узнаете много нового и поймёте, почему имеющееся ПО устроено так, как оно устроено.

Многие интересные проблемы давно решены, но люди всё равно за них берутся. Миллионы пытались самостоятельно доказать теорему Пифагора или изобрести “новый LISP”; у большинства из них получалось в лучшем случае то, что уже и так имелось до них. Но почему бы и не потратить своё время, если вы тратите его с удовольствием? К тому же есть небольшой шанс таки усовершенствовать существующее колесо.

В заключение

Идите и переизобретите колесо. Если кто-то скажет, что вы занимаетесь ерундой — отвечайте, что именно так наша область и развивается. А если вам кажется, что задачу уже пытались решить до вас куда более опытные специалисты, то вспомните вот эту штуку:

31-летний нёрд без особых познаний в астрофизике, математике или инженерии, и всего с сотней миллионов долларов, построил ракету лучше, чем у NASA, CNSA, ESA, Роскосмос, армий РФ, США и Китая, и прочих уважаемых аэрокосмических гигантов, хотя у них и были десятки тысяч учёных, сотни тысяч инженеров и миллиардные бюджеты. Так что вполне возможно, что вам по зубам создать более удобную библиотеку для рисования графиков в JS, более быстрый JIT-компилятор для Python, более дешёвые АЛУ, новый Shopify или более эффективную по памяти хэш-таблицу.

Timeweb
VDS, инфраструктура и решения для бизнеса

Комментарии 12

    +4

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


    Что вы об этом думаете?

      +1

      Да лично я-то вообще о колёсах думаю довольно мало, потому что я переводчик, а не колёсный инженер. Но киньте, пожалуйста, сюда в комменты ту статью.

        +2

        Я про эту: Хорошие времена рождают слабаков
        https://habr.com/ru/company/itelma/blog/550620/

          0

          Ага, читал. Я про это отписался в комментах ниже — смысл этой статьи как раз в том, чтоб переизобретать всякие штуки заново, а не костылить поверх имеющегося.

        0

        Разобраться в сложном колесе и понять как оно работает уже само по себе челлендж! Способны на это не только лишь все ;)

        0
        А на днях тут была статья о том, что колеса становятся все сложнее и уже никто не понимает, из чего они на самом деле сделаны и почему вдруг иногда перестают крутиться.
        Если вы вот про эту статью "Какая «идеальная» цель развития у языков программирования?", то тут нет никаких противоречий.

        Прогресс не остановить и «теория дедушки Дарвина» все равно расставит все по своим местам, а призыв изобретать новые колеса только усиливает конкуренцию, оставляя в итоге в живых только самые лучшие решения.
          +1

          Если речь не про буквальные физические колёса, а про нагромождение абстракций, которое грозит рано или поздно рухнуть и погрести под собой всё айти — то можно ещё tonsky призвать, у него про это целый блог.


          Но да, это не противоречит основному тезису статьи. Она же как раз про то, что надо не городить костыли из изоленты вокруг имеющихся костылей на имеющихся инструментах, а попробовать запилить себе "как плюсы, но для людей" и с некоторым шансом получить на выходе Go или Rust.

          +4
          Посыл понятен, но… Есть нюансы.

          Старые-добрые изречения про колесо и велосипед не об этом ведь. В современном мире их скорее следовало бы читать примерно как «Если тебе в голову пришла гениальная идея, прежде чем преступить к ее воплощению в жизнь сначала убедись, что никто не прошел этот путь до тебя». Конечно, если то, что уж есть ты изучил и признал неподходящими, а так же при наличии соответствующих компетенций — можно и нужно делать свое.

          Зачастую, особенно в программировании, люди тратят огромные усилия на разработку собственных решений потому, что не знают о существующих аналогах, или не понимают как с ними работать (иногда нечто среднее — не понимают, что это решение — аналог).
            0

            Мускуль — переизобретённый постгресс. Окей, желтушность 100%

              0
              Добрый день!
              А что вы думаете о такой проблеме, когда, являясь начинающим разработчиком, нужно практиковаться на каком-то проекте, но мысль о том, что это будет очередная N-ная «поделка». Грубо говоря — очередное изобретение этого самого колеса. Эта мысль напрочь убивает мотивацию, а соответственно, негативно влияет на развитие разработчика.

              Эта проблема коснулась меня и это ужасная вещь. Я бы назвал это преждевременной оптимизацией вышедшей за грани разумного. :)
                0
                Closure — это переизобретение LISP


                Наверное, имелось в виду Clojure.
                  0

                  Спасибо, исправил.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое