Введение

Нам кажется, что мы умеем точно формулировать мысли. Мы делаем это каждый день: назначаем время встречи, объясняем дорогу, просим отправить файл или уточняем адрес доставки. Чаще всего собеседник понимает нас правильно, и всё получается именно так, как мы ожидали. Из-за этого легко поверить, что давать понятные инструкции — дело простое.

Робот аккуратно льёт кофе на стол рядом с пустой чашкой

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

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

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

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

Мышление шагами и искусство декомпозиции

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

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

Представьте, что перед вами робот, который физически может всё, но совершенно ничего не знает о мире. Вы хотите, чтобы он открыл дверь. Вы говорите: «Открой дверь». Робот стоит на месте. Вы забыли, что понятие «открыть» для него не существует. Тогда вы начинаете дробить задачу. Вы мысленно разбиваете процесс на составные части: подойти к двери, протянуть руку, взять ручку, нажать на нее, потянуть на себя. Но для машины это всё еще слишком сложно. Что значит «подойти»? Как определить, где дверь? Под каким углом нужно согнуть манипулятор, чтобы ручка оказалась в захвате? Какое усилие приложить при нажатии, чтобы не сломать механизм, но сдвинуть язычок замка?

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

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

Учеба и ошибки

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

Ученик спокойно исследует ошибку в коде как детективную улику

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

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

Часто новички попадают в ловушку «понятного текста». Вы читаете учебник или смотрите видеоурок, где преподаватель гладко и логично шаг за шагом решает задачу. Вы киваете: всё логично, всё понятно. Кажется, что вы научились. Но когда через час вы садитесь перед пустым экраном, чтобы написать то же самое, в голове образуется звенящая пустота. Вы не можете вспомнить, с чего начать. Это абсолютно нормально. Понимание концепции и умение ее применить — это разные биологические процессы.

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

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

Потребность в языке-посреднике

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

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

Идея превращается в точные команды, которые выполняет компьютер

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

Нам нужен инструмент, который принципиально не допускает разночтений. Язык, в котором каждое слово значит только одно. Язык, который достаточно прост для понимания человеком (чтобы мы не сошли с ума, пока пишем), но при этом достаточно формален, чтобы его могла однозначно расшифровать машина. Такие языки-посредники и называются языками программирования. Их придумано множество: одни хороши для управления микроволновками, другие — для отрисовки графики в играх.

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

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

Практическая работа. Что такое программа

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

Что такое программа

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

13

Что такое программа?

23

Почему человеку неудобно писать программы напрямую в машинном коде?

33

Зачем нужны языки программирования вроде Python?

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.