На ваш суд скорее статья-вопрос, статья-рассуждение и местами — недоумение. С одной стороны нам презентовали авторитетное мнение Лесли Лэмпорта "Programming Should Be More Than Coding", расставляющее программирование и кодирование в импровизированном табеле о рангах. С оппонирующей стороны — я, не обладающий статусом достаточным для споров с мэтром и легендарным ВУЗом, который он представляет… но отказать себе в таком удовольствии и риске я не могу. Надеюсь, более опытные товарищи поправят мои огрехи в рассуждениях.


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


Как опытные инженеры, мы — мастера абстракций. Поэтому для нас не составит труда представить условного программиста по имени Лесли Лэмпорт (все имена и совпадения не случайны) и его основной инструмент — машину Тьюринга. Он — мастер своего дела, во многом благодаря железному дао:


  1. Решить, что именно должна делать программа.
  2. Определить, как именно она должна выполнять свою задачу.
  3. Написать соответствующий код.

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


И вот здесь его гений раскрывается в полной мере. Но за этим процессом, как за шулером с напёрстками, надо следить очень внимательно. Он берет три пункта своей программы и под последний кладёт шарик с кодом. Мы одобрительно киваем и делаем ставки. После чего напёрстки нарочито медленно перемешиваются. Где код?


У нас практически нет сомнений в том, где третий напёрсток, а код оказывается… под напёрстком номер 1. Зеваки в шоке, мистер Лэмпорт тоже выглядит растерянным, но в душе он знает, что смухлевал. И именно в этот момент, когда он незаметно перекатывал шарик с кодом из п.3 в п.1, мне очень хотелось схватить его за рукав.


То, что выглядит как утка, крякает как утка и даже само уверено что утка, скорее всего ей и является. Если ты разработал язык TLA+ для спецификаций, всем своим видом и поведением кричащий, что он — код, он им и является. Тот факт, что ты использовал его на этапе спецификации программы, сиречь п.1 "решения, что именно должна делать программа", ты не избавился от необходимости п.3 "написать соответствующий код".


Давайте интерполируем Лесли на десять лет вперёд, в течение которых он методично использует созданный им TLA+ для написания спецификаций. Я думаю в независимости от того, аналитики мы, архитекторы или инженеры БД, нехотя признаёмся, что становимся чем-то вроде кодера в самом рутинном смысле этого слова. Разные диалекты, разные словари, но тот же рефлекторный аппарат, который со скучающим видом выдает дизайн-паттерны, ER-диаграммы или спецификации в случае с нашим персонажем. И вот, под благовидным пунктом #1 автор тезиса что "кодинг не так важен", прячет этот самый кодинг.


Для иллюстрации я приглашу ещё одного свидетеля, назовём его Джон МакКарти. Никого так не бесит программирование машины Тьюринга как Джона, особенно, когда речь идёт о столь любимых им задачах в области искусственного интеллекта. И во спасение он изобретает новый, декларативный стиль кодирования для описания того, как должна выполняться задача (п.2 списка Лесли). Назовём его условно LISP.


Давайте предположим, что Джон не написал за свою жизнь ни одной программы, что по формуле Лэмпорта ставит его в рейтинге на уровень планктона, хотя к коду он имеет самое прямое отношение. Возникает вопрос, какова его степень недоумения и что он скажет ему при встрече?


Не буду утомлять десятками идентичных примеров, а попробую предложить на суд коллег некоторое резюме. Кодирование — это пульс разработки. Оно присутствует на всех этапах в том или ином виде. Кардиограмма выглядит скучно, но является необходимым индикатором того, что проект жив. Поэтому всё чаще всплывают формулировки *-as-a-Code.


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


Различие в том, что некоторые из нас увидят что-то, что не заметили другие и добавят ценности к этому процессу. МакКарти — LISP, Лэмпорт — LaTeX и TLA+. А когда перебираешь в руках такие коды как десятичная система счисления, азбука Брайля, радио или смайлики, то не поднимется язык сказать, что "Programing Should Be More Than Coding".


P.S. Может кто-то из посетителей конференции захочет задать поднятые вопросы. Если спикеру и аудитории они покажутся глупыми, то валите всё на меня.


P.P.S. Так сталось, что у меня масса материалов на тему кода и кодирования и если данная тема вызовет интерес, я с охотно поделюсь.

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


  1. halted
    07.06.2019 11:54

    Только бинарный код является настоящим языком программирования. Все остальное синтаксический сахар.


    1. mammuthus
      07.06.2019 12:17

      Синтаксический сахар — всё, что выше законов квантмеха.


    1. StanEgo Автор
      07.06.2019 13:57

      Попробуйте бинарным кодом запрограммировать другого человека. Скажем закодировать такое музыкальное произведение, чтобы он зарыдал или получил +1 к мотивации. Программирование не ограничено одними только ЭВМ. Практически в любом проекте существует масса форм инжиниринга. Тим билдинг, маркетинг — это тоже программирование.


      1. S-e-n
        07.06.2019 15:02
        +1

        Тим билдинг, маркетинг — это тоже программирование.

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


        1. StanEgo Автор
          07.06.2019 16:29

          Если вы программист, то прекрасно понимаете силу и важность абстракций. Предположим, перед вами REPL-интерфейс к некоторому устройству, которое понимает определённые команды. Что дает возможность составить для него программу. Но потом выясняется, что за этим интерфейсом пряталась не ЭВМ, а человек или таракан. Перестает ли после этого написанная программа быть таковой?

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


          1. S-e-n
            08.06.2019 09:54

            В случае с людьми у вас никаких гарантий, что «Eval» произойдёт как вам надо. Я бы не стал говорить о программировании в таких условиях.


            1. StanEgo Автор
              08.06.2019 17:23

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


              1. S-e-n
                08.06.2019 18:06

                Кажется дискуссия ушла немного не туда. Мне было непонятно, что вы подразумеваете под программированием в тимбилдинге и маркетинге, и что называете программой в таком случае. Программируете людей (на дружбу/покупку), и слова и действия, направленные на это, называете программой?


    1. amarao
      07.06.2019 14:04

      А почему вы его называете "код"? Секция в исполняемом файле называется .text, и там находятся коды для аппаратного интерпретатора. Что именно делают эти коды решает разработчик процессора, который на самом деле с помощью нескольких трюков обманывает кусок кремния, заставляя его притвориться интегральной схемой.


      Я не совсем понимаю разницу между ассемблером x86 и лисп-программой для лисп-компьютера.


      Более того, чем ниже по стеку вы спускаетесь, тем более примитивным всё становится.


    1. vav180480_2
      07.06.2019 14:52
      +1

      Так то есть недвоичные ВМ если чо, ЕСЛИ ЧО.


  1. excoder
    07.06.2019 12:00

    Нет причин проводить водораздел между прикладным и фундаментальным. Гораздо чаще, чем кажется, задачу можно удовлетворительно решить только на более глубоком уровне её понимания, а не одним лишь весёлым кодингом и созданием 100500+ нового JS фреймворка. С другой стороны, склонность людей из академической среды избегать реального мира также широко распространена и требует работы. Людей, эффективно оперирующих на стыке — решающих реальные ПРИКЛАДНЫЕ задачи на адекватном ФУНДАМЕНТАЛЬНОМ уровне — сотые доли процентов в нашей индустрии.