В колонке для AIN.UA Вадим Медведев, партнер юридической фирмы АVELLUM, сравнивает базовые навыки в программировании и юриспруденции и рассказывает об общих тенденциях между ними.
Спустя два года после покупки я наконец прочел книгу Quantum computing for everyone. В то же время алгоритмы Facebook предложили мне почитать колонку о математических основах программирования, где автор задается вопросом «зачем программисту математическая база, и какие разделы пригодятся на практике». Этот вопрос давно меня интересовал в контексте того, могут ли трехмесячные курсы «войти в IT» позволить стать программистом на уровне выпускника того же КПИ и его пониманием матанализа, аналитической алгебры, теории чисел и прочих радостей высшей математики. Что этот вопрос значит в практической плоскости?
О картинках, чёрном ящике и надстройке
Нужно ли программисту, работающему над обработкой изображений, понимание того, что любое изображение — это не просто набор единиц и нолей, а дискретное ограниченное векторное пространство? Важно ли ему знать, что каждая точка изображения — суть вектор? И что еще интереснее, что размерность такого пространства для картинки в формате .img (старый формат очень большого размера и универсально совместимый) в цветовой схеме RGB составляет не 2, а 5? Как вообще можно представить пятимерное пространство, если мы живем в четырёхмерном пространстве (да, именно так, не в трёхмерном)? А чтобы менять размеры картинки, нужно преобразовывать пространство, проводить скалярное умножение векторов, их сложение и многое другое?
Как отметил автор колонки, многим программистам в наше время не нужны все эти глубокие знания не потому, что они не нужны как таковые, а потому что новые поколения «стоят на плечах титанов». Предыдущие поколения уже превратили этот сложный материал в набор более интуитивных и «дематематизированных» понятий. Вместо матриц и множеств программисты теперь оперируют классами и базами данных. Для того, чтобы создавать надстройки на этот аппарат, больше не нужно его понимать – достаточно знать синтаксис (а иногда даже этого не нужно).
Много стандартных функций стали просто «чёрными ящиками» — вы знаете, что получите на выходе, но не знаете и не хотите знать, что происходит внутри. Это чем-то похоже на то, как мы, пользователи, используем функцию «применить фильтр» и не знаем, как это меняет «тон» нашего селфи. То есть многие программисты, на самом деле, находятся лишь на один условный уровень глубже в понимании происходящего, чем «простые пользователи».
О ботах и комбинаторике
Уже не новое течение в цифровых технологиях, чат-боты (и бот-конструкторы), создаёт еще один уровень понимания где-то между программистом и «непрограммистом». Это люди, которые с помощью максимально упрощенных утилит алгоритмизирования создают «программы» в чатах, даже не зная синтаксиса какого-либо языка программирования (как я и говорил, это не всегда обязательно). Вспоминаю ситуацию, когда мы делали чат-бот для анализа контролируемых иностранных компаний. В результате долгих страданий двух юристов мы получили алгоритм из 8 шагов, описывающий необходимый нам упрощенный базовый анализ КИК — захочет ли Украина получить налоги с вашей компании-нерезидента.
После двух итераций проверки бота и внесения правок в алгоритм, подрядчик, помогающий нам с превращением алгоритма в бот, предложил: «Вы покликайте и проверьте, нет ли ошибок в реализации». Я был умилен таким предложением. Ведь наш алгоритм состоял из 8 шагов. Учитывая, что каждый из шагов имел 2 варианта ответа, в результате это давало 256 вариантов комбинаций входящих данных. На вопрос о том, правильно ли я понимаю, что наш «программист» предлагает проверять их перебором вместо проверки правильности алгоритма, я получил для себя два ответа — ответ подрядчика о том, что он проверит алгоритм, и свой внутренний ответ о глубине понимания ситуации (знания правил комбинаторики) со стороны подрядчика.
О квантовых вычислениях и квантовом доминировании
Сейчас ситуация радикально отличается в сфере квантовых вычислений. Сама суть квантовых вычислений настолько глубоко погружена в математический аппарат, что без его понимания нельзя создать квантовый алгоритм (по крайней мере, на современном этапе). Нельзя просто взять функцию как «чёрный ящик». Для создания квантового алгоритма нужно точно знать, как превратить необходимые вам операции в применение операторов к матрицам векторов. Без этого программирование не станет квантовым и вы не сможете использовать ту самую «суперпозицию», которая и даёт возможность для квантового доминирования. Без этого квантовый компьютер сможет делать только то, что и обычный двоичный компьютер.
Исходя из моего базового уровня понимания, разница между возможностями квантового и двоичного вычисления лежит в том, с чем именно вы проводите вычисление, а не каким образом. При квантовом вычислении операции происходят не с одним значением переменной, а с множеством значений, выраженным матрицей векторов. В этой матрице заложено сразу несколько «вариантов» значения переменой (то есть происходит та самая «суперпозиция» — накладывание и одновременное вычисление с разными вводными). Это как если бы вы вместо того, чтобы зарисовывать японский кроссворд по клеточкам, сразу перетасовывали десяток уже зарисованных кроссвордов с разной вероятностью правильности.
Об алгоритме Шора и глубине понимания
Читая первые 150 страниц книги о квантовых вычислениях «для всех», я вспоминал операции с матрицами и векторами (и открыл для себя новую нотацию векторной записи). Прочитав и осознав приведённые примеры трёх квантовых алгоритмов, описанные как базовый, «со звездочкой» и «с 2-мя звездочками», я таки добрался до того, о чем постоянно упоминают в новостях, касающихся квантовых вычислений — глобального взлома паролей.
Один из наиболее распространенных криптографических алгоритмов в интернете — это RSA. Его «сила» в том, что для взлома этого алгоритма необходимо совершить подбор двух простых чисел, которые в результате умножения дают некое число N длиной более 1500 битов (то есть более 450 десятичных знаков).
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
Вот 450 знаков. Это базовая длина ключа безопасности в вашем, например, клиент-банке. А для дешифровки нужно подобрать ключ, являющийся произведением двух простых чисел. Это задача субэкспоненциальной сложности. То есть практически решить ее средствами стандартных двоичных вычислений за разумное время невозможно. А если еще проще, то вариантов столько, что решить задачу и найти ключ обычный компьютер не может.
Интересно, что ситуация радикально отличается для компьютера квантового. Шор разработал алгоритм, который делает возможным решить эту задачу с ограниченной вероятностью ошибки. То есть даже в квантовом вычислении на данный момент решить ее абсолютно точно нельзя. Но имея возможность определять точность алгоритма и вероятность ошибки, можно свести эту вероятность к значениям, которые близки к вероятности сбоя электроники. Таким образом, решение с ограниченной вероятностью ошибки в практической плоскости дает нам решенную задачу.
В 2018 году квантовый компьютер реализовал алгоритм Шора для взлома ключа в 31 знак. Это на порядок меньше, чем текущие ключи защиты, но и возможности квантовых компьютеров растут. Так что вот он, «ключ от всех цифровых дверей».
Однако я был немного разочарован описанием алгоритма Шора. Автор начал описание с того, что привёл с десяток более сложных тем высшей математики, в которых нужно разбираться, чтобы дальнейший разговор об алгоритме имел смысл. То есть для того, чтобы просто понять, что предложил Шор, нужно уже быть «по уши» в математических основах программирования. А для того, чтобы создать что-то подобное, нужно продолжать создавать такие математические основы — но для квантовых вычислений.
И возвращаясь к вопросу о глубине понимания:
- чтобы писать чат-бот, не нужно знать синтаксис языка программирования,
- чтобы программировать на объектно-ориентированном языке на базовом уровне, не нужно понимать линейную алгебру и начала матанализа.
НО
- чтобы действительно понимать, что вы делаете на этом языке программирования, уже нужно знать математическую основу программирования,
- чтобы писать программы для квантового компьютера, нужно создавать математическую основу программирования.
При чем здесь римское право
Упражнение с анализом глубины понимания можно попробовать экстраполировать на юристов.
Есть юристы, которые могут найти шаблон и поменять в нем реквизиты. Сейчас их работа автоматизируется и алгоритмизируется, а сами они работают в формате «$10 за шаблон». Они похожи на программистов, которые пишут боты и не знают комбинаторики.
Есть юристы, которые могут написать договор исходя из «свободы договора» или «как напишем, так английский суд и решит». Это уже похоже на выпускника курсов «войти в ІТ», который выучил условный «синтаксис языка договоров». И «не нужно» знать, что английское договорное право не допускает взыскания штрафов в чистом виде, или что в украинском праве нельзя взыскивать пени по натуральному (неденежному) обязательству.
Есть юристы, которые знают, что по английскому праву нельзя взыскать штраф, но стороны могут наперёд договориться о порядке оценки убытков нарушением договора (и частично такие «исчисленные» убытки могут выполнять для сторон такую же экономическую функцию, как договорные штрафы). Это уже похоже на понимание математической основы программирования — того, как работают написанные функции и что в них происходит.
А есть юристы, которые знают, что все системы, основанные на римском праве, исходят из необходимости соблюдения договора (pacta sunt servanda), но при этом англо-американские системы оперируют в формате «договоры пишутся на случай их нарушения». И в первом случае суды могут принуждать стороны к выполнению договора (или наказывать за его нарушение). Во втором же случае суды только компенсируют потери пострадавшей стороны. И если в результате нарушившая сторона оказалась в плюсе (смогла продать свой товар дороже, чем расходы не получившего товар покупателя на замену товара), то в итоге общество выиграло. Соответственно, исходя из этого можно создать «формулу» иска (как ее назвали бы римские преторы), которая сработает именно в вашей ситуации.
Такое глубокое понимание права и его истоков не нужно при покупке канцтоваров. Но если вы создаёте фонд прямых инвестиций, хотите взыскать убытки с недобросовестного менеджера или разрешить корпоративный конфликт — ваша задача по сложности куда ближе к алгоритму Шора, чем к созданию чат-бота.
Автор: Вадим Медведев, партнер юридической фирмы АVELLUM