Всем привет!

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

Из-за достаточно немаленького объема, сегодня уделю внимание двум подходам к изучению: снизу вверх и сверху вниз по уровням абстракции. Распишу плюсы и минусы каждого из них, рассмотрю, когда лучше придерживаться одного подхода, а когда выбрать другой.

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

Почему это важно?

Холивары на тему того, что учить нужно, а что нет не утихают с начала хайпа программирования(и раньше было такое, но в меньших масштабах).

Зачастую, это происходит из-за категоричности людей по отношению к другим областям/технологиям/языкам программирования. "То, что учу я должно быть лучшим". Эти приступы юношеского максимализма по отношению к тех. стеку были у каждого первого и в этом нет ничего страшного. Если в итоге удалось от этих приступов избавиться. В противном случае, происходит превращение в твердолобого, с закостенелым мышлением человека, который не готов принимать объективно лучшие новые решения.
Конкретно эта тема не будет затронута напрямую, но будет прослеживаться во всём тексте.

О подходах

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

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

Подход "снизу вверх"

Подход, которого придерживаются во всех университетах(ну, почти).

Его суть заключается в том, чтобы начинать обучение программированию с базовых тем, в которые входят: математика, информатика(здесь я имею в виду доскональное изучение работы компьютера), различные теории(компиляторов/баз данных и т.д.) и предметы, которые присущи специальности вроде криптоанализа для курса по криптографии.

Особенности

Подход предполагает изучение вдоль и поперёк фундамента, на котором строятся современные системы. Изучение идёт от "Вот так вот устроены логические гейты, давайте разберём первые устройства на примере системы из реле..." до верхнего уровня с привычными нам языками программирования, базами данных и т.д.

Плюсы

  • Латание дыр. Человек, прошедший этот путь, почти всегда будет лучше разбираться в темах вроде архитектуры компьютера, работы языков программирования/баз данных и т.д. Будет иметь лучший математический фундамент. Пригодится или нет - это другой вопрос, который обсудим позже.
    Благодаря цельному пониманию работы систем, улучшается понимание новых тем.

  • Способность к мышлению на большем уровне абстракций.
    Точнее, это происходит раньше, чем у людей, идущих сверху вниз, т.к. При переходе на "уровень выше" подсознательно начинаешь думать о том, как это устроено ниже.

Минусы

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

  • Результат будет виден далеко не сразу. "Hello, World" на ассемблере - это прикольно. Но иногда масштабность проектов увеличивается не так быстро как хотелось бы. А видеть результаты важно. В первую очередь для собственной мотивации. Поэтому, часто идти вперёд придётся за счёт одного энтузиазма.

  • Эти навыки могут никогда не пригодиться.
    Да, они важны. Но не везде. Есть инженеры, которые упираются в потолок, связанный с фундаментальными темами. Но в каком-нибудь среднестатичтическом вебе это вряд-ли произойдёт.

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

Когда стоит выбрать?

Когда у вас есть много свободного времени и вы готовы сидеть без работы долгое время. Не стоит надеятся на то, что каким-то чудесным образом вас примут на работу в первые полгода. Надо быть готовым к худшему. Это подходит людям, в чьё образование родители готовы вложить немалые деньги(т.к. чаще всего подход практикуется в универе. Но если и без него, то это всё равно немалые затраты) или у них самих есть приличная денежная подушка.

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

Подход "Сверху вниз"

Название не совсем отображает суть; Правильнее было бы назвать "Сверху, вширь и возможно вглубь", но об этом ниже.

Самый популярный в настоящее время подход.

Предполагает, что обучение начинается с чего-то высокоуровнего вроде ЯПа и какого-нибудь фреймворка(python + Django). Затем, после освоения этих "основ" есть два варианта развития: вширь и вглубь. Т.е. изучение других технологий на поверхностном уровне либо акцентирование на небольшом стеке - кому как нравится.

Плюсы

  • Количество создаваемого чего-либо на строчку кода зашкаливает. Это означает, что видимый результат и масштабные(относительно предыдущего подхода) проекты не заставят себя долго ждать.

  • Низкий порог входа.
    Да, конкуренция высокая. Но это всё равно проще(не легче!), чем начинать с низов. Т.е. и работу найти получится быстрее.

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

Минусы

  • До определённого момента, человек понимает примерно ничего.
    Он использует фреймворк, но не знает как он работает. Он пишет, но что он пишет представляет слабо. Связано это с тем, что почти всегда, теория в этом подходе уходит на второй план отдавая своё место практике. Можно было объеденить со следующим пунктом, но лучше наверное разделять.

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

    И часто ему этого хватает. Т.е. он просто выполняет свою работу и всё. Это неплохо. Главное, чтобы пользу приносил. Но в таком случае, как специалисту, дальше продвинуться будет сложно.

Когда стоит выбрать?

Когда требуется максимально быстро "войти в айти"(простите пожалуйста).

Но! Всё-таки питать надежд рода "я вот с завода уволюсь/с универа уйду, пару месяцев поучусь и найду работу" не стоит. Устроиться на стажировку за еду - уже достижение. А чтобы деньги платили это ох как круто! :-)

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

Так что выбрать?

В выборе подхода как и почти во всём, нет чёрного и белого. Где-то лучше одно, где-то - другое. Мой первый опыт был с Python + Django, но относительно быстро я осознал важность фундаментальной информатики и начал её изучение. Спустя некоторое время мне потребовалось быстро найти работу, поэтому я обратил внимание на тот же джанго, но в итоге устроился на стажировку гошником, не забывая о развитии в топиках CS с перспективой в дальнейшем сменить область.

Это я к тому, что надо уметь принимать новое и подстраиваться под ситуацию.
Главное - учиться, а чему и как - придёт само.

Надеюсь, кому-нибудь статья была полезна.

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

Комментарии (5)


  1. Spokik
    03.02.2022 13:11
    +1

    Я бы переименовал подход сверху в низ в иследовательский. А снизу в верх - принудительный/родиельский.

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

    Я считаю, что второй подход (принудительный) как раз быстрее быстрее, в смысле изучения. В иследовательском ты тратишь силы не только на само изучение

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

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

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


    1. Spargwy Автор
      03.02.2022 16:25

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

      Я считаю, что второй подход (принудительный) как раз быстрее быстрее, в смысле изучения. В иследовательском ты тратишь силы не только на само изучение

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

      Это справедливо только для студентов и то не всех(но т.к. этот подход преобладает в универах, справедливо в большинстве случаев).
      А вообще все самоучки сталкиваются с +- одними и теми же проблемами.

      А то, что оно называетс фундаментом... Кто-то будет изучать дизайн, цвета, иправление людьми. для них это не фундамент

      Согласен. Поэтому и упомянул, что эти знания могут не пригодится. Стоило упомянуть направления вроде того же фронта.


      1. Spokik
        04.02.2022 15:46

        Мне кажется хорошим примером снизу вверх - школа.


        1. Spargwy Автор
          04.02.2022 16:31

          Школьная информатика ещё более непредсказуема в плане обучения чем универы.
          У нас колоссальная разница была даже в рамках двух групп(на которые делили класс, без каких-либо критериев) информатики.


          1. Spokik
            04.02.2022 17:45
            +1

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

            И суть получается не в программе, а именно в подходе, когда ты изучаешь не то, чего тебе интересно, а то, что решит кто-то. в вашем случае преподаватель информатики ( в остальных дисциплинах в школе вроде как есть +- устоявшаяся программа ) 

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