Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Программирование -- это про деятельность. Программирование -- это про грамотность.

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

Когда-то я читал фантастический рассказ, в котором изобретатель сделал детекторный приемник из интерьера комнаты, соединив проводами цветочный горшок, гардины и т.д. У программиста такой же специальный взгляд на мир, "глядит в фигу, видит книгу". Один из самых смешных анекдотов, которые непонятны непрограммистам (спасибо meatreach за напоминание): "Физик, математик и программист обсуждают самое великое событие в их областях. Физик считает главным достижением цивилизации теорию относительности, математик доказательство теоремы Ферма. Программист восхищается термосом: "Утром наливаешь холодную воду -- вечером выливаешь холодную. Утром наливаешь горячую воду -- вечером выливаешь горячую. КАК ОН ЗНАЕТ?!".

Программистское мышление описывал Дейкстра в своей знаменитой притче о туалетах в железнодорожных вагонах (http://www.2lib.ru/book/win/3586.html): "Хотя во времена, к которым относится наша история, человечество не знало ЭВМ, неизвестный, нашедший это решение, был первым в мире компетентным программистом. Я рассказывал эту историю разным людям. Программистам, как правило, она нравилась, а их начальники обычно сердились все больше и больше по мере ее развития. Hастоящие математики, однако, не могли понять, в чем соль".

Обратили внимание? "Настоящие математики, однако, не могли понять, в чем соль". Программистское мышление -- это особый взгляд на мир, совершенно отличный от взгляда на мир математиков (добавим: и физиков, и историков, и многих других).

Мышление хороших программистов пытался исследовать Алан Картер, написавший знаменитый "Программистский камень" (по-русски: http://opk.afti.ru/wp-content/progstone.pdf, по-английски: http://www.reciprocality.org/Reciprocality/r0/). Помните первую фразу оттуда? "На эту работу нас подвигло желание узнать, почему в программной инженерии некоторые люди на порядок, а то и два, продуктивнее большинства людей. Если бы так было у каменщиков, то строительная индустрия очень заинтересовалась бы причиной. Проблема, конечно, в том, что о каменщике за работой можно снять фильм, а затем его действия проанализировать. Но невозможно увидеть, что делают великие программисты, да и они сами не смогли бы объяснить разницу, хотя большинство из них и захотело бы это сделать".

Программирование -- это не про компьютеры. Программирование -- это про деятельность, activity. Деятельность, которая мыслится в будущем, деятельность в сути своей повторяемая, но постепенно приспосабливающаяся к неопределенному будущему в ходе исполнения задумки, фиксированной в виде плана=программы. В так понимаемом программировании можно выделить совсем другие главные проблемы, нежели традиционно обсуждаемые в предметной области компьютинга, например:
-- язык, которым можно говорить (компьютеру и человеку) о деятельности, рефлексивно включая сюда собственно говорение о программировании как "деятельности над таким материалом, как деятельность" -- включая формальное говорение, т.е. работа с системами программирования с рефлексивностью и интроспекцией).
-- "проблему многих деятелей", ибо "одинокий деятель" -- нонсенс. В деятельности участвует много разно позиционирующихся по отношению к ней людей, используется много разнородного софта и железа, деятельность часто асинхронна, и подразумевает "экстремально позднее связывание" в силу своего динамизма. По сути, сегодняшний компьютинг -- про опосредованное "компьютерно-сетевой средой" (а не одиноким компьютером) человеко-человечное взаимодействие. Человеко-машинный интерфейс, равно как и "межпрограммные интерфейсы" в конечном итоге только тонкие прокладки в организации человеко-человечьих интерфейсов.
-- "программистское мышление для непрограммистов", ибо планируюее/проектирующее (то есть программистское) мышление может быть полезно для других профессий и тем самым быть элементом общей культуры -- "грамотностью конца XXI века", как ее понимал Алан Кей: человек XXI века может записывать свои идеи на таком продвинутом медиа, как компьютер в сети -- но ведь и идеи могут быть достаточно сложными, чтобы не сводиться к тексту!

Проблема языка и языкового вкуса -- одна из традиционных для писателей. Хороший программист обязан быть хорошим писателем. Его читатели -- не только другие люди, но другие программы, поэтому он должен писать понятно. Хороший программист должен уметь строить непротиворечивые миры -- следовательно он должен разбираться в устройстве (архитектуре?) самых разных миров. Любой эксперт разбирается в устройстве своего мира. Не любой эксперт может изложить устройство этого мира на глиняных табличках, бумаге, компьютере. Писательское мастерство программиста подразумевает его хорошее владение языком: он должен уметь исследовать (выделять объекты из мира -- строить понятия), он должен уметь строить (обладать архитектурным мышлением -- кому нужен плохо построенный мир?) из такого гибкого материала, как язык.

Хороший программист пытается получить язык столь же выразительный, сколь естественный, и тем самым снять (сознательно) ограничение на способы собственного выражения -- он использует аппарат "создания языка под задачу" (extensible language, язык, на котором пишутся определения других языков). Конечно, такой способ не для интеллектуально слабонервных, ибо плохой дизайн системы в этом случае получить много легче, чем хороший. В Smalltalk-комьюнити об этом говорят как о том, что нельзя такие языки давать людям с отсутствием стиля. То есть нельзя давать расширяемые языки непрограммистам. Сторонники "предписанного языком хорошего стиля" в отличие от сторонников языковой свободы, по сути говорят: белые стихи писать неправильно, нужно всем писать в сонетной форме или форме хокку и контролировать ее компьютерно: так меньше ошибок, а стихи все еще остаются стихами. И так думают многие и многие нынешние практики программирования. Им можно напомнить поговорку времен битвы Паскаля с Фортраном: "плохую программу можно написать и на Паскале". Тем не менее, Алан Кей говорит, что вокруг тех мест, где можно "подкрутить" язык, вполне можно построить забор, и на калитке в нем делать предупреждающую надпись (типа как в современных программах для некоторых системных настроек предупреждают, что их шевелить можно только в том случае, если хорошо понимаешь, что и зачем делаешь).

Когда-то давно мне свезло попасть (в начале восьмидесятых) в стремительно сошедшую за буквально десяток лет волну всеобщего языкостроительства "под свои нужды". Тогда же я с удивлением обнаружил, что в каждой более-менее сложной системе, которую я делал сотоварищи, заводился сам собой какой-то скриптовый язык -- сначала неполный (последовательность команд с параметрами), а потом по необходимости доводимый до алгоритмически полного (условия и циклы, процедуры). И тем самым у меня появился разнообразный опыт "строительства одного языка на базе другого". В openmeta я как-то писал про то, как после нескольких разбирательств с устройством трех мета-уровней выполнения программы, у меня в мозгах что-то щелкнуло и какие-то существенные черты моего мышления оказались сформированными. Я счел такие "медитации над мета" самыми продуктивными в плане постановки собственного мышления (не только программистского!), мне уже трудно представить, как оно было "до того". Поэтому важны не только разные "подходы" к программистским языкам (см., например, классификацию Непейводы "Стили программирования как общий подход к системе понятий информатики", http://is.ifmo.ru/aboutus/_log_prog2.pdf, в котором ООП объявлено "четверть-шагом к высокоуровневому стилю" и делается совершенно правильная отсылка к "психологии" в данном стиле), сколько понимание того, как все это в совокупности работает на месиве из процессоров, софта, сетей и людей. После такого понимания мозги "щелкают", и дальше можно писать хоть по-русски, хоть на бейсике, хоть на ассемблере -- понимая, "чем слово отзовется".

А еще мне свезло пописать немного на Forth и я запомнил ощущения. Так что в этой языковой дискуссии я целиком на стороне расширяемых языков с одной стороны и привития стиля ими пользоваться с другой стороны. Иначе это похоже на то, как детям дают тупые ножи, чтобы резать ими мясо или хлеб -- ну, чтобы не порезались. В итоге и само резание получается у них плохо, и после применения силы зачастую травмируются этими тупыми ножами только сильнее. Хороший программист (как и хороший физик, который по словам Фарадея, "должен уметь пилить буравом и буравить пилой") может писать на любом языке и строить миры из любых неудобных материалов, но лучше бы ему иметь для этого правильную расширяемую языковую средству, обеспечиваемые рефлексивной и интроспективной виртуальной виртуальной машиной, которая к тому же дает возможность экстремально позднего связывания и поддерживает разностильность, ибо строительство миров удивительно коллаборативно, асинхронно и разностильно. Волшебная распределенная глина для информационных демиургов должна быть, и учить демиургов лучше бы с ее использованием.

Но мы прекрасно знаем, что человек с хорошо подвешенным языком (программирования) вовсе необязательно будет программистом: ему нужно еще знать, с кем и о чем разговаривать. Это тридцать лет назад программист писал программу, у которой были четко определенные input и output (о, как давно это было!), а сейчас программист пишет маленькие кусочки к распределенной вычислительной среде, большие куски которой могут не существовать еще в момент написания программы. Речь не идет о "параллельном программировании", где вполне определенный и хорошо очерченный алгоритм размазывается по множеству доступных вычислительных ресурсов. Речь идет о том, что в деятельности участвуют множество людей-принципалов и их человечьих и программных агентов, участвующих во многих и многих организациях (организованных деятельностях, протекающих с использованием программно-аппаратных инфраструктур -- http://ailev.livejournal.com/379511.html, "сетевая организационная технологическая платформа"), и в таком месиве нельзя говорить о каких-то алгоритмах -- скорее уж о "процессах" из менеджмента. World Wide Web Consorcium вводит для описания такого "программирования" (сценирования? режиссирования? планирования?) слова оркестровка и хореография. Программист -- это режиссер сложнейшего спектакля, разыгрываемого людьми и компьютерами, находящимися в самых разных ролях, облаченных в самые разные костюмы-интерфейсы. Современный программист пишет разнородные куски кода, имея ввиду многочисленные протоколы и разнообразные архитектуры, за этими протоколами стоящие. Другими словами, программист пишет для интернета, и его счастье, если это относительно простые и малочисленные протоколы Web 2.0, а не грядущие ужасы Web 4.2. Он пишет не столько программы, которые что-то исполняют, сколько программы, которые как-то обеспечивают исполнение каких-то (часто ad hoc,
формирующихся на ходу, по потребности -- к ужасу программистов) протоколов людского уровня, относящихся к собственно деятельности.

Писать программу, которая асинхронно взаимодействует со множеством других программ, написанных другими программистами, и болтающихся где-то в Сети -- это еще цветочки. Эти цветочки психологически вполне решаются внесением антропоморфной метафоры, в которой мир состоит из объектов, обменивающихся сообщениями. В других стилях программирования такие цветочки труднее нарисовать, но мы даже не будем здесь этим заморачиваться. Ягодки начинаются тогда, когда начинаешь понимать, что по сути, человеко-машинный интерфейс -- это некоторый крошечный кусочек человеко-человечного интерфейса, опосредованного машиной. Нужно понять, что человек хочет (или наоборот -- не хочет) донести до другого человека или даже группы, и как-то скоординировать все "уровни", "слои", "приложения", "программы", "интерфейсы" и прочую машинерию, таким образом, чтобы это произошло -- синхронно или асинхронно (с использованием памяти "вычислительной среды", ибо современный интернет никак не назовешь "компьютером"). Программист должен знать людей -- и других программистов, с которыми ему нужно как-то договориться ("программирование -- это всегда сопровождение"), и пользователей (большинство их которых он никогда не увидит, да и даны эти пользователи ему часто не как люди, а как программы, представляющие этих людей в вычислительной среде). Черт возьми, это все верно и для того случая, когда с программой работает один человек: человеко-человечный интерфейс, опосредованный машиной, тут

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

Оказалось (и это изучала группа "Аттик" на мехмате МГУ, когда я с ней работал в конце 80-х), что обычный человек очень плохо планирует: он очень плохо держит в голове, а затем излагает на бумаге последовательности действий с условиями их выполнения и возможными циклами. А если эти последовательности действий выполняют разные исполнители (такая тогда была принята терминология), то задача и вовсе была запредельной. Планы, они же -- программы, они же -- расписания, которые представляют собой текст или график, данные с одной стороны одномоментно в build time, а с другой стороны мыслимого (во время того же build time!) в виде многовариантного разворачиваемого во времени будущего в run time, оказались весьма трудны для их экспликации (выворачивания из головы на какое-то медиа). А ведь это обычная грамотность -- если у мистера Фикса есть план, то грамотный мистер Фикс сможет его записать (и прочесть план, присланный его коллегой). В XXI веке для планов есть подходящее медиа -- компьютер. И речь идет совершенно необязательно о традиционных языках программирования, когда вы пытаетесь сообразить, что у вас происходит в supply chain management, или сообразить, укладываетесь ли вы в срок при постройке здания, размышляя над критическим путем в системе проектного менеджмента, или в рамках "процессного подхода" описываете простановку 12 виз на путешествующем по штаб-квартире небольшого холдинга договоре, то это все требует примерно такого же мышления, каким обладают программисты. Недаром хорошие планировщики проектов -- редки. Ибо они растут как трава, никто не сообразит, что их можно легко получить из программистов -- ибо именно у программистов накачана мозговая мышца планирования.

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

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

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

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

Disclaimer. Да, я знаю, что профессии программиста нет, и что "компьютинг" сейчас делят как минимум на computer engineering, computer science, information systems, information technology и software engineering (http://www.acm.org/education/curric_vols/CC2005-March06Final.pdf, "Computer Curricula 2005"). Меня просто интересуют другие вопросы, нежели проведение четких границ между всеми этими дисциплинами. Наоборот, я ищу в этих дисциплинах общее, а не различия.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 38 comments