Отнесся с пониманием как пишется

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

В местах лишения свободы стала циркулировать необычная для криминального сообщества бумага. Подписанное некой «массой воров» сообщение, в блатном мире именуемое «прогоном», призывает не понижать в статусе тех заключённых, кого насиловали тюремные активисты в учреждениях ФСИН. Свидетельства о целых конвейерах сексуализированных пыток с помощью посторонних предметов вроде древков от швабр или кипятильников правозащитники из независимого комитета Gulagu.net предавали огласке из целого ряда российских регионов. Гомофобными традициями в тюремной среде России, существующими более века, стали активно пользоваться не только носители блатной культуры, но и администрации СИЗО и колоний, чтобы решать свои текущие бюрократические задачи. Появление же революционного «воровского декрета» грозит ломкой устоявшихся за десятилетия арестантских «скреп».


«Можно только сочувствовать»

Фотокопия «прогона» появилась в разных соцсетях несколько дней назад. В составленном от имени «массы воров» рукописном документе говорится, что люди, которых в результате пыток «насиловали и унижали швабрами и дубинками, не являются униженными». Они, как сказано в обращении, могут оставаться «в массе» заключённых. Таким образом, это воззвание накладывает табу на «автоматический» перевод жертв изнасилований, совершённых в результате пыток, в разряд самой непривилегированной группы неформальной, но существовавшей как минимум с начала XX века тюремной иерархии.

Мы, воры, не говорим вам есть и пить с одной посуды, но и отверженными их делать не надо <…>. Унижать и глумиться над ними — это не людское, ибо по-человечески им можно только сочувствовать, — говорится в обращении.

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

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахPravda Komsomolskaya/Russian Look/Global Look Press

О том, что эта бумага циркулирует по местам лишения свободы, NEWS.ru подтвердил основатель независимого комитета против коррупции и пыток Gulagu.net Владимир Осечкин, а также журналистка и член президентского совета по развитию гражданского общества и правам человека (СПЧ) Ева Меркачёва.

В тюремной системе России произошли необратимые позитивные изменения — по тюрьмам, колониям и СИЗО в России распространяется бумага, в которой чёрным по белому дословно говорится о том, что никто не должен и не имеет права унижать мучеников, пострадавших от пыток… Что бы все эти оперативники и их негласные агенты — «капо»-разработчики — ни творили в отношении человека, никто и ни при каких обстоятельствах не сможет перевести его в самую низкую категорию в среде заключённых, никто не сможет унизить его. По сути, это революция в тюремной системе.

4e09d87e 37a6 11ea a1e4 fa163e074e61 80

Владимир Осечкин

основатель правозащитного проекта Gulagu.net

По словам Евы Меркачёвой, эту бумагу ей «переслали люди, очень хорошо знакомые с криминальным миром». Журналистка и правозащитница не исключает, что у данного «прогона» есть «большой охват» по колониям и тюрьмам. Тем более что в нынешних условиях ознакомить людей за решёткой с содержимым рукописи можно через адвокатов либо благодаря мобильным телефонам, нелегальный доступ к которым есть у многих заключённых.

Судя по смыслу этой бумаги, она означает, что не нужно относиться уничижающе к тем осуждённым, которые подверглись пыткам и были изнасилованы. Про эту проблему нам говорили раньше те люди, ставшие жертвами подобного насилия. Ведь почему пытки снимали на видео? Видеорегистрация изнасилований нужна администрации и активистам для того, чтобы потом шантажировать показом ролика, после чего человек становится «опущенным» и остаток срока проводит в жутких условиях. В результате жертвы пыток были готовы идти на сделку со следствием или давать деньги, а если они этого не делали, видео демонстрировали другим осуждённым. И даже понимая, что с человеком совершили такое насилие, арестанты его сторонились. Если мы говорим про блатную культуру и воровские понятия, то они очень распространены.

e7b76104 2dc1 11ec ab60 96000091f725 80

Ева Меркачёва

журналистка, член СПЧ и ОНК Москвы

В качестве примера она напомнила, как во время посещения одного из СИЗО правозащитники пообщались с пожилым мужчиной, к которому руководство учреждения подселило представителя низшей тюремной касты. С ним он поел из одной тарелки, оказавшись из-за этого в низшей касте. Этот мужчина, как вспоминает Меркачёва, сам себе постелил матрац на пол в углу камеры и на вопросы, зачем он это сделал, отвечал, что «знает своё место».

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахPravda Komsomolskaya/Russian Look/Global Look Press

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

Эта справка пошла в колонию, куда его должны были этапировать. В итоге он там не смог попасть в отряд и ночевал на улице. Это просто дикость! А ещё он рассказывал, что после того как эта бумага была подготовлена, сотрудник учреждения зачитал ему лекцию о мужеложстве. Это всё говорит о том, что [администрации некоторых учреждений ФСИН] используют криминальные понятия, пытаясь таким образом управлять некоторыми осуждёнными. Всё это идёт не от криминала, а от администраций отдельных учреждений, — констатирует Меркачёва.

Таким образом, по словам члена СПЧ, «можно расправляться с теми, кто пишет много жалоб, в том числе в ЕСПЧ», а также мстить за отказы подписывать явку с повинной, получить которую от того или иного арестанта попросило администрацию следствие.

Итог переговоров

По данным издания Baza, обращение якобы написали на сходке криминальных лидеров с участием вора в законе Захария Калашова, известного как Шакро Молодой. Не исключено, что составители «прогона» не стали ставить свои личные автографы под ним, опасаясь преследования по ст. 210.1, которая предусматривает наказание за занятие высшего положения в преступной иерархии.

Специалист по истории криминального мира Олег Иванец сомневается в подлинности «прогона». Такие документы, по его словам, являются руководством к действию для криминального мира, но в данном случае таковым обращение станет, если его подлинность подтвердят «не какие-то чиновники или общественники, а именно воры». А тут есть две проблемы.

Первая проблема — в воровском мире, который сейчас разобщён и во многом принял гротескный вид, есть две группы, которые между собой находятся в состоянии лютой ненависти. Так от кого же этот «прогон»? Наличие совместного «заявления» абсурдно. От слова «совсем». И вот тут возникает вторая проблема — в «прогонах» всегда, по крайней мере раньше было так, в заключительной части пишется: «С жиганским приветом к вам…» — и далее перечисление самих воров. С конкретным указанием воров, подписавших прогон… Где это здесь? По крайней мере, в выставленном в «Базе» «прогоне» этого нет… Отсюда и непонятность действий сторонников [воров в законе Тариэла] Ониани или Деда Хасана. Все просто в недоумении будут. На данный момент у меня эта писулька вызывает скепсис — от кого она? <…> Считаю, что если вышеозначенный «прогон» окажется настоящим, то это согласовано с властью. И тогда он пойдёт в массы. Если он окажется настоящим, но не согласован с властью, то через какое-то время мы про него забудем, и он исчезнет. Но лично у меня вообще вызывает большой скепсис его «легитимность». Уж больно он «либерален» для консервативного криминалитета.

6da258bc 5dad 11ec a20e 96000091f725 80

Олег Иванец

блогер, специалист по истории криминального мира

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахViktor Chernov/Russian Look/Global Look Press

Говоря о воровских понятиях и блатной культуре, собеседник NEWS.ru отметил, что они «уже не те, что в эпоху СССР». И это вполне ожидаемо в силу изменения криминалитета за последние десятилетия. Иванец пояснил, что понятия — это не догма, выработанная криминальным миром, а своего рода «итоговый кодекс» переговоров с властью: «Мы вам разрешаем то и то, а в ответ ждём от вас того и того…» Потому блатнаые «законы» и культура всецело зависят от времени и «итогов переговоров».

Красное и чёрное

Так называемая блатная культура окончательно оформилась в СССР к началу 1930-х годов и продолжает существовать по сей день, подразумевая существование в местах лишения свободы соответствующих иерархий. Самой привилегированной и малочисленной их частью являются воры в законе, а на дне находятся так называемые «опущенные». В их число входят гомосексуалы либо мужчины, которые были изнасилованы. По тюремным понятиям они могут выполнять самую грязную работу, вроде уборки территорий или чистки туалетов, должны пользоваться отдельной посудой, питаться и жить отдельно от основной массы заключённых, а если те содержатся с ними в одной камере, то «имеют право» спать на полу.

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахPravda Komsomolskaya/Russian Look/Global Look Press

Тюремные касты существовали задолго до появления воров в законе, о чём можно судить по автобиографической книге русского революционера и литератора Александра Воронского «За живой и мёртвой водой». В ней он описывает, как в самом начале XX века, будучи арестованным по политическим мотивам, сидел в знаменитом Владимирском централе, где некоторые заключённые «торговали собой», получая в качестве оплаты не только деньги, но и махорку, чай, сахар. К ним относились «с гадливым презрением».

В виде низшей касты блатного мира «опущенные» оформились в 1940–1950-е годы как результат стремления рецидивистов удержать своё господствующее положение в тюремной иерархии, а также попыток лагерного начальства установить свои порядки в ходе так называемой «сучьей войны» между ворами в законе и уголовниками, допускающими сотрудничество с властями.

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахPravda Komsomolskaya/Russian Look/Global Look Press

Несмотря на декларируемую блатным миром радикальную гомофобию, сами «авторитеты» (или активисты в учреждениях, где внутренний распорядок контролирует администрация) могут прибегать к гомосексуальному половому акту для поддержания внутритюремной иерархии: неугодного заключённого «опускают», чтобы закрепить социальные роли «паханов» и «петухов», пишут исследователи. Как отмечают Данил Корецкий и Вадим Тулегенов в книге «Криминальная субкультура и её криминологическое значение», наиболее широкое распространение мужеложства в местах лишения свободы и увеличение количества «опущенных» имело место в 1980-е годы. Это происходило на фоне прекращения использования труда заключённых на хозработах не в колониях, а в сторонних организациях, что лишило возможности пользоваться услугами секс-работниц и заводить знакомства с сотрудницами, работающими на близлежащих стройках.

«Воровской декрет»: пытки грозят совершить переворот в тюремных укладахPravda Komsomolskaya/Russian Look/Global Look Press

Как рассказывал NEWS.ru Владимир Осечкин, в последнее время в большинстве СИЗО и колоний России выстроена схема управления спецконтингентом под говорящим названием «галоша». Раньше учреждения ФСИН делились на так называемые «чёрные» и «красные». В условно «чёрных» реальная власть над заключёнными и сотрудниками была у воров в законе, в «красных» — у оперативников и активистов из секций дисциплины и порядка. Теперь же, по словам правозащитника, в местах лишения свободы установлены воровские понятия и соответствующая иерархия, но на привилегированных позициях «смотрящих» и «положенцев» оперативники при помощи их агентуры назначают управляемых людей.

Судя по разоблачениям Gulagu.net, к изнасилованиям заключённых в ряде учреждений ФСИН причастны так называемые активисты-разработчики, сотрудничающие с администрациями. В частности, огласке были преданы случаи подобного рода насилия в саратовской ОТБ-1, иркутском СИЗО-1 и других местах лишения свободы. Вывезенные бывшим заключённым Сергеем Савельевым из России, а затем обнародованные видеосвидетельства пыток в Саратове привели к уголовным делам против сотрудников тюремного ведомства, а также к увольнению главы ФСИН Александра Калашникова, который по официальной версии ушёл в отставку по собственному желанию.

Накануне стало известно, что из России вывезли очередной видеоархив на 200 гигабайт с пытками заключённых. Речь идёт о видеозаписях из пенитенциарных заведений Красноярска, Забайкалья и Приморского края.

После того, как глава Следственного комитета Александр Бастрыкин в своей статье обвинил рэпера Моргенштерна в торговле наркотиками в соцсетях, многие задались вопросом, не ожидают ли неприятности и других рэперов. 30 ноября в комитете по культуре Госдумы назвали двух рэперов, которые не пропагандируют наркотики и, значит, бояться им нечего – Басту и Оксимирона.

Саша Блюз

Госдума назвала рэперов, которым не грозит статья за пропаганду наркотиков: баста и оксимирон. всё.

«Музыка, на которую российские власти традиционно обращали мало внимания, куда меньше, чем на кино или акционизм, например, за последние недели попала под каток [удивительных] кокаиновых инсайтов нашего начальства. Высокопоставленные геи запрещают обычных, педофилы в церкви клеймят педофилов на паперти, а наркоманы пишут законы о запрете пропаганды наркотиков.

Проблема в том, что теперь это касается хип-хопа, последнего оплота реальности в океане кастрированного контента. Со стриминга удаляют острые треки, постфактум заглушают названия наркотических средств в давно известных хитах (послушайте трек «Девочка с каре» на любой платформе), штрафуют рэпперов за пропаганду. Пока речь идет о штрафах, и разово заплатить 100к Гуфу, Моргенштерну или Ог Буде за право петь свою музыку — не проблема. Проблема в том, что эти 100к — не штраф, а предупреждение. И за последний год в России язык предупреждений научились понимать абсолютно все.»

Поклонники Окси всё равно вздохнули с облегчением. Но не тут-то было. В воскресенье, 5 декабря, стало известно, что Бастрыкин взялся и за Оксимирона.

Из видных «государственников» на новость отреагировал лишь политолог Сергей Марков, да и то не прямо, без упоминания Бастрыкина.

Вам кажется, что у вас, у нас многое криво? Но посмотрите, что делается в российской оппозиции, и вы поймете что у вас все ясно, сильно и красиво. В сравнении с…

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

Но команда хвалить Оксимирона наткнулась на препятствие. Дело в том, что он там оскорбил зачем то политолога Екатерину Шульман, назвал ее «милфа «. Это такой американский термин извращенцев, MILF, сокращенное от Mother I’d like to fuck». Означает сексуальное влечение к женщинам старше на поколение. Термин и сексистский тоже, что сейчас идет как преступление. Ну и, понятно, все это извращенцы.

То есть зачем то Оксимирон взял и оскорбил Шульман, которую и уважают в оппозиции и пиарят много лет оппозиционные ресурсы как главного политолога. У нее хорошее чувство юмора и быстрый ум и много читателей и слушателей. К этому надо добавить, что Екатерина Шульман вполне молода, она старше Оксимирона всего на 7 лет.

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

Мало? Добавим. Оксимирона лично еще и бывшая девушка обвинила в педофилии. Ну и остальное все сексуально модное там идет, как вы понимаете, в обязательном пакете.

Дорогие товарищи антипутинские оппозиционеры! Вас и так считают … ( сами знаете это слово), а попиарьте Оксимирона еще побольше, — и вас уже будут считать сектой не только политических извращенцев, но и сексуальных извращенцев, вроде хлыстовцев в начале 20 века, откуда был Распутин. Всем привет!

Среди «либералов» новость вызвала куда более живую реакцию.

Наталья Тихонова

Не успел Оксимирон выпустить трек «Агент» про иностранных агентов, как Бастрыкин решил проверить его творчество на предмет экстремизма. Под ту же раздачу попал Нойз МС.

Николай 2 все больше и больше кажется образцом адекватности и грамотного реагирования.

Павел Стулов

Бастрыкин поручил проверить творчество noize MC и Оксимирона.

По-моему у нас цензура вроде как запрещено в Конституции.

Может проверить творчество Бастрыкина на конституционность?

Артем Рондарев

Как же «патриотично настроенные граждане» [надоели]. Пандемия обращений просто уже какая-то, «Бастрыкин разрешил»:

«Председатель Следственного комитета России Александр Бастрыкин поручил провести проверку деятельности музыкантов Noize MC (Ивана Алексеева) и Oxxxymiron (Мирона Федорова), сообщает пресс-служба ведомства.

«Главному следственному управлению СК России в рамках доследственной проверки тщательно изучить доводы, изложенные в обращении к нему от инициативной «группы патриотов», — говорится в сообщении.

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

**

Когда все это закочнится, мы создадим универсальную вещательную комапнию «Валенки». Там, натурально, круглосуточно будут играть только Валенки и Арлекино Аллы Борисовны (вечером, для танцев). Подписка на ее продукцию для всех, кто определяет себя как «группа патриотов», будет обязательной, потому что без нее не будут выдавать куар-кодов на посещение патриотических продуктовых магазинов.

Иван Филиппов

в ежедневной рубрике КМБУ «Глава СК поручил проверить творчество рэперов Noize MC и Oxxxymiron после обращения «группы патриотов».

собственно кто бы сомневался, что из секты говорящих с телевизором кто-нибудь кляузу напишет. я правда не до конца уверен, что они тексты эти понимают, потому что и для Окси, и для Нойза нужно хотя бы какое-то базовое образование иметь, с другой стороны кому это когда мешало. альбомы у обоих отличные. у Oxxxymiron мне особенно трект «Нонфикшн» понравился и слова:

«В экс-СССР депутат-гомофоб — любовник качков

В кошмаре к нему с бомбой ползёт полковник Квачков

Микро-чипы зашивают в девичьи угги

В посольстве США живёт Александр Гельевич Дугин»

Артём Каракасиян

В Следственном комитете России будет создано управлению по расследованию преступлений, совершенных рэперами, сообщили в пресс-службе ведомства.

«Не секрет, что через ритмическую музыку, так называемый «рэп», определенные силы на Западе пытаются подорвать духовно-нравственные ориентиры молодого поколения, опорочить наши достижения, поставит под сомнение итоги Второй Мировой Войны», — подчеркнул представитель Следственного комитета.

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

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

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

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

Екатерина Винокурова

Дорогой Александр Иванович Бастрыкин,

Я сама люблю говорить в саркастичном тоне.

Я имею на руках сейчас вот кучу случаев, когда внимание Следственного комитета было бы полезно. Помогло бы спасти жизни людей. Физически. Спасти жизни.

Из последнего — незакупка лекарств орфанным детям даже по решению суда. Я вот сейчас наблюдаю, как умирают эти дети. Одного ребенка уже спасти не выйдет.

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

Я готова Вам вручить кучу случаев, где я умоляю о вмешательстве СК. Для начала, давайте займемся детьми с орфанными заболеваниями.

Это, на случай, если Вам нечего делать.

А я пока ставлю в наушники одну из моих любимых песен группы «Сплин» «Достань гранату» и буду думать о ребенке, который заведомо умрет. Потому что поздно.

Потому что ребенок уже точно умрет. СК на это все совершенно пофиг.

Блогеры постарше вспоминали преследование рокеров в Советском Союзе.

Антон Орех

Когда-то в СССР запрещали Высоцкого и Галича, потому что они пели о том, о чем другие молчали или говорили вполголоса. Потом запрещали рок, потому что рокеры пели и говорили о том, о чем другие молчали или говорили вполголоса. Сейчас эту нишу занял рэп. Причем, не обязательно исполнять буквально песни протеста. Достаточно просто быть непохожим, выделяться из серо-тухлой массы. Была же история, когда в 60-е милиция прекратила концерт группы «Скифы» и всех повязала за исполнение «антисоветской музыки». А группа просто играла инструментал без слов! Сейчас опасно быть и Нойзом и Моргенштерном.

Владимир Гельман

РОК И РЭП: THEN AND NOW

Наезды советского государства на рок-музыкантов в начале 1980-х и российского государства на рэперов в начале 2020-х сходны между собой по целям (не допустить распространения нежелательной информации), но различаются в средствах. Советское государство вело себя более сдержанно, нежели российское. В его стратегии кооптация преобладала над подавлением — нежелательных музыкантов стремились взять под контроль (случай Ленинградского рок-клуба) и ограничить их аудиторию (запреты на официальные концерты, диски, выступления на радио и ТВ), а репрессии наступали или в отношении тех, кто сам неудачно подставлялся, например, с неофициальными концертами (случай группы «Воскресенье») или тех, кто слишком мозолил глаза в отдельных эпизодах (случай «Аквариума» на фестивале в Тбилиси в 1980 году). Отдельные попытки мобилизовать лоялистов режима против рок-музыкантов успеха не имели, а то и давали эффект, обратный замыслам. Эта тактика принесла государству лишь частичный и временный успех, и с началом перестройки она сама собой утратила актуальность.

Сегодняшие руководители российского государства, похоже, верят в то, что именно рок-музыка развалила Советский Союз, и стремятся вести «работу над ошибками» в отношении рэпа (ну и не только рэпа, но и других чуждых им явлений культуры). Приоритет отдается подавлению перед кооптацией — отчасти оттого, что на кооптацию тратить усилия и деньги неохота, отчасти оттого, что не допустить распространения нежелательной информации сегодня несоизмеримо сложнее, чем в 1980-е. Поэтому сегодня главные новости — это обвинения в адрес Моргенштерна в торговле наркотиками, проверки Следственного комитета «по жалобе группы патриотов» в отношении Оксимирона и Нойза МС, ну и так далее. Скорее всего, эта тактика позволит государству подавить своих врагов, однако если рэперам придется надолго покинуть страну, слушать их, скорее всего, не перестанут.

Между тем, моя первая акция протеста состоялась в далеком 1982 году. Тогда в «Комсомольской правде» была опубликована разгромная статья «Рагу из синей птицы», направленная против «Машины времени» и подписанная Виктором Астафьевым и еще какими-то людьми из Красноярска. Я очень любил песни «Машины времени» (очень люблю их и по сей день), статья мне казалась заведомо несправедливой, и в ответ написал очень резкое письмо в редакцию, требуя опровержения. Лишь позднее я узнал, что количество таких писем читателей оказалось огромным, и столь массовый протест предотвратил ожидавшиеся оргвыводы в отношении «Машины времени». Этот протестный опыт стал для меня первым шагом на пути к последующему активному участию в общественной жизни. Через некоторое время мы узнаем, последуют ли сходные шаги со стороны поклонников нынешних рэперов.

Однако вскоре история сделала неожиданный поворот.

Олег Кашин

Ааааааа

В «Живом журнале» нашли то самое «обращение группы патриотов» к Бастрыкину

В нем, например, утверждается, что Оксимирон «сексуально оскорбил» Екатерину Шульман и «доходит до реабилитации нацизма, ставя знак равенство между гестапо, штази и российскими правоохранительными органами».

Автор поста Дмитрий Якушев после новости о проверке Следственного комитета заявил, что это была сатира. «Остановитесь. Не было никакого „Обращения группы патриотов”. Это же была шутка. Вымышленное обращение, специально написанное в идиотской форме, сатира на наше время», — написал Якушев

Вот этот пост Дмитрия Якушева:

Группа патриотов просит Бастрыкина пресечь преступную деятельность Noize mc и Oxxxymiron

Мне принесли письмо, написанное «группой патриотов» председателю Следственного комитета России Александру Бастрыкину, в котором его просят «пресечь преступную деятельность» рэперов Noize mc и Oxxxymiron. Считаю важным придать этот документ максимальной гласности.

Уважаемый Александр Иванович!

Вы известны не просто как большой патриот России и неравнодушный человек, но и как чрезвычайно внимательный и прозорливый защитник Отечества, замечающий самых опасных его врагов, прячущихся под разными якобы не политическими вывесками. Одного вашего слова оказалось достаточно, чтобы проповедник наркотического тумана сбежал из России и будем надеяться закончил своё преступное творчество. От всех патриотов России, спасибо Вам, что обратили внимание на Моргенштерна, в результате чего этот персонаж быстренько покинул территорию России.

Сегодня хочется обратить Ваше внимание на преступную деятельность так называемых рэперов Noize mc и Oxxxymiron, известных в миру, как Иван Алексеев и Мирон Федоров. Преступная деятельность указанных лиц сегодня перешла все пределы допустимого и стала национальной угрозой, опаснее расширения НАТО. Недавно оба рэпера выпустили так называемые «альбомы», которые свободно распространяются в сети и уже прослушаны миллионами граждан России, прежде всего молодого возраста. Чему же учат рэперы нашу молодежь, пока государство бездействует.

Вот как Noize mc рисует лицо наших силовиков «шестерки, сексоты в погонах, идиоты, дураки в эполетах». По правде сказать, лица руководителей наших силовых структур действительно не всегда удачные, а когда они начинают говорить, то иногда кажутся агрессивными дебилами, порождающими депрессию и суицидальные настроения. Хорошо ещё, что по телевизору перестали показывать депутата Ирину Яровую. Тут нужно, что-то делать, потому что враги используют эту слабость. Нулад раздавала печеньки. Нужно чтобы Вы, Колокольцев, Патрушев, Бастрыкин, Золотов тоже что-нибудь раздавали на улицах, кроме угроз и запретов. Например, апельсины. Это было отступление заинтересованных людей, желающих победы Отечеству в тяжелейшей схватке со всемирным злом, НАТО и наступающим ЛГБТ.

Вернемся к рэперам. Oxxxymiron пошел ещё дальше. В одной из его последних песен открыто романтизируются запрещенные (экстремистские) организации. Здесь же Мирон Федоров доходит до реабилитации нацизма, ставя знак равенство между гестапо, штази и российскими правоохранительными органами, которые, по его словам, должны исчезнуть. Мирон Федоров в другой песне создает положительный образ иностранного агента, разрушая все усилия государства по оповещению населения. Мирон Федоров открыто признал, что работает на Госдеп и заявил, что его «альбом» приравнивается к госперевороту, что является открытым призывом к свержению законной власти и изменой Родине. Указанный рэпер также сексуально оскорбил деятеля оппозиции Екатерину Шульман.

В связи с изложенным просим Вас принять меры по пресечению преступной деятельности Noize mc (Иван Алексеев) и Oxxxymiron (Мирон Федоров).

Группа патриотов России

А это его пост, когда он понял, к чему привела его шутка:

Остановитесь!!!! Не было никакого обращения!!!

Блин. Остановитесь. Не было никакого «Обращения группы патриотов». Это же была шутка. Вымышленное обращение, специально написанное в идиотской форме, сатира на наше время.

Если это кого-то и удивило, то не сильно.

Анна Евсеева

Никому не нужный блогер в богом забытом ЖЖ написал пародию на донос, а его единственным читателем оказался Бастрыкин. Бывают же такие случайности

Анатолий Несмиян

Возникла анекдотическая ситуация. Некая «группа патриотических граждан» публично обратилась с призывом проверить двух рэперов NoizeMC и Оксимирона на предмет содержания их творчества. Руководитель Следственного комитета с глубоким пониманием отнесся к просьбе и поручил организовать проверку. «Группа патриотов» дала заднюю и сообщила, что вообще-то их обращение было вымышленным и специально составленным в идиотской форме.

Но поздно. Поезд набирает ход. Теперь-то уж точно остановить его никак нельзя.

Вера Афанасьева

«Невозможно написать бессмыслицу о России. Можно только описать будущие события»

Бастрыкин поручил проверить Noize MC и Oxxxymiron на экстремизм и реабилитацию нацизма после обращения в СК «группы патриотов».

Оказалось, что письмо пародийное, и теперь его автор, блогер Дмитрий Якушев, в шоке:

«Я просто пошутил в стиле “как идиот может среагировать на альбом”, абсурдную реакцию показал, чтобы люди посмеялись, но Бастрыкин воспринял все серьезно».

Самое смешное, что претензии многие предъявляют блогеру. С чего ты взял, говорят, что Бастрыкин шутки понимает?

Кафке с Оруэллом такое и не снилось.

И да — скоро будем слушать рэп только на стихи Бастрыкина.

Александр Любимов

О̶р̶ё̶л̶ ̶н̶а̶ш̶ ̶д̶о̶н̶ ̶Р̶э̶б̶а̶ Бастрыкин поручил Главному следственному управлению СК проверить обращение «группы патриотов», пожаловавшихся на творчество рэперов Оксимирона и Нойза MC. «Медуза» (иностранный агент, кстати) нашла этого патриота — какой-то блогер постебался: поблагодарил Бастрыкина за Моргенштерна и посоветовал обратить внимание на других рэперов. И чего-то про них нафантазировал, как сам потом написал — шутка, написанная в идиотской форме. Как он думал.

Вспоминаю, как в фильме «Покаяние» Абуладзе, один арестованный, когда его назначили британским шпионом, начал говорить следователю всякую чушь, типа: «Ага, собирался прорыть тоннель из России в Британию». Но ему это записали как признание и посадили надолго.

Роман Попков

Главное в истории с фейковым письмом «группы патриотов», из-за которого Бастрыкин начал проверку Оксимирона и Нойза МС в том, что ну мы же сперва не удивились даже. Или не сильно удивились.

Приколист из ЖЖ написал шуточное гротескное заявление, не лезущее ни в какие рамки здравого смысла. Черная адская сатира. И дело не в том что Бастрыкин возбудился на это письмо. Про Бастрыкина все ясно всегда было. Дело в том что мы не удивились ни такому доносу (потому что это стало нормой в РФ), ни такой реакции государства на донос (потому что это тоже норма в РФ).

Завтра можно написать шуточный «донос», на кого-то, отталкиваясь от «Протоколов сионских мудрецов», или от «Плана Аллена Даллеса», и в СК это возьмут в работу, и мы опять не удивимся.

Нету больше разницы между российской реальностью и самым изощренным гротеском, от которого бледнели бы Гофман с Рабле.

Кажется, Оксимирон поступил не очень предусмотрительно, назначив на весну серию концертов в России.

Кирилл Шулика

совершенно понятно, что Oxxxymiron в России не приедет, несмотря на то, что все билеты на концерты были проданы за семь часов, а Noize MC уедет.

Зато приедет столь любимая дедушкой Бастрыкиным Мирей Матье.

Вообще я тут не могу сказать, наезд на них и Моргенштерна это госполитика или личные причуды Бастрыкина? Все видится, как второе, причем, он в рамках своих полномочий, но кто знает, может быть и первое.

Язык Си — один из наиболее влиятельных языков программирования за всю историю. Он стал незаменимым инструментом разработки операционных систем, сместив с этого пьедестала языки ассемблера. Изучение Си обязательно для любого уважающего себя программиста. Этот язык любим за свою внешнюю простоту и ненавидим за беспощадность к ошибкам. Благодаря ему у нас есть ядро Linux и тысячи уязвимостей в нём же в придачу. Попробуем понять, что же такое этот противоречивый язык Си — благословение или проклятие?

История языка Си берёт свое начало в недрах американской компании Bell Labs и тесно связана с судьбой операционной системы UNIX. Ее создатели, Кен Томпсон и Деннис Ритчи, разрабатывали свой проект для компьютеров PDP-11, и первые два года их основным инструментом был язык ассемблера. Трудоёмкость написания машинного кода вынуждала искать ему замену, которой в конечном итоге и стал язык Си. С его помощью было полностью переписано ядро операционной системы и большая часть утилит. Язык Си позволял создавать эффективные низкоуровневые программы на PDP-11, практически не используя при этом язык ассемблера.

Со временем встал вопрос портирования UNIX на новые аппаратные платформы. Использование языка Си значительно упростило эту задачу. Ведь если бы в разработке применялся только язык ассемблера, то тогда операционную систему пришлось бы переписывать под каждую компьютерную архитектуру. С другой стороны, исходники UNIX все еще содержали немало кода, созданного специально для компьютера PDP-11. Да и сам язык Си далеко не всегда точно отражал особенности и детали той или иной аппаратной платформы. Последнее еще больше затрудняло процесс переноса и лишало язык одного из его главных достоинств — прозрачной и понятной генерации машинного кода. Чем больше компьютерных архитектур захватывал Си, тем менее очевидной становились его связь с низким уровнем.

В процессе миграции UNIX на новые аппаратные платформы обнаружилась ещё одна проблема. Портированные программы на языке Си исполнялись медленнее, нежели можно было от них ожидать. Чем сильнее отличалась целевая компьютерная архитектура от PDP-11, тем менее эффективным был получаемый код. Чтобы скомпенсировать этот недостаток, разработчики компиляторов всё чаще стали применять неявные оптимизации. И хотя такое решение и улучшало производительность самих программ, Си всё больше отдалялся от низкого уровня. Теперь приходилось не только понимать, как именно определялись конструкции языка для каждой из компьютерных архитектур, но также и то, как они оптимизировались. Разумеется, любой компилятор самостоятельно решал, как именно транслировать исходный код для каждой аппаратной платформы. В итоге написать на языке Си низкоуровневую программу, независящую от используемого компилятора, стало практически невозможно.

Необходимо было понять, как эффективно реализовать высокоуровневые конструкции языка Си, сохранив при этом его низкоуровневые свойства. Попыткой решить эту проблему стала публикация в 1989 году первого стандарта языка. Его принято называть «ANSI C» или «C89», и именно на него мы будем ссылаться в дальнейшем. Создатели стандарта решили окончательно разорвать связь Си с архитектурой PDP-11 и сделать язык полностью высокоуровневым. Была введена так называемая «абстрактная машина» — воображаемый исполнитель кода на языке Си (раздел 2.1.2.3, «Program execution»):

Семантические описания в этом Стандарте описывают поведение абстрактной машины, в которой вопросы оптимизации не имеют значения.

Это означает, что оптимизации компилятора не будут влиять на работу программы, пока её исходный текст согласуется со стандартом. Абстрактная машина должна была решить две проблемы одновременно. Во-первых, следование стандарту давало возможность создавать легко переносимые программы на языке Си. Во-вторых, абстрактная машина могла предоставить компиляторам свободу для оптимизаций. Вот только возникает вполне резонный вопрос — а чем тогда язык Си отличается от любого другого компилируемого языка высокого уровня? Ответ кроется в тексте стандарта. Чтобы всё-таки дать теоретическую возможность программистам писать низкоуровневые процедуры, а значит непереносимые, было введено ещё одно понятие — неопределённое поведение (undefined behavior, раздел 1.6, «DEFINITIONS OF TERMS»):

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

Проще говоря, неопределённое поведение — это специально оставленные дыры в описании абстрактной машины языка Си. Они позволяют компиляторам самим решать, как поступать с теми или иными конструкциями языка, о поведении которых текст стандарта намеренно умалчивает. В том числе они могут быть восприняты как недопустимые в тексте программы. Давайте подробнее разберем неопределённое поведение на конкретном примере.

Возьмём следующий фрагмент кода на языке Си:

int x = 1;
x = x << sizeof(int) * 8;

Попробуем предположить, какой результат у нас получится. Допустим, мы скомпилировали этот код для процессоров архитектуры ARM. Инструкция битового сдвига в рамках этой аппаратной платформы определена так, что итоговым значением переменной «x» должен быть «0». С другой стороны, мы можем транслировать нашу программу в машинный код архитектуры x86. И уже там битовый сдвиг реализован таким образом, что значение «x» не изменится и останется равным «1». Мы могли бы сделать вывод, что результат работы данного фрагмента кода зависит от того, для какой аппаратной платформы мы его скомпилировали. Но на самом деле это не так.

В действительности данный фрагмент кода может быть обработан компилятором любым возможным и невозможным образом. Причина в следующем: согласно тексту стандарта языка Си битовый сдвиг на величину, большую или равную размеру выражения в битах, является неопределённым поведением. Получается, нет никакой гарантии, что этот кусок кода вообще будет работать. В действительности, даже в рамках одной архитектуры один и тот же компилятор может сгенерировать совершенно разные исполняемые файлы. Приведём примеры компиляции и запуска программы с печатью значения переменной «x». В обоих случаях мы используем компилятор gcc версии 10.2.1 для целевой архитектуры x86-64.

$ cat test.c
#include <stdio.h>

int main()
{
    int x = 1;
    x = x << sizeof(int) * 8;
    printf("%dn", x);
    return 0;
}
$ gcc test.c -o test
$ ./test
1
$ gcc -O test.c -o test
$ ./test
0

Флаг «-O» разрешает компилятору gcc использовать оптимизации исходного кода. То, какие именно механизмы оптимизации могут быть применены, а также какие флаги за них отвечают, зависит от конкретного компилятора. В общем случае невозможно узнать, каким образом будет обработано неопределённое поведение в программе при трансляции исходного кода. Поэтому единственный способ написания переносимых программ на языке Си — это полное избегание неопределённого поведения при разработке.

Рассмотрим чуть более сложный пример. Ещё одной разновидностью неопределённого поведения является разыменование нулевого указателя. Его тривиальным вариантом будет следующий фрагмент кода:

* (char *) 0;

Разумеется, никто в здравом уме не станет писать что-то подобное в своей программе. Однако совсем необязательно делать разыменование нулевого указателя явным образом, чтобы вызвать неопределённое поведение. В цикле статей «What Every C Programmer Should Know About Undefined Behavior» на сайте blog.llvm.org приводится фрагмент кода, подтверждающий это:

void contains_null_check(int *p)
{
    int dead = *p;
    if(p == 0)
        return;
    *p = 4;
}

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

void contains_null_check(int *p)
{
    if(p == 0)
        return;
    *p = 4;
}

Затем второй механизм не обнаружит лишних проверок на нулевой указатель, и исходный код функции примет свой итоговый вид. Однако в действительности порядок оптимизаций может быть и другим. К примеру, компилятор вправе первым делом исключить лишние проверки на нулевой указатель, и тогда функция будет преобразована уже следующим образом:

void contains_null_check(int *p)
{
    int dead = *p;
    if(0)
        return;
    *p = 4;
}

Так как мы разыменовываем указатель до его проверки, то компилятор спокойно решает, что сам указатель никогда не будет нулевым. Благодаря этому сравнение «p == 0» заменяется на выражение, всегда возвращающее ложь. Затем компилятор запускает первый механизм оптимизации и убирает «мертвый» код:

void contains_null_check(int *p)
{
    *p = 4;
}

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

Предположим, вы случайно допустили в своей программе неопределённое поведение. В лучшем случае вы сразу же обнаружите ошибку и исправите её. В не столь удачном — сделаете это не сразу. Однако гораздо вероятнее ситуация, что компилятор не станет использовать вашу оплошность себе на пользу. В таком случае неопределённое поведение останется в исходном коде программы до тех пор, пока не объявится в самый неподходящий момент. А такой момент может наступить при смене: целевой компьютерной архитектуры, компилятора или даже его версии, флагов оптимизации или вообще каких угодно флагов. Проще говоря, неопределенное поведение — это бомба замедленного действия. Когда она рванет — непонятно, но можно только догадываться, сколько интересных сюрпризов хранят в себе исходные коды тысяч программ.

Оптимизации компилятора могут затрагивать также и функции стандартной библиотеки языка Си, в том числе, к примеру, memset. Она широко и печально известна за обилие ошибок, которые допускают программисты при её вызове. Заголовок функции выглядит следующим образом:

void *memset(void *ptr, int value, size_t num);

memset записывает «num» байтов со значением «value» по адресу «ptr». Несмотря на то, что параметр «value» имеет тип int, в действительности используется лишь его младший байт. Функция активно применяется для обнуления больших массивов данных, однако компилятор и сам частенько любит вставить её вызов туда, где это нужно и не очень. Так, любопытный случай обсуждался 15 апреля 2018 года на форуме osdev.org. Пользователь под ником ScropTheOSAdventurer создал тему, в которой рассказал о процессе разработки собственной учебной операционной системы. На свою беду он разрешил компилятору оптимизировать исходный код проекта, в результате чего последний перестал работать. В процессе отладки программист обнаружил ошибку в следующем фрагменте кода:

void *memset(void *ptr, int value, size_t num)
{
    unsigned char *ptr_byte = (unsigned char *) ptr;
    for(size_t i = 0; i < num; ptr_byte[i] = (unsigned char) value, i++);
    return ptr;
}

Для своей операционной системы разработчик решил использовать собственную реализацию функции memset. Но он не учёл, что в процессе трансляции компилятор gcc обнаружит в этом коде весьма заманчивую возможность для оптимизации. Фактически функция была в итоге преобразована к следующему виду:

void *memset(void *ptr, int value, size_t num)
{
    return memset(ptr, value, num);
}

Вполне вероятно, что среди разработчиков компилятора gcc были непревзойденные мастера софистики. В любом случае способности компилятора к оптимизациям явно превосходят все доступные человеческому разуму пределы.

Приведем еще один пример с функцией memset. Компилятор способен не только создавать её вызовы на пустом месте, но и выкидывать их из исходного кода по собственному желанию. Так, в криптографических программах зачастую бывает полезно стирать все данные из памяти после того, как они перестают быть нужными. Обычно такое поведение является избыточным, однако представим себе следующую ситуацию. Ваша программа работает с базой данных пользователей, хранящей их имена и пароли, и вы описали примерно такую функцию:

int check_password(const char *pwd)
{
    char real_pwd[32];
    get_password(real_pwd);
    return !strcmp(pwd, real_pwd);
}

Есть лишь одна проблема — после вызова check_password в стеке останется строка с настоящим паролем пользователя. Если в вашей программе есть хотя бы одна уязвимость, позволяющая читать данные из памяти, то существует реальная вероятность украсть пароль из стека. Примером подобной уязвимости стал печально известный баг «Heartbleed». Чтобы снизить возможные риски, проще всего очистить содержащий пароль фрагмент стека:

int check_password(const char *pwd)
{
    int result;
    char real_pwd[32];
    get_password(real_pwd);
    result = !strcmp(pwd, real_pwd);
    memset(real_pwd, 0, sizeof(real_pwd));
    return result;
}

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

Одной из наиболее коварных разновидностей неопределённого поведения является strict aliasing. Термин может быть переведён как «строгое наложение», однако традиционного названия на русском языке у него не существует. По этой причине мы будем использовать оригинальный английский термин. Текст стандарта дает такое описание для strict aliasing (раздел 3.3, «EXPRESSIONS»):

Значение объекта должно быть доступно только с помощью lvalue-выражения одного из следующих типов:

— объявленный тип объекта,

— квалифицированная версия объявленного типа объекта,

— знаковый или беззнаковый тип, соответствующий объявленному типу объекта,

— знаковый или беззнаковый тип, соответствующий квалифицированной версии объявленного типа объекта,

— тип массива, структуры или объединения, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член внутренней структуры, массива или объединения),

— символьный тип.

Проще всего strict aliasing проиллюстрировать на конкретном примере:

int x = 42;
float *p = &x;
*p = 13;

Чтобы вызвать неопределенное поведение, достаточно обратиться к какой-либо переменной по типу, несовместимому с объявленным. Это ограничение можно обойти, применив символьный тип (char), на который не распространяются правила strict aliasing:

int x = 42;
char *p = &x;
*p = 13;

Вот только расчленение переменной на символы может оказаться трудоемкой задачей. Придется учитывать размер данных, а также используемый порядок байтов. Избежать неопределённого поведения можно также с помощью объединений (union):

union u { int a; short b };
union u x;
x.a = 42;
x.b = 13;

Впрочем и этот метод не лишён недостатков — объединение должно содержать члены со всеми возможными типами, которые будут использованы программой. Все это серьёзно осложняет применение «type punning» или так называемого каламбура типизации — намеренного нарушения системы типов. Эта техника необходима для более гибкого низкоуровневого управления памятью машины.

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

int get_pixel(const char *buf, int width, int x, int y)
{
    buf += get_header_size(buf);
    return ((const int *) buf)[y * width + x];
}

При вызове функции ей передается адрес области данных с содержимым файла, включая его заголовок, ширину изображения, а также координаты пикселя, цвет которого следует вернуть. Вместо типа int мы могли бы выбрать любой другой с известным нам размером. Но все это неважно, потому что функция get_pixel абсолютно неверна с точки зрения стандарта, так как нарушает правила strict aliasing. Чтобы использовать каламбур типизации, придется переписать весь код, связанный с используемым буфером, в том числе и тот, который ответственен за чтение файла.

Существует огромное количество примеров программ, не удовлетворяющих правилам strict aliasing. В их число входит знаменитая функция вычисления быстрого обратного квадратного корня из игры Quake 3:

float FastInvSqrt(float x)
{
    float xhalf = 0.5f * x;
    int i = *(int *) &x;
    i = 0x5f3759df - (i >> 1); /* What the fuck? */ 
    x = *(float *) &i;
    x = x * (1.5f - (xhalf * x * x));
    return x;
}

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

Остается один вопрос — зачем вообще нужен этот strict aliasing? Все дело в том, что он позволяет создателям компиляторов применять крайне агрессивные оптимизации исходного кода. Правила strict aliasing распространяются на обращения к любой памяти, в том числе и динамической. Так комитет стандартизации отметил, что следующий фрагмент кода (источник):

void f(int *x, double *y)
{
    *x = 0;
    *y = 3.14;
    *x = *x + 2;
}

может быть преобразован таким образом:

void f(int *x, double *y)
{
    *x = 0;
    *y = 3.14;
    *x = 2;
}

Согласно правилам strict aliasing указатель y не может содержать адрес того же участка памяти, что и указатель x. Именно этот факт и позволяет заменить выражение «*x = *x + 2» на «*x = 2». Активное использование компиляторами подобных оптимизаций сломало огромное количество старого кода. Так, в письме от 12 июля 1998 года один из разработчиков компилятора gcc Jeff Law, отвечая на вопросы по strict aliasing и связанными с ним ошибками, пишет (источник):

> Существует очень много кода, который нарушает правила strict aliasing. Одним из таких примеров является «переносимая» универсальная функция контрольной суммы IP, которая содержится в исходных кодах BSD для работы с сетями.

ИМХО, такого кода становится все меньше и меньше — современные компиляторы уже какое-то время используют strict aliasing в анализе, в результате чего люди были вынуждены исправлять свой код. Безусловно, это не относится к Linux и некоторым другим свободным проектам, так как они используют только gcc.

> Если мы начнем говорить о том, что такой код неверный, то нам лучше было бы иметь какой-то план на случай, если люди начнут спрашивать, почему их код, который работал много лет, теперь сломался.

Укажите им на стандарт языка Си :-) :-)

Правила strict aliasing для компилятора gcc можно разрешить, используя флаг «-fstrict-aliasing», и запретить флагом «-fno-strict-aliasing». Последний рекомендуется применять, если вы не уверены, нарушаете ли вы текст стандарта — скорее всего, нарушаете. Говоря об упомянутом в письме ядре Linux, его автор Линус Торвальдс также дал свою оценку strict aliasing в частности и работе комитета в целом. Так, критикуя желание одного из разработчиков операционной системы лишний раз перестраховаться от нарушения стандарта, Линус написал такое письмо (источник):

Честно говоря, все это кажется мне сомнительным.

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

Дело в том, что использование объединений для реализации каламбура типизации — это обычный и СТАНДАРТНЫЙ для этого способ. В действительности он является документированным для gcc, и используется в том случае, если вы, будучи не слишком умным (оригинал: «f*cking moron»), применили «-fstrict aliasing», и теперь вам необходимо избавиться от всего того ущерба, который навязывает этот мусорный стандарт.

Энди, что послужило причиной для всего этого идиотизма? И не надо говорить мне, что текст стандарта «недостаточно ясный». Текст стандарта, совершенно ясно, является дерьмовой чушью (см. выше о правилах strict aliasing), и в таких случаях его нужно игнорировать. Для этого необходимо использовать средства компилятора, чтобы избежать ущерба. Аналогично нужно поступать и в ситуациях, где нет полной ясности.

Это то, почему мы используем «-fwrapv», «-fno-strict-aliasing» и другие флаги.

Я уже говорил об этом раньше и повторю еще раз: когда текст стандарта противоречит реальности — он является обычным куском туалетной бумаги. Он не имеет абсолютно никакой важности. В действительности, вместо него я лучше возьму рулон настоящей туалетной бумаги — так хотя бы я не испачкаю свою задницу чернилами (оригинал: «won’t have splinters and ink up my arse»).

Видимо, Линус Торвальдс плохо изучил язык Си — настоящему программисту на Си такое в голову бы не пришло.

Впрочем, одним лишь strict aliasing стандарт не полон. Чтобы вызвать неопределённое поведение, необязательно даже разыменовывать указатель:

void f(int *p, int *q)
{
    free(p);
    if(p == q) /* Undefined behaviour! */
        do_something();
}

Использование значения указателя после того, как память по нему была освобождена, запрещено текстом стандарта (раздел 4.10.3, «Memory managment functions»):

Значение указателя, ссылающегося на освобожденную память, не определено.

Программисту важно понимать, что указатели в Си не являются низкоуровневыми. Стандарт постарался полностью искоренить какую-либо связь языка с реальным миром. Даже сравнение указателей, ссылающихся на разные объекты, объявлено неопределённым поведением (раздел 3.3.8, «Relational operators»):

При сравнении двух указателей результат зависит от относительного расположения в адресном пространстве объектов, на которые они указывают. Если указанные объекты не являются членами одной и той же структуры, массива или объединения, то результат не определён.

Вот небольшой фрагмент кода, демонстрирующий некорректное с точки зрения стандарта сравнение:

int *p = malloc(64 * sizeof(int));
int *q = malloc(64 * sizeof(int));
if(p < q) /* Undefined behaviour! */
    do_something();

Однако наиболее интересным примером здесь будет служить исходный код следующей программы:

#include <stdio.h>

int main()
{
    int x;
    int y;
    int *p = &x + 1;
    int *q = &y;
    printf("%p %p %dn", (void *) p, (void *) q, p == q);
    return 0;
}

Если транслировать приведенный выше текст компилятором gcc, передав ему флаг «-O», то полученный исполняемый файл при запуске выдаст примерно следующую строку:

0x1badc0de 0x1badc0de 0

Остается большой тайной, по какой причине два указателя, содержащие одинаковые значения, оказались не равны. Возможно, ранее уже отмеченные нами разработчики компилятора gcc не менее искусны в трактовке текстов стандарта, чем в вопросах софистики. Проникнуться утончённой герменевтикой можно в обсуждении этого вопроса на официальном сайте организации GNU.

Большая часть примеров, связанных с работой указателей, была взята с сайта kristerw.blogspot.com. На нём вы сможете найти больше информации о текстах стандарта языка Си, а также загадочных оптимизациях компиляторов.

Может показаться, что в случае выключенных оптимизаций все вышеописанные проблемы обойдут вас стороной. Просто не передавайте компилятору флаг «-O», и вы получите тот результат, на который рассчитываете. Но на самом деле это не так. В январе 2007-ого года на сайте gcc.gnu.org пользователь под ником felix-gcc выложил исходный код следующей программы:

#include <assert.h>

int foo(int a) {
  assert(a + 100 > a);
  printf("%d %dn",a + 100, a);
  return a;
}

int main() {
  foo(100);
  foo(0x7fffffff);
}

Функция foo проверяет на переполнение сумму поданного знакового числа и константы «100». Как известно, на подавляющем большинстве компьютерных архитектур отрицательные числа задаются в виде дополнительного кода. В случае переполнения такое число меняет знак на противоположный, благодаря чему проверка «a + 100 > a» возвращает ложь. В теле функции main felix-gcc дважды вызывает foo. Сначала он подает на вход число, которое не приведёт к переполнению. Затем, исходя из того, что размер типа данных int равен четырем байтам, felix-gcc вызывает foo с наибольшим положительным числом данного типа. Логично предположить, что в таком случае сравнение вернёт ложь, и assert прервёт работу программы. Однако вот какой вывод получил felix-gcc после запуска исполняемого файла:

200 100
-2147483549 2147483647

Фактически gcc решил удалить проверку на переполнение, и это при том, что никаких флагов компилятору передано не было. И что еще интереснее, ранние версии gcc при тех же условиях не убирали проверку, в результате чего получаемая программа вела себя иначе. На резонную просьбу felix-gcc исправить неожиданный баг компилятора ответил пользователь под ником Andrew Pinski. Будучи разработчиком gcc, Andrew Pinski заметил, что данное поведение не является ошибочным. Более того, он сам оказался автором изменения в коде компилятора, которое и создало столь странный результат. Далее приводится фрагмент диалога felix-gcc и Andrew Pinski. Комментарии излишни:

Andrew Pinski
Переполнение знакового числа — это неопределённое поведение в тексте стандарта языка Си, используйте беззнаковый тип или флаг «-fwrapv».

felix-gcc
Вы должно быть шутите?
Различные проблемы безопасности вызваны переполнениями чисел, и вы просто так говорите мне, что в gcc 4.1 я больше не могу тестировать их для знаковых типов? Вы явно чего-то не понимаете. ДОЛЖЕН быть способ обойти эту проблему. Существующее программное обеспечение использует знаковые числа, и я не могу просто поменять тип на беззнаковый — мне все равно нужно проверить переполнение! Не похоже, что я мог бы использовать какой-нибудь обходной путь для этого. Что вы хотите от меня — чтобы я привел тип к беззнаковому, сдвинул вправо на один, затем сложил или что вообще?!
ПОЖАЛУЙСТА, ОТМЕНИТЕ ЭТО ИЗМЕНЕНИЕ. Оно создаст СЕРЬЁЗНЫЕ ПРОБЛЕМЫ БЕЗОПАСНОСТИ во ВСЕВОЗМОЖНЫХ ПРОГРАММАХ. Меня не волнует, что ваши стандартизаторы говорят о том, что gcc исправен. ВСЕ ЭТО ПРИВЕДЁТ К ТОМУ, ЧТО ЛЮДЕЙ ВЗЛОМАЮТ. Я обнаружил эту проблему, так как одна из проверок безопасности, которая предотвращает взлом, провалилась.
ЭТО НЕ ШУТКА. ИСПРАВЬТЕ ЭТО! СЕЙЧАС ЖЕ!

Andrew Pinski
Я не шучу, стандарт языка Си прямо говорит, что переполнение знакового числа — это неопределённое поведение.

felix-gcc
Так, послушайте, Эндрю, вы что, действительно думаете, что эта проблема исчезнет, если вы продолжите закрывать баги достаточно быстро? Проверка, которую я написал, покрывала все возможные ситуации. Не требуется даже уточнения того, что за тип используется — указатель, беззнаковое или знаковое число. Ну, указатели вы тоже сломали, но ваши изменения были исправлены. Парень, который сделал это тогда, должен появиться здесь, нам нужен кто-то с трезвой головой и видением ситуации как у него.
Давайте посмотрим правде в глаза — вы облажались по полной (оригинал: «fucked up this royally»), и теперь вы пытаетесь прикрыть все ошибки как можно скорее, чтобы никто не заметил, сколько ущерба вы нанесли. Вы, сэр, непрофессиональны и позорите команду разработчиков gcc. Эта ошибка останется открытой до тех пор, пока вы не вернёте все обратно или не сделаете упомянутый вами флаг по умолчанию. Пока вы будете ломать программы, чьи авторы по глупости включили оптимизации, мне всё равно. Но я не позволю вам делать моё окружение менее безопасным только потому, что ваш непрофессионализм не позволяет вам разобраться с оптимизациями после того, как было показано, что они наносят больше вреда, чем пользы. Сколько еще доказательств вам необходимо предоставить? Боже мой, да autoconf считает, что ваши «оптимизации» нужно отключать повсеместно. Вы вообще замечаете взрывы вокруг самих себя?

Andrew Pinski

http://c-faq.com/misc/sd26.html

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

felix-gcc
МОЙ КОД НЕ СЛОМАН.
Попытки обесценить проблему или оскорбить меня ничего не решат.

Andrew Pinski
Вы написали ошибку, поэтому я и решил, что ваш код сломан.

felix-gcc
Итак, скажите мне, какая часть моей аргументации вам непонятна? Я мог бы использовать слова попроще, чтобы вы смогли меня понять на этот раз.
Ребята, ваша задача — это не просто реализовать стандарт Си. Вы также обязаны не нарушать работу программ, которые зависят от вас. А от вас зависит МНОГО программ. Когда вы нарушили точность вычислений с плавающей точкой, то вы сделали это доступным с помощью флага (-ffast-math). Когда вы добавили strict aliasing, вы так же сделали эту функцию доступной через флаг (-fstrict-aliasing). Если я правильно помню, вы тогда тоже цитировали текст стандарта, пока люди с более адекватным пониманием мира вас не остановили. И я собираюсь оставить эту ошибку открытой до тех пор, пока не повторится та же история.

Andrew Pinski
Я думаю, нам не следовало делать это необязательным, но меня не было в тот момент, когда было принято это решение. Также помните, что у нас был релиз, когда strict aliasing был включен, но затем нам пришлось его отключить по умолчанию. За это время люди исправляли свои программы, пока оптимизация была активна. И мы уже сделали оптимизацию знакового переполнения опциональной с помощью «-fwrapv». Я не понимаю, к чему вы приводите свои аргументы.

felix-gcc
Вы не можете просто так потенциально сломать кучу свободного ПО лишь потому, что изменили свое мнение по поводу того, какую свободу вам дает стандарт.
Повзрослейте или уйдите, позволив более ответственным людям заниматься вашими делами.

Andrew Pinski
Подождите, но эта оптимизация была еще с 1994-ого года, и если какой-либо код, начиная с этого момента, использовал знаковое переполнение, то авторы этих программ сами напросились.

felix-gcc
Знаете ли вы, что ракета Ариан-5 взорвалась (и могла убить людей!) из-за ошибки переполнения? Что если люди погибнут из-за того, что вы решили, что стандарт позволяет вам выкидывать проверки безопасности, написанные людьми?

Andrew Pinski
Я уже показал вам, как проверять знаковое переполнение до того, как оно произойдет, а не после. Вы можете научить других специалистов по безопасности тому, как писать этот код.

felix-gcc
Еще раз: НЕ ИМЕЕТ ЗНАЧЕНИЯ ТО, ЧТО ГОВОРИТ СТАНДАРТ. Вы сломали программы, и люди пострадали от этого. Теперь верните все обратно. Меньшее, что вы можете, это сделать «-fwrapv» по умолчанию. Вам все еще придётся заставить его работать правильно (я слышал, что он неверно работает в определенных ситуациях), но это уже другая история.

Andrew Pinski
Он будет по умолчанию в тех языках, где определено именно такое поведение. Я дал вам способ написания проверок переполнения, и если вам не нравится то, что говорит стандарт языка Си, то это не моя вина.
Запомните: компилятор gcc также является оптимизирующим компилятором, и если вам нужны оптимизации, то вы должны следовать правилам того языка, на котором вы пишете, вместо создания неверных программ, что и происходит с Си и Си++ в целом.

felix-gcc
В ранних версиях компилятора такое поведение происходило только в случае включённых оптимизаций. Если немножко присмотреться, то окажется, что все ваши аргументы ничего не стоят.
Потому как gcc 4.1 выкидывает этот код уже без включённых оптимизаций. Вот и все ваши аргументы.
Пожалуйста, сделайте «-fwrapv» по умолчанию, и я заткнусь.

Andrew Pinski
Попробуйте проверить время исполнения программы с «-fwrapv» и без него. Вы увидите, что без него код работает быстрее.

Пытаясь уйти в обсуждение оптимизаций компилятора, Andrew Pinski решил тем самым оправдать свою позицию. В процессе он, однако, упомянул куда более «интересную» аргументацию:

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

А в самом конце обсуждения Andew Pinski заявил следующее:

Я бы принял вашу идею о включении «-fwrapv» по умолчанию, если бы не существовало способа для проверки переполнения до того, как оно случилось, но он есть. Да, мы сломаем код, который был написан, исходя из предположения о том, что знаковое переполнение возможно. Но я думаю, что это та цена, которую мы можем принять.

В заключение хочется привести еще одну цитату Линуса Торвальдса:

Разработчики gcc больше заинтересованы в попытках выяснить, что еще им позволяет делать стандарт, чем в том, как заставить вещи действительно работать.

И в этом, похоже, заключена главная проблема языка Си. Но подобное не могло произойти на пустом месте — в конечном итоге мы сами позволили этому случиться. Язык Си уже очень давно перестал выполнять возложенные на него функции и превратился в уродливую пародию на самого себя. Но мы этого не заметили, потому что смирились с тем, что наши программы не работают. Мы, как программисты, настолько привыкли к ошибкам, что они стали неотъемлемой частью нашей жизни. Зачастую на отладку и тестирование программ уходит больше времени, чем на проектирование и написание самого кода. И ведь это немудрено — людям свойственно ошибаться. Большую часть багов и уязвимостей программисты вносят случайно, совершенно не задумываясь, и мы ничего не можем с этим сделать. Однако неизбежность ошибок не оправдывает их существование. Задача программиста в том, чтобы писать код, который работает. Даже если это неочевидно, трудно и невозможно, мы не имеем права делать ошибки. Потому что иначе все бессмысленно, и мы перестаем понимать, что можно делать, а что нельзя, что красиво, а что уродливо. В погоне за эффективностью разработчики компиляторов забыли о том, для чего на самом деле нужен язык Си. Он инструмент программиста, а плохим инструментом нельзя написать хорошую программу. Эта история — показательный пример того, что не всякая деятельность плодотворна, и не каждое изменение ведет к лучшему результату. Стараниями комитета стандартизации и разработчиков компиляторов мы в конечном итоге потеряли язык Си. Как инструмент разработки он стал абсолютно бесполезен и даже вреден, и мы обязаны признать это. В противном случае наши программы никогда не будут работать. Пренебрежительное отношение к ошибкам должно уйти в прошлое, а вместе с ним должен умереть и язык Си.

P.S. Если вы все ещё верите, что язык Си можно спасти, ознакомьтесь по ссылке со следующей выдержкой за авторством одного из двух редакторов текста стандарта языка Си:

Мы позволим компилятору лгать вам. Мы будем лгать вашему коду. И когда дела пойдут плохо — ошибка, «обосратушки», утечка памяти — мы торжественно покачаем головами.

Авторы выражают благодарность Андрею Викторовичу Столярову за его критику и комментарии, благодаря которым эта статья приобрела настоящий вид, и без которых, быть может, её и вовсе не было бы.

Соавтор статьи: @aversey

Изначальная публикация: cmustdie.com

Визионеры современности все в один голос говорят, что за нашу жизнь нам
придется несколько раз менять свою профессию. Просто потому, что время
ускорилось, все стремительно меняется, и человеку нужно приспосабливаться к новым условиям. Поговорила об этом с известным в Европе и Америке
композитором Алексеем Шором. Будучи математиком с докторской степенью, Алексей
Шор в возрасте 40 лет поменял профессию и стал успешным композитором. Наш разговор состоялся в Дубае, где с 28 августа по 26 сентября проходил Х Международный фестиваль классической музыки InClassica, композитором-резидентом которого стал Алексей Шор.

— Сейчас многие люди «перепрошивают»
свою жизнь несколько раз: в корне меняют свои профессии. Вы это сделали два
раза?

Смотря
как считать. Я занимался академической математикой, затем прикладной. Если это считать
за две разные карьеры, то сейчас у меня третья.

— Вы, как математик, все просчитали?

Нет,
все происходило более-менее случайно.

— Была какая-то закономерность в
смене профессий? Как одно вытекало из другого?


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

— Когда я читала вашу биографию, было
ощущение, что вы писали музыку только «в стол», потом ее случайно увидели, и
произошло чудо.


Действительно, музыка стала публичной в один момент. Я писал ее для себя, но
однажды Дэвид Аарон Карпентер увидел ноты на моем столе, попробовал сыграть, и
через некоторое время начал повсюду исполнять мои произведения. После этого
моей музыкой заинтересовались и другие музыканты.

— Можно сказать, что музыка – это
хобби, которое превратилось в профессию?


Конечно.

— Что посоветуете другим людям,
которые тоже хотят сменить профессию и сделать карьеру мечты?


Давать советы – странное занятие. У каждого из нас свой жизненный путь,
обстоятельства, способности, удача. У кого как складывается. Нужно оставаться
открытым новым возможностям, тогда может быть что-то и произойдет.

— Никакой закономерности в изменении
сфер деятельности своей жизни вы не заметили?


Нет, какие тут закономерности? Если бы я не познакомился с Дэвидом Аароном Карпентером,
все равно бы продолжал писать для себя и друзей. Кто знает, привели бы меня к тому,
что есть сейчас, какие-то другие случайности судьбы?

— Математика и музыка похожи?


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

— Структурирует мозг? В таком ключе?


Да. Посмотрите вокруг, математика применяется практически везде: в медицине,
архитектуре, IT-сфере…
Математики очень востребованы. И мне эта наука всегда в жизни помогала.

— Не так давно я была в Москве в
консерватории, где проходил конкурс молодых музыкантов. В жюри сидел один из
моих друзей: известный предприниматель, топ-менеджер, который некоторое время
назад увлекся музыкой. Он пишет музыку, не зная нот. Как вы относитесь к таким
композиторам?


Бывают такие феномены. Например, Пол Маккартни тоже не умеет записывать ноты, но
сам Леонард Бернстайн говорил о Поле, как о лучшем композиторе со времен
Шуберта. Это, пожалуй, исключение из правил. По-моему, проще выучить нотную
грамоту, и жизнь станет легче.

— В математике вы дошли до конца и
защитили докторскую. Ставите ли вы перед собой подобную цель в музыке?


У меня нет конкретных целей. Я все время работаю над музыкой: сочиняю,
записываю, слушаю… и хочу, чтобы то, над чем я в данный момент работаю получилась
хорошо.

— Когда музыканты исполняют вашу
музыку, она звучит для вас по-другому?


Музыка в моей голове – набор нот, пока она не прозвучит в чьем-то исполнении.  В завершении фестиваля InClassica состоялись концерты,
которые для меня имеют огромное значение. Михаил Плетнев с таким вдохновением
отнесся к моей музыке, в его интерпретации она зазвучала прекрасно и по-новому.
Этот концерт я буду вспоминать всю свою жизнь. Меня также восхитила игра Максима
Венгерова и Даниэля Лозаковича, который виртуозно исполнил мой недавний
скрипичный концерт, и я впервые услышал его вживую.

— Не могли бы вы привести пример музыканта,
который исполнил вашу музыку идеально точно, как вы себе это и представляли?


Например, Михаил Плетнев. Я сидел, слушал его исполнение и думал: «Вот он
играет точно так, как я себе это представлял». А потом я подумал, может быть,
он просто так убедительно и потрясающе играет, что мне захотелось, чтобы моя
музыка звучала именно так?!

Первая история: Jaskell

Мне рассказывали когда-то о компании, которая писала бекенд на Java и хотела нанимать талантливых разработчиков. Чтобы привлечь их, эта компания размещала вакансии на Haskell, и потом уговаривала этих кандидатов все-таки писать на Java. По-моему, это не очень красиво (вешать ложное объявление — нехорошо), но нас сегодня интересует сама идея, лежащая в основе этой тактики: толковый разработчик важнее, чем стек, которым он пользовался в последнее время.

Вот небольшое видео, иллюстрирующее эту идею:

Вторая история: Kotlin

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

Это оказалось не так-то сложно: все-таки любой программист пользуется каким-то языком программирования каждый день, и на собеседовании можно поговорить про то, как все это работает внутри. Любознательные инженеры знают, как устроены их любимые игрушки, так что с темами для разговора проблем не было.

По сути, мы брали в Kotlin тех, кто хорошо понимал не как работает компилятор, а что такое виртуальная машина, как устроены блокировки потоков в ОС, как устроены структуры данных, которые любой из нас использует каждый день и т.д.

Со временем Kotlin стал известным и успешным, и нам стало проще нанимать людей с профильным опытом. Они принесли в команду очень ценные знания, и мы все вместе сделали крутой востребованный продукт. Но по сей день, насколько я знаю, опыт именно в компиляторах не является обязательным условием для найма в Kotlin.

Из этой истории у меня два вывода:

  • Бывают условия, при которых выгоднее брать просто толковых разработчиков, а не специалистов в узкой области.

  • Специалисты в узкой области дают большой буст, и их обязательно надо тоже нанимать.

Третья история: Alter

Сейчас мы нанимаем разработчиков в Alter. Тут мы не компиляторы пишем, а платформу для психотерапии. Ничего особо экзотического: Python, Django, MySQL, вот это все. Каждый день помогаем сотням людей.

А принципы найма остались те же: мы упоминаем стек в описании вакансий только в разделе «Будет плюсом, но необязательно» потому, что кандидатам хочется знать, на чем написан проект. Не было ни одного кандидата, которого мы не стали бы рассматривать из-за стека.

Но почему-то мы время от времени слышим от знакомых и знакомых знакомых: «а вот я хотел(а) к вам в команду, но я на Java пишу, а у вас Python». Так я и решил написать этот пост.

Важные оговорки:

  • Мы нанимаем опытных разработчиков (Senior и Middle), учить с нуля нам не выгодно. Когда берем Middle, следим, чтобы был потенциал роста до квалификации Senior. Если кандидат застрянет на уровне Middle навсегда, в небольшой команде такой разработчик не очень нужен.

  • На собеседовании мы обсуждаем вопросы, общие для всех бекендовых стеков: как работает HTTP, что делать, чтобы сервис держал нагрузку, как проектировать схемы БД, как искать и устранять ошибки и т.д.

А зачем вообще так делать? Вам что, питонистов не хватает?

Если вам хватает, мы за вас рады :)

Делать так стоит, только если затраты на поиск разработчиков на нужном стеке превышают затраты по онбордингу в этот стек. Ясное дело, если у вас очередь отличных специалистов, которые вдоль и поперек знают какую-нибудь Django (или на чем там у вас бек), то вы не будете смотреть кандидатов с опытом на FastAPI, PHP, Java и т.д. А если вы из десяти кандидатов скрепя сердце готовы взять одного, а он вам говорит, что неделю подумает, потому что у него тут еще три оффера намечается, то, наверное, вам имеет смысл подумать, как расширить воронку.

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

То есть фундаментальная идея проста: человек, хорошо освоивший один инструмент, быстро переучится на другой, достаточно похожий. Если опытному человеку сложно освоить новый стек, то он, вероятно, достиг своего потолка, а это не очень хороший знак. Это дает нам возможность нанимать толковых программистов со всего рынка, а не только с некоторой его части.

Еще один момент, хоть и не такой важный: если кандидат выбирает компанию, а не стек, можно предположить, что он будет больше мотивирован в этой компании и оставаться, а не перейдет через полгода в другое место. Мелочь, а приятно.

Это как у Джоэла: Smart and gets things done?

Еще в 2006 года Joel Spolsky писал в своем The Guerrilla Guide to Interviewing (version 3.0), что достаточно знать о кандидате две вещи: толковый и доводит дело до конца (smart and gets things done). Зачем же тогда этот пост?

Во-первых, многие, и особенно кандидаты, до сих пор верят, что стек — это первый фильтр, по которому отсеиваются вакансии и резюме. Мне бы хотелось, чтобы больше людей понимало, что это далеко не всегда так.

Во-вторых, если ограничиться «smart and gets things done», онбординг может оказаться существенно дороже, чем если брать человека, который решал похожие задачи, просто другими инструментами. Так что мы для себя считаем, что бекендер-джавист превращается в бекендера-питониста как на том видео выше, а вот что там насчет других специализаций — это уже сложный вопрос, который в каждом конкретном случае надо решать индивидуально. Массовому читателю я готов рекомендовать только быстрый онбординг в другой стек, не в другую специализацию.

А всегда ли это так хорошо работает?

Как уже было сказано выше, главное, о чем нужно подумать: окупятся ли затраты на онбординг. При этом надо учитывать несколько существенных моментов.

Не любой разработчик захочет поменять стек

  • Кто-то привязан душой к своему любимому фреймворку и ни за что не «предаст» его. Ну, это не наш клиент, что делать.

  • Кто-то боится, что не справится быстро освоить новый стек. Даже если вокруг будут отзывчивые коллеги, готовые подсказать. Ну, имеет право, тоже не наш клиент.

Некоторые стеки отличаются сильнее, и между ними переход значительно тяжелее

  • Как правило, это связано с тем, что и задачи надо другие решать: если вчера писал обычный бек на PHP, а завтра надо делать highload на Java, онбордиться будет сложновато.

  • Некоторые платформы/проекты до сих пор используют более низкоуровневые абстракции. PHP, Node.js и Python более-менее избавляют от необходимости думать о тредах, а в Java при желании можно этого счастья хлебнуть ого-го сколько. Это зависит от того, как написан ваш Java-проект. Не надо ожидать, что онбординг питониста в мультитрединг будет таким же легким, как онбординг джависта в Django.

Чтобы быстро поменять стек, надо хорошо понимать основы

  • Если кандидат не очень уверенно пользуется своим основным языком программирования, то и новый ему осваивать будет не просто

  • Если HTTP-заголовки или SQL для кандидата — темный лес, тут не до смены стека

  • Если кандидат совсем не понимает, что его любимый фреймворк делает под капотом, ему будет сложно освоить новый фреймворк, который делает под капотом что-то другое

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

  • Поощрять вопросы и запросы на ревью

  • Быстро отвечать на вопросы, чтобы разблокировать товарища (если вопросы выглядят моментально гуглящимися, дружелюбно спросить в личке, в чем дело)

  • Вежливо и аргументированно подсказывать идиомы и разные фишечки на code review

  • Не ругать стек, с которого человек пришел, за недостаточно православное мировоззрение

Получается, для джунов этот подход не работает?

Тут как посмотреть. С одной стороны, для быстрого освоения нового стека надо хорошо знать старый, а Junior еще не успел в нем толком разобраться. С другой стороны, если ты и старый стек не очень знал, много ли ты потерял, пересев на новый?

На самом деле с Junior разработчиками вопрос вообще лежит в другой плоскости. Далеко не всем командам в принципе имеет смысл брать неопытных людей. То есть, если честно, скорее всего на предложение «нам трудно искать синьоров, давайте наберем джунов и доучим на месте», ответ: «отличная идея, но нам это не выгодно».

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

А разве смена стека — это не шаг назад в карьере?

Рекрутеры, а иногда и кандидаты, говорят: если я перейду на новый язык/стек, я в нем не буду таким профи, как в своем привычном языке/стеке — это ведь я стану менее ценным специалистом!

Честно говоря, мне немного грустно от такого подхода к жизни, но я стараюсь отнестись с пониманием и ласково объяснить, что

  • синтаксис языка выучить — это только в первый раз сложно, а третий-пятый язык уже учится гораздо легче,

  • твоя ценность как специалиста состоит не в том, что ты знаешь синтаксис языка и название стандартных функций фреймворка, а в том, что ты понимаешь, как система должна работать и в деталях, и в целом,

  • изучение нового иногда дает свежий взгляд на знакомые вещи, а это приносит многим людям удовольствие.

Вопрос в зал

А вот как вы думаете: для фронтэндеров это тоже работает? Мы пока пишем в своих вакансиях, что нужен опыт на React.js, но, может, зря мы так делаем?

  • Относительные прилагательные как пишутся с не
  • Отмучилась или отмучалась как правильно пишется слово
  • Относительно верный как пишется через дефис или нет
  • Отнесешься как пишется правильно
  • Отмечаете праздник как пишется