add work page content
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Dmitriy Pleshevskiy 2022-07-04 00:15:23 +03:00
parent a45afa62b8
commit b3f2e41c7d
Signed by: pleshevskiy
GPG key ID: 1B59187B161C0215
6 changed files with 151 additions and 22 deletions

62
data/works/eng.md Normal file
View file

@ -0,0 +1,62 @@
### Highlighted working experience
#### Binary Management
- Dates: August 2018 currently
- Roles: Lead Fullstack Developer, Team Lead, Architect
Development of a project management tool for interior designers
- Development of the GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ).
Moved database triggers to business logic. Wrote integration tests on 70% api.
- Development of the frontend (React, Antd). Formed uikit, shared components,
redesigned the page generation gathering. Completely changed work with API on
the frontend. Introduced the practice of writing integration tests using
cypress
- Completely ported the project to TypeScript. Implemented OOD for the backend
and frontend.
- As a team leader, I brought the critical chain method, the buffer method, and
the planning method to the project from the end. Helped the team get into a
rhythm to make releases each week in small batches. A couple of times I also
prepared an individual development plan for team members.
#### Core Spirit
- Dates: August 2018 - May 2020
- Role: Lead Fullstack Developer
Development of Social platform focusing on human and planetary enhancement
- Development of the REST API (Node.JS, Express, PostgreSQL) for main site and
backoffice.
- Development of an auto poster to various social networks and messengers
(Facebook, LinkedIn, Twitter, Telegram).
- Development of a neural network for automatic categorization of articles.
#### Master Progress
- Dates: May 2018 - currently (Passively maintained)
- Role: Tech Lead
Development web infrastructure of the educational center Master Progress
- Development of [the main site](https://masterprogress.ru) (Python, Flask).
- Development of [Student's cabinet](https://cabinet.masterprogress.ru) (Python,
Flask, TypeScript, React).
- Created a complete infrastructure on Drone and Docker swarm.
#### MERLION
- Dates: March 2016 May 2018
- Role: Senior Fullstack developer
In this company there were 6 considerable projects I have successfully
completed:
- optimize the creation of promotional pages (PHP, JavaScript)
- support main traditional site (PHP, JavaScript)
- development of parsing to monitor products for changes in price,
quantity/availability in stock, rating and other fields based on data from 55
websites (Node.JS, Express)
- work with neural networks for matching of goods
- development face recognition apps for Android (Java)

60
data/works/rus.md Normal file
View file

@ -0,0 +1,60 @@
### Выделенный опыт работы
#### Binary Management
- Даты: Август 2018 по настоящее время
- Роли: Lead Fullstack Developer, Team Lead, Architect
Разработка инструмента управления проектами для дизайнеров интерьера
- Разработка GraphQL API (Apollo, PostgreSQL, Redis, BullMQ). Перенес триггеры
базы данных в бизнес-логику. Написал интеграционные тесты на 70% api.
- Разработка фронтенда (React, Antd). Сформировал uikit и общие компоненты,
оптимизировал сложные и нагруженные компоненты. Полностью изменил работу с API
на фронтенде. Внедрил практику написания интеграционных тестов с помощью
cypress.
- Полностью перенес проект на TypeScript. Внедрили OOD для бэкенда и фронтенда.
- Как руководитель команды, я привнес в проект метод критической цепи, метод
буфера и метод планирования с конца. Помог команде войти в ритм, чтобы
выпускать релизы каждую неделю небольшими партиями. Я также несколько раз
составлял индивидуальный план развития для членов команды.
#### Core Spirit
- Даты: Август 2018 - May 2020
- Роль: Lead Fullstack Developer
Разработка социальной платформы, сфокусированной на улучшении человека и планеты
- Разработка REST API (Node.JS, Express, PostgreSQL) для основного сайта и
бэк-офиса.
- Разработка автопостера в различные социальные сети и мессенджеры (Facebook,
LinkedIn, Twitter, Telegram).
- Разработка нейронной сети для автоматической категоризации статей.
#### Master Progress
- Даты: Май 2018 - по настоящее время (Пассивная поддержка)
- Роль: Tech Lead
Разработка веб-инфраструктуры образовательного центра Мастер Прогресс
- Разработка [главного сайта](https://masterprogress.ru) (Python, Flask).
- Разработка [кабинета студента](https://cabinet.masterprogress.ru) (Python,
Flask, TypeScript, React).
- Создана полная инфраструктура на Drone и Docker swarm.
#### MERLION
- Dates: March 2016 May 2018
- Role: Senior Fullstack developer
В этой компании было 6 значительных проектов, которые я успешно завершил:
- Оптимизация создания рекламных страниц (PHP, JavaScript)
- Поддержка основного традиционного сайта (PHP, JavaScript)
- Разработка парсинга для мониторинга товаров на предмет изменения цены,
количества/наличия на складе, рейтинга и других полей на основе данных с 55+
сайтов (Node.js, Express)
- Работа с нейронными сетями для подбора товаров
- Разработка приложений для распознавания лиц для Android (Java)

View file

@ -92,7 +92,10 @@ async function handleGet(req: Request) {
); );
return createHtmlResponse(ren.render(ContentPage(ctx, res))); return createHtmlResponse(ren.render(ContentPage(ctx, res)));
} else if (restCtx.locPath === "/works") { } else if (restCtx.locPath === "/works") {
return createHtmlResponse(ren.render(WorksPage(ctx))); const res = par.parse(
await readMarkdownFile("data/works", ctx.lang),
);
return createHtmlResponse(ren.render(WorksPage(ctx, res)));
} else { } else {
return createHtmlResponse(ren.render(E404Page(ctx)), 404); return createHtmlResponse(ren.render(E404Page(ctx)), 404);
} }

View file

@ -7,4 +7,10 @@ export default {
Source_code: "Source code", Source_code: "Source code",
Page_not_found: "Page not found", Page_not_found: "Page not found",
Internal_server_error: "Internal server error", Internal_server_error: "Internal server error",
Name: "Name",
Description: "Description",
Role: "Role",
Technologies: "Technologies",
Start: "Start",
Status_or_End: "Status/End",
} as Translations; } as Translations;

View file

@ -5,6 +5,12 @@ export const rus = {
Source_code: "Исходный код", Source_code: "Исходный код",
Page_not_found: "Страница не найдена", Page_not_found: "Страница не найдена",
Internal_server_error: "Внутренняя ошибка сервера", Internal_server_error: "Внутренняя ошибка сервера",
Name: "Название",
Description: "Описание",
Role: "Роль",
Technologies: "Технологии",
Start: "Начало",
Status_or_End: "Статус/Окончание",
}; };
export default rus; export default rus;

View file

@ -9,25 +9,26 @@ const tr = E.bind(null, "tr", []);
const td = E.bind(null, "td", []); const td = E.bind(null, "td", []);
const th = E.bind(null, "th", []); const th = E.bind(null, "th", []);
export function WorksPage(ctx: Context): AnyNode { export function WorksPage(ctx: Context, content: AnyNode): AnyNode {
return PageLayout(ctx, [ return PageLayout(ctx, [
E("div", classNames("content-width gap-v-1x5 responsive-typography"), [ E("div", classNames("content-width gap-v-1x5 responsive-typography"), [
content,
H3(ctx.tr.Chronological), H3(ctx.tr.Chronological),
ChronologicalWorksTable(CHRONOLOGICAL_WORKS), ChronologicalWorksTable(ctx, CHRONOLOGICAL_WORKS),
]), ]),
]); ]);
} }
function ChronologicalWorksTable(works: Work[]): AnyNode { function ChronologicalWorksTable(ctx: Context, works: Work[]): AnyNode {
return E("table", [], [ return E("table", [], [
E("thead", [], [ E("thead", [], [
tr([ tr([
th("Name"), th(ctx.tr.Name),
th("Description"), th(ctx.tr.Description),
th("Role"), th(ctx.tr.Role),
th("Stack"), th(ctx.tr.Technologies),
th("Start/End"), th(ctx.tr.Start),
th("Status"), th(ctx.tr.Status_or_End),
]), ]),
]), ]),
E( E(
@ -39,22 +40,14 @@ function ChronologicalWorksTable(works: Work[]): AnyNode {
td(work.description), td(work.description),
td(work.roles.join(", ")), td(work.roles.join(", ")),
td(work.technologies.join(", ")), td(work.technologies.join(", ")),
td(renderDates(work.startDate, work.endDate)), td(work.startDate),
td(work.statuses.join(", ")), td(work.endDate ? work.endDate : (work.statuses ?? []).join(", ")),
]); ]);
}), }),
), ),
]); ]);
} }
function renderDates(startDate: string, endDate?: string) {
if (endDate) {
return `${startDate}-${endDate}`;
}
return startDate;
}
interface Work { interface Work {
name: AnyNode; name: AnyNode;
description: string; description: string;
@ -63,7 +56,7 @@ interface Work {
// TODO: use Date instead of string // TODO: use Date instead of string
startDate: string; startDate: string;
endDate?: string; endDate?: string;
statuses: Status[]; statuses?: Status[];
} }
enum Role { enum Role {
@ -300,7 +293,6 @@ const CHRONOLOGICAL_WORKS: Work[] = [
], ],
startDate: "2018", startDate: "2018",
endDate: "2019", endDate: "2019",
statuses: [Status.AsIs],
}, },
{ {
name: Link("Master Progress", { href: "https://masterprogress.ru" }), name: Link("Master Progress", { href: "https://masterprogress.ru" }),