Я испытываю кризис уверенности в своих способностях программиста.
Вчера я попытался придумать свой собственный алгоритм кратчайшего пути для графа, и через несколько часов я просто набросил полотенце и выучил алгоритм Дейкстры.
Это хорошая вещь, которую хороший программист должен «изобрести» за пару часов, или я нереалистичен?
Ну что ж, по крайней мере, мне удалось изобрести пузырьковую сортировку: D
algorithms
Новичок Программист
источник
источник
Ответы:
Хороший программист должен понимать, что отличный алгоритм уже написан для решения проблемы и не тратит время на переизобретение колес.
Я сомневаюсь, что Дейкстра придумал алгоритм кратчайшего пути за несколько часов, так что это похоже на действительно высокий стандарт, который можно использовать для определения, является ли кто-то «хорошим программистом»
источник
Во-первых, вы, возможно, путаете программирование с теоретической информатикой. Фантастическому программисту нужен хороший фундамент в информатике, но он не должен быть фантастическим. Дейкстра отлично разбирался в информатике.
Во-вторых, я бы ожидал, что любой, у кого есть хорошее понимание графиков, разработает свой собственный обход графиков после небольшого размышления. Но не алгоритм кратчайшего пути. Алгоритм Дейкстры, в частности, очень сложен. Как только вы это поймете, это станет очевидным. Но большинство вещей таковы.
Вы могли бы, вероятно, получить какой-нибудь алгоритм кратчайшего пути, попробовав что-то и потратив некоторое время на идею. Но не разочаровывайтесь, если это займет часы или даже несколько дней. Это полностью нормально и нормально.
(Предостережение: хорошо, вы должны быть в состоянии решить проблему за несколько часов, но это не даст работающего алгоритма даже на довольно маленьких графиках.)
источник
Определенно нереально. Люди не просто «придумывают» алгоритмы за несколько часов. Это требует много усилий и работы. Цитировать этот блог:
и версия Bentley также была проблематичной, когда реализована для больших наборов.
Кроме того, хороший программист знает, какие инструменты находятся в его распоряжении и когда использовать эти инструменты. Вы не получаете дополнительных баллов за оригинальность или за то, что делаете по-другому - вы хотите, чтобы это работало и работало хорошо.
источник
Очень маловероятно, что вы сможете найти лучшее решение, чем те, которые вы можете выбрать.
Выйти с лучшим алгоритмом, чем тот, который считается «лучшим» (в вашем случае, самым коротким), не каждый может сделать. Вероятно, это даже невозможно.
Хороший программист должен уметь понимать логику алгоритма, и почему он лучше или хуже (или просто неадекватен для этой конкретной проблемы), чем другие алгоритмы, которые пытаются решить ту же проблему.
(s) Он также должен знать, действительно ли это лучший способ решить эту конкретную проблему.
В любом случае, если вы хотите попрактиковаться, вы все равно можете попытаться написать собственную реализацию алгоритма, пытаясь решить проблему, используя свой ум. Это может быть не лучшим, но это хорошая практика для решения проблем.
источник
Это напоминает мне кое-что о разнице между «разработкой программного обеспечения» (то, что я бы назвал программированием) и другими инженерными дисциплинами. Если подумать, я думаю, что это была оригинальная книга Design Patterns. Я уверен, что кто-то здесь может процитировать это на макушке.
В любом случае, смысл (хотя и не совсем направленный на разработку алгоритмов) заключался в том, что инженерные дисциплины кодифицированы; никакие инженеры-строители, вероятно, не будут тратить время, пытаясь изобрести двутавровую балку, но программисты делают это постоянно. Проблема (и я понимаю, что просто повторяю мнение многих) состоит в том, что это поведение расточительно и подвержено ошибкам и служит эго больше, чем решение.
Информатика привела меня к программированию, и я люблю оба. Тем не менее, я гораздо лучший программист, чем ученый. Я бы никогда не обвинил вас в некомпетентности, потому что вы не можете заново изобрести алгоритм Дейкстры днем. Я бы поставил под сомнение вашу компетентность как программиста, если бы вы не могли распознать проблему, которую можно решить с помощью алгоритма графа кратчайшего пути.
Тем не менее, я считаю, что думать об алгоритмах и пытаться разрабатывать и реализовывать новые алгоритмы (потенциально) весело и (почти) всегда поучительно. Я просто пытаюсь четко отделить время CS от времени программирования. Для программистов наше (особенно оплачиваемое) время лучше потратить на решение практических задач, чем на случайные. Кроме того, время CS почти всегда подрывает мою уверенность.
источник
Вы не будете замечать того же, что и все остальные. Я думаю, что это просто факт жизни, с которым мы должны жить. Многое из этого зависит от вашего пассивного обучения и ментальных моделей, которые вы разработали в результате их.
Я знаю некоторых очень умных и компетентных программистов, которых нужно было обучить закону ДеМоргана в школе, прежде чем они могли бы делать это последовательно. Мне довелось самостоятельно выяснить Алгоритм Дейкстры (и я должен признать, что я немного горжусь этим), но мне потребовалось очень много времени, пока я даже не смог понять пузырьковую сортировку.
Более того, Эйнштейн, который, как вы думаете, будет экспертом в теории узлов, не мог завязать свои шнурки, пока ему не исполнилось десять лет.
Скорее всего, вы неосознанно заново изобрели многие вещи, которые многие другие никогда бы не поняли, если бы их не учили явно.
источник
Я позволю себе не согласиться с тем, что говорят большинство ответов. Хотя я бы не ожидал, что программист любого уровня сможет сам придумать алгоритм Дейкстры, я определенно ожидал бы, что он найдет какой-либо способ (эффективный или нет) для решения проблемы.
Например, в качестве дополнительного комментария вы сказали, что вам удалось придумать пузырьковую сортировку самостоятельно. Я знаю, что это самый странный из алгоритмов сортировки, но вы нашли способ решить проблему, и я ожидаю, что программисты смогут: найти способ решения проблем.
Конечно, исследование и поиск решений, сделанных другими, также работают, но крайность этого пункта - парень, который не думает о себе и чьи программы - сборник поисков Google.
Я думаю, что я звучу резче, чем на самом деле хочу, но моя точка зрения такова: я бы ожидал, что программист будет достаточно изобретателен, чтобы найти решение проблемы, даже если решение будет глючным или грязным.
Итак, возвращаясь к вашему делу, я не думаю, что вам нужно придумывать алгоритм Дейкстры, но если у вас есть возможность написать алгоритм, чтобы опробовать несколько возможностей и найти кратчайший путь, не заканчиваясь в бесконечном цикле, тогда ты получил мое одобрение.
(Кстати, мое одобрение считается в том же порядке важности, что и бесплатный купон на автомойку.)
источник
Да, он / она должен.
Это может быть моральным эквивалентом пузырьковой сортировки, но я думаю, что хороший программист должен быть способен придумать хотя бы что-то, что работает, каким бы неэффективным оно ни было.
Нет необходимости говорить, что если эта конкретная проблема возникнет, хороший программист сначала посмотрит, есть ли для него библиотека, или какие опубликованные алгоритмы это делают и которые легко реализовать.
Конечно, многие задачи по программированию гораздо менее сложны, и не всем нужно уметь решать такие сложные задачи. Но вы захотите, чтобы в вашей команде был кто-то с таким же умом, потому что у вас могут быть некоторые сложные специфические для проекта проблемы, когда вы не можете полагаться на множество предыдущих научных исследований.
источник
Не волнуйтесь
Как программист на Perl, я никогда не изобретаю велосипед. Это работа CPAN. Если есть простой, хорошо поддерживаемый алгоритм или модуль, мы его используем. Если нет хорошего модуля, то мы изобретаем колесо. Это одна из величайших вещей в Perl.
Итак, что я говорю, это:
источник
Теория графов и применяемые к ней алгоритмы на первый взгляд кажутся простыми, но, как правило, далеки от этого. Можно подумать, что формирование непересекающихся (плоских) графов просто, например, на первый взгляд. В прошлом году я тщательно изучил эту проблему (планарность путем исключения подграфов Куратовского). Исходя из этого опыта, я могу сказать, что люди, которые пишут эти алгоритмы, обычно тратят на это свое обучение в аспирантуре, а иногда это исследование проводится в группах. И, как исследователи , это их единственный рабочий фокус в течение этого периода времени. Не имеет смысла думать, что мы, инженеры на местах, можем ожидать того же. Как правильно сказал кто-то здесь, это ослепительно очевидно, когда перед вами предстает решение. Это всегда так!
источник
Я бы даже сказал, что если вы можете изобрести алгоритм для хорошо известной проблемы, такой как Shortest Path, самостоятельно, то вы плохой программист.
Это означало бы, что вы игнорируете довольно сложную историю проблемы кратчайшего пути , переходя от алгоритма O (| V | ^ 4), опубликованного в 1955 году, к алгоритму O (E + V log V), опубликованному в 1984 году (который является Дейкстрой алгоритм с деревьями Фибоначчи). Вы почти гарантированно сделаете хуже, чем уже разработанные алгоритмы. Что еще хуже, есть хороший шанс, что в вашем алгоритме есть пробелы или ошибки, делающие его некорректным. Кроме того, вы почти наверняка потратите гораздо больше времени на разработку своего алгоритма, его реализацию и тестирование, чем на повторное использование существующего алгоритма.
Оставьте разработку алгоритмов разработчикам алгоритмов. Программисты являются потребителями своих результатов. Программисты комбинируют алгоритмы и используют их для решения реальных задач. Сотрудник полиции не должен быть в состоянии заново изобрести закон, чтобы иметь возможность работать или быть хорошим офицером.
Я даже призываю вас использовать реализации, сделанные экспертами, а не реализовывать алгоритмы самостоятельно для любого умеренно сложного алгоритма. Скорее всего, это будет правильно, скорее всего, они сделали это быстрее, чем вы когда-либо, и это сэкономит вам много времени. Это особенно верно для криптографических алгоритмов, потому что вы получаете дополнительные требования безопасности, которые обычно могут предоставить только эксперты.
источник