Вы можете прочитать эту статью в моем собственном блоге, если вы предпочитаете ее средней.

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

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

От несколько круглых, полных и широких колес.

Идеально круглые, тонкие и полые с сотнями спиц.

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

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

Лучший способ представить миллионы изобретений колеса и прогресс, которого это помогло достичь, - это подумать о том, как оно использовалось на протяжении долгого времени.

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

Колеса теперь могут быть достаточно маленькими, чтобы их не воспринимали человеческие чувства, достаточно универсальными, чтобы перевозить танк по любому типу местности,
достаточно прочными, чтобы выдержать скорость поезда, мчащегося со скоростью до 500 км / ч в течение нескольких часов, и достаточно умными, чтобы Проведите роботов через непредсказуемый ландшафт других планет.

Реквизит парням и девушкам, которые изобрели первые колеса, они отлично поработали, учитывая обстоятельства. Но я очень рад, что, когда приедет моя кабина, она не будет использовать что-либо, даже отдаленно близкое к этим колесам.

Давайте свяжем это с программированием

Я надеюсь, что деконструкция этой метафоры подтолкнула к пониманию того, насколько безосновательна эта идиома, когда дело касается программного обеспечения. Некоторые из наиболее широко используемых и важных когда-либо созданных программ являются изобретениями колеса.

Linux - это новое изобретение Unix, MariaDB - это новое изобретение MySQL, MySQL - это новое изобретение PostgreSQL / OracleDb.

Современный C ++ - это переосмысление C ++, переизобретения C (которое является переизобретением B, переизобретением BCPL). Rust - это новое изобретение современного C ++, а C. Clojure - это новое изобретение LISP. LISP - это новое изобретение IPL и лямбда-исчисления. Haskell - это переосмысление System FC, переизобретения System F, переизобретения лямбда-исчисления. DOT - это переосмысление OO, Kotlin - это переосмысление Java.

Vim - это переосмысление Vi. Wayland - это переосмысление Xorg. Systemd - это новое изобретение около 500 различных программ. Ubuntu - это переосмысление Debian. Arch - это переосмысление Gentoo, и даже ядро ​​OS X - неудачное переосмысление BSD.

Я мог бы продолжать столько, сколько захочу ...

Многие достижения в области программного обеспечения достигаются не путем добавления к существующей кодовой базе, а путем повторения ее и придумывания чего-то лучшего. Вот почему для каждого популярного репозитория на GitHub есть сотни форков. Для любого вообразимого сценария использования у вас есть десятки вариантов инструментов на выбор.

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

Людей часто отговаривают «изобретать колесо», несмотря на то, что большинство достижений в области информатики связаны именно с изобретением колеса, а не с созданием чего-то совершенно нового.

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

Вместо этого нам следует сосредоточиться на том, чтобы рассказывать людям, как и когда изобретать велосипед. Я позволил себе составить краткий список.

Изобретите колесо заново, когда ни одно колесо не подходит к вашей тележке

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

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

Очевидно, вы должны быть немного гибкими и выбирать свои сражения, иначе вы в конечном итоге станете одним из тех программистов на C, которые настаивают на том, что они должны писать свои собственные списки и векторы, или одним из разработчиков JavaScript, который принимает участие в 100 000+ ежедневных загрузок библиотеки is_odd.

Где провести черту - это открытый вопрос, на который нет однозначного ответа.

Хорошим примером этого является Julia, язык программирования, который очень похож на Python во всех аспектах, кроме трех:

  • Его легко развернуть, не требуя виртуальных сред.
  • Это намного быстрее для векторных операций
  • Он разработан с учетом крупномасштабного параллелизма.

Он делает то, что теоретически можно сделать с помощью комбинации виртуальных сред, Cython, правильного использования библиотек C / C ++, некоторых рекомендаций по кодированию и немного терпения.

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

Изобретите велосипед заново, если не было недавних изобретений

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

Часто случается, что проблему «решают» несовершенным образом, а затем оставляют на второй план, поскольку наши нынешние технологии и ментальные рамки не могут найти лучшего решения.

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

Отличным примером этого является распознавание изображений, которое считалось задачей классических классификаторов. В эти классификаторы было внесено множество дополнительных улучшений, и к 2010 году у вас были довольно хорошие результаты, используя такие вещи, как ядро рыбака.

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

До тех пор, пока у кого-то не возникла идея адаптировать менее популярное колесо сверточных нейронных сетей для использования современных графических процессоров и улучшить некоторые модели распознавания изображений, первоначально разработанные в 90-х годах.

В 2012 году появилась знаменитая AlexNet & Co, которая за несколько коротких лет проложила путь к современной технологии распознавания изображений. В настоящее время по наборам данных среднего размера мы действительно можем превзойти людей.

Изобретите колесо заново, если оно запатентовано

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

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

Изобретите колесо заново, если вы думаете, что это может быть весело

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

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

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

В заключение

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

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

Всякий раз, когда вы думаете, что решаете проблему, которую лучшие люди уже решили лучше. Помните, что 31-летний ботаник с небольшим знанием астрофизики или математики и несколькими десятками миллионов долларов сумел унизить NASA, CNSA, ESA, Роскомос, американские, российские и китайские военные и многие другие «престижные» организации с бюджетами в десятки или сотни миллиардов, с десятками тысяч PHD и сотнями тысяч инженеров, работающих на них.

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

Так что, возможно, вы пытаетесь создать более интуитивно понятную и красивую библиотеку построения графиков JavaScript, более быстрый JITC для Python, более дешевый в производстве ALU, лучшую версию shopify или более эффективную с точки зрения памяти реализацию таблицы поиска, не так ли? в конце концов, надуманный.

Если вам понравилась эта статья, вам также могут понравиться: