├── static ├── .nojekyll ├── img │ ├── favicon.png │ ├── docusaurus.png │ └── logo.svg └── fonts │ ├── Ubuntu-Bold.ttf │ ├── Ubuntu-Light.ttf │ ├── Ubuntu-Medium.ttf │ ├── Ubuntu-Regular.ttf │ ├── PTSansCaption-Bold.ttf │ └── UbuntuMono-Regular.ttf ├── versions.json ├── CODEOWNERS ├── docs ├── profession │ ├── _category_.yml │ ├── onboarding │ │ ├── _category_.yml │ │ ├── index.md │ │ ├── 01-to-team.md │ │ └── 02-to-company.md │ ├── competencies │ │ ├── _category_.yml │ │ └── grades.md │ ├── good-to-know.md │ ├── antipatterns.md │ └── about.md └── roadmap │ ├── _category_.yml │ ├── management │ ├── job │ │ ├── _category_.yml │ │ ├── frameworks │ │ │ ├── lean.md │ │ │ ├── six-sigma.md │ │ │ └── _category_.yml │ │ ├── tasks │ │ │ ├── planning │ │ │ │ ├── _category_.yml │ │ │ │ ├── revolvere.md │ │ │ │ ├── weekly-monthly-quarterly.md │ │ │ │ └── assets │ │ │ │ │ ├── Monte-Carlo-S-Curve.png │ │ │ │ │ ├── Monte-Carlo-Throughput.png │ │ │ │ │ ├── Monte-Carlo-with-risks.png │ │ │ │ │ ├── Monte-Carlo-Burndown-chart.jpg │ │ │ │ │ ├── Monte-Carlo-Result-Probably.png │ │ │ │ │ ├── Monte-carlo-all-experiments.png │ │ │ │ │ ├── Monte-Carlo-Burndown-chart-full.jpg │ │ │ │ │ └── monte-carlo-method.module.css │ │ │ ├── prioritization │ │ │ │ ├── risk-assessment │ │ │ │ │ ├── raf.md │ │ │ │ │ ├── roam.md │ │ │ │ │ └── _category_.yml │ │ │ │ ├── scoring-models │ │ │ │ │ ├── ice.md │ │ │ │ │ ├── rice.md │ │ │ │ │ ├── wsjf.md │ │ │ │ │ └── _category_.yml │ │ │ │ └── _category_.yml │ │ │ └── _category_.yml │ │ ├── system-design │ │ │ ├── statik.md │ │ │ ├── vsm.md │ │ │ └── _category_.yml │ │ └── index.md │ ├── people │ │ ├── _category_.yml │ │ ├── roles │ │ │ ├── paei.md │ │ │ └── _category_.yml │ │ ├── training │ │ │ ├── coaching.md │ │ │ ├── mentoring.md │ │ │ └── _category_.yml │ │ └── index.md │ ├── change │ │ ├── _category_.yml │ │ ├── order │ │ │ ├── adkar.md │ │ │ ├── model-kurt-lewin.md │ │ │ ├── _category_.yml │ │ │ ├── kotter-8-steps.md │ │ │ └── index.md │ │ ├── context-analysis │ │ │ ├── pdca.md │ │ │ ├── five-whys.md │ │ │ ├── cynefin-framework.md │ │ │ ├── diagram-ishikaw.md │ │ │ ├── reality-tree.md │ │ │ └── _category_.yml │ │ └── index.md │ ├── groups │ │ ├── _category_.yml │ │ ├── teams │ │ │ ├── re-design │ │ │ │ ├── unfix.md │ │ │ │ ├── _category_.yml │ │ │ │ └── team-topologies.md │ │ │ ├── start │ │ │ │ ├── kick-off.md │ │ │ │ └── _category_.yml │ │ │ └── _category_.yml │ │ ├── organizations │ │ │ └── _category_.yml │ │ └── index.md │ ├── _category_.yml │ ├── environment │ │ └── index.md │ ├── product │ │ └── index.md │ └── project │ │ └── index.md │ ├── professional-growth │ ├── _category_.yml │ ├── communications │ │ ├── _category_.yml │ │ ├── index.md │ │ ├── facilitation.md │ │ └── oratory.md │ ├── manage-information │ │ ├── _category_.yml │ │ ├── knowledge-base │ │ │ ├── second-brain.md │ │ │ ├── showcases.md │ │ │ ├── wiki.md │ │ │ ├── zettelkasten.md │ │ │ └── _category_.yml │ │ └── index.md │ ├── coaching │ │ └── index.md │ ├── training │ │ └── index.md │ └── technical-skills │ │ └── index.md │ └── index.md ├── babel.config.js ├── .prettierrc.yml ├── versioned_docs └── version-0.0.1 │ └── profession │ ├── competencies │ ├── _category_.yml │ └── grades.md │ └── about.md ├── .idea ├── .gitignore ├── vcs.xml ├── modules.xml └── dm-knowledgebase.iml ├── sidebars.js ├── versioned_sidebars └── version-0.0.1-sidebars.json ├── src ├── components │ └── HomepageFeatures │ │ ├── styles.module.css │ │ └── index.js ├── pages │ ├── index.module.css │ └── index.js └── theme │ └── SearchBar │ ├── styles.css │ ├── index.js │ ├── templates.js │ ├── lib │ ├── templates.js │ ├── lunar-search.js │ ├── utils.js │ └── DocSearch.js │ ├── lunar-search.js │ ├── utils.js │ └── DocSearch.js ├── .github ├── ISSUE_TEMPLATE │ ├── функционал.md │ ├── документация.md │ └── у-вас-ошибка-.md └── workflows │ ├── other.yml │ └── main.yml ├── .gitignore ├── blog ├── authors.yml ├── 2023-03-31-version-1 │ └── index.mdx └── 2023-07-31-version-2 │ └── index.mdx ├── README.md ├── package.json ├── docusaurus.config.js └── LICENSE /static/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | [ 2 | "0.0.1" 3 | ] 4 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | @vshitov @mikovall @michael-martynov @pavelpower 2 | -------------------------------------------------------------------------------- /docs/profession/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Профессия' 2 | className: bold 3 | -------------------------------------------------------------------------------- /docs/roadmap/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Карта развития' 2 | className: bold 3 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Управление работой' 2 | position: 30 3 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Управление людьми' 2 | position: 20 3 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Управление изменениями' 2 | position: 10 3 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Управление группами' 2 | position: 60 3 | -------------------------------------------------------------------------------- /docs/profession/onboarding/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Онбординг' 2 | position: 2 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /docs/roadmap/management/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Управление' 2 | position: 100 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /docs/profession/competencies/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Компетенции' 2 | position: 2 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/img/favicon.png -------------------------------------------------------------------------------- /docs/roadmap/management/change/order/adkar.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # ADKAR 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/frameworks/lean.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Lean 5 | -------------------------------------------------------------------------------- /static/img/docusaurus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/img/docusaurus.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /static/fonts/Ubuntu-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/Ubuntu-Bold.ttf -------------------------------------------------------------------------------- /static/fonts/Ubuntu-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/Ubuntu-Light.ttf -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/pdca.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # PDCA 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/re-design/unfix.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # unFix 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/frameworks/six-sigma.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Six Sigma 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Планирование 2 | position: 1 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/roles/paei.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # PAEI (код Адизеса) 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/training/coaching.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Коучинг 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/training/mentoring.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Менторинг 5 | -------------------------------------------------------------------------------- /static/fonts/Ubuntu-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/Ubuntu-Medium.ttf -------------------------------------------------------------------------------- /static/fonts/Ubuntu-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/Ubuntu-Regular.ttf -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/start/kick-off.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Team Kick-off 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/system-design/statik.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # S.T.A.T.I.K. 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/revolvere.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Револьверное 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Профессиональное развитие' 2 | position: 200 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | printWidth: 120 3 | semi: false 4 | singleQuote: true 5 | trailingComma: 'es5' 6 | arrowParens: 'always' 7 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/five-whys.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Пять почему 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/system-design/vsm.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Value Stream Mapping 5 | -------------------------------------------------------------------------------- /static/fonts/PTSansCaption-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/PTSansCaption-Bold.ttf -------------------------------------------------------------------------------- /static/fonts/UbuntuMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/static/fonts/UbuntuMono-Regular.ttf -------------------------------------------------------------------------------- /versioned_docs/version-0.0.1/profession/competencies/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Компетенции' 2 | position: 2 3 | collapsible: false 4 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/order/model-kurt-lewin.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Модель Курта Левина 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/risk-assessment/raf.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # RAF 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/risk-assessment/roam.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # ROAM 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/scoring-models/ice.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # ICE 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/scoring-models/rice.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # RICE 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/scoring-models/wsjf.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # WSJF 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/communications/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Коммуникации 2 | position: 40 3 | className: disabled-category 4 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Команды 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Задачами 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/roles/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Роли 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | start: [ 3 | { 4 | type: 'autogenerated', 5 | dirName: '.', 6 | }, 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/cynefin-framework.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Модель «Кеневин» 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/diagram-ishikaw.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Диаграмма Исикавы 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/start/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Запуск 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/training/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Обучение 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/order/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Последовательность 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Работа с информацией' 2 | position: 10 3 | className: disabled-category 4 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/reality-tree.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Дерево текущей/будущей реальности 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/organizations/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Организации 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/re-design/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Ре-дизайн 2 | position: 3 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/frameworks/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Фреймворки/подходы 2 | position: 3 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/knowledge-base/second-brain.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Второй мозг 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/system-design/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Проектирование систем' 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Приоритизация 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/knowledge-base/showcases.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Маркетплейсы/витрины знаний 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/knowledge-base/wiki.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Вики подобные способы организации 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/context-analysis/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Анализ/изучение контекста' 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/knowledge-base/zettelkasten.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Zettelkasten Никласа Лумана 5 | -------------------------------------------------------------------------------- /versioned_sidebars/version-0.0.1-sidebars.json: -------------------------------------------------------------------------------- 1 | { 2 | "start": [ 3 | { 4 | "type": "autogenerated", 5 | "dirName": "profession" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/risk-assessment/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Оценка рисков' 2 | position: 2 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/prioritization/scoring-models/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Скоринг модели' 2 | position: 1 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/weekly-monthly-quarterly.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: disabled-page 3 | --- 4 | # Недельное, месячное, квартальное, годовое и т. д. 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/knowledge-base/_category_.yml: -------------------------------------------------------------------------------- 1 | label: 'Создание собственной базы знаний' 2 | position: 10 3 | collapsible: false 4 | className: disabled-category 5 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-S-Curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-S-Curve.png -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Throughput.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Throughput.png -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-with-risks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-with-risks.png -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Burndown-chart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Burndown-chart.jpg -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Result-Probably.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Result-Probably.png -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-carlo-all-experiments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-carlo-all-experiments.png -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Burndown-chart-full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tinkoff/dm-knowledgebase/HEAD/docs/roadmap/management/job/tasks/planning/assets/Monte-Carlo-Burndown-chart-full.jpg -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /docs/roadmap/management/environment/index.md: -------------------------------------------------------------------------------- 1 | # Управление окружением 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Управление окружением] --- B1(Культура) & B2(Доверие) & B3(Взаимопомощь) 7 | ``` 8 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/функционал.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Функционал 3 | about: Новый функционал или изменение текущего 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Цель 11 | Зачем добавляем новый функционал или изменяем текущий 12 | 13 | ## Описание изменения 14 | Подробно опишите ваше изменение 15 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/tasks/planning/assets/monte-carlo-method.module.css: -------------------------------------------------------------------------------- 1 | .noWrap td { 2 | white-space: nowrap; 3 | padding: 2px; 4 | text-align: center; 5 | } 6 | 7 | .vertical td { 8 | white-space: nowrap; 9 | writing-mode: bt-rl; 10 | transform: rotate(-90deg); 11 | padding: 2px; 12 | text-align: center; 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # VS code 2 | .history/ 3 | 4 | # Dependencies 5 | /node_modules 6 | 7 | # Production 8 | /build 9 | 10 | # Generated files 11 | .docusaurus 12 | .cache-loader 13 | 14 | # Misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | package-lock.json* 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/документация.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Документация 3 | about: Предложите новую документацию или доработку текущей 4 | title: '' 5 | labels: documentation 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Какой раздел? 11 | Профессия, роадмап... 12 | 13 | ## Цель 14 | Зачем добавляем новую документацию или дорабатываем текущую 15 | 16 | ## Описание изменения 17 | Подробно опишите ваше изменение 18 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/coaching/index.md: -------------------------------------------------------------------------------- 1 | # Коучинг 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Коучинг] --- B1(Модель GROW) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /.github/workflows/other.yml: -------------------------------------------------------------------------------- 1 | name: other 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | checks: 7 | if: github.event_name != 'push' 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v3 11 | - uses: actions/setup-node@v3 12 | with: 13 | node-version: 18 14 | cache: yarn 15 | - name: Install dependencies 16 | run: yarn install --frozen-lockfile 17 | - name: Test build website 18 | run: yarn build 19 | -------------------------------------------------------------------------------- /docs/roadmap/management/people/index.md: -------------------------------------------------------------------------------- 1 | # Управление людьми 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Управление людьми] --- B1(Анализ ролей) & B2(Коучинг) & B3(Менторинг) 7 | ``` 8 | ## О чём это направление 9 | 10 | ## Почему важно работать с этим направлением 11 | 12 | ## Дополнительные материалы 13 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 14 | * [Анти-паттерны](/docs/profession/antipatterns) 15 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/training/index.md: -------------------------------------------------------------------------------- 1 | # Обучение 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Обучение] --- B1(Воркшопы) & B2(Менторинг) & B3(Индивидуальные планы развития) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /.idea/dm-knowledgebase.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/roadmap/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide_table_of_contents: true 3 | --- 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | import RoadmapSvg from './assets/dm-roadmap.svg'; 7 | import MindmapSvg from './assets/dm-mindmap.svg'; 8 | 9 | # Карта развития 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/roadmap/management/job/index.md: -------------------------------------------------------------------------------- 1 | # Управление работой 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Управление работой] --- B1(Задачами) & B2(Проектирование систем) & B3(Фреймворки/подходы) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know#управление-работой) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /docs/roadmap/management/product/index.md: -------------------------------------------------------------------------------- 1 | # Управление продуктом 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Управление продуктом] --- B1(Знание бизнес-домена) & B2(Проектирование) & B3(Инструменты) & B4(Экономика/бюджетирование) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | 3 | /** 4 | * CSS files with the .module.css suffix will be treated as CSS modules 5 | * and scoped locally. 6 | */ 7 | 8 | .heroBanner { 9 | padding: 4rem 0; 10 | text-align: center; 11 | position: relative; 12 | overflow: hidden; 13 | } 14 | 15 | @media screen and (max-width: 966px) { 16 | .heroBanner { 17 | padding: 2rem; 18 | } 19 | } 20 | 21 | .buttons { 22 | display: flex; 23 | align-items: center; 24 | justify-content: center; 25 | } 26 | -------------------------------------------------------------------------------- /docs/roadmap/management/project/index.md: -------------------------------------------------------------------------------- 1 | # Управление проектами 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Управление изменениями] --- B1(Риски) & B2(Сроки) & B3(Бюджет) & B4(Документация) & B5(Безопасность) & B6(Планирование) & B7(Фреймворки/подходы) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/manage-information/index.md: -------------------------------------------------------------------------------- 1 | # Работа с информацией 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Работа с информацией] --- B1(Создание собственной базы знаний) & B2(Команды) & B3(Племена/социальные группы) & B4(Комьюнити) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/у-вас-ошибка-.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: У вас ошибка! 3 | about: Опишите ошибку, чтобы мы могли стать лучше 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Шаги воспроизведения 11 | Описывать их максимально подробно, чтобы любой человек мог пройти по указанным шагам и повторить ошибку 12 | 13 | ## Фактический результат 14 | Указать к чему привели шаги, описанные выше 15 | 16 | ## Ожидаемый результат 17 | То, что ожидалось получить 18 | 19 | ## Возможное решение 20 | Если у вас есть предположение, почему происходит ошибка, то опишите его здесь 21 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/technical-skills/index.md: -------------------------------------------------------------------------------- 1 | # Техническое совершенство 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Техническое совершенство] --- B1(Практики разработки) & B2(Качество) & B3(Настройка инструментов управления работой) & B4(Лёгкое кодирование/написание скриптов) 7 | ``` 8 | 9 | ## О чём это направление 10 | 11 | ## Почему важно работать с этим направлением 12 | 13 | ## Дополнительные материалы 14 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 15 | * [Анти-паттерны](/docs/profession/antipatterns) 16 | -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | 'michael-martynov': 2 | name: Michael Martynov 3 | title: Maintainer 4 | url: https://github.com/michael-martynov 5 | image_url: https://github.com/michael-martynov.png 6 | 7 | 'pavelpower': 8 | name: Pavel Akhmetchanov 9 | title: Maintainer 10 | url: https://github.com/pavelpower 11 | image_url: https://github.com/pavelpower.png 12 | 13 | 'vshitov': 14 | name: Viktor Shitov 15 | title: Maintainer 16 | url: https://github.com/vshitov 17 | image_url: https://github.com/vshitov.png 18 | 19 | 'mikovall': 20 | name: Maria Koval 21 | title: Maintainer 22 | url: https://github.com/mikovall 23 | image_url: https://github.com/mikovall.png 24 | -------------------------------------------------------------------------------- /src/theme/SearchBar/styles.css: -------------------------------------------------------------------------------- 1 | .search-icon { 2 | background-image: var(--ifm-navbar-search-input-icon); 3 | height: auto; 4 | width: 24px; 5 | cursor: pointer; 6 | padding: 8px; 7 | line-height: 32px; 8 | background-repeat: no-repeat; 9 | background-position: center; 10 | display: none; 11 | } 12 | 13 | .search-icon-hidden { 14 | visibility: hidden; 15 | } 16 | 17 | @media (max-width: 360px) { 18 | .search-bar { 19 | width: 0 !important; 20 | background: none !important; 21 | padding: 0 !important; 22 | transition: none !important; 23 | } 24 | 25 | .search-bar-expanded { 26 | width: 9rem !important; 27 | } 28 | 29 | .search-icon { 30 | display: inline; 31 | vertical-align: sub; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/communications/index.md: -------------------------------------------------------------------------------- 1 | # Коммуникации 2 | 3 | ```mermaid 4 | graph LR 5 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 6 | A[Коммуникации] --- B1(Фасилитация) & B2(Storytelling) & B3(Интервьюирование) & B4(Работа/управление конфликтом) & B5(Обратная связь) & B6(Публичные выступления) & B7(Ораторское искусство) & B8(Формирование личного бренда) 7 | click B1 "communications/facilitation" _blank 8 | click B7 "communications/oratory" _blank 9 | classDef label-link text-decoration: underline; 10 | class B1,B7 label-link 11 | ``` 12 | 13 | ## О чём это направление 14 | 15 | ## Почему важно работать с этим направлением 16 | 17 | ## Дополнительные материалы 18 | * [Книги, видео, подкасты](/docs/profession/good-to-know) 19 | * [Анти-паттерны](/docs/profession/antipatterns) 20 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/teams/re-design/team-topologies.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: roadmap 3 | --- 4 | # Team Topologies 5 | Подход, описанный в книге “Топологии команд” (“Team Topologies”) от авторов Manuel Pais и Matthew Skelton. 6 | 7 | ## Описание 8 | Авторы подхода предлагают при формировании структуры организации идти по принципу “team first”. В подходе выделяются проблемы и инструменты для их решений. Советуем до погружения в этот подход прочитать закон Конвея, т.к. его утверждения сильно перекликаются. 9 | 10 | ## Рекомендации по использованию 11 | При работе с группой, в которой есть множество команд, точно стоит посмотреть проблемы, которые выделяют авторы и добавить предлагаемые ими решения в свой пул. 12 | Точно стоит изучить когда вы работаете с командами, у которых есть общие точки внесения изменений (общая база данных, пример) или же такая общая точка планируется к созданию. В подходе отлично разбираются решения проблем, с которыми вы можете или уже столкнулись. 13 | 14 | ## Дополнительные материалы 15 | Серия статей Саши Поломодова https://apolomodov.medium.com/review-team-topologies-part-1-205533a027c0 16 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/order/kotter-8-steps.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: roadmap 3 | --- 4 | # Восемь шагов Коттера 5 | Скорее всего самая популярная модель, используемая при проведении изменений. Существуют 2 версии: 6 | 1. **8 шагов Коттера.** Предложена в 1995 г. и представлена последовательными шагами 7 | 2. **8 ускорителей Коттера.** Переработанная в 2014 г. первая версия, в которой шаги превратились в ускорители 8 | 9 | ```mermaid 10 | graph LR 11 | %%{ init: { 'flowchart: { htmlLabels: true, justify-content: center } } }%% 12 | A[1. Создание \n потребности] --> B[2. Создание \n команды] --> C[3. Создание \n образа] --> D[4. Вовлечение] --> E[5. Наделение \n полномочий] --> F[6. Вознаграждение] --> G[7. Поддержка] --> H[8. Закрепление] 13 | ``` 14 | 15 | ## Применимость 16 | В первую очередь модель нацелена на реализацию изменений в организациях. По модели ситуативного лидерства Херси и Бланшара относится к _Стилю участия_. То есть лидер делится своим мыслями, вовлекает их в процесс и тем самым проводит изменения снизу-вверх. В базовом варианте можно применять и к командам. 17 | 18 | ## Дополнительные материалы 19 | * [Книги, видео, подкасты](/docs/profession/good-to-know#8-шагов-коттера) 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # База знаний профессии Деливери менеджер 2 | База знаний профессии Деливери менеджер (Delivery Manager). Изучать удобнее всего на [нашем сайте](https://tinkoff.github.io/dm-knowledgebase/). 3 | 4 | ## Зачем это всё 5 | Профессия Деливери менеджер молодая, можно сказать не устоявшаяся. Мы, в Тинькофф, очень хотим рассказать о ней как можно большему количеству людей и поэтому решились на серьезный шаг - создание базы знаний профессии. 6 | 7 | Мы не говорим о Деливери менеджере только в Тинькофф, мы говорим о профессии, которая может применяться и развиваться в любой компании. Каждый может быть немного Деливери менеджером. Просто где-то такой человек нужен на постоянной основе. 8 | 9 | ## Для кого 10 | В первую очередь для тех, кто уже Деливери менеджер или хочет им стать. Так же практики и инструменты профессии будут полезны и другим менеджерам: тимлидам и руководителям отделов, владельцам продуктов, проектным менеджерам и другим. 11 | 12 | ## Как вы можете помочь 13 | 1. Нас можно поддержать, поставив этому репозиторию :star: звёздочку. Те, кто поставили - вы крутые! 14 | 2. Добавить информацию или внести исправление по правилам контрибьютинга 15 | 3. Подсказать нам что-нибудь или принести обратную связь можно по каналам, указанным в разделе "Как связаться" 16 | 17 | ## Как связаться 18 | * Приходи в наш [telegram-канал](https://t.me/chat_tac) 19 | * Пиши на почту dm-knowledgebase@tinkoff.ru 20 | -------------------------------------------------------------------------------- /static/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './styles.module.css'; 4 | 5 | const FeatureList = [ 6 | { 7 | title: 'Описание профессии', 8 | description: ( 9 | <> 10 | Кто такой Деливери менеджер. Какие задачи выполняет. Как им стать 11 | 12 | ), 13 | }, 14 | { 15 | title: 'Карта развития', 16 | description: ( 17 | <> 18 | Поможет понять что должен знать и уметь Деливери менеджер, составить план развития, найти инструмент под конкретную задачу 19 | 20 | ), 21 | }, 22 | ]; 23 | 24 | function Feature({title, description}) { 25 | return ( 26 |
27 |
28 |

{title}

29 |

{description}

30 |
31 |
32 | ); 33 | } 34 | 35 | export default function HomepageFeatures() { 36 | return ( 37 |
38 |
39 |
40 | {FeatureList.map((props, idx) => ( 41 | 42 | ))} 43 |
44 |
45 |
46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dm-knowledgebase", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids" 15 | }, 16 | "dependencies": { 17 | "@docusaurus/core": "^2.4.1", 18 | "@docusaurus/plugin-google-gtag": "^2.4.1", 19 | "@docusaurus/preset-classic": "^2.4.1", 20 | "@docusaurus/theme-mermaid": "^2.4.1", 21 | "@mdx-js/react": "^1.6.21", 22 | "@popperjs/core": "^2.11.5", 23 | "clsx": "^1.1.1", 24 | "docusaurus-lunr-search": "^2.3.2", 25 | "file-loader": "^6.2.0", 26 | "hast-util-is-element": "^1.1.0", 27 | "react": "^17.0.2", 28 | "react-dom": "^17.0.2", 29 | "react-popper": "^2.3.0", 30 | "rehype-katex": "^5.0.0", 31 | "remark-math": "^3.0.1", 32 | "url-loader": "^4.1.1" 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.5%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | }, 46 | "devDependencies": { 47 | "prettier": "2.4.1", 48 | "webpack-cli": "^4.8.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Link from '@docusaurus/Link'; 4 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 5 | import Layout from '@theme/Layout'; 6 | import HomepageFeatures from '@site/src/components/HomepageFeatures'; 7 | 8 | import styles from './index.module.css'; 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 |

База знаний профессии {siteConfig.title}

16 |

{siteConfig.tagline}

17 |
18 | 21 | Хочу изучить! 22 | 23 |
24 |
25 |
26 | ); 27 | } 28 | 29 | export default function Home() { 30 | const {siteConfig} = useDocusaurusContext(); 31 | return ( 32 | 35 | 36 |
37 | 38 |
39 |
40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /docs/profession/onboarding/index.md: -------------------------------------------------------------------------------- 1 | # Онбординг 2 | Онбординг — процесс знакомства, интеграции и адаптации в профессию, компанию или команду. Это все, что помогает человеку быстрее освоиться, обрасти знаниями и начать приносить ценность. 3 | 4 | ## Виды онбординга для Деливери менеджера 5 | 1. [В команду](onboarding/to-team) 6 | 2. [В компанию](onboarding/to-company) 7 | 8 | ## Как ускорить онбординг и улучшить качество решений 9 | Чтобы быстрее адаптировать и обучить новичка, можно и нужно привлекать опытных коллег. Для новичка работа с buddy или ментором снижает уровень стресса и сокращает риски принятия сомнительных решений в период адаптации. 10 | 11 | ## Работа с напарником (buddy) 12 | Напарник или buddy – это коллега по работе, готовый ответить на все вопросы и помочь с адаптацией новичка. 13 | 14 | Buddy закрепляется на время испытательного срока. Его задача — сократить срок адаптации новичков и дать им всю необходимую информацию для выполнения своей роли. 15 | 16 | **Buddy нужен**, когда новичок выходит туда, где нет других Деливери менеджеров и ему придется работать одному. 17 | 18 | **Buddy не нужен**, если новичок выходит в команду к более опытному Деливери менеджеру, который и будет отвечать за онбординг. 19 | 20 | ## Работа с ментором 21 | Ментор (наставник) — это опытный профессионал, источник знаний и ответов. Он вдохновляет и помогает развиваться своему менти. 22 | 23 | В отличии от buddy, ментор строит долгосрочные отношения для развития своего подопечного и помогает решать текущие проблемы. Он сосредоточен на общем развитии человека. Ментор применяет инструменты коуча, фасилитатора и даже психолога. 24 | -------------------------------------------------------------------------------- /docs/roadmap/management/groups/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: roadmap 3 | --- 4 | # Управление группами 5 | Когда в вашей зоне влияния становится более 1 человека, то вы начинаете работать с некоторыми группами людей. Это может быть команда, целая организация (отдел, департамент, сквад, трайб и прочее), а может не то и не другое. 6 | 7 | ```mermaid 8 | graph LR 9 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 10 | A[Управление группами] --- B1(Организации) & B2(Команды) & B3(Племена/социальные группы) & B4(Комьюнити) 11 | ``` 12 | 13 | ## О чём это направление 14 | 15 | Здесь собраны инструменты, которые во-первых помогут идентифицировать группу в вашей зоне влияния, а во-вторых правильно с ней работать. 16 | 17 | ## Почему важно работать с этим направлением 18 | 19 | * Работа с группами может оказаться как более сложной, так и более интересной, чем работа с одним человеком. Когда вы имеете дело с группой, появляются взаимосвязи и зависимости, которых нет в случае работы с одним человеком. Поэтому важно научиться правильно взаимодействовать с группами. 20 | * Люди в группах часто ведут себя по-другому, чем в одиночку. Это связано с различными факторами, такими как социальная динамика, влияние других людей на поведение, принятие решений в группе и т.д. Понимание причин такого поведения и умение правильно с этим работать - крайне важно. 21 | * Также важно понимать, что инструменты, которые хорошо себя зарекомендовали в работе с одним человеком, могут не сработать с группой, состоящей из нескольких человек. Каждый инструмент имеет свою применимость, и его нужно уметь правильно использовать в зависимости от ситуации. 22 | 23 | ## Дополнительные материалы 24 | * [Анти-паттерны](/docs/profession/antipatterns) 25 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: main 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | checks: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - uses: actions/setup-node@v3 14 | with: 15 | node-version: 18 16 | cache: yarn 17 | - name: Install dependencies 18 | run: yarn install --frozen-lockfile 19 | - name: Test build website 20 | run: yarn build 21 | gh-release: 22 | needs: checks 23 | if: github.event_name != 'pull_request' 24 | runs-on: ubuntu-latest 25 | steps: 26 | - uses: actions/checkout@v3 27 | - uses: actions/setup-node@v3 28 | with: 29 | node-version: 18 30 | cache: yarn 31 | - name: Add key to allow access to repository 32 | env: 33 | SSH_AUTH_SOCK: /tmp/ssh_agent.sock 34 | run: | 35 | mkdir -p ~/.ssh 36 | ssh-keyscan github.com >> ~/.ssh/known_hosts 37 | echo "${{ secrets.GH_PAGES_DEPLOY }}" > ~/.ssh/id_rsa 38 | chmod 600 ~/.ssh/id_rsa 39 | cat <> ~/.ssh/config 40 | Host github.com 41 | HostName github.com 42 | IdentityFile ~/.ssh/id_rsa 43 | EOT 44 | - name: Release to GitHub Pages 45 | env: 46 | USE_SSH: true 47 | GIT_USER: git 48 | run: | 49 | git config --global user.email "actions@github.com" 50 | git config --global user.name "gh-actions" 51 | if [ -e yarn.lock ]; then 52 | yarn install --frozen-lockfile 53 | elif [ -e package-lock.json ]; then 54 | npm ci 55 | else 56 | npm i 57 | fi 58 | npx docusaurus deploy 59 | -------------------------------------------------------------------------------- /docs/profession/good-to-know.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Полезные материалы 3 | toc_max_heading_level: 5 4 | --- 5 | 6 | # Полезные материалы: книги, видео, подкасты для менеджера 7 | 8 | :::tip 9 | Внутри каждого раздела материалы расположены по возрастанию сложности сверху-вниз. Советуем всегда начинать изучение с более "верхних" материалов, а потом спускаться ниже. 10 | ::: 11 | 12 | ## Это база 13 | Сложно представить себе менеджера, который бы не читал эти книги 14 | 15 | :book: Цель. Процесс непрерывного совершенствования (Элияху Голдратт) 16 | 17 | :book: Deadline. Роман об управлении проектами (Том ДеМарко) 18 | 19 | ## По направлениям 20 | ### Управление группами 21 | :book: Boss бесподобный или бесполезный (Рэй Иммельман) 22 | 23 | :book: Корпоративное племя (Даниэль Браун,Итске Крамер) 24 | 25 | ### Управление изменениями 26 | #### Последовательность 27 | :movie_camera: [Как не навредить себе и коллегам, когда проводишь изменения в компании](https://youtu.be/lrri_EcgeZ4) (Михаил Мартынов) 28 | 29 | :book: Управляя изменениями. Как эффективно управлять изменениями в обществе, бизнесе и личной жизни (Ицхак Адизес) 30 | 31 | ##### 8 шагов Коттера 32 | :book: Наш Айсберг тает. Как добиться результата в условиях изменений (Джон Коттер) 33 | 34 | :book: Впереди перемен (Джон Коттер) 35 | 36 | ##### ADKAR 37 | :movie_camera: [Пять этапов для успешных изменений ADKAR](https://youtu.be/Jd-vYeL3Kb4) (Римма Денисовец) 38 | 39 | ### Управление работой 40 | #### Теория ограничений 41 | :book: Цель. Процесс непрерывного совершенствования (Элияху Голдратт) 42 | 43 | :movie_camera: [Работа с узкими звеньями процесса](https://youtu.be/eKNWH29NKs0) (Алексей Пименов) 44 | 45 | #### Задачами 46 | ##### Оценка 47 | :movie_camera: [Как прогнозировать время выполнения задач? Методики прогноза](https://youtu.be/cw1U5XXXuiI) (Павел Ахметчанов) 48 | 49 | #### Проектирование систем 50 | ##### Valuе Stream Mapping 51 | :movie_camera: [Проблемы в работе деливери-менеджера и способы их решения. Valuе Stream Mapping (VSM)](https://youtu.be/5YARzGJcDHg) (Виктория Педченко) 52 | 53 | ##### S.T.A.T.I.K. 54 | :movie_camera: [Системный подход в Kanban. S.T.A.T.I.K. – сервисная археология](https://youtu.be/uI5D00zav58) (Евгений Степченко) 55 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/index.md: -------------------------------------------------------------------------------- 1 | # Управление изменениями 2 | Управление изменениями — это важный процесс, который позволяет контролировать изменения, чтобы достичь поставленных целей и улучшить эффективность. Может включать в себя внедрение новых систем, изменение бизнес-процессов, пересмотр организационной структуры и многое другое. 3 | 4 | ```mermaid 5 | graph LR 6 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 7 | A[Управление изменениями] --- B1(Анализ/изучение контекста) & B2(Последовательность) 8 | ``` 9 | 10 | ## О чём это направление 11 | Важно понимать, что внесение изменений - это сложный процесс, который может как помочь, так и навредить. Поэтому очень важно провести **анализ контекста**, чтобы понять, какие изменения необходимо внести и как их внедрение повлияет на текущие процессы, людей и компанию в целом. Анализ контекста может включать в себя изучение текущего состояния, целей и задач, анализ внешней среды и т. д. Также важно изучить контекст, понять культуру, ценности и нормы поведения, чтобы определить, как изменения могут повлиять на сотрудников и как их можно подготовить к изменениям. 12 | 13 | Другим важным аспектом управления изменениями является определение **последовательности изменений**. Это включает в себя планирование, разработку и реализацию изменений. Необходимо определить, какие изменения необходимо внести, кто будет ответственным за их внедрение и какие ресурсы потребуются для успешного завершения проекта. Важно понимать, что последовательность изменений может быть различной для разных организаций и проектов. Поэтому необходимо провести анализ и изучение контекста, чтобы определить наиболее эффективный подход к внедрению изменений. 14 | 15 | Использование инструментов управления изменениями, таких как анализ и изучение контекста, а также определение последовательности изменений, помогает гарантировать успешное внедрение изменений и достижение поставленных целей. Не бойтесь вносить изменения, но не забывайте о необходимости правильного управления ими. 16 | 17 | ## Почему важно работать с этим направлением 18 | * Управление изменениями требуют системного подхода и знаний инструментов и методик. В противном случае могут возникнуть непредсказуемые проблемы, а результат будет далек от ожидаемого 19 | 20 | ## Дополнительные материалы 21 | * [Книги, видео, подкасты](/docs/profession/good-to-know#управление-изменениями) 22 | * [Анти-паттерны](/docs/profession/antipatterns) 23 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/communications/facilitation.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: roadmap 3 | --- 4 | # Фасилитация 5 | **Фасилитация** - это способ организовать эффективное взаимодействие команды во время общей встречи. 6 | 7 | Фасилитатором может выступать любой член команды, важно, чтобы ведущий не был заинтересован в каком-либо из решений и помог группе самостоятельно к нему прийти. 8 | 9 | Можно выделить следующие функции фасилитатора: 10 | 11 | Вовлекает в обсуждение всех членов группы 12 | Стимулирует и побуждает команду вместе принимать решения 13 | Поддерживает атмосферу общей ответсвенности за принимаемые решения 14 | Ограничивает команду от различных непродуктивных ситуации: обсуждение затягивается на часы, а решение так и не принято, кто-то из участников саботирует встречу и т.д 15 | 16 | ## Как начать фасилитировать? 17 | 18 | 1. Желательно пройти обучение по фасилитации. Рекомендуемое обучение: Тренинг от команды Co-Actors, получение ICP-ATF сертификации 19 | 2. Вне зависимости от наличия обучения, сразу начать пробовать, чем раньше начнете, тем быстрее получите фидбек и обнаружите ошибки в своей работе Материалы, которые могут помочь: 20 | * группа в telegram "Нестыдная фасилитация" 21 | * добавить еще ссылок 22 | 23 | ## Как подготовиться ко встрече, краткий обзор основных активностей: 24 | 25 | 1. Зачем встреча и кто на ней будет? 26 | * Понять цель: зачем команде эта встреча 27 | * Определить тип команды и кол-во человек: группа руководителей, команда разработки, группа контента и тд 28 | * Определиться с датой проведения и найти в календаре свободный слот для всей команды 29 | 2. Подготовить дизайн встречи, который будет различаться в зависимости от целей, типа команды и кол-ва человек (будет полезен пункт выше "Материалы, которые могут помочь") 30 | 3. После встречи зафиксировать результаты: action points, ответственные, сроки 31 | 4. При возможности желательно возвращать команду к принятым решениям, либо определить за это ответственного 32 | 33 | ## Ошибки в использовании 34 | * Фасилитатор навязывает свое мнение команде: даже если вы знаете решение - вы уверенны, что ваше решение точно верно? - как фасилитатор вы можете подвести группу к этому решению наводящими вопросами, либо напрямую спросить у команды, не будут ли ребята против, если попробуете обозначить "идею", но сразу обозначить, что конечное решение за командой 35 | * Дизайн встречи не подходит группе: возможно для апишников в свитерах не всегда лучшее решение прийти на встречу с дизайном карточек в виде котиков 36 | * Фасилитатор не соблюдает тайминг: приведет к тому, что встреча затянется, если команда не может принять решение, спросите у команды, возможно стоит отдельно обсудить этот вопрос, предварительно подготовив варианты решения? 37 | * дополнить... 38 | -------------------------------------------------------------------------------- /blog/2023-03-31-version-1/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Version 1.0 3 | authors: 4 | - 'michael-martynov' 5 | tags: [release] 6 | --- 7 | Привет 👋 8 | 9 | Наша команда рада представить ежеквартальное обновление профессии Деливери менеджера. 10 | 11 | Давайте посмотрим, что новенького попало в релиз. 12 | 13 | * [Улучшение понятности страницы Профессия](https://github.com/Tinkoff/dm-knowledgebase/issues/14) 14 | * [Карта развития Деливери менеджера](https://github.com/Tinkoff/dm-knowledgebase/issues/10) 15 | * [Онбординг в профессию](https://github.com/Tinkoff/dm-knowledgebase/issues/13) 16 | 17 | 18 | 19 | ## Обновили тексты 20 | Вместе с редакторами потрудились, чтобы тексты стали более человечные, понятные – меньше абстракции и больше конкретики. Это касается [описания профессии](/docs/profession/about) и раздела с [грейдами](/docs/profession/competencies/grades). Где-то мы умышленно оставили размытые формулировки, чтобы не давать вам чёткие шаги и не ограничивать вашу фантазию. Мы обозначили берега, а какие они – лучше решать вам. 21 | 22 | ## Появилась карта развития Деливери менеджера 23 | Если у вас нет понимания какой инструмент или практику применить к тому контексту или задачам, которые перед вами стоят, то у нас есть для вас отличное решение - [Карта развития](/docs/roadmap). Можно выбрать ветку, которая вас интересует, например – управлением изменениями и изучить все практики и методы, которые помогают эти изменения проводить. Сейчас карточки инструментов пустые, но мы собираемся их потихоньку наполнять, обогащать кейсами, рекомендациями и личным опытом. 24 | 25 | ## Добавили раздел онбординга 26 | Профессия – это хорошо, но как в неё войти, что делать когда только попал в компанию или в команду? Ответы можно найти на страницах онбординга [в компанию](/docs/profession/onboarding/to-company) и [в команду](/docs/profession/onboarding/to-team). 27 | 28 | Как онбордиться в профессию пока не описали, так как этот многогранный процесс нам нужно ещё раз прожить самим, провести CustDev и потом обработать полученные знания. 29 | 30 | ## Появилась страница анти-паттернов 31 | Можно сказать, что на странице [анти-паттернов](/docs/profession/antipatterns), мы собрали вредные советы. Это то, что делать не надо, а если вы будете заниматься тем, что там написано, то жди беды, выгорания или чего ещё хуже. 32 | 33 | ## Планы на Q2 2023 34 | В новом релизе мы планируем поработать над улучшением читаемости текста теперь уже новых станиц, добавить онбординг в профессию, наполнить описаниями инструменты Деливери менеджера. 35 | 36 | Актуальную дорожную карту можно посмотреть в [DM Knowledge Base - Roadmap 2023](https://github.com/Tinkoff/dm-knowledgebase/issues/5) 37 | 38 | ## Как помочь проекту или связаться с нами 39 | Прочитайте разделы [Как вы можете помочь](https://github.com/Tinkoff/dm-knowledgebase#как-вы-можете-помочь) и [Как связаться](https://github.com/Tinkoff/dm-knowledgebase#как-связаться) 40 | -------------------------------------------------------------------------------- /docs/profession/antipatterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Анти-паттерны 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Анти-паттерны в работе Деливери менеджера 7 | Собрали список того, что нужно делать, чтобы стать самым неэффективным Деливери менеджером в мире: 8 |

9 |

47 |

48 | -------------------------------------------------------------------------------- /blog/2023-07-31-version-2/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Version 2.0 3 | authors: 4 | - 'mikovall' 5 | tags: [release] 6 | --- 7 | Привет друзья 👋 8 | 9 | Наша команда рада представить ежеквартальное обновление профессии Деливери менеджера. 10 | 11 | Список основных изменений: 12 | 13 | * [Новые цвета и шрифты в проекте](https://github.com/Tinkoff/dm-knowledgebase/issues/39) 14 | * [Новый логотип](https://github.com/Tinkoff/dm-knowledgebase/issues/39) 15 | * [Новые страницы в Карте развития](https://github.com/Tinkoff/dm-knowledgebase/issues/25) 16 | * [Новая страница "Полезные материалы"](https://github.com/Tinkoff/dm-knowledgebase/issues/43) 17 | 18 | 19 | 20 | Мы рады представить вам новинки в развитии профессии Деливери менеджера. 21 | 22 | ### Вы продаёте дизайн? Нет просто показываю. Красивое. 23 | 24 | Вы уже должны были заметить, что на сайте обновились цвета и шрифты. Продолжаем делать проект визуально привлекательным. Мы решили, что спокойные, но яркие пастельные тона помогут отразить спокойствие и системность профессии, а шрифтовые пары покажут её технологичность. 25 | 26 | Так же появился новый логотип, который говорит "В процессах всё ок, я лично проверил" 🙂 27 | 28 | Пока продолжаем использовать движок [Docusaurus](https://docusaurus.io/), но будем и дальше дорабатывать внешний вид под цели и задачи проекта. 29 | 30 | ### Новый раздел "Полезные материалы" 31 | 32 | Кто бы мог подумать, что в данном разделе могут быть реально полезные материалы и они там есть! Пока не много, но мы будем продолжать наполнять раздел книгами, видео и подкастами, которые лучше раскрывают профессию, помогают обрасти нужными навыками для решения ежедневных задач. Также в материалах можно найти для себя новые точки зрения на старые проблемы, расширить кругозор за счёт чужого опыта и просто приятно провести вечер. 33 | 34 | [Проникнуться пользой](https://tinkoff.github.io/dm-knowledgebase/docs/profession/good-to-know) 35 | 36 | ### Начали наполнять Карту развития 37 | 38 | В прошлом релизе была анонсирована Карта развития Деливери менеджера, а сейчас она начала заполняться. Появилось описание [раздела по проведению изменений](https://tinkoff.github.io/dm-knowledgebase/docs/roadmap/management/change), а в нём [последовательности изменений](https://tinkoff.github.io/dm-knowledgebase/docs/roadmap/management/change/order). Раскрыли [Метод Монте-Карло](https://tinkoff.github.io/dm-knowledgebase/docs/roadmap/management/job/tasks/planning/monte-carlo-method) и модель [Восьмь шагов Коттера](https://tinkoff.github.io/dm-knowledgebase/docs/roadmap/management/change/order/kotter-8-steps). 39 | 40 | ### Планы на Q3-4 2023 41 | 42 | Идей много, глаза горят, профессия всё ещё находится в зоне "Очень интересно, но мало что понятно" и мы продолжим её кристаллизировать: 43 | 44 | - Новая главная страница, чтобы с разу было понятно что это за проект такой 45 | - Онбординг в профессию Деливери менеджера. Страница, которая расскажет как стать Деливери менеджером 46 | - Матрица хард-скиллов. Навыки, без которых в профессии будет сложно 47 | - Как работать с Деливери менеджером, если я его нанимаю 48 | - Как работать с Деливери менеджером, если он работает над улучшением процессов в моем направлении 49 | 50 | Актуальную дорожную карту можно посмотреть в [DM Knowledge Base - Roadmap 2023](https://github.com/Tinkoff/dm-knowledgebase/issues/5). 51 | 52 | ### Как помочь проекту или связаться с нами 53 | 54 | Прочитайте разделы [Как вы можете помочь](https://github.com/Tinkoff/dm-knowledgebase#%D0%BA%D0%B0%D0%BA-%D0%B2%D1%8B-%D0%BC%D0%BE%D0%B6%D0%B5%D1%82%D0%B5-%D0%BF%D0%BE%D0%BC%D0%BE%D1%87%D1%8C) и [Как связаться](https://github.com/Tinkoff/dm-knowledgebase#%D0%BA%D0%B0%D0%BA-%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D1%82%D1%8C%D1%81%D1%8F). 55 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('@docusaurus/types').DocusaurusConfig} */ 2 | const math = require('remark-math'); 3 | const katex = require('rehype-katex'); 4 | module.exports = { 5 | title: 'Деливери менеджер', 6 | tagline: 'Кто это, задачи, обязанности, как им стать, карта развития', 7 | url: 'https://tinkoff.github.io', 8 | baseUrl: '/dm-knowledgebase/', 9 | onBrokenLinks: 'log', 10 | onBrokenMarkdownLinks: 'warn', 11 | favicon: 'img/favicon.png', 12 | organizationName: 'Tinkoff', // Usually your GitHub org/user name. 13 | projectName: 'dm-knowledgebase', // Usually your repo name. 14 | trailingSlash: false, 15 | markdown: { 16 | mermaid: true, 17 | }, 18 | themes: ['@docusaurus/theme-mermaid'], 19 | themeConfig: { 20 | mermaid: { 21 | theme: { light: 'base', dark: 'dark' }, 22 | options: { 23 | flowchart: { 24 | curve: 'monotoneX', 25 | }, 26 | themeVariables: { 27 | 'primaryColor': '#E6E9F6', 28 | 'primaryTextColor': '#000000', 29 | 'primaryBorderColor': '#E6E9F6', 30 | 'lineColor': '#5E73E1' 31 | } 32 | } 33 | }, 34 | colorMode: { 35 | defaultMode: 'light', 36 | disableSwitch: true, 37 | respectPrefersColorScheme: false, 38 | }, 39 | tableOfContents: { 40 | minHeadingLevel: 2, 41 | maxHeadingLevel: 4, 42 | }, 43 | docs: { 44 | sidebar: { 45 | hideable: true, 46 | }, 47 | }, 48 | navbar: { 49 | title: 'DM Knowledge Base', 50 | logo: { 51 | alt: 'База знаний профессии Деливери менеджер', 52 | src: 'img/logo.svg', 53 | }, 54 | items: [{ 55 | type: 'doc', 56 | docId: 'profession/about', 57 | position: 'left', 58 | label: 'Документация', 59 | }, 60 | { to: 'blog', label: 'Блог', position: 'left' }, 61 | { 62 | type: 'docsVersionDropdown', 63 | position: 'right', 64 | dropdownActiveClassDisabled: true, 65 | }, 66 | { 67 | href: 'https://github.com/Tinkoff/dm-knowledgebase', 68 | label: 'Репозиторий', 69 | position: 'right', 70 | }, 71 | ], 72 | }, 73 | footer: { 74 | style: 'light', 75 | copyright: `© 2006-${new Date().getFullYear()} АО «Тинькофф Банк»`, 76 | }, 77 | }, 78 | presets: [ 79 | [ 80 | '@docusaurus/preset-classic', 81 | { 82 | docs: { 83 | lastVersion: 'current', 84 | versions: { 85 | current: { 86 | label: '⚡ 1.0.0', 87 | //banner: 'unreleased', 88 | }, 89 | }, 90 | sidebarPath: require.resolve('./sidebars.js'), 91 | // Please change this to your repo. 92 | editUrl: 'https://github.com/Tinkoff/dm-knowledgebase/edit/main/', 93 | remarkPlugins: [math], 94 | rehypePlugins: [katex], 95 | showLastUpdateAuthor: true, 96 | }, 97 | gtag: { 98 | trackingID: 'G-CNJ52NL21B', 99 | anonymizeIP: true, 100 | }, 101 | theme: { 102 | customCss: require.resolve('./src/css/custom.css'), 103 | }, 104 | }, 105 | ], 106 | ], 107 | stylesheets: [{ 108 | href: 'https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css', 109 | type: 'text/css', 110 | integrity: 'sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM', 111 | crossorigin: 'anonymous', 112 | }, ], 113 | plugins: [ 114 | [ 115 | require.resolve('docusaurus-lunr-search'), 116 | { 117 | languages: ['ru', 'en'], 118 | }, 119 | ], 120 | ], 121 | }; 122 | -------------------------------------------------------------------------------- /docs/profession/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Описание профессии 3 | sidebar_position: 1 4 | --- 5 | import Tabs from '@theme/Tabs'; 6 | import TabItem from '@theme/TabItem'; 7 | 8 | # Описание профессии Деливери менеджер 9 | **Деливери менеджер (Delivery Manager)** — data-driven менеджер изменений, который отвечает за сквозной процесс доставки итогового продукта до пользователя: сокращает время от идеи до выхода продукта на рынок и увеличивает прогнозируемость. Если нет запроса на сквозной процесс — отвечает за всю доступную цепочку. 10 | 11 | Не стоит сравнивать с такими профессиями, как Service Delivery Manager, Scrum Master или Agile Coach — даже по-отдельности они не характеризуют роль Delivery Manager. 12 | 13 | ## Зачем нужен 14 | * Ускорять поставку продуктов на рынок в условиях растущей сложности ИТ систем, процессов и самих продуктов 15 | * Пересобирать и улучшать процессы растущего или изменяющегося бизнеса, чтобы компании не теряли гибкость и эффективность при масштабировании 16 | * Накапливать и делиться практиками и опытом с организацией, командами, сотрудниками, комьюнити 17 | 18 | ## Что делает 19 | Задачи Деливери менеджера делятся на две группы: управление изменениями и масштабируемость практик. 20 | 21 | 22 | ```mermaid 23 | flowchart TD 24 | 25 | ``` 26 | 27 | 28 | 29 | 30 | 31 | ```mermaid 32 | graph TD 33 | %%{ init: { 'flowchart': { 'curve': 'monotoneY' }}}%% 34 | A(Управление изменениями процессов поставки ценностей) --> B[Выявление неудовлетворенностей] 35 | B --> C[Разработка стратегии и плана по улучшению процессов] 36 | C --> D[Определение сервисов
продуктовых команд] 37 | D --> D1[Поиск и проработка узких мест] 38 | C --> E[Разработка системы для поставок продукта
в нужный срок] 39 | E --> E1[Сократить распределения работ
- хвост в распределении Cycle Time] 40 | E1 --> E2[При необходимости
ускорение процесса работы над фичами] 41 | C --> F[Повышение прозрачности работы] 42 | F --> F1[Визуализация работы команд] 43 | F1 --> F2[Формирование процесса сбора метрик] 44 | F2 --> F3[Организация взаимодействия
между отделами, командами, бизнес-линиями] 45 | F3 --> F4[Горизонтальное масштабирование
Upstream + сопровождение] 46 | F4 --> F5[Вертикальное масштабирование] 47 | ``` 48 | 49 |
50 | 51 | 52 | ```mermaid 53 | graph TD 54 | %%{ init: { 'flowchart': { 'curve': 'monotoneY' }}}%% 55 | A(Масштабируемость практик) --> B[Повышение зрелости команды] & C[Организация обмена знаниями] 56 | B --> B1[Обучение лидов и руководителей отделов
проведению изменений] 57 | C --> D[Создание и развитие базы знаний] & E[Оценка работы команд] 58 | E --> E1[Консультация по лучшим практикам] 59 | ``` 60 | 61 |
62 |
63 | 64 | ## Как делает 65 | Чтобы выполнять свои задачи Деливери менеджер выступает в трех ролях — владелец производственного процесса, менеджер изменений и коуч. 66 | 67 | **Владелец Продукта "Производственный процесс"** работает с доставкой продукта от идеи до получения продукта пользователем, выстраивает горизонтальные и вертикальные партнерские связи между всеми участниками создания ценности. Он визуализирует процессы, чтобы они были понятными и управляемыми, а еще работает над улучшением метрик Discovery и Delivery и формирует прозрачную стратегию планов развития производственных процессов с учетом целей компании. 68 | 69 | **Агент изменений** управляет изменениями используя инструменты менеджмента, вовлекает людей в общее дело. Он масштабирует процессы и рабочие практики чтобы сохранить гибкость компании и работает с метриками, используя data-driven подход. Помогает командам поддерживать такой уровень осознанности, чтобы они могли самостоятельно улучшать процессы. 70 | 71 | **Коуч** помогает командам решать конфликты и приходить к лучшим решениям с помощью инструментов фасилитации. Накапливает знания и практики, адаптирует под контекст и делится ими с коллегами. А еще коуч поддерживает в людях проактивную позицию участия в жизни компании и ее процессов, инвестирует в обучение и развитие через практики коучинга и менторинга. Помогает составлять индивидуальные планы развития специалистов и процессов. 72 | -------------------------------------------------------------------------------- /src/theme/SearchBar/index.js: -------------------------------------------------------------------------------- 1 | import React, { useRef, useCallback, useState } from "react"; 2 | import classnames from "classnames"; 3 | import { useHistory } from "@docusaurus/router"; 4 | import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; 5 | import { usePluginData } from '@docusaurus/useGlobalData'; 6 | import useIsBrowser from "@docusaurus/useIsBrowser"; 7 | const Search = props => { 8 | const initialized = useRef(false); 9 | const searchBarRef = useRef(null); 10 | const [indexReady, setIndexReady] = useState(false); 11 | const history = useHistory(); 12 | const { siteConfig = {} } = useDocusaurusContext(); 13 | const isBrowser = useIsBrowser(); 14 | const { baseUrl } = siteConfig; 15 | const initAlgolia = (searchDocs, searchIndex, DocSearch) => { 16 | new DocSearch({ 17 | searchDocs, 18 | searchIndex, 19 | baseUrl, 20 | inputSelector: "#search_input_react", 21 | // Override algolia's default selection event, allowing us to do client-side 22 | // navigation and avoiding a full page refresh. 23 | handleSelected: (_input, _event, suggestion) => { 24 | const url = suggestion.url || "/"; 25 | // Use an anchor tag to parse the absolute url into a relative url 26 | // Alternatively, we can use new URL(suggestion.url) but its not supported in IE 27 | const a = document.createElement("a"); 28 | a.href = url; 29 | // Algolia use closest parent element id #__docusaurus when a h1 page title does not have an id 30 | // So, we can safely remove it. See https://github.com/facebook/docusaurus/issues/1828 for more details. 31 | 32 | history.push(url); 33 | } 34 | }); 35 | }; 36 | 37 | const pluginData = usePluginData('docusaurus-lunr-search'); 38 | const getSearchDoc = () => 39 | process.env.NODE_ENV === "production" 40 | ? fetch(`${baseUrl}${pluginData.fileNames.searchDoc}`).then((content) => content.json()) 41 | : Promise.resolve([]); 42 | 43 | const getLunrIndex = () => 44 | process.env.NODE_ENV === "production" 45 | ? fetch(`${baseUrl}${pluginData.fileNames.lunrIndex}`).then((content) => content.json()) 46 | : Promise.resolve([]); 47 | 48 | const loadAlgolia = () => { 49 | if (!initialized.current) { 50 | Promise.all([ 51 | getSearchDoc(), 52 | getLunrIndex(), 53 | import("./DocSearch"), 54 | import("./algolia.css") 55 | ]).then(([searchDocs, searchIndex, { default: DocSearch }]) => { 56 | if (searchDocs.length === 0) { 57 | return; 58 | } 59 | initAlgolia(searchDocs, searchIndex, DocSearch); 60 | setIndexReady(true); 61 | }); 62 | initialized.current = true; 63 | } 64 | }; 65 | 66 | const toggleSearchIconClick = useCallback( 67 | e => { 68 | if (!searchBarRef.current.contains(e.target)) { 69 | searchBarRef.current.focus(); 70 | } 71 | 72 | props.handleSearchBarToggle && props.handleSearchBarToggle(!props.isSearchBarExpanded); 73 | }, 74 | [props.isSearchBarExpanded] 75 | ); 76 | 77 | if (isBrowser) { 78 | loadAlgolia(); 79 | } 80 | 81 | return ( 82 |
83 | 93 | 110 |
111 | ); 112 | }; 113 | 114 | export default Search; 115 | -------------------------------------------------------------------------------- /src/theme/SearchBar/templates.js: -------------------------------------------------------------------------------- 1 | const prefix = 'algolia-docsearch'; 2 | const suggestionPrefix = `${prefix}-suggestion`; 3 | const footerPrefix = `${prefix}-footer`; 4 | 5 | const templates = { 6 | suggestion: ` 7 | 14 |
15 | {{{category}}} 16 |
17 |
18 |
19 | {{{subcategory}}} 20 |
21 | {{#isTextOrSubcategoryNonEmpty}} 22 |
23 |
{{{subcategory}}}
24 |
{{{title}}}
25 | {{#text}}
{{{text}}}
{{/text}} 26 |
27 | {{/isTextOrSubcategoryNonEmpty}} 28 |
29 |
30 | `, 31 | suggestionSimple: ` 32 |
37 |
38 | {{^isLvl0}} 39 | {{{category}}} 40 | {{^isLvl1}} 41 | {{^isLvl1EmptyOrDuplicate}} 42 | 43 | {{{subcategory}}} 44 | 45 | {{/isLvl1EmptyOrDuplicate}} 46 | {{/isLvl1}} 47 | {{/isLvl0}} 48 |
49 | {{#isLvl2}} 50 | {{{title}}} 51 | {{/isLvl2}} 52 | {{#isLvl1}} 53 | {{{subcategory}}} 54 | {{/isLvl1}} 55 | {{#isLvl0}} 56 | {{{category}}} 57 | {{/isLvl0}} 58 |
59 |
60 |
61 | {{#text}} 62 |
63 |
{{{text}}}
64 |
65 | {{/text}} 66 |
67 |
68 | `, 69 | footer: ` 70 |
71 |
72 | `, 73 | empty: ` 74 |
75 |
76 |
77 |
78 |
79 | No results found for query "{{query}}" 80 |
81 |
82 |
83 |
84 |
85 | `, 86 | searchBox: ` 87 | 102 | 103 | 109 | `, 110 | }; 111 | 112 | export default templates; 113 | -------------------------------------------------------------------------------- /src/theme/SearchBar/lib/templates.js: -------------------------------------------------------------------------------- 1 | const prefix = 'algolia-docsearch'; 2 | const suggestionPrefix = `${prefix}-suggestion`; 3 | const footerPrefix = `${prefix}-footer`; 4 | 5 | /* eslint-disable max-len */ 6 | 7 | const templates = { 8 | suggestion: ` 9 | 16 |
17 | {{{category}}} 18 |
19 |
20 |
21 | {{{subcategory}}} 22 |
23 | {{#isTextOrSubcategoryNonEmpty}} 24 |
25 |
{{{subcategory}}}
26 |
{{{title}}}
27 | {{#text}}
{{{text}}}
{{/text}} 28 |
29 | {{/isTextOrSubcategoryNonEmpty}} 30 |
31 |
32 | `, 33 | suggestionSimple: ` 34 |
39 |
40 | {{^isLvl0}} 41 | {{{category}}} 42 | {{^isLvl1}} 43 | {{^isLvl1EmptyOrDuplicate}} 44 | 45 | {{{subcategory}}} 46 | 47 | {{/isLvl1EmptyOrDuplicate}} 48 | {{/isLvl1}} 49 | {{/isLvl0}} 50 |
51 | {{#isLvl2}} 52 | {{{title}}} 53 | {{/isLvl2}} 54 | {{#isLvl1}} 55 | {{{subcategory}}} 56 | {{/isLvl1}} 57 | {{#isLvl0}} 58 | {{{category}}} 59 | {{/isLvl0}} 60 |
61 |
62 |
63 | {{#text}} 64 |
65 |
{{{text}}}
66 |
67 | {{/text}} 68 |
69 |
70 | `, 71 | footer: ` 72 |
73 |
74 | `, 75 | empty: ` 76 |
77 |
78 |
79 |
80 |
81 | No results found for query "{{query}}" 82 |
83 |
84 |
85 |
86 |
87 | `, 88 | searchBox: ` 89 | 104 | 105 | 111 | `, 112 | }; 113 | 114 | export default templates; 115 | -------------------------------------------------------------------------------- /docs/roadmap/management/change/order/index.md: -------------------------------------------------------------------------------- 1 | # Последовательность 2 | ## Инструменты 3 | Для определения последовательности изменений можно использовать различные модели. Далее расскажем, как выбрать подходящую, а на странице каждой из этих моделей раскрываем наши советы по их реализации. 4 | 5 | ```mermaid 6 | graph LR 7 | %%{ init: { 'flowchart': { 'nodeSpacing': 10, 'rankSpacing': 200 }}}%% 8 | A[Последовательность] --- B1(8 шагов Коттера) & B2(ADKAR) & B3(Цикл Деминга PDCA) & B4(Модель Льюина) & B5(Революционная модель) 9 | click B1 href "order/kotter-8-steps" "Последовательность" 10 | classDef label-link text-decoration: underline; 11 | class B1 label-link 12 | ``` 13 | 14 | ## Как выбрать 15 | Для выбора подходящей нужно понимать цели организации, ее культуру и структуру, а также готовность сотрудников к изменениям. 16 | 17 | Если прямо здесь и сейчас давать какой-то совет, то он звучит так: PDCA и ADKAR подходят для небольших изменений, требующих изменения поведения, в то время как 8-ступенчатая модель Коттера и модель Льюина лучше всего подходят для крупномасштабных изменений, которые требуют культурного изменения. А если хочется создать культуру непрерывного улучшения и инноваций, то подойдет эволюционная модель. 18 | 19 | Но важно внимательно оценить каждую модель, чтобы определить, какая из них лучше всего подойдет для вашей организации. В этом процессе таблица сравнения разных моделей изменений может оказаться полезной, чтобы понять их плюсы и минусы. 20 | 21 | ### ADKAR и Kotter 22 | 23 | | Параметр | Модель Коттера | Модель ADKAR | 24 | |---------------------------|--------------------------------------------------------------|---------------------------------------------------------| 25 | | Количество этапов | 8 | 5 | 26 | | Ориентация | Большие, сложные изменения | Меньшие, более простые изменения | 27 | | Фокус | Мотивация сотрудников | Изменение поведения сотрудников | 28 | | Последовательность этапов | Действия выполняются последовательно | Действия выполняются одновременно или в параллели | 29 | | Результат | Постоянное изменение культуры и структуры организации | Постоянное изменение поведения сотрудников | 30 | | Ключевой фактор успеха | Мотивация и лидерство | Коммуникация и обучение | 31 | | Недостатки | Медленная реализация, не всегда подходит для малых изменений | Не уделяется достаточного внимания культуре организации | 32 | 33 | Как видно из таблицы, обе модели имеют свои преимущества и недостатки. Модель Коттера ориентирована на более крупные и сложные изменения, а модель ADKAR - на более простые и меньшие изменения. Модель Коттера предполагает последовательное выполнение этапов, в то время как модель ADKAR предлагает выполнение действий одновременно или в параллели. Ключевыми факторами успеха в модели Коттера являются мотивация и лидерство, а в модели ADKAR - коммуникация и обучение. 34 | 35 | ### Революционная и эволюционная модель 36 | 37 | | Категории | Революционная модель | Эволюционная модель | 38 | |---------------------|---------------------------------------------------|---------------------------------------------------------------| 39 | | Философия | Большой, глобальный и быстрый прыжок вперед | Медленное, но постоянное движение вперед | 40 | | Подход к изменениям | Радикальное пересмотрение | Инкрементальное улучшение | 41 | | Сфера применения | Масштабные преобразования в организации и бизнесе | Непрерывное улучшение внутренних процессов | 42 | | Тип лидерства | Руководитель как главный двигатель изменений | Руководитель как координатор изменений | 43 | | Роль сотрудников | Участие в революционных изменениях | Участие в улучшении текущих процессов | 44 | | Риски и сложности | Большой риск и высокие затраты на реализацию | Медленный прогресс и слабое привлечение внимания к изменениям | 45 | 46 | Как видно из таблицы, революционная модель изменений направлена на быстрое и радикальное пересмотрение текущего состояния организации и ее бизнес-модели, что может привести к значительным результатам в короткие сроки. Однако, это также связано с большими рисками и высокими затратами на реализацию изменений. 47 | 48 | С другой стороны, эволюционная модель изменений более ориентирована на непрерывное улучшение текущих процессов в организации. Это позволяет достигать результатов более медленно, но с меньшими затратами и рисками. Также эта модель более доступна для многих организаций, так как не требует крупномасштабных изменений в короткие сроки. 49 | 50 | Обе модели имеют свои сильные и слабые стороны, и выбор конкретной модели зависит от целей, ситуации в организации и ее культуры. 51 | 52 | ### Общие выводы 53 | 54 | Так или иначе все модели укладываются в три этапа 55 | 56 | **Поиск мотивации или стрессора к изменениям:** 57 | - Анализ текущего состояния и поиск проблемных областей (Коттер, АДКАР, Революционная модель) 58 | - Оценка степени готовности сотрудников к изменениям (Коттер, АДКАР, Революционная модель) 59 | - Выявление базовых причин сопротивления изменениям (Коттер, АДКАР, Революционная модель) 60 | 61 | **Рефлексия:** 62 | - Определение целей и планирование изменений (Коттер, АДКАР, Эволюционная модель) 63 | - Разработка стратегии изменений (Коттер, АДКАР, Эволюционная модель) 64 | - Построение коммуникационной стратегии (Коттер, АДКАР, Эволюционная модель) 65 | 66 | **Совершение акта лидерства:** 67 | - Реализация изменений (Коттер, АДКАР, Эволюционная модель) 68 | - Поддержка новых методов работы (Коттер, АДКАР, Эволюционная модель) 69 | - Оценка результатов и корректировка стратегии изменений (Коттер, АДКАР, Эволюционная модель) 70 | -------------------------------------------------------------------------------- /src/theme/SearchBar/lib/lunar-search.js: -------------------------------------------------------------------------------- 1 | import lunr from "@generated/lunr.client"; 2 | lunr.tokenizer.separator = /[\s\-/]+/; 3 | 4 | class LunrSearchAdapter { 5 | constructor(searchDocs, searchIndex) { 6 | this.searchDocs = searchDocs; 7 | this.lunrIndex = lunr.Index.load(searchIndex); 8 | } 9 | 10 | getLunrResult(input) { 11 | return this.lunrIndex.query(function (query) { 12 | const tokens = lunr.tokenizer(input); 13 | query.term(tokens, { 14 | boost: 10 15 | }); 16 | query.term(tokens, { 17 | wildcard: lunr.Query.wildcard.TRAILING 18 | }); 19 | }); 20 | } 21 | 22 | getHit(doc, formattedTitle, formattedContent) { 23 | return { 24 | hierarchy: { 25 | lvl0: doc.pageTitle || doc.title, 26 | lvl1: doc.type === 0 ? null : doc.title 27 | }, 28 | url: doc.url, 29 | _snippetResult: formattedContent ? { 30 | content: { 31 | value: formattedContent, 32 | matchLevel: "full" 33 | } 34 | } : null, 35 | _highlightResult: { 36 | hierarchy: { 37 | lvl0: { 38 | value: doc.type === 0 ? formattedTitle || doc.title : doc.pageTitle, 39 | }, 40 | lvl1: 41 | doc.type === 0 42 | ? null 43 | : { 44 | value: formattedTitle || doc.title 45 | } 46 | } 47 | } 48 | }; 49 | } 50 | getTitleHit(doc, position, length) { 51 | const start = position[0]; 52 | const end = position[0] + length; 53 | let formattedTitle = doc.title.substring(0, start) + '' + doc.title.substring(start, end) + '' + doc.title.substring(end, doc.title.length); 54 | return this.getHit(doc, formattedTitle) 55 | } 56 | 57 | getKeywordHit(doc, position, length) { 58 | const start = position[0]; 59 | const end = position[0] + length; 60 | let formattedTitle = doc.title + '
Keywords: ' + doc.keywords.substring(0, start) + '' + doc.keywords.substring(start, end) + '' + doc.keywords.substring(end, doc.keywords.length) + '' 61 | return this.getHit(doc, formattedTitle) 62 | } 63 | 64 | getContentHit(doc, position) { 65 | const start = position[0]; 66 | const end = position[0] + position[1]; 67 | let previewStart = start; 68 | let previewEnd = end; 69 | let ellipsesBefore = true; 70 | let ellipsesAfter = true; 71 | for (let k = 0; k < 3; k++) { 72 | const nextSpace = doc.content.lastIndexOf(' ', previewStart - 2); 73 | const nextDot = doc.content.lastIndexOf('.', previewStart - 2); 74 | if ((nextDot > 0) && (nextDot > nextSpace)) { 75 | previewStart = nextDot + 1; 76 | ellipsesBefore = false; 77 | break; 78 | } 79 | if (nextSpace < 0) { 80 | previewStart = 0; 81 | ellipsesBefore = false; 82 | break; 83 | } 84 | previewStart = nextSpace + 1; 85 | } 86 | for (let k = 0; k < 10; k++) { 87 | const nextSpace = doc.content.indexOf(' ', previewEnd + 1); 88 | const nextDot = doc.content.indexOf('.', previewEnd + 1); 89 | if ((nextDot > 0) && (nextDot < nextSpace)) { 90 | previewEnd = nextDot; 91 | ellipsesAfter = false; 92 | break; 93 | } 94 | if (nextSpace < 0) { 95 | previewEnd = doc.content.length; 96 | ellipsesAfter = false; 97 | break; 98 | } 99 | previewEnd = nextSpace; 100 | } 101 | let preview = doc.content.substring(previewStart, start); 102 | if (ellipsesBefore) { 103 | preview = '... ' + preview; 104 | } 105 | preview += '' + doc.content.substring(start, end) + ''; 106 | preview += doc.content.substring(end, previewEnd); 107 | if (ellipsesAfter) { 108 | preview += ' ...'; 109 | } 110 | return this.getHit(doc, null, preview); 111 | 112 | } 113 | search(input) { 114 | return new Promise((resolve, rej) => { 115 | const results = this.getLunrResult(input); 116 | const hits = []; 117 | results.length > 5 && (results.length = 5); 118 | this.titleHitsRes = [] 119 | this.contentHitsRes = [] 120 | results.forEach(result => { 121 | const doc = this.searchDocs[result.ref]; 122 | const { metadata } = result.matchData; 123 | for (let i in metadata) { 124 | if (metadata[i].title) { 125 | if (!this.titleHitsRes.includes(result.ref)) { 126 | const position = metadata[i].title.position[0] 127 | hits.push(this.getTitleHit(doc, position, input.length)); 128 | this.titleHitsRes.push(result.ref); 129 | } 130 | } else if (metadata[i].content) { 131 | const position = metadata[i].content.position[0] 132 | hits.push(this.getContentHit(doc, position)) 133 | } else if (metadata[i].keywords) { 134 | const position = metadata[i].keywords.position[0] 135 | hits.push(this.getKeywordHit(doc, position, input.length)); 136 | this.titleHitsRes.push(result.ref); 137 | } 138 | } 139 | }); 140 | hits.length > 5 && (hits.length = 5); 141 | resolve(hits); 142 | }); 143 | } 144 | } 145 | 146 | export default LunrSearchAdapter; 147 | -------------------------------------------------------------------------------- /src/theme/SearchBar/lunar-search.js: -------------------------------------------------------------------------------- 1 | import lunr from "@generated/lunr.client"; 2 | lunr.tokenizer.separator = /[\s\-/]+/; 3 | 4 | class LunrSearchAdapter { 5 | constructor(searchDocs, searchIndex, baseUrl = '/') { 6 | this.searchDocs = searchDocs; 7 | this.lunrIndex = lunr.Index.load(searchIndex); 8 | this.baseUrl = baseUrl; 9 | } 10 | 11 | getLunrResult(input) { 12 | return this.lunrIndex.query(function (query) { 13 | const tokens = lunr.tokenizer(input); 14 | query.term(tokens, { 15 | boost: 10 16 | }); 17 | query.term(tokens, { 18 | wildcard: lunr.Query.wildcard.TRAILING 19 | }); 20 | }); 21 | } 22 | 23 | getHit(doc, formattedTitle, formattedContent) { 24 | return { 25 | hierarchy: { 26 | lvl0: doc.pageTitle || doc.title, 27 | lvl1: doc.type === 0 ? null : doc.title 28 | }, 29 | url: doc.url, 30 | _snippetResult: formattedContent ? { 31 | content: { 32 | value: formattedContent, 33 | matchLevel: "full" 34 | } 35 | } : null, 36 | _highlightResult: { 37 | hierarchy: { 38 | lvl0: { 39 | value: doc.type === 0 ? formattedTitle || doc.title : doc.pageTitle, 40 | }, 41 | lvl1: 42 | doc.type === 0 43 | ? null 44 | : { 45 | value: formattedTitle || doc.title 46 | } 47 | } 48 | } 49 | }; 50 | } 51 | getTitleHit(doc, position, length) { 52 | const start = position[0]; 53 | const end = position[0] + length; 54 | let formattedTitle = doc.title.substring(0, start) + '' + doc.title.substring(start, end) + '' + doc.title.substring(end, doc.title.length); 55 | return this.getHit(doc, formattedTitle) 56 | } 57 | 58 | getKeywordHit(doc, position, length) { 59 | const start = position[0]; 60 | const end = position[0] + length; 61 | let formattedTitle = doc.title + '
Keywords: ' + doc.keywords.substring(0, start) + '' + doc.keywords.substring(start, end) + '' + doc.keywords.substring(end, doc.keywords.length) + '' 62 | return this.getHit(doc, formattedTitle) 63 | } 64 | 65 | getContentHit(doc, position) { 66 | const start = position[0]; 67 | const end = position[0] + position[1]; 68 | let previewStart = start; 69 | let previewEnd = end; 70 | let ellipsesBefore = true; 71 | let ellipsesAfter = true; 72 | for (let k = 0; k < 3; k++) { 73 | const nextSpace = doc.content.lastIndexOf(' ', previewStart - 2); 74 | const nextDot = doc.content.lastIndexOf('.', previewStart - 2); 75 | if ((nextDot > 0) && (nextDot > nextSpace)) { 76 | previewStart = nextDot + 1; 77 | ellipsesBefore = false; 78 | break; 79 | } 80 | if (nextSpace < 0) { 81 | previewStart = 0; 82 | ellipsesBefore = false; 83 | break; 84 | } 85 | previewStart = nextSpace + 1; 86 | } 87 | for (let k = 0; k < 10; k++) { 88 | const nextSpace = doc.content.indexOf(' ', previewEnd + 1); 89 | const nextDot = doc.content.indexOf('.', previewEnd + 1); 90 | if ((nextDot > 0) && (nextDot < nextSpace)) { 91 | previewEnd = nextDot; 92 | ellipsesAfter = false; 93 | break; 94 | } 95 | if (nextSpace < 0) { 96 | previewEnd = doc.content.length; 97 | ellipsesAfter = false; 98 | break; 99 | } 100 | previewEnd = nextSpace; 101 | } 102 | let preview = doc.content.substring(previewStart, start); 103 | if (ellipsesBefore) { 104 | preview = '... ' + preview; 105 | } 106 | preview += '' + doc.content.substring(start, end) + ''; 107 | preview += doc.content.substring(end, previewEnd); 108 | if (ellipsesAfter) { 109 | preview += ' ...'; 110 | } 111 | return this.getHit(doc, null, preview); 112 | 113 | } 114 | search(input) { 115 | return new Promise((resolve, rej) => { 116 | const results = this.getLunrResult(input); 117 | const hits = []; 118 | results.length > 5 && (results.length = 5); 119 | this.titleHitsRes = [] 120 | this.contentHitsRes = [] 121 | results.forEach(result => { 122 | const doc = this.searchDocs[result.ref]; 123 | const { metadata } = result.matchData; 124 | for (let i in metadata) { 125 | if (metadata[i].title) { 126 | if (!this.titleHitsRes.includes(result.ref)) { 127 | const position = metadata[i].title.position[0] 128 | hits.push(this.getTitleHit(doc, position, input.length)); 129 | this.titleHitsRes.push(result.ref); 130 | } 131 | } else if (metadata[i].content) { 132 | const position = metadata[i].content.position[0] 133 | hits.push(this.getContentHit(doc, position)) 134 | } else if (metadata[i].keywords) { 135 | const position = metadata[i].keywords.position[0] 136 | hits.push(this.getKeywordHit(doc, position, input.length)); 137 | this.titleHitsRes.push(result.ref); 138 | } 139 | } 140 | }); 141 | hits.length > 5 && (hits.length = 5); 142 | resolve(hits); 143 | }); 144 | } 145 | } 146 | 147 | export default LunrSearchAdapter; 148 | -------------------------------------------------------------------------------- /versioned_docs/version-0.0.1/profession/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | 7 | # Описание 8 | Роль ***Delivery Manager*** – **data-driven менеджер изменений**, который отвечает за **выстраивание End-to-End процесса поставки ценности**: сокращает Time to market и увеличивает прогнозируемость. Там где нет запроса на сквозной процесс – отвечает за всю доступную цепочку. 9 | 10 | Некорректно сравнивать со сложившимся на рынке профессиями, такими как Service Delivery Manager, Scrum Master или Agile Coach, так как по отдельности они не характеризуют роль Delivery Manager. 11 | 12 | ## Зачем нужен 13 | * Помочь организации в условиях увеличивающейся сложности (IT-систем, продуктов, коммуникаций, процессов) ускорить поставку продуктов на рынок 14 | * Также помочь организации не терять гибкость и эффективность при масштабировании: пересобирать и улучшать процессы под рост или реструктуризацию бизнеса 15 | * Накапливать и делиться работающими практиками и опытом с организацией и её командами, сотрудниками, комьюнити 16 | 17 | ## Что делает 18 | Условно задачи Delivery Manager можно разделить на 2 группы: 19 | 20 | 21 | ```mermaid 22 | flowchart TD 23 | 24 | ``` 25 | 26 | 27 | 28 | 29 | 30 | ```mermaid 31 | graph TD 32 | A(Управление изменениями процессов поставки ценностей) --> B[Выявление неудовлетворенностей] 33 | B --> C[Построение стратегии по улучшению процессов
- план улучшений] 34 | C --> D[Определение сервисов
продуктовых команд] 35 | D --> D1[Определение узких мест,
их нивелирование] 36 | C --> E[Выстроить систему, которая будет
поставлять в срок] 37 | E --> E1[Сократить распределение работ
- хвост в распределении Cycle Time] 38 | E1 --> E2[Увеличить скорость работы
над фичами при необходимости] 39 | C --> F[Повышение прозрачности работы] 40 | F --> F1[Визуализация работы команд] 41 | F1 --> F2[Формирование процесса сбора метрик] 42 | F2 --> F3[Организация коммуникаций
между отделами,
командами, бизнес-линиями] 43 | F3 --> F4[Горизонтальное масштабирование
Upstream + сопровождение] 44 | F4 --> F5[Вертикальное масштабирование] 45 | ``` 46 | 47 |
48 | 49 | 50 | ```mermaid 51 | graph TD 52 | A(Масштабируемость практик) --> B[Повышение зрелости команды] & C[Организация процесса обмена знаниями] 53 | B --> B1[Обучение процессу работы с изменениями
лидов и рук отделов] 54 | C --> D[Выстраивание базы знаний] & E[Ассессмент работы команд] 55 | E --> E1[Консультация по лучшим практикам] 56 | ``` 57 | 58 |
59 |
60 | 61 | ## Как делает 62 | Чтобы выполнять свои задачи Delivery Manager выступает в 3-х ролях. 63 | 64 | | Владелец Продукта "Производственный процесс" | Агент изменений | Коуч | 65 | |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 66 | | | | | 67 | -------------------------------------------------------------------------------- /docs/roadmap/professional-growth/communications/oratory.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_class_name: roadmap 3 | --- 4 | # Ораторское искусство 5 | **Ора́торское иску́сство** (_красноре́чие, искусство красноречия_) — искусство публичного выступления с целью убеждения. Ораторское искусство — это гармоничное сочетание риторики, приёмов актёрского мастерства (подача) и психологических техник. 6 | 7 | Цель ораторского искусства — изложение оратором его позиции перед оппонентом или аудиторией, защита собственной точки зрения. Этой цели он достигает, используя подготовленную речь и технику ораторского мастерства. 8 | 9 | Ораторское искусство и свойства ораторской речи изучает наука риторика. 10 | 11 | Ораторская речь — это вид монологической речи, употребляемый в ситуации, когда говорящий обращается к многочисленной аудитории с целью убеждения. Речь оратора имеет свои особенности построения композиции и стиля, а также особое соотношение языковых и неязыковых средств общения. Можно выделить несколько основных качеств, которые отличают ораторскую речь от других видов речи. 12 | 13 | Оратор обращается к народу с ораторской речью — не только донести до слушателя информацию, но и получить ответную реакцию в виде заинтересованности (убедить) или каких-либо действий (побудить). Такая речь всегда имеет агитационный характер. Для этого оратор должен быть воодушевлён предметом своей речи и вкладывать в неё то, что он считает нужным и полезным для его слушателей. 14 | Для того, чтобы речь тронула и заинтересовала аудиторию, важен авторитет говорящего или его особый психологический настрой. Чтобы побудить слушателей совершить какие-то действия, оратор, прежде всего, сам делает усилие, требующее особого напряжения воли. Это усилие чувствуется в речи оратора и передаётся его слушателям, побуждая их к действиям. 15 | 16 | ## Важность понимания и владения ораторским искусством 17 | Для проведения изменений, диагностики проблематики, проведения встреч, презентаций своих идей командам/руководителям/топ-менеджменту критически важно обладать хорошими навыками ораторского мастерства. С развитым ораторским мастерством Деливери менеджер звучит убедительно, его идеи реже поддаются критике, он быстрее располагает собеседников к себе, позволяет быстрее договариваться и выстраивать крепкие партнёрские отношения. Навык чётко и ясно доносить свои мысли критически важен в данной роли. 18 | 19 | ## Дополнительные материалы 20 | * Тинькофф Апгрейд. Подготовка к публичным выступлениям https://upgrade.tcsbank.ru/showcase/itmain/itdetail/143 21 | * Тинькофф Образование. Структура публичных выступлений https://edu.tcsbank.ru/course/6721556654195552678/program 22 | * Тинькофф Образование. Публичные выступление по методу Максима Евдокимова https://edu.tinkoff.ru/my-activities/courses/stream/6094898b-962f-4ac9-a5c1-60129b449c3b/program 23 | * Тинькофф Образование. Базовые принципы дизайна презентации https://edu.tcsbank.ru/course/6852299295526239821/program 24 | * Курсы в Московской школы ораторов и публичного мастерства (онлайн + офлайн) https://orator.moscow/ 25 | * Школа менеджеров Яндекса. Мария Кутузова про презентации http://youtube.com/watch?v=S0r0fMJa9eA 26 | * Шаблоны презентаций, гайды и шрифт https://share.tinkoff.ru/s/oXPZHnwNBYReo9t – хозяин папки на T-Share Mikhail Martynov 27 | 28 | ## Лайфкахи 29 | 1. Можно использовать чёрные слайды-заглушки, чтобы переключить внимание со слайда на себя. Это хорошо, если надо что-то сказать аудитории, сфокусировать их внимание на себе 30 | 2. Смотреть выступления по теме до начала подготовки своего выступления. Воровать их слова или приёмы по теме – это не зашквар, если копировать с доработками 31 | 3. Заготовить 10+ фактов о себе которые перебирать в зависимости от аудитории 32 | 4. Никому не интересны пустые факты о том, кто ты, почему ты эксперт - хорошо начать с неожиданного вовлечения и потом подвести к своей экспертизе и знакомству 33 | 5. Комментировать ответ аудитории мастхев иначе ты ее можешь потерять 34 | 6. Вопросы из аудитории надо проговаривать вслух, если у говорящего нет микрофона, так как может идти запись и на ней будет слышно только ответ спикера. Очень раздражает, когда смотришь запись и слышишь ответ, но не понимаешь какой был вопрос 35 | 7. Создавать план динамики можно через карту того, что слушатель делает в каждый момент времени 36 | 8. Чтобы вовлечь аудиторию нужно не просто давать ей информацию, а заставлять думать вместе с тобой 37 | 9. Надо переводить телефон в авиарежим, чтобы при звонке не было параллельного звонка на MacBook, если идёт шаринг экрана 38 | 10. Важно максимально детально проработать вступление, так как если вступление прошло хорошо, то дальше выступление идёт как-то получше. Больше энергии и уверенности 39 | 11. Если ты выступаешь не один, то круто делать отсылки на коллег, которые выступали до тебя или будут после с анонсом времени и тем их выступлений. Это делает выступление более живым 40 | 12. В конце выступления можно оставить контакты и голосом проговорить про бесплатный консалтинг всем, кто напишет в личку или поставит встречу с понятной повесткой. Это может добавить ценности выступлению и повысить авторитет спикеру. Главное проговорить размер и количество таких бесплатных консультаций. 41 | 13. Читать вслух художествунную литературу и активно артикулировать верхней и нижней частью лица (верхняя и нижняя челюсть). 42 | 14. Перед выступлением стоит “прогреться” – рассказать кому ни будь историю, просто поговорить. Провести мини-презентацию. 43 | 44 | ## Упражнения для развития речи 45 | 1. Проговаривать вслух всё что видишь. Описывать объекты и людей. 46 | 2. Запись выступления на диктофон или видео. Потом просматривать и прослушивать, подмечать в каких ситуация начинается тупняк, запинание, экание и акание. Искать повторяющиеся паттерны. 47 | 3. Пересказ прочитанного текста. Исключать дробность речи. Не ставить точку после каждого слова, а лаконично говорить всё предложения повышая интонацию вверх к концу предложения или мысли. 48 | 4. Проговаривание звуков и букв с перестановкой. Перебираем: ИЭАОУЫИ. Произносим: КПТ(И); БГД(И); РТМ(И); КЧК(И); ВЗЛ(И)ВРТУ 49 | 5. Скороговорки – Сложные скороговорки для дикции 50 | 51 | ### Артикуляционная гимнастика 52 | Все упражнения делать не менее 10 повторений. 53 | Время разминки до 30 минут. 54 | 55 | #### Для губ, верхний и нижней части лица 56 | Расслабление через упражнение "Лошадка" – как лошадь выдуваешь воздух с расслабленными губами. 57 | 58 | 1. Уточка – улыбка – уточка – улыбка 59 | 2. Втягивание щёк 60 | 3. Попеременный оскал верхних и нижних зубов 61 | 4. Массаж губ прикусывая их нижними и верхними зубами 62 | 5. Вращение языком 360 градусов пытаясь достать самые крайние уголки рта – растягиваем мышцы языка 63 | 64 | Примеры этих и других упражнений на YouTube http://youtube.com/watch?v=XI1UwLLoKVA 65 | 66 | #### Для языка 67 | Расслабление через упражнение "Колокольчик" 68 | 69 | 1. Круговые движения языком перед и по зубам, по щекам 70 | 2. Язык попеременно упирается в щёки 71 | 3. Круговые движения за зубами 72 | 4. Тяги к ушам, подбородку, носу 73 | 5. Массаж языка зубами 74 | 6. Делаем язык в форме лопаты – трубочки 75 | 76 | Примеры этих и других упражнений на YouTube http://youtube.com/watch?v=wvTdKivTKZA 77 | 78 | ### Упражнения для голоса 79 | * Руки пульверизаторы и на Ф словно распыляем воду в оранжерее. Делать так не более 1 минуты, чтобы насытить организм кислородом 80 | * Плавно протянуть все гласные на одном выдохе 81 | * Петь Ом 82 | * Проговаривать одно и то же предложение, но в разных интонациях 83 | 84 | Примеры этих и других упражнений на YouTube http://youtube.com/watch?v=vzWgLkG-aXs 85 | -------------------------------------------------------------------------------- /docs/profession/onboarding/01-to-team.md: -------------------------------------------------------------------------------- 1 | # В команду 2 | Онбординг в команду помогает Деливери менеджеру быстрее понять контекст в котором находится выбранная команда, ее процессы, текущее состояние, потенциальные проблемы и точки роста. 3 | 4 | Одна из основных целей Деливери менеджера – построить End-to-End процесс поставки ценности. Реализация этой цели состоит из [двух групп задач](/profession/about.md#что-делает): управление изменениями и масштабируемость практик. План онбординга задает необходимый темп выполнения таких задач и помогает понять последовательность реализации. Все пункты выполнять не обязательно, план нужен только для самоконтроля. 5 | 6 | :::info Примечание 7 | Как настроить рабочее место, получить доступ в основные системы, познакомиться со структурой компании рассказали в [онбординге в компанию](to-company). 8 | ::: 9 | 10 | | Период | Задачи | Результат | 11 | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 12 | | Первый день |
  1. Познакомиться с командой
  2. Собрать основные артефакты работы команды
| | 13 | | Первая неделя |
  1. Проанализировать как построена работа в команде
  2. Встретиться с руководством и основными заказчиками
| | 14 | | Первый месяц |
  1. Провести встречи по командной рефлексии
  2. Составить бэклог проблем, их причин и последствий, если над ними не работать
  3. Оценить сложность решения проблем
  4. Приоритизировать бэклог проблем и гипотез по улучшению процессов
  5. Сформировать план изменений на основе выявленных проблем и презентовать его команде
  6. Запустить первые изменения
| | 15 | | Первые три месяца |
  1. Вовлечь участников изменений в процесс, поработать с сопротивлением
  2. Запустить базовые принципы и практики: визуализация, прозрачность, управление потоком
| | 16 | | Первые полгода |
  1. Завершить большинство запланированных изменений
  2. Планомерно настраивать в команде самостоятельную работу по постоянному эволюционному развитию
  3. Поощрять и поддерживать инициативу, лидерство и всё больше активностей проводить силами команды, а не своими
| | 17 | | Первый год |
  1. Довести команду до необходимого уровня зрелости и постараться перейти в консультационный режим, сконцентрировавшись на других более приоритетных задачах
  2. Собрать информацию об End-to-End процессе поставки ценности продукта, даже если он выходит за рамках команды/отдела/управления
  3. Составить и начать реализовывать план изменений нацеленный на весь End-to-End процесс
| | 18 | -------------------------------------------------------------------------------- /docs/profession/onboarding/02-to-company.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: В компанию 3 | --- 4 | 5 | # В компанию, отдел или бизнес-юнит 6 | Онбординг в компанию нужен чтобы понять как выглядит организационная и управленческая структура, какие есть корпоративные нормы и правила. Возможно есть ежемесячные, ежеквартальные или годовые активности, о которых Деливери менеджеру будет полезно знать и принимать в них участие. 7 | 8 | **Бизнес-юнитом** может быть вся компания компания, продукт целиком, какая-то его функциональность, отдел или команда. 9 | 10 | **В первые дни в новой компании нужно:** 11 | * Получить необходимое оборудование, если компания его предоставляет. 12 | * Получить доступы к ресурсам первой необходимости: корпоративный портал, локальная сеть, система ведения задач (Jira, Kaiten, Redmine, Asana и другие), пространства ведения документации (Confluence, MS Teams, Notion и другие). 13 | * Пройти обязательные курсы техники пожарной и информационной безопасности, подписать все необходимые документы. 14 | 15 | | Период | Задачи | Результат | 16 | |------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 17 | | Первые две недели |
  1. Познакомиться с руководителем и узнать его ожидания от работы Деливери менеджера
  2. Установить плагины и расширения для анализа процессов: Jira Helper, Jira Flow Companion, Scope360° и другие
| | 18 | | Первый месяц |
  1. Узнать цели компании на ближайший год или несколько лет
  2. Узнать цели своего руководителя, его заместителей, команд с которым вам предстоит работать и их тимлидов
  3. Узнать цели бизнеса и ИТ на ближайших год или несколько лет
  4. Проанализировать запрос руководителя
  5. Провести собственный анализ текущего состояния компании и процессов в ней
  6. Изучить документацию продуктов и систем с которыми предстоит работать
  7. Разобраться в постоянных встречах в компании и попросить коллег добавить вас на них: ежемесячное общее планирование, ежеквартальные отчеты о бизнес-метриках и проделанной работе с планам на следующий квартал, стратегические сессии и т.д.
  8. Составить свой план работы над процессами на ближайшие 3 месяца на основе запроса от руководителя, целей компании и бизнеса, результатов своего анализа текущего состояния компании и процессов
| | 19 | | Первые три месяца |
  1. Подготовить презентацию о проделанной работе за три месяца: какие проблемы обнаружились, какие улучшения были сделаны или начаты, метрики, достигнутые результаты, планы на будущее
  2. Подготовить бэклог точек роста или проблем в компании, командах, процессах, которые были замечены за первые три месяца
| | 20 | -------------------------------------------------------------------------------- /src/theme/SearchBar/lib/utils.js: -------------------------------------------------------------------------------- 1 | import $ from "autocomplete.js/zepto"; 2 | 3 | const utils = { 4 | /* 5 | * Move the content of an object key one level higher. 6 | * eg. 7 | * { 8 | * name: 'My name', 9 | * hierarchy: { 10 | * lvl0: 'Foo', 11 | * lvl1: 'Bar' 12 | * } 13 | * } 14 | * Will be converted to 15 | * { 16 | * name: 'My name', 17 | * lvl0: 'Foo', 18 | * lvl1: 'Bar' 19 | * } 20 | * @param {Object} object Main object 21 | * @param {String} property Main object key to move up 22 | * @return {Object} 23 | * @throws Error when key is not an attribute of Object or is not an object itself 24 | */ 25 | mergeKeyWithParent(object, property) { 26 | if (object[property] === undefined) { 27 | return object; 28 | } 29 | if (typeof object[property] !== 'object') { 30 | return object; 31 | } 32 | const newObject = $.extend({}, object, object[property]); 33 | delete newObject[property]; 34 | return newObject; 35 | }, 36 | /* 37 | * Group all objects of a collection by the value of the specified attribute 38 | * If the attribute is a string, use the lowercase form. 39 | * 40 | * eg. 41 | * groupBy([ 42 | * {name: 'Tim', category: 'dev'}, 43 | * {name: 'Vincent', category: 'dev'}, 44 | * {name: 'Ben', category: 'sales'}, 45 | * {name: 'Jeremy', category: 'sales'}, 46 | * {name: 'AlexS', category: 'dev'}, 47 | * {name: 'AlexK', category: 'sales'} 48 | * ], 'category'); 49 | * => 50 | * { 51 | * 'devs': [ 52 | * {name: 'Tim', category: 'dev'}, 53 | * {name: 'Vincent', category: 'dev'}, 54 | * {name: 'AlexS', category: 'dev'} 55 | * ], 56 | * 'sales': [ 57 | * {name: 'Ben', category: 'sales'}, 58 | * {name: 'Jeremy', category: 'sales'}, 59 | * {name: 'AlexK', category: 'sales'} 60 | * ] 61 | * } 62 | * @param {array} collection Array of objects to group 63 | * @param {String} property The attribute on which apply the grouping 64 | * @return {array} 65 | * @throws Error when one of the element does not have the specified property 66 | */ 67 | groupBy(collection, property) { 68 | const newCollection = {}; 69 | $.each(collection, (index, item) => { 70 | if (item[property] === undefined) { 71 | throw new Error(`[groupBy]: Object has no key ${property}`); 72 | } 73 | let key = item[property]; 74 | if (typeof key === 'string') { 75 | key = key.toLowerCase(); 76 | } 77 | // fix #171 the given data type of docsearch hits might be conflict with the properties of the native Object, 78 | // such as the constructor, so we need to do this check. 79 | if (!Object.prototype.hasOwnProperty.call(newCollection, key)) { 80 | newCollection[key] = []; 81 | } 82 | newCollection[key].push(item); 83 | }); 84 | return newCollection; 85 | }, 86 | /* 87 | * Return an array of all the values of the specified object 88 | * eg. 89 | * values({ 90 | * foo: 42, 91 | * bar: true, 92 | * baz: 'yep' 93 | * }) 94 | * => 95 | * [42, true, yep] 96 | * @param {object} object Object to extract values from 97 | * @return {array} 98 | */ 99 | values(object) { 100 | return Object.keys(object).map(key => object[key]); 101 | }, 102 | /* 103 | * Flattens an array 104 | * eg. 105 | * flatten([1, 2, [3, 4], [5, 6]]) 106 | * => 107 | * [1, 2, 3, 4, 5, 6] 108 | * @param {array} array Array to flatten 109 | * @return {array} 110 | */ 111 | flatten(array) { 112 | const results = []; 113 | array.forEach(value => { 114 | if (!Array.isArray(value)) { 115 | results.push(value); 116 | return; 117 | } 118 | value.forEach(subvalue => { 119 | results.push(subvalue); 120 | }); 121 | }); 122 | return results; 123 | }, 124 | /* 125 | * Flatten all values of an object into an array, marking each first element of 126 | * each group with a specific flag 127 | * eg. 128 | * flattenAndFlagFirst({ 129 | * 'devs': [ 130 | * {name: 'Tim', category: 'dev'}, 131 | * {name: 'Vincent', category: 'dev'}, 132 | * {name: 'AlexS', category: 'dev'} 133 | * ], 134 | * 'sales': [ 135 | * {name: 'Ben', category: 'sales'}, 136 | * {name: 'Jeremy', category: 'sales'}, 137 | * {name: 'AlexK', category: 'sales'} 138 | * ] 139 | * , 'isTop'); 140 | * => 141 | * [ 142 | * {name: 'Tim', category: 'dev', isTop: true}, 143 | * {name: 'Vincent', category: 'dev', isTop: false}, 144 | * {name: 'AlexS', category: 'dev', isTop: false}, 145 | * {name: 'Ben', category: 'sales', isTop: true}, 146 | * {name: 'Jeremy', category: 'sales', isTop: false}, 147 | * {name: 'AlexK', category: 'sales', isTop: false} 148 | * ] 149 | * @param {object} object Object to flatten 150 | * @param {string} flag Flag to set to true on first element of each group 151 | * @return {array} 152 | */ 153 | flattenAndFlagFirst(object, flag) { 154 | const values = this.values(object).map(collection => 155 | collection.map((item, index) => { 156 | // eslint-disable-next-line no-param-reassign 157 | item[flag] = index === 0; 158 | return item; 159 | }) 160 | ); 161 | return this.flatten(values); 162 | }, 163 | /* 164 | * Removes all empty strings, null, false and undefined elements array 165 | * eg. 166 | * compact([42, false, null, undefined, '', [], 'foo']); 167 | * => 168 | * [42, [], 'foo'] 169 | * @param {array} array Array to compact 170 | * @return {array} 171 | */ 172 | compact(array) { 173 | const results = []; 174 | array.forEach(value => { 175 | if (!value) { 176 | return; 177 | } 178 | results.push(value); 179 | }); 180 | return results; 181 | }, 182 | /* 183 | * Returns the highlighted value of the specified key in the specified object. 184 | * If no highlighted value is available, will return the key value directly 185 | * eg. 186 | * getHighlightedValue({ 187 | * _highlightResult: { 188 | * text: { 189 | * value: 'foo' 190 | * } 191 | * }, 192 | * text: 'foo' 193 | * }, 'text'); 194 | * => 195 | * 'foo' 196 | * @param {object} object Hit object returned by the Algolia API 197 | * @param {string} property Object key to look for 198 | * @return {string} 199 | **/ 200 | getHighlightedValue(object, property) { 201 | if ( 202 | object._highlightResult && 203 | object._highlightResult.hierarchy_camel && 204 | object._highlightResult.hierarchy_camel[property] && 205 | object._highlightResult.hierarchy_camel[property].matchLevel && 206 | object._highlightResult.hierarchy_camel[property].matchLevel !== 'none' && 207 | object._highlightResult.hierarchy_camel[property].value 208 | ) { 209 | return object._highlightResult.hierarchy_camel[property].value; 210 | } 211 | if ( 212 | object._highlightResult && 213 | object._highlightResult && 214 | object._highlightResult[property] && 215 | object._highlightResult[property].value 216 | ) { 217 | return object._highlightResult[property].value; 218 | } 219 | return object[property]; 220 | }, 221 | /* 222 | * Returns the snippeted value of the specified key in the specified object. 223 | * If no highlighted value is available, will return the key value directly. 224 | * Will add starting and ending ellipsis (…) if we detect that a sentence is 225 | * incomplete 226 | * eg. 227 | * getSnippetedValue({ 228 | * _snippetResult: { 229 | * text: { 230 | * value: 'This is an unfinished sentence' 231 | * } 232 | * }, 233 | * text: 'This is an unfinished sentence' 234 | * }, 'text'); 235 | * => 236 | * 'This is an unfinished sentence…' 237 | * @param {object} object Hit object returned by the Algolia API 238 | * @param {string} property Object key to look for 239 | * @return {string} 240 | **/ 241 | getSnippetedValue(object, property) { 242 | if ( 243 | !object._snippetResult || 244 | !object._snippetResult[property] || 245 | !object._snippetResult[property].value 246 | ) { 247 | return object[property]; 248 | } 249 | let snippet = object._snippetResult[property].value; 250 | 251 | if (snippet[0] !== snippet[0].toUpperCase()) { 252 | snippet = `…${snippet}`; 253 | } 254 | if (['.', '!', '?'].indexOf(snippet[snippet.length - 1]) === -1) { 255 | snippet = `${snippet}…`; 256 | } 257 | return snippet; 258 | }, 259 | /* 260 | * Deep clone an object. 261 | * Note: This will not clone functions and dates 262 | * @param {object} object Object to clone 263 | * @return {object} 264 | */ 265 | deepClone(object) { 266 | return JSON.parse(JSON.stringify(object)); 267 | }, 268 | }; 269 | 270 | export default utils; 271 | -------------------------------------------------------------------------------- /src/theme/SearchBar/utils.js: -------------------------------------------------------------------------------- 1 | import $ from "autocomplete.js/zepto"; 2 | 3 | const utils = { 4 | /* 5 | * Move the content of an object key one level higher. 6 | * eg. 7 | * { 8 | * name: 'My name', 9 | * hierarchy: { 10 | * lvl0: 'Foo', 11 | * lvl1: 'Bar' 12 | * } 13 | * } 14 | * Will be converted to 15 | * { 16 | * name: 'My name', 17 | * lvl0: 'Foo', 18 | * lvl1: 'Bar' 19 | * } 20 | * @param {Object} object Main object 21 | * @param {String} property Main object key to move up 22 | * @return {Object} 23 | * @throws Error when key is not an attribute of Object or is not an object itself 24 | */ 25 | mergeKeyWithParent(object, property) { 26 | if (object[property] === undefined) { 27 | return object; 28 | } 29 | if (typeof object[property] !== 'object') { 30 | return object; 31 | } 32 | const newObject = $.extend({}, object, object[property]); 33 | delete newObject[property]; 34 | return newObject; 35 | }, 36 | /* 37 | * Group all objects of a collection by the value of the specified attribute 38 | * If the attribute is a string, use the lowercase form. 39 | * 40 | * eg. 41 | * groupBy([ 42 | * {name: 'Tim', category: 'dev'}, 43 | * {name: 'Vincent', category: 'dev'}, 44 | * {name: 'Ben', category: 'sales'}, 45 | * {name: 'Jeremy', category: 'sales'}, 46 | * {name: 'AlexS', category: 'dev'}, 47 | * {name: 'AlexK', category: 'sales'} 48 | * ], 'category'); 49 | * => 50 | * { 51 | * 'devs': [ 52 | * {name: 'Tim', category: 'dev'}, 53 | * {name: 'Vincent', category: 'dev'}, 54 | * {name: 'AlexS', category: 'dev'} 55 | * ], 56 | * 'sales': [ 57 | * {name: 'Ben', category: 'sales'}, 58 | * {name: 'Jeremy', category: 'sales'}, 59 | * {name: 'AlexK', category: 'sales'} 60 | * ] 61 | * } 62 | * @param {array} collection Array of objects to group 63 | * @param {String} property The attribute on which apply the grouping 64 | * @return {array} 65 | * @throws Error when one of the element does not have the specified property 66 | */ 67 | groupBy(collection, property) { 68 | const newCollection = {}; 69 | $.each(collection, (index, item) => { 70 | if (item[property] === undefined) { 71 | throw new Error(`[groupBy]: Object has no key ${property}`); 72 | } 73 | let key = item[property]; 74 | if (typeof key === 'string') { 75 | key = key.toLowerCase(); 76 | } 77 | // fix #171 the given data type of docsearch hits might be conflict with the properties of the native Object, 78 | // such as the constructor, so we need to do this check. 79 | if (!Object.prototype.hasOwnProperty.call(newCollection, key)) { 80 | newCollection[key] = []; 81 | } 82 | newCollection[key].push(item); 83 | }); 84 | return newCollection; 85 | }, 86 | /* 87 | * Return an array of all the values of the specified object 88 | * eg. 89 | * values({ 90 | * foo: 42, 91 | * bar: true, 92 | * baz: 'yep' 93 | * }) 94 | * => 95 | * [42, true, yep] 96 | * @param {object} object Object to extract values from 97 | * @return {array} 98 | */ 99 | values(object) { 100 | return Object.keys(object).map(key => object[key]); 101 | }, 102 | /* 103 | * Flattens an array 104 | * eg. 105 | * flatten([1, 2, [3, 4], [5, 6]]) 106 | * => 107 | * [1, 2, 3, 4, 5, 6] 108 | * @param {array} array Array to flatten 109 | * @return {array} 110 | */ 111 | flatten(array) { 112 | const results = []; 113 | array.forEach(value => { 114 | if (!Array.isArray(value)) { 115 | results.push(value); 116 | return; 117 | } 118 | value.forEach(subvalue => { 119 | results.push(subvalue); 120 | }); 121 | }); 122 | return results; 123 | }, 124 | /* 125 | * Flatten all values of an object into an array, marking each first element of 126 | * each group with a specific flag 127 | * eg. 128 | * flattenAndFlagFirst({ 129 | * 'devs': [ 130 | * {name: 'Tim', category: 'dev'}, 131 | * {name: 'Vincent', category: 'dev'}, 132 | * {name: 'AlexS', category: 'dev'} 133 | * ], 134 | * 'sales': [ 135 | * {name: 'Ben', category: 'sales'}, 136 | * {name: 'Jeremy', category: 'sales'}, 137 | * {name: 'AlexK', category: 'sales'} 138 | * ] 139 | * , 'isTop'); 140 | * => 141 | * [ 142 | * {name: 'Tim', category: 'dev', isTop: true}, 143 | * {name: 'Vincent', category: 'dev', isTop: false}, 144 | * {name: 'AlexS', category: 'dev', isTop: false}, 145 | * {name: 'Ben', category: 'sales', isTop: true}, 146 | * {name: 'Jeremy', category: 'sales', isTop: false}, 147 | * {name: 'AlexK', category: 'sales', isTop: false} 148 | * ] 149 | * @param {object} object Object to flatten 150 | * @param {string} flag Flag to set to true on first element of each group 151 | * @return {array} 152 | */ 153 | flattenAndFlagFirst(object, flag) { 154 | const values = this.values(object).map(collection => 155 | collection.map((item, index) => { 156 | // eslint-disable-next-line no-param-reassign 157 | item[flag] = index === 0; 158 | return item; 159 | }) 160 | ); 161 | return this.flatten(values); 162 | }, 163 | /* 164 | * Removes all empty strings, null, false and undefined elements array 165 | * eg. 166 | * compact([42, false, null, undefined, '', [], 'foo']); 167 | * => 168 | * [42, [], 'foo'] 169 | * @param {array} array Array to compact 170 | * @return {array} 171 | */ 172 | compact(array) { 173 | const results = []; 174 | array.forEach(value => { 175 | if (!value) { 176 | return; 177 | } 178 | results.push(value); 179 | }); 180 | return results; 181 | }, 182 | /* 183 | * Returns the highlighted value of the specified key in the specified object. 184 | * If no highlighted value is available, will return the key value directly 185 | * eg. 186 | * getHighlightedValue({ 187 | * _highlightResult: { 188 | * text: { 189 | * value: 'foo' 190 | * } 191 | * }, 192 | * text: 'foo' 193 | * }, 'text'); 194 | * => 195 | * 'foo' 196 | * @param {object} object Hit object returned by the Algolia API 197 | * @param {string} property Object key to look for 198 | * @return {string} 199 | **/ 200 | getHighlightedValue(object, property) { 201 | if ( 202 | object._highlightResult && 203 | object._highlightResult.hierarchy_camel && 204 | object._highlightResult.hierarchy_camel[property] && 205 | object._highlightResult.hierarchy_camel[property].matchLevel && 206 | object._highlightResult.hierarchy_camel[property].matchLevel !== 'none' && 207 | object._highlightResult.hierarchy_camel[property].value 208 | ) { 209 | return object._highlightResult.hierarchy_camel[property].value; 210 | } 211 | if ( 212 | object._highlightResult && 213 | object._highlightResult && 214 | object._highlightResult[property] && 215 | object._highlightResult[property].value 216 | ) { 217 | return object._highlightResult[property].value; 218 | } 219 | return object[property]; 220 | }, 221 | /* 222 | * Returns the snippeted value of the specified key in the specified object. 223 | * If no highlighted value is available, will return the key value directly. 224 | * Will add starting and ending ellipsis (…) if we detect that a sentence is 225 | * incomplete 226 | * eg. 227 | * getSnippetedValue({ 228 | * _snippetResult: { 229 | * text: { 230 | * value: 'This is an unfinished sentence' 231 | * } 232 | * }, 233 | * text: 'This is an unfinished sentence' 234 | * }, 'text'); 235 | * => 236 | * 'This is an unfinished sentence…' 237 | * @param {object} object Hit object returned by the Algolia API 238 | * @param {string} property Object key to look for 239 | * @return {string} 240 | **/ 241 | getSnippetedValue(object, property) { 242 | if ( 243 | !object._snippetResult || 244 | !object._snippetResult[property] || 245 | !object._snippetResult[property].value 246 | ) { 247 | return object[property]; 248 | } 249 | let snippet = object._snippetResult[property].value; 250 | 251 | if (snippet[0] !== snippet[0].toUpperCase()) { 252 | snippet = `…${snippet}`; 253 | } 254 | if (['.', '!', '?'].indexOf(snippet[snippet.length - 1]) === -1) { 255 | snippet = `${snippet}…`; 256 | } 257 | return snippet; 258 | }, 259 | /* 260 | * Deep clone an object. 261 | * Note: This will not clone functions and dates 262 | * @param {object} object Object to clone 263 | * @return {object} 264 | */ 265 | deepClone(object) { 266 | return JSON.parse(JSON.stringify(object)); 267 | }, 268 | }; 269 | 270 | export default utils; 271 | -------------------------------------------------------------------------------- /docs/profession/competencies/grades.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide_table_of_contents: true 3 | --- 4 | 5 | # Грейды 6 | 7 | ## Описание 8 |
9 | 10 | | Грейд | Чем занимается | 11 | |---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 12 | | Junior | | 13 | | Junior+ | Улучшает процессы в средних командах, самостоятельно решает до 80% внутрикомандных проблем и до 50% вопросов кросс-командных взаимодействий | 14 | | Middle | | 15 | | Middle+ | | 16 | | Senior | Улучшает сквозную доставку больших или сложных продуктов во всей области, до которой возможно дотянуться | 17 | | Lead | | 18 | 19 |
20 | 21 | ## Матрица 22 | 23 | :::caution 24 | Каждый следующий грейд включает в себя компетенции предыдущего 25 | ::: 26 | 27 | | Грейд | Junior | Junior+ | Middle | Middle+ | Senior | Lead | 28 | |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| 29 | | **Ответственность**
Количество людей, за чей результат или процесс работы ответственность на Деливери менеджере |

≈ 20+

Работа внутри команды разработки
ex: 1-2 команды разработки |

≈ 35+

+ зависимости между командами
ex: 3-4 команды разработки |

≈ 55+

+ бизнес
ex: отдел разработки + менеджеры продукта / заказчики |

≈ 75+

+ зависимые команды
ex: платформенные сервисы и запросы поддержки |

≈ 90+

Реализовывает решения через приемников (тимлиды / руководители отделов /групп)
ex: End-to-End поставка ценности |

≈ 150+

Реализовывает решения через приемников (тимлиды / руководители отделов /групп) и других деливери-менеджеров
ex: редизайн бизнес-линии | 30 | | **Сложность/объем**
1 - сравнительно независимая команда разработки
2 - синхронизация команд (ИТ и бизнес) по зависимостям или команд внутри платформы
3 - консультирование или коучинг
4 - редизайн команд | 1 | 1 → 2 | 2 | 2 → 3 | 3, 4 | 4 | 31 | | **Зона влияния (рекомендаций)**
Количество людей, на работу которых оказывают влияние предложенные и реализованные Деливери менеджером решения |

≈ 30+

Команды-разработки |

≈ 50+

+ бизнес и заказчики |

≈ 70+

+ бизнес и заказчики |

≈ 100+

+ платформы и поддержка |

≈ 140+

+ заинтересованные подразделения |

Не ограничена

+ руководители высшего звена | 32 | | **Числовые метрики**
На какие метрики решения Деливери менеджера оказывают влияние | + метрики, отражающие результат работы с bottleneck | → Middle | | → Senior | End-to-End Time to Market | Доп. запрос от СТО / СРО | 33 | | **Результат**
Кто дает обратную связь по итогам работы | + ментор (ex: Senior/ Lead DM) | + ментор (ex: Senior/ Lead DM) | + руководитель отдела | | | | 34 | | **Самостоятельность** | Получает задачу с шагами
Нужна поддержка в генерации решения | Получает задачу с шагами
Нужна валидация решения | Получает цель (высокая степень конкретики)
Нужна валидация решения | Получает запрос (низкая степень конкретики)
Нужна валидация решения | Получает запрос (низкая степень конкретики)
Синхронизация решения со стратегией | Получает запрос (низкая степень конкретики)
Формирует стратегию | 35 | | **Обучение** | Практики уровня команды и Delivery-цикла
Продажа локальных изменений
Фасилитация небольших групп | → Middle | Кросс-командные практики + синхронизация с бизнесом (практики Discovery) | Фасилитация больших групп | Фреймворки масштабирования
Продажа длительных или многоступенчатых изменений | Организационный (ре-)дизайн | 36 | | **Комьюнити** | Чем выше грейд, тем больше участия и ответственности за проекты внутри профессии | 37 | -------------------------------------------------------------------------------- /versioned_docs/version-0.0.1/profession/competencies/grades.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide_table_of_contents: true 3 | --- 4 | 5 | # Грейды 6 | 7 | ## Описание 8 |
9 | 10 | | Грейд | Ответственность за результат | 11 | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 12 | | Junior | | 13 | | Junior+ | Я улучшаю процессы в средних командах, самостоятельно решаю ±80% внутрикомандных проблем, и ±50% в кросс-командных взаимодействиях | 14 | | Middle | | 15 | | Middle+ | | 16 | | Senior | Для продукта/value stream бизнеса я улучшаю сквозную доставку больших/сложных продуктов во всей области до которой возможно дотянуться | 17 | | Lead | По запросу бизнеса/CTO, используя широкий менеджерский опыт, я улучшаю прогнозируемость поставки, увеличиваю ее скорость для всех продуктов/платформ работая с группами команды, в т.ч. не относящиеся к моему управлению | 18 | 19 |
20 | 21 | ## Матрица 22 | 23 | :::caution 24 | Каждый последующий грейд включает в себя наличие компетенций и навыков для работы с задачами/масштабами предыдущих грейдов 25 | ::: 26 | 27 | | Грейд | Junior
(только переход) | Junior+
(найм с этого уровня) | Middle | Middle+ | Senior | Lead | 28 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| 29 | | **Ответственность**
кол-во людей, за чей результат / процесс работы, по предложенным и реализованным DM-м решениям, DM ответственен | ≈ 20+
решения внутри команды-разработки
ex: 1-2 команды разработки | ≈ 35+
+ зависимости между командами
ex: 3-4 команды разработки | ≈ 55+
+ технологи
ex: отдел разработки + технологи / заказчики | ≈ 75+
+ зависимые команды
ex: + платформенные сервисы / + запросы поддержки | ≈ 90+
реализовывает решения через приемников (тимлиды / руководители отделов /групп)
ex: end-to-end поставка ценности | ≈ 150+
реализовывает решения через приемников (тимлиды / руководители отделов /групп) и других DM-в
ex: редизайн бизнес-линии | 30 | | **Сложность/объем**
1 - сравнительно независимая команда разработки
2 - синхронизация команд (ИТ и Бизнес) по зависимостям или команд внутри платформы
3 - консультирование или коучинг
4 - редизайн команд | 1 | 1 → 2 | 2 | 2 → 3 | 3, 4 | 4 | 31 | | **Зона влияния (рекомендаций)**
кол-во людей, на результат / процесс работы которых предложенные и реализованные DM-м решения оказывают влияние | ≈ 30+
команды-разработки | ≈ 50+
+ бизнес / заказчики | ≈ 70+
+ бизнес / заказчики | ≈ 100+
+ платформы / + поддержка | ≈ 140+
+ заинтересованные подразделения | Не ограничена
+ руководители высшего звена | 32 | | **Числовые метрики**
на какие метрики решения DM-а оказывают влияние | | → Middle | | → Senior | End-to-End Time to Market | Доп. запрос от СТО / СРО | 33 | | **Результат**
кто дает обратную связь по итогам работы | | | | | | | 34 | | **Самостоятельность** | Получает задачу с шагами
Нужна поддержка в генерации решения | Получает задачу с шагами
Нужна валидация решения | Получает цель (высокая степень конкретики)
Нужна валидация решения | Получает запрос (низкая степень конкретики)
Нужна валидация решения | Получает запрос (низкая степень конкретики)
Синхронизация решения со стратегией | Получает запрос (низкая степень конкретики)
Формирует стратегию | 35 | | **Обучение** | Практики уровня команды и Delivery-цикла
Продажа локальных изменений
Фасилитация небольших групп | → Middle | Кросс-командные практики + синхронизация с бизнесом (практики Discovery) | Фасилитация больших групп | Фреймворки масштабирования
Продажа длительных/ многоступенчатых изменений | Организационный (ре-)дизайн | 36 | | **Комьюнити** | Выше грейд – больше участия и ответственности за проекты внутри профессии | 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/theme/SearchBar/DocSearch.js: -------------------------------------------------------------------------------- 1 | import Hogan from "hogan.js"; 2 | import LunrSearchAdapter from "./lunar-search"; 3 | import autocomplete from "autocomplete.js"; 4 | import templates from "./templates"; 5 | import utils from "./utils"; 6 | import $ from "autocomplete.js/zepto"; 7 | 8 | class DocSearch { 9 | constructor({ 10 | searchDocs, 11 | searchIndex, 12 | inputSelector, 13 | debug = false, 14 | baseUrl = '/', 15 | queryDataCallback = null, 16 | autocompleteOptions = { 17 | debug: false, 18 | hint: false, 19 | autoselect: true 20 | }, 21 | transformData = false, 22 | queryHook = false, 23 | handleSelected = false, 24 | enhancedSearchInput = false, 25 | layout = "collumns" 26 | }) { 27 | this.input = DocSearch.getInputFromSelector(inputSelector); 28 | this.queryDataCallback = queryDataCallback || null; 29 | const autocompleteOptionsDebug = 30 | autocompleteOptions && autocompleteOptions.debug 31 | ? autocompleteOptions.debug 32 | : false; 33 | // eslint-disable-next-line no-param-reassign 34 | autocompleteOptions.debug = debug || autocompleteOptionsDebug; 35 | this.autocompleteOptions = autocompleteOptions; 36 | this.autocompleteOptions.cssClasses = 37 | this.autocompleteOptions.cssClasses || {}; 38 | this.autocompleteOptions.cssClasses.prefix = 39 | this.autocompleteOptions.cssClasses.prefix || "ds"; 40 | const inputAriaLabel = 41 | this.input && 42 | typeof this.input.attr === "function" && 43 | this.input.attr("aria-label"); 44 | this.autocompleteOptions.ariaLabel = 45 | this.autocompleteOptions.ariaLabel || inputAriaLabel || "search input"; 46 | 47 | this.isSimpleLayout = layout === "simple"; 48 | 49 | this.client = new LunrSearchAdapter(searchDocs, searchIndex, baseUrl); 50 | 51 | if (enhancedSearchInput) { 52 | this.input = DocSearch.injectSearchBox(this.input); 53 | } 54 | this.autocomplete = autocomplete(this.input, autocompleteOptions, [ 55 | { 56 | source: this.getAutocompleteSource(transformData, queryHook), 57 | templates: { 58 | suggestion: DocSearch.getSuggestionTemplate(this.isSimpleLayout), 59 | footer: templates.footer, 60 | empty: DocSearch.getEmptyTemplate() 61 | } 62 | } 63 | ]); 64 | 65 | const customHandleSelected = handleSelected; 66 | this.handleSelected = customHandleSelected || this.handleSelected; 67 | 68 | // We prevent default link clicking if a custom handleSelected is defined 69 | if (customHandleSelected) { 70 | $(".algolia-autocomplete").on("click", ".ds-suggestions a", event => { 71 | event.preventDefault(); 72 | }); 73 | } 74 | 75 | this.autocomplete.on( 76 | "autocomplete:selected", 77 | this.handleSelected.bind(null, this.autocomplete.autocomplete) 78 | ); 79 | 80 | this.autocomplete.on( 81 | "autocomplete:shown", 82 | this.handleShown.bind(null, this.input) 83 | ); 84 | 85 | if (enhancedSearchInput) { 86 | DocSearch.bindSearchBoxEvent(); 87 | } 88 | } 89 | 90 | static injectSearchBox(input) { 91 | input.before(templates.searchBox); 92 | const newInput = input 93 | .prev() 94 | .prev() 95 | .find("input"); 96 | input.remove(); 97 | return newInput; 98 | } 99 | 100 | static bindSearchBoxEvent() { 101 | $('.searchbox [type="reset"]').on("click", function () { 102 | $("input#docsearch").focus(); 103 | $(this).addClass("hide"); 104 | autocomplete.autocomplete.setVal(""); 105 | }); 106 | 107 | $("input#docsearch").on("keyup", () => { 108 | const searchbox = document.querySelector("input#docsearch"); 109 | const reset = document.querySelector('.searchbox [type="reset"]'); 110 | reset.className = "searchbox__reset"; 111 | if (searchbox.value.length === 0) { 112 | reset.className += " hide"; 113 | } 114 | }); 115 | } 116 | 117 | /** 118 | * Returns the matching input from a CSS selector, null if none matches 119 | * @function getInputFromSelector 120 | * @param {string} selector CSS selector that matches the search 121 | * input of the page 122 | * @returns {void} 123 | */ 124 | static getInputFromSelector(selector) { 125 | const input = $(selector).filter("input"); 126 | return input.length ? $(input[0]) : null; 127 | } 128 | 129 | /** 130 | * Returns the `source` method to be passed to autocomplete.js. It will query 131 | * the Algolia index and call the callbacks with the formatted hits. 132 | * @function getAutocompleteSource 133 | * @param {function} transformData An optional function to transform the hits 134 | * @param {function} queryHook An optional function to transform the query 135 | * @returns {function} Method to be passed as the `source` option of 136 | * autocomplete 137 | */ 138 | getAutocompleteSource(transformData, queryHook) { 139 | return (query, callback) => { 140 | if (queryHook) { 141 | // eslint-disable-next-line no-param-reassign 142 | query = queryHook(query) || query; 143 | } 144 | this.client.search(query).then(hits => { 145 | if ( 146 | this.queryDataCallback && 147 | typeof this.queryDataCallback == "function" 148 | ) { 149 | this.queryDataCallback(hits); 150 | } 151 | if (transformData) { 152 | hits = transformData(hits) || hits; 153 | } 154 | callback(DocSearch.formatHits(hits)); 155 | }); 156 | }; 157 | } 158 | 159 | // Given a list of hits returned by the API, will reformat them to be used in 160 | // a Hogan template 161 | static formatHits(receivedHits) { 162 | const clonedHits = utils.deepClone(receivedHits); 163 | const hits = clonedHits.map(hit => { 164 | if (hit._highlightResult) { 165 | // eslint-disable-next-line no-param-reassign 166 | hit._highlightResult = utils.mergeKeyWithParent( 167 | hit._highlightResult, 168 | "hierarchy" 169 | ); 170 | } 171 | return utils.mergeKeyWithParent(hit, "hierarchy"); 172 | }); 173 | 174 | // Group hits by category / subcategory 175 | let groupedHits = utils.groupBy(hits, "lvl0"); 176 | $.each(groupedHits, (level, collection) => { 177 | const groupedHitsByLvl1 = utils.groupBy(collection, "lvl1"); 178 | const flattenedHits = utils.flattenAndFlagFirst( 179 | groupedHitsByLvl1, 180 | "isSubCategoryHeader" 181 | ); 182 | groupedHits[level] = flattenedHits; 183 | }); 184 | groupedHits = utils.flattenAndFlagFirst(groupedHits, "isCategoryHeader"); 185 | 186 | // Translate hits into smaller objects to be send to the template 187 | return groupedHits.map(hit => { 188 | const url = DocSearch.formatURL(hit); 189 | const category = utils.getHighlightedValue(hit, "lvl0"); 190 | const subcategory = utils.getHighlightedValue(hit, "lvl1") || category; 191 | const displayTitle = utils 192 | .compact([ 193 | utils.getHighlightedValue(hit, "lvl2") || subcategory, 194 | utils.getHighlightedValue(hit, "lvl3"), 195 | utils.getHighlightedValue(hit, "lvl4"), 196 | utils.getHighlightedValue(hit, "lvl5"), 197 | utils.getHighlightedValue(hit, "lvl6") 198 | ]) 199 | .join( 200 | '' 201 | ); 202 | const text = utils.getSnippetedValue(hit, "content"); 203 | const isTextOrSubcategoryNonEmpty = 204 | (subcategory && subcategory !== "") || 205 | (displayTitle && displayTitle !== ""); 206 | const isLvl1EmptyOrDuplicate = 207 | !subcategory || subcategory === "" || subcategory === category; 208 | const isLvl2 = 209 | displayTitle && displayTitle !== "" && displayTitle !== subcategory; 210 | const isLvl1 = 211 | !isLvl2 && 212 | (subcategory && subcategory !== "" && subcategory !== category); 213 | const isLvl0 = !isLvl1 && !isLvl2; 214 | 215 | return { 216 | isLvl0, 217 | isLvl1, 218 | isLvl2, 219 | isLvl1EmptyOrDuplicate, 220 | isCategoryHeader: hit.isCategoryHeader, 221 | isSubCategoryHeader: hit.isSubCategoryHeader, 222 | isTextOrSubcategoryNonEmpty, 223 | category, 224 | subcategory, 225 | title: displayTitle, 226 | text, 227 | url 228 | }; 229 | }); 230 | } 231 | 232 | static formatURL(hit) { 233 | const { url, anchor } = hit; 234 | if (url) { 235 | const containsAnchor = url.indexOf("#") !== -1; 236 | if (containsAnchor) return url; 237 | else if (anchor) return `${hit.url}#${hit.anchor}`; 238 | return url; 239 | } else if (anchor) return `#${hit.anchor}`; 240 | /* eslint-disable */ 241 | console.warn("no anchor nor url for : ", JSON.stringify(hit)); 242 | /* eslint-enable */ 243 | return null; 244 | } 245 | 246 | static getEmptyTemplate() { 247 | return args => Hogan.compile(templates.empty).render(args); 248 | } 249 | 250 | static getSuggestionTemplate(isSimpleLayout) { 251 | const stringTemplate = isSimpleLayout 252 | ? templates.suggestionSimple 253 | : templates.suggestion; 254 | const template = Hogan.compile(stringTemplate); 255 | return suggestion => template.render(suggestion); 256 | } 257 | 258 | handleSelected(input, event, suggestion, datasetNumber, context = {}) { 259 | // Do nothing if click on the suggestion, as it's already a , the 260 | // browser will take care of it. This allow Ctrl-Clicking on results and not 261 | // having the main window being redirected as well 262 | if (context.selectionMethod === "click") { 263 | return; 264 | } 265 | 266 | input.setVal(""); 267 | window.location.assign(suggestion.url); 268 | } 269 | 270 | handleShown(input) { 271 | const middleOfInput = input.offset().left + input.width() / 2; 272 | let middleOfWindow = $(document).width() / 2; 273 | 274 | if (isNaN(middleOfWindow)) { 275 | middleOfWindow = 900; 276 | } 277 | 278 | const alignClass = 279 | middleOfInput - middleOfWindow >= 0 280 | ? "algolia-autocomplete-right" 281 | : "algolia-autocomplete-left"; 282 | const otherAlignClass = 283 | middleOfInput - middleOfWindow < 0 284 | ? "algolia-autocomplete-right" 285 | : "algolia-autocomplete-left"; 286 | const autocompleteWrapper = $(".algolia-autocomplete"); 287 | if (!autocompleteWrapper.hasClass(alignClass)) { 288 | autocompleteWrapper.addClass(alignClass); 289 | } 290 | 291 | if (autocompleteWrapper.hasClass(otherAlignClass)) { 292 | autocompleteWrapper.removeClass(otherAlignClass); 293 | } 294 | } 295 | } 296 | 297 | export default DocSearch; 298 | -------------------------------------------------------------------------------- /src/theme/SearchBar/lib/DocSearch.js: -------------------------------------------------------------------------------- 1 | import Hogan from "hogan.js"; 2 | import LunrSearchAdapter from "./lunar-search"; 3 | import autocomplete from "autocomplete.js"; 4 | import templates from "./templates"; 5 | import utils from "./utils"; 6 | import $ from "autocomplete.js/zepto"; 7 | 8 | /** 9 | * Adds an autocomplete dropdown to an input field 10 | * @function DocSearch 11 | * @param {Object} options.searchDocs Search Documents 12 | * @param {Object} options.searchIndex Lune searchIndexes 13 | * @param {string} options.inputSelector CSS selector that targets the input 14 | * value. 15 | * @param {Object} [options.autocompleteOptions] Options to pass to the underlying autocomplete instance 16 | * @return {Object} 17 | */ 18 | class DocSearch { 19 | constructor({ 20 | searchDocs, 21 | searchIndex, 22 | inputSelector, 23 | debug = false, 24 | queryDataCallback = null, 25 | autocompleteOptions = { 26 | debug: false, 27 | hint: false, 28 | autoselect: true 29 | }, 30 | transformData = false, 31 | queryHook = false, 32 | handleSelected = false, 33 | enhancedSearchInput = false, 34 | layout = "collumns" 35 | }) { 36 | this.input = DocSearch.getInputFromSelector(inputSelector); 37 | this.queryDataCallback = queryDataCallback || null; 38 | const autocompleteOptionsDebug = 39 | autocompleteOptions && autocompleteOptions.debug 40 | ? autocompleteOptions.debug 41 | : false; 42 | // eslint-disable-next-line no-param-reassign 43 | autocompleteOptions.debug = debug || autocompleteOptionsDebug; 44 | this.autocompleteOptions = autocompleteOptions; 45 | this.autocompleteOptions.cssClasses = 46 | this.autocompleteOptions.cssClasses || {}; 47 | this.autocompleteOptions.cssClasses.prefix = 48 | this.autocompleteOptions.cssClasses.prefix || "ds"; 49 | const inputAriaLabel = 50 | this.input && 51 | typeof this.input.attr === "function" && 52 | this.input.attr("aria-label"); 53 | this.autocompleteOptions.ariaLabel = 54 | this.autocompleteOptions.ariaLabel || inputAriaLabel || "search input"; 55 | 56 | this.isSimpleLayout = layout === "simple"; 57 | 58 | this.client = new LunrSearchAdapter(searchDocs, searchIndex); 59 | 60 | if (enhancedSearchInput) { 61 | this.input = DocSearch.injectSearchBox(this.input); 62 | } 63 | this.autocomplete = autocomplete(this.input, autocompleteOptions, [ 64 | { 65 | source: this.getAutocompleteSource(transformData, queryHook), 66 | templates: { 67 | suggestion: DocSearch.getSuggestionTemplate(this.isSimpleLayout), 68 | footer: templates.footer, 69 | empty: DocSearch.getEmptyTemplate() 70 | } 71 | } 72 | ]); 73 | 74 | const customHandleSelected = handleSelected; 75 | this.handleSelected = customHandleSelected || this.handleSelected; 76 | 77 | // We prevent default link clicking if a custom handleSelected is defined 78 | if (customHandleSelected) { 79 | $(".algolia-autocomplete").on("click", ".ds-suggestions a", event => { 80 | event.preventDefault(); 81 | }); 82 | } 83 | 84 | this.autocomplete.on( 85 | "autocomplete:selected", 86 | this.handleSelected.bind(null, this.autocomplete.autocomplete) 87 | ); 88 | 89 | this.autocomplete.on( 90 | "autocomplete:shown", 91 | this.handleShown.bind(null, this.input) 92 | ); 93 | 94 | if (enhancedSearchInput) { 95 | DocSearch.bindSearchBoxEvent(); 96 | } 97 | } 98 | 99 | static injectSearchBox(input) { 100 | input.before(templates.searchBox); 101 | const newInput = input 102 | .prev() 103 | .prev() 104 | .find("input"); 105 | input.remove(); 106 | return newInput; 107 | } 108 | 109 | static bindSearchBoxEvent() { 110 | $('.searchbox [type="reset"]').on("click", function () { 111 | $("input#docsearch").focus(); 112 | $(this).addClass("hide"); 113 | autocomplete.autocomplete.setVal(""); 114 | }); 115 | 116 | $("input#docsearch").on("keyup", () => { 117 | const searchbox = document.querySelector("input#docsearch"); 118 | const reset = document.querySelector('.searchbox [type="reset"]'); 119 | reset.className = "searchbox__reset"; 120 | if (searchbox.value.length === 0) { 121 | reset.className += " hide"; 122 | } 123 | }); 124 | } 125 | 126 | /** 127 | * Returns the matching input from a CSS selector, null if none matches 128 | * @function getInputFromSelector 129 | * @param {string} selector CSS selector that matches the search 130 | * input of the page 131 | * @returns {void} 132 | */ 133 | static getInputFromSelector(selector) { 134 | const input = $(selector).filter("input"); 135 | return input.length ? $(input[0]) : null; 136 | } 137 | 138 | /** 139 | * Returns the `source` method to be passed to autocomplete.js. It will query 140 | * the Algolia index and call the callbacks with the formatted hits. 141 | * @function getAutocompleteSource 142 | * @param {function} transformData An optional function to transform the hits 143 | * @param {function} queryHook An optional function to transform the query 144 | * @returns {function} Method to be passed as the `source` option of 145 | * autocomplete 146 | */ 147 | getAutocompleteSource(transformData, queryHook) { 148 | return (query, callback) => { 149 | if (queryHook) { 150 | // eslint-disable-next-line no-param-reassign 151 | query = queryHook(query) || query; 152 | } 153 | this.client.search(query).then(hits => { 154 | if ( 155 | this.queryDataCallback && 156 | typeof this.queryDataCallback == "function" 157 | ) { 158 | this.queryDataCallback(hits); 159 | } 160 | if (transformData) { 161 | hits = transformData(hits) || hits; 162 | } 163 | callback(DocSearch.formatHits(hits)); 164 | }); 165 | }; 166 | } 167 | 168 | // Given a list of hits returned by the API, will reformat them to be used in 169 | // a Hogan template 170 | static formatHits(receivedHits) { 171 | const clonedHits = utils.deepClone(receivedHits); 172 | const hits = clonedHits.map(hit => { 173 | if (hit._highlightResult) { 174 | // eslint-disable-next-line no-param-reassign 175 | hit._highlightResult = utils.mergeKeyWithParent( 176 | hit._highlightResult, 177 | "hierarchy" 178 | ); 179 | } 180 | return utils.mergeKeyWithParent(hit, "hierarchy"); 181 | }); 182 | 183 | // Group hits by category / subcategory 184 | let groupedHits = utils.groupBy(hits, "lvl0"); 185 | $.each(groupedHits, (level, collection) => { 186 | const groupedHitsByLvl1 = utils.groupBy(collection, "lvl1"); 187 | const flattenedHits = utils.flattenAndFlagFirst( 188 | groupedHitsByLvl1, 189 | "isSubCategoryHeader" 190 | ); 191 | groupedHits[level] = flattenedHits; 192 | }); 193 | groupedHits = utils.flattenAndFlagFirst(groupedHits, "isCategoryHeader"); 194 | 195 | // Translate hits into smaller objects to be send to the template 196 | return groupedHits.map(hit => { 197 | const url = DocSearch.formatURL(hit); 198 | const category = utils.getHighlightedValue(hit, "lvl0"); 199 | const subcategory = utils.getHighlightedValue(hit, "lvl1") || category; 200 | const displayTitle = utils 201 | .compact([ 202 | utils.getHighlightedValue(hit, "lvl2") || subcategory, 203 | utils.getHighlightedValue(hit, "lvl3"), 204 | utils.getHighlightedValue(hit, "lvl4"), 205 | utils.getHighlightedValue(hit, "lvl5"), 206 | utils.getHighlightedValue(hit, "lvl6") 207 | ]) 208 | .join( 209 | '' 210 | ); 211 | const text = utils.getSnippetedValue(hit, "content"); 212 | const isTextOrSubcategoryNonEmpty = 213 | (subcategory && subcategory !== "") || 214 | (displayTitle && displayTitle !== ""); 215 | const isLvl1EmptyOrDuplicate = 216 | !subcategory || subcategory === "" || subcategory === category; 217 | const isLvl2 = 218 | displayTitle && displayTitle !== "" && displayTitle !== subcategory; 219 | const isLvl1 = 220 | !isLvl2 && 221 | (subcategory && subcategory !== "" && subcategory !== category); 222 | const isLvl0 = !isLvl1 && !isLvl2; 223 | 224 | return { 225 | isLvl0, 226 | isLvl1, 227 | isLvl2, 228 | isLvl1EmptyOrDuplicate, 229 | isCategoryHeader: hit.isCategoryHeader, 230 | isSubCategoryHeader: hit.isSubCategoryHeader, 231 | isTextOrSubcategoryNonEmpty, 232 | category, 233 | subcategory, 234 | title: displayTitle, 235 | text, 236 | url 237 | }; 238 | }); 239 | } 240 | 241 | static formatURL(hit) { 242 | const { url, anchor } = hit; 243 | if (url) { 244 | const containsAnchor = url.indexOf("#") !== -1; 245 | if (containsAnchor) return url; 246 | else if (anchor) return `${hit.url}#${hit.anchor}`; 247 | return url; 248 | } else if (anchor) return `#${hit.anchor}`; 249 | /* eslint-disable */ 250 | console.warn("no anchor nor url for : ", JSON.stringify(hit)); 251 | /* eslint-enable */ 252 | return null; 253 | } 254 | 255 | static getEmptyTemplate() { 256 | return args => Hogan.compile(templates.empty).render(args); 257 | } 258 | 259 | static getSuggestionTemplate(isSimpleLayout) { 260 | const stringTemplate = isSimpleLayout 261 | ? templates.suggestionSimple 262 | : templates.suggestion; 263 | const template = Hogan.compile(stringTemplate); 264 | return suggestion => template.render(suggestion); 265 | } 266 | 267 | handleSelected(input, event, suggestion, datasetNumber, context = {}) { 268 | // Do nothing if click on the suggestion, as it's already a , the 269 | // browser will take care of it. This allow Ctrl-Clicking on results and not 270 | // having the main window being redirected as well 271 | if (context.selectionMethod === "click") { 272 | return; 273 | } 274 | 275 | input.setVal(""); 276 | window.location.assign(suggestion.url); 277 | } 278 | 279 | handleShown(input) { 280 | const middleOfInput = input.offset().left + input.width() / 2; 281 | let middleOfWindow = $(document).width() / 2; 282 | 283 | if (isNaN(middleOfWindow)) { 284 | middleOfWindow = 900; 285 | } 286 | 287 | const alignClass = 288 | middleOfInput - middleOfWindow >= 0 289 | ? "algolia-autocomplete-right" 290 | : "algolia-autocomplete-left"; 291 | const otherAlignClass = 292 | middleOfInput - middleOfWindow < 0 293 | ? "algolia-autocomplete-right" 294 | : "algolia-autocomplete-left"; 295 | const autocompleteWrapper = $(".algolia-autocomplete"); 296 | if (!autocompleteWrapper.hasClass(alignClass)) { 297 | autocompleteWrapper.addClass(alignClass); 298 | } 299 | 300 | if (autocompleteWrapper.hasClass(otherAlignClass)) { 301 | autocompleteWrapper.removeClass(otherAlignClass); 302 | } 303 | } 304 | } 305 | 306 | export default DocSearch; --------------------------------------------------------------------------------