Нужно ли понимать алгоритмы и структуры данных, чтобы называться программистом? [закрыто]


37

Прошло шесть лет с тех пор, как я занимался кодированием. Кодирование во все виды вещей, таких как ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP и т. Д. Я использовал массивы, карты, связанные списки, наборы и т. Д., Где бы я ни работал, таких, как я. Но всякий раз, когда меня опрашивают, очень вероятно, что люди задают мне вопросы о хэшах, деревьях, стеках и очередях. Некоторые вопросы касаются алгоритмов сортировки. Я не знаю, должен ли я действительно знать их или я должен прекратить называть себя программистом. Во мне есть что-то, что также говорит мне, даже если люди, которые задают все эти вопросы, выбирают меня, они никогда не заставят меня работать над этими вещами. Я действительно должен знать все это?


10
Это зависит от того, где вы работаете и кого хотели бы назвать программистом.
Тим

1
Да, если без каких-либо отрицательных прилагательных.
Дурос

Ответы:


79

Если все, что вы знаете, как делать, это написать клейкий код, вы можете назвать себя обезьяной кода. Нужно написать много связующего кода, и вы сможете зарабатывать на жизнь как обезьяна кода. Чтобы называть себя Real Programmer TM и получать доверие, когда код должен быть написан с нуля, вы должны знать алгоритмы, структуры данных, управление памятью, указатели, язык ассемблера и т. Д. И понимать, как использовать эти знания для оценки компромиссов.


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

15
«Программный симан» всегда является предпочтительной терминологией
STW

3
Я не совсем согласен. Тип программного обеспечения, который пишется «с нуля», сильно влияет на то, кто способен его написать. Некоторое программное обеспечение по своей природе требует меньшей (или большей) изощренности, чем другие.
Ник Шпрайцер

8
+1, 20%, потому что я согласен, 5% из-за "Real Programmer TM" и 75%, потому что я выучил язык ассемблера и хочу сделать вид, что это стоило боли
Карсон Майерс

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

32

те, кто не знает истории, обречены заново ее изобретать


75
На самом деле, те, кто не знает историю, обречены заново изобретать ее, используя методы O (N 2) или O (N 3) вместо использования хорошо известных методов O (N log N), которые достаточно стары, чтобы купить выпивку во всех 50 состояния.
Джон Р. Штром

@ Джон ROFLMAO - тоже правда!
Стивен А. Лоу

3
.... обречены это

30

Что ж, работа на языке, подобном JavaScript, делает это довольно устарелым, поскольку Array представляет собой смесь между вектором, хешем и деревом и может использоваться в качестве стека или очереди. Маловероятно, что вам когда-либо понадобится или вам удастся реализовать структуру данных в JavaScript, которая превосходит класс Array. Это также имеет место в PHP.

Для Java OTOH есть разница. Я полагаю, что стандартная библиотека Java предоставляет вам любую необходимую структуру данных. Тем не мение:

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

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

Несомненно две вещи:

  1. Вы можете сделать карьеру программиста, не полагаясь на такие знания.
  2. Это определенно не повредит вам знать их.

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

Так что нет, они вам не нужны, но вам будет полезно их узнать.


13

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

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

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

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

Я полагаю, что для того, чтобы ответить на ваш вопрос, вы должны спросить себя: «Кем я хочу быть? Куда я пойду с моей карьерой?» Если вы удовлетворены тем, что продолжаете делать то, что делаете, то вам может понадобиться изучить достаточно структуры данных и алгоритмы, чтобы получить ответы на в основном произвольные вопросы интервью, с которыми вы сталкиваетесь.

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

Желаем удачи с тем, что вы выберете.


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

+1 Хорошо сформулировано: «Я полагаю, что для того, чтобы ответить на ваш вопрос, вы должны спросить себя:« Кем я хочу быть? Куда я пойду с моей карьерой? »
Билл

12

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

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

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


1
спасибо за Ваш ответ. Я поделюсь с вами забавным собеседованием, люди, которые говорят мне, нуждаются в ком-то, кто хорошо разбирается в пользовательском интерфейсе, используя json css ajax javascript jquery и т. Д. Они спросили меня, как бы вы написали веб-сервер. И что происходит, когда
кнопка

2
@sushil - я думаю, что ты не хочешь работать в таком месте ...
Джон Хопкинс

@sushil: я полностью согласен с @Jon Hopkins. Лучше работать официантом в ожидании хорошей работы, чем устраиваться на такую ​​работу. Наличие некомпетентных идиотов в качестве начальников сделает вас крайне разочарованными и остановит вас в вашем личном развитии.
back2dos

6

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

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


Большое спасибо, я приму ваш совет и начну изучать эти темы
Махмуд Хоссам,

3

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


2

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


2

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

Чарльз Э. Лейзерсон

Хороший совет от анализа алгоритмов Чарльз Лейзерсон - MIT


1

Это зависит от проекта: я являюсь инженером-программистом и работаю аналитиком.

Я потратил много времени на работу в дизайне (тестирование, док, дизайн кода). Но, когда я нахожу ошибку (или плохую производительность) или мне приходится кодировать новую структуру данных (потому что требование очень НОВОЕ для приложения), я должен понять, где проблема в алгоритме, и я должен исправить его ( Я сделал это не очень хорошо, так что :))

Классические алгоритмы и структуры данных - это своего рода «словарный паттерн» в мире разработчиков.

Несколько отличных ссылок:


1

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

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

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

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


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.