Category: it

Category was added automatically. Read all entries about "it".

moose, transparent

полвека паскаля

А еще в прошлом году, оказывается, исполнилось 50 лет языку программирования Паскаль. В связи с этим Никлаус Вирт (дай бог долгой жизни) опубликовал ностальгически-историческую статью 50 Years of Pascal, которую я прочитал с интересом и рекомендую. Для сравнения: Паскаль появился в 1970-м году, язык Си в 1972-м, Питон в 1991-м, Java (первый публичный релиз) в 1996-м.

Я научился программировать в самом конце 80-х; как и многие в то время, я сначала научился писать на Паскале (и много работал в Turbo Pascal, потрясающе быстрой и удобной для того времени - да и для нашего, если подумать! - интерактивной среде), и только пару лет спустя перешел на Си. Время от времени задумывался о сравнительной популярности этих языков. Если вас тоже интересует этот вопрос, то одним из важнейших исторических документов, который и сейчас интересно перечитать, это Why Pascal is Not My Favorite Programming Language (1981) Брайана Кернигана.

Не все, о чем пишет Керниган, одинаково важно, и мне кажется, что его критическое эссе не дает достаточно полного представления о том, насколько Си и Pascal в те годы были на самом деле похожи - сходств намного больше, чем различий, если сравнивать с другими популярными тогда языками. Мне кажется, что наиболее существенными причинами того, что к середине 90-х Паскаль почти полностью перешел в нишевый статус (да, я помню про Дельфи, но это исключение, которое подтверждает правило) была относительная гибкость Си, легкость, с которой по сравнению с Паскалем в нем можно нарушать абстракции, и благодаря этому - то, как Си естественным образом был и системным языком, и языком для приложений более высокого уровня. Ну и C++ подключился в какой-то момент. Как-то так.
moose, transparent

oracle vs google

Еще пару недель назад американский Верховный Суд вынес окончательный вердикт в долгой судебной тяжбе - почти 11 лет! - между Oracle и Google.

В 2010-м году Oracle купил Sun Microsystems, главным образом - чтобы завладеть копирайтами и патентами, связанными с языком Джава. Уже через полгода после этой сделки Oracle подал в суд на Гугл за нарушение копирайта и патентов на Джаву в операционной системе Андроид для телефонов, тогда еще весьма новой. Главной претензией было то, что Гугл использовал в Андроиде программные интерфейсы (API) стандартных библиотек Джавы, чтобы программисты могли писать приложения для Андроида на Джаве. Гугл написал заново код, выполняющий функции этих интерфейсов, так что тут не было вопроса о копирайте (кроме одной крохотной и тривиальной функции rangeCheck, о которой в итоге написано в тысячи раз больше страниц судебных заседаний, чем в ней есть кода). Но Оракл утверждал, что сами заголовки функций, сам программный интерфейс - то, как они называются и какие аргументы принимают итд. - подлежит копирайту, и нельзя без разрешения Оракла этот интерфейс копировать и заново реализовывать.

У этого иска была долгая и запутанная история, он тянулся годами от инстанции к инстанции. Ему повезло с первым судьей, который им занимался, и вынес обоснованное решение (по слухам, судья научился программировать на Джаве, чтобы разобраться в сути вопроса); но потом апелляционная инстанция отменила решение и завертелось заново. В конце концов дошло до Верховного Суда, и совсем не было очевидно, что он скажет. При этом - и это то, что мне интересно в этой истории - я не знаю ни одного программиста, который не ощущал бы инстинктивно полную бредовость претензий Оракла в этом иске. То есть, оставив в стороне легализмы и формализмы, если спросить себя, должен ли API библиотеки, платформы, языка подлежать копирайту, так, чтобы нельзя было без спроса написать функции с такими же названиями и аргументами, но собственным новым кодом - и всем, кто собственно знает вкус устриц, т.е. имел дело с API и их реализацией, понятно, что это полный бред. Ну наверное не 100% программистов так считают, но близко к тому. Но стоит отойти чуть в сторону от профессии, и опросить, не знаю там, продакт менеджеров, и думаю, что уже не будет такого единогласия; что уж говорить об адвокатах или судьях.

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

При этом, если бы Верховный Суд США вынес неправильный вердикт, и сказал бы, что API подлежит копирайту и не может быть "добросовестно использован" (fair use, исключения, позволяющие без разрешения использовать даже защищенные копирайтом вещи - например, небольшие цитаты или сатирические обработки подпадают под это) - тогда вредные последствия вообще во всех областях программного обеспечения (не только опенсорс!) были бы поистине гигантскими, подозреваю. В итоге ВС не постановил, подпадают API под копирайт или нет, но сказал, что в любом случае их использование является "добросовестным" и разрешенным. Так что все хорошо, что хорошо кончается.
moose, transparent

об утечке из фейсбука и моей фамилии

Пару недель назад в публичный доступ попала массивная утечка данных из Фейсбука: имя, фамилия, и номер телефона (плюс еще немного по мелочи, но не содержимое постов или что-то в этом духе) 500 миллионов пользователей - примерно 20% всех пользователей ФБ.

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

Моя фамилия - Воробей, но я давно привык к тому, что ее часто неправильно пишут Воробьев, потому что Воробьев - намного более частая фамилия, чем Воробей, по причинам, которые мне не вполне понятны. Но как минимум я смог это проверить по этой утечке из фейсбука. И действительно, суммируя по разным написаниям этих фамилий, а также женскому варианту (Воробьева), я посчитал, что кол-во людей с фамилией "Воробей" в этой базе данных из Фейсбука примерно 4% от кол-ва людей с фамилией "Воробьев/а", в 25 раз меньше.

Не сказать, чтоб супер важное исследование или супер полезные данные, но если кому-то нужно что-то такое, то да, это пол-миллиарда имен-фамилий-стран-городов-телефонов.
moose, transparent

о премии ульмана и соразмерности

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

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

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

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

Надо сказать, что позиция Ульмана как минимум спорная, в том смысле, что можно спорить и за нее, и против, в разных обстоятельствах. Иногда бывает, скажем, что какой-нибудь западный профессор отказывается иметь дело со студентом из Израиля только потому, что профессор очень не любит Израиль (в 2003-м году в Оксфорде одного профессора за это наказали). Мне это кажется неправильным и несправедливым; думаю, иранцам то же самое кажется в случае Ульмана. Разумеется, есть разница между Израилем и Ираном, но тем не менее. С другой стороны, можно представить, что играет роль, собирается студент из Ирана изучать теоретическую информатику - или, скажем, ядерную энергетику.

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

Я написал об этом два подробных комментария по-английски в блоге Скотта Ааронсона, но если пересказать вкратце, то примерно так. Способность культуры возмущения создать скандал вокруг чьих-то слов опирается на три фактора:

- все нужно рассматривать в свете групповых идентификаций. Если кто-то ругает чернокожего человека, значит, он ругает и оскорбляет всю расу (и, естественно, расист). У Ульмана прикипает на тему иранского режима, и его тирады обращены именно к подданным режима (у него нет проблем с иранцами, выросшими в Америке или сбежавшими от исламской революции). Но в петиции он представлен ненавистником иранцев вообще, как народа. Это не такая выигрышная тема в дискурсе возмущения, как ненавистник чернокожей расы или женщин или ЛГБТ. Но все равно достаточно серьезная заявка.

- членам "обиженной" группы приписываются абсурдные, эпические уровни уязвимости и болезненной восприимчивости. Недавно один из редакторов медицинского журнала JAMA в США подверг сомнению на каком-то подкасте существование "системного расизма". Поднялся дикий скандал, главреда на время отстранили от обязанностей, журнал "расследует", как такое могло случиться, а пресса говорит о "не поддающемся оценке уровне боли и травмы, который причинили эти слова чернокожим врачам и пациентам". В случае Ульмана нам нужно представить себе студента из Ирана, который посылает письмо незнакомому профессору, надеясь получить поблажку в приеме на аспирантуру; получает от него неприятный ответ, в котором написано, что профессор не имеет отношения к приему, но если бы имел, то не помог бы ему; и это настолько его шокирует, что он не подает документы в Станфорд, и в другие американские университеты тоже, вообще бросает информатику и идет мыть посуду у себя в Иране, и вот мир потерял будущего гениального ученого, и так десять раз, и все из-за этого проклятого Ульмана.

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

компьютерные мемы

The Cursed Computer Iceberg Meme - весьма забавная коллекция мемов (со ссылками), многие из которых будут знакомы компьютерщикам и особенно программистам. На каждую фразу можно нажать и пойти на источник.



Порядок примерно такой: чем выше, тем более известные и мейнстримные, чем ниже, тем более эзотерические и извращенные. Так я понял, по крайней мере. Из верхней категории "above the iceberg", например, я знаю вообще все (т.е. узнаю, что это такое, по названию, даже не идя по ссылке), а из самой нижней - только одно название. Всего из 180 мемов я узнал сходу 75 - стало интересно проверить (их список в тексте можно скопировать из формы для голосования о том, какие вы знаете). Я уже сходил почитать про десяток-другой тех, которые не знал - некоторые очень интересные и забавные.
moose, transparent

с чего вызывается функция

(для программистов)

How C++ Resolves a Function Call

Увлекательный пересказ того, как компилятор C++ находит правильную функцию, которую надо вызвать, когда в коде вызывается функция. Как шаблоны/перегрузки/пространства имен все друг с другом переплетаются итд.

К некоторому своему смущению понял во время чтения, что я не знал про такую штуку, как ADL - по крайней мере не помню, чтобы хоть когда-то сознательно пользовался или учитывал при чтении кода. ADL - это когда написан вызов foo(bar), а переменная bar при этом принадлежит типу из какого-то пространства baz::, и сам этот факт заставляет компилятор брать в качестве кандидата функцию baz::foo, если такая существует - хотя вызов происходит вне этого пространства.

Теперь, после прочтения этой записи (а также супер-подробного разбора ADL) понимаю, что именно так работает поддержка << в iostream с аргументами из пространств типов; или, например, std::swap. Так что выходит, что я много раз пользовался ADL, просто не задумывался над тем, как компилятор находит мою функцию. Чувствую себя, как герой Мольера, узнавший, что всю жизнь говорил прозой.
moose, transparent

нейронные сети имени козьмы пруткова

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

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

Очень смешно.



Если на клетке слона прочтешь надпись "буйвол", не верь глазам своим.
moose, transparent

эта вежливая культура опенсорса

Вот небольшой уютный ламповый автоматический репликатор базы данных SQLite, интересная идея (интересно только программистам): https://github.com/benbjohnson/litestream

Но больше, чем сама программа, меня заинтересовало объяснение автора о том, что он не хочет, чтобы ему присылали изменения исходников - что для починки багов, что для новых возможностей. "Открытые исходники, но не открыто для совместной работы" (Open-source, not open-contribition). Он там объясняет, что в прошлом его опенсорс проекте у него случилось нервное истощение от того, что ему присылали кучу запросов с кодом, на которые у него уходило невозможное совершенно количество времени. И в конце концов он тот проект прикрыл, а в этом решил заранее заявить: ничего не принимаю.

Почему вообще нужно такое заявление? Ну не хочешь принимать чужой код, и не принимай, никто не может тебя заставить. Мне кажется, что дело в том, что практически весь опенсорс перешел на github.com, а там царит культура pull request. Любой может открыть в твоем проекте pull request и попросить тебя принять код, и ты конечно ничего не обязан сделать, но ожидается, что ты постараешься отнестить благосклонно.

Когда-то в доисторическую эпоху, до Гитхаба, если я скачивал откуда-то в интернете опенсорсную библиотеку или программу, у меня не было автоматического ожидания, что я могу послать автору патч и он с ним станет что-то делать. Я искал какое-то README в архиве и смотрел, что там написано на эту тему - если ничего, то мог спросить у автора почтой, перед тем, как слать код. Теперь это все кажется лишним: вот же он, репозиторий на Гитхабе, посылай pull request и все.

Проблема решается легко: надо всего лишь сделать так, чтобы владелец репозитория на Гитхабе мог запретить в нем pull requests. Тогда и объяснять ничего не надо, видно, что закрыто тут. У Гитхаба пользователи выпрашивают эту возможность последние лет семь. Гитхаб аккуратно отвечает, что да-да, мы планируем сделать, и не делают. При этом ясно же, что для них это более или менее тривиально сделать. Им просто наплевать или это хитрая политика такая?

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

advent of code

Народ (программисты, стремящиеся и близлежащие), а вы помните еще про Advent of Code, милое такое ежегодное состязание с не очень сложными задачками? Если не пишешь код все время, а форму хочется сохранять, это по-моему хорошая штука. Или если учишься программировать, тоже тогда.

Оно уже с начала декабря идет, конечно. Я сегодня увидел ссылку на 18-ю задачку там, вспомнил, что есть такое, понравилось, милая задачка, сокращать арифметические выражения. Давайте тряхнем стариной, или новизной, или как еще там? Короче, если уже решили ее, или захотите попробовать, кидайте в комментарии ссылки на ваш код (на pastebin/github/gitlab/где угодно), на любом языке. Если написали обе части (там дают доступ ко второй, если на первую даешь правильный ответ), кидайте обе. Не стесняйтесь, мы все уже все видели! Завтра вечером обещаю кинуть свой код (я уже написал, но не хочу начинать с него сразу).
moose, transparent

об искусственном интеллекте и целеполагании

Скопирую сюда свой комментарий из фейсбука Алексея Цветкова, из дискуссии о возможных рисках от развития сверхразумного искусственного интеллекта. Цветков комментирует книгу Ника Бострома "Superintelligence":

Я уже писал, что читаю Superintelligence Николаса Бострома, и вот наконец дошел до самого интересного места - до обещанного анализа мотивов, по которым AI покончит с нами и примется переустраивать мир по своему разумению. [...] Об этих мотивах у Бострома написано совершенно невнятно. Допустим, расхожий вариант бунта (метафора конечно): мы создаем сверхразумную машину, которая изготовляет конторские скрепки. Она сама себя совершенствует и принимается делать эти скрепки из всего, что ей попадется под руку, в том числе из нас, превращать всю ткань вселенной в скрепки. Если это сверхразум, то вы меня извините. Но заметьте, что мотив, которым она руководствуется, изначально вложен в нее нами, он не возник сам по себе.

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

Я попытался прояснить, как я понимаю этот аргумент об опасности "бунта сверхразума":

Мне кажется, можно говорить отдельно о "воле" и "целеполагании". Воля - это сознательно стремление добиться какой-то цели, целеполагание - сознательное формулирование этой цели.

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

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

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

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

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