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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

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

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

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

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

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

Современный C++ — это многократно переизобретённый C++, который в свою очередь является переизобретённым C (восходящим к B, который происходит от BCPL). Rust — переизобретение C++/C. Closure - это переизобретение 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 или более эффективную по памяти хэш-таблицу.

Источник: https://habr.com/ru/company/timeweb/blog/551360/


Интересные статьи

Интересные статьи

Привет, Хабр! Это мой заключительный пост на тему Change Management, в котором я хочу рассказать о модели Change Well и ее пользе для бизнеса. Мы рассмотрим, чем в партизан отличаетс...
В обновлении «Сидней» Битрикс выпустил новый продукт в составе Битрикс24: магазины. Теперь в любом портале можно создать не только лендинг или многостраничный сайт, но даже интернет-магазин. С корзино...
Возможность интеграции с «1С» — это ключевое преимущество «1С-Битрикс» для всех, кто профессионально занимается продажами в интернете, особенно для масштабных интернет-магазинов.
Есть статьи о недостатках Битрикса, которые написаны программистами. Недостатки, описанные в них рядовому пользователю безразличны, ведь он не собирается ничего программировать.
Каждый лишний элемент на сайте — это кнопка «Не купить», каждая непонятность или трудность, с которой сталкивается клиент — это крестик, закрывающий в браузере вкладку с вашим интернет-магазином.