Подходит ли студентам фраза «никогда не изобретать велосипед»?

115

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

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

Разве так плохо «изобретать велосипед»? Может я не так думаю? Может быть, есть способ, которым я могу избежать изобретать велосипед и в то же время многому научиться?

Gnijuohz
источник
51
Вы не получите большую выгоду от присоединения к спортзалу, если вы заставите других людей поднимать вес для вас (если вы не учитесь быть кормушкой).
Чарльз Грант
82
Можно заново изобретать колесо, когда вы собираетесь строить колеса. Когда вы строите дома, неплохо бы предположить, что колёсники знают, что они делают лучше, чем вы.
zzzzBov
22
По крайней мере, вам нужно попробовать сделать колесо! В противном случае вы не знаете, почему вы должны использовать сборный.
59
Ни разу не уместно сказать , абсолютное. :)
CVn
2
Может быть нормально изобретать колеса, когда вы создаете чрезвычайно оптимизированный код. Стандартные библиотеки очень полезны, но часто можно создать что-то менее общее, но более быстрое.
Лев

Ответы:

126

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

  1. Переписывание существующего кода - это напрасная трата усилий, которые могут быть использованы в уникальных частях вашей системы, и выполнение проекта занимает больше времени, чем необходимо.
  2. Первая версия любого кода, скорее всего, будет иметь ошибки / непредвиденные проблемы. Большинство библиотек и компонентов многократного использования прошли многократные испытания и исправления. Если вы заново изобретаете алгоритм хеширования или пытаетесь создать свою собственную СУБД (если это не то, чем является проект) чаще всего, вы получите худшие результаты.

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

JohnFx
источник
37
Я согласен с идеей понять, как все это работает, хотя я также хотел бы, чтобы школы программирования занимали некоторое время в своей учебной программе, чтобы узнать, как использовать сторонние библиотеки и почему вы должны это делать. Я постоянно нахожу программистов и разработчиков профессионального уровня, которые не могут этого сделать и в итоге изобретают велосипед.
Спойк
3
замечательное замечание о компиляторах
Chani
1
Я думаю, что научиться не изобретать велосипед является более важным. Вы можете сделать много вещей, которые не связаны с созданием того, что уже было создано.
Томас Бонини
@Krelp Хотя один студент, концепции являются наиболее важной частью. Многие профессора используют примеры кода, чтобы разрешить теорию и применение моста. Это типы программ, которые собираются заново изобрести библиотеку, но она должна гарантировать, что студенты понимают материал.
Джетти
2
Будучи студентом, вы должны заново изобрести колесо, чтобы понять, почему оно движется так же быстро, как и оно, но как профессионал вам нужно использовать коммерческие колеса, чтобы вы могли двигаться как можно быстрее. К сожалению, оказывается, что SO - это прежде всего сайт для профессионалов, а не для студентов (разве они не запретили [домашнее задание] какое-то время?)
Tacroy
19

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

dasblinkenlight
источник
17

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

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

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

S.Robins
источник
12

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

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

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

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

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

Чтобы ответить на ваш вопрос более прямо, два предложения:

  • если учитель говорит вам «не изобретать велосипед», он, вероятно, говорит об этом, потому что они разработали свою задачу таким образом. Может быть, они хотят, чтобы вы попробовали библиотеку, боролись с чьей-либо реализацией алгоритма, а не писали свою собственную - в этом тоже есть обучение, и воссоздание интересно, но упускает суть.
  • если у вас слишком много упражнений по сборке библиотечных вызовов, а не по разработке алгоритмов, вы можете поставить с учителями вопрос о балансе между этими действиями - подчеркните, что вас никогда не просили написать свои собственные алгоритмы, например, сортировать и объединять. Общение никогда не помешает.
Бойсверт
источник
6

Практика Я сомневаюсь, что первые 1000 строк кода, которые кто-либо пишет, очень уникальны.

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

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

Есть немного абсолютов .

JeffO
источник
1
+ Особенно по последнему пункту.
Майк Данлавей
Первые 1000 строк кода, которые каждый пишет, имеют тенденцию быть очень уникальными с точки зрения творческих ошибок.
оставил около
@leftaroundabout - я думаю, мне следует ограничить это утверждение строками кода, которые можно компилировать.
JeffO
3

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

Как кто-то, кто был студентом до недавнего времени, я думаю, что количество изобретений колеса, которое уместно, зависит от того, для какого класса вы выполняете задание. Вы не хотите писать свою собственную библиотеку сокетов для класса веб-разработки и дизайна (если вы можете сделать это и вовремя сдать задание, что вы делаете, принимая такой легкий класс?), Но вы пропустите много, если это было задание для класса сетей. Конечно, профессора обычно учитывают эти вещи при создании заданий, поэтому вы будете в основном выполнять работу, связанную с классом, но иногда важно знать, что вы не должны писать самостоятельно.

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

Если вы получаете отряду «Использовать библиотеку X / framework Y» для SO, то предваряйте ваш вопрос «Я пишу X самостоятельно, чтобы узнать больше об этом»

сойка
источник
Предисловие к вашему вопросу: «Я пишу X самостоятельно, чтобы узнать больше об этом». Этот. +1.
Boisvert
2

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

Billjk
источник
Эта идея лежит в основе концепции Code Katas, переписывая код снова и снова, чтобы улучшать его и учиться на нем. Я бы сказал, что даже на работе многократно переписывать ваш код хорошо, а возможность реализовать множество шаблонов, если нужно, еще лучше.
Билл К
2

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

С шумерских времен многое изменилось:

  • Материал, из которого изготавливаются колеса: из камня, дерева, металла, карбона, ...
  • размер предметов, нуждающихся в колесах - в размере нанометров для медицинских инструментов и колес для заработка бурого угля, размером 100м
  • производственная среда - ручная или промышленная продукция
  • точность колес, которые необходимы
  • Правильная ситуация вокруг вашего колеса. Для вашей работы может быть идеальное колесо, но оно может быть запатентовано.
  • Сияющий и полирующий для вашего колеса. Кадиллак может заслуживать другого колеса, чем VW Golf.
  • Оптимальное колесо для детской коляски зависит от многих параметров: размер и вес коляски (плюс детская / детская), климатические условия, цены на ресурсы для масла или натурального каучука, машины для сборки колес и ремесленники, доступные для производства. Кратко говорится: Мировая экономика.

Как это переводится на мир программного обеспечения? Что ж,

  • Там может быть веб-сервер, но, к сожалению, он написан на PHP. Вы бы предпочли иметь его на языке, на котором вы свободно говорите
  • алгоритм сортировки может быть увеличен для 10 элементов, но не масштабируется до 1Т элементов
  • вам может понадобиться решение, которое само генерируется второй программой
  • Точность чаще всего является цифровым вопросом в области программного обеспечения, если алгоритм сортирует список, который он сортирует, а не сортирует в основном. Но помимо производительности, может возникнуть размер кода, использование памяти или другие ограничения
  • Полагаю, патенты не нуждаются в дополнительном объяснении.
  • Внешний вид - это постоянная причина для изобретения чего-то нового - подумайте dropDownList (ComboBox).
  • Глобальная экономическая ситуация может повлиять на ваше колесо программного обеспечения: будет ли это облако, колесо с открытым исходным кодом, колесо обозревателя или колесо приложения?
  • И, конечно же, самая известная причина для создания собственного колеса: вам нравится его изучать.
неизвестный пользователь
источник
2

Я недавно образованный студент. В школе мы «изучали» asp.net и C #, эти два года обучения ушли на то, что мы никогда не пытались создать собственную систему электронной почты, систему входа в систему или CMS. ,

Мы начали 102 ученика, 23 сделали. У 4 человек есть работа. Причина ?: Эти 4 человека (включая меня) знали, как программировать, прежде чем мы начали обучение.

Остальные люди потеряны. Потому что мы никогда не «заново изобрели колесо». Мы никогда не знали, как на самом деле работает код. Довольно просто создать полную систему входа в систему с управлением пользователями - но студенты из моего образования не знают, как это сделать. Потому что они не знают, как на самом деле работает система входа в систему.

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

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

Zerpex
источник
1

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

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

back2dos
источник
1

Да, уместно сказать студентам не изобретать велосипед. Но должно быть четкое понимание того, что это означает для студента: напишите, что имеет отношение к заданию. Это не означает, что если задание состоит в написании пузырьковой сортировки, вы копируете ее из Википедии, и это не означает использование array.sort или эквивалентов, если это предусмотрено вашей структурой или языком. Но после того, как вы рассмотрели различные алгоритмы сортировки, написали свою собственную пузырьковую сортировку и быструю сортировку, не беспокойтесь о перезаписи ее для каждого нового назначения, используйте либо встроенную сортировку, либо то, что вы написали, не повторяйте одно и то же снова ,

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

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

jmoreno
источник
За исключением случаев, когда 25-е переписывание является практикой для некоторого языка программирования, который вы только что изучили.
оставил около
1

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

  1. Вы либо понимаете, почему вещи такие, какие они есть.
  2. Вы можете оптимизировать его и сделать его лучше
  3. Вы могли бы напортачить и узнать, как этого не делать.

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

Рамеш
источник
1

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

Стеки, кучи, связанные списки, деревья и т. Д., Безусловно, стоит потратить время на внедрение; затем всегда используйте те, которые предусмотрены фреймворком. Каждый, кто использует плагин jQuery, должен написать хотя бы один, но вам не нужно писать каждый тип, который вы когда-либо будете использовать. Я бы сказал, что полезно, но не обязательно, писать небольшой планировщик процессов или мини-ОС, чтобы вы могли понять, что происходит на компьютере. Вы должны понимать, как работают процессы, потоки и т. Д.

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

tvanfosson
источник
1

Ответ зависит от того, хотите ли вы учиться или творить.

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

Но если целью является создание сложного продукта, то «изобретение колеса» может занять много времени и мало поможет в создании продукта.

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

оборота CoolEulerProject
источник
1

Ну, есть два аспекта этого.

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

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

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

Marcin
источник
Я согласен. Вот почему так много новых уже существующих программных платформ и библиотек создаются постоянно :)
gbjbaanb
0

Я столкнулся с такой же ситуацией. Это из-за разницы в восприятии в промышленности и академических кругах.

Если вы не «изобретаете велосипед», то вы абсолютно не сможете учиться в школе или понимать, как что-то работает.

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

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

Джон
источник
0

У Hacker Jargon Lexikon есть очень хороший комментарий по поводу изобретения колеса :

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

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

Ханс-Петер Стёрр
источник
0

Ответ A: заново изобрести колесо. Это углубляет ваше понимание структур данных и алгоритмов и повышает вероятность того, что вы напишете хорошие вещи. Я уверен, что когда Гвидо ван Россум начинал на Python, люди говорили ему не изобретать велосипед. Уже было много языков. Зачем писать гугл, когда уже был Yahoo! Как насчет лязга? Узнайте все это. Будь великаном. Не позволяйте маленьким людям ограничивать вас. Ответ Б: Если инструктор скажет вам, что делать, дайте ему то, что он хочет, или просто немного больше, даже если это кажется глупым. Если вы хотите ТАКЖЕ сойти с ума, приняв удивительное решение и дайте ему ссылку на него, продолжайте. Во-первых, тем не менее, выполните требования, изложенные как дано, так что он счастлив.

phorgan1
источник
-1

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

Billjk
источник
10
Я не знаю, в какой школе вы учились, но куда я ходил, сроки выполнения заданий были обычным делом.
CVn
-2

Делайте то, что просит вас задание / вопрос / экзамен.

Несколько лет назад я был ТА для класса программирования C. Экзаменационный вопрос был «Напишите программу для копирования файла». Несколько студентов задавали один и тот же тип вопроса - могут ли они запустить процесс и запустить команду cp ОС?

Мы спросили их: «Будет ли ваша программа копировать файл?»

Экзаменационный вопрос попросил их написать код для копирования файла. Если в ответе не было C-кода, который копировал файл (например, открытый ввод, открытый вывод, цикл чтения / записи байтов, закрытие ввода, закрытие вывода), он не копировал файл.

Если учитель говорит, что используйте каркас или библиотеку (например, графический класс может сказать вам использовать 3D-библиотеку), то используйте то, что ему говорят. Не изобретайте свой собственный или не используйте другой. Из-за чего-то другого учителю будет сложнее оценить вашу работу.

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

JQA
источник
Да, но если они породили cpсвою программу, она скопировала бы файл.
Марчин