Я постоянно сталкиваюсь с этим выражением «не изобретай велосипед» или «никогда не изобретай велосипед», когда я задаю несколько вопросов по SO. Они говорят вам использовать некоторые фреймворки или существующие пакеты. Я знаю, откуда происходит это отношение, так как неразумно тратить время на то, что уже решили другие. Или это что так?
Будучи студентом, я обнаружил, что с помощью кода, написанного другими для решения моей проблемы, я не могу выучить столько, сколько хотел бы, и у меня становится меньше понимания. И иногда я думаю, что эта фраза в основном предназначена для работающих программистов, работающих в сжатые сроки, а не для таких студентов, как я.
Разве так плохо «изобретать велосипед»? Может я не так думаю? Может быть, есть способ, которым я могу избежать изобретать велосипед и в то же время многому научиться?
источник
Ответы:
Я думаю, что вы делаете хорошую мысль. Большинство программистов на этом сайте, скорее всего, работают профессионалы, цель которых состоит в том, чтобы как можно быстрее создать качественное программное обеспечение. Изобретать колесо не удалось этой цели по двум причинам.
Тем не менее, в академической среде цель состоит в том, чтобы учиться , а не поставлять программное обеспечение в рамках бюджета. Изобретая колесо, чтобы понять, как работают спицы или ось, это отличный способ для достижения этой цели. Вот почему многие учебные программы по программированию включают в себя класс по созданию компиляторов, когда очень немногие работающие программисты когда-либо нуждаются в этом.
источник
Ответ во многом зависит от контекста. Если вы хотите получить более глубокое понимание структур данных, попробовав свои силы в реализации хэш-таблицы, лучше всего сделать «изобретать колесо». Если вы учитесь писать компиляторы и нуждаетесь в таблице символов, реализация собственной хэш-карты вместо ее повторного использования из стандартной библиотеки - пустая трата вашего времени.
источник
Будучи студентом, я ожидаю, что вы начнете обучение программированию, сначала скопировав колесо или два, а затем научитесь модифицировать колеса, чтобы увидеть, как они работают, и понять любые ограничения. Позже вы можете даже создать собственное новое колесо, чтобы посмотреть, сможете ли вы улучшить дизайн или показать своему руководителю курса свое понимание вовлеченных концепций.
Однако, как работающий профессионал, я ожидал, что вы узнали, какое колесо использовать для решения любой данной проблемы, и когда будет целесообразно изменить существующее колесо, если оно только частично решит вашу проблему. Если вы нигде не можете найти колесо , то, возможно, вы определили рыночную нишу или недостаточно изучили его, и вам нужно иметь достаточно опыта, чтобы знать, когда будет уместно создать новое колесо вашего автомобиля. своя.
Вопрос о том, когда уместно заново изобретать решение, является сложным, и для того, чтобы понять, когда лучше создать новую версию того, что уже было сделано ранее, требуется время и опыт. Когда вы разрабатываете только короткое время, лучше просто использовать существующее решение и попросить ваших наставников предложить варианты. Когда у вас есть сжатые сроки и большая неопределенность в проекте, использование чего-то существующего может значительно сэкономить время и всегда является вашим первым выбором. Вы всегда можете рефакторинг, чтобы использовать другие решения позже, если это уместно, даже если это означает, что вы в конечном итоге вернетесь, чтобы заново изобрести свое колесо .
источник
Будучи учителем или программированием, я постоянно борюсь с противоположной стороной проблемы: когда я прошу студентов заново изобрести колесо?
Возьмем следующие простые ситуации: мы изучаем алгоритм сортировки, и я ставлю задачи, чтобы написать программу, которая сортирует некоторые данные; или работает над функциональностью даты, и я прошу календарь.
Для обоих из них есть бесчисленное множество готовых библиотек и доступных функций; но я хочу, чтобы студенты избегали их и разрабатывали свою собственную версию алгоритма сортировки или календаря.
Теперь возьмем другой: я поставил задачу написать простое приложение, скажем, для планирования встреч. Для этого, скорее всего, потребуется сортировка, а также календарь и многое другое. На этот раз применимо «не изобретать велосипед»: я не хочу, чтобы студенты боролись с решенными проблемами, а вместо этого собираю существующую функциональность, чтобы получить результат.
Моя трудность заключается в том, сколько просить вас воссоздать существующее, которое действительно помогает вам учиться, и имеет преимущество в том, что у вас есть проблемы с определенными трудностями, которые я могу использовать, чтобы заставить вас практиковаться в ремесле, и сколько я должен разместить Вы в реальной обстановке, где колеса не изобретаются заново?
Чтобы ответить на ваш вопрос более прямо, два предложения:
источник
Практика Я сомневаюсь, что первые 1000 строк кода, которые кто-либо пишет, очень уникальны.
Расширьте свой инструментарий Использование фреймворка приносит больше пользы, когда вы понимаете, что он делает (хотя бы до такой степени, что вы могли бы сделать это сами.), Чтобы вы знали, как его применять.
Понимание «колес» Использование плохо сконструированного и изношенного колеса или колеса, которое не подходит, не является оправданием для слепого соблюдения этого правила. У вас может не хватать времени, финансирования, опыта, поэтому вы просто исправляете это и заканчиваете поездку.
Есть немного абсолютов .
источник
У студентов нет денежных средств для выполнения заданий, но есть сроки, которые нужно учитывать.
Как кто-то, кто был студентом до недавнего времени, я думаю, что количество изобретений колеса, которое уместно, зависит от того, для какого класса вы выполняете задание. Вы не хотите писать свою собственную библиотеку сокетов для класса веб-разработки и дизайна (если вы можете сделать это и вовремя сдать задание, что вы делаете, принимая такой легкий класс?), Но вы пропустите много, если это было задание для класса сетей. Конечно, профессора обычно учитывают эти вещи при создании заданий, поэтому вы будете в основном выполнять работу, связанную с классом, но иногда важно знать, что вы не должны писать самостоятельно.
Тем не менее, как только вы покидаете школу, трудно найти время для создания вещей, которые уже существуют. Воспользуйтесь любой возможностью, когда сможете, пока вы еще в школе.
Если вы получаете отряду «Использовать библиотеку X / framework Y» для SO, то предваряйте ваш вопрос «Я пишу X самостоятельно, чтобы узнать больше об этом»
источник
Если у вас нет установленного срока для вашего проекта, IMO, лучше изобретать велосипед. Если у вас нет работы или вы просто хотите научиться программировать, а не зарабатывать деньги на программировании, какой смысл использовать ярлыки, которые не сделают вас лучшим программистом, которые просто сделают ваш проект быстрее? Хотя это действительно так, но определенно полезно знать, как использовать библиотеки, фреймворки и чужой код.
источник
В реальной жизни колесо заново изобретается. Если мы посмотрим на причины, мы можем найти некоторое понимание того, когда нам нужно изобретать колесо в программировании.
С шумерских времен многое изменилось:
Как это переводится на мир программного обеспечения? Что ж,
источник
Я недавно образованный студент. В школе мы «изучали» asp.net и C #, эти два года обучения ушли на то, что мы никогда не пытались создать собственную систему электронной почты, систему входа в систему или CMS. ,
Мы начали 102 ученика, 23 сделали. У 4 человек есть работа. Причина ?: Эти 4 человека (включая меня) знали, как программировать, прежде чем мы начали обучение.
Остальные люди потеряны. Потому что мы никогда не «заново изобрели колесо». Мы никогда не знали, как на самом деле работает код. Довольно просто создать полную систему входа в систему с управлением пользователями - но студенты из моего образования не знают, как это сделать. Потому что они не знают, как на самом деле работает система входа в систему.
Мне грустно, что в какой-то момент фактически потрачено 2 года, ничего не изучая. - Мне бы хотелось, чтобы учителя по всему миру говорили: да, мы знаем, что есть фреймворки, в которых существует код, вы можете использовать их в реальной жизни ... Но на этом обучении вы научитесь программировать ..
Многие курсы по программированию очень короткие, поэтому в течение этого времени они должны охватывать множество вещей. Я думаю, что было бы лучше, чтобы список вещей был сокращен вдвое и больше времени уделять программированию. Люди могут «изобрести новый вид колеса», если они знают, как построить нормальное «колесо». Люди не глупы, если у них есть немного знаний, но вы не можете попросить человека, который ничего не знает об автомобилях, построить машину ... Но спросить человека, который знает, как построить велосипед, было бы намного проще с собственно сборкой машины.
источник
Это действительно зависит от того, что вы делаете. Если вы пытаетесь понять колеса, это хорошая идея, чтобы изобрести их самостоятельно. Однако, если вы пытаетесь понять автомобили, изобретать колесо или двигатели внутреннего сгорания, как правило, расточительно и отвлекает.
Так, например, когда вы заинтересованы в понимании того, как может работать индекс полнотекстового поиска, будет хорошей идеей попробовать свои собственные. Если вы пытаетесь создать приложение для управления документами, лучше повторно использовать существующую библиотеку, потому что большая часть вашей работы заключается в правильной настройке архитектуры приложения и взаимодействия с пользователем.
источник
Да, уместно сказать студентам не изобретать велосипед. Но должно быть четкое понимание того, что это означает для студента: напишите, что имеет отношение к заданию. Это не означает, что если задание состоит в написании пузырьковой сортировки, вы копируете ее из Википедии, и это не означает использование array.sort или эквивалентов, если это предусмотрено вашей структурой или языком. Но после того, как вы рассмотрели различные алгоритмы сортировки, написали свою собственную пузырьковую сортировку и быструю сортировку, не беспокойтесь о перезаписи ее для каждого нового назначения, используйте либо встроенную сортировку, либо то, что вы написали, не повторяйте одно и то же снова ,
Изобретать колесо - это не тратить время, которое одинаково применимо как к студентам, так и к профессионалам - разница заключается в том, какие цели существуют. Студенты должны учиться, поэтому то, что не способствует их пониманию, является пустой тратой времени - после того, как вы написали одну пузырчатую сортировку, вы знаете, что она делает, вы знаете, почему вы не хотите использовать ее на большом наборе, и переписывать его снова и снова - пустая трата времени. Вы не собираетесь изучать что-то новое на 25-й переписать.
Для студентов это не означает, что не пишите то, что написали другие, это означает, что не переделывайте то, что вы уже освоили, - то время, которое лучше потратить на то, что вы не освоили.
источник
Много мыслей и усилий ушло на создание колеса. Совет заключается в том, чтобы «не изобретать велосипед», но вы можете пойти дальше и перепроектировать колесо и понять, почему определенные вещи выполняются так, как это делается. После этого вы можете попробовать реализовать колесо по-своему, что может привести к одному из трех логических концов.
Для меня студент не должен изобретать велосипед, но попытаться реконструировать его и понять последствия.
источник
Я бы сказал, что это зависит от того, изобретаете ли вы заново, чтобы увидеть, как работает колесо, или заново изобретаете колесо в процессе выполнения какой-то другой задачи. Конечно, есть колеса, которые каждый студент должен внедрить хотя бы один раз самостоятельно. Вы должны знать, как работают некоторые элементарные структуры данных и алгоритмы, чтобы понять, как они повлияют на производительность вашего кода, или выбрать, какие из них использовать в различных обстоятельствах.
Стеки, кучи, связанные списки, деревья и т. Д., Безусловно, стоит потратить время на внедрение; затем всегда используйте те, которые предусмотрены фреймворком. Каждый, кто использует плагин jQuery, должен написать хотя бы один, но вам не нужно писать каждый тип, который вы когда-либо будете использовать. Я бы сказал, что полезно, но не обязательно, писать небольшой планировщик процессов или мини-ОС, чтобы вы могли понять, что происходит на компьютере. Вы должны понимать, как работают процессы, потоки и т. Д.
Когда у вас есть хорошие рабочие знания, может быть важно (и весело) вернуться и реализовать новые структуры / алгоритмы, чтобы почувствовать их. Если это не ваша работа или вы не очень хороши в этом, я бы использовал существующие в вашем коде.
источник
Ответ зависит от того, хотите ли вы учиться или творить.
Если целью является изучение, «изобретать колесо» может дать вам более глубокое понимание и лучшее понимание, чем использование существующих колес (функции библиотеки).
Но если целью является создание сложного продукта, то «изобретение колеса» может занять много времени и мало поможет в создании продукта.
Тем не менее, если целью души является обучение, обеспеченное достаточным временем и выносливостью, «изобретать велосипед» - лучший вариант, поскольку он помогает настроить каждую отдельную функцию.
источник
Ну, есть два аспекта этого.
Во-первых, если вы пытаетесь учиться, может быть полезно сделать что- то с нуля или использовать интерфейсы более низкого уровня, чем это необходимо. Однако все еще необходимо определить, что вы изучаете: если вы хотите узнать о протоколе HTTP, вам не нужно заниматься программированием сокетов самостоятельно. Только заново изобретайте вещи, о которых вы узнаете , и делайте это только для того, чтобы действительно изучить и понять их.
Но - одним из наиболее важных навыков профессионального программиста является выбор, изучение и использование уже существующего программного обеспечения. Это то, чему вы также должны научиться. Огромная часть вопросов по SO, похоже, пришла от людей, которые не умеют читать документацию.
Наконец, программирование опирается на существенную теоретическую базу. Вам нужно будет использовать оба практических упражнения в сочетании с чтением, чтобы выучить теорию.
источник
Я столкнулся с такой же ситуацией. Это из-за разницы в восприятии в промышленности и академических кругах.
Если вы не «изобретаете велосипед», то вы абсолютно не сможете учиться в школе или понимать, как что-то работает.
Принимая во внимание, что в промышленности цель состоит в том, чтобы произвести продукт в наименьшее время и усилие.
Лично мне нравится спускаться по кроличьей норе, и я ненавижу философию отрасли, но именно так ведется бизнес, и вы не можете жаловаться.
источник
У Hacker Jargon Lexikon есть очень хороший комментарий по поводу изобретения колеса :
Поэтому было бы неплохо заново изобрести колесо, но убедитесь, что вы смотрите на другие решения до или после этого.
источник
Ответ A: заново изобрести колесо. Это углубляет ваше понимание структур данных и алгоритмов и повышает вероятность того, что вы напишете хорошие вещи. Я уверен, что когда Гвидо ван Россум начинал на Python, люди говорили ему не изобретать велосипед. Уже было много языков. Зачем писать гугл, когда уже был Yahoo! Как насчет лязга? Узнайте все это. Будь великаном. Не позволяйте маленьким людям ограничивать вас. Ответ Б: Если инструктор скажет вам, что делать, дайте ему то, что он хочет, или просто немного больше, даже если это кажется глупым. Если вы хотите ТАКЖЕ сойти с ума, приняв удивительное решение и дайте ему ссылку на него, продолжайте. Во-первых, тем не менее, выполните требования, изложенные как дано, так что он счастлив.
источник
Если вы студент, и, следовательно, у вас нет установленного срока для вашего проекта, лучше «изобретать велосипед». Если вы программируете сейчас просто для того, чтобы научиться программировать, а не зарабатывать деньги, зачем использовать ярлыки, которые не помогут вам учиться? Почему бы не сделать это трудным путем? Но когда вы станете работающим программистом, люди будут настроены скептически, если вы не знаете, как использовать фреймворки или библиотеки ...
источник
Делайте то, что просит вас задание / вопрос / экзамен.
Несколько лет назад я был ТА для класса программирования C. Экзаменационный вопрос был «Напишите программу для копирования файла». Несколько студентов задавали один и тот же тип вопроса - могут ли они запустить процесс и запустить команду cp ОС?
Мы спросили их: «Будет ли ваша программа копировать файл?»
Экзаменационный вопрос попросил их написать код для копирования файла. Если в ответе не было C-кода, который копировал файл (например, открытый ввод, открытый вывод, цикл чтения / записи байтов, закрытие ввода, закрытие вывода), он не копировал файл.
Если учитель говорит, что используйте каркас или библиотеку (например, графический класс может сказать вам использовать 3D-библиотеку), то используйте то, что ему говорят. Не изобретайте свой собственный или не используйте другой. Из-за чего-то другого учителю будет сложнее оценить вашу работу.
В ходе собеседования знание популярных рамок поможет вам ответить на вопросы. Создайте свои собственные проекты, чтобы учиться. Удачи в учебе.
источник
cp
свою программу, она скопировала бы файл.