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

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

И в эту минуту я чувствую как начинают шевелиться волосы на моей голове. От шока, что не понимаю, что это такое.

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

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

С тех пор, если встречается в книге, что автор научит всех, даже тех, кто “никогда не программировал”, то невольно вздрагиваю, как от легкого удара электрическим током.

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

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

Моя статья написана как отклик на пост By_kosha “Моя боль в JavaScript: когда this и переменные становятся головоломкой” (https://habr.com/ru/articles/867360/).

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

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

В итоге получилась небольшая коллекция “непоняток” в изучении программирования. Приведу их в том порядке, в котором они следуют в исходной публикации, добавив от себя ещё пару вспомнившихся по ассоциации.

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

Коллекция непоняток в изучении программирования

  1. Одинаковые имена свойств (JavaScript)

Пример от автора вышеупомянутого поста. Цитирую:

“Когда видишь подобный пример:

function Person(name, age, gender) {

  this.name = name;

  this.age = age;

  this.gender = gender;

}

Кажется, что это просто «одно и то же имя равно самому себе». Ты пишешь код, но не до конца понимаешь, чем this.name отличается от name, и зачем здесь нужно this.

Понимание приходит со временем, но на первых порах это превращается в простое следование примеру. В голове остаётся ощущение магии?: «Я пишу то же самое, но почему это работает?» И только позже осознаёшь разницу между параметрами функции и свойствами объекта.”

2. Одинаковые имена свойств (Swift)

По ассоциации с этим примером вспомнился и свой собственный временной затор, очень похожий.

struct Person {

let name: String

var Age: Int

init(name: String, age: Int) {

self.name = name

self.age = age

}

}

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

3. Что такое переменная

Цитирую из комментариев:

«…как‑то подрабатывал помощником преподавателя, так ко мне на консультацию пришел однажды чел, взрослый, лет 35, который не понимал, что такое переменная и как она работает.»

Это была большая неожиданность. Казалось бы, это чуть ли не самая простая тема, ан нет, её тоже лучше объяснить.

4. Возвращаемое значение

“… на первых порах … никак не мог въехать в "возвращаемое значение". Хорошо помню как это раздражало в очередном тьюториале - "кто возвращает", "куда" и главное "зачем". Сейчас конечно смешно, но тогда это выглядело не то, что "магия", а какой-то мировой заговор преподавателей, которые твердят одно и то же, но не хотят объяснить толком что это такое”

5. Регистр в процессоре

“У меня так с "регистром" в процессорах было - что значит "именованная ячейка памяти", зачем её именовать и почему просто не дать цифровой адрес, как всем остальным ячейкам памяти?”

6. Рекурсия

«Я помню вначале пути путался с рекурсиями. Тогда для меня они выглядели, как магия.»

7. Массивы в JS с «дырками»

«Меня ментально напрягли массивы в js, особенно массивы с „дырками“. Странные на фоне массивов в других языках, где они являются непрерывным куском памяти. Сейчас отношусь к ним философски, но долгое время было не совсем понятно, с чем имею дело»

8. Что такое «делегат»

На одном из форумов человек с опытом говорил, что не понимает, что такое делегат в Swift.

Заключение

А какие у вас были непонятки?

И как вы с ними справились — сами или кто‑то помог? И как?

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


  1. JBFW
    29.12.2024 00:22

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

    Хорошо, когда пришел в IT из электроники и сразу в ассемблер: регистр и ячейка памяти уже имеют вполне определенный физический смысл, 16 или 32 бит буквально представляешь глазами, и понимаешь как именно может выглядеть "возврат значения".

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


    1. DaneSoul
      29.12.2024 00:22

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

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

      "Табуретка? Представь что у тебя есть обычный пенек, кусок ствола дерева на которым ты сидел во дворе, но ты хочешь сделать легким для удобной переноски. Для этого берешь тонкий спил, вместо высокого - то на чем будешь сидеть и ставишь его на палки в качестве ножек, чтобы он был нужной тебе высоты."

      Ту же упомянутую "длину" переменных можно объяснить через органайзер с ячейками - если у тебя в пенале 16 ячеек размерами под твои предметы, а тебе нужно класть в него больше, значит ты выбрал не верный пенал, нужно взять большего размера. Почему сразу не взять максимально большой? А потому что они места больше занимают, это очевидно же!


    1. WebPeople
      29.12.2024 00:22

      А как именно в электронике ты представляешь глазами 16 бит, например? Для меня это скорее математика, чем физика


      1. ptr128
        29.12.2024 00:22

        Странный вопрос. В простейшем виде, как 16 D-триггеров. Примерно, таких:

        В частности, если речь о DRAM, то 16 ячеек:


        1. randomsimplenumber
          29.12.2024 00:22

          Тут бы старший байт от младшего научиться отличать..


          1. vadimr
            29.12.2024 00:22

            У старшего вес в числе больше. Всё как у людей.


          1. ptr128
            29.12.2024 00:22

            Для этого сначала надо разобраться c big-endian и little-endian. А если речь уже о int32 или int64, то еще, возможно, и с mixed-endian


            1. perfect_genius
              29.12.2024 00:22

              big-endian и little-endian

              А кто как их запомнил? Я как "большое и маленькое удобство для глаз".


              1. kmeaw
                29.12.2024 00:22

                Большое или маленькое изменение произойдёт, если мы изменим первый байт? Ещё помогает то, что в названиях платформ (mips64el) используют "перевёрнутый" суффикс "el" (endian little).


              1. vadimr
                29.12.2024 00:22

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

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


        1. WebPeople
          29.12.2024 00:22

          Почему странный?)) Не все же на Хабре электронщики)) Но в целом я понял - вам было от чего отталкиваться.


          1. ptr128
            29.12.2024 00:22

            Так и я не электронщик. Я программист. Просто я учился программированию начиная с емкостей, индуктивностей, pn-переходов и полевого эффекта. И я даже плохо себе представляю, как можно стать IT профессионалом, не имея понятия об этой базе. Особенности DRAM, PCIe, CPU и т.п. без этого будут выглядеть как набор догм. Мне лично комфортней и проще, когда я понимаю, а не когда зубрю. Одно дело зубрить, что это так, а совсем другое - понимать, почему и зачем.