Вначале немного моих рассуждений

Цель раздела - это попытка донести, что оценивать перспективы и возможности нужно трезво.

Обращение к тем, кто идет ради денег. Есть множество других способов их заработать. В IT есть потолок по зарплате, а достичь его не просто.

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

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

Если вы все же хотите войти в IT, не важно по каким причинам, то стоит осознать, что вам предстоит конкурировать:

  1. С ежегодным потоком выпускников ВУЗов. Любой студент из IT направления как минимум на голову выше человека, который решил войти в IT. Я считаю с этим глупо спорить, но ниже я попытаюсь объяснить почему.

  2. С такими же людьми, которые тоже решили сменить профессию.

Люди окончившие ВУЗ как минимум четыре года изучали компьютерные и смежные науки, программирование и множество дополнительных профильных предметов:

  1. Фундаментальные вещи в компьютерных науках. Архитектуру ЭВМ, ассемблирование/дизассемблирование, операционные системы, компьютерные сети, базы данных, теорию информации, алгоритмы, структуры данных и т.д. и т.п.

  2. Разные языки и парадигмы программирования, паттерны проектирования. Разные фреймворки, технологии.

  3. Высшую математику(как минимум теорвер, мат. статистику, дискретную математику). Эта штука реально прокачивает мозги.

  4. Системный анализ, проектирование и тестирование ПО.

  5. Другие дисциплины и курсы, которые они проходили дополнительно.

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

Также IT-компании и финтехи проводят хакатоны, CTF и разные мероприятия в ВУЗах, где студентов также берут себе на заметку, после приглашают на собеседования для дальнейшего трудоустройства.

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

У работодателя есть выбор:

  1. Взять выпускника ВУЗа, который четыре года трудился, чтобы получить диплом. Ему в среднем 22 года. Скорее всего нет семьи, финансовые запросы еще не выросли. Он еще не зарабатывал денег, у него нет психологического барьера пойти на менее оплачиваемую работу. Многие начинают с 30к-60к рублей. Я не видел, чтобы где-то платили больше начинающему спецу, а если и платят, то скорее всего и требования будут выше.

  2. Взять выпускника курса, которому за 6-12 месяцев непонятно что давали изучать. Навряд ли за такой маленький период вы обгоните выпускников ВУЗов.

Я думаю, что выбор очевиден.

Помимо выпускников ВУЗов. Вам предстоит пройти стресс курсов и конкурировать с такими же людьми как вы. Придется совмещать текущую работу и обучение. Если повезет, и вас куда-нибудь возьмут, то коллеги будут обучать вас еще несколько лет, передавая вам свой опыт и давая вам направления для развития. Это конечно, если повезет с первой командой, что очень важно в начале карьеры.

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

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

Небольшой roadmap для разработчика

Цель раздела - это показать, что учиться можно бесплатно, помочь понять что IT ваше или нет тоже.

Если вы все еще настроены войти в IT, то надо сперва подготовиться, я составил небольшой список того, что считаю необходимо знать каждому разработчику. Мое мнение такое: "Если вы решили войти в IT, то входите качественно". Помните, что этот roadmap — верхушка айсберга. Учиться придется всегда, самостоятельно.

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

  1. Первое, что нужно научиться делать — искать информацию. В интернете колоссальное количество данных, но информацией считаются исключительно полезные данные. Научитесь фильтровать данные, понимать как применить найденное. Следовательно, во время обучения поисковик — ваш лучший друг. Вопросы, которые появятся у вас — не уникальны, их уже задавали на разных форумах, соизвольте поискать и внимательно почитать. Чтобы получать ответы, нужно уметь задавать вопросы. Чем более развернуто задан вопрос, тем выше вероятность того, что вам на него ответят. Полезная ссылка How To Ask Questions The Smart Way. Уметь искать информацию, задавать правильные вопросы - это мета навыки, которые полезны более чем в одной сфере, прокачайте их.

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

  3. Стартовая точка будет курс This is CS50x. Его можно проходить бесплатно, есть автоматическая проверка практических и лабораторных работ. Лекции в открытом доступе, каждые полгода обновляются, материал всегда в актуальном состоянии. Эти лекции читаются первокурсникам в Гарварде. Будем считать этот курс порогом вхождения (но не в IT). Он поможет понять сможете ли вы дальше изучать все необходимое, чтобы войти в IT. Для начала рекомендую пройти только первые пять недель, где заканчивается работа с языком Си.

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

  4. Первым языком программирования будет Си. Язык не обременен синтаксическим сахаром, динамической типизацией, лямбда выражениями и т.п. Это всё лишь навредит человеку, который только начинает изучать программирование. Си также достаточно нейтрален по отношению к другим языкам программирования, с него легче перейти на любой другой язык, а вот в обратную сторону бывает проблематично. И то, что вы будете изучать Си в качестве первого языка, не означает, что теперь вы будете только программировать на Си. Сперва необходимо научиться мыслить алгоритмически и излагать свои мысли с помошью языка программирования. Поэтому я считаю Си идеальным языком программирования для начала. Важно осознать, что язык программирования — всего лишь инструмент. Рекомендую книгу Язык программирования C. Лекции и упражнения | Прата Стивен. Очень важно отвечать на вопросы для самопроверки и выполнять упражнения в конце главы. Одна из техник, которая мне нравится — перед прочтением главы попытаться ответить на вопросы и подумать над тем как вы бы выполняли упражнения. Это подготовит ваш мозг к поглощению информации, и когда вы будете читать книгу, то будете ловить флэшбеки из упражнений и вопросов, которые вы прочли до, что поспособствует более качественному усвоению материала. После этой книги вернитесь и закончите курс CS50.

  5. Теперь изучим объектно-ориентированное программирование. ООП применяется почти везде, оно не привязано к конкретному языку программирования, изучив один раз, вам не придется переучиваться для другого языка программирования. Изучать будем на примере языка С++. В процессе прочтения книги, вы научитесь писать код на С++, применяя объектно-ориентированное программирование. Рекомендую книгу Объектно-ориентированное программирование в С++ | Лафоре Роберт. Принцип прочтения книги такой же как и в Си.

  6. Умение программировать недостаточно, необходимо понимать, когда применять ту или иную структуру данных или алгоритм. Я изучал их по книге Структуры данных и алгоритмы в Java | Лафоре Роберт. Также рекомендуют Алгоритмы на Java | Джитер Кевин Уэйн, Седжвик Роберт. Язык Java очень похож по синтаксису на C++. Авторы книг уделяют одну главу для введения в язык Java для читателей, которые знакомы с С++. Также рекомендую смотреть вот эти лекции Базовые алгоритмы для школьников и "Продвинутые" алгоритмы для школьников. Большой курс по алгоритмам Data Structures and Algorithms Specialization, если захочется проникнуться по максимуму.

  7. Каждый, кто разрабатывает программное обеспечение должен понимать устройство компьютера. Для начального изучения рекомендую книгу Код: тайный язык информатики. Это наверное самое простое объяснение фундаментальных принципов работы ЭВМ. Рекомендую конспектировать книгу, зарисовывать схемы, возможно даже пересказывать и объяснять другому человеку. Для тех кто хочет более углубленно изучить данную тему рекомендую курсы Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) и продолжение Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course)

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

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

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

  9. Ни один коммерческий проект в наше время не может без системы контроля версий. Изучать можно по книге Pro Git. Тут достаточно прочесть 1, 2, 3 и 6 главы.

  10. К этому моменту вы освоили необходимый минимум, чтобы выбрать направление в IT. Самое простое и популярное разделение: front end, back end и мобильная разработка. Вы уже должны уметь самостоятельно найти материал для изучения в интернете.

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

  11. К прочтению рекомендую Совершенный код. Мастер-класс, Head First. Паттерны проектирования и Рефакторинг.Гуру. Но не сразу. Сделайте 2-3 проекта, и только потом потихоньку начинайте читать. Тут важно, чтобы был уже какой-то опыт, иначе вы не почувствуете пользу.

  12. Иногда можно почитать что-нибудь для релаксации, например Джоэл о программировании | Спольски Джоэл.

  13. Для тех, кто хочет погрузиться в изучение CS, есть вот такой ресурс Open Source Society University.

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

В список к сожалению не вошли такие вещи как:

  1. Работа с базами данных. Системы баз данных. Полный курс | Ульман Джеффри Д., Уидом Дженнифер. SQL Tutorial.

  2. Параллельное и конкурентное программирование.

  3. Работы с сетью.

  4. Разные фреймворки.

  5. Что-то еще.

Вам придется найти материал для изучения самостоятельно в процессе разработки своих PET проектов.

Непосредственно во время обучения у вас будут появляться вопросы, или ситуации, которые будут вводить вас в ступор. Так как вы обучаетесь самостоятельно, то у вас нет преподавателя или ментора, который помог бы вам. За ответами вы можете обращаться на разные тематические форумы, где люди помогут вам, если правильно задать вопрос, показать, что у вас имеется на руках и что не получается. Если поиск в интернете вам не помог, то можно спрашивать на [ENG] Stack Overflow, [RU] Киберфорум

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


  1. Redrik05
    03.01.2022 19:38
    -7

    лады)


  1. gecube
    03.01.2022 19:47
    +29

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


    1. shaykemelov Автор
      03.01.2022 20:18
      +23

      При изучении Си приходит гораздо больше понимания того как всё устроено, чем при Python. После Си очень легко изучать все остальные языки. Поработать с Си строками и указателями must have :)

      С++ здесь исключительно для изучения ООП. В нем можно познать проблемы множественного наследования, понять что такое виртуальная функция, деструкторы. Например в Java нет множественного наследования, все методы по умолчанию виртуальные, деструкторов нет

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


      1. gecube
        03.01.2022 20:38
        +24

        При изучении Си приходит гораздо больше понимания того как всё устроено, чем при Python.

        увы, но нет. Когда мы изучаем Си, мы изучаем особенности Си, а не особенности той платформы, на которой он работает. Просто если уж так рассуждать - надо ассемблер брать :-)

        С++ здесь исключительно для изучения ООП. В нем можно познать проблемы множественного наследования, понять что такое виртуальная функция, деструкторы. Например в Java нет множественного наследования, все методы по умолчанию виртуальные, деструкторов нет

        С++ - худший язык, на котором стоит изучать ООП.

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

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


        1. shaykemelov Автор
          03.01.2022 21:04
          +6

          увы, но нет. Когда мы изучаем Си, мы изучаем особенности Си, а не
          особенности той платформы, на которой он работает. Просто если уж так
          рассуждать - надо ассемблер брать :-)

          Си я выбрал в пользу отсутсвтия сахара в синтаксисе. Слишком много магии делает Python, плюс в нем динамическая типизация данных из-за чего может быть проблематично объяснить типы данных. В книге по Си идет объяснение того как данные лежат в памяти, сколько места они могут занимать(есть поверхностное определение памяти). Чтобы не было трудно это все переварить, в самое начало я вставил лекции CS50, где лектор объясняет это студентам, которые хотят въехать.

          С++ - худший язык, на котором стоит изучать ООП.

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

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

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


          1. gecube
            03.01.2022 21:17
            +2

            Он все таки ближе к железу.

            это ложный тезис. В частности, если речь идет про современный С. Я могу привести много аргументов. Например, тот же UB. Ты такой думаешь, что Си транслируется один-в-один эквивалентный ассемблерный код, а фиг там был. Размер типов C - это тоже песня. Оптимизирующий компилятор, который в результате может доказать, что черное это белое, а белое это черное... ох ты ж мать... Короче, если нас волнуют алгоритмы - Си нафиг. Тот же пайтон прекрасно вывозит. И прекрасно на нем тоже покажете в чем разница разных алгоритмов с разной сложностью (о большое). Дальше - кто захочет - тот пойдет в дебри.

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

            я думаю, что (повторюсь), что С++ может быть хорошим выбором, когда ты уже профессионал и такой смотришь - что бы еще изучить. Отчасти это подтверждается комментариями ниже. Как минимум я могу сказать одно - тот, кто думает, что знает С++, скорее всего его не знает вообще. @0xd34df00d подтвердит. К тому же, правильный ООП - это не то, что в С++, а скорее то, что в SmallTalk. Но вот почему-то этот язык вообще не изучают нигде (развожу руками)


            1. shaykemelov Автор
              03.01.2022 21:40
              +9

              это ложный тезис. В частности, если речь идет про современный С. Я могу
              привести много аргументов. Например, тот же UB. Ты такой думаешь, что Си
              транслируется один-в-один эквивалентный ассемблерный код, а фиг там
              был. Размер типов C - это тоже песня. Оптимизирующий компилятор, который
              в результате может доказать, что черное это белое, а белое это
              черное... ох ты ж мать... Короче, если нас волнуют алгоритмы - Си нафиг.
              Тот же пайтон прекрасно вывозит. И прекрасно на нем тоже покажете в чем
              разница разных алгоритмов с разной сложностью (о большое). Дальше - кто
              захочет - тот пойдет в дебри.

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

              я думаю, что (повторюсь), что С++ может быть хорошим выбором, когда ты
              уже профессионал и такой смотришь - что бы еще изучить. Отчасти это
              подтверждается комментариями ниже. Как минимум я могу сказать одно -
              тот, кто думает, что знает С++, скорее всего его не знает вообще. @0xd34df00d
              подтвердит. К тому же, правильный ООП - это не то, что в С++, а скорее
              то, что в SmallTalk. Но вот почему-то этот язык вообще не изучают нигде
              (развожу руками)

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


              1. 0xd34df00d
                03.01.2022 23:25
                +12

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

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


                C++ действительно плохой язык для изучения ООП, ибо слишком много отвлекающих вещей, связанных с самим языком. Другое дело, что изучать каноничный ООП не факт что надо. ООП — не самый оптимальный базис, по которому стоит раскладывать программы, поэтому лучше просто уметь писать код. Архитектура приложится с опытом.


                А вообще, знаете, как-то так иронично получилось, что вот конкретно сегодня меня попросили посмотреть один старый код с boost spirit'ом, который вдруг после лёгких изменений стал «глючить», поэтому я тут поною, если вы не против.


                Вот код
                std::string host_;
                int port_ = 0;
                std::string channel_;
                std::string nick_;
                bool isNick = false;
                bool serverPass = false;
                bool channelPass = false;
                
                using namespace boost::spirit::classic;
                
                range<> ascii (char (0x01), char (0x7F));
                rule<> special = lexeme_d [ch_p ('[') | ']' | '\\' | '`' |
                        '^' | '{' | '|' | '}' | '-'];
                rule<> hostmask = lexeme_d [+(ascii - ' ' - '\0' - ',' - '\r' - '\n')];
                rule<> let_dig_hyp = alnum_p | ch_p ('-');
                
                rule<> ldh_str;
                ldh_str = *(let_dig_hyp >> !ldh_str);
                
                rule<> label = alpha_p >> !(!ldh_str >> alnum_p);
                rule<> subdomain = label >> +(label >> !ch_p ('.'));
                rule<> host = subdomain  [assign_a (host_)];
                rule<> servername = host;
                rule<> user = (ascii - ' ' - '\0' - '\r' - '\n') >>
                        *(ascii - ' ' - '\0' - '\r' - '\n');
                rule<> nick = alpha_p >> *(alnum_p | special);
                rule<> userinfo = user >> ch_p ('@') >> servername;
                rule<> nickinfo = nick >> ch_p ('!')
                        >> user >> ch_p ('@')
                        >> hostmask;
                
                rule<> nicktypes = (nick | nickinfo | userinfo)[assign_a (nick_)];
                
                rule<> nicktrgt = nicktypes >> ch_p (',') >> str_p ("isnick")[assign_a (isNick, true)];
                
                rule<> channelstr = lexeme_d [!(ch_p ('#') | ch_p ('&') | ch_p ('+')) >>
                        +(ascii - ' ' - '\0' - ',' - '\r' - '\n')][assign_a (channel_)];
                
                rule<> keystr = lexeme_d [channelstr >> ch_p (',') >> str_p ("needkey")[assign_a (channelPass, true)]];

                Почему-то после небольших изменений в совершенно несвязанном куске кода этот код перестал распознавать ключ "isnick" в строке, которую он парсит.


                Видите ошибку? Как, не видите? Серьёзно? А, ну это просто вы — тот самымй некачественный программист, которому противопоказано писать на плюсах. И я некачественный программист, потому что я этот код 10 лет назад ревьювил.


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


                или конкретнее

                assign_a объявлена как


                    template<
                        typename T,
                        typename ValueT
                    >
                    inline ref_const_ref_actor<T,ValueT,assign_action> assign_a(
                        T& ref_,
                        ValueT const& value_
                    )
                    {
                        return ref_const_ref_actor<T,ValueT,assign_action>(ref_,value_);
                    }

                где


                    template<
                        typename T,
                        typename ValueT,
                        typename ActionT
                    >
                    class ref_const_ref_actor : public ActionT
                    {
                    private:
                        T& ref;
                        ValueT const& value_ref;
                    public:
                        ref_const_ref_actor(
                            T& ref_,
                            ValueT const& value_ref_
                            )
                        :
                            ref(ref_),
                            value_ref(value_ref_)
                        {}
                ...

                Соответственно, получается висячая ссылка, пусть и на (никуда не девающийся, но неважно) литерал true. Что интересно, ни valgrind, ни asan, ни ubsan этого не видят.


                Как я это нашёл? Заметил, что не срабатывает проверка на if (isNick == someOtherBool) чуть ниже по коду, поэтому сработала чуйка, и я распечатал чуть ниже по коду *(uint8_t*)&isNick — а там мусор вместо единички. Минус два часа моей жизни, и минус несколько дней жизни тех, кто ко мне обратился.


                Как починить? Добавить где-нибудь в начало


                const bool theTrue = true;

                и заменить все assign_a(..., true) на assign_a(..., theTrue);, чтобы ссылка перестала быть висячей.


                Но на этом не всё. Этот код надо немного расширить на пару других случаев с другими константами других типов. Объявлять const MyEnum theEnum1 = MyEnum::Enum1; и с пяток других, например, не вариант, поэтому хочется это как-то инкапсулировать. Тут можно C++20, поэтому мы просто пишем обёртку


                template<auto Val>
                auto Assign(auto& ref)
                {
                    return boost::spirit::classic::assign_a(ref, Val);
                }

                и заменяем assign_a(someVar, theTrue) на Assign<true>(someVar).


                Константная ссылка на non-type-аргумент шаблона ведь не будет висячей, верно?
                Нет. Этот код тоже ломается, причём ненадёжно — иногда работает, иногда нет. Мне откровенно лень сегодня ковырять стандарт, чтобы вспомнить, как себя ведут ссылки на non-type template argument parameters, поэтому я просто беру и обкостыливаю


                template<auto Val>
                auto Assign(auto& ref)
                {
                    static constexpr auto val = Val;
                    return boost::spirit::classic::assign_a(ref, val);
                }

                Очень хороший язык.


                1. shaykemelov Автор
                  03.01.2022 23:53
                  +1

                  Спасибо, было интересно читать ваш комментарий.

                  Я посчитал, что будет правильно дать Си, потом С++ и Java(в алгоритмах). Чтобы сложилась некая картина эволюции. В Си есть есть указатели. В С++ указатели, ссылки и шаблоны, в Java свои ссылки и дженерики.

                  В книге по Си есть зачатки ООП в виде указателей на функции и структуры. В С++ ООП уже в синтаксисе языка. И наверное было бы неправилно сразу дать Java т.к. остались бы пробелы, которые можно было бы понять в С++ (виртуальные функции, множественное наследование, деструкторы, ручное освобождение памяти)

                  Книга по С++ расчитана на новичков. Они не столкнутся со всем ужасом из-за которого С++ называют монстром. Но внесет некую пользу в общих образовательных целях


                  1. gecube
                    04.01.2022 00:02
                    +4

                    В книге по Си есть зачатки ООП в виде указателей на функции и структуры.

                    WHAT? Это просто указатели )))

                    В одном соглашусь, что ООП подход можно и в т.н. процедурных язвах использовать. Я хотел про это написать, но застремался, что придут фанаты крестов и наставят минусов.

                    В С++ ООП уже в синтаксисе языка

                    только один из вариантов, иначе бы Qtшникам не пришлось бы строить свое надмножество над С++.


                    1. shaykemelov Автор
                      04.01.2022 00:09
                      +1

                      WHAT? В одном соглашусь, что ООП подход можно и в т.н. процедурных язвах
                      использовать. Я хотел про это написать, но застремался, что придут
                      фанаты крестов и наставят минусов.

                      Да, тут где-то на хабре статья была про ООП на Си. Есть также книга Экстремальный Си, там вроде как показывают как добиться ООП.

                      Я не заставляю людей сидеть над С++ вечно. Это одна книга с лекционным материалом и упражнениями по ООП. Упражнения больше заточены под ООП, а не под особенности С++, про которые читатель даже не узнает т.к. цель книги не про них


                      1. gecube
                        04.01.2022 00:18

                        Еще раз С++ - это не ООП здорового человека, а что-то не то.

                        Посмотрите еще раз - отцом-основателем ООП является Алан Кей. Он же создатель SmallTalk и он постулировал следующие принципы:

                        1. Всё является объектом.

                        2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.

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

                        4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

                        5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

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

                        Как минимум уже в первом пункте С++ проваливается с треском куда-то в тартар. Я уж не говорю о том, что в понятии С++ ООП - это классы с функциями. А ООП здорого человека - общение между объектами при помощи сообщений (п.2). Ну, и т.д. Поэтому С++ самый неудачный модельный язык для изучения ООП.


                      1. gecube
                        04.01.2022 00:25

                        ну, и почему-то ни разу не упомянули про https://habr.com/ru/post/325478/ А это как минимум, на минуточку, не про особенности синтаксиса конкретного языка, а скорее про общие принципы построения объектной модели...


                      1. shaykemelov Автор
                        04.01.2022 08:59
                        +1

                        Я старался выбрать то, что уже давно как-то устоялось. Чтобы было уже много ресурсов для изучения. Си, С++, Java подходят идеально. Я считаю, что С++ отлично закрывает пробел между Си и Java в обучении. Никакой другой язык на его месте в этом списке я не хотел бы видеть.

                        Про SmalTalk я мало что знаю, ничего по нему посоветовать не могу, и наверное это было бы неправильно с моей стороны.


                      1. mayorovp
                        04.01.2022 12:28
                        +2

                        Под ООП давно уже понимаются те самые "классы с функциями". Обмен сообщениями был "поглощён" моделью акторов.


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


                      1. 0xd34df00d
                        04.01.2022 00:21
                        +1

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


                      1. mvv-rus
                        04.01.2022 04:51
                        +1

                        Не на любом. На FORTRAN IV, к примеру — нельзя: там нет переменных, значением которых является функция.


                      1. 0xd34df00d
                        04.01.2022 06:05

                        Но для дефункционализации его выразительных возможностей хватит?


                      1. mvv-rus
                        04.01.2022 06:41
                        +4

                        Ну, функцию передать в качестве параметра в функцию применения можно. Но что делать дальше чтобы получить ООП — без понятия.


                      1. 0xd34df00d
                        04.01.2022 18:26
                        +1

                        А дальше делаете то же, что и на С, просто вместо указателей на функции у вас их идентификаторы.


                      1. mvv-rus
                        04.01.2022 19:25

                        Ну, допустим, ФПшную программу мы таким образом на язык для настоящих программистов переложили, а дальше?
                        Вот лично я умением чисто формально преобразовывать ООП-программу в ФПшную не владею (однако допускаю ограниченность своих знаний теории и не против эту ограниченость несколько уменьшить).
                        Напоминаю, что для ООП(того, которому можно научиться по C++) нам нужно получить инкапсуляцию, наследование и полиморфизм, и это — в языке, в котором нет не только переменных типа «функция» (которые могли бы помочь сделать полиморфизм), но и аналога struct из C-подобных языков. Ну, допустим, как сделать инкапсуляцию (ограниченную, области видимости private/protected сделать все равно не получится, в это компилятор должен уметь) было известно ещё во времена настоящих программистов — массив+EQUIVALENCE: «Как все настоящие
                        программисты знают, единственной полезной структурой данных является массив. Строки, списки, структуры и наборы — это все разновидности массивов и их можно рассматривать как массивы без усложнения вашего языка приграммирования.» (из статьи по ссылке). Правда, формальные параметры в EQUIVALENCE совать нельзя, но что-нибудь, наверное с этим сделать можно.
                        А вот как сделать наследование — тоже примерно понятно: берем массив большего размера, и прописываем все EQUIVALENCE ручками. А как все-таки реализовать полиморфизм — я так до конца не понял.
                        PS А вообще-то, наверное, это — тема статьи для хаба «Неномальное программирование», а писать ее в комментариях — так себе идея IMHO; так что можно бы это обсуждение и завершить без засчитывания слива.
                        PPS Те, кто предыдущий камент Дедфуда заминусовал — поясните за минусы.


                      1. tyomitch
                        04.01.2022 19:32

                        Есть такой поразительный язык PHP, в нём нет указателей на функции, нет аналога struct, но есть ассоциативные массивы и есть возможность вызвать функцию, имея строку с её именем. И вот из этого всего они соорудили ООП с Java-подобным синтаксисом.


                      1. gecube
                        04.01.2022 20:00

                        ограниченную, области видимости private/protected сделать все равно не получится, в это компилятор должен уметь) 

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

                        Напомню, что в пайтоне есть конвенция о наименовании приветных членов с двойного подчеркивания, но де-факто они доступны всем

                        А как все-таки реализовать полиморфизм — я так до конца не понял.

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


                      1. 0xd34df00d
                        04.01.2022 20:15
                        +2

                        Вы просто говорите, что vtable — это массив с идентификаторами функций. Тогда то, что на плюсах выглядит как


                        struct Base
                        {
                          Base(...) { ... }
                          virtual void ~Base() { ... }
                        
                          virtual void doFoo() { ... }
                          virtual void doBar() { ... }
                        };
                        
                        struct Derived : Base
                        {
                          Derived(...) : Base(...) { ... }
                          void ~Derived() override { ... }
                        
                          void doFoo() override { ... }
                          virtual void doBaz() overrride { ... }
                        };

                        у вас будет выглядеть как (пардон, фортрана не знаю, пишу на псевдоси):


                        IntArray MkBase(...)
                        {
                          IntArray methods;
                          methods[0] = UID_Base_dtor;
                          methods[1] = UID_Base_doFoo;
                          methods[2] = UID_Base_doBar;
                        
                          // ... тут обычное содержимое конструктора Base
                        
                          return methods;
                        }
                        
                        IntArray MkDerived(...)
                        {
                          IntArray methods = MkBase(...);
                          methods[0] = UID_Derived_dtor;
                          methods[1] = UID_Derived_doFoo;
                          // methods[2] не трогаем
                          methods[3] = UID_Derived_doBaz;
                        
                          // ... тут обычное содержимое конструктора Derived
                        
                          return methods;
                        }

                        Дальше код, который хочет вызвать какой-то виртуальный метод, просто передаёт соответствующий идентификатор в глобальную apply-функцию, который он берёт из массива methods по статически известному индексу (так как индексы — это по факту имена, а они статически известны):


                        void call(Base *base)
                        {
                          base->doFoo();
                        }

                        превращается в


                        void call(IntArray array)
                        {
                          apply(array[1]);
                        }

                        Вот вам и сабтайпинг, и полиморфизм.


                        А инкапсуляция — она в головах в первую очередь. Вроде бы питон менее ООПистым оттого, что там private через подчёркивание сделан, не становится. Или джавы с дотнетами из-за рефлексии.


                      1. mvv-rus
                        04.01.2022 20:48

                        methods[0] = UID_Derived_dtor;

                        Не получится. Имя функции можно только в качестве фактического параметра передать, в переменную его сохранить нельзя.

                        PS Но я тут подумал: в FORTRAN IV был такой замечательный оператор — assigned GOTO, для него можно в переменную сохранить (оператором ASSIGN) метку оператора, а потом выполнить переход по этой метке. Вполне можно эмулировать вызов виртуальной функции через этот оператор (а адрес возврата сохранять в другой переменной и возвращаться тоже по assigned GOTO).
                        Так что, наверное, на FORTRAN G или H для IBM/370 (ЕС ЭВМ Ряд 2 в странах СЭВ) настоящие программисты могли бы писать и похожие ООП программы.
                        Короче, я, похоже, был не прав. «Да здравствует Фортран !»(с) (из все той же статьи)


                      1. 0xd34df00d
                        04.01.2022 20:52
                        +1

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

                        Это не имя функции. Это какая-то глобальная уникальная константа.


                        Ну а про assigned goto я ничего не знаю, чтобы что-то разумное сказать.


                      1. Fulgur
                        04.01.2022 15:36

                        Если очень хочется, то с расширениями уже можно работать с функциями-переменными (в данном случае достаточно уметь считать адрес функции с помощью LOC, что было доступно на P400 в 64V mode).
                        Мануал, по которому писалось: https://sysovl.info/pages/blobs/prime/devel/MAN1674_FortranIV_Jul76.pdf

                        Кодец
                              external get_func
                              double precision res
                              common /MEM/ X(1)
                              integer*2 X
                              integer func, get_func, locx
                              locx = loc(x)
                              func = get_func(0)
                              call eval(x((func-locx+1)/2), 3D0, 6D0, res)
                              write(*,*) res
                              func = get_func(1)
                              call eval(x((func-locx+1)/2), 3D0, 6D0, res)
                              write(*,*) res
                              end
                        
                              function get_func(f)
                                external add, mul
                                integer f, get_func
                                if(f.eq.1) then
                                  get_func = loc(add)
                                else
                                  get_func = loc(mul)
                                end if
                              end
                        
                              subroutine eval(func, x, y, res)
                                double precision func
                                external func
                                double precision x, y, res
                                res = func(x, y)
                              end
                        
                              function add(x, y)
                                double precision x, y, add
                                add = x + y
                              end
                        
                              function mul(x, y)
                                double precision x, y, mul
                                mul = x * y
                              end


                      1. mvv-rus
                        04.01.2022 19:29

                        Ну, с внешними функциями кончено, можно. И самому такую функцию написать можно, как говорилось в статье по ссылке из предыдущщего комментария, «Если вы не можете выполнить эти работы на Фортране, выполни-
                        те их на ассемблере»
                        А вот средствами самого языка — таки задача, решения которой лчино я не знаю.


                      1. oldbie
                        04.01.2022 23:19
                        +1

                        Ну тема всё равно не раскрыта -- какой именно язык подразумевает каждый из комментаторов в этой ветке когда отвергают ООП C++-edition? Промелькнул только весьма своеобразный SmallTalk. Но, имхо, если новичок как-то вкатывается в IT нестандартным путём, то изучать стоит в первую очередь практический значимые технологии/инструменты. Получив основы и имея представления о кухне уже можно заводить хобби Haskell/SmallTalk/Scala..., но не раньше.


                      1. 0xd34df00d
                        05.01.2022 00:46
                        +1

                        Лично я подразумеваю, что ООП несколько переоценено.


                      1. gecube
                        05.01.2022 01:07
                        +1

                         Но, имхо, если новичок как-то вкатывается в IT нестандартным путём, то изучать стоит в первую очередь практический значимые технологии/инструменты

                        C++ не является практически значимой технологией. Можно возразить - а как же Яндекс? Или кто там еще любит кресты. А вот так. Посмотрите любой индекс популярности языков. Там будут JS, Python, Ruby... И самое главное - об них не нужно так ломать мозг. Своих причуд хватает, но народ пишет. Для промышленного кода - скорее всего инвестиция в Java или C# с точки зрения обучения будет полезнее. С Java интересно - с него можно и на Scala, и на Котлин прыгнуть. И опять же - оба языка, на мой взгляд, более актуальны, чем C++....

                        С тезисом коллеги ниже

                        Лично я подразумеваю, что ООП несколько переоценено.

                        также соглашусь.

                        Касательно С++ - мое мнение такого - если очень хочется, если хочется постоянно вникать в тонкости компиляторов и новых стандартов, если хочется фигачить на темплейтах, писать головодробительный код и показывать мастерство покруче, чем Александреску и Страуступ - да, пожалуйста. Никто не держит :-) Да и есть неиллюзорный шанс в конце-концов получить высокооплачиваемую работу. Но факт в том, что это путь не для большинства. И очень хорошо было бы, если человек понимал, куда этот путь ведет. А рассказать есть кому - например, @0xd34df00d


                      1. oldbie
                        06.01.2022 01:42

                        >C++ не является практически значимой технологией.

                        > если новичок как-то вкатывается в IT нестандартным путём, то изучать стоит в первую очередь практический значимые технологии/инструменты

                        Я тут не C++ имел в виду, а SmallTalk, и то что его изучение ради ООП сомнительно.


                1. mk2
                  04.01.2022 00:45
                  +2

                  Константная ссылка на non-type-аргумент шаблона ведь не будет висячей, верно?

                  В C++20 — да, идентификатор non-type аргумента обязан обозначать статический объект типа const T. В C++17 было const T для классов и prvalue для не-классов.


                  И интуитивно я наоборот не рассчитывал бы, что под каждый non-type параметр шаблона при каждой инстанциации компилятор выделит статическую переменную.


                  1. 0xd34df00d
                    05.01.2022 01:43
                    +1

                    И интуитивно я наоборот не рассчитывал бы

                    Я последнее время слишком много пишу на языках, где работает принцип «скомпилировалось — значит, скорее всего, заработает правильно», поэтому интуитивно ожидаю, что NDR'ов в коде будет поменьше (и ошибок от компилятора — побольше). Программа с ссылкой на сущность, которая не существует в рантайме (и поэтому нельзя взять её адрес), вполне может быть ill-formed, но нет никаких оснований делать это NDR'ом, если про сущность это стопроцентно известно в точке взятия её адреса.


                    1. mk2
                      05.01.2022 01:50
                      +1

                      Происходит temporary materialization, и адрес взять можно. Другое дело, что сохранять его нельзя, а библиотека это делает.
                      Так что косяк больше в том, что язык позволяет сохранить ссылку — что полезно, но даёт ещё одну возможность выстрелить себе в ногу.


                1. Jecky
                  04.01.2022 04:32

                  No pain - no gain. При учебе очень полезно для понимания, что code never lies.


                  1. AnthonyMikh
                    04.01.2022 08:00

                    И чем, скажите на милость, будет полезно изучающему программирование набивать шишки на проблемах, которые являются исключительно заморочками самого C++ и больше ничего?


                    1. Jecky
                      04.01.2022 12:27
                      -1

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


                  1. gecube
                    04.01.2022 09:37
                    -2

                    code never lies.

                    ага, в частности, при вариативности поведения кода в зависимости от компилятора и его версии (!)...


                    1. Jecky
                      04.01.2022 12:25
                      +4

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


                      1. WASD1
                        04.01.2022 23:38
                        +1

                         Для понимания, что нет никакой магии и машина делает только то, что написано и ничего более, никогда.

                        А мы сюда ошибочное поведение компьютера относим? А недетерминированное (например сбои non-ECC памяти или редкие неотлаженные гонки на кристалле в сложных температурных условиях)?

                        Если учесть всё - то у вас получается какой-то трюизм.
                        А если проводить разумную границу - то далеко не факт, что C++ с его тысячестраничным стандартом и UB располагается с "разумной для изучения новичком" стороны.


                      1. Jecky
                        05.01.2022 00:00

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


                      1. WASD1
                        05.01.2022 00:27
                        +2

                        Подавляющее большинство разовых сбоев редки и приводят к BSOD, что не является предметом этой статьи. 

                        Так в этом и есть весь вопрос.

                        Вы можете объяснить почему грузить новичка специфичными и мало где ещё нужными аппаратными сбоями не нужно, а грузить новичка специфичными и мало где за пределами С++ нужными особенностями языка и поведения компиляторов - это прям хорошо?

                        Как по мне и то и то лежит за пределами "полезных при обучении новичка" навыков.


                      1. Jecky
                        05.01.2022 00:58

                        Можно и не грузить, но сразу научить, что всегда есть ответ на вопрос "Why?" из следующеего комментария. Ну и разобрать пару случаев, аж до операционных усилителей.


                      1. WASD1
                        05.01.2022 01:17
                        +1

                        Да знать, что "магии нет" - это разумеется полезно (с другой стороны "цена багфикса" может оказаться и заградительной - это тоже разумно проговорить), здесь вопросов нет.

                        У меня вопрос только к имлицитному утверждению, что "проблемы стандарта С++ не баг, а фича, позволяющая вырастить очередное поколение программистов более закалённым к будущим сложностям".
                        Мне кажется, что если выкинуть отсюда С++, то то же самое время можно потратить с куда большей пользой.


                      1. gecube
                        05.01.2022 01:20
                        -1

                        проблемы стандарта С++ не баг, а фича, позволяющая вырастить очередное поколение программистов более закалённым к будущим сложностям".

                        именно так. А потом выходит следующая версия стандарта С++ и новая версия компилятора и свои знания выкидываешь в унитаз, потому что их нужно слишком сильно доуточнять )))

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

                        ++ ++ ++ ++


                      1. AnthonyMikh
                        05.01.2022 00:15

                        машина делает только то, что написано и ничего более, никогда

                        Ну-ну.


                      1. gecube
                        05.01.2022 00:29

                        Так это опять закидоны сишного и крестового оптимизаторов...


                      1. DerRotBaron
                        05.01.2022 02:53
                        +1

                        Так там ей и написано, "разыменуй NULL" "делай что угодно".
                        Вот только в понимании плюсов "делай что угодно" т.е. UB может записываться кучей подозрительно безобидных путей, образно, "адин плюс два" или "0дин плюс два" (с нулем вместо О).


                        Это ужасно, но это данность, пока мы не похороним Си и не выкинем легаси (вместе с половиной комитета) из плюсов


                1. mvv-rus
                  04.01.2022 04:55
                  +1

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

                  Ну, я ООП учил как раз по книжке Страуструпа (древней, переводной).
                  Но там, насколько я помню, про template ещё ничего не было.


              1. mayorovp
                03.01.2022 23:28

                Вот только от постоянного удержания в уме "как коварный компилятор может сломать мой код оптимизациями и как ему в этом помешать" мозг быстро устаёт. И чем современнее компилятор — тем больше надо тратить на него усилий. А ведь ещё должны остаться силы на, собственно, изучение программирования!


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


                1. gecube
                  03.01.2022 23:32
                  -3

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

                  а вот вопрос - надо ли? Уверен, что большинство разработчиков прекрасно может обойтись без знания Си... И есть такое мнение, что новым языком для системного программирования становятся Rust, а в качестве замены Си приходит Golang


                  1. mayorovp
                    03.01.2022 23:36

                    Ну, лично я изучаю, хотя бы на уровне синтаксиса, все языки которые "на слуху". Хотя бы затем чтобы можно было прочитать чужой комментарий на Хабре.


                    А про Rust я с вами согласен.


                  1. Neikist
                    04.01.2022 13:29
                    +1

                    Части людей точно надо. Меня помню одно время бесило что я не понимал как подкапотная магия работает. Это вызывало фрустрацию и разочарование что я даже очень приблизительно не могу понять как оно работает целиком. Потом очень полегчало после того как немного понял C/Asm и Петцольда почитал. Мне не нужно было разобраться в этом досконально и на уровне достаточном для полноценной работы на этих уровнях, достаточно оказалось очень примерного понимания.


                    1. gecube
                      04.01.2022 19:17
                      -2

                      так в расте и голанге есть куча подкапотной магии, но они не заставляют БОРОТЬСЯ с ИНСТРУМЕНТОМ.... И вся эта подкапотная магия описана...


          1. telpos
            03.01.2022 23:36

            динамическая типизация данных из-за чего может быть проблематично объяснить типы данных

            динамическая, НО строгая


            1. WASD1
              04.01.2022 23:40

              динамическая, НО строгая

              Но утиная ))


        1. saboteur_kiev
          04.01.2022 05:30
          +5

          увы, но нет. Когда мы изучаем Си, мы изучаем особенности Си, а не особенности той платформы, на которой он работает. Просто если уж так рассуждать - надо ассемблер брать :-)

          На уровне джуниора никаких особенностей Си не учат. Учат просто работу языка


      1. beezy92
        04.01.2022 10:09

        С++ здесь исключительно для изучения ООП

        «Я придумал термин «объектно-ориентированный», и могу сказать, что я не имел в виду С++». Алан Кэй, конференция OOPSLA, 1997.

        «Я сожалею о том, что давным-давно придумал термин «объекты» для этого явления, так как его использование приводит к тому, что многие люди уделяют основное значение идее, которая не так важна, как основная. Основная идея — это обмен сообщениями». Алан Кэй

        Потому да, я также считаю, что изучать С++ для Объектно-ориентированного программирования - вредно.


      1. Inoriol
        05.01.2022 15:12

        Хотя в школе я любил программирование и участвовал в разных олимпиадах, универ с его Си и Ассемблером напрочь отбили желание иметь с кодингом что либо общее. Только спустя пять лет, когда стал медленно перекатываться с сисадмина в ДевОпсы снова затронул программирование, но теперь уже на Golang'e. Господи, насколько это приятнее, как будто в школу вернулся с темы тёплыми воспоминаниями.

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


    1. Aquahawk
      03.01.2022 20:19
      -3

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


    1. tyomitch
      03.01.2022 22:09
      +10

      Программисты учат Си, как филологи латынь — не для того, чтобы применять, а для того, чтобы понимать.


      1. gecube
        03.01.2022 22:12
        -8

        Программисты учат Си, как филологи латынь — не для того, чтобы применять, а для того, чтобы понимать.

        разве что в какой-то параллельной вселенной. Аналогия, кстати, не очень удачная.


  1. BogdanPetrov
    03.01.2022 20:44
    +3

    С некоторыми моментами в статье не согласен и в целом хотелось бы отметить, что во-первых IT это не только разработка, во-вторых некоторые вещи из предложенного roadmap выглядят лишними для входа.

    Свой первый домашний проект (по сути пара десятков строк на питоне, который я тогда только начал изучать) я сделал не зная ничего ни про гит, ни про SQL и базы данных. Алгоритмы тоже не пригодились, так как по сути нужно было просто собрать данные с сайта и отрисовать их на карте. Для сбора данных оказалось достаточно иметь знание HTML и представление о GET-запросах. Для отрисовки карты воспользовался онлайн-сервисом, куда было достаточно загрузить готовую таблицу с координатами. В итоге получил свой первый РЕЗУЛЬТАТ. Это было совсем не легко, но так как тема была мне интересна, то я не сдавался и с помощью гугла и stackoverflow довел дело до конца.

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


    1. shaykemelov Автор
      03.01.2022 21:23
      +3

      во-первых IT это не только разработка

      С этим я не спорю, поэтому в названии раздела есть упоминание, что это roadmap для разработчиков

      Да, я предложил долгий и трудный путь. По времени он должен занять не много больше, чем какой-то разработчик_язык_программирования_курс. Много реальных результатов можно уже получить проходя курс CS50. Там очень интересные лабораторные и практические работы. Например: работа с изображениями, где нужно было применять алгоритмы фильтрации; или задание для работы с аудио дорожкой, где было необходимо с помощью кода изменить громкость. Также в курсе идет знакомство с Python + Flask, SQL, JS/HTML/CSS

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


  1. DmitryOlkhovoi
    03.01.2022 20:45
    +1

    В свое время у меня пришло прозрение ООП читая книжку по Java, полное руководство (вроде 6th издание). Там все очень хорошо описано для новичка.
    До этого пытался С++, чуть от злости не порвал :)) Возможно Java пошла легче так как была позже.


    1. shaykemelov Автор
      03.01.2022 21:25
      +4

      Бывает так, что после безуспешной попытки, идет успешная. Ваш отрицательный опыт c С++ мог помочь при изучении ООП на Java


  1. RarogCmex
    03.01.2022 20:58
    +9

    Это вредные советы?

    Спрашиваю без иронии.


    1. shaykemelov Автор
      03.01.2022 21:51
      +2

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

      Буду рад услышать ваше мнение


      1. baxxter
        04.01.2022 11:29
        -5

        Отлично, а Вы собственно кто, чтобы так авторитетно заявлять свое видение и какие результаты были с таким подходом ко вкату в ИТ?


        1. shaykemelov Автор
          04.01.2022 13:46
          +4

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

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

          В моем окружении есть люди, которые хотели попробовать себя в IT. Некоторые во время прохождения курса CS50 поняли: понравится им это или нет. Тем кому понравилось пошли дальше, кстати не только в back/front/mobile, но и в data science.


      1. RarogCmex
        05.01.2022 21:03

        Хорошо, по возможности напишу, но ничего не обещаю. Последнее время занят -- строю учебный кластер kubernetes и продвигаю не менее учебный для меня стартап betspoiler.

        Главное замечание -- расстановка приоритетов: изучение языков низкого уровня в начале карьеры даст такой удар по самооценке, что человек бросит айти. Проверено на личном примере, но я учил первым языком программирования хаскель.


  1. DarthVictor
    03.01.2022 21:12

    У работодателя есть выбор:

    1. Взять выпускника ВУЗа, который четыре года трудился, чтобы получить диплом. Ему в среднем 22 года. Скорее всего нет семьи, финансовые запросы еще не выросли. Он еще не зарабатывал денег, у него нет психологического барьера пойти на менее оплачиваемую работу. Многие начинают с 30к-60к рублей. Я не видел, чтобы где-то платили больше начинающему спецу, а если и платят, то скорее всего и требования будут выше.

    2. Взять выпускника курса, которому за 6-12 месяцев непонятно что давали изучать. Навряд ли за такой маленький период вы обгоните выпускников ВУЗов.

    Я думаю, что выбор очевиден.

    Да, но не совсем. У студента есть важный недостаток — хороших на всех не хватит, а плохие, те что без стажировок или / и после крудоформозаборостроительного не факт, что лучше.

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

    Я не уверен, насчет связей в средненьких вузах. Насчёт хороших — уверен (и проверял), и было бы наверное круто перед вхождением в IT закончить хотя бы пару курсов Физтеха / МГУ / ВШЭ. Стенфорд или Калтех было бы ещё круто закончить. Шансов примерно столько же. У нас до середины третьего курса никто не работал, и до поступления ещё год-два на подготовку тратили. Это уже не подушка безопасности нужна, а целая спальня.

    Изучать будем на примере языка С++.

    Странный выбор даже в сравнии с Java. Особенно с учётом, того что низкоуровневые концепции программирования к этому моменту, уже можно было объяснить на примере чистого Си.


    1. shaykemelov Автор
      03.01.2022 21:30
      +1

      Да, но не совсем. У студента есть важный недостаток — хороших на всех не
      хватит, а плохие, те что без стажировок или / и после
      крудоформозаборостроительного не факт, что лучше.

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

      Я не уверен, насчет связей в средненьких вузах. Насчёт хороших — уверен
      (и проверял), и было бы наверное круто перед вхождением в IT закончить
      хотя бы пару курсов Физтеха / МГУ / ВШЭ. Стенфорд или Калтех было бы ещё
      круто закончить. Шансов примерно столько же. У нас до середины третьего
      курса никто не работал, и до поступления ещё год-два на подготовку
      тратили. Это уже не подушка безопасности нужна, а целая спальня.

      Связи имеют место быть везде. Никогда не знаешь, где пригодится знакомство.

      Странный выбор даже в сравнии с Java. Особенно с учётом, того что
      низкоуровневые концепции программирования к этому моменту, уже можно
      было объяснить на примере чистого Си.

      Мне просто очень понравилась подача материала из этой книги.


  1. morgfrimen
    03.01.2022 21:40
    +2

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

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


    1. shaykemelov Автор
      03.01.2022 21:42

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

      Более глубокое погружение все-таки по желанию


  1. PDivision
    03.01.2022 21:56
    +1

    Мало кто из свитчеров пойдёт по настолько сложному пути. Вообще, у Столярова есть отличные книги. Обучение начинается с паскаля, а не с си, что на мой взгляд правильно.


    1. shaykemelov Автор
      03.01.2022 22:13
      +1

      Мало кто из свитчеров пойдёт по настолько сложному пути.

      Из альтернатив я мало что вижу, потому что у меня как-то само собой всё сложилось.

      Сейчас есть куча платформ, где за 6-12 месяцев можно стать "разработчиком". Люди в итоге тратят много денег и времени на эти курсы. Хотя можно все необходимые знания для страта получить бесплатно. Возможно эта их пробелма, что они поддаются агресивной рекламе. Я решил не проходить мимо и предложить иной путь. Возможно он займет болше времени и сил, но он гораздо раньше даст понять, что получится освоить специальность или нет. На курсах ведь многое в лабораторных условиях, чтобы как можно дольше удерживать людей и выкачать как можно больше денег из них.

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

      Думал насчет Pascal, но решил что уже не стоит. В 7 (2010 год) классе нам уже преподавали на C++. Мы не использовали классы, namespaces, а для ввода/вывода использовали cin/cout, что в принципе выглядит почти как Си. Решил, что тогда лучше сразу с Си начинать. К тому уже был знаком с книгой Прата и был уверен в том, что рекомендовать.


  1. KoteMilote
    03.01.2022 23:48
    +2

    Взять выпускника ВУЗа

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

    Выпускники курсов конкурируют с выпускниками курсов, если только студент в ВУЗе халяву не гонял


    1. shaykemelov Автор
      04.01.2022 00:02

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

      Халявщики в ВУЗе будут всегда. Однако есть и не халявщики, которые каждый год все-таки занимают рабочие места. Каждый год их должно становиться больше, учитывая отток из специалиство из стран СНГ


      1. KoteMilote
        04.01.2022 20:11

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

        Не сразу это как?

        Если речь про стажировку, то она и вчерашнему студенту нужна.

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


        1. shaykemelov Автор
          04.01.2022 21:01

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

          Не сразу это как?

          Это пройти собес на позицию junior разработчика. В рекламе курсов ведь так пишут. А про цель нынешних курсов я уже писал.

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

          Много не надо. Вот я и сделал roadmap(очень похож на ВУЗовскую программу) для этого. Считаю это необходимым минимум для джуниора.


  1. ovn83
    03.01.2022 23:51
    +2

    Думаю, новичкам надо начинать с Питона, можно делать почти всё и сразу.

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


  1. souls_arch
    04.01.2022 00:05

    С чего автор решил, что кроме тяжелейших вузов спб и мск, которые выпускают очень ограниченное количество студентов, в остальных учат хотя бы 1/10 того, что он себе выдумал?

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

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


    1. shaykemelov Автор
      04.01.2022 00:15

      С чего автор решил, что кроме тяжелейших вузов спб и мск, которые
      выпускают очень ограниченное количество студентов, в остальных учат
      хотя бы 1/10 того, что он себе выдумал?

      Я учился в УрФУ, по специальности информатика и вычислительная техника и у меня было это всё в программе.

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

      А что устарело из того, что я предложил? Си, С++, Java, алгоритмы, архитектура ЭВМ, паттерны проектирования, техники чистого кода? Я старался дать список того, что даст фундаментальные знания для того, чтобы можно было уверенно войти в IT


    1. gecube
      04.01.2022 00:21
      +1

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

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


    1. Ioanna
      04.01.2022 14:54

      С чего автор решил, что кроме тяжелейших вузов спб и мск, которые выпускают очень ограниченное количество студентов, в остальных учат хотя бы 1/10 того, что он себе выдумал?

      Это не "он себе выдумал", а стандартная программа высшего образования для программиста. Астраханский государственный технический университет - вроде не "тяжелейший вуз", а программа такая же. Это же стандарт.


  1. ALexhha
    04.01.2022 01:42
    +1

    Обращение к тем, кто идет ради денег. Есть множество других способов их заработать. В IT есть потолок по зарплате, а достичь его не просто.

    А не в IT потолка нет что ли ? Просто часто, стартовая/средняя зп в IT - это потолок в других профессиях/отрослях

    Насчет сложности - все очень относительно


    1. urvanov
      04.01.2022 14:22

      В бизнес надо. Там нет потолка. Но и дна нет.


  1. riomenx
    04.01.2022 09:04
    +1

    Я решил сменить профессию. Я пытался попасть в IT. Когда я обратился в Центр занятости,то мне предложили отучиться на бесплатных курсах:

    -швея

    -водитель

    -системный администратор

    Город миллионник все же. В Москве программа значительно шире и велики шансы на успех. Около 80 образовательных программ.

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

    Завлекали как могли на эти курсы так как осваивание государственных многомиллионных выплат образовательным учреждениям никто не отменял. Где то около 200 млн. с копейками выделено на эти курсы.

    Чтобы войти в IT,небходимо хотя бы начать с английского языка,а язык программирования сделать своим хобби.

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


  1. IvanIvanc
    04.01.2022 09:04
    +3

    Конкурировать с выпускниками вуза? Выпускники вуза если все 100% пойдут в программирование не покроют и 10% потребности в программистах. И не всем нужны уберпрограммисты, кому то надо и формы шлепать и прочее.


    1. shaykemelov Автор
      04.01.2022 09:18

      Конкурировать с выпускниками вуза?

      Да, так и есть сейчас

      Выпускники вуза если все 100% пойдут в программирование не покроют и 10% потребности в программистах.

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

      И не всем нужны уберпрограммисты, кому то надо и формы шлепать и прочее.

      Выпускники меда тоже не покрывают все потребности. Ко многим узким специалистам очень большая очередь. Я бы не хотел, чтобы кто-то закончил онлайн курс терапевт_за_6_месяцев и потом лечил меня, даже поставить банально укол или взять анализы крови. Я бы не хотел жить в доме, который проектировал человек с курсов архитектор_за_6_месяцев. Люди сами понимают, что это сложные и ответственные профессии и никому в голову не придет(я очень надеюсь) идти на такие курсы. Почему тогда можно создать поток неквалифицированных IT-специалистов? Вы считаете, что в этой профессии меньше ответственности?

      Откуда такое пренебрежение к работе связанное с фронтедом? Вы считаете, что они не должны быть квалифицированными специалистами? Потом мы жалуемся, что веб тормозит


      1. tyomitch
        04.01.2022 09:57

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


        1. shaykemelov Автор
          04.01.2022 10:09

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

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

          Сейчас автоматизируют практически всё к чему притрагиваются. Фронт страничка на форме заполнения платжного поручения может подвиснуть в ненужный момент и отправить не те данные для денежного перевода

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

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


          1. tyomitch
            04.01.2022 10:23
            +1

            Очень сомневаюсь, что риск иска о массовом вреде здоровью посредством тормозной странички будет всерьёз воспринят продукт-менеджером при просчёте бюджета на её создание.

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


        1. wolfy_str
          04.01.2022 15:02

          " ущерб от неквалифицированной работы ниже доплаты за квалификацию "

          однако почему то есть огромный дисбаланс - за миддлов бизнес готов платить по 200+, а вот джуны борятся за зарплату условно 30-50к, многие не выдерживают идут в тот же макдоналдс или ещё куда где такие же условия по оплате. Но всё равно джунов слишком много и НИКТО особо не хочет их учить, для бизнеса получается ДЕШЕВЛЕ нанять "специалиста" за 200к. Просто потому что денег много в стране, а вот качественно их распределить видимо у многих не получается


          1. tyomitch
            04.01.2022 19:21

            Не знаю ни одного джуна, ушедшего из айти в макдоналдс. У вас есть примеры?


    1. wolfy_str
      04.01.2022 14:57

      глупости пишите. Те кто IT заканчивает далеко не все идут туда. Насколько покроют тут сложно сказать, с одной стороны джуны никому не нужны, а всем нужны миддлы, которых не хватает. Если это элитный вуз то думаю процентов 90% пойдут, 10-15% это те кто серьёзно заболеет, сменит область деятельности под влиянием родственников, уйдёт в бизнес. Если говорить про обычный вуз, дай бог 60% пойдёт в программисты из них треть будет работать в не очень эффективных конторках условно, по крайней мере раньше так было. Всякие подвальчики с ксероксами, мелкие офисы и прочее. Опять же потому что вряд ли учат в вузе поиску работы. Не все даже поймут что устроились "не туда". Или даже если туда, может быть не самое лучшее отделение сбербанка, газпрома, и прочее, это будет двухэтажное маленькое здание где то рядом с огромным офисом, по иронии судьбы, не у всех, но часто бывает и как мейнтримно попасть в большой офис с хорошими условиями мало кто расскажет.


  1. oinksome
    04.01.2022 10:10

    А само изучение языка в какой момент наступает, или это следует отнести в "невошедшее"?


    1. shaykemelov Автор
      04.01.2022 10:13
      +2

      А что вы подразумеваете под изучением языка? Навыки программирования начинают развиваться с амого начала курса CS50. В книгах есть лекционный материал с упражнениями, выполнение которых также развивает навыки программирования. Задачи по программирования развивают алгоритмическое мышление. Остальное это теоретический computer science, либо необходимые навыки, которые пригодятся после.


  1. SadOcean
    04.01.2022 13:32
    +1

    Великолепная статья!

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

    Я формулировал нечто подобное, но теперь есть хорошая ссылка.


  1. wolfy_str
    04.01.2022 14:51

    Курсы иногда бывают лучше чем высшее образование. У меня вот есть высшее - но никто не учил меня устраиваться на работу. У программистов же в первую очередь спрашивают навыки, а не то что они заканчивали. И то курсы пока не довели меня до результата, но по результатам других, я вижу что очень многие устраиваются на 200+.

    Те же алгоритмы невозможно запомнить, они забудутся, а на работе мало где требуется - а для собесов достаточно просто освежить знания либо просто мелком прочитать про бинарные деревья. И далеко не везде они нужны. Опять же в библиотеках всё реализовано.

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


    1. shaykemelov Автор
      04.01.2022 15:47

      Курсы иногда бывают лучше чем высшее образование.

      Возможно. Но многое всегда зависит от человека и его бэкграунда. Многие истории успеха не показывают важные ключевые моменты.

      Те же алгоритмы невозможно запомнить, они забудутся

      Их нужно понимать. Любая программа - алгоритм.

      на работе мало где требуется

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

      для собесов достаточно просто освежить знания либо просто мелком прочитать про бинарные деревья.

      Это смотря в какую компанию собеседование проходит

      И далеко не везде они нужны. Опять же в библиотеках всё реализовано.

      Чтобы уметь пользоваться, нужно понимать как они работают. Взгляните на веб, который задыхается от тонный фреймворков. У меня есть пример из жизни, когда один разработчик затащил в проект целую библиотеку для решения одной проблемы. Пришел другой разработчик, удалил библиотеку и решил проблему в пару строчек кода. Первый разработчик не знал алгоритмов для работы с изображениями, второй знал. Это все было в мобильной разработке при работе с QR кодами. Кстати в той же мобильной разработке полезно знать алгоритмы и структуры данных, добиваться производительности кода, чтобы не разряжать батарейку пользователю.


    1. tsurugi-no_ken
      04.01.2022 15:56
      +4

      Те же алгоритмы невозможно запомнить, они забудутся, а на работе мало где требуется

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

      ПЕСЕЦ! Чем больше Вайти-в-АйТишников на Хабре тем больше она деградирует:

      • сначала говорили о не нужности образования

      • затем о ненужности математики

      • в прошлом году дошли до ненужности какой-либо логики

      • теперь год начинают с ненужности алгоритимов

      И на фоне всего этого самым важным умением называют - софтскиллсы!


      1. ALexhha
        04.01.2022 16:05
        -2

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

        Ну да ну да, а потом получаем такие гениальные решение, придуманные на ходу


        1. mayorovp
          04.01.2022 16:12

          От программиста требуется не тупо вызубрить алгоритмы, а умение на ходу составить свой алгоритм решающий задачу поставленную в ТЗ


          1. ALexhha
            04.01.2022 16:29
            -1

            В ТЗ будет написано - написать генератор случайных чисел, так что формально алогритм на картинке подходит под ТЗ )))


    1. tyomitch
      04.01.2022 19:26

      Курсы иногда бывают лучше чем высшее образование.

      По какому критерию? «Зарплата через месяц после выпуска»?


  1. autumn9
    04.01.2022 15:54

    Нет универсального пути в IT. Встречала на своем пути множество разных историй, ребята из иняза, с химфака, даже с консерваторией в анамнезе успешно пишут код. Если обьективно есть знания и желание, и при этом не гнешь пальцы, требуя условные 100+ с самого старта, то и конкурировать со студентами не придется: большинство работодателей просто возьмут всех, ибо спрос на разработчиков сильно превышает предложение.


    1. shaykemelov Автор
      04.01.2022 16:00

      Я бы сказал, что есть проверенные пути. Многое зависит от самого человека


  1. ciuafm
    04.01.2022 17:07

    Сам начинал с программируемого калькулятора мк-62. Сейчас смотрю что можно посоветовать детям для доВУЗовского образования. К сожалению ничего основательного нет. Везде рисуем сову :-(

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

    А потом можно будет сказать - прошел обучение на Хабре - и все, техническое собеседование не нужно.


  1. vgogolin
    04.01.2022 18:42
    -1

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


    1. shaykemelov Автор
      04.01.2022 18:48

      Я вспомнил как давным-давно локально поднимал денвер и dle). У моего интернет провайдера была локальная сеть по городу. Люди поднимали свои сервера для разных вещей, даже был свой торрент трекер


      1. urvanov
        04.01.2022 19:19

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

        И никакого ИТ-образования у них не было, разумеется.


        1. shaykemelov Автор
          04.01.2022 19:24

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


  1. bbc_69
    05.01.2022 10:20
    -2

    В целом со статьёй согласен, но не согласен с выбором конкрентых начальных языков.

    В начале надо учить условия, циклыб процедурыб функции и т.д. А это можно делать почти на любом языке. Так что тот же питон или паскаль вполне сойдут. Кто-то на Го начинал учиться и ничего. ООП учить тоже можно на разных языках. Та же Джава, например.

    Чего не увидел, так это то, специализации: фронт, бек, ембед, мобайл и т.д. Для выбора провессии это важно и будет влиять на то, что учить дальше.


    1. shaykemelov Автор
      05.01.2022 10:47
      +1

      Как раз таки на Python этого делать не рекомендую. Много всего язык скрывает под капотом. Эта магия вредит при изучении основ программирования.

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

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

      Чего не увидел, так это то, специализации: фронт, бек, ембед, мобайл и
      т.д. Для выбора провессии это важно и будет влиять на то, что учить
      дальше.

      Это выходит за рамки того, что я хотел. Я старался дать материал для изучения фундаментальных вещей, знаний, которые будут применимы во всех областях.

      фронт - фреймворки рождаются и умирают каждый день. Это лишь забьет голову ненужными вещами. Курс CS50 дает достаточно знаний JS/HTML/CSS. Чтобы понять что такое front

      back - тоже много всего. java, c#, php, go, python + нужно изучать разные фреймворки. Курс CS50 дает возможность поработать на уровне бэка через python и flask. Дается возможность понять что такое back.

      embed - я им не занимался и не могу чего-либо предложить. Мне кажется, что это не для новичков т.к. скорее всего нужно будет изучать больше чем обычно

      mobile - придется поискать материал самостоятельно. благо тут выбор не велик. iOS - swift, objective c. Android - kotlin/java. Есть еще flutter и react native. Но опять же я не занимался этими вещами достаточно, чтобы дать материал в котором я буду уверен.

      При выборе направлений и стека лучше отталкиваться от доступных вакансий. Где-то может преобладать Java, где-то C++ и тд. Поэтому дать что-то одно, чтобы всем заехало трудно


      1. bbc_69
        05.01.2022 11:01

        При выборе направлений и стека лучше отталкиваться от доступных
        вакансий. Где-то может преобладать Java, где-то C++ и тд. Поэтому дать
        что-то одно, чтобы всем заехало трудно

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

        Как раз таки на Python этого делать не рекомендую. Много всего язык скрывает под капотом. Эта магия вредит при изучении основ программирования.

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

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

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

        Да и не Питоном единым, есть специализированные языки обучения. АВС вроде как называется.

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


        1. shaykemelov Автор
          05.01.2022 11:12

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

          Уже лет пять использую Java для промышленной backebd разработки. Мой выбор скорее всего был бы предвзятым. Я скажу, что работы на Java много, проекты интересные и тд. Я этого не хочу. Я лучше предложу минимум, чтобы можно было потом самостоятельно выбрать.

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

          Да и не Питоном единым, есть специализированные языки обучения. АВС вроде как называется.

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

          Каждый по разному начинал. У меня был путь через С++/С/Java и естественно я буду проталкивать его как проверенный. Многим Python становится интуитвно понятным после другого С-подобного языка и им кажется, что Python идеально подходит для новичков т.к. он простой. Он простой для вас, потому что вы понимаете как внутри устроены циклы, что такое типизация данных, как работает синтаксических сахар и тд. На Pascal тоже многие научились программировать, вроде как этот язык специально созавался для этого. Мне кажется, что изучение через Си не хуже.


      1. tyomitch
        05.01.2022 15:34

        embed — я им не занимался и не могу чего-либо предложить. Мне кажется, что это не для новичков т.к. скорее всего нужно будет изучать больше чем обычно

        MicroPython — очень дружественный к новичкам; а восторг от робота, ползающего по комнате по твоей программе, намного сильнее, чем от пикселей на мониторе.