Русский
Русский
English
Статистика
Реклама

Emacs

Перевод Что не так с Лиспом?

23.02.2021 16:14:33 | Автор: admin

Во-первых, позвольте мне сказать, что лично я не думаю, что с Лиспом что-то особенно не так. Таким образом, в этом эссе я не буду пытаться отвечать на риторический вопрос в заголовке. Тем не менее, я попытаюсь проанализировать некоторые часто повторяющиеся критические замечания в адрес Lisp, чтобы пролить свет на этот вопрос и на то, почему его так часто задают.

Позвольте мне начать с пары слов для тех кто не в курсе. Lisp - это семейство языков, включая Common Lisp, Emacs Lisp и несколько диалектов, которые сегодня используются лишь изредка. Иногда даже язык Scheme считается членом этого семейства. Считать ли это верным, зависит от того, каково ваше точное определение Lisp, но это является слишком сложным (и неинтересным) вопросом для этого эссе.

В основном я буду использовать Lisp для обозначения Common Lisp, а иногда, когда это удобно, также буду включать Emacs Lisp. Lisp существует уже давно, хотя он был значительно преобразован с момента своего изобретения (некоторые говорят, что он был открыт). Сегодня это современный, мультипарадигменный язык, который обладает, пожалуй, самыми сложными фичами из всех используемых языков общего назначения (объектная система CLOS, языковые макросы, специальные макросы чтения, система условий и рестартов и т. д.).

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

Однако позвольте мне сделать небольшое замечание. Lisp не настолько непопулярный, как можно думать (и теперь для удобства я добавлю Emacs Lisp). В недавнем подсчете количества строк Lisp занял 4-е место по количеству строк исходного кода (SLOC) в дистрибутиве Debian GNU/Linux (Woody) после C, C++ и bash с примерно 4 миллионами SLOC (около 4%), опередив Perl, Python, ML, Fortran и т. д. Это довольно популярный язык, лишь несколько менее популярный, чем C и C++. Конечно, количество SLOC в Debian GNU/Linux - не единственный возможный показатель популярности, но это показатель, как и любой другой.

Недавно я увидел статью в comp.lang.lisp, в которой автор серьезно знал, что с Lisp должно быть что-то не так, потому что, если все будет хорошо, рынок обнаружит это, и Lisp начнет использоваться в программных проектах повсюду. Тот факт, что этого не произошло, доказал автору, что с Лиспом ДОЛЖНО быть что-то не так, даже если он не знал, что именно.

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

Возможно, в Lisp действительно что-то не так, потому что он, кажется, привлекает всевозможных психов, хотя, возможно, я просто не знаю, что это так и для других языков, или для любого другого человеческого артефакта. Обычно это проявляется в случае с Лиспом так: кто-то, плохо знакомый с Лиспом, впервые появляется в группе новостей comp.lang.lisp, дает очень умным и очень знающим людям урок о том, что они не поняли, почему Lisp непопулярен, и продолжает рассказывать им, как им следует изменить язык, чтобы исправить проблему (обычно, изменить синтаксис, чтобы избавиться от множества скобок), или просто сообщить им, что они сделали ошибку, и вместо этого следует использовать другой язык.

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

Подводя итог этому эссе, они просто жертвы невероятно сильного психологического стремления (в некоторой степени, существующего во всех нас), которое заставляет человека пытаться обозначить что-то новое как плохое или бесполезное, просто чтобы избежать тяжелой работы, необходимости учиться этому. Чем страннее новая вещь (например, Lisp), тем сложнее человек оценивает работу по ее изучению и тем важнее становится объявить ее плохой или бесполезной.

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

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

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

Некоторые люди думают, что с Лиспом что-то не так, потому что практически невозможно заставить программное обеспечение работать без изменений на всех платформах (комбинациях Лисп-систем и операционных систем), тогда как с чем-то вроде Python или Ruby это легко. Ясно же, что здесь с Лиспом что-то не так, верно?

Нет, на самом деле нет! Lisp - это не отдельная реализация, а ANSI-стандарт (теперь уже Common Lisp). Как и многие другие стандарты (например, ANSI-стандарт для языка программирования Си), он не содержит всего, что вам может понадобиться при написании приложений, например сокетов, синтаксических анализаторов XML, библиотек SQL и т. д. Вместо этого предоставляются отдельные библиотеки, которые в случае Lisp либо поставляются поставщиком коммерческой системы Lisp, либо бесплатно авторами свободных библиотек для других разработчиков. Таким образом, предполагаемая трудность состоит в том, чтобы написать приложение, которое могло бы работать со всеми этими, возможно, взаимно несовместимыми библиотеками. Разработчик, столкнувшийся с этой проблемой, обычно очень расстраивается, жалуется в comp.lang.lisp, что мы должны исправить стандарт ANSI Common Lisp как можно скорее, чтобы включить эти библиотеки.

Подождите секунду! Почему это не проблема для таких языков, как Python и Ruby, которые даже НЕ ИМЕЮТ стандарта ANSI? Почему люди не жалуются громко, что они даже не могут написать кросс-платформенный цикл или оператор присваивания на Python, потому что способ сделать это не стандартизирован? Ответ: потому что эти люди сравнивают яблоки и апельсины или, в данном случае, язык, определяемый (в основном) одной реализацией, и стандарт с несколькими реализациями. Вот как увидеть, насколько это сравнение абсурдно: если бы я написал новую реализацию Python, в которой не было бы сокетов, разве это внезапно ухудшило бы положение языка Python, в сравнении с тем, что было раньше? Конечно, нет! Точно так же люди, которые хотят использовать язык с единственной реализацией и тем самым рискуют, что язык может измениться в одночасье, что, возможно, сделает большую часть некоторых крупных инвестиций устаревшими, должны принять то же самое с Lisp и выбрать единственную реализацию. который работает во всех операционных системах. Это будет не хуже, чем у любого языка с одной реализацией.

Некоторые ВНУТРИ Lisp-сообщества думают, что Lisp не так популярен, как он того заслуживает, потому что в языке есть недостатки. Таким образом, предполагаемое решение проблемы состоит в создании лучшего диалекта Lisp. Откровенно говоря, если бы это было правдой, то ни у одного другого языка не было бы ни единого последователя, учитывая количество недостатков в других языках по сравнению с недостатками Common Lisp. Одной из типичных попыток создать лучший Lisp был Dylan (больше похожий на Scheme, чем на Lisp, на самом деле), который определяет синтаксис без скобок для Lisp-подобного языка, тем самым по существу лишая Lisp одного из его, пожалуй, величайших преимуществ, а именно почти однозначного соответствия между внешним синтаксисом и внутренним представлением кода, что является важной фичей для создания макросов. А Dylan не более популярен, чем Common Lisp.

В последнее время мы регулярно видим людей (обычно также в сообществе Lisp), у которых есть идеальное объяснение того, почему Lisp не так популярен, как он того заслуживает, а именно, что нет ни одной бесплатной реализации, которая работала бы во всех операционных системах и в которой были бы ВСЕ необходимые библиотеки, как в Python и Ruby для веб-программирования и т. д. (мы уже видели, что в стандарте ANSI Common Lisp их нет). Типичная статья одного из этих людей очень снисходительна. Недавно я видел фразы, похожие на Простите, ребята, но интерфейсы командной строки больше не подходят, в наши дни все основано на графическом интерфейсе, а у вас даже нет стандартной библиотеки графического интерфейса.

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

Большинство авторов этих статей, кажется, серьезно думают, что каким-то образом они будут серьезно восприняты участниками Lisp-сообщества, и что эти участники осознают свои ошибки и начнут предоставлять высококачественные библиотеки для веб-программирования и синтаксического анализа XML бесплатно и сразу. Я не думаю, что это случится. Чтобы понять, почему, мы можем (для этой цели) разделить членов "сообщества Lisp" на три типа людей:
- тех, кто уже тратит значительную энергию и время на написание таких библиотек,
- тех, кто не имеет возможности писать такие библиотеки. (из-за недостатка знаний, энергии или времени), и
- тех, у кого есть возможность сделать это, но они не делают этого.

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

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

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

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

Подробнее..

НЕ VIM, а круче (xah fly keys) или XAH FLY KEYS. Большой выпуск

18.05.2021 00:13:00 | Автор: admin
Если не хотите потратить время зря!

Пока что, эта статья только для EMACS-еров, а изначально создана лишь для меня

Насколько я знаю многие программисты используют VIM, а некоторые тоже используют VIM, но они это делают в EMACS-е, EVIL (злом) режиме, это значит, что эти люди понимают все прелести VIM (быстрое редактирование текста без использования мыши, наличие нескольких режимов и т.д.), но им очень нравится возможность добавлять миллиарды плагинов. Но ещё я знаю, что VIM был сделан несколько миллионов лет назад, для программистов того времени и для того чтобы быть отдельным редактором (не для EMACS), поэтому VIM использует не все возможности которые мог бы, например: Клавиша для входа в командный режим находится в самой жопе углу клавиатуры (и. да я знаю что это можно легко поправить в .vimrc), также если я захочу перейти к редактированию другого файла, то мне нужно:

  1. Перейти в командный режим (Нажав сами знаете куда)

  2. Напечатать `:find` и имя файла

  3. Если я ошибся в имени файла ---> во 2 пункт

Это может занять целую вечность, а менять текущий файл приходиться очень часто! А ещё если вы используйте раскладку dvorak, то как возможно вообще пользоваться VIM-ом? И вообще все клавишы VIM настроены не для того чтобы быстро ими пользоваться, а для того чтобы быстрее запомнить это тоже конечно классно, ведь каждая команда в VIM может превращаться в целое красивое и понятное любому носителю языка, предложение, а XAH FLY KEYS таким похвастаться не может, ведь он крут в другом, быстром редактировании текста, причем если вы пользователь какой-то не популярной раскладке, то лучше вы вряд ли найдете!

Переходим к самому главному в этой прекрасной статье.

XAH FLY KEYS

Все эти недостатки не имеет наш XAH FLY KEYS, он уже был разработан в наше время и не имеет все недостатки VIM, и по моему скромному мнению это самый лучший в мире способ для редактирования текста!

Чуть-Чуть Истории

Этот мощный инструмент разработал XAH LEE, если вы уважающий себя EMACS-ер то вы знаете его имя, ведь этот мудрый китаец придумал ErgoEmacs и возможно вы также пользовались им.

Однако у него есть 1 недостаток (точнее больше, но о них Я вам не расскажу), это не наличие нормальной документации, она конечно есть, но сами посмотрите:

Вам конечно этого может и хватит, но блин XAH FLY KEYS имеет в несколько 10-в раз больше возможностей, которые я попробую объяснить (к сожалению я пользователь QWERTY раскладки и не буду объяснять как всем этим пользоваться на раскладке DVORAK или AZURE).

Установка

На github всё описано, но я всё-таки обьясню краткий способ как это сделать:

  1. Скачать xah-fly-keys через MELPA package manager для EMACS

  2. Вставить и исполнить такой Emacs Lisp код:

    (require 'xah-fly-keys)(xah-fly-keys-set-layout "qwerty") ; обязательно(xah-fly-keys 1)
    

Полбзуемся

Вообще XAH-FLY-KEYS имеет 2 режима: COMMAND и INSERT (как в VIM), но в COMMAND есть тоже несколько режимов или не режимов, а префиксов для HOT-KEYS, сейчас всё объясню чуть по подробнее:

  • INSERT mode - (для вход из COMMAND наберите f) обычное редактирование файла

  • COMMAND mode - (для входа из INSERT наберите Alt+SPACE) режим для набора команд

А если вы в COMMAND mode, то вы можете набрать какую-то буковку и что-то произойдет, например если нажать f, то вы окажетесь в INSERT mode, НО также если вы нажмете SPACE (пробел), то все клавиши изменят свое значения, например если вы нажмете Space f, то вас заставят написать имя буфера для перехода в него, но также есть специальный клавиши и если на них нажать после того как вы нажали SPACE, то клавиши опять изменят свое значение, например если вы напечатайте Space i f, то перейдете в файл путь которого был под курсором.

БАЗА

Начнем с чего-то по проще:

Перемещение

j - влево на один символ

i - вверх на один символ

k - вниз на один символ

l - вниз на один символ

o - вперёд на 1 слово

u - назад на 1 слово

; - вперёд на 1 предложение, Пример:

h - назад на 1 предложение

m - на прошлую закрывающую скобку

. - на прошлую открывающую скобку

/ - на противоположную скобку, Пример:

0 - перейти на место прошлого перемещения.

Это очень удобно, например если вам надо просто добавить import файла, то вы идете сначала в начало файла, пишите импорта, нажимаете 0, и работайте дальше, думая о том что вы гений.

Ctrl+4 - перейти на место следующей ошибки (работает только flycheck-mode)

Ctrl+3 - перейти на место прошлой ошибки (работает только flycheck-mode)

Space H - перейти в начало файла (Space - пробел)

Space N - перейти в конец файла (Space - пробел)

Space p - проскролить (если нажали первый раз -> расположить текущую строчку по середеине экрана, второй раз -> на начало экрана, третий раз -> на конец экрана)

Выделение

8 - выделить текущее слово, если нажмете снова, то выделится вся строка, а потом по одной строке далее

1 - выделить то, что возможно или увеличить, то, что уже выделено

2 или 7 - выделить текущую строку

6 - выделить "блок"

9 - выделить текст в ковычках

t - начать выделять то, где ты двигаешься (VISUAL MODE)

Space a - выделить весь файл

Space o Space - включить режим выделение блоком

Удаление

d - удалить 1 символ позади

5 - удалить 1 символ впереди

e - удалить слово позади

r - удалить слово впереди

x - вырезать строчку если что-то выделено вырезать то, что выделено (см. Копирование/Вставка)

Space g - удалить всё от положения курсора до конца строки

g - удалить блок:

Space k f - удалить все строки, которые подходят к тому, что мы напишим

Space k t - удалить все строки которые совпадают с текущей

Space k g - удалить все строки которые не совпадают с текущей

Space k a - удалить все "пустые" строчки

Редактирование

' - изменить виды разделителей. (Если пробелы -> поменять на подчеркивания, Если подчеркивания -> минусы (тире)), Пример:

z - Закомментировать/Раскомментировать текущую строчку или то, что выделено

w - если нету пробела поставить, если есть удалить.

Очень странная штука.

p - вставить пробел (Для этого не надо переходить в INSERT мод)

b - поменять регистр (Заглавный Регистр, нижний регистр, ВЕРХНИЙ РЕГИСТР)

Space 6 - поменять регистр у всего предложения

Space k e - отсортировать выделенные строчки

Space k p - экранировать все выделенные ковычки (поставить "\" перед ", которые находятся в выделенном тексте)

Space k k - повторить прошлую команду

Space o f - каждую линию обернуть в ковычки или в скобки или в то что вы там напишите, и разделить тем, что вы там выберите

Space o g - превратить пробелы в переходы на новую строку

s - создать новую строчку, но на неё не перейти

Работа с окнами/файлами (FRAMES)

, - перейти в другое окно (FRAME)

4 - разделить окно по горизонтальной линии

Space 4 - разделить окно по вертикальной линии

Space 5 - сделать все окна одинакого размера

Ctrl+7 - следующий буфер (открытый файл)

Ctrl+8 - прошлый буфер (открытый файл)

Ctrl+t - новый пустой буфер

Ctrl+w - закрыть текущий буфер (открытый файл)

Ctrl+s - сохранить буфер (открытый файл)

Space m - просмотреть в dired режиме текущую дерикторию

Ctrl+Shift+s - сохранить буфер как...

Space l b - сохранить все файлы

Space i w - открыть в приложение по умолчанию

Space i g - скопировать полный путь до файла

Space i s - открыть в проводнике файл

Space i f - открыть файл путь которого под курсором (путь не обязательно полный)

Space , Del - удалить текущий файл

Space , x - сохранить все файлы + закрыть редактор

Space , c - запустить текущий файл

При старте поддерживаются вот такие, вот языки:

php

perl

python

ruby

go

haskell

js

typescript

shell

clojure

racket

ocaml

cscript

tex/latex

java

Вид

Space l Space - включить подрисовку пробелов

Space l . - расширить на весь экран (похоже на f11 в вашем браузере)

Space l 2 - подсвечивать текущую строку

Space l 4 - вкл./выкл. показ номера строк

Soace l t - вкл./выкл. перенос строк

Ctrlr+= - увеличить шрифт

Ctrlr+- - уменьшить шрифт

Space l g - создать новое окно и отрыть в нём EMACS с текущим файлом

Плюшки (от Emacs)

Space l 6 - календарь (красивый очень)

Space l 7 - калькулятор (Вот как им пользоваться)

Space l 9 - выполнить команду в теринале

Space l 0 - выполнить команду в терминале, применить к выделению

Space l c - проверить все орфографические ошибки в файле

Space l , - включить браузер в Emacs

Space l d - включить эмулятор терминала в Emacs

Space 9 - проверить на грамотность слово

a - выполнить команду ELisp (тоже самое, что Alt+X)

Помощь. HELP

Space j a - найти все команды совпадающие с нашим шаблоном

Space j j - описать функцию

Space j v - описать горячую клавишу

Space j l - описать переменную

Space j g - дать информацию по всему что у меня есть

Макросы

Space o e - запись макроса

Space o r - стоп записи макроса

Space o h - вызвать последний макрос

Space o w - применить макрос ко каждой выделенной строки

Поиск

n - поиск с переходом, Я не знаю как объяснить, короче вот:

Space k r - поиск + замена, сначала выделит все совпадения так же как и при поиске с переходм, потом будет спрашивать надо ли заменить слово:

  • Напечатайте SPACE, если да

  • Напечатайте DEL, ксли нет

  • Напечатайте ENTER, если пропустить

Space k d - Поиск строк по шаблону (выделенных строк)

Space y - начать поиск текущего слова

Копирование/Вставка

с - копировать (Если ничего не выделено копировать строку)

v - вставить

x - вырезать (Если ничего не выделено вырезать строку)

Работа с регистром 1. WTF?

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

Space k 1 - добавить в регистр 1 выделенный текст (если ничего не выделено -> добавить строку)

Space k 2 - очистить регистр 1

Space k 3 - копировать в регистр 1 = очистить регистр 1; добавить в регистр 1 текст

Space k 4 - вставить содержимое

Кастомизируем

В Emaces любое действие можно сделать через какую-то Eisp фуекцию поэтому настройка также будет на ELisp-е.

  1. Чтобы настроить выполнение какой-нибудь функции при нажатии какой-то клавиши в COMMAND режиме, то :

    (defun my-xfk-addon-command ()  "Modify keys for xah fly key command mode keysTo be added to `xah-fly-command-mode-activate-hook'"  (interactive)  (define-key xah-fly-key-map (kbd "какая-то клавиша") 'имя какой-нибудь функции)  )(add-hook 'xah-fly-command-mode-activate-hook 'my-xfk-addon-command);; Здесь мысоздаем функцию my-xfk-addon-command, ;; которая связывает какую-нибудь функцию с какой-то клавишей.;; а потом с помощью add-hook выполняем эту функцию перед входом в Command mode
    
  2. Чтобы то же самое провернуть только в INSERT ружиме надо выполнить почти такой же код:

    (defun my-xfk-addon-command ()  "Modify keys for xah fly key command mode keysTo be added to `xah-fly-command-mode-activate-hook'"  (interactive)  (define-key xah-fly-key-map (kbd "какая-то клавиша") 'имя какой-нибудь функции)  )(add-hook 'xah-fly-insert-mode-activate-hook  'my-xfk-addon-command);; Здесь мысоздаем функцию my-xfk-addon-command, ;; которая связывает какую-нибудь функцию с какой-то клавишей.;; а потом с помощью add-hook выполняем эту функцию перед входом в insert mode
    

Это всё!!!

Подробнее..

Перевод Дорогой Google Cloud, отказ от обратной совместимости тебя убивает

15.09.2020 18:11:52 | Автор: admin
Чёрт возьми, Google, я не хотел снова писать в блог. У меня так много дел. Ведение блога требует времени, энергии и креатива, которые я мог бы использовать с пользой: мои книги, музыка, моя игра и так далее. Но ты меня достаточно разозлил, и придётся это написать.

Так что давай покончим с этим.

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

Сначала немного предыстории: у Google есть технология хранения данных под названием Bigtable. Это было замечательное техническое достижение, одно из первых (если не первое) бесконечно масштабируемое хранилище пар ключ-значение (key-value store, K/V): по сути, начало NoSQL. В наши дни Bigtable всё ещё хорошо чувствует себя в довольно переполненном пространстве хранилищ K/V, но в то время (2005 год) оно было потрясающе крутое.

Одна забавная деталь Bigtable заключается в том, что у них были внутренние объекты плоскости управления (как часть реализации) под названием tablet-серверы, с большими индексами, и в какой-то момент они стали узким местом при масштабировании системы. Инженеры Bigtable ломали голову, как реализовать масштабируемость, и вдруг поняли, что могут заменить tablet-серверы другими хранилищами Bigtable. Так что Bigtable это часть реализации Bigtable. Эти хранилища там на всех уровнях.

Еще одна интересная деталь заключается в том, что на какое-то время Bigtable стали популярными и вездесущими внутри Google, и у каждой команды было своё хранилище. Поэтому на одном из пятничных собраний Ларри Пейдж небрежно спросил мимоходом: А почему у нас больше одного Bigtable? Почему не обойтись только одним? Теоретически, одного хранилища должно было хватить для всех потребностей хранения Google. Конечно, они никогда не переходили только на одно по практическим причинам разработки (например, последствия потенциального сбоя), но теория была интересной. Одно хранилище для всей Вселенной (кстати, кто-нибудь знает, Amazon такое сделала со своим Sable?)

Так или иначе, вот моя история.

В то время я работал в Google чуть более двух лет, и однажды мне пришло письмо от инженерной команды Bigtable примерно такого содержания:

Уважаемый Стив,

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

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

Всего наилучшего,
Команда Bigtable

В Google вам приходит много почты, поэтому с первого взгляда я прочитал примерно так:

Уважаемый получатель,

Привет от какой-то команды. Мы хотим сообщить, что бла-бла-бла-бла-бла. Бла-бла-бла-бла-бла-бла, и бла-бла-бла немедленно.

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

Всего наилучшего,
Какая-то команда

Я почти удалил его сразу же, но на границе сознания ощутил тягостное, ноющее чувство, что это не совсем похоже на формальное письмо, хотя очевидно, что с адресатом ошиблись, потому что я не использовал Bigtable.

Но это было странно.

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

Они явно назвали моё имя. И письмо отправлено на мой адрес электронной почты, а не на чей-то ещё, и это не cc: или bcc:. Тон очень личный и чёткий. Может, это какая-то ошибка?

Наконец, любопытство взяло верх и я пошёл взглянуть на консоль Borg в дата-центре, который они упомянули.

И конечно, у меня в управлении было хранилище BigTable. Что-что? Я взглянул на его содержимое, и надо же! Оно было из инкубатора Codelab, в котором я сидел первую неделю работы в Google в июне 2005 года. Codelab заставлял вас запустить Bigtable, чтобы вы записали туда некоторые значения, и я, видимо, так и не закрыл хранилище после этого. Оно всё ещё работало, хотя прошло более двух лет.

В этой истории есть несколько примечательных аспектов. Во-первых, работа Bigtable был настолько несущественна в масштабе Google, что только через два года лишнее хранилище кто-то заметил, да и то лишь потому, что версия бинарника устарела. Для сравнения, я когда-то рассматривал возможность использования Bigtable в Google Cloud для моей онлайн-игры. В то время эта услуга стоила примерно $16000 в год за пустую Bigtable на GCP. Я не говорю, что они вас обманывают, но, по моему личному мнению, это большие деньги за пустую грёбаную базу данных.

Ещё один примечательный аспект заключается в том, что хранилище по-прежнему работало через два года. WTF? Дата-центры приходят и уходят; они испытывают перебои, они проходят плановое техническое обслуживание, они всё время меняются. Железо обновляется, коммутаторы меняются местами, всё постоянно совершенствуется. Как, чёрт возьми, они смогли сохранить мою программу запущенной в течение двух лет с учётом всех этих изменений? Это может показаться скромным достижением в 2020 году, но в 2005-2007 годах оно было весьма впечатляющим.

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

Я поблагодарил их, удалил хранилище, и жизнь пошла своим чередом. Но тринадцать лет спустя я всё ещё думаю об этом письме. Потому что иногда мне приходят подобные письма от Google Cloud. Они выглядят так:

Уважаемый пользователь Google Cloud,

Напоминаем, что мы прекращаем обслуживание сервиса [важный сервис, который вы используете] с августа 2020 года, после чего вы не сможете обновить свои инстансы. Рекомендуем перейти на последнюю версию, которая проходит бета-тестирование, не имеет никакой документации, никакого пути миграции и которая заранее устарела с нашей любезной помощью.

Мы стремимся к тому, чтобы это изменение минимально повлияло на всех пользователей платформы Google Cloud.

Лучшие друзья навсегда,
Облачная платформа Google

Но я почти не читаю такие письма, потому что на самом деле в них говорится следующее:

Уважаемый получатель,

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

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

Пожалуйста иди нах,
Облачная платформа Google

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

Прежде чем вернуться к Google Cloud, потому что я даже близко не закончил их критиковать, давайте посмотрим на работу компании в некоторых других областях. Инженеры Google гордятся своей дисциплиной разработки программного обеспечения, и именно это на самом деле вызывает проблемы. Гордость это ловушка для неосторожных, она заставила многих сотрудников Google думать, что их решения всегда правильны и что правильность (по какому-то неопределённому нечёткому определению) важнее, чем забота о клиентах.

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

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

Первая система, которую я выберу, самая старая: GNU Emacs, это своего рода гибрид между Блокнотом Windows, ядром ОС и Международной космической станцией. Это немного сложно объяснить, но в двух словах Emacs это платформа, созданная в 1976 году (да, почти полвека назад) для программирования, чтобы повысить вашу продуктивность, но маскируется под текстовый редактор.

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

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

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

Но в мире Emacs, похоже, другое рабочее определение. Другая основополагающая философия, если хотите.

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

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

Это всё равно что продавать подержанный автомобиль, который точно сломается через 1500 км.

Это два совершенно разных философских определения устаревания. Определение Google пахнет запланированным устареванием. Я не верю, что это на самом деле запланированное устаревание в том же смысле, как у Apple. Но Google определённо планирует сломать ваши программы, окольным путём. Я знаю это, потому что проработал там инженером-программистом более 12 лет. У них есть расплывчатые внутренние рекомендации, в какой мере следует соблюдать обратную совместимость, но в конечном итоге это зависит от каждой отдельной команды или службы. Нет никаких рекомендаций корпоративного или инженерного уровня, и самая смелая рекомендация с точки зрения циклов устаревания это попробуйте дать клиентам 6-12 месяцев на обновление, прежде чем сломать им всю систему.

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

На данный момент я собираюсь сделать смелое утверждение, что Emacs успешен в значительной степени и даже в основном потому, что они так серьёзно относятся к обратной совместимости. Собственно, это и есть тезис нашей статьи. Успешные долгоживущие открытые системы обязаны своим успехом микросообществам, которые десятилетиями живут вокруг расширений/плагинов. Это и есть экосистема. Я уже рассуждал о сути платформ и о том, насколько они важны, и о том, что Google никогда за всю свою корпоративную историю не понимала, что входит в создание успешной открытой платформы, не считая Android или Chrome.

Вообще-то я должен вкратце упомянуть Android, потому что вы наверняка подумали о нём.

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

В одной из прошлых статей я уже рассуждал, насколько плохими были некоторые из ранних дизайнерских решений Android. Чёрт возьми, когда я писал ту статью, они занимались развёртыванием дерьма под названием мгновенные приложения, которые теперь (сюрприз!) устарели, и сочувствую, если вы были достаточно глупы, чтобы послушаться Google и перенести свой контент в эти мгновенные приложения.

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

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

За это я присуждаю Android заветную награду Ты не Google. Они действительно не хотят становится Google, которая не умеет создавать долговечные платформы, а вот Android знает, как это делать. И поэтому Google ведёт себя очень мудро в одном отношении: позволяет людям в Android делать всё по-своему.

Однако мгновенные приложения для Android были довольно глупой идеей. И знаете, почему? Потому что они требовали переписать и перепроектировать ваше приложение! Как будто люди просто так возьмут и перепишут два миллиона приложений. Предполагаю, что мгновенные приложения были идеей какого-то гуглера.

Но здесь есть разница. Обратная совместимость сопряжена с большими затратами. Android сам несёт бремя этих затрат, в то время как Google настаивает на том, чтобы это бремя несли вы, платный клиент.

Вы можете увидеть приверженность Android обратной совместимости в её API-интерфейсах. Когда у вас четыре или пять различных подсистем для выполнения буквально одного и того же, это верный признак, что в основе лежит приверженность обратной совместимости. Что в мире платформ является синонимом приверженности вашим клиентам и вашему рынку.

Главная проблема Google здесь их гордость своей инженерной гигиеной. Им не нравится, когда есть много разных способов делать одно и то же, причем старые, менее желательные способы сидят рядом с новыми, более причудливыми способами. Это увеличивает кривую обучения для новичков в системе, это увеличивает бремя поддержки устаревших API, это замедляет скорость новых функций, и главный грех это некрасиво. Google как Леди Эскот из Алисы в Стране чудес Тима Бертона:

Леди Эскот:
Алиса, знаешь, чего я боюсь больше всего?
Упадка аристократии?
Я опасалась, что у меня будут некрасивые внуки.

Чтобы понять компромисс между красивым и практичным, давайте взглянем на третью успешную платформу (после Emacs и Android) и посмотрим, как она работает: сама Java.

В Java масса устаревших API. Устаревание очень популярно среди Java-программистов, даже популярнее, чем в большинстве языков программирования. В самой Java, основном языке и библиотеках постоянно происходит устаревание API.

Если взять только один из тысяч примеров, закрытие потоков считается устаревшим. Оно устарело с момента выпуска Java 1.2 в декабре 1998 года. Прошло 22 года с тех пор, как это устарело.

Но мой реальный код в продакшне по-прежнему убивает потоки каждый день. Разве это хорошо? Абсолютно! Я имею в виду, конечно, если бы я переписал код сегодня, я бы реализовал это по-другому. Но код моей игры, которая за последние два десятилетия сделала счастливыми сотни тысяч людей, написана с функцией закрытия потоков, которые висят слишком долго, и мне никогда не приходилось его менять. Я знаю свою систему лучше всех, у меня буквально 25-летний опыт работы с ней в продакшне, и я могу точно сказать: в моём случае закрытие этих конкретных рабочих потоков совершенно безвредно. Не стоит тратить время и силы на переписывание этого кода, и хвала Ларри Эллисону (наверное), что Oracle не заставила меня переписывать его.

Наверное, Oracle тоже разбирается в платформах. Кто его знает.

Доказательства вы можете встретить по всем ключевым Java API, которые пронизаны волнами устаревания, подобно линиям ледника в каньоне. В библиотеке Java Swing можно легко найти пять или шесть различных менеджеров навигации с клавиатуры (KeyboardFocusManager). На самом деле трудно найти Java API, который не является устаревшим. Но они всё ещё работают! Думаю, команда Java по-настоящему удалит API только в том случае, если интерфейс вызовет вопиющую проблему безопасности.

Вот в чём дело, ребята: мы, разработчики программного обеспечения, все очень заняты, и в каждой области программного обеспечения мы сталкиваемся с конкурирующими альтернативами. В любой момент времени программисты на языке X рассматривают язык Y как возможную замену. О, вы мне не верите? Вы хотите назвать Swift? Мол, все мигрируют на Swift и никто от него не отказывается, верно? Ого, как мало вы знаете. Компании считают расходы на двойные команды мобильной разработки (iOS и Android) и они начинают понимать, что эти кросс-платформенные системы разработки со смешными названиями, такие как Flutter и React Native, действительно работают, и с их помощью можно сократить размеры своих мобильных команд вдвое или, наоборот, сделать их вдвое продуктивнее. На кону реальные деньги. Да, есть компромиссы, но, с другой стороны, де-е-еньги.

Предположим гипотетически, что Apple по глупости взяла пример с Гвидо ван Россума и объявила, что Swift 6.0 обратно несовместим со Swift 5.0, во многом как Python 3 несовместим с Python 2.

Наверное, я рассказывал эту историю лет десять назад, но лет пятнадцать назад я ездил в лагерь OReillys Foo Camp с Гвидо, сидел в палатке с Полом Грэмом и кучей больших шишек. Мы сидели в изнуряющей жаре и ждали, когда Ларри Пейдж вылетит на своём личном вертолете, а Гвидо монотонно бубнил о Питоне 3000, который он назвал по количеству лет, которое потребуется всем, чтобы туда мигрировать. Мы всё время спрашивали его, почему он нарушает совместимость, и он отвечал: Unicode. И мы спрашивали, если нам придется переписать наш код, то какие еще преимущества мы увидим? И он отвечал Yoooooooooooooouuuuuuuniiiiiiicoooooooode.

Если установить Google Cloud Platform SDK (gcloud), то вы получите следующее уведомление:

Уважаемый получатель,

Мы хотели бы вам напомнить, что поддержка Python 2 устарела, так что пошёёёёёёёёл тыыыыыыы

и так далее. Круг жизни.

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

Сколько программ Python было переписано на Go (или Ruby, или какой-то другой альтернативе) из-за этой обратной несовместимости? Сколько нового программного обеспечения было написано на чём-то другом, кроме Python, хотя оно могло быть написано на Python, если бы Гвидо не сжёг всю деревню? Трудно сказать, но Python явно пострадал. Это огромный бардак, и все в проигрыше.

Итак, допустим, Apple берёт пример с Гвидо и нарушает совместимость. Как думаете, что будет дальше? Ну, может, 80-90% разработчиков перепишут своё программное обеспечение, если получится. Другими словами, 10-20% пользовательской базы автоматически уходят на какой-то конкурирующий язык, например, Flutter.

Сделайте это несколько раз и вы потеряете половину своей пользовательской базы. Как и в спорте, в мире программирования текущая форма тоже значит всё. Любой, кто потеряет половину пользователей за пять лет, будет считаться Большим Жирным Неудачником. Вы же должны быть в тренде в мире платформ. Но именно здесь отказ от поддержки старых версий со временем вас погубит. Потому что каждый раз, когда вы избавляетесь от части разработчиков, вы (а)теряете их навсегда, потому что они сердятся на вас за нарушение контракта, и (б)отдаёте их своим конкурентам.

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

Grok предоставил гуглерам мощную основу для проведения автоматизированного рефакторинга по всей кодовой базе (буквально по всему Google). Система вычисляет не только ваши восходящие зависимости (от которых вы зависите), но и нисходящие (которые зависят от вас), поэтому при смене API вы знаете всех, кого ломаете! Таким образом, при внесении изменений вы можете проверить, что каждый потребитель вашего API обновился до новой версии, а в реальности часто с помощью инструмента Rosie, который они написали, вы можете полностью автоматизировать процесс.

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

И, честно говоря, это довольно хорошо работает для Google внутренне. Я имею в виду, да, сообщество Go в Google действительно по-доброму посмеивается с сообщества Java в Google из-за их привычки к непрерывному рефакторингу. Если вы что-то перезапускаете N раз, то это означает, что вы не только испортили это N-1 раз, но и через некоторое время становится совершенно ясно, что вы, вероятно, испортили это и с N-ой попытки. Но, по большому счету, они остаются выше этой суеты и сохраняют код чистым.

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

Я немного познакомил вас с Emacs, Android и Java; давайте посмотрим на последнюю успешную долгоживущую платформу: сам Веб. Можете представить, через сколько итераций прошёл HTTP с 1995 года, когда мы использовали мигающие теги <blink> и значки В разработке на веб-страницах.

Но это всё ещё работает! И эти страницы всё ещё работают! Да, ребята, браузеры мировые чемпионы по обратной совместимости. Chrome это ещё один пример редкой платформы Google, у которой головы привинчены правильно, и, как вы уже догадались, Chrome эффективно действует как изолированная компания отдельно от остального Google.

Я также хочу поблагодарить наших друзей среди разработчиков операционных систем: Windows, Linux, НЕ APPLE ПОШЛА Т APPLE, FreeBSD и так далее, за то, что они проделали такую большую работу по обратной совместимости на своих успешных платформах (Apple получает в лучшем случае тройку с минусом, так как они постоянно всё ломают без всякой уважительной причины, но каким-то образом сообщество справляется с этим в каждом релизе, и до сих пор контейнеры с OS X ещё не полностью устарели пока).

Но подождите, скажете вы. Разве мы не сравниваем яблоки с апельсинами автономные программные системы на одной машине, такие как Emacs/JDK/Android/Chrome, с многосерверными системами и API, как в облачных сервисах?

Ну, я написал об этом вчера в твиттере, но в стиле Ларри Уолла (создатель языка программирования Perl прим. пер.) по принципу отстой/рулез я поискал слово deprecated на сайтах для разработчиков Google и Amazon. И хотя у AWS в сотни раз больше предложений услуг, чем у GCP, документация разработчиков Google упоминает устаревание примерно в семь раз чаще.

Если кто-то из Google читает это, то наверняка они готовы вытащить диаграммы в показывая стиле Дональда Трампа, что на самом деле делают всё правильно, и что я не должен делать несправедливые сравнения, такие как количество упоминаний слова deprecated в зависимости от количества сервисов.

Но спустя столько лет Google Cloud по-прежнему остается сервисом 3 (я так и не написал статью о неудачной попытке стать 2), но если верить инсайдерам, есть некоторые опасения, что они могут скоро опуститься до 4.

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

Так что это политика. И наверняка будут гневные ответы на моё выступление.

Как пользователь облачной платформы Google, а также как пользователь AWS в течение двух лет (работая в компании Grab), могу сказать, что существует огромная разница между философиями Amazon и Google, когда речь заходит о приоритетах. Я не веду активную разработку на AWS, поэтому не очень хорошо знаю, насколько часто они убирают старые API. Но есть подозрение, что это происходит далеко не так часто, как в Google. И я искренне верю, что этот источник постоянных споров и разочарований в GCP является одним из самых больших факторов, сдерживающих развитие платформы.

Знаю, что не назвал конкретные примеры систем GCP, поддержка которых прекращена. Могу сказать, что практически всё, что я использовал, от сетей (от самых старых до VPC) до хранилищ (Cloud SQL v1-v2), Firebase (теперь Firestore с совершенно другим API), App Engine (давайте даже не будем начинать), облачных конечных точек Cloud Endpoint и до я не знаю абсолютно всё это заставляло переписывать код максимум через 2-3 года, и они никогда не автоматизировали для вас миграцию, а часто не было никакого документированного пути миграции вообще. Словно так и положено.

И каждый раз, когда я смотрю на AWS, я спрашиваю себя, какого чёрта я до сих пор сижу на GCP. Им явно не нужны клиенты. Им нужны покупатели. Понимаете разницу? Давайте объясню.

У Google Cloud есть Marketplace, на котором люди предлагают свои программные решения, а чтобы избежать эффекта пустого ресторана, нужно было заполнить его некоторыми предложениями, поэтому они заключили контракт с компанией Bitnami, чтобы создать кучу решений, которые развёртываются одним щелчком мыши, или я сам должен написать решения, потому что эти ни черта не решают. Они просто существуют как флажки, как маркетинговый наполнитель, и Google никогда не заботило, работает ли какой-то из инструментов в реальности. Я знаю менеджеров по продукту, которые были за рулём, и могу вас заверить, что этим людям наплевать.

Возьмём, к примеру, решение с развёртыванием якобы одним щелчком мыши Percona. Мне до смерти надоели проделки Google Cloud SQL, так что я начал рассматривать в качестве альтернативы создание собственного кластера Percona. И на этот раз Google вроде сделала хорошее дело, они собирались сэкономить мне немного времени и усилий одним нажатием кнопки!

Ну отлично, поехали. Перейдём по ссылке и нажмём эту кнопку. Выбираем Да, чтобы согласиться на все параметры по умолчанию и развернуть кластер в своём облачном проекте Google. Ха-ха, не работает. Ничего из этого дерьма не работает. Инструмент никогда не тестировался, и он начал подгнивать с первой минуты, и меня не удивит, если более половины решений для развёртывания одним щелчком мыши (теперь мы понимаем, почему кавычки) вообще не работают. Это абсолютно беспросветная тьма, куда лучше не входить.

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

И это представляет реальную проблему для GCP, потому что эта ДНК стоит за всеми облачными предложениями. Они не стремятся что-либо поддерживать; хорошо известно, что они отказываются размещать (как управляемый сервис) любое стороннее программное обеспечение до тех пор, пока AWS не сделает то же самое и не построит вокруг успешный бизнес, и когда клиенты буквально потребуют то же самое. Однако нужно приложить определённые усилия, чтобы заставить Google что-то поддерживать.

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

И это не очень хорошо, если вы хотите построить долгоживущую платформу.

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

Если хочешь остаться, то прекрати всё ломать. Ребята, вы же богатые. Мы, разработчики нет. Поэтому, когда дело доходит до того, кто взвалит на себя бремя совместимости, вам нужно взять это на себя. Не нам.

Потому что есть ещё по крайней мере три действительно хороших облака. Они манят к себе.

А теперь я пойду дальше чинить все свои сломанные системы. Эх.

До следующего раза!

P. S. Обновление после прочтения некоторых обсуждений этой статьи (обсуждения великолепны, кстати). Поддержка Firebase не прекращена, и нет никаких планов, о которых я знаю. Тем не менее, у них есть неприятная ошибка потоковой передачи, которая заставляет Java-клиент останавливаться в App Engine. Один из их инженеров помог мне справиться с этой проблемой, когда я работал в Google, но они никогда реально не исправили баг, поэтому у меня есть паршивенький обходной путь, приходится каждый день перезапускать приложение GAE. И так уже четыре года! Теперь у них есть Firestore. Потребуется много работы, чтобы мигрировать на него, так как это совершенно другая система, а ошибка Firebase никогда не будет исправлена. Какой вывод можно сделать? Вы можете получить помощь, если работаете в компании. Наверное, я единственный, кто использует Firebase на GAE, потому что я записываю менее 100 ключей в родном на 100% приложении, и оно перестаёт работать каждые пару дней из-за известной ошибки. Что тут можно сказать, кроме как использовать его на свой страх и риск. Я перехожу на Redis.

Я также видел, как некоторые более опытные пользователи AWS говорили, что AWS обычно никогда не прекращает поддержки никаких сервисов, и SimpleDB отличный пример. Мои предположения, что в AWS нет такой болезни с прекращением поддержки, как у Google, похоже, оправданы.

Кроме того, я заметил, что 20 дней назад команда Google App Engine сломала хостинг критической библиотеки Go, закрыв приложение GAE от одного из основных разработчиков Go. Действительно, глупо получилось.

Наконец, я слышал, что гуглеры уже обсуждают этот вопрос и в целом согласны со мной (люблю вас, ребята!). Но похоже, что они считают проблему нерешаемой, потому что в культуре Google никогда не было правильной структуры стимулов. Думаю, хорошо бы выкроить немного времени, чтобы обсудить абсолютно удивительный опыт работы с инженерами AWS, когда я работал в компании Grab. Как-нибудь в будущем, надеюсь!

И да, в 2005 году у них действительно были разные виды акульего мяса на гигантском шведском столе в здании 43, и мне больше всего нравилось мясо молотоголовых акул. Однако к 2006 году Ларри и Сергей избавились от всех нездоровых закусок. Так что во время истории с Bigtable в 2007 году действительно не было никаких акул и я вас подло обманул.

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

Извините, что обидел сообщество Apple и что не сказал ничего хорошего о Microsoft и т.д. Вы все правы, я очень ценю все дискуссии, которую вызвала эта статья! Но иногда нужно немного пустить волну, чтобы начать обсуждение, вы же понимаете?

Спасибо за чтение.

Апдейт 2, 19.08.2020. Stripe правильно выполняет обновление API!

Апдейт 3, 31.08.2020. Со мной связался инженер Google в Cloud Marketplace, который оказался моим старым другом. Он хотел выяснить, почему не работает C2D, и в конце концов мы выяснили: причина в том, что я создал свою сеть несколько лет назад, а C2D не срабатывает в устаревших сетях из-за отсутствующего параметра подсети в их шаблонах. Думаю, что потенциальным пользователям GCP лучше убедиться, что у них достаточно знакомых инженеров в Google
Подробнее..

Эффективный email как суперсила рекрутера и эйчара

02.02.2021 18:09:11 | Автор: admin

История про рекрутера Марию

Жила-была девушка Мария.Маша работала в рекрутинге вот уже 3 с хвостиком года. Она была опытным и смелым рекрутером, и закрывала за месяц около 4-5 вакансий уровня Middle/Senior. Соискатели и кандидаты очень любили Машу за ее искренность, честность, ответственность и персональный подход к каждому. А Маше, в свою очередь, нравилось общаться с людьми, помогать им и ежедневно узнавать что-то новое. Уже с первого рабочего дня Маша знала, как важно написать правильно первое письмо или сообщение в LinkedIn, и сделать эффективный, персонализированный first touch. В ее понимании first touch = first impression.

По опыту знаю, что без ответа остаются шаблонные и не персонализированные письма.

Изучить информацию о получателе, да это время, но оно не зря потрачено, потому что это будут письма которые не останутся без ответа, и автор письма реализует свои цели деловой переписки! Плюс я всегда стараюсь вести себя честно в переписке и четко понимаю зачем я это делаю! На что обращаю внимание:

  • тема должна быть информативной кратко передавать суть письма;

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

  • и последнее обязательно "call to action", в надежде все таки получить ответ :)

Яна Разумова, HRD в Bergx2

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

82% соискателей отвечали Маше на email, сообщения в LinkedIn, а иногда и на Facebook. Половина из них с удовольствием соглашались на скрининг-интервью. И даже когда по итогу всех процессов выбрали не ее кандидата, Маша оставалась на связи со всеми соискателями, бережно храня новые контакты.

Наступили сложные времена COVID-19, и компания, в которой Маша работала последние несколько лет, не выдержала кризис. Сотрудникам пришлось искать свое место под IT солнцем. Маша не стала исключением из правил.

И вот, в конце 2020, за пару недель до нового года Маша получила оффер в большую и прогрессивную продуктовую компанию с центральным офисом в США!

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

Как думаете, понравилось ли оно Маше? А вам?

Как бы вы оценили это письмо? Как бы ответили на него?

Возможно, написали бы его иначе или перефразировали?

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

Письмо выглядит грамотным, структурированным и аккуратным. Можно поставить плюсы за:

  • пунктуацию,

  • Subject line,

  • приветствие и прощание,

  • ссылку на материалы.

И все же есть моменты, на которые стоило бы обратить внимание.

Hi, Marina!" составляете вы текст на английском, русском или же украинском, будьте внимательней с именами. Марина, возможно, была бы и рада получить такое дружественное письмо. А вот для Марии оно, скорее всего, было обидным.

Листи я формую або укранською, або англйською. Якщо у другому варант все однозначно (як спецалст вказу себе в LinkedIn), то укранський правопис вирзняться правилами. Наприклад, у мене була цла дискуся з скрншотами з нженером Олегом. Кличний вдмнок нового (вд 2019 року) правопису дикту як архачне звертання "Олеже", так "Олегу".

Люда Зюман, Recruiter в EvoTalents

There are a few CVs конструкция there is/there are сбивает с толку читателя и отводит от главной мысли письма.

Proposed можно случайно выйти замуж и даже не заметить этого.

"Are seen/ was opened/ can be found" пассивный залог в тексте, приводит в замешательство. Кто и что должен сделать? Предложения с пассивным залогом тяжелые, увесистые и трудно читаемы.

"CVs can be found here" ссылка это хорошо. В то же время, она должна быть физически больше и заметней. Это поможет читателям открыть письмо даже на телефоне и спокойно увидеть, куда нужно нажимать.

"Don't / might not" два отрицания, идущие одно за другим. Чем больше в письме или речи негативных слов, тем больше негативного отношения вызывает текст и человек на уровне подсознания.

"Don't hesitate to drop a line to Lena" реципиенту понадобится приложить дополнительные усилия, чтобы понять отправителя. Какое отношение to drop a line имеет к твоему отпуску? Что делать с этой информацией дальше?

"For a professional recruiter like you it won't be hard ;-)" и "Thanks in advance!" со стороны это может выглядеть как скрытые за смайлами и эмодзи пассивно-агрессивные манипуляции. Лучше используйте "I appreciate your help."

Subject: New tasks for the recruitment team хорошо, что есть subject line. В то же время, по нынешним стандартам лучше сократить его в два раза.

Hi, Marina та Best regards! несоответствие неформального и делового стилей.

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

Письмо стоит отправлять только тогда, когда вы сами понимаете, что в нем написано, какой ответ или действие ожидаете от реципиента.

Think, write, and think again.

Alexey Kovalenko, Managing Partner at Savvy

Но как выглядит хороший email? На что обращать внимание, составляя письмо кандидату, сотруднику, коллеге или клиенту? Предлагаю рассмотреть следующие 8 правил, и затем разберем каждое из них более детально.

8 правил хорошего письма

ХОРОШЕЕ ПИСЬМО ДОЛЖНО

быть ясным

одно письмо = одно дело

быть коротким

иметь subject line

быть простым

быть без грамматических ошибок

иметь четкую структуру

иметь call to action

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

Что такое ясное (или 'clear' на англ.) письмо?

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

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

Например, вы посылаете огромное сопроводительное письмо, и перегруженный подобными письмами рекрутер выбирает кандидата с письмом по сути. Вы копируете часть сообщения из другого источника и отправляете письмо с тремя разными не читаемыми шрифтами - и ваш собеседник закрывает сообщение без ответа, потому что это невозможно читать. Вы пишете сложным языком - и коллега откладывает ответ вам, чтобы разобраться позже, и больше не возвращается к диалогу. Вы не заботитесь кратко очертить суть в теме письма, и ваше письмо теряется в почтовом ящике среди других Re:Fwd:a quick question. Вы не пишете в письме, чего именно ожидаете в ответ от собеседника - и переписка останавливается. Вы пишете сухим языком - и коллега тянется за стаканом с водой вместо того, чтобы ответить вам. Нам выгодно заботиться о человеке по другую сторону экрана, потому что это сделает переписку эффективнее. And its a nice thing to do.

Саша Голубева, Internal Communications в Very Good Security

Какое письмо короткое, а какое нет?

Для стандартного делового письма будет достаточно 100 слов или 5 предложений.

Less than five sentences is often abrupt and rude, more than five sentences wastes time.

Guy Kawasaki, a Silicon-Valley based author, speaker, entrepreneur, and evangelist

Каким должно быть простое письмо?

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

У меня нет скриптов, всегда от человека иду. Но в целом коротко и по делу. Если совсем ничего не знаю о человеке, просто здороваюсь, почему написала (что предлагаю) и интересно ли? Иногда прошу коллег, если знаю, что они знакомы, сделать интро.

Светлана Рыбалка, Recruiter в AB Games

А что по структуре?

Приветствие

Hello

Персонализированная эмоция

Many thanks for your

Цель

I am writing to

Почему это важно

It is important because..

Call to action

Could you.. / It would help if you

Эмоция

I appreciate your help

Прощание

Best

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

Марина Попруженко, Recruiter в EvoTalents

Одно письмо = одно дело, но можно обо всем и сразу?

One thing at a time или Одно тело = одно дело. Каждое отправленное вами письмо должно быть посвящено только одному. Если вам нужно сообщить о другом вопросе, рассказать о новом проекте, или поделиться чем-то еще лучше написать новое письмо с новой Subject line.

Особенности Subject line

Первым делом ясность и четкость, а креатив и сюжетная линия потом.

Основатель компании Backlinko Брайан Дин в своей статье писал, что строки, где subject line не превышает 36-50 символов (или 4-8 слов), имеют значительно больший процент открытий.

В 2021-м году реципиенты будут читать имейлы в большинстве случае с iPhone. Он, в свою очередь, отображает 37-41 символ (примерно 4-7 слов) и затем обрезает строку. Итог прост: subject line около 20 символов или из 4-х, 3-х, 2-х, а может даже одного слова, увеличивает вероятность открытия и прочтения письма.

Какие основные правила построения Call to action?

Главное правило помнить о нем.

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

  1. Начинайте с глагола: Что человеку нужно сделать?

  2. Используйте цифры. Так вы сделаете жизнь реципиента проще. В особенности, если он работает с цифрами, мыслит алгоритмами и ему привычней такой формат.

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

  4. Давайте не больше двух вариантов. Исследования в передаче Mind Field показали: чем больше у человека вариантов для выбора, тем дольше он думает и сильнее расстраивается, если что-то вдруг пошло не так. Более того, при наличии двух вариантов человек склонен принимать решение быстрее и уверенней.

Bang!

Воспользуйтесь этим чек-листом, чтобы создать письмо иностранному клиенту, коллеге, кандидату или партнеру правильно:

  1. Прежде чем писать, подумайте, зачем вы составляете письмо: что вы хотите, что человек должен сделать.

  2. Заполните Subject line. В идеале 3 и меньше слов, или до 20 символов.

  3. Напишите текст соответственно структуре.

  4. Отдельно проверьте на call to action поймет ли получатель, чего вы от него хотите?

  5. Правильно написали имя реципиента?

  6. Проверьте все сообщение на корректность языка через сервисы (такие как Grammarly и LanguageTool), словари и Google поиск. Сочетаются ли стиль начала и завершения друг с другом?

  7. Перечитайте текст второй раз, как еще можно его сократить?

  8. В случае, если отправляете файлы проверьте, прикрепили ли их?

  9. Внесите в строку отправителя его почту.

  10. Нажмите отправить.

И помните, каждое отправленное письмо ваш личный #TheSmartWayofLearning.

Ваша Марго Подлесная,

PR Manager в Savvy

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru