Итак, вот моя проблема:
Я работаю в большой компании, кое-как, как устроился на работу (честно говоря, потому что интервью было легко). Дело не в том, что я не знаю свои вещи, я довольно хорошо разбираюсь в Java, это библиотеки и т.д.
Но когда я пытаюсь решить какую-то логическую проблему, мне действительно трудно найти решение.
Например, conversion of decimal to roman
когда я увидел решение, я обнаружил, что это простая проблема. Но я не смог реализовать это после 1-2 часов попытки!
Я чувствую, что я тупой и не стоит быть инженером-программистом. Способности решать головоломки должны исходить от великого программиста. Но когда я пытаюсь решить некоторые головоломки, я не могу найти решение, и я просто гуглю его! .... и я ненавижу это!
Когда мне задают проблему (например, реализуют функцию xyz) на работе, я довольно быстро ее решаю и уважаю за это на работе, но я совсем не горжусь этим. Потому что, когда я пытаюсь решить любую математически или логически сложную задачу, я возуюсь. Я все еще чувствую, что мне нравится то, что я делаю (как инженер), но мне действительно грустно, что я не могу решить некоторые сложные логические проблемы, с которыми сталкиваются мои друзья.
Я чувствую себя деморализованным :(
TL; DR: Я понимаю вещи с практической точки зрения (реализуя функции в нашем продукте), но когда пытаюсь работать над проблемой, скажем, ProjectEuler, я плохо отстой! И мне нужно отточить свой мозг!
Итак, мои вопросы:
- Как мне это исправить? Должен ли я начать с решения (и принуждения себя) к решению проблем Эйлера? Даже если мне потребуются часы, чтобы решить некоторые основные проблемы ?
- Или я должен вернуться к основам и изучать основы математики?
- Я действительно не нахожу решение головоломки интересным. Но я хочу сделать это весело для себя! И я думаю, что если я пойму их лучше, мне это понравится!
PS: я никогда не получил образование в CS (мой студент был электоральным). Но это не повод быть отстойным разработчиком.
Спасибо!
Ответы:
Во-первых, это замечательно, что вы видите в этом слабость ваших навыков. Вы на самом деле знаете, где вам нужно улучшить, что значительно облегчает процесс и указывает, что вы лучше, чем вы думаете.
Я считаю, что ваша основная проблема, с которой я сталкивался много раз раньше, заключается в том, что у вас нет «набора инструментов для решения проблем». Когда вы сталкиваетесь с проблемой, что вы делаете? Как вы решаете это? Я медленно в математике, но потому что я знаю , как использовать маленькие инструменты математики вместе, я успешно справился исчисление.
Таким образом, помимо работы над решением проблем, вам необходимо посмотреть, какие инструменты и навыки вы привнесете в этот список. Если вы собираетесь работать над новой функцией на работе, вы просто сидите без IDE, без отладчика, без документации, без интернета и без исходного кода? Конечно, нет!
Есть инструменты для решения проблем, вы просто не знаете их .... пока . В статье в Википедии есть несколько ссылок на методы решения проблем. Но самый важный инструмент - это научный метод . Статья в Википедии включает в себя прагматичный подход:
Все проблемы могут быть решены таким образом! Многие люди не проходят через эти шаги, хотя. Это как разработчик, который отказывается тестировать свой код. Вообще. У него будут проблемы с обнаружением ошибок, даже существуют.
Наконец, другой основной инструмент для решения проблем - разбить его с помощью простых шагов. Например, первая проблема в примерах проекта Эйлера :
У нас есть два факта и проблема здесь. Факт первый показывает нам, как определить кратные три или пять ниже 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 как отличный пример использования небольших инструментов в мире программирования. Объединение их в цепочку позволяет вам решать очень сложные проблемы, и я не могу сосчитать, сколько раз эти концепции помогли мне.
источник
Многие программисты также являются естественными «решателями головоломок», но в программировании гораздо больше, чем это. Если бы все программисты были сосредоточены на решении интересных алгоритмических задач, у нас было бы множество загрузок программного обеспечения, которые могли бы решать классные проблемы, но ни один из них не был бы пригоден для использования или обслуживания.
Я обнаружил, что в моей работе относительно мало задач типа «решения головоломок». Большая часть проблем связана с изучением старого кода, изучением нового API, разработкой архитектуры какого-либо компонента таким образом, чтобы люди не поклялись над ним через три года. Все это сложно, но не так, как в логической головоломке. С другой стороны, у меня есть коллеги, которые проводят большую часть своего времени, думая об алгоритмах оптимизации компилятора, и которые очень хороши в этом.
Я думаю, что для программистов важно постоянно думать о том, «как мне стать лучше в том, что я делаю?», Но для того, чтобы быть хорошим программистом, не обязательно нужно, чтобы вы разбирались в решении головоломок.
Лично я получаю решение по решению головоломок, решая тайные тайники .
источник
Позвольте мне просто предупредить вас: чем больше вы знаете, тем больше понимаете, как мало вы знаете.
Только не разочаровывайтесь этим. Продолжайте учиться и пытаться работать в областях, которые, по вашему мнению, отсутствуют.
Теперь к вашему вопросу. Мое предложение состояло бы в том, чтобы начать работать над проблемами на проекте eule r.
Мои причины этого просты, начните с самого популярного вопроса, обычно это более простые проблемы, которые нужно решить.
Когда вы сталкиваетесь с проблемой, попробуйте решить ее, работайте над ней самостоятельно, попробуйте другие подходы. То, как работает проект euler, позволяет проверить и проверить свой ответ.
Если вы решите, что не можете решить эту проблему, начните исследовать проблему (не ища ответа). Не пытайтесь снова.
После того как вы решите проблему, в проекте euler появится раздел, в котором вам будут представлены лучшие ответы для каждой языковой реализации. Просмотрите их ответ на предпочитаемом вами языке, поймите их решение и мысли, которые в него вошли.
Теперь закройте ответ, который они дали, и повторите попытку самостоятельно, пока не решите его снова.
Если вы будете практиковать достаточно, логика и мышление для решения этих проблем станут для вас все легче и проще.
источник
Большинство заданий на программирование не требуют большой логики. Но это может быть не та работа, которая вам нравится.
Как общее руководство, попробуйте изучить алгоритмы и структуры. Я могу посоветовать Скиене руководство по разработке алгоритмов. Как только вы это знаете, вы начнете классифицировать проблемы. Это очень похоже на проблему путешествующих продавцов, здесь я могу использовать дерево, здесь я могу использовать бинарный поиск ...
Проект Эйлера имеет широкий спектр головоломок. Многие из них легко выполнимы с базовыми знаниями математики. Другие легче решить, если вы знаете несколько из этих алгоритмов.
источник
Я очень верю, что вы только начали свой путь в программировании, поэтому, во-первых, если вам понадобится какое-то время, чтобы понять и сделать все правильно, это, кажется, не проблема. Единственное отличие в том, что с каждой попыткой ты учишь что-то вроде WoW! ! последнее, что я сделал, вообще не имеет смысла, потому что мне нужно было десятичное, а не двойное
Если решение головоломки вас не интересует, тогда не занимайтесь поиском головы, есть другие логические проблемы, возникающие, когда вы знаете свою кодовую базу, вы можете поработать над ними и представить любые предлагаемые изменения своему наставнику или руководителю. , (не беспокойтесь, если вы совершите грубую ошибку, они помогут вам понять, почему ваша методология неверна, так что будьте внимательным наблюдателем и умелым слушателем)
Вам понадобится некоторое время, чтобы успокоиться, а затем, возможно, вы начнете стрелять по всем цилиндрам. Само собой разумеется, избегайте необходимости искать решение в Google или SO, приложите некоторые усилия с вашей стороны и запускайте браузер только тогда, когда вы сомневаетесь или абсолютно не знаете
источник
Во-первых, знание вашей слабости - это действительная сила, поэтому вы знаете, чему учиться, чтобы получить лучшую игру.
Мой совет, прочитайте много кода, который решает проблемы логики. У каждого свой стиль решения головоломок. Чтение кода может подсказать вам, как вы можете научиться делать это. Кроме того, способность понимать код, вероятно, также указывает на математическую теорию, которая описывает проблему, так что по ходу дела вы также узнаете и об основных проблемах.
Ура, Карло
источник
Я чувствую, что должен добавить к этому.
Как уже было сказано в выбранном ответе, знание вашей слабости является огромным преимуществом, и есть несколько основных инструментов для изучения методов решения проблем. Однако мне кажется, что в ответе не хватает лишь простого нахождения способов практиковать сложные проблемы - много. Будьте упорны в том, чтобы полностью решить каждую проблему, которую вы пытаетесь. Чтение кода, много кода - это хорошо, равно как и чтение книг на тему решения проблем, но написание кода почти более важно.
В некотором смысле мы разделяем одну и ту же слабость (хотя и не так плохо, как вы думаете). Чтобы практиковать свои навыки решения проблем, я всегда работаю над проектом Euler или HackerRank. Если это простая проблема, я выбираю 7 языков программирования и пытаюсь решить их на всех. Для более сложных задач я мог бы выбрать 3 языка, которые сильно отличаются друг от друга, просто чтобы разумно тратить время на решение этой проблемы. Для всех проблем, как только я придумаю решение, я ищу решения, которые придумали другие, и проверяю, понимаю ли я их. Если вы не понимаете какое-либо решение, вы всегда можете публиковать сообщения в StackOverflow или, возможно, даже здесь, в Programmers Stack Exchange или что-то в этом роде, и я уверен, что на сайте есть кто-то, кто мог бы ответить на ваш вопрос (это редко случается).
В основном, тем не менее, убедитесь, что вы практикуете, а не просто читаете, и много тренируетесь. Подобно спорту, ясное мышление требует времени и усилий.
Еще одна вещь, которую вы можете сделать, чтобы помочь вам думать о проблемах, - это написать набор тестов для проблем, которые вы сначала решаете. Вы не можете написать хороший тест для проблемы без предварительного полного понимания. Если вы делаете это для разных языков, это дает преимущество в том, что вы одновременно обучаете различным методам тестирования.
источник