@khomaldi
разбираюсь потихоньку

Основы, алгоритмы, проектирование. Как начать?

Здравствуйте. Мои шаги в мире программирования начинались с чтения книг типа "Научу писать код". Потом я понял, что эти книги совсем не эффективны для меня. Так я перешёл к изучению языков сразу за станком. То есть.. пишу скрипт на php, например. Встаёт вопрос "как разбить строку по разделителю?" Иду в поисковики, нахожу explode, потом php.net, смотрю документацию по этой функции.

Потом до меня дошло, что программировать нужно с помощью языка, а не на языке. Сейчас логику скриптов мне приходится придумывать самому, либо подглядывать где-то на форумах. Слова "алгоритмы, деревья, паттерны проектирования, шаблоны и т.д." для меня далеки. Подскажите, с чем начинать осваивать эту базу, которая применяется (как я понял с habr и форумов, где подглядываю логику) повсеместно в проектах хорошего уровня.

Простите, если ваши глаза вытекли от вопросов подобного рода. (Думаю, они задаются стабильно раз в неделю, как и "Какой язык учить" или "С чего начать изучать программирование?")
  • Вопрос задан
  • 2197 просмотров
Решения вопроса 1
toxicmt
@toxicmt
CTO at hexlet.io
Отличный вопрос, обычно с такими вопросами приходят учиться к нам на проект).

С одной стороны вам правильно подсказывают, база это алгоритмы и структуры данных, но по ним не надо упарываться, так как очень легко по пути растерять всю мотивацию. На Хекслете мы ведем список книг по разным направлениям, которые мастхев для разработчиков https://ru.hexlet.io/pages/recommended-books Среди них есть такая книга "Грокаем алгоритмы". Она очень простая и идеально подходит для тех кто не в теме и хочет познакомиться с концепциями. Кроме алгоритмов нужно знать основные структуры данных и понимать где лучше их использовать.

Роберт Мартин привнес в разработку одно интересное понятие из восточных единоборств - Ката (кстати рекомендую его книгу идеальный программист из нашего списка). Ката это простые упражнения, регулярное повторение которых помогает довести до автоматизма базовые вещи. Подобных кат для разработчиков тьма тьмущая, например написать быструю сортировку, перевернуть список и так далее. Самому их придумывать не нужно, сейчас есть куча сервисов, которые позволяют тренировать базовые скиллы. Буквально на прошлой неделе мы сделали обзор таких платформ на Хабре https://habr.com/company/hexlet/blog/434786/

Но есть еще несколько суперважных областей. Невероятно сильно прокачивают языки с разными парадигмами. Если вы работаете на PHP, то изучение JS или Python сделают вас лучше, но не намного. Другое дело если вы попробуете изучить языки с совершенно другими подходами. Мой топ лист подобных языков: haskell, clojure (диалект лиспа), elixir, prolog. Знание их хотя бы на базовом уровне уже даст вам огромный буст. Приведу список только лишь некоторых тем: функции высшего порядка, каррирование, частичное применение, чистые функции, списки, алгебраические типы данных, ленивость, мультидиспетчеризация, функциональная композиция и многое другое. Главная фишка в том, что изучение всех этих идей поможет писать код на том же PHP лучше даже без их использования (парадокс блаба).

Если говорить в целом, то есть две основные книги, которые способны больше всего повлиять на то как вы строите дизайн своих программ:

* HTDP https://www.htdp.org/
* SICP (СИКП)

Вторая переведена на русский. Эта книга не про языки программирования, она про концепции, которые работают независимо ни от чего. Ее изучение (и решение) гарантированно изменит то как вы мыслите (но ее надо проходить с умом, у нас есть гайд который посвящен ее прохождению https://guides.hexlet.io/. Плюс мы рассказываем об этом в вебинарах

Ну и общие вещи:

* Научитесь писать тесты и пишите их
* Учитесь отделять чистый код от кода с побочными эффектами
* Возьмите на вооружение https://github.com/tightenco/collect

p.s. У нас есть большое комьюнити в слаке slack-ru.hexlet.io где мы регулярно обсуждаем подобные вопросы. Присоединяйтесь)
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
Olek1
@Olek1
Enterprise
Главное понимать, что компьютер по сути очень тупой, но скотина выносливая, порой даже очень. Он может выполнять только то, что вы ему скажете, его недостаток в том, что он не умеет видеть мелочи, и "додумывать" их за вас сам. Ему надо "объяснять" всё как ребёнку.
Ответ написан
@Zanak
Похоже у вас в голове все смешалось.
1. Что такое разработка программ? Думаю, ни чему не противоречит сказать, что это написание кода на избранном языке, направленное на решение задачи, поставленной перед разработчиком. Решение может использовать сколько угодно много алгоритмов, либо не использовать вовсе, кроме тех, что реализованы в стандартной библиотеке языка.
2. Алгоритмы? Алгоритм - это формальное описание решения проблемы, как правило, не привязанное ни к одному из языков программирования, и не являющееся самостоятельной программой. Например: поиск всех подстрок в тексте - это алгоритм, который может быть использован в программе, но сам программой не является.
3. Структуры данных? Структуры данных - это способ организации информации в памяти и/или на диске, для более оптимального ее использования, или применения к ней алгоритмов. Например: графы и алгоритмы на них.
4. Шаблоны проектирования? Шаблоны проектирования, в оригинале design patterns - это решения типовых ситуаций при проектировании приложений. Речь идет о достаточно крупных приложениях, хотя сложно выделить четкий критерий, когда приложение можно назвать крупным. В мире web приложений самый известный шаблон - это MVC, хотя вебом его применимость не исчерпывается.

С чего начать:
1. Знакомство с языком. Без знания языка все остальное бессмысленно. Начать лучше с известных языков, по которым много литературы и большое комюнити: C/C++, C#, Java, php7, python, JavaScript. Не гонитесь сразу за несколькими языками. Не гонитесь за новомодными языками, вроде go, rust или elixir, они решают проблемы, которые вам еще только предстоит понять. Не гонитесь за экзотическими языками, вроде lisp, haskel, erlang или ocaml, у них есть свои почитатели, но это не самый простой способ начать программировать. Выберете, что вам ближе, компилируемые, или скриптовые, со строгой типизацией или динамической, и вперед.
2. Потренируйтесь в реализации отдельных алгоритмов. Это позволит вам закрепить знание выбранного языка, расширит ваш кругозор и научит выделять эти алгоритмы в процессе решения более сложных задач. Здесь фундаментальный труд Дональда Кнута "Искуство программирования" вам в помощь, хотя одной этой книгой тема конечно не исчерпывается.
3. Теперь можно браться за задачи посложнее. Один нюанс, если вы пойдете в веб разработку: с нуля системы сейчас ни кто не пишет, все используют фреймворки. Возможно, было бы не плохо, покопаться в устройстве парочки таких продуктов, а в идеале, попробовать построить свой велосипед, чтобы лучше понять что, и как устроено и работает.
Ответ написан
solotony
@solotony
code for food, caviar preferably
Слова "алгоритмы, деревья, паттерны проектирования, шаблоны и т.д." для меня далеки. Подскажите, с чем начинать осваивать эту базу, которая применяется (как я понял с habr и форумов, где подглядываю логику) повсеместно в проектах хорошего уровня.


учи теорию. читай кнута. а иначе привыкнешь говнокодить и будешь всю жизнь говнокодить.
Ответ написан
@jazzus
Начинать полюбому с практики. Это в разы лучше по всем параметрам:
Занимаясь практикой, ты неизбежно учишь теорию
Ты не только узнаешь, что такое массив, но и ЗАЧЕМ он существует в этом мире
Практика формирует из тебя человека дела, а не любителя волейбола
С практикой ты достигаешь целей, которые можно пощупать или увидеть, а значит мотивация сама по себе (без психотренингов) будет несоизмеримо сильнее чем «завтра я выучу еще 2 новых термина и буду знать 2 новых термина, офигеть».
Стресс и дофамин от ожидания антилопы у водопоя сделают твое зрение острым, пальцы, бьющие по клаве - точными и быстрыми и память твоя будет запоминать все: как ты тратишь 3 часа на поиск решения проблемы и, как ты ее решаешь.
В теории память работает только в результате самоизнасилования т.к. мозг твой не дурак и не будет тратить драгоценные ресурсы на качественное запоминание того, что и так есть в книге. И да - данное понимание неизбежно приходит с развитием логики, которая также развивается исключительно в процессе практики программирования. Поэтому:
Основы, алгоритмы, проектирование. Как начать?

Легко. Бери Laravel и php неизбежно подтянется в процессе)
Ответ написан
asyryssa
@asyryssa
IT-журналист. PR/SMM-менеджер. Фотограф
Первое с чего Вам нужно начинать - это с работы в команде в конкретной, сильной IT-компании Junior-м. Не идите в крупные компании типа Kaspersky Labs, Epam, iTransition. Лучше в маленький стартап, например в Австралии.
Второе - это техника. Только Apple, два монитора для проекта и четкое понимание чем Вы хотите заниматься - UX/UI, PHP, Javascript(наиболее популярный язык программирования). Из среды разработки - Xcode, intellij idea, ресурсоемкий, atom с поддержкой node.js, git.
Третье - Вам важно понимать сам проект и его значимость. Яркий пример прекрасной игры - TLA с сюжетом на листе бумаги в клетку.

И последнее - посещайте митапы(Onliner - Минск, DevOps Engineer - Москва), Вам важно понимать к какому языку программирования Вас тянет. Вы освоите любой язык программирования тогда, когда сможете освоить его логику и методологию.
Ответ написан
tema_sun
@tema_sun
Вы все правильно делаете, хотя возможно это не самый быстрый путь.
Решение реально сущетвующих задач дает в тыщу раз больше опыта, чем чтение голой теории. Да, это будет говнокод первые пару сотен раз, но это процесс обучение и так у всех.
Главное, не переставайте задавать вопросы и пробуйте решить задачу лучшими способами. Возвращайтесь к своему когду через полгода-год и смотрите на него с ужасом, и думайте что за идиот это написал.

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

Значительно ускорить процесс можно ментором, но он захочет много денег.
Ответ написан
iCoderXXI
@iCoderXXI
React.JS/FrontEnd developer
Всё, что умеет компьютер - это взять данные "там-то", что-то вычислить, положить или отправить "туда-то"... Весь сложный функционал крутится вокруг этих простых функций. Поэтому без структур данных и алгоритмов никуда.

У каждой структуры данных своё предназначение. Есть относительно простые структуры, например плоский массив. Есть сложные навороченные структуры, типа JSON на мегабайты, но они всегда комбинируются из простых.

Есть простые алгоритмы, например просуммировать все числа из массива, или вычислить среднее. Есть сложные алгоритмы, которые так же комбинируются из простых.

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

В целом это и есть процесс программирования. И тут нужно 99% упорной практики и щепотка теории.

Если достаточно упорно и долго практиковать, то со временем, многие решения уйдут на подкорку и будут получаться автоматически, не задумываясь, тогда можно переключаться на более сложные абстракции, типа паттернов и пр.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы