Почему программировать сложнее, чем кажется Обаме

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

Последнее время ходит очень много спекуляций на тему того, что «Каждый должен научиться кодить». Мало того, что IT-агитаторы сами программировать зачастую не умеют, так еще и не могут толком объяснить «Зачем» и «Что значит кодить». Просто поверь, что «Надо уметь кодить» и хоть ты тресни.

Собака зарыта уже в самом определении формулировки, так как «уметь кодить» — очень размытое понятие. Написать одну строчку кода moveForward(100); на JavaScript, как это сделал Обама — едва ли сложнее написания классического «Hello, World!». Можем ли мы теперь назвать Обаму кодером?

При этом создание настоящего приложения — на порядок более трудная задача. Если сравнивать «Hello, world!» с реальным программированием, то разница будет примерно такова:

Учебный «Hello, world!»:

Реальная программа:

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

  • Настоящее программирование (а не банальный «Hello, World!») — трудное занятие, потому как оно затрагивает огромное количество мельчайших деталей, которые должны идеально подходить друг другу. Причем эти детали — неочевидны, в отличие от конструктора — их не пощупаешь, да на схеме не увидишь.
  • Программирование требует креативности и навыков ремесленничества. Программист находится в постоянной борьбе между тем, что он хотел бы сделать в своем воображении и тем, каким оно выходит на самом деле в контексте того, что хочет заказчик и позволяют архитектура/технологии. В программировании приходится постоянно то приглядываться к деталям, то отдаляться и смотреть на всю конструкцию издалека. Таким образом «по чертежам» программа выглядит как нечто одно, но в процессе работы она становится чем-то другим, потому что создавая её, приходится менять первоначальные планы и даже пересматривать концепцию.
  • Кодить - к чему это вообще?

  • В голове приходится держать огромное количество информации, в том числе требования, историю создания приложения и мотивы нынешних и предыдущих разработчиков — «Что здесь делает этот шмат кода? Где нужное место, куда можно впихнуть новую функцию, чтобы она ничего не сломала? Тебе постоянно приходится докапываться до мелочей в попытке составить полную картину событий, будто ты не разработчик, а Шерлок. Это не так уж трудно, если речь идет о небольших приложениях, но это невероятно сложно, если речь идет о программах, в которых сотни, тысячи, а то и миллионы строк кода. В реальности, когда кода и бизнес-логики становится всё больше, тебе приходится большую часть времени тратить лишь на то, чтобы понять, осознать глобальную картину. Ситуация, когда разработчик копается в коде банковского софта и думает весь день, чтобы отладить одну единственную строчку — норма. Но в отличие от примера с LEGO, это всё, по большей части, работа с абстрактными картинками, как если бы инструкция по сборке была не в виде наглядных схем, а лишь в тексте.
  • Программирование требует пота и слез. За любыми мало-мальски годными программами и решениями стоит кропотливый и упорный труд, который выжимает мозг до последней извилины. Когда ты собираешь замысловатый LEGO, твои пальцы скрючивает и колет уголками, потому что ты пытаешься втиснуть очередной блок в то место, где он, по-идее, должен быть. Но при этом ты еще и тратишь кучу времени на то, чтобы найти это самое подходящее место. Иногда в конструкторе не хватает парочки мелких деталей, которые там должны были бы быть, и тогда тебе приходится импровизировать. В программировании — то же самое.
  • Для того чтобы писать сложные программы, нужно обладать недюжинными познаниями в технологиях и фреймворках, иначе не создать конфетку. Но это совсем необязательно, если делаешь совсем уж простые приложения.
  • Когда твоя программа становится больше и сложнее, у тебя начинают появляться проблемы, которых раньше никогда не было, пока она была маленькой. Это как строить большое здание, чтобы вспомнить, что забыл провести трубопровод или коммуникации, после чего придется всё разобрать до основания и устранять проблему.

Но об этой разнице между мнимым и настоящим программированием не принято говорить, чтоб не спугнуть новичков. Может даже это и к лучшему, потому что порой незнание — сила. Когда ты не знаешь насколько в реальности сложно программировать, то читаешь все эти книги «Освой С++ самостоятельно за 21 день» и туториалы, смотришь Youtube-видосы, где тебе восторженные авторы на пальцах объясняют «2+2=4», а также мотивируешься Обамой, который типа на JS стал кодить — и на душе становится по-весеннему легко. Потом записываешься на базовый курс Python на Coursera.org, и все вроде бы хорошо, но лишь до того момента, когда нужно выполнить реальное задание, например написать игру (то есть начать программировать, а не заниматься имитацией). Вот тут-то и понимаешь, что все эти «Hello, world!» и moveForward(100); — до одного места.

Луч слепой надежды
Нет, конечно, если ты не отшибленный на всю голову гуманитарий, то худо-бедно «кодить» научишься. Но главный вопрос даже не «сколько времени и усилий на это уйдет» или «какого уровня в результате будут твои навыки кодера» (что тоже немаловажно), а то — насколько эти знания будут применимы в реальной жизни!

Дело в том, что никто уже давно не пишет чисто на JavaScript или на Core Java. Пламенные IT-агитаторы, пытающиеся подтолкнуть человека «поучиться кодить» забывают, что сам по себе кодинг без знания инструментов, технологий, фреймворков, паттернов и алгоритмов — по сути невостребован чуть более, чем полностью. В любой вакансии к любому языку программирования в нагрузку идет еще целая кипа фреймворков, серверов, баз данных и так далее.

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

Тогда в чем смысл?
Расчет IT-евангелистов прост — они придумали формулировку «Learn to Code» вместо «Learn to Program», чтобы не спугнуть дичь и эффективнее впаривать свои обучающие курсы, а также заманивать в компании дешевую рабсилу. Информационная война за души молодняка ведется уже не один год. Но от использования этого «новояза» программирование не становится кодингом. Максимум, что мы получаем на выходе — либо сконфуженных студентов, которые не понимают, почему у них не получается программировать, либо посредственных «кодеров», которые с горем пополам освоят пару технологий и будут пытаться выжить на бурном рынке IT-труда, выполняя скучную, рутинную, малооплачиваемую работу за гроши.