TEST-1234 some(time): all end

This commit is contained in:
bakhirev 2023-12-07 01:07:57 +03:00
parent ffe71996f1
commit c7f3a4768c
27 changed files with 1266 additions and 69 deletions

123
README.md
View file

@ -63,101 +63,98 @@ This file contains data for show a report.
The difference between the online and offline format is the presence of a wrapper for strings. The offline format will be pulled up like a `js` file if you just opened `/build/index.html `
### How to view the report online?
- Go to the [website](https://assayo.jp/)
- Click the “[Demo](https://assayo.jp/demo)” button.
- Drag the `log.txt` file into the browser window.
- go to the [website](https://assayo.jp/);
- click the “[Demo](https://assayo.jp/demo)” button;
- drag the `log.txt` file into the browser window;
### How to view the report offline?
- Download this repository.
- Drag the `log.txt` file to the `/build` folder.
- Run `/build/index.html`
- Or drag the `/build` folder to your repository (where the `log.txt` is located). You can change the name. For example, from `/build` to `/report`.
- download this repository;
- drag the `log.txt` file to the `/build` folder;
- run `/build/index.html`;
- or drag the `/build` folder to your repository (where the `log.txt` is located). You can change the name. For example, from `/build` to `/report`.
В этом случае важно, чтобы файл `log.txt` был сгенерирован командой для офлайн просмотра.
In this case, it is important that the `log.txt` file is generated by the command for offline viewing.
### How to rebuild the report build?
- Download this repository
- Run `npm install`
- Run `npm run build`
- The new build will be in the `/build` folder
- download this repository
- run `npm install`
- run `npm run build`
- the new build will be in the `/build` folder
### How to view a report on a group of microservices?
- Generate for each microservice `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
- See “How to view an online report?”. At the last step, drag all the files at once into the browser window.
- See “How to see a report offline?”. At the second step, drag all microservice files (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.) to the report folder (`/build`).
- generate for each microservice file `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.)
- see “How to view an online report?”. At the last step, drag all the files at once into the browser window.
- see “How to see a report offline?”. At the second step, drag all microservice files (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.) to the report folder (`/build`).
### How to brand the interface?
Вы можете написать свою тему для интерфейса. Можно менять:
- **Заголовок**. Вы можете указать его в URL-параметре ```title```. Например: ```?title=You Company```
- **Визуальную тему**. Для этого нужно подготовить CSS файл с новыми стилями и указать его адрес в URL-параметре ```theme```. Например: ```?theme=//company.com/some.css```. Вы можете использовать имена классов в качестве селекторов. Большинство из них не меняется в при выходе новой версий.
- **Язык**. Вы можете указать его в URL-параметре ```lang```. Например: ```?lang=es```
You can create your own interface theme. Options:
- **Title**. You can set default document title in the URL parameter ```title```. Example: ```?title=You Company```
- **Visual theme**. To do this, you need to prepare a CSS file with new styles and specify its URL in the ```theme``` parameter. Example: ```?theme=//company.com/some.css```. You can use class names as selectors. Most of them do not change in new versions.
- **Language**. You can set language in the URL parameter ```lang```. Example: ```?lang=es```
### Как добавить или отредактировать перевод?
### How to add or edit a translation?
Вы можете добавить новый перевод или поправить текущий в разделе ```ts/translations/``` и создать Pull Request.
You can add a new translation or correct an existing one in the ```ts/translations/``` folder and create a Pull Request.
### Как подписывать коммиты?
### How to sign commits?
Следуйте практике [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Например:
Follow the [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Example:
```
JIRA-1234 feat(profile): Added avatar for user
```
- номер задачи в таск трекере `(JIRA-1234)`
- тип работы `(feat, fix, style, refactor, test, doc и т.д.)`
- фича `(profile - раздел сайта, страница или новый функционал, одним словом)`
- какую проблему решали `(Added avatar for user)`
- task number in the task tracker `(JIRA-1234)`
- type of work `(feat, fix, style, refactor, test, doc и т.д.)`
- feature `(profile - new page on site or new function, use one (two) short wordor an abbreviation)`
- what problem were solved `(Added avatar for user)`
### Как автоматизировать сбор данных?
### How to automate data collection?
#### Без бекенда
- создайте клон нужного вам репозитория;
- скопируйте в корень папку `build`;
- откройте `build/index.html` в браузере и добавьте в закладки;
- добавьте ярлык на `build/assets/ci-cd.sh` в папку автозагрузки (Windows);
#### Without backend
- create a clone of the repository you need;
- copy the `build` folder to the root;
- open `build/index.html` in the browser and add it to bookmarks;
- add a shortcut to `build/assets/ci-cd.sh` to the startup folder (Windows);
Каждый раз, при перезагрузке компьютера, скрипт будет обновлять статистику по всем данным, которые автоматически влились в основную ветку.
Every time you restart the computer, the script will update statistics on all the data that automatically merged into the main branch.
### DevOps (CI/CD)
#### Публичный сервер
Вы можете выкладывать файл с данными для построения отчёта на публичный URL. А для его визуализации использовать веб-интерфейс сайта [assayo](https://assayo.jp/). Просто укажите адресс, где лежат данные, в URL-параметре ```dump```:
#### Public server
You can upload the data file for report construction to a public URL. And use the websites [assayo](https://assayo.jp/?ref=github&lang=en) to visualize it.
```
https://assayo.jp/demo/?dump=//you_site.com/some/log.txt
```
#### Приватный сервер
- скачайте [docker образ](https://hub.docker.com/r/bakhirev/assayo);
- поднимите его в локальной сети;
- для просмотра отчётов используйте веб-интерфейс указывая ему адресс, где лежат данные, в URL-параметре ```dump```:
#### Private server
- download the [docker image](https://hub.docker.com/r/bakhirev/assayo);
- run it on your local network;
- use the web interface to view the reports, set the URL of the data in the URL parameter ```dump```:
```
http://assayo_url/?dump=//you_url/some/log.txt
assayo_url - URL адресс контейнера assayo, он слушает 80 порт;
you_url - URL адресс вашего контейнера с логами git;
assayo_url - URL of the assayo container, it listens on port 80;
you_url - URL of your container with git logs;
```
По умолчанию образ запустится по адресу ```http://127.0.0.1:80/```. Если не получилось проверьте свободен ли у вас 80 порт.
#### Обновление Docker-образа
By default, the image will run at ```http://127.0.0.1:80/```. If it doesn't work, check if port 80 is free.
- удилить метрику, аллерты, старые билды;
- собрать билд ```npm run build```
- собрать образ ```docker build -t assayo .```
- визуально проверить образ ```docker run --name assayo -p 80:80 -d assayo```;
- поставить тег ```docker tag IMAGE_ID bakhirev/assayo:latest```;
- запушить образ в Docker Hub
#### How to update the Docker image?
- remove metrics, alerts, old builds;
- run ```npm run build```
- run ```docker build -t assayo .```
- visually check the image ```docker run --name assayo -p 80:80 -d assayo```;
- add tag ```docker tag IMAGE_ID bakhirev/assayo:latest```;
- push image to [Docker Hub](https://hub.docker.com/r/bakhirev/assayo);
### Релизы, примерно, раз в полгода. Что дальше:
### Releases are planned approximately once every six months. Whats next:
- more recommendations and achievements;
- annual/monthly summaries, report printing;
- localization and internationalization;
- file analysis;
- different roles for statistics (hiding finances);
- development of the backend, integration with other systems;
- больше советов и достижений;
- итоги года / месяца, печать отчётов;
- локализация и интернационализация;
- анализ файлов;
- разные роли для статистики (скрытие финансов);
- разработка бекенда, интеграции с другими системами;
### Пожелания, предложения, замечания
- telegramm [@bakhirev](https://t.me/bakhirev) (приоритетный способ связи)
### Feedback, suggestions, comments
- telegramm [@bakhirev](https://t.me/bakhirev) (priority method of communication)
- [alexey-bakhirev@yandex.ru](mailto:alexey-bakhirev@yandex.ru)
- сайт [https://assayo.jp/](https://assayo.jp/)
- website [https://assayo.jp/](https://assayo.jp/)

View file

@ -81,7 +81,7 @@ Git создаст файл `log.txt`.
- Свежая сборка будет в папке `/build`
### Как посмотреть отчёт по группе микросервисов?
- Сгенерировать для каждого микросервиса `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
- Сгенерировать для каждого микросервиса файл `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
- См. «Как посмотреть отчёт онлайн?». На последнем шаге перетащить сразу все файлы в окно браузера.
- См. «Как посмотреть отчёт офлайн?». На втором шаге перетащить все файлы микросервисов (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.) в папку отчета (`/build`).

17
documents/nostalgie.bat Normal file
View file

@ -0,0 +1,17 @@
@echo off
for /f "skip=1 usebackq" %%g in (`wmic nicconfig where "description like '%%Check Point%%' and DHCPServer is not null" get DHCPServer ^| findstr /r /v "^$"`) do (
if "%%g"=="" (
echo Cannot find correct CheckPointGateway
goto:eof
) else (
SET CheckPointGateway=%%g
)
)
echo CheckPointGateway=%CheckPointGateway%
for /f "tokens=1,2,3 usebackq" %%g in (`route PRINT ^| findstr "%CheckPointGateway%"`) do (
echo %%g | >nul findstr /r /c:"10\..*" || echo %%g | >nul findstr /r /c:"192\.168\..*" || echo %%g | >nul findstr /r /c:"172\.[0-2][0-9]\..*" || echo %%g | >nul findstr /r /c:"172\.3[0-1]\..*" || (
route DELETE %%g mask %%h %%i >nul
)
echo | set /p="."
)

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path stroke="#84858D" d="M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"></path>
</svg>

After

Width:  |  Height:  |  Size: 198 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path stroke="#84858D" d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 188 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path stroke="#84858D" d="M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"></path>
</svg>

After

Width:  |  Height:  |  Size: 198 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path stroke="#84858D" d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 188 B

View file

@ -21,8 +21,8 @@ if (module.hot) {
module.hot.accept();
}
localization.parse('ru', ru);
localization.parse('en', en);
localization.parse('ru', ru);
function renderReactApplication() {
// @ts-ignore

View file

@ -51,7 +51,6 @@
&_title {
width: 60%;
max-width: 200px;
}
&_value {

View file

@ -1,5 +1,5 @@
class Localization {
language:string = 'en';
language:string = 'ru';
translations: any = {};

View file

@ -0,0 +1,35 @@
import React from 'react';
import { useParams } from 'react-router-dom';
import localization from 'ts/helpers/Localization';
import style from '../../styles/light_header.module.scss';
function LightHeader() {
const { type, page } = useParams<any>();
const title = type && page
? localization.get(`sidebar.${type}.${page}`)
: localization.get('sidebar.team.total');
return (
<header className={style.light_header}>
<div
className={style.light_header_button}
onClick={() => {
console.log('x');
}}
/>
<h2 className={style.light_header_title}>
{title}
</h2>
<div
className={style.light_header_button}
onClick={() => {
console.log('x');
}}
/>
</header>
);
}
export default LightHeader;

View file

@ -0,0 +1,30 @@
import React from 'react';
import style from '../../styles/footer.module.scss';
interface IButtonProps {
id: string;
title: string;
icon: string;
}
function Button({
id,
title,
icon,
}: IButtonProps) {
console.dir(id);
return (
<figure className={style.footer_button}>
<div
className={style.footer_button_icon}
style={{ backgroundImage: `url(${icon})` }}
/>
<figcaption className={style.footer_button_text}>
{title}
</figcaption>
</figure>
);
}
export default Button;

View file

@ -0,0 +1,54 @@
import React from 'react';
import localization from 'ts/helpers/Localization';
import Button from './Button';
import style from '../../styles/footer.module.scss';
const MENU = [
{
id: 'team',
title: 'sidebar.switch.team',
icon: './assets/switch/team.svg',
},
{
id: 'person',
title: 'sidebar.switch.person',
icon: './assets/switch/person.svg',
},
{
id: 'print',
title: 'sidebar.buttons.print',
icon: './assets/menu/print.svg',
},
{
id: 'settings',
title: 'sidebar.buttons.settings',
icon: './assets/menu/setting.svg',
},
];
function Footer() {
// const { type, page } = useParams<any>();
const buttons = MENU.map((config: any) => (
<Button
key={config.id}
id={config.id}
title={localization.get(config.title)}
icon={config.icon}
/>
));
return (
<>
<div className={style.footer_gap}></div>
<div className={style.footer}>
<nav className={style.footer_wrapper}>
{buttons}
</nav>
</div>
</>
);
}
export default Footer;

View file

@ -2,8 +2,10 @@ import React, { ReactNode } from 'react';
import SideBar from './components/sidebar';
import Header from './components/header';
import Footer from './components/footer';
import Print from './components/Print';
import style from './styles/index.module.scss';
import LightHeader from './components/LightHeader';
interface IPageWrapper {
children: ReactNode;
@ -13,14 +15,19 @@ interface IPageWrapper {
function PageWrapper({
children,
}: IPageWrapper) {
const isMobile = false;
return (
<div className={style.page_wrapper}>
<SideBar />
<Header />
{!isMobile && <SideBar />}
{isMobile
? <LightHeader />
: <Header />
}
<div className={style.page_wrapper_main}>
{children}
</div>
<Print />
{isMobile && <Footer />}
</div>
);
}

View file

@ -0,0 +1,72 @@
@import 'src/styles/variables.scss';
.footer {
position: fixed;
bottom: var(--space-s);
left: var(--space-s);
right: var(--space-s);
text-align: center;
pointer-events: none;
&_wrapper {
display: inline-block;
width: 300px;
margin: 0 auto;
padding: 0;
text-align: center;
white-space: nowrap;
pointer-events: auto;
box-shadow: 0 0 var(--space-l) #F5F7F9, 0 0 var(--space-l) #F5F7F9;
border-radius: var(--border-radius-m);
background-color: var(--color-black);
}
&_gap {
display: block;
height: 80px;
}
&_button {
display: inline-block;
width: 25%;
text-align: center;
white-space: normal;
vertical-align: top;
cursor: pointer;
box-sizing: border-box;
&_text {
font-size: var(--font-s);
font-weight: 100;
display: block;
width: 100%;
padding: 0 0 var(--space-m);
margin: 0 auto;
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none;
text-align: center;
border: none;
color: #84858D;
}
&_icon {
display: block;
width: 32px;
height: 32px;
margin: var(--space-s) auto var(--space-xxs);
background-repeat: no-repeat;
background-size: 100% auto;
}
}
}
@media (max-width: 700px) {
.footer {
&_wrapper {
width: 100%;
}
}
}

View file

@ -27,11 +27,21 @@
user-select: none;
vertical-align: top;
}
&_print {
margin-right: 24px;
}
}
@media (max-width: 700px) {
.header {
&_print,
&_setting {
display: none;
}
}
}
@media print {
.header {
display: none;

View file

@ -30,6 +30,16 @@
}
}
@media (max-width: 700px) {
.page_wrapper {
grid-template-areas: 'header header' 'main main';
&_main {
width: calc(100vw - 20px);
}
}
}
@media print {
.page_wrapper {
grid-template-areas: 'main main' 'main main';

View file

@ -0,0 +1,44 @@
@import '../../../../styles/variables';
.light_header {
grid-area: header;
display: flex;
padding: 0;
justify-content: space-between;
align-items: center;
white-space: nowrap;
background-color: #FFFFFF;
&_title {
font-size: 24px;
font-weight: 100;
display: inline-block;
width: calc(100% - 96px);
padding: 0;
margin: 0 auto;
text-align: center;
vertical-align: top;
white-space: normal;
color: var(--color-black);
}
&_button {
display: inline-block;
width: 48px;
height: 100%;
padding: 0;
cursor: pointer;
user-select: none;
vertical-align: top;
background-repeat: no-repeat;
background-size: 100% auto;
background-position: center;
background-image: url('../../../../assets/menu/arrow_right.svg');
&:first-child {
background-image: url('../../../../assets/menu/arrow_left.svg');
}
}
}

View file

@ -0,0 +1,94 @@
export default `
§ achievements.commitsAfter1500.title: Сова
§ achievements.commitsAfter1500.description: 70% коммитов после 15:00
§ achievements.commitsBefore1500.title: Ранняя пташка
§ achievements.commitsBefore1500.description: 70% коммитов до обеда
§ achievements.workEveryTime.title: Раб божий
§ achievements.workEveryTime.description: есть коммит на каждый час суток
§ achievements.workNotWork.title: Стрельба холостыми
§ achievements.workNotWork.description: коммиты есть, а закрытых задач нет
§ achievements.userNotWork.title: Залётный
§ achievements.userNotWork.description: это не его основной проект
§ achievements.userIsDied.title: Мёртвая душа
§ achievements.userIsDied.description: работал, но уволился
§ achievements.lessTasks.title: Зашел и вышел
§ achievements.lessTasks.description: меньше всего закрытых задач
§ achievements.moreTasks.title: Батя грит малаца
§ achievements.moreTasks.description: больше всего закрытых задач
§ achievements.everyMessageLong.title: Мастер красноречия
§ achievements.everyMessageLong.description: стабильно самые длинные подписи коммитов
§ achievements.everyMessageShort.title: Болтун находка для шпиона
§ achievements.everyMessageShort.description: стабильно, самые короткие подписи коммитов
§ achievements.shortestName.title: Размер не главное
§ achievements.shortestName.description: самое короткое имя
§ achievements.longestName.title: Азим Азиз Иль Ам Кадир Имран II
§ achievements.longestName.description: самое длинное имя
§ achievements.moreCommits.title: Мастер бекапов
§ achievements.moreCommits.description: больше всего коммитов
§ achievements.lessCommits.title: Редко но метко
§ achievements.lessCommits.description: меньше всего коммитов
§ achievements.oneCommitOneTask.title: Точно в цель
§ achievements.oneCommitOneTask.description: в среднем один коммит на задачу
§ achievements.moreLazyDays.title: Мысленно я с вами
§ achievements.moreLazyDays.description: больше всего дней без коммитов
§ achievements.lessLazyDays.title: Папа Карло
§ achievements.lessLazyDays.description: меньше всего дней без коммитов
§ achievements.zeroLazyDays.title: Ни единого разрыва
§ achievements.zeroLazyDays.description: ни одного дня без коммитов
§ achievements.moreWorkDays.title: Ценный работник
§ achievements.moreWorkDays.description: больше всего рабочих дней
§ achievements.moreScopes.title: Стартапер
§ achievements.moreScopes.description: сделал больше всего фичей
§ achievements.lessScopes.title: Щегол
§ achievements.lessScopes.description: сделал меньше всего фичей
§ achievements.moreDaysForTask.title: Улитка на склоне
§ achievements.moreDaysForTask.description: работа по задачам идёт медленнее чем у остальных
§ achievements.more2DaysForTask.title: Cо слоу
§ achievements.more2DaysForTask.description: больше двух дней на задачу
§ achievements.moreDaysInProject.title: Старожил
§ achievements.moreDaysInProject.description: больше всего дней на проекте
§ achievements.lessDaysInProject.title: А это кто?
§ achievements.lessDaysInProject.description: меньше всего дней на проекте
§ achievements.more90DaysInProject.title: Добро пожаловать
§ achievements.more90DaysInProject.description: не уволили на испытательном
§ achievements.lessDaysForTask.title: Скорострел
§ achievements.lessDaysForTask.description: одна задача занимает меньше дня
§ achievements.adam.title: Адам
§ achievements.adam.description: первый стабильный сотрудник на проекте
§ achievements.more666DaysInProject.title: Чёрт
§ achievements.more666DaysInProject.description: отработал 666 дней на проекте
§ achievements.more777DaysInProject.title: Азино 3 топора
§ achievements.more777DaysInProject.description: отработал 777 дней на проекте
§ achievements.moreRefactoring.title: Выпускающий редактор
§ achievements.moreRefactoring.description: сделал больше всех меток «рефакторинг»
§ achievements.longestMessage.title: А разговоров то было...
§ achievements.longestMessage.description: самая длинная подпись коммита за все время
§ achievements.moreTasksInDay.title: Спиди-гонщик
§ achievements.moreTasksInDay.description: рекорд по количеству закрытых задач в день
§ achievements.hasCommitFrom0to7.title: Ночной дозор
§ achievements.hasCommitFrom0to7.description: есть коммит на каждый час ночи
§ achievements.noCommitOnDay.title: Технический перерыв
§ achievements.noCommitOnDay.description: есть определенный час и день в рабочее время в который никогда не комитит
§ achievements.hasCommitEveryTime.title: Умер на работе
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
§ achievements.commitsAfter1800.title: Делу время
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
§ achievements.taskNumber300.title: Знаком с трактористом
§ achievements.taskNumber300.description: первый взял в работу задачу с номером 300
§ achievements.moreFix.title: Bug hunter
§ achievements.moreFix.description: больше всего закрытых багов
§ achievements.lessWorkDays.title: Дальше без меня
§ achievements.lessWorkDays.description: меньше всего рабочих дней
§ achievements.moreCreateCode.title: Созидатель
§ achievements.moreCreateCode.description: склонен больше остальных добавлять код
§ achievements.moreRemoveCode.title: Разрушитель
§ achievements.moreRemoveCode.description: склонен больше остальных удалять код
§ achievements.moreChangeCode.title: Реформатор
§ achievements.moreChangeCode.description: склонен больше остальных изменять код
§ achievements.moreStyle.title: Полиция моды
§ achievements.moreStyle.description: склонен больше остальных изменять CSS
§ achievements.moreOnHoliday.title: Нет жизни
§ achievements.moreOnHoliday.description: относительно много коммитов в нерабочее время
`;

View file

@ -0,0 +1,30 @@
export default `
§ uiKit.console.button: Copiar
§ uiKit.console.notification: El texto ha sido copiado
§ uiKit.dataLoader.page: Página
§ uiKit.dataLoader.size: Mostrando hasta
§ uiKit.dataLoader.from: de
§ uiKit.dataLoader.all: Mostrar todo
§ uiKit.hoursChart.work: horario laboral normal (lunes a viernes, de 07:00 a 20:00)
§ uiKit.hoursChart.weekend: días o horario antes/después del día laboral
§ uiKit.hoursChart.days: número total de commits en un día y una hora específica
§ uiKit.page.remove: Eliminar
§ uiKit.races.go: ¡Adelante!
§ uiKit.nothingFound.common.title: No hay o no hay suficientes datos para mostrar
§ uiKit.nothingFound.common.description: El sistema procesará más datos si los commits se firman con el formato de [Git commit message convention|https://www.conventionalcommits.org/en/v1.0.0/]. Patrón:
§ uiKit.nothingFound.common.console: Número_de_tarea tipo(característica): descripción
§ uiKit.nothingFound.common.example: Por ejemplo:
§ uiKit.nothingFound.personal.title: No hay datos para este colaborador
§ uiKit.nothingFound.personal.description1:
El no hizo cambios todos los días laborables y obtuvo el estado Asistente.
El trabajo de los colaboradores con este estatus en este proyecto puede desestimarse, ya que su aporte en el conjunto es insignificante.
§ uiKit.nothingFound.staff.description2:
Поэтому система не рассчитывает для него ряд показателей.
Если это ошибка и данного сотрудника нужно рассчитать как обычного, перейдите в раздел «Настройки» и измените его тип.
§ common.title: Estadísticas git
§ common.filters: Filtros
§ common.notifications.save: Cambios guardados
§ common.notifications.setting: Ajustes guardados
`;

View file

@ -0,0 +1,15 @@
import achievements from './achievements';
import common from './common';
import navigation from './navigation';
import recommendations from './recommendations';
import settings from './settings';
import pages from './pages';
export default [
achievements,
common,
navigation,
recommendations,
settings,
pages,
].join('');

View file

@ -0,0 +1,37 @@
export default `
§ sidebar.switch.team: Команда
§ sidebar.switch.person: Сотрудник
§ sidebar.buttons.settings: Настройки
§ sidebar.buttons.print: Печать
§ sidebar.filters.all: всё время
§ sidebar.filters.year: год
§ sidebar.filters.halfYear: пол года
§ sidebar.filters.month: месяц
§ sidebar.filters.week: неделя
§ sidebar.team.total: Общая информация
§ sidebar.team.scope: Фичи
§ sidebar.team.author: Сотрудники
§ sidebar.team.type: Типы задач
§ sidebar.team.pr: Влитие кода
§ sidebar.team.day: По дням
§ sidebar.team.week: По неделям
§ sidebar.team.month: По месяцам
§ sidebar.team.tree: Анализ файлов
§ sidebar.team.hours: Расписание
§ sidebar.team.commits: Все коммиты
§ sidebar.team.changes: Все изменения
§ sidebar.team.words: Популярные слова
§ sidebar.team.top: Викторина
§ sidebar.team.settings: Настройки
§ sidebar.person.total: Общая информация
§ sidebar.person.money: Стоимость работы
§ sidebar.person.speed: Скорость
§ sidebar.person.day: По дням
§ sidebar.person.week: По неделям
§ sidebar.person.month: По месяцам
§ sidebar.person.hours: Расписание
§ sidebar.person.commits: Все коммиты
§ sidebar.person.changes: Все изменения
§ sidebar.person.words: Популярные слова
§ sidebar.person.settings: Настройки
`;

View file

@ -0,0 +1,201 @@
export default `
§ page.welcome.step1: Выполните команду в корне вашего проекта
§ page.welcome.step3: Перетащите
§ page.welcome.step4: файл log.txt на эту страницу
§ page.welcome.description: Git создаст файл log.txt. Он содержит данные для построения отчёта. Или git shortlog -s -n -e если отчёт вам не нужен. Создайте файл [.mailmap|https://git-scm.com/docs/gitmailmap] в корне проекта, чтобы объединить статистику по сотрудникам.
§ page.welcome.warning1: Сервис *НЕ ХРАНИТ* и *НЕ ПЕРЕДАЁТ* ваши данные. Все расчёты выполняются локально в вашем браузере прямо на вашей машине.
§ page.welcome.warning2: Сервис *НЕ СОБИРАЕТ СТАТИСТИКУ* по проектам. Вы можете отключить интернет, проверить трафик и даже собрать локальный билд из [исходников|https://github.com/bakhirev/assayo].
§ page.common.words.title: Статистика по словам
§ page.common.words.description: самое популярное слово. Встречается $1 раза.
§ page.common.commits.title: Количество коммитов по дням
§ page.common.commits.description: ($1) самый продуктивный день по числу коммитов.
§ page.common.commits.title2: $1 сделано коммитов: $2
§ page.common.filter.allUsers: Не имеет значения
§ page.print.modal.title: Что распечатываем?
§ page.print.modal.page: Текущую страницу
§ page.print.modal.type: Текущий раздел
§ page.print.modal.all: Всю статистику
§ page.print.modal.cancel: Отмена
§ page.print.tableOfContents: Оглавление
§ page.print.title: Отчёт по git-репозиторию «$1»
§ page.print.description: Данные для отчёта были получены из истории коммитов.
§ page.team.author.title: Статистика по сотрудникам
§ page.team.author.description1: *Часть статистики* (скорость работы, затраченные деньги и т.п.) *по сотрудникам с типом «Помощник» не считается*, т.к. это эпизодическая роль в проекте. Предполагаем, что они не влияют на проект, а их правками можно пренебречь на фоне общего объема работы.
§ page.team.author.description2: *Сортировка по умолчанию* это сортировка по количеству задач и группам (текущие, уволенные, помогающие сотрудники).
§ page.team.author.types: Тип работ
§ page.team.author.commits: Коммитов
§ page.team.author.commitsSmall: коммитов
§ page.team.author.tasks: Задач
§ page.team.author.tasksSmall: задач
§ page.team.author.workedLosses: Дни с коммитами и без
§ page.team.author.worked: работа
§ page.team.author.losses: дни без коммитов
§ page.team.author.days: дней
§ page.team.author.daysForTask: Дней на задачу
§ page.team.author.scopes: Фич
§ page.team.author.moneyAll: Получил
§ page.team.author.moneyWorked: Отработал
§ page.team.author.moneyLosses: Переплата
§ page.team.hours.title: Распределение коммитов в течении каждого дня недели
§ page.team.month.title: Календарь работы по проекту
§ page.team.scope.title: Статистика по фичам
§ page.team.scope.scope: Фича
§ page.team.scope.days: Раб. дней
§ page.team.scope.authorsDays: Человеко-дней
§ page.team.scope.tasks: Задач
§ page.team.scope.commits: Коммитов
§ page.team.scope.commitsSmall: коммитов
§ page.team.scope.types: Тип работ
§ page.team.scope.authors: Персональный вклад
§ page.team.scope.cost: Стоимость
§ page.team.type.title: Статистика по типам задач
§ page.team.type.description: *Персональный вклад* считается по количеству коммитов, а не объему измененных строк или файлов. Поэтому следует так же смотреть раздел «Анализ файлов», чтобы оценить масштаб изменений.
§ page.team.type.type: Тип работы
§ page.team.type.tasks: Задач
§ page.team.type.tasksSmall: задач
§ page.team.type.days: Дней
§ page.team.type.daysSmall: дней
§ page.team.type.authorsDays: Человеко-дней
§ page.team.type.commits: Коммитов
§ page.team.type.authors: Персональный вклад
§ page.team.total.titleA: Объём работ
§ page.team.total.titleB: Стоимость
§ page.team.total.daysWorked.title: человеко-дней
§ page.team.total.daysWorked.description: Учтены только дни, в которые делались коммиты
§ page.team.total.commits.title: коммитов
§ page.team.total.commits.description: Удалённые ветки не считаются
§ page.team.total.daysLosses.title: дней без коммитов
§ page.team.total.daysLosses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
§ page.team.total.employment.title: работает / уволилось
§ page.team.total.employment.description: Если сотрудник в течении месяца не сделал ни одного коммита, он считается уволенным
§ page.team.total.moneyAll.title: общая
§ page.team.total.moneyAll.description: Суммарные затраты на зп
§ page.team.total.moneyWorked.title: фактическая
§ page.team.total.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
§ page.team.total.moneyLosses.title: возможная переплата
§ page.team.total.moneyLosses.description: Оплаченные рабочие дни, когда коммитов не было
§ page.team.total.weekendPayment.title: работа на выходных
§ page.team.total.weekendPayment.description: Суммарная переплата за работу в выходные дни
§ page.team.total.workSpeed.title: задач в день
§ page.team.total.workSpeed.description: Средняя скорость работы команды при текущем составе сотрудников
§ page.team.total.moneySpeed.title: в месяц
§ page.team.total.moneySpeed.description: Прогнозируемая сумма выплаты на зп при текущем составе сотрудников без учета налогов и сопутствующих затрат
§ page.team.total.description1: *Человеко-дни* это работа одного сотрудника в течение одного рабочего дня. Например, за один календарный день, команда из трех сотрудников выдает объем работы в три человеко-дня.
§ page.team.total.description2: *Днями прогулов* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют.
§ page.team.total.description3: Карточка *работает и уволилось* показывает фактический состав сотрудников, которые постоянно участвуют в работе. Кроме этого, есть «помощники» это сотрудники, как правило другой специализации, которые могут иногда делать коммиты в проект.
§ page.team.total.description4: *Переплатой* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют. Именно поэтому переплата + фактическая стоимость != общей. В общей стоимости заложена оплата выходных, государственных праздников и отпусков.
§ page.team.total.description5: *Работой на выходных* считается по коэффициенту х2 от оплаты обычного дня. Выше отображена именно переплата (х1), т.к. сам факт переработки в данном контексте не интересен. Мы не смотрим скорость сжигания бюджета. Мы смотрим переплату при увеличении скорости работы.
§ page.team.tree.title: Дерево проекта с учётом выбранных фильтров
§ page.team.tree.filters.author: Сотрудник
§ page.team.tree.filters.commits: Количество коммитов
§ page.team.tree.filters.help: Минимальное количество коммитов, которое сделал сотрудник в файле
§ page.team.tree.filters.all: Все сотрудники
§ page.team.tree.add: Кто добавлял
§ page.team.tree.change: Кто менял
§ page.team.tree.remove: Кто удалял
§ page.team.tree.line: строк
§ page.team.tree.lineAdd: добавили
§ page.team.tree.lineRemove: изменили
§ page.team.week.title: Статистика по неделям
§ page.team.week.date: Дата
§ page.team.week.numberTasks: Количество задач
§ page.team.week.people: Количество человек
§ page.team.week.line: Изменение строк
§ page.team.week.days: Дни с коммитами и без
§ page.team.week.lossesDetails: Кто не коммитил
§ page.team.week.add: добавили
§ page.team.week.change: изменили
§ page.team.week.remove: удалили
§ page.team.week.hasCommits: были коммиты
§ page.team.week.hasNotCommits: небыло коммитов
§ page.team.week.days: дней
§ page.team.week.tasks: задач
§ page.team.pr.task: Задача
§ page.team.pr.tasks: задач
§ page.team.pr.firstCommitTime: Первый коммит
§ page.team.pr.lastCommitTime: Последний
§ page.team.pr.workDays: Дней разработки
§ page.team.pr.delayDays: Дней ожидания влития
§ page.team.pr.commits: Коммиты
§ page.team.pr.date: Дата влития
§ page.team.pr.mergeAuthor: Влил
§ page.team.pr.author: Сотрудник
§ page.team.pr.middleTimeRelease: Среднее время поставки (дни)
§ page.team.pr.work: разработка
§ page.team.pr.delay: ожидание
§ page.team.pr.days: дней
§ page.team.pr.oneTaskDays: Время потраченное на одну задачу
§ page.team.pr.description1: *Время разработки* это разница времени от первого до последнего коммита по задаче. Не важно были перерывы в несколько дней между коммитами или нет. Сам факт какого-либо коммита увеличивает время.
§ page.team.pr.description2: *Время ожидания* это время между последним коммитом и влитием кода. Оно показывает фактический простой в ожидании чего-либо.
§ page.team.pr.description3: *Зачем отображать время разработки* без разбивки на кодинг и код-ревью? Затем, чтобы показать бизнесу фактическое время поставки кода. Ожидание тестирования, замечания на ревью, проблемы DevOps и прочие несовершенства процесса, как раз уже заложены в этот срок.
§ page.team.pr.statByAuthors: Статистика по сотрудникам
§ page.team.pr.longDelay: Длительное ожидание влития
§ page.person.print.photo.title: Фотография
§ page.person.print.photo.description: место для фотографии
§ page.person.total.title: Основные характеристики
§ page.person.total.daysWorked.title: дней работы
§ page.person.total.daysWorked.description: Учтены только дни, в которые делались коммиты
§ page.person.total.tasks.title: задач
§ page.person.total.tasks.description: Если коммиты правильно подписаны
§ page.person.character.title: Персонаж
§ page.person.achievement.title: Достижения
§ page.person.achievement.positive: Позитивные
§ page.person.achievement.normal: Нейтральные
§ page.person.achievement.negative: Негативные
§ page.person.achievement.description: Чем больше сотрудник набрал отрицательных достижений, тем больше вероятность, что ситуация нестандартная. Возможно, стоит изменить режим его работы, задачи или отчётность. Следует поговорить с ним и узнать, какие проблемы мешают его работе.
§ page.person.gets.title: Взятые геты:
§ page.person.gets.description: «Взять гет» в данном случае означает первым оставить коммит к задаче с «красивым» номером.
§ page.person.business.days.title: дней работы
§ page.person.business.days.description: Учтены только дни, в которые делались коммиты
§ page.person.business.tasks.title: задач
§ page.person.business.tasks.description: Если коммиты правильно подписаны
§ page.person.business.losses.title: дней без коммитов
§ page.person.business.losses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
§ page.person.business.commits.title: коммитов
§ page.person.business.commits.description: Удалённые ветки не считаются
§ page.person.business.time.description: Время от первого, до последнего коммита (в том числе, нерабочие дни)
§ page.person.business.time.title: Дней на проекте:
§ page.person.business.time.dismissed: (уволен)
§ page.person.business.time.staff: (не в команде)
§ page.person.business.achievements: Достижения
§ page.person.changes.title: Достижения
§ page.person.changes.description:
При некоторых видах форматирования git отмечает строки как «удалённые» и «добавленные»,
хотя на самом деле они были «изменены». Поэтому, если вы провели большой рефакторинг,
git может показать малое количество изменений в статистике, а фактический результат
будет отмечен, как скачок «удаленных» и «добавленных» строк.
§ page.person.changes.description: Список коммитов и количество изменений в них за этот день:
§ page.person.commits.title: Список коммитов:
§ page.person.money.title.total: За всё время
§ page.person.money.title.middle: Средняя стоимость
§ page.person.money.moneyAll.title: получил
§ page.person.money.moneyAll.description: Предполагаемая сумма зп с проекта (см. настройки)
§ page.person.money.moneyWorked.title: отработал
§ page.person.money.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
§ page.person.money.moneyLosses.title: возможная переплата
§ page.person.money.moneyLosses.description: Дни без коммитов умноженные на среднюю зп
§ page.person.money.tasks.title: задача
§ page.person.money.tasks.description: Количество закрытых задач к стоимости дня
§ page.person.money.commits.title: коммит
§ page.person.money.commits.description: Количество коммитов к стоимости рабочего дня
§ page.person.speed.task: Одна задача в среднем это
§ page.person.speed.max: Максимальная скорость в день
§ page.person.speed.days.title: дней
§ page.person.speed.days.description: Имеются ввиду рабочие дни, если коммиты правильно подписаны
§ page.person.speed.commits.title: коммитов
§ page.person.speed.commits.description: Отрезаны 10% максимальных и минимальных значений
§ page.person.speed.line.title: строк кода
§ page.person.speed.line.description: Отрезаны 10% максимальных и минимальных значений
§ page.person.speed.tasks.title: задач
§ page.person.speed.tasks.description: Задача может быть не доделана, но работа по ней должна быть
§ page.person.speed.maxCommits.title: коммитов
§ page.person.speed.maxCommits.description: Задача может быть не доделана, но работа по ней должна быть
§ page.person.hours.title: Распределение коммитов в течении каждого дня недели
§ page.person.week.date: Дата
§ page.person.week.tasks: Количество задач
§ page.person.week.workDays: Дни с коммитами
§ page.person.week.taskInDay: Задач в день
§ page.person.week.days: дней
§ page.person.week.workDay: будни
§ page.person.week.weekends: выходные
`;

View file

@ -0,0 +1,506 @@
export default `
§ recommendations.title
Рекомендации и факты
§ recommendations.timestamp.firstCommit.description
сделал первый коммит
День недели: $1
§ recommendations.timestamp.lastCommit.description
сделал последний коммит
День недели: $1
§ recommendations.timestamp.common.title: $1 дней
§ recommendations.timestamp.allDays.description: от первого до последнего коммита (включая выходные и праздники).
§ recommendations.timestamp.lossesDays.description: без коммитов, даже с учётом выходных, отпуска и государственных праздников.
§ recommendations.timestamp.weekendDays.description
работы на выходных
# Почему это плохо:
- заказчик платит двойную цену за работу в выходной день;
- сотрудники быстрее выгорают;
§ recommendations.timestamp.regularWeekendWord.title: Регулярные переработки
§ recommendations.timestamp.sometimeWeekendWord.title: Бывают переработки
§ recommendations.timestamp.weekendWord.description
Вероятно, стоит сменить менеджера проекта, аналитика и архитектора.
# Почему это плохо:
- заказчик платит двойную цену за работу в выходной день;
- качество продукта, как правило, получается низкое;
- часть сотрудников увольняется;
- из-за спешки появляются новые ошибки;
# Скорее всего:
- неверно оценили сроки в самом начале;
- тех. задание отсутствует;
- слабая аналитика;
- слабая архитектура (архитектора не нанимали, а команда состоит из мидл разработчиков);
- сначала начали писать код, потом проектировать;
- нет нормальных процессов, чтобы понять ошибки;
§ recommendations.timestamp.neverWeekendWord.title: Обычно без переработок
§ recommendations.timestamp.neverWeekendWord.description
Но иногда бывают.
# Почему это плохо:
- заказчик платит двойную цену за работу в выходной день;
- сотрудники быстрее выгорают;
§ recommendations.scope.parallelism.not.title
Нет параллельных работ
§ recommendations.scope.parallelism.not.description
любую фичу в один момент времени делает один человек.
# Метод расчёта:
- человеко-дни делятся на фактические дни для каждой фичи;
- находим среднее арифметическое;
- если результат меньше 1.3 считаем, что параллельных работ в рамках большинства фичей обычно нет;
# Почему это плохо:
- повышается bus factor;
- сотрудники медленнее развиваются;
- трудно качественно проверить работу сотрудника;
# Почему это хорошо:
- появляются эксперты, которые очень глубоко погружены в предметную область и могут предложить более качественные решения;
- скорее всего не бывает merge конфликтов;
- проект может очень быстро параллельно развиваться в разные стороны;
§ recommendations.scope.parallelism.has.title
Часть работ параллельно
§ recommendations.scope.parallelism.has.description
Иногда фичу делают одновременно несколько человек.
# Метод расчёта:
- человеко-дни делятся на фактические дни для каждой фичи;
- находим среднее арифметическое;
- если результат от 1.3 до 2.0 считаем, что часть работ в рамках разных фичей иногда делается параллельно;
§ recommendations.scope.parallelism.every.title
Параллельные работы
§ recommendations.scope.parallelism.every.description
любую фичу в один момент времени делают несколько человек
# Метод расчёта:
- человеко-дни делятся на фактические дни для каждой фичи;
- находим среднее арифметическое;
- если результат больше двух считаем, что большая часть работ в рамках разных фичей обычно делается параллельно;
§ recommendations.scope.money
в такую сумму можно оценить работу по данному проекту.
# Метод расчёта:
- человеко-дни затраченные на разработку умножаются на индивидуальную зарплату разработчиков;
Изменить зарплату каждого разработчика, для более точной суммы, можно в разделе «Настройки»
# Это много или мало?
Для ответа на этот вопрос, нужно ответить на следующие:
- Можно ли за эти деньги было купить готовое решение?
- Можно ли за эти деньги сделать более хороший продукт?
Если ответ на оба вопроса «да», то возможно, разработка с нуля не стоила потраченных на неё денег.
§ recommendations.scope.bus.everyHasOne.title
Bus factor = 1
§ recommendations.scope.bus.everyHasOne.description
В большинство фич погружен один человек.
Надо переключать людей.
# Почему это плохо:
- если сотрудники будут увольняться, будет трудно продолжить их работу;
- невозможно контролировать качество его кода;
# Как делается выборка:
- более 80% коммитов в фичу делает один человек;
- проект имеет более 60% таких фичей;
§ recommendations.scope.bus.oneMaintainer
в фичи погружен один человек.
# Почему это плохо:
- если он уволится, будет трудно продолжить разработку;
- снижается качество code-review;
- трудно запараллелить разработку при необходимости;
# Как делается выборка:
- более 80% коммитов в фичу сделал один человек;
§ recommendations.scope.types.process.title
Плохие процессы
§ recommendations.scope.types.process.description
Большинство фич содержат один тип задач.
§ recommendations.scope.types.one
фичи содержат один тип задач.
§ recommendations.scope.types.common
Возможно, разработчики неправильно подписывают коммиты или менеджер заводит один и тот же тип задач.
# Почему это важно:
- невозможно передать поддержку другой команде;
- невозможно выпустить "коробочную" версию;
- сильная зависимость от конкретных разработчиков;
- большое количество ошибок и низкое качество кода;
- вероятное замедление разработки в будущем;
# В чём ошибка менеджера:
- взгляд на продукт, только с позиции «работающей демки»;
# Что должно быть:
- тесты;
- ошибки (выявленные по результатам тестов);
- рефакторинг (т.к. архитектура может измениться);
- документация;
- правки стиля (как результат опроса фокус-группы);
§ recommendations.scope.plan.title
Постройте долгосрочный план
§ recommendations.scope.plan.description
с учетом архитектуры.
При том опираться этот план должен сразу на самые трудные задачи.
# Почему отсутствие плана плохо:
- сотрудники делают минимально работающую версию, не закладывая точки расширения. После этого пишется не масштабируемый код, который тормозит следующие фичи;
# В чём ошибка менеджера:
- он не показал, как продукт будет развиваться далее и в каких точках будет рост;
# Как должно быть:
- составляется глобальный план развития продукта;
- составляется глобальный план развития архитектуры (с разработчиками и DBA);
- на уровне схем сразу проговариваются моменты, которые могут сильно измениться;
§ recommendations.scope.cost.title
Оцените инвестиции в фичу
§ recommendations.scope.cost.description
с количеством потенциальной прибыли.
Фичи которые дорого стоят в разработке, но приносят мало прибыли, возможно, стоит отложить или вообще отменить. Это сделает проект более коммерчески успешным.
§ recommendations.author.lotOfLazy
пишет слишком мало кода.
# Может уволить?
- он тимлид, архитектор, аналитик?
- это его основной проект?
- есть какие-то зависимости от него?
# Почему нет смысла исправлять
Суммарные затраты на разработчика уже больше чем прибыль от его работы.
Если мы считаем, что объективных помех его работе не было, то человек либо не хочет работать вообще, либо работает на двух проектах одновременно.
Увольнение и замена новым сотрудником выглядит оправданным с точки зрения общей статистики.
§ recommendations.author.manyLazy
пишет мало кода. Нужно взять на контроль.
# Как делается выборка:
- на тестовых выборках хороший программист пишет код больше 80% времени;
- в данном случае показатель от 60% до 80%;
# Как контролировать:
- дробить задачи на 1..2 дня;
- каждый день спрашивать статус;
- убедиться, что задачи хорошо расписаны и готовы к началу разработки;
- устроить парное программирование, чтобы проверить фактическую скорость;
§ recommendations.author.oneTypeMans
получает слишком однообразные задачи по типу. Может выгореть.
# Почему это важно:
- если сотрудник выгорит, его скорость работы снизится;
- замедляется профессиональный рост;
- повышается вероятность увольнения;
# Как делается выборка:
- для каждого коммита определятся тип задачи;
- если больше 70% задач одного типа, значит человек делает одно и тоже;
§ recommendations.author.workToday.title: Работает $1
§ recommendations.author.workToday.description
над проектом в данный момент.
# Состав:
- $1;
# Почему именно они:
- рабочих дней более 50%;
- работали в течении последних 30 дней;
§ recommendations.author.dismissed.title: Уволилось $1
§ recommendations.author.dismissed.description
или работало короткий промежуток времени.
# Состав:
- $1;
# Почему именно они:
- работали в нормальном ритме (видимо, это их основной репозиторий);
- за последний месяц не было ни одного коммита;
- отпуск обычно 14 дней (их отсутствие не похоже на отпуск);
§ recommendations.author.staff.title: Помогают $1
§ recommendations.author.staff.description
Люди другой специализации, которые что-либо коммитили.
# Состав:
- $1;
# Почему именно они:
- это не open-source проект;
- рабочих дней менее 15% от общего числа;
- изменяют примерно одни и те же файлы;
§ recommendations.author.projectType.openSource.title
Открытый проект
§ recommendations.author.projectType.openSource.description
пять дней в неделю тут не работают.
Проект может быть и закрытым, просто такой темп работы обычно у открытых библиотек на GitHub.
# Метод оценки:
- берется статистика по всем активным разработчикам;
- подсчитывается среднее число дней работы и без коммитов;
- у open-source библиотек рабочих дней обычно максимум 15..20%;
# Последствия
Для проектов, где работа не постоянна, нет смысла во многих показателях. Поэтому показатели без коммитов, скорости и т.п. будут скрыты.
Как правило, оценку таких проектов делают перед началом разработки своей закрытой версии. Самые интересные показатели в этом случае вероятная стоимость и суммарное время на разработку.
§ recommendations.author.projectType.easy.title
Слабая загрузка
§ recommendations.author.projectType.easy.description
слишком много дней без коммитов. Нужно понять почему команда не пишет код.
# Метод оценки:
- берется статистика по всем активным разработчикам;
- подсчитывается среднее число дней работы и без коммитов;
- загрузка считается слабой, если процент без коммитов от 5% до 20%;
# Возможные причины:
- фактически нет задач;
- задачи есть, но хорошо ложатся на текущую архитектуру;
- разработчиков отвлекают совещаниями;
- команда не работает;
# Варианты решения:
- обсудить проблему с командой;
- уменьшить гранулярность задач, чтобы за день можно было успеть сделать одну или две задачи;
- ввести ежедневные совещания, чтобы проверять движение задач по статусу;
- устроить сеансы парного программирования, чтобы убедиться, что разработчик может работать быстрее;
§ recommendations.author.manager.title
Обозначьте дедлайны
§ recommendations.author.manager.description
У любой задачи должен быть чёткий дедлайн.
Это позволит не затягивать её выполнение на несколько дней или недель.
# Какие показатели стоит проверить:
- количество дней на одну задачу, которое тратит работник;
- количество дней ожидания влития PR (страница статистики по PR);
§ recommendations.author.shorTalk.title
Проводите ежедневные совещания
§ recommendations.author.shorTalk.description
они помогают быть в курсе проекта.
Не растягивайте их отвлекаясь на посторонние темы.
# На какие вопросы должен ответить сотрудник:
- что было сделано;
- что будет сделано;
- есть ли какие-либо проблемы;
# Следует обрывать монолог, если:
- начинают подробно описывать мелкие детали, которые не важны;
- уводят диалог в сторону, от первоначального плана;
# Почему это важно:
Часто сотрудник, который ничего не делает, старается уйти от ответа. Для этого он рассказывает кучу ненужных подробностей свой работы. Это позволяет усыпить внимание участников и растянуть время ответа. Создается ощущение что он чем-то занят, хотя по факту работы не было.
§ recommendations.author.ipr.title
Составьте план обучения
§ recommendations.author.ipr.description
на каждого сотрудника.
*Индивидуальный план обучения* это список целей и задач, которые помогают человеку развиваться в определенной области.
# Как составить план:
- составить матрицу компетенций;
- определить по каким компетенциям меньше всего знаний и опыта;
- узнать какие из этих компетенций интересны сотруднику;
- придумать 3..5 целей в рамках каждой такой компетенции на полпостороние года или год;
- каждый месяц пытаться сделать что-либо для достижения одной цели;
- каждый месяц напоминать об общем плане достижения этих целей;
# Нужен ли план руководителю?
Да, руководитель так же должен составить план на себя. Если нет вышестоящего руководителя, то он должен проверять сам себя.
# Почему это важно:
- сотрудники становятся более лояльны к компании;
- за теже деньги вы получаете более квалифицированные кадры;
§ recommendations.author.oneToOne.title
Проводите 1-1 каждый месяц
§ recommendations.author.oneToOne.description
это поможет выявить проблемы на ранней стадии.
*One-to-one* это регулярные личные встречи руководителя с подчиненным. На таких встречах обычно обсуждают всё, что важно для сотрудника, что его волнует, и то, чем он может поделиться с руководителем только наедине.
# Почему это важно:
- легко выяснить, кто из сотрудников перегружен, а у кого есть свободное время;
- можно предотвратить выгорание сотрудника;
- можно получить быструю обратную связь о процессах, которые вы можете не замечать;
- формируется доверительное отношение, сотрудники становятся более лояльны к компании;
- повышается мотивация и вовлеченность сотрудников;
§ recommendations.author.club.title
Ходите в бар
§ recommendations.author.club.description
один раз в месяц или два.
Это поможет выстроить неформальную коммуникацию в коллективе и сплотить команду, даже если общение будет сжатым.
# Почему это важно:
- можно получить быструю обратную связь о процессах, которые вы можете не замечать;
- формируется доверительное отношение, сотрудники становятся более лояльны к компании;
- повышается вовлеченность сотрудников;
§ recommendations.hour.onlyWork.title: Выходных тут нет
§ recommendations.hour.onlyWork.description: Вероятно, стоит уволить менеджера проекта.
§ recommendations.hour.weekends.title: Работа на выходных
§ recommendations.hour.weekends.description: Вероятно, стоит проверить менеджера проекта.
§ recommendations.hour.easy.title: Бывают проблемы
§ recommendations.hour.easy.description: Вероятно, бывают завалы и приходится работать на выходных.
§ recommendations.week.lazyDays.down.title: Стало меньше прогулов
§ recommendations.week.lazyDays.down.description: за последние три недели этот показатель упал
§ recommendations.week.lazyDays.up.title: Стало больше прогулов
§ recommendations.week.lazyDays.up.description: нет задач или нужен более жесткий контроль
§ recommendations.week.notWork.title: Стабильно не дорабатывает
§ recommendations.week.notWork.description: т.к. каждую неделю пишет код не 100% времени
§ recommendations.week.upWork.title: Стабильно перерабатывает
§ recommendations.week.upWork.description: т.к. каждую неделю пишет код в выходные дни
§ recommendations.week.task.up.title: Растёт производительность
§ recommendations.week.task.up.description: или задачи стали слишком мелкие. Нужно проверить. Если гранулярность та же - закрепить результат.
§ recommendations.week.task.lazyMaintainer.description: стабильный лидер по прогулам. Уволить?
§ recommendations.week.task.down.title: Падает производительность
§ recommendations.week.task.down.description
или задачи хуже разбивают. Нужно проверить. Если гранулярность та же - взять на контроль.
# Метод оценки:
- количество задач в день, над которыми работают, на протяжении последних трех недель стабильно падает.
# Возможные ошибки:
- задачи могли быть сложнее, чем казались;
- задачи могли иметь большой объём работы (нужно проверить количество изменений, падают они или нет за этот же период)
§ recommendations.type.everyHasOne.title: Не подписывают тип задачи
§ recommendations.type.everyHasOne.description: большинство типов задач делает один человек.
§ recommendations.type.oneMaintainer.title: Узкая специализация
§ recommendations.type.oneMaintainer.description
большинство задач одного типа делают одни и те же люди.
# Типы задач:
§ recommendations.type.common
# Возможно, это не так
Нужно убедиться, что остальные сотрудники верно подписывают коммиты.
Шаги, которые помогут это сделать:
- настроить пре-коммит проверку для commit message;
- объяснить команде, что нужно указывать тип;
- проверить в новых ветках, что сотрудники следуют правилу;
# Если это действительно так
Вы настроили проверки и убедились что один и тот же сотрудник, делает задачи одного и того же типа.
Почему это плохо:
- его увольнение остановит целую пачку процессов;
- уменьшается компетенция остальных членов команды;
- трудно верхнеуровнево понять его правки;
Как это исправить:
- распределять разные типы задач равномерно;
- менять область работы (тесты, документация, ошибки) между сотрудниками через спринт;
§ recommendations.type.fewTypes.title
Это локальный продукт
§ recommendations.type.fewTypes.description
для конкретного заказчика или проблемы.
# Какие признаки есть у «глобального» продукта:
- локализация;
- документация;
- большой объём тестов;
- визуальная кастомизация;
- рефакторинг узких мест;
- и т.п.
# Почему этот продукт выглядит как «локальный»:
- у каждого «глобального» признака будет перевес по своему типу задач;
- чем больше «глобальных» признаков, тем больше вероятность «глобального» продукта;
В данном случае мы видим небольшое число типов, а следовательно, скорее всего есть недоработки, мешающие легко масштабировать продукт на мировой рынок и продавать его в других странах.
# Возможно, это не так
По типам файлов мы можем предположить тип программы (сайт, серверное приложение, DevOps скрипты и т.д.). Для frontend приложения наша гипотеза будет более верной, чем для DevOps-скриптов, которые могут быть лишь микро-модулем инициализации.
§ recommendations.type.diff.title
Разбейте лидирующий тип на подтипы
§ recommendations.type.diff.description
для детализации ошибок.
Как правило, тип задач с меткой «исправление ошибок» является лидирующим. Это делает статистику слабо-детализированной.
*Если у вас произошла такая ситуация*, вы можете разбить этот тип на подтипы (например, по месту обнаружения).
Рассмотрим несколько вариантов подтипов:
- fix_dev (ошибка выявленная в процессе разработки);
- fix_test (ошибка выявленная в процессе тестирования);
- fix (ошибка выявленная в проде);
§ recommendations.type.buddy.title
Копите мелкие задачи
§ recommendations.type.buddy.description
для новых сотрудников.
# Если задача:
- не важная;
- не большая;
- не требует сильного погружения в контекст;
- больше про рефакторинг, чем про новый код;
# Положите её в backlog с меткой «для новичков».
Когда придёт новый сотрудник, вы сможете моментально достать ему пачку небольших и разнообразных по типу задач, для ознакомления с проектом.
Также, если у вас будет застой в работе, вы сможете доставать по одной такой мелкой задаче из backlog-а.
`;

View file

@ -0,0 +1,27 @@
export default `
§ page.settings.document.title: Настройки отображения
§ page.settings.document.name: Заголовок страницы
§ page.settings.document.language: Язык интерфейса
§ page.settings.links.title: Префиксы ссылок
§ page.settings.links.task: Для номеров задач
§ page.settings.links.pr: Для PR
§ page.settings.user.title: Индивидуальные настройки
§ page.settings.user.notFound: Индивидуальных настроек нет. Данные по всем сотрудникам вычисляются по общим параметрам.
§ page.settings.user.subTitle: Дополнение к трудовому договору $1
§ page.settings.user.from: Дата начала действия
§ page.settings.mailmap: Настройки .mailmap
§ page.settings.common.title: Общие данные по зарплате
§ page.settings.common.type.title: Тип работы над проектом
§ page.settings.common.type.full: Полная занятость
§ page.settings.common.type.part: Проектная работа
§ page.settings.common.salary: Зарплата в месяц
§ page.settings.common.currency: Валюта
§ page.settings.common.workDaysInYear: Количество рабочих дней в году
§ page.settings.common.vacationDaysInYear: Количество дней отпуска в год
§ page.settings.common.workDaysInWeek: Рабочие дни
§ page.settings.form.save: Сохранить
§ page.settings.form.cancel: Отмена
§ page.settings.form.remove: Удалить
§ page.settings.form.addEmployee: Добавить сотрудника
§ page.settings.form.addContract: Добавить трудовой договор
`;