Чи потрібно розуміти алгоритми та структури даних, щоб називатися програмістом? [зачинено]


37

Пройшло шість років, як я кодую. Кодування у всі види речей, такі як ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP тощо. Я використовував масиви, карти, пов'язані списки, набори тощо та де б я не працював людьми, як я. Але щоразу, коли мене беруть інтерв'ю, дуже ймовірно, що люди задають мені запитання щодо хешів, дерев, штабелів та черг. Деякі питання стосуються жонглювання деякими алгоритмами сортування. Я не знаю, чи повинен я їх справді знати чи повинен перестати називати себе програмістом. Щось у мені є, що також підказує мені, навіть якщо люди, які задають усі ці питання, обирають мене, вони ніколи не змусять мене працювати над цими речами. Мені справді потрібно все це знати?


10
Це залежить від того, де ви працюєте і кого ви хочете назвати програмістом.
Тім

1
Так, якщо без негативних прикметників.
duros

Відповіді:


79

Якщо все, що ви знаєте, як написати клей-код, ви можете назвати себе кодовою мавпою. Багато клей-коду потрібно написати, і ви можете заробляти на гідне життя як мавпа з кодом. Щоб називати себе справжнім програмістом TM і довіряти йому, коли код потрібно писати з нуля, ви повинні знати алгоритми, структури даних, управління пам’яттю, покажчики, мову складання тощо і розуміти, як використовувати ці знання для оцінки компромісів.


6
Нічого собі, я на півдорозі очікував, що це буде забуте у забуття надмірно політично коректними людьми за використання терміна "кодова мавпа".
dimimcha

15
"software simian" завжди є кращою термінологією
STW

3
Я абсолютно не згоден. Тип програмного забезпечення, яке пишеться "з нуля", сильно впливає на те, хто здатний його написати. Деяке програмне забезпечення вимагає по суті меншої (або більшої) витонченості, ніж інші.
Нік Спріцєр

8
+1, 20% тому, що я згоден, 5% через "Реального програміста ТМ", і 75% тому, що я вивчив мову складання і хочу зробити вигляд, що варто боліти
Карсон Майєрс

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

32

ті, хто не знає історії, засуджені до її винахідництва


75
Власне, тих, хто не знає історії, засуджено винаходити її за допомогою методів O (N 2) або O (N 3) замість того, щоб використовувати відомі методи O (N log N), які є достатньо старими, щоб придбати випивку у всіх 50 держав.
Джон Р. Стром

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

3
.... приречені її

30

Що ж, робота такою мовою, як JavaScript, робить це досить застарілим, оскільки масив - це суміш між вектором, хешем і деревом і може використовуватися як стек чи черга. Це малоймовірно, що вам коли-небудь знадобиться або зможете реалізувати структуру даних в JavaScript, що перевершує клас Array. Це також у PHP.

У Java OTOH є різниця. Я думаю, що стандартна бібліотека Java надає інформацію про будь-яку структуру даних, яка потребує вас. Однак:

  1. Вам потрібно знати та відрізняти ці структури даних та розуміти, як вони працюють у різних ситуаціях, щоб ви могли вибрати правильну.
  2. У Java це не зовсім навряд чи ви, зрештою, захочете написати власну реалізацію для хешмапу, щоб досягти кращої швидкості в якомусь дуже конкретному випадку (наприклад, якщо ключі, з якими ви хочете обробитись, заповнюють деякі спеціальні обмеження, що дозволяють оптимізувати).

Що стосується алгоритмів сортування, то не дуже потрібно їх знати чи розуміти, тому що не потрібно ніколи самостійно реалізовувати. Однак якщо такий алгоритм вам заданий, ви повинні мати можливість зрозуміти та реалізувати його.

Дві речі певні:

  1. Ви можете зробити кар’єру програміста, не покладаючись на такі знання.
  2. Це, безумовно , не зашкодить вам їх знати.

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

Так що ні, вони вам не потрібні, але знати їх буде лише для вашої користі .


13

Це може бути приводом, коли семантично-змістовне розмежування між "програмістом" та "інженером програмного забезпечення". У цьому контексті ми конкретно бачимо, що ви володієте знаннями декількох мов програмування та суміжних технологій, і ви можете використовувати їх для отримання бажаних результатів. Це чітке оперативне визначення поняття "комп'ютерний програміст".

Я вважаю себе інженером програмного забезпечення. У більшості повсякденних аспектів моєї роботи я, мабуть, роблю ті самі речі, що і ви. Я використовую комп'ютерну мову та пов'язані з цим технології, щоб отримати бажаний результат. Однак я розумію структури даних та алгоритми, і я вважаю, що ці знання є основою моєї здатності робити набагато більше.

Часто - хоча ніколи не буває - моя робота передбачає пошук складних проблем, для яких немає очевидних рішень, нічого, що безпосередньо стосується особливостей тієї рамки, яку я використовую, або можливостей мови, якою я працюю з. У цьому мені потрібно проаналізувати проблему та розробити її рішення, і час від часу цей процес йде у царину масштабної архітектури.

Хоча для виконання такої роботи необхідне прекрасне розуміння цих глибших питань, це недостатньо . Іншими словами, просто знати, як працює хеш-таблиця або чому сорт купи зазвичай має хороші експлуатаційні характеристики, недостатньо, щоб бути системним архітектором або старшим інженером. Це логічне початкове місце, і звідти ви можете почати копати глибше і подорожувати ширше, і набути досвіду, необхідного для вирішення великих проблем.

Я гадаю, що для того, щоб відповісти на ваше запитання, ви повинні запитати себе: "Яким я хочу бути? Куди я поїду зі своєю кар'єрою?" Якщо ви бажаєте продовжувати робити те, що ви робите, то, можливо, ви просто захочете вивчити достатню структуру даних та алгоритми, щоб пройти через довільні питання інтерв'ю, з якими ви стикаєтесь.

Якщо ви хочете зростати у своїй кар’єрі, і у вас є пристрасть до цього, що є суттєвим, вам слід сприйняти ці теми як можна щільніше. Якщо у вас є деякий час, щоб попрацювати над ними, відкритий розум та справжній ентузіазм, ви знайдете чудові та захоплюючі речі. Я ніколи не забуду день, коли я вперше зрозумів кікспорт. Почуття хвилювання і відкриття поклало курс на більшу частину мого життя, і я не міг бути за це вдячним. Зараз я не можу уявити, щоб робити щось, окрім роботи інженера.

Пощастить з усім, що ви оберете.


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

+1 Добре сформульований: "Я гадаю, що для того, щоб відповісти на ваше запитання, ви повинні запитати себе:" Яким я хочу бути? Куди я пітиму зі своєю кар'єрою? "
Білл

12

Це залежить, для чого працюють. Такі речі є досить стандартними запитаннями про інтерв'ю, але вони також досить не уявні і, ймовірно, зовсім не стосуються роботи - звичайно, це не робота з використанням перелічених технологій.

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

Я б запропонував, що або ви дізнаєтесь цей матеріал, щоб ви могли пройти співбесіду, або просто приймете, що де завгодно запитувати ці речі не для вас, але ні, вам не потрібно знати їх, щоб називати себе програмістом.


1
Дякую за вашу відповідь. Я поділюсь із смішним інтерв'ю ua людям, які втручаються в мене, потрібен хтось хороший на користувальницькому інтерфейсі, використовуючи json css ajax javascript jquery тощо. Вони запитали мене, як би ви написали веб-сервер. І що станеться, коли натиснути Save у файлі слів
sushil bharwani

2
@sushil - Я думаю, що це таке місце, де ти не хочеш працювати ...
Джон Хопкінс

@sushil: Я повністю згоден з @ Jon Hopkins. Краще працювати офіціантом, який чекає хорошої роботи, ніж брати роботу на зразок такої. Маючи некомпетентних ідіотів як начальників, ви змусите вас надзвичайно засмучуватися і зупиняти вас в особистому розвитку.
back2dos

6

Чудове запитання. Javascript або Java або VC ++ - це супер розумні мови програмування, де вам ніколи не потрібно буде створювати зв'язаний список або хеш-таблицю з нуля. Але ви все одно повинні мати можливість вирішувати, коли використовувати один за іншим, штрафи за ефективність та бонуси, що нараховуються кожен тощо.

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


Велике спасибі, я скористаюся вашою порадою і почну дізнаватися про ці теми
Махмуд Хоссам

3

Я додам "так, звичайно, ви все ще можете назвати себе програмістом". Але яким програмістом ти хочеш бути? Я думаю, що найкращі програмісти мають хоча б деяке обгрунтування теоретичних основ. Вони знають, чому вони обрали конкретну структуру / алгоритм даних, а також компроміси, які пов'язані з цим. Я очікую, що будь-який розробник, з яким я беруть інтерв'ю, має хоча б основне розуміння, навіть якщо вони не використовують той же жаргон (хоча не знаючи жаргону, це означає, що вам буде складніше спілкуватися з іншими розробниками).


2

Знання алгоритмів дозволяють впевнено говорити про те , як ваш вибір буде масштабироваться ! Я особисто вважаю це необхідним, щоб бути старшим програмістом


2

"Якщо ви хочете бути хорошим програмістом, ви просто програмуєте кожен день протягом двох років. Якщо ви хочете бути програмістом світового класу, ви можете програмувати кожен день протягом десяти років, або ви можете програмувати кожен день протягом двох років і брати клас алгоритмів . "

-Чарлес Е. Лейзерсон

Гарна порада з аналізу алгоритмів Чарльза Е. Лейзерсона - MIT


1

Це залежить від проекту: я BEG в галузі комп'ютерних інженерів і працюю програмістом-аналітиком.

Я витратив чимало часу на роботу в дизайні (тестування, док, дизайн коду). Але, коли я знаходжу помилку (або погану ефективність) або мені доводиться кодувати нову структуру даних (тому що вимога є дуже НОВОю для програми), я повинен зрозуміти, де проблема в алгоритмі, і я мушу його виправити ( Я зробив це не дуже добре, так :))

Класичні алгоритми та структури даних є своєрідним «словниковим шаблоном» у світі розробників.

Деякі відмінні посилання:


1

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

  • Можливо, ви зможете бути ефективнішими та швидшими у виконанні справ. Навіть люди, які вже мають ступінь інформатики та знають багато цих тем, прагнуть постійно бути в курсі останніх досягнень, щоб вдосконалитись.

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

  • Звичайно, структура даних та алгоритми запитують багато в інтерв'ю, так що це ще одна причина, чому може бути корисно їх знати.


0

Ви згадуєте хеші, дерева, стеки, черги та алгоритми сортування. Ну, технології, про які ви згадали, в основному пов'язані з веб-сторінками та веб-сценаріями. Ви, безумовно, повинні розуміти дерева як мінімум, щоб ви могли добре працювати з DOM. Але якщо сценарій - це все, що вам потрібно зробити, то, напевно, ви все в порядку. Вам не знадобиться більшість інструментів торгівлі для справжнього програміста. Але це тому, що існує велика різниця між жонглюванням струнами, що складає більшість веб-сценаріїв, і тим, що більшість з нас вважає "написання програм".

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

Якби я не знав цих принципів і як вони працюють, я, ймовірно, міг би зламати рішення кодування, які працюють, але вони не були б дуже якісними рішеннями. Вони бігатимуть повільно, важко читати і важко змінювати, використовувати або продовжувати. Тож якщо ви хочете навчитися бути хорошим програмістом, вам обов'язково слід прочитати свої алгоритми та структури даних. Вони дійсно покращать якість вашого коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.