Как постичь искусство программирования?

14

Этот текст написан в Сообществе, в нем сохранены авторский стиль и орфография

Аватар автора

Святозар Островский

Страница автора

Здравствуйте, коллеги!

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

Я сейчас работаю в IT. Начинал с помощника сисадмина, ныне работаю в хелпдеске. Желаю перейти в разработку на Java (backend). Сейчас обучаюсь. Чувствую, что тяжело что-то представлять. Тяжело в голове строить какие-то абстракции, модели и т.п. У меня плохо развито абстрактное мышление. Логическое мышление тоже не самого высокого уровня.

Что я начал делать: начал пытаться решать задачи на логику. Но такие задачи требуют смекалки и способность догадаться (что логично) до какого-то решения, оперируя данными. Но я не знаю с чего начать и чем закончить. В принципе, с любыми задачами у меня так. Вижу текст, прочитал. А с чего начать и чем закончить — вот и приехали… Тупик…

Вопрос 1. Как развить абстрактно-логическое мышление? Ряд моих близких говорят, что такое мышление — врождённая особенность и если его нет, то это не развить. Я в корне не согласен и моё мнение противоположное.

Вопрос 2. Как изучить методику программирования? Это ключевой момент. Многие твердят, что нужно учить не язык программирование, а учиться программировать. Но как? Язык — это инструмент, хорошо. Как же овладеть самим искусством программирования? Что нужно делать? Какие книги почитать? Я пробовал начать с «Грокаем алгоритмы» и с книги Никлауса Вирта по алгоритмам, но мало что понял. Читаю и, как говорится, «Смотрю в книгу, а вижу фигу»…

В прошлом окончил ВУЗ по IT-специальности, потом пошёл в армию, потом жизнь потаскала по различным местам, затем я попал в хелпдеск. Сейчас хочу всё-таки заняться программированием. Ещё в студенческие годы баловался в Delphi и вёрстке, это было чертовски интересно.

Что касается точных наук. Физику и геометрию не понимал вообще. Правда, они мне были не интересны и я не прикладывал сил для их изучения. С алгеброй пободаться мог. До 10 класса, когда пришёл новый учитель, интереса к этой науке не было. Потом в ВУЗе был классный преподаватель. И благодаря этим классным педагогам я научился решать квадратные и биквадратные уравнения, различные неравенства, разобрался с тригонометрией, векторами, производной и первообразной, немного понял логарифмы и интегралы. Но, несмотря на это, в основном, я действовал какими-то шаблонными наработками и методами. Стоило изменить задание — и я в растерянности. Не было базы, не было наработано нужного мышления. Тем не менее, если я в алгебре мог что-то сделать, и даже хорошо, то в геометрии я был как беспомощный котёнок, я её не понимал совершенно. Во многом из-за того, что сам на неё забил из-за отсутствия интереса. И при всём при этом, несмотря на мои успехи в алгебре в этих темах, я никогда не умел решать задачи. Не знал с чего начать и чем закончить. Для программирования это буквально трагедия.

Также многие говоря, что чтобы научиться программировать, нужно программировать, как бы не было банально. Но как? Что писать, когда ты не знаешь что именно писать и как писать? Повторять за другими? Ну, перепечатал код в IDE — и в голове ничего не отложилось.

Благодарю заранее за критику, ответы и советы.

РедакцияЧто бы вы посоветовали читателю?
  • AndrewПопробуйте найти университетские курсы по основам программирования. Есть даже бесплатные варианты. Как от российских вузов, так и от зарубежных (если английским хорошо владеете). В целом идея такая: 1. Для начала надо понимать математические абстракции, которые стоят за структурами данных и алгоритмами. Если с алгеброй в школе всё было хорошо, то будет легче. 2. Займитесь изучением алгоритмов и структур данных. Вирт мне больше всего нравится на эту тему. Но даже по нему изучать сильно легче под руководством преподавателя. Поэтому в его отсутствие для начала посмотрите курсы, а потом уже самостоятельно смотрите книгу. Когда осилите Вирта, переходите к Кнуту. 3. Уже в конце изучать особенности Java/JVM (кстати, а почему не Kotlin?), инструменты, актуальные для бекенда и т.д.1
  • felidaeНу вот примерно для этого и нужна математика программисту: чтобы развить абстрактное мышление, построить матмодель и реализовать её уже буковками в ИДЕ.3
  • Михаил ЕдошинА игры-головоломки, где по сути надо составить программу, вам нравятся? Это, например, почти все игры компании Zachtronics, например SpaceChem или Opus Magnum. Там порог входа минимален, а суть задачи очень близка к работе программиста. Если вам интересно добиваться, например, уменьшения числа шагов или ускорения работы, то можно сказать, что программирование — это ваше. Может ведь быть и нет. Программирование по своей сути математическая дисциплина, но не в смысле решения уравнений, а в смысле выстраивания рассуждения. Условная задача, например, выглядит так: есть описание контура замкнутой фигуры в виде последовательности точек: (1, 2) (7, 12). В нашем распоряжении простое устройство, которое может прочитать число, записать число, и произвести какие-то несложные действия: сложить, вычесть, сравнить. Нужно определить, в какую сторону идёт контур, по часовой стрелке или против. Эта задача элементарно решается для нас, но нужно втиснуть её в возможности устройства. Тут нужно, во-первых, определить как в принципе решать эту задачу, но это, допустим, мы можем где-то прочитать или же само решение может быть не очень сложным. Но далее нам нужно выстроить последовательность шагов так, чтобы вот это простое устройство пришло по ней к правильному ответу, и это как раз и есть работа программиста. Эта последовательность строится именно как логическое рассуждение, где каждый шаг — это умозаключение: вот что дано, вот что мы делаем, вот в чём мы уверены после этого шага, вот какой шаг мы делаем следующим. Попробуйте начать с самых простых алгоритмов, вроде нахождения наибольшего общего делителя, и выстроить их именно как последовательность шагов-умозаключений. Два варианта — когда есть только операция вычитания и когда есть получение остатка от деления; там будут чуть разные последовательности. Если всё равно сложно, возьмите ещё проще: перебор элементов массива, вставка и удаление элементов списка и так далее. (Не используйте готовые нотации, придумайте свою. Подсказка: откажитесь от циклов.) Есть книга где программирование рассматривается примерно в этом ключе: Udi Manber, «Introduction to algorithms. A creative approach» (1989). Название непримечательное, а книга стоящая. Русского перевода, боюсь, нет.0
  • NonameНачните с freecodecamp0
  • МихаилНе читал другие комменты, но уверен, что написали там то же самое. Лично мой взгляд с колокольни мидла, который тоже хочет переехать на яву: 1) найдите самоучители хороших авторов и каналы на ютубе с обучающими видео. Признак хорошего автора/канала: материал разжевывается от и до, описание каждого оператора касается и его подкапотной работы. Там вам хорошо объяснят различия тех или иных вещей и вы примерно начнёте понимать что и почему следует использовать в конкретных реализациях. 2) абстракции - это уже проектирование. Могу посоветовать чистый код и чистую архитектуру Роберта Мартина. На первое время пойдет. 3) все придет со временем. Где-то читал, что для становления нормальным разрабом и построения нужных нейронных связей в мозгу необходимо работать разрабом до 5 лет. Сам на 2 год работы начал уже не решать задачи в лоб (с логическим мышлением у меня все замечательно и рефакторинг мое самое любимое дело), а задумываться о семантике, разделении ответственности и других прелестей проектирования ПО. 4) научитесь не бояться новой информации и постоянно самообучаться. Тоже дело практики, но это очень важные вещи. Лично мне привычка самообучения далась очень тяжко, ибо отсутствие мотивации. Вот в компании с кем-то обучаюсь охотно, а самостоятельно дело не идёт. Но чем бо́льше областей ИТ вы сможете изучить хотя бы в рамках ознакомления, тем лучше. 5) терпение и труд. За полгода вы просто привыкните к характеру работ на должности в конкретной компании. За год вы уже начнёте примерно понимать без объяснений со стороны что от вас хотят. За 2 года вы начнёте понимать как сделать лучше и отсечь лишнее. Если все это время ещё самообучаться, то вполне за 3 года можно стать мидлом+. В становление сеньором-помидором за 3 года не верю, ибо не встречал такого ни разу. Видел людей с отличными знаниями, но не с навыками, которые необходимы сеньору0
  • МихаилМихаил, алгоритмирование - отдельная сфера в разработке. Сам тоже когда-то думал, что без них никуда. На деле за 3 года работы мне алгоритмы по ребовались 1,5 раза, а их знание мне в данных ситуациях сэкономили бы часов 4 самостоятельного изобретения велосипеда. Конечно, все зависит от предметной области, ибо в тех же самых навигаторах самостоятельно допереть до оптимального алгоритма построения пути ещё нужно допереть, но редко кто этим занимается. И движки для игр мало кто пишет. Для большинства работ алгоритмы не нужны, ибо реализация широко используемых алгоритмов много где в фреймворках реализована. А если такой реализации нет, то в инете можно что-то найти уже сделанное, либо найти сам алгоритм и по его схеме понять как следует его реализовать. Учить алгоритмы - скорее бесполезное дело, учитывая количество другого материала, которые следует знать0
  • Михаилfelidae, математика программисту нужна в очень малом количестве задач. Лично мне она за всю практику пригодилась пару раз, ибо просто такая предметная область. И не обязательно нужна математика, чтобы развить абстрактное мышление. Оптимальнее заниматься именно абстракциями, а не математикой. Матмодели уже нужны на этапе проектирования, а не джуну-, коим является автор. Вы ещё посоветуйте ему механизмы оптимизации и рефакторинга изучить с нулевыми знаниями разработки, вот потеха будет. Человеку базовое понимание нужно, ему дальше элементарных абстракций делать нечего пока что0
  • МихаилМихаил, и хочу дополнить. Обязательно при обучении реализуйте каждый пример. Практика очень нужна, ибо если вы прочитали и не сделали код - вы информацию не усвоите. А ещё очень хорошо будет, если вы реализовали код, а потом для каждой его строки написали комментарий что там происходит. Вам же будет проще этот код потом анализировать0
  • Михаил ЕдошинМихаил, предметы материального мира конструкторы ведь тоже стараются проектировать так, чтобы максимально использовать стандартные компоненты. Но тут мы прекрасно понимаем, что это не всегда возможно. Иногда нужны специальные детали, предназначенные только для этого предмета. Программирование в этом смысле ничем принципиально не отличается: иногда готовый компонент не годится. Это не так заметно, потому что небольшая избыточность готового компонента компенсируется огромной скоростью работы. Но ресурс этот не бесконечен и сейчас всё чаще можно слышать жалобы на то, что программы работают как-то не очень. А кроме эффективности есть ещё и правильность. Соединение готовых деталей тоже требует какого-то плана, это такой же конструкторский этап и идёт по тем же принципам. Хорошо если соединение тривиально и ошибиться вроде негде, но это ведь не всегда.0
  • ЯрославГрокаем алгоритмы - это книга для даунов, если мало, что понял, то стоит задуматься. Почему бы тебе не нанять ментора? Ты будешь писать код, ментор тебя будет опускать (но ты будешь совершенствоваться). А если и после этого не научишься программировать, то опять же стоит задуматься0