Я не хороший програміст (за логікою), як мені це виправити? [зачинено]


50

Гаразд, ось моя проблема:

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

Але коли-небудь я намагаюся вирішити якусь логічну проблему, мені дуже важко придумати рішення.

Наприклад, conversion of decimal to romanколи я побачив рішення, то виявляю, що це проста проблема. Але я не зміг реалізувати це через 1-2 години спроб!

Я відчуваю, що я німий і не варто бути інженером-програмістом. Здібності розгадування головоломок повинні спочатку прийти до великого програміста. Але коли я намагаюся вирішити деякі головоломки, я не в змозі знайти рішення, і я просто гуглю його! .... І це ненавиджу!

Коли у мене виникають проблеми (як-от реалізувати функцію xyz) на роботі, я досить швидко її вирішую і поважаю на своєму робочому місці за це, але я зовсім не пишаюся цим. Тому що, коли я намагаюся вирішити будь-яку складну математично чи логічно складну проблему, я натрапляю. Я все ще відчуваю, що люблю те, що роблю (як інженер), але мені дуже сумно, що я не в змозі вирішити деякі жорсткі логічні проблеми, які я зіткнувся з друзями.

Я відчуваю себе деморалізованим :(

TL; DR: Я розумію речі з практичної точки зору (впроваджуючи функції в нашому продукті), але коли я намагаюся працювати над проблемою, скажімо ProjectEuler, я СУКУВАТЬ погано! І мені потрібно відточувати мозок!

Отже, мої запитання:

  1. Як я повинен зайнятися її виправленням? Чи варто починати з вирішення (і змушення себе до) проблем з еулером проекту? Навіть якщо для вирішення деяких основних проблем мені потрібні години ?
  2. Або я повинен повернутися до основ і вивчити якусь основну математику?
  3. Мені не дуже цікаво розгадувати головоломки. Але я хочу зробити це веселим для себе! І я думаю, якщо я їх краще зрозумію, мені сподобається!

PS: Мене ніколи не здобували освіту в КС (мій недоградок був виборним). Але це не привід бути вдалим розробником.

Дякую!


3
Якщо вам не цікаво вирішувати головоломку, то навіщо турбуватися!
V4Vendetta

3
Це не весело, тому що мені важко вирішувати це. Якщо мені в цьому добре, я впевнений, що мені це сподобається!
Іван

1
Ви завжди можете спробувати це (попередження, СЕРЙОЗНО звикання , якщо ви перебуваєте в рішенні головоломки)
Benjol

2
Нічого не буває рідним. Навіть основні навички потребують навчання. Я б рекомендував обчислення та класичну механіку в якості ігрових майданчиків для тренування необхідних здібностей, але багато інших предметів (включаючи цілком нематематичні) могли б зробити те саме.
SK-логіка

3
@John підтверджено. Це була складна проблема. Ви не повинні почувати себе погано, якщо не зможете вирішити це за 5 хвилин. Півтори години на це, прочитавши Вікі про римські цифри, і лише порівнявши її результати з результатами іншої реалізації, я зміг виправити помилку. Я (як і багато інших) думав, що IL - дійсне число. Неправильно. XXXIX - це правильне число. Крім того, мені довелося спостерігати за іншими реалізаціями, щоб оптимізувати його (я попередньо кешував II, III, XX, XXX тощо), але це марно). Не почувай себе погано!
xanatos

Відповіді:


24

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

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

Отже, окрім того, що просто працювати над вирішенням проблем, вам потрібно подивитися, які інструменти та навички ви приносите до столу, коли це робите. Якщо ви збиралися працювати над новою функцією на роботі, чи просто ви сідаєте без IDE, без налагоджувача, ніякої документації, Інтернету та вихідного коду? Звичайно, ні!

Є інструменти для вирішення проблем, ви просто їх не знаєте .... поки що . У статті вікіпедії є деякі посилання на методи вирішення проблем. Але найважливішим інструментом є науковий метод . Стаття Вікіпедії включає прагматичний підхід:

  1. Визначте питання
  2. Збирайте інформацію та ресурси (спостерігайте)
  3. Сформулюйте пояснювальну гіпотезу
  4. Перевірте гіпотезу, виконавши експеримент та збираючи дані відтворюваним чином
  5. Проаналізуйте дані
  6. Інтерпретувати дані та робити висновки, які служать відправною точкою для нової гіпотези
  7. Опублікуйте результати
  8. Перевірка (часто робиться іншими вченими)

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

Нарешті, інший основний інструмент для вирішення проблем - це розбити його простими кроками. Наприклад, перша проблема в прикладах проекту Ейлера :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

У нас є два факти, і тут проблема. Перший факт показує нам, як визначити кратне число три або п’ять нижче 10. 3 * 1,3 * 2,3 * 3,5 * 1 справедливі. 5 * 2 не тому, що дорівнює 10. Тоді, другий факт говорить нам, що ми додаємо їх разом, щоб отримати 23.

Тож у нас вже є метод пошуку значень, і ми можемо їх скласти разом, щоб отримати нашу суму. Звичайно, ми можемо подивитися на факти і застосувати простий зворотний порядок. 3, 5, 6 і 9 кратні 3 або 5. Тобто 3% 3, 5% 5, 6% 3, 9% 3 дають мод нуля. Отже, іншим підходом було б пройти через 999 до 1 та модулювати кожне число з 3 та 5. Зберіть список значень та додайте їх разом.

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


19

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

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

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

Особисто я отримую вирішення головоломки шляхом вирішення "таємничих геокешів" .


Але багато гарячих стартапів ТІЛЬКИ стрес навичок вирішення головоломок. Візьміть facebook. Якщо я не вмію розгадувати головоломки, я навіть не маю права подавати заявку на це!
Джон

6
У Facebook є головоломка робота як перша перевірка, щоб уникнути необхідності просіювати тисячі та тисячі резюме. Якщо ви дійсно хочете працювати у ФБ, то вам потрібно вміти вирішувати такі проблеми, але для цього є багато та багато хороших місць.
JesperE

фантастична відповідь. так само і мене полегшує ... =]
Хартлі Броді

9

Дозвольте лише застерегти, чим більше ви знаєте, тим більше ви усвідомлюєте, як мало ви знаєте.

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

Тепер перейдемо до вашого питання. Я б запропонував розпочати роботу над проблемами проекту eule r.

Мої причини цього прості, почніть з найпопулярнішого питання, як правило, це легше вирішити проблеми.

Коли ви стикаєтесь з проблемою, спробуйте її вирішити, працюйте над нею самостійно, спробуйте різні підходи. Те, як працює проектний еулер, дозволяє перевірити і перевірити свою відповідь.

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

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

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

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


4

Більшість завдань програмування не вимагає багато логіки. Але це можуть бути не ті роботи, які вам подобаються.

Як загальне керівництво, спробуйте вивчити алгоритми та структури. Я можу порадити посібник з дизайну Algorithm Design Skiena. Як тільки ви дізнаєтесь про них, ви почнете класифікувати проблеми. Це дуже схоже на проблему продавців подорожей, тут я можу використовувати дерево, тут я можу використовувати двійковий пошук ...

Проект Ейлер має велику варіацію головоломок. Багато з них легко виконати з базовими математичними знаннями. Інші вирішуються легше, коли ви знаєте кілька цих алгоритмів.


2

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

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

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


1

Фіртки всіх, знаючи свою слабкість - це фактична сила, отже, ви знаєте, що потрібно вивчити, щоб отримати кращу гру.

Моя порада: прочитайте багато коду, який вирішує логічні проблеми. У кожного свій стиль розгадування загадок, читання коду може натякати вам, як ви можете навчитися це робити. Плюс можливість розуміння коду, ймовірно, також вказує на математичну теорію, яка описує проблему, тож попутно ви дізнаєтесь і про основні проблеми.

Ура, Карло


1

Я відчуваю, що слід до цього додати.

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

У чомусь ми поділяємо ту саму слабкість (хоча це не так погано, як ви думаєте). Щоб практикувати свої навички вирішення проблем, я завжди працюю над певним проектом Euler або HackerRank. Якщо це легка проблема, я вибираю 7 мов програмування і намагаюся вирішити її у всіх. Для більш складних проблем я можу вибрати 3 мови, які сильно відрізняються один від одного, просто щоб тримати час, який я витрачаю на проблему, розумним. З усіх проблем, коли я знайшов рішення, я шукаю рішення, які придумали інші, і переконуюсь, що я їх розумію. Якщо ви не розумієте якогось рішення, ви завжди можете опублікувати повідомлення в StackOverflow або, мабуть, навіть тут, на Programmers Stack Exchange або щось інше, і я впевнений, що на сайті є хтось, хто може відповісти на ваше запитання (рідко його немає).

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

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

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