<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Pavel Vetokhin on Medium]]></title>
        <description><![CDATA[Stories by Pavel Vetokhin on Medium]]></description>
        <link>https://medium.com/@pavetok?source=rss-994b8ef3fd13------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*PNNQcuNuJn3WGzNQ.jpg</url>
            <title>Stories by Pavel Vetokhin on Medium</title>
            <link>https://medium.com/@pavetok?source=rss-994b8ef3fd13------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 03:19:27 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@pavetok/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Programming Inside Out]]></title>
            <link>https://pavetok.medium.com/programming-inside-out-9bd71f7b2e49?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/9bd71f7b2e49</guid>
            <category><![CDATA[transactions]]></category>
            <category><![CDATA[translation]]></category>
            <category><![CDATA[transformation]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Fri, 01 Jan 2021 17:47:27 GMT</pubDate>
            <atom:updated>2021-01-02T11:54:41.828Z</atom:updated>
            <content:encoded><![CDATA[<h3>Программирование наизнанку. Часть 2</h3><p>Продолжаем уточнять понятия, которые предположительно помогут взглянуть на программирование чуть иначе.</p><h3>Предметы, субъекты, объекты</h3><p>Начнём со схемы [1], хорошо известной в узких кругах (рис. 1).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QXhCxk4ROtSokDpQReM4IA.png" /><figcaption>Рис. 1. Предмет, Субъект, Объект</figcaption></figure><p>В центре находится <em>Человек </em>[2], который является <em>Субъектом</em> деятельности. Слева от него <em>Природа</em>, которая является <em>Предметом</em> деятельности. Справа — <em>Идея</em>, которая является <em>Объектом</em> деятельности. Разница между Предметом и Объектом заключается в том, что первый можно лишь “ощущать”, а последний — лишь “мыслить”.</p><p>Перерисуем схему для упрощения дальнейшей модификации (рис. 2).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/546/1*bUkNa47oxy-98gO-jaHffw.png" /><figcaption>Рис. 2. Предмет, Субъект, Объект</figcaption></figure><p>Задумка состоит в том, чтобы переложить озвученную схему на отдельно взятого человека (рис. 3).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/573/1*cSZb71FzMnbKjyciVkOYNQ.png" /><figcaption>Рис. 3. Отдельно взятый человек</figcaption></figure><p>Человек-с-большой-буквы состоит из отдельно взятых людей (или сознаний), каждому из которых своим уникальным образом даны его предметы, субъекты и объекты. По аналогии с тем, как предметы можно лишь “ощущать”, а объекты — лишь “мыслить”, с субъектами можно лишь “со-общаться”.</p><h3>Трансляции, трансакции, трансформации</h3><p>Теперь проложим мостик к содержанию предыдущего поста, в котором были даны наброски понятий <a href="https://pavetok.medium.com/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0%D0%B8%D0%B7%D0%BD%D0%B0%D0%BD%D0%BA%D1%83-5c2d0fa94770">трансляции, трансакции и трансформации</a> (рис. 4).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PfTs5620WkUyRHiIlNyRgA.png" /><figcaption>Рис. 4. Трансляции, трансакции, трансформации</figcaption></figure><p>Трансляции выполняются с предметами. Трансакции выполняются с субъектами. Трансформации выполняются с объектами. Причем любая трансформация влечёт за собой одну или несколько трансакций, которые, в свою очередь, влекут за собой одну или несколько трансляций.</p><h3>Протоколы, узлы, объекты</h3><p>Осталось в полученные схемы подставить понятия мира информационных технологий (рис. 5 и рис. 6).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4iV2LuB70NF4zVAi2HXF8g.png" /><figcaption>Рис. 5. Протоколы, узлы, объекты</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yTzivMwWWpzCO_VOoGtoHQ.png" /><figcaption>Рис. 6. Трансляции, трансакции, трансформации</figcaption></figure><p>Чтобы в отдельно взятом процессе трансформировать некоторый объект, необходимо это согласовать с другими узлами, что возможно лишь посредством трансляций в рамках тех или иных протоколов.</p><p>Таким образом программирование суть моделирование трансляций, трансакций и трансформаций с протоколами, узлами и объектами соответственно.</p><p>[1]: Сергей Чернышёв. Черные лебеди роста. Семинар 2. <a href="http://chernyshev.ru/publications/">http://chernyshev.ru/publications</a><br>[2]: Термины с заглавной буквы указывают на совокупность чего-либо в целом.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9bd71f7b2e49" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Программирование наизнанку]]></title>
            <link>https://pavetok.medium.com/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0%D0%B8%D0%B7%D0%BD%D0%B0%D0%BD%D0%BA%D1%83-5c2d0fa94770?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/5c2d0fa94770</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[translation]]></category>
            <category><![CDATA[transactions]]></category>
            <category><![CDATA[transformation]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Sun, 04 Oct 2020 15:34:46 GMT</pubDate>
            <atom:updated>2021-01-01T15:40:33.092Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BrsAPfS9O0tdY5lUE098xQ.jpeg" /></figure><p>Процедуры, функции, типы, структуры, акторы, объекты, классы — это лишь малая часть понятий, которые так или иначе относятся к программированию. Через призму данных понятий обычно формируются представления о нём. Значит нам также потребуются понятия¹, которые позволят взглянуть на программирование иначе.</p><h4>Трансляция</h4><p>В рамках трансляции сопоставляется воздействие и реакция. Когда просят купить хлеб, то необходимо взять деньги и пойти в магазин. Когда просят сделать сортировку, то необходимо получить массив и выполнить попарное сравнение. В некотором смысле трансляция есть перевод с “языка воздействия” одного на “язык воздействия” другого.</p><h4>Трансакция</h4><p>Трансакция суть двустороннее действие. Один отправляет, другой принимает. Один продаёт, другой покупает. Совершить одностороннюю трансакцию по определению невозможно. В качестве модели трансакции может выступать описание интерфейса в некотором языке программирования или, например, положение, регламентирующие поведение сторон в гражданском акте.</p><h4>Трансформация</h4><p>В рамках трансформации одни формы уже потрачены, а новая форма ещё только будет создана. Постройка дома есть трансформация таких форм как строительные материалы в такую форму как дом. Наполовину построенный дом пока ещё не является полноценным домом, но уже не является кирпичами, цементом и прочими строительными материалами, потраченными на его строительство.</p><h4>Программирование</h4><p>Программа есть совокупность трансляций, трансакций и трансформаций.</p><p>Программирование суть моделирование трансляций, трансакций и трансформаций.</p><p>[1]: Пока только интуитивные представления о понятиях или, можно сказать, наброски понятий, которые навеяны работами Франка Фенинга (например, <a href="https://www.youtube.com/playlist?list=PL0DsGHMPLUWXpdWYw4qy87I3DaTsREuGQ">этой</a> или <a href="https://www.cs.cmu.edu/~fp/papers/rast20.pdf">этой</a>), Александра Болдачёва (например, <a href="https://www.youtube.com/watch?v=gazUrDmjAOw">этой</a>) и Андрея Смирнова (например, <a href="https://smirnov.iph.ras.ru/win/publictn/texts_3/P-logika%20i%20yeyo%20obosnovaniye_diskussiya_i.htm">этой</a>).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5c2d0fa94770" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Сессионные сети Петри]]></title>
            <link>https://pavetok.medium.com/session-petri-nets-b2d066432763?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/b2d066432763</guid>
            <category><![CDATA[petri-nets]]></category>
            <category><![CDATA[session-types]]></category>
            <category><![CDATA[session-petri-nets]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Sun, 08 Mar 2020 16:03:06 GMT</pubDate>
            <atom:updated>2020-03-09T05:30:00.848Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sF6rSe7nWZKiBp_Apq-kzw.png" /></figure><blockquote>… In essence there are three “camps” in these discussions: the “Petri net camp”, the “Pi calculus” (or process algebra) camp, and the “Practitioners camp” (also known as the “No formalism camp”). This was the reason for starting the “Petri nets and Pi calculus for business processes” working group in June 2004. Two years later the debate is still ongoing and it seems unrealistic that consensus on a single language will be reached…</blockquote><blockquote>— W.M.P. van der Aalst et al. (2007). Business Process Management: Where Business Processes and Web Services Meet.</blockquote><p>Постараемся не уходить в дебаты, а просто возьмём некоторое поведение¹ и при помощи каждого из формализмов набросаем его представление. Ну а начнём мы с самого практичного из них.</p><h3>Объектно-ориентированное программирование</h3><p>В мире <em>ООП</em> поведение представляется интерфейсами:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/257/1*I_hDnGOzq3Q_vsYkeOkCtw.png" /><figcaption>Queue Interface</figcaption></figure><p>Выглядит довольно просто!</p><h3>Алгебры процессов</h3><p>В мире <em>исчисления процессов</em> поведение представляется сессионными типами:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/565/1*4DfC10hb00ZVAz_v1T0Eag.png" /><figcaption>Queue Session Type</figcaption></figure><p>Выглядит чуть сложнее. Из примечательного — очень “читабельная” рекурсивность определения.</p><h3>Сети Петри</h3><p>В мире сетей Петри поведение представляется т.н. <em>открытыми сетями Петри²</em>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/1*ORd-ofVRNwH4UXe3XGejbw.png" /><figcaption>Session Petri Net (Bare Metal)</figcaption></figure><p>Основное отличие в графичности представления. Из примечательного — явные места, в которых находится процесс до/после взаимодействия с внешним миром. Именно в эти точки должен “подключиться” процесс, реализующий данное поведение:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*VXH87nw-7VQLqC44KJnTtQ.png" /><figcaption>Session Petri Net (Implementable)</figcaption></figure><p>Можно пойти ещё дальше и наполнить диаграмму смыслом, дав элементам подходящие имена:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*O-c2WidGpuk7kC2W1t_a1A.png" /><figcaption>Session Petri Net (Meaningful)</figcaption></figure><ol><li>В качестве подопытного поведения возьмём сессионный тип очереди, приведённый в <a href="https://www.youtube.com/watch?v=VPP8dD2n_wE&amp;list=PL0DsGHMPLUWXpdWYw4qy87I3DaTsREuGQ&amp;t=2819">одной из лекций</a> (видео с привязкой ко времени) курса “Сессионно-типизированное конкурентное программирование”.</li><li><a href="https://www.youtube.com/watch?v=77KwKNSb7uc">Открытые сети Петри</a> (видео).</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b2d066432763" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DomDev Engineer]]></title>
            <link>https://pavetok.medium.com/domdev-engineer-d0b1056dc469?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/d0b1056dc469</guid>
            <category><![CDATA[workflow-engine]]></category>
            <category><![CDATA[function-as-a-service]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[faa]]></category>
            <category><![CDATA[domdev]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Wed, 09 Oct 2019 04:11:16 GMT</pubDate>
            <atom:updated>2019-11-29T10:29:43.497Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Software Engineer Evolution" src="https://cdn-images-1.medium.com/max/1024/1*HYFOpeKgIn3Bc5GtXd94-w.png" /><figcaption>Software Engineer Evolution</figcaption></figure><h3>Инструментальный эффект</h3><p>Появление нового инструмента порождает новую профессию.</p><p>Как это происходит?</p><p>Ни для кого не секрет, что новые инструменты упрощают жизнь человеку, т.к. позволяют за меньшие усилия делать больше. Другими словами — делают человека более производительным¹. Чуть менее очевидно, что новый инструмент даёт человеку возможность стать более компетентным.</p><p>Для работы с новым инструментом требуются новые компетенции, но вместе с тем отпадает необходимость в освоении старых. Хорошие инструменты осваиваются гораздо быстрее своих предшественников, поэтому у человека, выбирающего новый инструмент, высвобождается время на освоение смежных компетенций. Так появляются новые профессии.</p><p>Наивно полагать, что такие профессии гораздо проще освоить. Культурно оформляясь, новая профессия вбирает в себя смежные компетенции. В итоге объём компетенций остаётся примерно тем же, т.к. ограничивается лишь временем, которое человек может потратить на обучение.</p><p>Картинка “Software Engineer Evolution” пунктирно иллюстрирует этапы развития инструментов и соответствующих им профессий в сфере разработки софта.</p><p>Профессия разработчика стала по настоящему массовой благодаря появлению высокоуровневых языков программирования² (ВЯП). Следующий качественный скачок был связан с появлением инструментов web-разработки. Затем появились инструменты, облегчающие внедрение и эксплуатацию.</p><p>Каждый новый инструмент исключал целый пласт компетенций, которые больше не нужно было осваивать годами. Например, с появлением ВЯП отпала необходимость в изучении деталей устройства вычислительных машин, программирования/тестирования в машинных кодах и т.п. Примечательно, что адепты старых инструментов традиционно относятся к новым довольно скептически. Но, несмотря на это, новые инструменты из раза в раз обгоняли по массовости своих предшественников.</p><p>Ещё одной интересной особенностью является то, что новая профессия приносит больше денег. И связано это с тем, что её представители наносят существенно больше пользы, т.к. новые инструменты позволяют быть гораздо ближе к бизнесу.</p><h3>Что инструмент грядущий нам готовит</h3><p>Прообразом нового поколения инструментов backend-разработки можно считать всевозможные BPMN-движки, инструменты кодогенерации на основе UML, сервера приложений, хранилища с поддержкой хранимых процедур. Ключевая идея — позволить разработчику думать исключительно о бизнес-логике и не думать обо всех остальных 100500 вещах, с которыми приходится сталкиваться при backend-разработке.</p><p>Современной реинкарнацией озвученных идей являются инструменты под собирательным названием Function as a Service (FaaS). FaaS — новое поколение domdev-инструментов, которые породят новую профессию под условным названием Domain Development Engineer (более коротко DomDev Engineer или просто DomDev).</p><p>Почему снова код, а не BPMN, визуальное программирование и т.п.?</p><p>До сих пор в основе каждого из инструментов лежал код. Почему в этот раз должно быть иначе? Миллионы строк доказывают способность кода бороться со сложностью. Код расширяется и поддерживается на протяжении десятилетий. А что насчет миллионов строк BPMN, которые расширяются и поддерживаются десятилетиями? Каждый новый инструмент приближает разработчиков к бизнесу. Ещё раз повторюсь — не условные аналитики обретают мощь разработчиков, а разработчики в очередной раз (sic!) глубже погружаются в бизнес. В обратную сторону, к сожалению, не работает. Ставить на codeless-инструменты очень рискованно, т.к. тупо не было ещё прецедентов. Рано или поздно они не выдерживают столкновения с естественной сложностью человеческой деятельности.</p><h3>Набор юного домдева</h3><p>DomDev — это инженер, обладающий компетенциями разработчика и аналитика. Его ключевая задача - быстрая выкатка кода для проверки бизнес-идей или решения бизнес-проблем.</p><p>Что он умеет?</p><p>Он разбирается в сложившейся предметной области и способен её расширять, выявляя новые абстракции и воплощая их в коде. Он способен писать, отлаживать, тестировать, объяснять, внедрять и поддерживать свой код. Способен читать и локализовывать ошибки в чужом коде.</p><p>Его не волнует оптимальность алгоритмов и структур данных. Ему не нужно думать о парсинге данных, кодировке данных, протоколах обмена данными, многопоточности, конкуренции, обработке технических ошибок, масштабировании, деградации, переповторах и т.д. и т.п.</p><p>Кто может им стать?</p><p>В первую очередь разработчики, способные разобраться в предметной области, освоить навыки сбора требований, концептуального дизайна и т.п. Во вторую очередь аналитики, способные освоить практики разработки, тестирования и т.п. Ну и конечно же студенты, способные освоить и то и другое.</p><p>Какие у него инструменты?</p><p>DomDev Engine — движок для исполнения domdev-кода. По сути аналог виртуальной машины³.</p><p>DomDev Kit — набор готовых абстракций и операций над ними в рамках определённой предметной области. С возможностью безопасного расширения существующих абстракций и их композиции для создания новых в случае необходимости.</p><p>DomDev IDE — интегрированная среда разработки с автоматическими подсказками, рефакторингом и прочими плюшками.</p><p>Development eXperience — ключевой фактор для каждого из озвученных инструментов.</p><h3>Заключение</h3><p>На наших глазах формируется⁴ следующее поколение инструментов backend-разработки. Как следствие возникает новая массовая профессия — DomDev Engineer. Представители данной профессии будут ещё более ценными (во всех смыслах), т.к. будут гораздо ближе к бизнесу. В свою очередь, бизнес, инвестирующий в domdev-инструменты и людей, с высокой вероятностью получит стратегическое преимущество как минимум на ближайшее десятилетие.</p><p>[1]: Производительность используется как синоним полезности.</p><p>[2]: The History of FORTRAN <a href="https://www.obliquity.com/computer/fortran/history.html">https://www.obliquity.com/computer/fortran/history.html</a></p><p>[3]: По мнению ведущего разработчика <a href="https://news.ycombinator.com/item?id=19733653">Uber Cadence</a>:</p><blockquote>Cadence allows to write workflows as code. Think of it as a virtual machine for OO code that makes that code fully fault tolerant to process failures. As it is code it can be used to implement any business logic.</blockquote><p>[4]: Amazon, Google, Microsoft и IBM давно занимаются <a href="https://techbeacon.com/enterprise-it/serverless-computing-update-latest-top-4-platforms">этим</a>. Экосистема Kubernetes семимильными шагами движется в <a href="https://www.infoq.com/articles/kubernetes-workloads-serverless-era">этом </a>направлении. Стремительно набирают популярность OSS-движки, например, <a href="https://eng.uber.com/customer-obsession-ticket-routing-workflow-and-orchestration-engine">Uber Cadence</a>. Рискну предположить, что активно разрабатываются in-house решения. Информация об этом частенько просачивается. Например, осенью 2018 был <a href="https://www.youtube.com/watch?v=wsz1hvO3Wgs">доклад</a> от Alibaba Group. Личный опыт автора, как разработчика in-house domdev-движка, также свидетельствует об этом.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0b1056dc469" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Как посчитать зарплату по рынку?]]></title>
            <link>https://pavetok.medium.com/%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C-%D0%B7%D0%B0%D1%80%D0%BF%D0%BB%D0%B0%D1%82%D1%83-%D0%BF%D0%BE-%D1%80%D1%8B%D0%BD%D0%BA%D1%83-aa3d7dabd1a8?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/aa3d7dabd1a8</guid>
            <category><![CDATA[salary]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Mon, 02 Sep 2019 19:10:30 GMT</pubDate>
            <atom:updated>2020-07-21T09:44:42.784Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/810/1*iuK94y3Ryvwll8A3GHRViQ.png" /></figure><p>Поднимаю тему, на которую в приличных компаниях говорить начистоту обычно не принято, несмотря на то, что она является чуть ли не самой животрепещущей.</p><p>Почему по рынку¹? Во-первых, зарплата в привязке к наносимой пользе — это более продвинутый подход к зарплатообразованию, который заслуживает отдельной статьи. Во-вторых, зарплата выше или ниже рынка, на мой взгляд, закладывает определённые риски, которые рано или поздно выливаются в затраты на поиск и/или подготовку новых работников.</p><p>Предлагаемый подход позволяет получить оценку рыночной зарплаты и далее мониторить её на постоянной основе. Область применения — технические позиции с высоким спросом на рынке, т.к обязательное условие — наличие вакансий с указанием вилки.</p><h4>Позиция</h4><p>Для простоты будем считать, что текущая <strong>позиция</strong> работника складывается из трёх составляющих:</p><ol><li>Роли, которые работник способен исполнять с надлежащим качеством.</li><li>Уровень, определяющий сложность задач, которые работник способен решать самостоятельно (в той или иной роли).</li><li>Ключевые компетенции, которыми владеет работник.</li></ol><p><strong>Роли</strong><br>- Аналитик<br>- Архитектор<br>- Разработчик<br>- Тестировщик<br>- Автоматизатор/DevOps<br>- Внедренец<br>- Саппортёр</p><p><strong>Уровни</strong><br>- Ведущий/Lead<br>- Старший/Senior<br>- Middle<br>- Младший/Junior</p><p><strong>Ключевые компетенции<br></strong>- Владение определённой предметной областью (телеком, банковское дело, всевозможные стандарты и т.д.)<br>- Владение определённой практикой (UX, frontend, backend и т.д.)<br>- Владение определённым инструментом (Java, Python, JS, Docker, Ansible и т.д.)</p><h4>Алгоритм</h4><ol><li>Определяем самую дорогую позицию, в которой чувствуем себя уверенно.</li><li>Делаем выборку на <a href="https://spb.hh.ru/search/vacancy/advanced">HH</a></li><li>Подсчитываем.</li><li>Подписываемся.</li><li>Мониторим.</li></ol><p><strong>Опции для выборки<br>- </strong>Ключевые слова = (&lt;роль&gt; OR&lt;alias&gt;) AND (&lt;уровень&gt; OR &lt;alias&gt;) AND (&lt;компетенция&gt; OR &lt;alias&gt;)<br>- Чекбокс “В названии вакансии” = True<br>- Регион = &lt;Домашний&gt;<br>- Чекбокс “Скрыть вакансии без указания зарплаты” = True<br>- Тип занятости = Полная занятость<br>- График работы = Полный день<br>- Сортировка = По убыванию зарплат</p><p>Все остальное можно оставить по умолчанию.</p><p><strong>Подсчёт</strong></p><p>Если роль одна, то ориентируемся на качество её исполнения и количество ключевых компетенций. Чем качественнее исполняется роль и чем больше ключевых компетенций, тем ближе итоговая цифра к верхней планке. Если ролей две и более, то смело выбираем верхнюю планку.</p><p><strong>Подписка</strong></p><p>Создаем аккаунт, например, <a href="https://feedly.com/">здесь</a>. Копируем ссылку со странички с результатами поиска. Добавляем подписку.</p><h4>Пример</h4><p>Допустим вы “Lead Java Developer”, которому удаётся также совмещать ещё одну или несколько ролей. Работаете территориально в Санкт-Петербурге.</p><p><strong>Выборка</strong><br>- Ключевые слова = (разработчик OR программист OR developer OR engineer) AND (ведущий OR lead) AND java<br>- Регион = Санкт-Петербург</p><p><strong>Подсчет</strong></p><p>Предлагаю читателю потренироваться самостоятельно 😉</p><h4>Полезные ссылки</h4><ul><li><a href="http://changelog.ca/log/2013/08/09/software_engineer_title_ladder">Software Engineer Title Ladder</a></li><li><a href="https://www.coderhood.com/software-engineering-job-titles/">Software Engineering Job Titles Explained</a></li></ul><p>[1]: Под “рынком” понимается некоторый диапазон/вилка, а не одно единственное число (будь то среднее, медиана или любой другой процентиль).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa3d7dabd1a8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Вычислительное триличие 2.0]]></title>
            <link>https://pavetok.medium.com/%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5-%D1%82%D1%80%D0%B8%D0%BB%D0%B8%D1%87%D0%B8%D0%B5-2-0-4b7b3ceea402?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/4b7b3ceea402</guid>
            <category><![CDATA[type-theory]]></category>
            <category><![CDATA[computational-trinity]]></category>
            <category><![CDATA[category-theory]]></category>
            <category><![CDATA[logic]]></category>
            <category><![CDATA[language]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Sat, 18 May 2019 09:53:21 GMT</pubDate>
            <atom:updated>2019-05-25T04:50:51.900Z</atom:updated>
            <content:encoded><![CDATA[<h3>Введение</h3><p>Перед вами очередная попытка осмыслить статью Харпера <a href="https://web.archive.org/web/20170921012554/http://existentialtype.wordpress.com/2011/03/27/the-holy-trinity/">The Holy Trinity</a>.</p><p>Ключевая идея статьи в том, что <em>логика</em>, <em>языки</em> и <em>категории</em> суть ипостаси <em>вычисления. </em>В рамках каждой из ипостасей существует <em>фундаментальная концепция (fundamental concept). </em>В логике — <em>логическое следствие (entailment)</em>. В языках — <em>суждение о типизации (typing judgment)</em>. В категориях — <em>отображение¹ (mapping)</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/501/1*Z5EaJcXaVDmeijP4QtCvzA.png" /><figcaption>Вычислительное триличие</figcaption></figure><p>И, вроде бы, всё хорошо, но что-то смущает… В первой части статьи утверждается, что <em>высказывание </em>соответствует <em>типу </em>и <em>структуре</em>, а <em>доказательство </em>— <em>программе </em>и <em>отображению</em>. Но во второй части <em>логическое следствие</em> сопоставляется с <em>суждением о типизации</em> и… <em>отображением! </em>Таким образом с одной стороны может показаться, что <em>отображение</em> соответствует <em>логическому следствию </em>и <em>суждению о типизации</em>, а с другой — <em>доказательству </em>и <em>программе</em>. Попытаемся объяснить идею Харпера в терминах понятных обычному программному инженеру.</p><h3>Суждение</h3><p>Назовём форму, описывающую <em>фундаментальную концепцию</em>, <em>суждением (judgment)</em>. Всё, что слева от символа <em>турникета (turnstile) </em>называется <em>контекстом (context)</em>. <em>Контекст</em> — это всё, что есть у <em>агента</em> (опыт, знания, ресурсы, способности и т.д. и т.п.). Таким образом любое <em>суждение</em> всегда фиксируется в контексте некоторого <em>агента</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/294/1*sqpDccJ-YMUJKjEyUw4vhg.png" /><figcaption>Суждение</figcaption></figure><h3>Логика</h3><p>Начнём с логики. В логике <em>фундаментальной концепцией</em> является <em>логическое следствие</em>, которое фиксирует <em>осуществимость</em> <em>(derivability) </em>некоторого<em> высказывания (proposition)</em>. Небольшая проблема заключается в том, что в логической нотации нет средств, которые позволили бы явно показать <em>осуществимость </em>и <em>доказательство</em>. Всё это как бы спрятано в правой части <em>логического следствия</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/466/1*DXfMwjGzgNpQViE2PBF6xQ.png" /><figcaption>Логическое следствие</figcaption></figure><h3>Языки</h3><p>В языках <em>фундаментальной концепцией</em> является <em>суждение о типизации</em>, которое фиксирует <em>выразимость² (expressibility)</em> некоторого <em>типа (type)</em>. Тут уже нотация гораздо богаче и позволяет увидеть всё в полном объёме. В оригинальной статье нет понятия аналогичного <em>выразимости</em>, но оно необходимо для полноценного соответствия между ипостасями.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/547/1*M_LIypADRAF2hVEZrjmL_A.png" /><figcaption>Суждение о типизации</figcaption></figure><h3>Категории</h3><p>В категориях <em>фундаментальной концепцией</em> является <em>суждение об отображении</em>, которое фиксирует <em>отобразимость³ (mappability) </em>некоторой <em>структуры (structure)</em>. В оригинальной статье нет понятий аналогичных <em>суждению об отображении </em>и<em> отобразимости</em>, но они необходимы для полноценного соответствия между ипостасями.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/694/1*ZAs0l8gzo9K2Q_AWCGnLWQ.png" /><figcaption>Суждение об отображении</figcaption></figure><h3>Соответствия</h3><p>Таким образом ипостаси соотносятся⁴ следующим образом:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/655/1*fnI19QAfNc3IzdLh5IqTog.png" /><figcaption>Соотношение</figcaption></figure><p>UPD1:</p><ol><li>Более чётко сформулирована проблема исходной статьи.</li><li><em>Доказуемость</em> заменена на <em>осуществимость</em>.</li></ol><p>TODO:</p><ol><li>Добавить про вычислимость.</li></ol><p>[1]: Далее в статье вводится понятие <em>суждения об отображении</em>.</p><p>[2]: Считаем, что <em>выразимость</em> и <em>программируемость </em>— синонимы. То же самое относится к <em>выражениям</em> и <em>программам</em>.</p><p>[3]: Считаем, что <em>отображение</em> и <em>морфизм — синонимы</em>. Понятие <em>отобразимости</em> чуть лучше передает следующий смысл:</p><blockquote>A central theme in category theory is the study of structures and structure-preserving maps. A map f : X → Y is a kind of observation of object X via a specified relationship it has with another object, Y. For example, think of X as the subject of an experiment and Y as a meter connected to X, which allows us to extract certain features of X by looking at the reaction of Y.</blockquote><blockquote>Brendan Fong, David I Spivak <a href="https://arxiv.org/abs/1803.05316">https://arxiv.org/abs/1803.05316</a></blockquote><p>[4]: Подробнее о соотношении <a href="https://ncatlab.org/nlab/show/computational+trinitarianism">https://ncatlab.org/nlab/show/computational+trinitarianism</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4b7b3ceea402" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Настоящий Йорег]]></title>
            <link>https://pavetok.medium.com/%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B8%D0%B9-%D0%B9%D0%BE%D1%80%D0%B5%D0%B3-6844ee76ae90?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/6844ee76ae90</guid>
            <category><![CDATA[инженер]]></category>
            <category><![CDATA[йорег]]></category>
            <category><![CDATA[герой]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Fri, 01 Mar 2019 19:55:53 GMT</pubDate>
            <atom:updated>2019-03-24T04:43:16.339Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/610/1*gkZ2yqJuBGSi07Z7FjnaKg.png" /></figure><blockquote>Совершает все подвиги до того, как в них явится нужда.</blockquote><blockquote>Делает то, что нужно, а не то, что говорят.</blockquote><blockquote>Создаёт новое, в точности копируя старое.</blockquote><blockquote>Подвергает сомнению, ни секунды не сомневаясь.</blockquote><blockquote>Снимает все ярлыки до того, как их повесят.</blockquote><blockquote>Отрицает авторитеты, строго следуя их заветам.</blockquote><blockquote>Движется в верном направлении, ошибаясь на каждом шагу.</blockquote><blockquote>Неуязвим, т.к. сам же смебётся¹ над собой.</blockquote><blockquote>Убежден, что дело важнее разговоров, а разговоры — основа любого дела.</blockquote><blockquote>Впереди всех, опережая лишь самого медленного из них.</blockquote><blockquote>Качественно улучшает исчезающе малыми шагами, абсолютно ничего не меняя.</blockquote><blockquote>Настоящий Йорег суть Инженер!</blockquote><p>[1] Если исправить опечатку, то некоторые смыслы будут утеряны. Настоящий Йорег никогда не ломает обратную совместимость!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6844ee76ae90" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[InterPlanetary Operating System]]></title>
            <link>https://pavetok.medium.com/interplanetary-operating-system-16997c723ef9?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/16997c723ef9</guid>
            <category><![CDATA[ipo]]></category>
            <category><![CDATA[future-of-work]]></category>
            <category><![CDATA[ipfs]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Sat, 19 Jan 2019 08:57:22 GMT</pubDate>
            <atom:updated>2019-01-19T09:07:46.678Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*_QBI-NX0PRYpOY1wtxdBhA.png" /></figure><p>Отрывок из <a href="https://github.com/ipfs/roadmap/blob/master/README.md">дорожной карты</a> одного из самых амбициозных технологических проектов современности! А именно его завершающий этап:</p><blockquote><em>The rift between the web and the OS is finally healed. The OS and local programs and WebApps merge. They are not just indistinguishable, they are </em>the same thing<em>. “Installing” becomes pinning applications to the local computer. “Saving” things locally is also just pinning. The browser and the OS are no longer distinguishable. The entire OS data itself is modelled on top of IPLD, and the internal FileSystem is IPFS (or something on top, like unixfs). The OS and programs can manipulate IPLD data structures natively. The entire state of the OS itself can be represented and stored as IPLD. The OS can be frozen or snapshotted, and then resumed. A computer boots from the same OS hash, drastically reducing attack surface.</em></blockquote><p>Если взглянуть чуть шире (хотя куда уж ещё), то могло бы получиться примерно следующее…</p><h4>Всепланетная система деятельности</h4><p>Похуизм, наебалово и кабала практически побеждены. Жизнь и работа сливаются воедино. Они не просто неразличимы, они суть одно и то же. Люди просто живут в рамках пространства совместной деятельности. Любой человек в любой момент времени может начать новую деятельность или подключиться к уже существующей. При этом никто ничего не теряет! Новая деятельность гладко вытесняет устаревшую, т.к. это в интересах всех и каждого. Результаты деятельности вменяются всем сопричастным пропорционально вложенным усилиям. Политика, образование, здравоохранение и прочая “социалка” не исключение. Человечество начинает поступательно снимать свои издержки и оживает!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16997c723ef9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Обязательные издержки опциональных типов]]></title>
            <link>https://pavetok.medium.com/%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B8-%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2-5397dd9e08bf?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/5397dd9e08bf</guid>
            <category><![CDATA[optionality]]></category>
            <category><![CDATA[clojure]]></category>
            <category><![CDATA[type-systems]]></category>
            <category><![CDATA[rich-hickey]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Sun, 09 Dec 2018 17:59:21 GMT</pubDate>
            <atom:updated>2018-12-09T17:59:21.881Z</atom:updated>
            <content:encoded><![CDATA[<iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FYR5WdGrpoug%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DYR5WdGrpoug&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FYR5WdGrpoug%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/1ab68c39f438f08e4bdd1c71e2ec7905/href">https://medium.com/media/1ab68c39f438f08e4bdd1c71e2ec7905/href</a></iframe><p>Рич в очередной раз набросил на существующие системы типов. На сей раз он поднял тему опциональности. Как всегда подкупает его озабоченность издержками поддержки софта и неизменная фокусировка на их минимизации.</p><p>Опциональные типы (Optional, Maybe, etc…) отбраковываются аргументом про их обратную несовместимость при, казалось бы, безобидном ослаблении требований на входе или усилении гарантий на выходе.</p><p>Произведения (Classes, Records, etc…) объявляются местоориентированными (place-oriented) типами. После такого любой уважающий себя разработчик сто раз подумает, прежде чем начать их использовать.</p><p>Вместо столь милого сердцу произведения Рич (как обычно) предлагает использовать отображение (map). По его словам отображения более просты и фундаментальны, чем произведения. Для них, например, не требуется привлекать понятия места и функции.</p><p>Далее Рич вводит понятия схемы (schema) и выборки (select). Схема описывает потенциальную форму данных. Схема есть некий шаблон, которому данные могут соответствовать частично или полностью. В рамках самой схемы уровень соответствия никак не регламентируется. Выборка, в свою очередь, позволяет задать степень соответствия данных схеме в рамках того или иного контекста. У разных операций для одной и той же схемы обязательными или опциональными могут быть абсолютно разные “поля”.</p><p>Существует ли хоть один язык программирования, система типов которого позволяла бы накладывать ограничения на типы в зависимости от контекста их использования?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5397dd9e08bf" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Многоразовая подстановка]]></title>
            <link>https://pavetok.medium.com/%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%8F-%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-bfd52ad79436?source=rss-994b8ef3fd13------2</link>
            <guid isPermaLink="false">https://medium.com/p/bfd52ad79436</guid>
            <category><![CDATA[pure-function]]></category>
            <category><![CDATA[substitution]]></category>
            <category><![CDATA[side-effects]]></category>
            <dc:creator><![CDATA[Pavel Vetokhin]]></dc:creator>
            <pubDate>Thu, 15 Nov 2018 19:20:24 GMT</pubDate>
            <atom:updated>2018-11-17T10:46:49.443Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/550/1*-YvOvw7xuTF5oA30YEwQUw.jpeg" /></figure><h4>Идеальный мир</h4><p>Во многих языках программирования существует мир чистых (pure) функций и мир операций с побочными эффектами (side effects).</p><p>Например, изменение некоторого мутабельного состояния считается побочным эффектом. Такие операции часто называют update-in-place, и они всегда имеют сигнатуру, которая вообще ни о чем не говорит. Например unit -&gt; unit, IO() -&gt; IO() или даже void -&gt; void.</p><p>Ну очевидно же, что операций с побочными эффектами должно быть как можно меньше, а чистых функций — как можно больше.</p><h4>Мир побочных эффектов</h4><p>Но! В каждый язык (в т.ч. функциональные) встроена как минимум одна update-in-place операция. И это подстановка (substitution) значений на место переменных.</p><p>При каждом вызове (application) инстанцируется тело функции, и затем аргументы подставляются на место переменных.</p><p>На вход операции подстановки поступает тело функции, размеченное переменными, и соответствующие аргументы, а на выходе получается выражение с выполненной подстановкой.</p><p>Ничего не напоминает?</p><p>На входе у нас состояние, размеченное местами, и соответствующие им значения, а на выходе — состояние с выполненной подстановкой.</p><p>Существуют и другие примеры функционального update-in-place:</p><ol><li>Внедрение зависимостей в иммутабельные объекты</li><li>Конструирование иммутабельных структур данных</li><li>Вставка новых элементов в структуры данных</li></ol><h4>Многоразовая подстановка</h4><p>Операции с побочными эффектами подозрительно походят на операции подстановки. Разница лишь в том, что подстановка — одноразовая операция. После её выполнения информация о местах “стирается”, и выполнить подстановку повторно уже нельзя.</p><p>Но! Вычисления всегда конструктивны. Любая конструкция <a href="https://medium.com/@pavetok/%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5-%D1%82%D1%80%D0%B8%D0%BB%D0%B8%D1%87%D0%B8%D0%B5-53ab0ebfe773">всегда</a> занимает некоторое место. Вычисления без побочных эффектов просто-напросто невозможны. Побочные эффекты суть многоразовая подстановка, где многоразовость мест обусловлена ограниченностью ресурсов. Без побочных эффектов получается лишь пародия на вычисления, что-то типа игры в бисер.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bfd52ad79436" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>