Как наработать навык декомпозиции задач?

Дано: Хочу перейти внутри компании в разработку (Java, backend).

Проблема: отсутствуют навыки декомпозиции и решения задач, не развито алгоритмическое и логическое мышление. Когда вижу задачу, то не знаю, с чего начать решение задачи и чем закончить. Не умею решать задачи. Хочу это исправить.

Вопрос: можете посоветовать какую-нибудь литературу по алгоритмизации и структурам данным, а также по основам программирования (программировать я пока не умею, а баловство в институте за навык не считаю, ибо там были безделушки)? Как я отметил выше, не умею решать и декомпозировать задачи. Вот смотрю на задачу, а с чего начать и чем закончить - не знаю. Раньше просто списывал (в школе, в институте) и ничему так не научился. Хочу это исправить и искоренить напрочь этот недуг.
  • Вопрос задан
  • 2011 просмотров
Пригласить эксперта
Ответы на вопрос 6
mayton2019
@mayton2019
Bigdata Engineer
Программирование - это как плаванье. Ты сколько книжек не читай - все равно программистом не станешь.
Ты просто должен сесть и начать программировать. Прыгнуть в воду и плыть.

По поводу декомпозиции. Обычно такой вопрос возникает когда кода много или когда задача большая.
Эта декомпозиция идет параллельно со знанием таких частей ООП как Single-Responsibility, и структурных
шаблонов проектирования
. Начни это применять и декомпозиция сама собой пойдет.

Чаще заказывай code-review своего кода и слушай советы старших коллег. Даже если обидно и стыдно.
Слушай. Записывай и потом применяй.

По поводу Алгоритмов и Структур данных. Почитай Никлауса Вирта. Он как раз такую книгу и написал.
Ответ написан
Комментировать
GavriKos
@GavriKos
Мне кажется, этот навык приобретается как раз в ходе изучения программирования. Когда начинаешь реально с основ и мелочей. Но - надо понимать, что не факт что у вас это в принципе получится. Я например рисовать не умею, и какую литературу я бы не читал - просто это не мое и все.

А что сейчас за должность, раз не разработчик?
Ответ написан
yesbro
@yesbro
Думаю, помогаю думать
С декомпозицией все просто. Для начала берешь любую задачу из жизни и думаешь какие шаги нужно сделать что бы ее решить. Когда это станет просто, то переходишь к программированию. Лучше всего взять какой-то готовый небольшой проект и сам себе ставишь задачи, сначала очень простые(!!!), потом сложнее(добавить метод, добавить что-то еще, изменить логику и прочее). Не начинаешь программировать пока по шагам не напишешь себе что надо делать. В процессе разработки смотришь насколько твой план расходится с реальностью. Запоминаешь, учитываешь в следующий раз.

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

Для развития логического мышления изучи формальную логику и так же решай задачи.
Ответ написан
Комментировать
Дополню также, что бывает проблема в постановке и формулировке задачи. Для начала нужно понять "требования" - что должно получиться в итоге. Здорово, когда эти требования и хорошо описанную задачу дают, но бывает приходится собирать всё самостоятельно, как мазайку.
Я бы начал с понятной формулировки самой задачи, требований к ней и понимания для чего она делается глобально. И оттуда уже начинал прописывать/прорисовывать схему конкретной работы, которую нужно выполнить, чтобы ничего не упустить.

Насмотренность тоже хорошо помогает. Можно почитать / посмотреть решение задач в вашей сфере другими специалистами на ютуб/сайтах/в книжках, и со временем "отложатся" какие-то проверенные методы похода и решения задач.
Ответ написан
Комментировать
@Dementor
программист, архитектор, аналитик
Вопрос глобально не имеет однозначного ответа. Сколько людей - столько и будет вариантов, причем все верные.

Хочу отметить, что абстрактная декомпозиция никому не нужна (даже вредна, поскольку тратит бесценное время). Нужно уметь видеть в постановке задач доступные для тебя "кирпичики" и работать только с ними, пока они функционируют с удовлетворительным качеством.

Для примера пусть тебе нужно дёрнуть REST-функция с некоторого интернет сервера. Если у тебя есть библиотека, которая позволяет тебе сделать все на уровне "указал сервер", "указал метод", "указал параметры" и "получил результат", то зачем декомпозировать дальше на уровень реализации протокола HTTP, на работу с сокетами, ломать голову над маршрутизацией пакетов данных или вообще уходить на уровень управления сетевой картой с помощью прерываний?

Вторая мысль, на которой хочу остановится - не нужно делать чужую работу. Часто задачи на разработку дают уже максимально декомпозированные (есть целый класс мемов противопоставления навороченного собеседования и реальной примитивной работы в ИТ). Обычно программисты не общаются с заказчиком - там целая прослойка менеджеров для ограничения "аппетитов" и аналитиков для составления максимально подробной задачи. Но и "подробная задача" не сразу попадает на выполнение - часто сначала она оказывается на столе у системного архитектора, который уточняет доступный стек и разрешенные фреймворки. Потом задача попадает к техлиду, который дополняет ее своими практическими советами и ссылками на релевантные проекты.

Не обязательно, что программиста "кормят с ложечки", но если вы не программист 1С, то один-на-один с задачей вас никогда не оставят!!!

И последняя мысль - нужно меньше думать, а больше делать! Если сесть читать Кнута и Вирта, то голова будет забита бесполезной чепухой, которой можно хвастаться перед друзьями, но которую невозможно использовать ни при создании репозиториев в Spring Data, ни при описании активити в твоем мобильном приложении - внезапно окажется, что нужно было читать не беллетристику, а курить мануалы по Spring и Android.

Только практика, практика и еще раз практика!!! Далее количество перейдет в качество и ты уже сам будешь проводить вебинары на тему развития навыков декомпозиции.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
отсутствуют навыки декомпозиции и решения задач, не развито алгоритмическое и логическое мышление.

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

Далее определите действия, что вы можете сделать с этими сущностями. Под эти действия заводите сервисы.

Понимание того, как лучше будет приходить с опытом, причем не только вашим личным, но и командным.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы