Уверены, что отличите ассемблер от других языков?

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

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

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

К сожалению, в современной цифровой среде исходит это мнение от людей, которые, как правило, плохо представляют, как реально выглядят современные языки ассемблера. Этот стиль программирования не застрял в 50-х, он развивался вместе с высокоуровневыми языками, вбирая в себя структурные, функциональные и объектно-ориентированные элементы. Он отлично дружит с современными API и DOM. Конечно же, принципиально это низкоуровневый язык, но вы можете с тем же успехом создавать поверх него и высокоуровневые абстракции.

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

1. GUI

Ниже приведен фрагмент кода. Он создает окно с WinAPI и запускает для него цикл обработки сообщений.

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

nMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD     LOCAL wc:WNDCLASSEX       ; создает локальные переменные в стеке      LOCAL msg:MSG     LOCAL hwnd:HWND      mov   wc.cbSize,SIZEOF WNDCLASSEX      ; заполняет значения в членах wc      mov   wc.style, CS_HREDRAW or CS_VREDRAW     mov   wc.lpfnWndProc, OFFSET WndProc     mov   wc.cbClsExtra,NULL     mov   wc.cbWndExtra,NULL     push  hInstance     pop   wc.hInstance     mov   wc.hbrBackground,COLOR_WINDOW+1     mov   wc.lpszMenuName,NULL     mov   wc.lpszClassName,OFFSET ClassName     invoke LoadIcon,NULL,IDI_APPLICATION     mov   wc.hIcon,eax     mov   wc.hIconSm,eax     invoke LoadCursor,NULL,IDC_ARROW     mov   wc.hCursor,eax     invoke RegisterClassEx, addr wc        ; регистрирует класс window      invoke CreateWindowEx,NULL,         ADDR ClassName, ADDR AppName,\         WS_OVERLAPPEDWINDOW,\         CW_USEDEFAULT, CW_USEDEFAULT,\         CW_USEDEFAULT, CW_USEDEFAULT,\         NULL, NULL, hInst, NULL     mov   hwnd,eax     invoke ShowWindow, hwnd,CmdShow        ; отображает окно на рабочем столе      invoke UpdateWindow, hwnd              ; обновляет клиентскую область      .WHILE TRUE                            ; вход в цикл сообщений                  invoke GetMessage, ADDR msg,NULL,0,0                 .BREAK .IF (!eax)                 invoke TranslateMessage, ADDR msg                 invoke DispatchMessage, ADDR msg    .ENDW     mov     eax,msg.wParam                 ; возврат кода выхода в eax      ret WinMain endp

Это ассемблер

Код написан на MASM32, который, по сути, является набором макросов и библиотек поверх Microsoft Assembler. Он чудесно работает с WinAPI и прост в освоении. И хотя обслуживание крупных приложений с его помощью все еще вызывает сложности, создание простых, чистых и быстрых программ на этом языке дается без проблем.
Источник: Iczelion’s Win32 Assembly Homepage, Tutorial 3: A Simple Window. win32assembly.programminghorizon.com/tut3.html

Это что-то другое

Код написан на MASM32, который, по сути, является набором макросов и библиотек поверх Microsoft Assembler. Он чудесно работает с WinAPI и прост в освоении. И хотя обслуживание крупных приложений с его помощью все еще вызывает сложности, создание простых, чистых и быстрых программ на этом языке дается без проблем.
Источник: Iczelion’s Win32 Assembly Homepage, Tutorial 3: A Simple Window. win32assembly.programminghorizon.com/tut3.html

2. Библиотеки

Ниже дан пример функциональной библиотеки. Функция “add” просто складывает два целых числа и возвращает их сумму.

(module   (func $add (param $lhs i32) (param $rhs i32) (result i32)     get_local $lhs     get_local $rhs     i32.add)   (export "add" (func $add)) )

Это ассемблер

Это WebAssembly. И хотя основная его идея состоит в предоставлении двоичного кода для веб независимо от исходного языка, он и сам по себе является вполне легитимным языком ассемблера. В нем можно непосредственно писать программы для веб, и он может сам выступать исходным языком.
Источник: примеры WebAssembly с официального сайта: developer.mozilla.org/en-US/docs/WebAssembly.

Это что-то другое

Это WebAssembly. И хотя основная его идея состоит в предоставлении двоичного кода для веб независимо от исходного языка, он и сам по себе является вполне легитимным языком ассемблера. В нем можно непосредственно писать программы для веб, и он может сам выступать исходным языком.
Источник: примеры WebAssembly с официального сайта: developer.mozilla.org/en-US/docs/WebAssembly.

3. Алгоритмы

Это реализация алгоритма TPK. Она содержит функцию, несколько циклов, массив и инструкцию вывода в консоль.

1   c@VA t@IC x@½C y@RC z@NC 2   INTEGERS +5 →c 3           →t 4       +t      TESTA Z 5       -t 6               ENTRY Z 7   SUBROUTINE 6→z 8       +tt→y→z 9       +tx→y→x 10  +z+cx   CLOSE WRITE 1  11  a@/½ b@MA c@GA d@OA e@PA f#HA i@VE x@ME 12  INTEGERS +20 →b +10 →c +400 →d +999 →e +1 →f 13  LOOP 10n 14      n→x 15  +b-x→x 16      x→q 17  SUBROUTINE 5 →aq 18  REPEAT n 16      +c →i 20  LOOP 10n 21      +an SUBROUTINE 1 →y 22      +d-y TESTA Z 23      +i SUBROUTINE 3 24      +e SUBROUTINE 4 25              CONTROL X 26              ENTRY Z 27      +i SUBROUTINE 3 28      +y SUBROUTINE 4 29              ENTRY X 30      +i→f→i 31  REPEAT n 32  ENTRY A CONTROL A WRITE 2 START 2

Это ассемблер

Это не ассемблер. Перед вами разработка Алика Гленни — AUTOCODE– один из первых высокоуровневых языков.
источник: The Early Development Of Programming Languages by Donald E. Knuth, Luis Trabb Pardo, 1976.

Кстати, TPK означает «Typical Pardo Knuth» (типичный Пардо Кнут, от имени его создателя) Это не настоящий алгоритм, и создавался он для демонстрации нескольких языков в одном примере.

Это что-то другое

Это не ассемблер. Перед вами разработка Алика Гленни — AUTOCODE– один из первых высокоуровневых языков.
источник: The Early Development Of Programming Languages by Donald E. Knuth, Luis Trabb Pardo, 1976.
Кстати, TPK означает «Typical Pardo Knuth» (типичный Пардо Кнут, от имени его создателя) Это не настоящий алгоритм, и создавался он для демонстрации нескольких языков в одном примере.

4. Структурное программирование

Вот пример вычисления суперскалярной суммы.

v0 = my_vector              // нам нужна горизонтальная сумма следующего int64 r0 = get_len ( v0 ) int64 r0 = round_u2 ( r0 ) float v0 = set_len ( r0 , v0 ) while ( uint64 r0 > 4) { 	uint64 r0 > >= 1 	float v1 = shift_reduce ( r0 , v0 ) 	float v0 = v1 + v0 } // Теперь сумма представлена скаляром в v0 

Это ассемблер

Это язык ассемблера ForwardCom. Агнер Фог, который, помимо прочего, является автором популярных мануалов оптимизации и живым вдохновением для всех нас, позиционирует этот синтаксис как более дружественный для программистов. По существу, он не предназначен для компьютеров, но раз Си оказывается для большинства людей более удобен, чем операционный код, то идея сделать программирование на ассемблере более Си-подобным выглядит вполне актуальной.
Источник: примеры кода из ForwardCom: An open-standard instruction set for high-performance microprocessors by Agner Fog.

Это что-то другое

Это язык ассемблера ForwardCom. Агнер Фог, который, помимо прочего, является автором популярных мануалов оптимизации и живым вдохновением для всех нас, позиционирует этот синтаксис как более дружественный для программистов. По существу, он не предназначен для компьютеров, но раз Си оказывается для большинства людей более удобен, чем операционный код, то идея сделать программирование на ассемблере более Си-подобным выглядит вполне актуальной.
Источник: примеры кода из ForwardCom: An open-standard instruction set for high-performance microprocessors by Agner Fog.

5. Еще структурное программирование

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

GET "LIBHDR"  GLOBAL $(         COUNT: 200         ALL: 201 $)  LET TRY(LD, ROW, RD) BE         TEST ROW = ALL THEN                 COUNT := COUNT + 1         ELSE $(                 LET POSS = ALL & ~(LD | ROW | RD)                 UNTIL POSS = 0 DO $(                         LET P = POSS & -POSS                         POSS := POSS - P                         TRY(LD + P << 1, ROW + P, RD + P >> 1)                 $)         $)  LET START() = VALOF $(         ALL := 1         FOR I = 1 TO 12 DO $(                 COUNT := 0                 TRY(0, 0, 0)                 WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT)                 ALL := 2 * ALL + 1         $)         RESULTIS 0 $)

Это ассемблер

Это не ассемблер. Знакомьтесь – это BCPL – язык, на основе которого родился B и Си. А из Си, как вы знаете, произошел C++, Java, C# и даже в некотором смысле JavaScript. Это высокоуровневый язык, который не так уж стар. Появился он после Fortran, Algol, Cobol, Lisp, APL. Его сильной стороной в свое время была простота, но не передовые возможности. Тем не менее самая первая программа Hello World была написана именно на BCPL. То же касается и первой MMORPG.
Источник: BCPL From Wikipedia, the free encyclopedia.

Это что-то другое

Это не ассемблер. Знакомьтесь – это BCPL – язык, на основе которого родился B и Си. А из Си, как вы знаете, произошел C++, Java, C# и даже в некотором смысле JavaScript. Это высокоуровневый язык, который не так уж стар. Появился он после Fortran, Algol, Cobol, Lisp, APL. Его сильной стороной в свое время была простота, но не передовые возможности. Тем не менее самая первая программа Hello World была написана именно на BCPL. То же касается и первой MMORPG.
Источник: BCPL From Wikipedia, the free encyclopedia.

6. ООП (с классами и методами)

Вот ассемблер .NET (не путать с ассемблером в «языке ассемблера»). Он состоит из одного модуля с одним классом, имеющим один метод, который выводит в консоль “Hello World”.

// Metadata version: v2.0.50215 .assembly extern mscorlib {   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )   .ver 2:0:0:0 } .assembly sample {   .custom instance void [mscorlib]System.Runtime.CompilerServices     .CompilationRelaxationsAttribute::.ctor(int32) =       ( 01 00 08 00 00 00 00 00 )   .hash algorithm 0x00008004   .ver 0:0:0:0 } .module sample.exe // MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003       // WINDOWS_CUI .corflags 0x00000001    //  ILONLY // Image base: 0x02F20000  // =============== CLASS MEMBERS DECLARATION ===================  .class public auto ansi beforefieldinit Hello        extends [mscorlib]System.Object {   .method public hidebysig static void  Main(string[] args) cil managed   {     .entrypoint     // Размер кода       13 (0xd)     .maxstack  8     IL_0000:  nop     IL_0001:  ldstr      "Hello World!"     IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)     IL_000b:  nop     IL_000c:  ret   } // конец метода Hello::Main    .method public hidebysig specialname rtspecialname           instance void  .ctor() cil managed   {     // Размер кода       7 (0x7)     .maxstack  8     IL_0000:  ldarg.0     IL_0001:  call       instance void [mscorlib]System.Object::.ctor()     IL_0006:  ret   } // конец метода Hello::.ctor  } // конец класса Hello 

Это ассемблер

Да, это ассемблер, написанный на ассемблере. Это ILAsm (промежуточный язык ассемблера), который ассемблируется в промежуточный язык .NET.
Вы вольны использовать все возможности .NET: GUI, обращение к базе данных, сетевые функции – все это при одновременном наличии низкоуровневого контроля деталей. Да, такой вариант может показаться чересчур многословным и неоправданно подробным, но все равно он представляет весьма мощный вариант ассемблера. Помимо классов и методов в качестве встроенных типов он предлагает исключения и строки.
Источник: docs.microsoft.com/en-us/dotnet/framework/tools/ilasm-exe-il-assembler.
Бессовестная реклама: пару лет назад я начал вводить в ILAsm макросы, создавая MILasm. Это вполне рабочее доказательство концепции. С ним интересно играться, хотя для продакшена он не совсем готов ввиду наследственных проблем с производительностью.

Это что-то другое

Да, это ассемблер, написанный на ассемблере. Это ILAsm (промежуточный язык ассемблера), который ассемблируется в промежуточный язык .NET.
Вы вольны использовать все возможности .NET: GUI, обращение к базе данных, сетевые функции – все это при одновременном наличии низкоуровневого контроля деталей. Да, такой вариант может показаться чересчур многословным и неоправданно подробным, но все равно он представляет весьма мощный вариант ассемблера. Помимо классов и методов в качестве встроенных типов он предлагает исключения и строки.
Источник: docs.microsoft.com/en-us/dotnet/framework/tools/ilasm-exe-il-assembler.
Бессовестная реклама: пару лет назад я начал вводить в ILAsm макросы, создавая MILasm. Это вполне рабочее доказательство концепции. С ним интересно играться, хотя для продакшена он не совсем готов ввиду наследственных проблем с производительностью.

7. ООП (с объектами и сообщениями)

Это пример TCP-сервера. В нем есть объекты и методы, а работает он в собственной среде.

Namespace current addSubspace: #SimpleTCP! Namespace current: SimpleTCP!  "A simple TCP server" Object subclass: #Server   instanceVariableNames: 'serverSocket socketHandler'   classVariableNames: ''   poolDictionaries: ''   category: ''!  !Server class methodsFor: 'instance creation'!  new: aServerSocket handler: aHandler   | simpleServer |   simpleServer := super new.   simpleServer socket: aServerSocket.   simpleServer handler: aHandler.   simpleServer init.   ^simpleServer !!  !Server methodsFor: 'initialization'!  init   ^self !!  !Server methodsFor: 'accessing'!  socket   ^serverSocket !  socket: aServerSocket   serverSocket := aServerSocket.   ^self !  handler   ^socketHandler !  handler: aHandler   socketHandler := aHandler.   ^self !!  !Server methodsFor: 'running'!  run   | s |   [     serverSocket waitForConnection.     s := (serverSocket accept).     self handle: s   ] repeat !  !Server methodsFor: 'handling'!  handle: aSocket   socketHandler handle: aSocket !!

Это ассемблер

Это не ассемблер. Перед вами GNU SmallTalk – один из наиболее влиятельных ранних языков ООП. У него не совсем удобный синтаксис, но с программированием на ассемблере ничего общего этот язык не имеет. Более того, он максимально далек от низкоуровневого платформо-зависимого программирования.
Источник: Building a simple chat server with GNU Smalltalk using class inheritance из smalltalk.gnu.org/wiki/examples\

Это что-то другое

Это не ассемблер. Перед вами GNU SmallTalk – один из наиболее влиятельных ранних языков ООП. У него не совсем удобный синтаксис, но с программированием на ассемблере ничего общего этот язык не имеет. Более того, он максимально далек от низкоуровневого платформо-зависимого программирования.
Источник: Building a simple chat server with GNU Smalltalk using class inheritance из smalltalk.gnu.org/wiki/examples\

Заключение

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

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

ссылка на оригинал статьи https://habr.com/ru/company/ruvds/blog/554910/

Зачем программисту современное искусство?

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

Чувство прекрасного

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

«Их миссия в жизни, кажется, состоит в том, чтобы использовать наиболее интеллектуально превосходный метод решения любой задачи и продемонстрировать это. Кажется, что у всех людей справа от бывшего железного занавеса есть этот фетиш: абстрактная наука и математика. Если есть что-то связанное с алгоритмами, то они напишут самый потрясающий код, используя самые сильные знания в CS. Однако они никогда не отличались эстетическим чувством, поэтому UI / UX — это то, в чем они не особо хороши. Их код выглядит как их язык — кратко, остро и по существу. Красиво — но как бульдозер, а не как Porsche. Если вам нужно решить сложные проблемы, то их код будет лучшим. Если вы хотите создать хорошо продаваемый продукт, то, возможно, вам нужны специалисты из других стран в вашей команде, чтобы уравновесить их великолепие».

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

Пространство неизвестного

Что изображено на этой картине? Непонятно. Но стоит она $80 млн.

«Фальстарт», Джаспер Джонс, написана в 1959 г.
«Фальстарт», Джаспер Джонс, написана в 1959 г.

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

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

Если ты даешь шанс непонятному, то имплицитно готов к уступкам в виде чужого мнения или знания, которым пока не обладаешь. В этом смысле современное искусство – это лекарство от вульгарного индивидуализма. Есть то, что ты не понимаешь? Хорошо. Ты отдаешь себе отчет в том, что у того, что ты не понимаешь, может быть смысл? Замечательно. Продолжаем работать.

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

Современное искусство – это знак «неизвестного».

Определенный стиль мышления

Современное искусство развивается там, где его покупают. Разумеется, основными покупателями работ современных художников являются люди достаточно обеспеченные, то есть те, кто могут позволить себе приобрести то, что еще недавно было экспонатом на выставке. Здесь следует обратить внимание на важную деталь – то, что сейчас называется «современным искусством» появилось и быстро развивалось именно в западных странах, а его потребителями (читай — покупателями) становились люди с определенным стилем мышления, выработанным под действием специфических культурных практик. Одной из причин крайней популярности современно искусства на Западе является то, что основными потребителями современного искусства являются те люди, которых оно отсылает к их же способу существования. Это вопрос определенного когнитивного стиля. В тех странах, где современное искусство развивается быстро и эффективно, доминируют своеобразные модели поведения, закрепленные формальными и неформальными институтами – культурой и формальными правилами социальной игры. Особенностью этих моделей поведения является то, что они способствуют эффективности именно в этой социальной системе – они заточены под то, чтобы приводить человека к успеху именно в обществе с такой структурой формальных и неформальных правил. Успех – это деньги, слава, уважение и другие приятные бонусы к существованию. У всего этого есть своя цена.

Именно в этой социальной системе для того, чтобы быть эффективным, нужно создать нечто новое — чтобы заработать деньги, люди должны создавать то, чего еще не было, удержаться в процессе создания новшества и не останавливаться в случае неудачи. Разумеется, это довольно сложно и требует поддержки в виде культурного фона. Интенция на новшество создает специфическую культуру, спутником которой является и определенный когнитивный стиль. Эти люди проходили через «мясорубку поиска» — это постоянная трансгрессия существования, включающая риск и обязательные издержки в виде времени, неудач, постоянных попыток создания того, чего еще не было. Это непрекращающееся поиск, который в конечном счете приводит к позитивному результату. Либо не приводит. Но если результат есть, то человек приходит на выставку в галерею современного искусства и эти странные объекты отсылают его к тому, что является его способом существования, они отсылают к его жизни и, возможно, его ностальгии. В этом случае объект современного искусства – это знак определенного стиля мышления, знак, который отсылает к вполне определенной антропологической практике.

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

Любимым примером институциональных экономистов является самый богатый человек Мексики – Карлос Слим. Аджемоглу и Робинсон сравнивают Карлоса Слима и Билла Гейтса (на момент написания книги «Почему одни страны богатые, а другие бедные» 1-е и 2-е место в списке самых богатых людей мира). Билл Гейтс является основателем крупнейшей инновационной компании, он начал свой путь с создания программного обеспечения. Мексиканец Карслос Слим заработал свои деньги не благодаря собственным изобретениям – он их заработал благодаря знакомствам в высших эшелонах власти, что позволило ему стать мексиканским королем госзаказа и создать свою монополию при помощи крайне высоких барьеров входа для конкурентов.

Экономические институты США и Мексики сильно различаются. В США доминируют так называемые инклюзивные институты, которые позволяют большинству людей свободно и эффективно заниматься экономической деятельностью. В Мексике доминируют экстрактивные институты, которые исключают большинство людей из пространства дележки. То, что позволило Карлосу Слиму заработать свои миллиарды в Мексике, не сработало в США: когда он попытался выйти на рынок США, то потерпел поражение – социальные связи больше не работали.

Однако различие в экономических институтах – это только видимое различие. Они влекут за собой и различия в моделях поведения, а в конечном счете и в отборе доминирующих когнитивных стилей. Для того, чтобы преуспеть, например, в США нужно уметь создавать новое. Для того, чтобы преуспеть в Мексике, нужно уметь играть в социальные игры и грамотно ограничивать доступ к ресурсам другим людям. Эти модели поведения сильно различаются. Знаком первой из этих моделей как раз и является современное искусство. Другими словами, современное искусство – это игра не для всех обществ. Да, представители обществ с доминированием экстрактивных институтов могут включаться в эту игру, но это будет симулятивной практикой без отсылки к их когнитивным особенностям и их способу существования. Карлос Слим является крупнейшим филантропом Мексики – он построил музей искусства в Мехико. Но для него это лишь символический «отмыв» денег, попытка мимикрировать под западных предпринимателей, самостоятельно построивших новый продукт. Дело не только в разнице экономических институтов, но и в разнице доминирующих когнитивных стилей элит.

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

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

Зачем программисту современное искусство? Затем, чтобы напомнить о своем способе существования – своих проектах, своей эпохе «бури и натиска». Современное искусство – это актуализация индивидуального существования. Если у тебя нет знакомого заместителя министра, то все зависит только от тебя. Дерзай. И возможно, когда-нибудь тебе захочется зайти в галерею и купить этот странный объект, который отошлет тебя к тому тебе, которым ты был, когда проходил через свою «мясорубку поиска». Мир меняется, Россия меняется, правила игры тоже меняются.

«Крик», Эдвард Мунк, 1895 год.
«Крик», Эдвард Мунк, 1895 год.

Знак определенного институционального окружения

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

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

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

Если нет фиксированных правил и нет потребности в деформации границ существующих правил, то может наблюдаться инфляция идеи современного искусства.

«Флаг», Джаспер Джонс, 1958 год.
«Флаг», Джаспер Джонс, 1958 год.

Пространство перманентной инновации

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

Почему мы вешаем на стенах своих квартир картины, на которых изображены солнечные лесные опушки? Эволюционная эстетика подсказывает: потому что срабатывают древние инстинкты тех времен, когда наши предки по опушкам селились и корнеплоды собирали. А в чащу им нельзя было. Там – съедят. Сегодня смотрит гоминид с развитыми лобными долями на солнечную опушку на стене и инстинктивно радуется – вспоминает родные просторы. Классическое искусство должно доставлять удовольствие. Современное искусство – это совсем другая история.

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

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

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

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

«Balloon Dog», Джефф Кунс
«Balloon Dog», Джефф Кунс

P.S.

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

ссылка на оригинал статьи https://habr.com/ru/post/555326/

Второй поэт после Шекспира: кто такой Александр Поуп и как он обогатил английский

Уильяма Шекспира знают без малого все. Не только в Британии, но и во всем мире. Это поэт №1.

А кто знает Александра Поупа? Британцы изучают его в университетах, но мы уверены, что среди читателей Хабра с его творчеством знакомы очень немногие. Поуп — это второй по цитируемости поэт в английском языке, автор переводов Гомера и создатель целого ряда идиом, которые сегодня считаются «народными».

А дядька-то на самом деле был очень крут. Поэтому сегодня расскажем именно о нем.

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

Согласно с данными The Oxford Dictionary of Quotations, Александр Поуп — это второй англоязычный поэт по цитируемости в мире. Но многие используют его афоризмы и идиомы, даже не зная имени автора. 

Он жил в XVII-XVIII веке, но его сатира остается актуальной и по сегодня, а его переводы «Илиады» и «Одиссеи» Гомера и сегодня изучают на филологических факультетах в британских вузах.

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

Послушайте, как звучит «Илиада» на английском. Обратите внимание на ритмику и рифмы.

Впрочем, подобные вольности пришлись не по вкусу многим литераторам. Ричард Бентли, британский критик и филолог, а также современник Поупа, писал ему: 

It is a pretty poem, Mr. Pope, but you must not call it Homer.

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

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

Произведение «Опыт о критике» (An Essay on Criticism) буквально сделало неизвестного литератора одной из топовых фигур в британской поэзии. Он писал, что плохая критика наносит куда больше вреда, чем плохие стихи. 

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

Tis hard to say, if greater Want of Skill
Appear in Writing or in Judging ill;
But, of the two, less dang’rous is th’ Offence,
To tire our Patience, than mis-lead our Sense:
Some few in that, but Numbers err in this,
Ten Censure wrong for one who Writes amiss;
A Fool might once himself alone expose,
Now One in Verse makes many more in Prose.

***

(Пер. А Субботина)
Не часто блещет мастерством пиит,
Равно и критик, что его хулит;
Однако лучше докучать стихом,
Чем с толку сбить неправедным судом.
Немало многогрешных там и тут,
Один скропает — десять оболгут;
Разоблачит себя невежда сам,
Коль пристрастится к виршам иль к речам. 

За жесткую сатиру над известными личностями Поуп получил прозвище The Wicked Wasp of Twickenham — Злобная оса Туикенема. Для справки: Туикенем — это пригород Лондона, где проживал писатель. 

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

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

После восстания якобитов в 1715 году Поуп начал критически отзываться также о политиках и государственных деятелях, из-за чего получил несколько высокопоставленных недоброжелателей. Поэмы The Rape of the Lock («Похищение локона»), The Dunciad («Дунсиада») и Moral Essays («Опыты о морали») считаются одними из наиболее смысловых произведений Поупа и английской литературы в целом.

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

Топ-5 самых известных фраз Александра Поупа

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

Damn with faint praise

Дословно переводится как «проклятье слабой похвалой». Так называют похвалу настолько нейтральную и бессмысленную, что она превращается в порицание. Это емкое словосочетание Поуп использовал в поэме Epistle to Dr Arbuthnot («Послание к доктору Арбутноту»).

Отрывок из поэмы под спойлером:

Peace to all such! but were there one whose fires

True genius kindles, and fair fame inspires,

Blest with each talent and each art to please,

And born to write, converse, and live with ease:

Should such a man, too fond to rule alone,

Bear, like the Turk, no brother near the throne,

View him with scornful, yet with jealous eyes,

And hate for arts that caus’d himself to rise;

Damn with faint praise, assent with civil leer,

And without sneering, teach the rest to sneer;

Willing to wound, and yet afraid to strike,

Just hint a fault, and hesitate dislike;

Alike reserv’d to blame, or to commend,

A tim’rous foe, and a suspicious friend;

Dreading ev’n fools, by flatterers besieg’d,

And so obliging, that he ne’er oblig’d;

Like Cato, give his little senate laws,

And sit attentive to his own applause;

While wits and templars ev’ry sentence raise,

And wonder with a foolish face of praise.

Who but must laugh, if such a man there be?

Who would not weep, if Atticus were he? 

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

Чтобы было более понятно, что такое damn with faint praise, приведем пример:

I just love your dress! It really helps disguise your hips.

Мне очень нравится твое платье! Оно и правда помогает скрыть твои бедра.

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

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

A little learning is a dangerous thing

Прежде чем стать пословицей, эта фраза немного изменилась. Большинство носителей языка знают ее как «A little knowledge is a dangerous thing» — досл. «Полузнание — опасная вещь». В литературных адаптациях пословицу иногда передают как «Полузнание хуже незнания». 

Встретилась эта фраза в поэме «Опыт о критике». Именно здесь и дальше Поуп в очень остром сатирическом стиле высмеивает критиков, у которых недостаточно знаний. 

A little learning is a dangerous thing;
Drink deep, or taste not the Pierian spring;
There shallow draughts intoxicate the brain,
And drinking largely sobers us again.       

***

(пер. М.Бычков)
И полузнайство ложь в себе таит;
Струею упивайся пиерид:
Один глоток пьянит рассудок твой,
Пьешь много — снова с трезвой головой.

Сегодня практически никто из нейтивов не знает, что автор пословицы — Александр Поуп. А ею активно пользуются даже в популярной культуре:

Fools rush in where angels fear to tread

Дословный перевод — «Дураки лезут туда, куда ангелы ступить боятся». Это сложная контекстная пословица, которая при этом не несет осмотрительных смыслов. Когда вы говорите, что кто-то «rush in where angels fear to tread», то вы мягко журите его, ведь он ставит себя в опасное или неудобное положение, не думая о последствиях. Самый близкий аналог в русском — это «Дураку закон не писан», но английский вариант куда менее категоричен и груб. 

Встречаем эту фразу тоже в «Опыте о критике»:  

Name a new Play, and he’s the Poet’s Friend,
Nay show’d his Faults—but when wou’d Poets mend?
No Place so Sacred from such Fops is barr’d,
Nor is Paul’s Church more safe than Paul’s Church-yard:
Nay, fly to Altars; there they’ll talk you dead;
For Fools rush in where Angels fear to tread.

***

(пер. М.Бычков)
Неудержим хлыщей таких напор,
Не защищен от них не только двор
Собора Павла, но и сам собор:
У алтаря найдут и даже тут
Своею болтовней вас изведут.
Всегда туда кидается дурак,
Где ангел не решится сделать шаг.

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

По традиции, пример из песни. На этот раз несравненного Элвиса (которая по факту является кавером на одноименный хит Фрэнка Синатры):

Fritter away

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

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

How random thoughts now meaning chance to find,
Now leave all memory of sense behind:
How Prologues into Prefaces decay,
And these to Notes are fritter’d quite away:
How index-learning turns no student pale,
Yet holds the eel of science by the tail:
How, with less reading than makes felons scape,
Less human genius than God gives an ape,
Small thanks to France, and none to Rome or Greece,
A past, vamp’d future, old revived, new piece,
’Twixt Plautus, Fletcher, Shakspeare, and Corneille,
Can make a Cibber, Tibbald, or Ozell.

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

I will not stand by, while you fritter away my family’s fortune.

Я не намерен больше смотреть, как ты проматываешь состояние моей семьи.

И как еще один пример — сингл практически неизвестной группы The New Faith, которая на сегодня уже и распалась:

Hope springs eternal

Буквально его можно перевести как «надежда существует вечно». А в русском языке для этой пословицы есть прекрасный эквивалент — «Надежда умирает последней». Английский вариант этой фразы впервые придумал именно Поуп в своей поэме «Опыт о человеке».  

Hope springs eternal in the human breast;
Man never Is, but always To be blest.
The soul, uneasy, and confin’d from home,
Rests and expatiates in a life to come.

***

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

В английском языке есть и выражение «hope dies last» — прямой перевод фразы «надежда умирает последней». Но вариант Поупа куда более литературный и благозвучный, поэтому многие носители предпочитают использовать именно его.   

И да, у нас есть музыкальные примеры практически на все идиомы и фразеологизмы в английском. Ловите песню датской пауэр-метал группы Pyramaze:

Александр Поуп — это крайне любопытный исторический пример того, как даже острейшая сатира, раздражающая многих, порождает множество пословиц и идиоматических выражений, которые уходят в народ. Да и вообще, именами персонажей Поупа названы три спутника Урана: Ариэль, Умбриэль, Белинда — из поэмы «Похищение локона». Какие еще писатели могут похвастаться подобным? Только Шекспир, который дал имена остальным двадцати четырем 🙂

Хотите учить английский с интересом и без скучных упражнений? Записывайтесь на бесплатный пробный урок с преподавателем и учите фразеологизмы на любой вкус.

Онлайн-школа EnglishDom.com — вдохновляем выучить английский через технологии и человеческую заботу

Только для читателей Хабра первый урок с преподавателем в интерактивном цифровом учебнике бесплатно! А при покупке занятий получите до 3 уроков в подарок!

Получи целый месяц премиум-подписки на приложение ED Words в подарок. Введи промокод april21 на этой странице или прямо в приложении ED Words. Промокод действителен до 01.06.2021.

Наши продукты:

ссылка на оригинал статьи https://habr.com/ru/company/englishdom/blog/553814/

50 оттенков домашней работы

Год, проведённый с коронавирусом, напомнил нам о многочисленных фильмах на тему пандемии и вдохновил россиян на тысячи смешных мемов и анекдотов. Например, одна из шуток звучит примерно так: «А у вас в семье в офисе тоже работает тот, кого не жалко?».

За это время мы действительно свыклись с удалёнкой. А некоторые даже начали получать от нее удовольствие (при наличии комфортного домика в Подмосковье с интернетом это несложно, поверьте). Поэтому располагайтесь поудобнее. Давайте поговорим о том, как долго это будет продолжаться и вернёмся ли мы однажды к привычной офисной жизни.

В 2014 году, согласно подсчётам J’son & Partners Consulting, в России число удалённых работников составляло 2,5 миллиона человек. По данным Минтруда РФ в ноябре 2020 года количество сотрудников «на удалёнке» превысило 3,7 миллиона человек. Это около 6,5% всего трудоспособного населения страны.

Наибольшая доля удаленных работников сосредоточена в Москве и Санкт-Петербурге. Предсказуемо, правда? Кстати, эксперты уверены, что после завершения пандемии около 30% офисных сотрудников никогда не вернутся к прежнему режиму работы.

Ритейл, go home!

Прошлой весной после объявления режима самоизоляции 98% сотрудников нашего офиса за 3 дня перешли на удалёнку. При этом вся система продолжала бесперебойно работать в режиме 24\7.

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

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

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

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

Работа, которая поддерживает

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

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

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

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

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

Сейчас большинство компаний потихоньку возвращается к обычному режиму работы, но мы не спешим прощаться с найденными решениями и необычным опытом, приобретённым за это время. Пандемия помогла Группе М.Видео-Эльдорадо создать и освоить гибридный режим работы. Мы осознали, что удалёнка может стать дополнительным конкурентным преимуществом в борьбе за талантливых и востребованных бизнесом сотрудников, независимо от их физического местонахождения.

Три режима на выбор

Сегодня офисные сотрудники М.Видео-Эльдорадо могут выбрать один из трех режимов работы, в зависимости от своих предпочтений, возможностей и особенностей работы. Формат взаимодействия и максимально удобный темп каждая команда определяет самостоятельно, вместе со своим руководителем:

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

Гибридный режим. Сотрудник работает и из дома, и в офисе по согласованному графику. Руководитель помогает составить рабочее расписание.

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

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

Почему люди выбирают «удалёнку»?

  1. Вам не надо тратить время на дорогу туда и обратно (иногда это более 4 часов в сутки) и толкаться в переполненном транспорте (признайтесь, что пробки и стоимость парковки в столице часто не оставляют нам времени и возможностей для того, чтобы мурлыкать любимые песни за рулём по дороге на работу). А вот лишние 2-4 часа в день существенно повышают уровень жизни, увеличивая наши шансы на то, что мы всё-таки дойдём до спортзала, прочтём давно купленную книгу или просто ляжем спать пораньше. Мелочь, но приятно.
  2. Самостоятельно планировать рабочий график в течение дня и недели — бесценно. Ведь грамотное сочетание рабочих и домашних обязанностей позволяет купить продукты в магазине до того, как туда нагрянули уставшие после работы покупатели, а текущие задачи по проекту передвинуть на вечер, когда дети будут заняты любимым мультиком или уснут.
  3. Для многих дом — это, в первую очередь, уют и тишина. Отсутствие болтушки-коллеги и шумного open-space с кучей посторонних звуков делает чудеса возможными. Например, потратить на написание текста в 2 раза меньше времени, потому что сосредоточиться на работе стало проще. Здорово, правда?
  4. Работая из дома, можно тратить гораздо меньше времени на сборы. Главное — не стирать из записной книжки телефон парикмахера насовсем и вовремя убрать из кадра котиков и домочадцев во время конференции в Zoom.

Почему компания выбирает удалёнку?

Среди сотрудников бытует мнение, что работодатели не слишком любят удалёнку, потому что считают, что все, кто работает дома — бездельники. Но это не так. Мы заинтересованы в создании удаленных рабочих мест, потому что:

  • «Удаленка» позволяет сократить наши административно-хозяйственные расходы (аренда и содержание офисов, командировочные расходы и т.д.) вплоть до 50%
  • Если вы — тот, кто нам нужен, но живёте в другом городе — мы точно сможем обо всём договориться
  • Отсутствие необходимости вскакивать в 8 утра по звонку будильника магическим образом влияет на многих сотрудников, превращая их из талантливых и #кобедуэффективных в очень талантливых и суперэффективных.

Удалить нельзя оставить

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

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

Нехватка оперативной информационной и технической поддержки на рабочих местах.
Здесь мы активно использовали корпоративную соцсеть «ЭМ.Life». Она стала связующим звеном между компанией и удаленными сотрудниками. Благодаря ей все, кто работают из дома, могут использовать любые корпоративные сервисы кроме кофеварки, конечно (оформить отпуск, больничный, пройти обучение, забронировать рабочее месте в офисе, отследить прогресс выполнения целей и многое другое). Там же мы делимся новостями и обсуждаем все актуальные темы.

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

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

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

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

Чтобы жить стало лучше и веселее, мы сформулировали простые и эффективные правила работы и взаимодействия друг с другом на удалёнке — «ЭМ.Power». Следовать им оказалось несложно, а вот культура поведения в новой реальности поднялась на совершенно новый уровень, избавив большинство из нас от неотвеченных писем в электронной почте, неожиданных картинок в Zoom и других возникающих вопросов.


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

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

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

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

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

Место для дискуссии

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

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

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

Как выглядит высокотехнологичный офис?

Биометрия на входе
Оставьте рабочий пропуск дома и просто улыбнитесь в камеру. Наша база идентификации узнает вас по лицу и проверит состояние вашего здоровья, проанализировав актуальные противоэпидемические данные, включая анализы ПЦР).

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

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

Система real-time feedback для оценки удовлетворенности сотрудников со стороны внутренних клиентов (мониторинг качества кросс-функционального взаимодействия). Взаимопонимание и обратная связь станут основой для успешного и эффективного сотрудничества, а идеи и предложения обязательно будут услышаны.

Идеальный работодатель wanted!

Скажите, а для вас возможность выбора классического или удалённого режима работы — это важно? От чего зависит ваш выбор потенциального работодателя?

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

С помощью этого опроса наша компания рассчитывает собрать воедино все точки зрения на организацию рабочих процессов в IT и определить ключевые тенденции развития рынка.

По ссылке вы найдёте короткий опрос из 9 простых вопросов. Поделитесь своей точкой зрения. Ваше мнение очень ценно для нас. Мы будем рады и вашим комментариям к данной статье. Благодарим за внимание.

P.S. Нам по-прежнему нужны талантливые программисты. Если вам нужна интересная и творческая работа, напишите нам поскорее!

ссылка на оригинал статьи https://habr.com/ru/company/mvideo/blog/555324/

Okta: безопасный доступ к приложениям на Angular + Spring Boot

Перевод статьи подготовлен в рамках набора учащихся на курс «Разработчик на Spring Framework».

Приглашаем также всех желающих на открытый демо-урок «Конфигурация Spring-приложений». На занятии рассмотрим, как можно конфигурировать Spring Boot приложения с помощью свойств:
— properties vs. YAML
— @Value + SpEL
— @ConfigurationProperties
— Externalized конфигурация.
Присоединяйтесь!


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

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

Для авторизации пользователей в Okta используется протокол OAuth2. Подробнее о протоколе OAuth2 и стандарте Open ID Connect (OIDC) можно почитать в блоге Okta.

В этой статье мы рассмотрим демонстрационное приложение «Контакты» и настройку разрешений на просмотр, создание, редактирование и удаление контактов. Это вторая часть цикла статей о приложении «Контакты», посвященная его защите с помощью Okta. О базовом приложении подробно написано в первой статье цикла: «Разработка веб-приложения на Spring Boot + Angular».

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

В итоге наше приложение будет иметь следующую архитектуру:

Компонентная архитектура приложения «Контакты», использующего протокол OAuth
Компонентная архитектура приложения «Контакты», использующего протокол OAuth

О том, как контейнеризировать это приложение и развернуть его в кластере Kubernetes, можно узнать по ссылкам:

Kubernetes: развертывание приложения на Angular + Java / Spring Boot в Google Kubernetes Engine (GKE)

Kubernetes: развертывание приложения на Angular + Spring Boot в облаке Microsoft Azure

Конфигурация на портале разработчика Okta

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

После создания учетной записи мы можем добавить наше приложение в консоль администрирования Okta. Для этого выберем вкладку Applications (Приложения) и щелкнем Add Application (Добавить приложение).

Выберем в качестве платформы Single Page App (Одностраничное приложение) и настроим его так, как показано на скриншоте ниже. Здесь мы отметим только опцию Authorization code (Код авторизации), поскольку нам не нужно, чтобы токен возвращался непосредственно в URL-адресе (о связанных с этим рисках безопасности написано в этой статье в блоге Okta).

В нашем случае требуется два перенаправления входа: во-первых, когда пользователь входит в приложение через пользовательский интерфейс, куда сервер авторизации Okta должен перенаправлять пользователя с указанием кода авторизации, а во-вторых — когда пользователь напрямую вызывает открытые API серверной части. Также выберем здесь PKCE.

OAuth предлагает различные «потоки авторизации» (authorization code flows) — выбор конкретного потока зависит от сценария использования приложения. О том, какой поток OAuth выбрать, можно прочитать в этой статье на Medium или в документации Okta. Пользовательский интерфейс нашего демонстрационного приложения представляет собой одностраничное приложение на Angular, поэтому выберем неявный поток (implicit flow) с дополнительной проверкой для обмена кодом (Proof Key Code Exchange, PKCE).

Авторизация запросов через сервер авторизации

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

Чтобы увидеть сервер авторизации на портале Okta, нужно выбрать пункт меню, показанный ниже на скриншоте.

Добавление заявлений о группах (groups claims) в приложение «Контакты»

Для демонстрации создадим группу Admin. Администратор будет обладать правами на создание/редактирование/удаление.

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

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

Управление группами
Управление группами

 

Назначение групп/пользователей для приложения
Назначение групп/пользователей для приложения
Добавление заявления о группах в токен доступа, выдаваемый сервером авторизации
Добавление заявления о группах в токен доступа, выдаваемый сервером авторизации

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

Настройка Okta в клиентской части приложения

Для защиты клиентской части приложения «Контакты» воспользуемся SDK-библиотекой Okta для Angular. Мы будем авторизовывать пользователя, перенаправляя его на конечную точку авторизации, настроенную для нашей организации в Okta. Библиотеку можно установить с помощью npm:

npm install @okta/okta-angular --save

Чтобы реализовать этот промежуточный слой, после установки нужно будет указать значения из клиента OIDC, полученные на предыдущем этапе. Также понадобится URL-адрес организации в Okta — его можно узнать на домашней странице консоли разработчика Okta.

В файле app.module.ts создадим объект конфигурации и в нем установим true для параметра PKCE.

const oktaConfig = { issuer: 'https://{yourOktaDomain}/oauth2/default', redirectUri: window.location.origin + '/implicit/callback', clientId: 'your clientId', pkce: true };

Этот объект нужно добавить в раздел providers. Также импортируем OktaAuthModule:

import { OktaAuthModule, OktaCallbackComponent } from '@okta/okta-angular'; import {OKTA_CONFIG} from '@okta/okta-angular'; .... imports:[ ... OktaAuthModule ... ] providers: [ ... { provide: OKTA_CONFIG, useValue: oktaConfig } ... ]

В модуле обработки маршрутов приложения зададим защиту маршрута, воспользовавшись Route Guard из Angular. Вот фрагмент кода из app-routing-module.ts:

import { OktaCallbackComponent } from '@okta/okta-angular'; ... const routes: Routes = [ { path: 'contact-list', canActivate: [ OktaAuthGuard ], component: ContactListComponent }, { path: 'contact', canActivate: [ OktaAuthGuard, AdminGuard ], component: EditContactComponent }, { path: 'implicit/callback', component: OktaCallbackComponent }, { path: '', redirectTo: 'contact-list', pathMatch: 'full' }, ];

Здесь мы защищаем просмотр контактов с помощью AuthGuard, а создание, обновление, удаление контактов — с помощью AdminGuard и OktaAuthGuard.

Метод canActivate в OktaAuthGuard используется для проверки того, прошел ли пользователь процедуру аутентификации. Если нет, он перенаправляется на страницу входа Okta; если да, мы позволяем ему просматривать страницу, на которую ведет маршрут.

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { this.authenticated = await this.okta.isAuthenticated(); if (this.authenticated) { return true; } // Redirect to login flow. this.oktaAuth.loginRedirect(); return false; }

Аналогичным образом метод canActivate в AdminGuard проверяет, принадлежат ли вошедшие в систему пользователи к группе Admin; если нет, запрос на доступ к маршруту отклоняется и выводится предупреждение.

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { this.user = await this.okta.getUser(); const result = this.user.groups.find((group) => group === 'Admin'); if (result) { return true; } else { alert('User is not authorized to perform this operation'); return false; } }

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

Последовательность операций при выводе контактов на экран
Последовательность операций при выводе контактов на экран

Ниже представлена последовательность операций, демонстрирующая принцип работы PKCE. В случае одностраничного приложения, если токен возвращается непосредственно как часть URL-адреса перенаправления, любое расширение браузера может получить доступ к токену еще до того, как его увидит приложение. Это представляет потенциальную угрозу безопасности. Для снижения этого риска в PKCE вычисляется хэш SHA256 от случайной строки верификатора кода (code verifier), и этот хэш включается в запрос кода доступа как контрольное значение (code challenge). Когда поступает запрос на обмен токена доступа на код доступа, сервер авторизации может снова вычислить хэш SHA256 от верификатора кода и сопоставить результат с сохраненным контрольным значением.

Библиотека для Angular производит все эти операции за кадром: вычисляет хэш от верификатора кода с помощью алгоритма SHA256 и обменивает токен на код доступа, сопоставляя верификатор кода с контрольным значением.

Неявное разрешение на доступ (implicit grant) с использованием PKCE в приложении «Контакты»
Неявное разрешение на доступ (implicit grant) с использованием PKCE в приложении «Контакты»

Настройка Okta в серверной части приложения

Для того чтобы приложение Spring Boot поддерживало Okta, нужно установить следующие зависимости:

<dependency> <groupId>com.okta.spring</groupId> <artifactId>okta-spring-boot-starter</artifactId> <version>1.2.1</version> <exclusions> <exclusion> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.4.0.RELEASE</version> </dependency>

Spring Security OAuth2 и Okta Spring Boot Starter следует добавить в classpath, тогда Spring настроит поддержку Okta во время запуска.

Укажем следующие значения конфигурации для настройки и подключения Spring к приложению Okta:

okta.oauth2.client-id=<clientId> okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default okta.oauth2.groups-claim=groups

В классе SpringSecurity нужно указать, что приложение Spring Boot является сервером ресурсов:

@EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @Profile("dev") @Slf4j public class SecurityDevConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception{ http.cors().and().csrf().disable(); http.cors().configurationSource(request -> new CorsConfiguration(corsConfiguratione())); // http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll() // .and(). http.antMatcher("/**") .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers("/").permitAll() .anyRequest().authenticated(); http.oauth2ResourceServer(); }

При такой конфигурации конечные точки нашего приложения защищены. Если попробовать обратиться к конечной точке /contacts по адресу http://localhost:8080/api/contacts, будет возвращена ошибка 401, поскольку запрос не пройдет через фильтр аутентификации.

Для того чтобы предоставить права на создание, обновление и удаление контактов только администратору, нужно включить защиту методов в классе SpringSecurityConfig при помощи следующей аннотации:

@EnableGlobalMethodSecurity(prePostEnabled = true)

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

@PreAuthorize("hasAuthority('Admin')") public Contact saveContact(@RequestBody Contact contact,@AuthenticationPrincipal Principal userInfo) {

Для получения сведений о вошедшем в систему пользователе можно использовать объект Principal (@AuthenticationPrincipal).

Защита доступа к API из клиентской части приложения с помощью токена доступа

Теперь Okta защищает и клиентскую, и серверную часть нашего приложения. Когда клиентская часть направляет запрос к API, она должна передавать токен доступа в заголовке авторизации. В Angular для этого можно использовать перехватчик HttpInterceptor. В классе перехватчика авторизации можно задать токен доступа для любого HTTP-запроса следующим образом:

private async handleAccess(request: HttpRequest<any>, next: HttpHandler): Promise<HttpEvent<any>> { const accessToken = await this.oktaAuth.getAccessToken(); if ( accessToken) { request = request.clone({ setHeaders: { Authorization: 'Bearer ' + accessToken } }); } return next.handle(request).toPromise(); } }

Прямой доступ к API приложения через внешний сервер API

Если все настроено правильно, пользовательский интерфейс нашего приложения сможет получать доступ к API серверной части. В корпоративных приложениях часто присутствует несколько микросервисов, к которым обращается пользовательский интерфейс приложения, а также ряд микросервисов, доступ к которым открыт непосредственно для других приложений или пользователей. Так как наше приложение настроено как одностраничное, в настоящее время оно поддерживает доступ только из JavaScript-кода. Чтобы открыть доступ к микросервисам как к API для других потребителей API, нужно создать в Okta серверное приложение с типом «веб-приложение», а затем создать микросервисы как одностраничные приложения и разрешить единый вход для доступа к ним (технически мы имеем дело с двумя разными приложениями в Okta).

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

 

Последовательность операций при прямом доступе к серверному API
Последовательность операций при прямом доступе к серверному API

Я создал сервер API, то есть микросервис-обертку, предоставляющий список API, к которым мы хотим открыть доступ как к серверным API.

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

Она выступает в роли прокси-сервера для основного серверного API нашего приложения и открывает доступ к необходимым сервисам. В ней используется библиотека Spring Cloud OpenFeign, предназначенная для написания декларативных REST-клиентов. Такая обертка представляет собой очень простой способ создания клиентов для веб-сервисов. Она позволяет сократить количество кода при написании потребителей веб-сервисов на базе REST, а также поддерживает перехватчики, позволяющие реализовать любые промежуточные операции, которые должны выполняться до направления запроса к API. В нашем случае мы будем использовать перехватчик для задания токена доступа и распространения прав доступа пользователей. Дополнительные сведения о Feign доступны по этой ссылке.

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

Kubernetes: развертывание приложения на Angular + Java / Spring Boot в Google Kubernetes Engine (GKE)

Kubernetes: развертывание приложения на Angular + Spring Boot в облаке Microsoft Azure


Узнать подробнее о курсе «Разработчик на Spring Framework»

Смотреть вебинар «Конфигурация Spring-приложений»

ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/555298/