Вопросы, связанные с демократичностью программирования и с тем, насколько можно считать эту отрасль «делом для всех и каждого», поднимались уже не раз. Продолжаем эту традицию сегодняшним материалом: Марк Чу-Кэрролл высказывается на эту же тему и рассказывает о том, что в программировании сложно, а что элементарно, предлагает задуматься о границах этого вида деятельности и убедительно доказывает, что легкость программирования сильно преувеличена.
Моя профессия — понимать, как люди пишут программы. Языки программирования, среды разработки, инструменты для управления кодом и совместной разработки и т. д. — все это мой хлеб насущный. Неудивительно, что как-то раз опус, который попался мне на глаза в твиттере, вызвал мое крайнее возмущение.
Статья начинается с заявления о том, что большинство руководств по программированию, имеющихся в интернете, никуда не годится. Я не могу с этим полностью согласиться, мне кажется, что это как раз такая тема, которую важно обсуждать. Но следующий фрагмент кажется мне совершенно неверным:
«Но это лишь одна сторона проблемы. Виктор (Брет Виктор — прим. пер.) считает, что само программирование испорчено. Считается, что для написания хорошего кода нужно уметь "думать, как компьютер". Он считает это мнение до абсурда устаревшим — но именно из-за этого заблуждения программирование считается очень сложным видом деятельности. Компьютер — это инструмент; почему же мы не можем его контролировать, управлять им так, как это удобно и естественно для всех нас?»
Бабах! Мне выносит мозг.
По какой-то причине многие люди разделяют надуманную идею о том, что программирование — это на самом деле очень легкая штука, что сами программисты лишь намеренно усложняют ее — со зла, чтобы оставаться элитой, просто от бестолковости или уж не знаю почему. За долгие годы, которые я проработал в этой сфере, целый хор голосов повторяет, что программировать на самом деле легко, что мы просто вынуждаем человека думать, «как машина».
Нам всего лишь нужно переделать программирование, чтобы оно было ориентировано на человеческий мозг, а не на микросхемы. И все, программирование станет совершенно простым делом, все начнут им заниматься, и мир превратится в идеальную компьютерную утопию.
Во-первых, «машинное мышление» — это просто штамп, ярлык, цель которого — выставить нынешнее программирование в мрачном свете. Дескать, мало того, что программировать сложно, так еще эти проклятые технари требуют от вас стать какими-то роботами, иначе вы этому делу никогда не научитесь!
Чтобы быть программистом, не требуется думать, как машина. Но нужно понимать, как работают машины. Чтобы успешно программировать, понимать это просто необходимо, так как при написании программы мы, в сущности, собираем машину!
Когда мы разрабатываем программу на теоретическом уровне, мы проектируем машину, которая будет выполнять определенную механическую задачу. Действительно, программа — это просто описание машины. А язык программирования, в сущности — специализированная форма нотации, описывающая определенную разновидность машины.
Никто же не пойдет к инженеру-конструктору и не станет критиковать его, что как-то неправильно он проектирует передачи — ведь для работы с ними приходится разбираться в принципах работы шестерней. Но именно такие упреки порой приходится слышать программистам.
Насколько сложно программировать? Все зависит от того, что вы пытаетесь сделать. Суть проблемы такова: чем сложнее машина, которую вам требуется создать, тем сложнее будет и описывающая ее программа. Если вы пытаетесь построить очень сложную машину, то не думайте, что удастся обойтись простой программой.
Только так. Этого принципа не обойти, он лежит в основе всей природы программирования.
Мне часто приходится сталкиваться с аргументом следующего содержания: «Программирование — это не сантехника. Любому должно быть под силу освоить программирование». И я отвечу: да, именно так. Любой хозяин должен уметь поменять дома кран.
Кажется, что это страшно банальная вещь, но вот я как-то раз попытался своими руками починить мойку на кухне и наделал убытков на пару тысяч долларов.
Но сантехника — это не только ремонт кранов, а целая многогранная отрасль:
- есть инженеры, проектирующие сантехнические системы, регулирующие работу водопроводов и канализации в огромном городе. Да, это тоже сантехника. И это очень сложное дело. Даже если вы очень умны, вы не сможете заниматься им «с нуля» — сначала придется выучить целую гору материалов о сантехническом деле;
- есть мастера, обустраивающие канализацию в частном доме. Это тоже сантехника. Сложная профессия, которой требуется долго учиться, пусть она и не сравнима с разработкой водопроводных систем для большого города;
- есть люди, которые вообще не проектируют сантехнических систем, но могут с нуля собрать систему подачи воды для целого дома на основе чертежей, подготовленных инженером. И это — сантехника. Требующая еще одного специального набора знаний и навыков;
- бывают просто коммунальщики, которые приходят к вам домой и, даже не видя никаких чертежей, быстро понимают, что у вас сломалось и как это починить. Еще одна грань сантехники, со своим набором знаний и умений;
- совершенно не будучи сантехниками, некоторые умельцы способны заделать текущие трубы или заменить прохудившееся колено. Немного прилежания — и этому может научиться практически кто угодно. Тоже сантехника. В конце концов, менять краны самостоятельно приходилось очень многим читателям;
- есть, наконец, граждане вроде меня, которые могут вооружиться сантехническим тросом и вантузом и прочистить засор в туалете. Это тоже сантехника, но она не требует никакого опыта и абсолютно никакого обучения. Несомненно, любой взрослый человек должен уметь делать это сам.
Итак, для различных видов сантехнических работ требуются принципиально разные навыки и совершенно несопоставимые объемы обучения и опыта.
Программирование — точно такое же дело. Существуют разновидности программирования, требующие разных знаний и навыков. Используемые в конкретных случаях инструменты и методы обучения коренным образом отличаются — настолько, что во многих случаях люди даже не осознают, что занимаются программированием. Но практически любому рядовому пользователю компьютера приходится что-либо программировать:
- если вы создаете презентацию в PowerPoint, где какие-то элементы появляются, крутятся и исчезают с экрана по вашей команде — то это программирование;
- если вы записываете формулу в электронную таблицу — это программирование;
- если вы создаете сайт, даже самый простой, и либо пользуетесь при этом конструктором сайтов, либо просто пишете страничку на HTML/CSS — это программирование;
- если вы пишете макрос в Word или Excel — это программирование;
- если настраиваете автоответчик, который будет реагировать на входящую электронную почту, пока вы в отпуске — это программирование.
Некоторые авторы игнорируют очевидное, не считая такие операции программированием, а потом жалуются, что программирование — это такая супермегаархисложная китайская грамота. Да, многие из нас пишут программы, даже не подозревая об этом. А происходит это потому, что они пользуются при этом именно такими инструментами, которые подают задачу программирования в совершенно обыденном виде, и она уже не воспринимается как программирование.
С другой стороны, согласитесь: идея о том, что вы должны уметь программировать, не понимая машины, при помощи которой это делаете, либо машины, которую создаете — не выдерживает никакой критики.
Если копнуть поглубже и начать решать сравнительно сложные задачи, то программирование, как и любая другая сфера деятельности, станет гораздо сложнее. Продолжая аналогию с сантехникой, приходится изучить, как сочленяются трубы, каковы свойства различных материалов, из которых они изготавливаются, как по ним текут различные жидкости. Нельзя быть программистом, совершенно не разбираясь в машине. Чем более сложную задачу приходится решать, тем более уверенно нужно разбираться в предметной области.
Если вам приходится решать задачи не сложнее, чем составление презентаций PowerPoint, то не требуется и запредельных знаний о компьютере. Если же приходится писать макросы для Excel, то уже не обойтись без представления о том, как компьютер обрабатывает числа, что приводит к ошибкам в вычислениях с плавающей точкой и т. д. Если кто-то планирует создать текстовый редактор вроде Word, то ему нужно обладать массой знаний о работе отдельного компьютера, в частности об отображении информации на экране. Если же вы хотите написать поисковую программу, то вам совершенно необязательно разбираться в тонкостях восприятия текста с экрана, но необходимо знать, как работают компьютеры, сети и телекоммуникационные системы.
Честно говоря, я и не думаю подозревать Виктора в нечестности. Но он нечестно представляет вещи, что еще хуже. Например, он сравнивает обучение программированию с обучением поварскому делу. Он описывает, как бы мы учили кого-нибудь готовить суфле. На входе Виктор демонстрирует нам набор кулинарных ингредиентов, на выходе — десерт, и утверждает: «Вот так мы и учим людей программировать. Даем им продукты и предлагаем возиться с ними до тех пор, пока не получится суфле».
Да, так люди учатся готовить, но эта аналогия совершенно не годится в нашем контексте. Если мы хотим, чтобы ученик умел готовить ровно одно блюдо, то даем ему полный и подробный пошаговый рецепт. Но как только человек разберется с основами, мы уже действуем иначе и предлагаем ему поэкспериментировать. «Да, вкусное суфле получилось. Но что если добавить немного кардамона в сливки? А если убрать ваниль? Тоже получится хорошо? Или даже лучше?» Если не заниматься такими экспериментами, то восхитительного суфле у вас никогда не получится! Ведь ингредиенты у вас под рукой всегда будут немного отличаться, а качество десерта будет зависеть и от того, какая у вас духовка, какой десяток яиц вы купили, сколько клейковины в муке и т. д.
Писать сложные программы сложно. Чтобы писать программы, оперирующие символьными данными, необходимо понимать, как строится символическое представление реальных данных. Чтобы создать вычислительную программу, нужно знать законы математики и принципы, по которым компьютер обрабатывает числа. Чтобы создать машину, нужно понимать, какую машину вы хотите построить. Вот и все.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.