From b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Mon, 4 Jul 2022 00:15:23 +0300 Subject: [PATCH] add work page content --- data/works/eng.md | 62 ++++++++++++++++++++++++++++++++++++++++++++ data/works/rus.md | 60 ++++++++++++++++++++++++++++++++++++++++++ server.ts | 5 +++- translates/eng.ts | 6 +++++ translates/rus.ts | 6 +++++ views/pages/works.ts | 34 ++++++++++-------------- 6 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 data/works/eng.md create mode 100644 data/works/rus.md diff --git a/data/works/eng.md b/data/works/eng.md new file mode 100644 index 0000000..b0b957a --- /dev/null +++ b/data/works/eng.md @@ -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) diff --git a/data/works/rus.md b/data/works/rus.md new file mode 100644 index 0000000..7dbd1c7 --- /dev/null +++ b/data/works/rus.md @@ -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) diff --git a/server.ts b/server.ts index 85fe2ed..dcae727 100644 --- a/server.ts +++ b/server.ts @@ -92,7 +92,10 @@ async function handleGet(req: Request) { ); return createHtmlResponse(ren.render(ContentPage(ctx, res))); } 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 { return createHtmlResponse(ren.render(E404Page(ctx)), 404); } diff --git a/translates/eng.ts b/translates/eng.ts index c0ca844..384d1bc 100644 --- a/translates/eng.ts +++ b/translates/eng.ts @@ -7,4 +7,10 @@ export default { Source_code: "Source code", Page_not_found: "Page not found", Internal_server_error: "Internal server error", + Name: "Name", + Description: "Description", + Role: "Role", + Technologies: "Technologies", + Start: "Start", + Status_or_End: "Status/End", } as Translations; diff --git a/translates/rus.ts b/translates/rus.ts index 296d269..fdbd1b3 100644 --- a/translates/rus.ts +++ b/translates/rus.ts @@ -5,6 +5,12 @@ export const rus = { Source_code: "Исходный код", Page_not_found: "Страница не найдена", Internal_server_error: "Внутренняя ошибка сервера", + Name: "Название", + Description: "Описание", + Role: "Роль", + Technologies: "Технологии", + Start: "Начало", + Status_or_End: "Статус/Окончание", }; export default rus; diff --git a/views/pages/works.ts b/views/pages/works.ts index a9892bd..613f7ae 100644 --- a/views/pages/works.ts +++ b/views/pages/works.ts @@ -9,25 +9,26 @@ const tr = E.bind(null, "tr", []); const td = E.bind(null, "td", []); const th = E.bind(null, "th", []); -export function WorksPage(ctx: Context): AnyNode { +export function WorksPage(ctx: Context, content: AnyNode): AnyNode { return PageLayout(ctx, [ E("div", classNames("content-width gap-v-1x5 responsive-typography"), [ + content, 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", [], [ E("thead", [], [ tr([ - th("Name"), - th("Description"), - th("Role"), - th("Stack"), - th("Start/End"), - th("Status"), + th(ctx.tr.Name), + th(ctx.tr.Description), + th(ctx.tr.Role), + th(ctx.tr.Technologies), + th(ctx.tr.Start), + th(ctx.tr.Status_or_End), ]), ]), E( @@ -39,22 +40,14 @@ function ChronologicalWorksTable(works: Work[]): AnyNode { td(work.description), td(work.roles.join(", ")), td(work.technologies.join(", ")), - td(renderDates(work.startDate, work.endDate)), - td(work.statuses.join(", ")), + td(work.startDate), + td(work.endDate ? work.endDate : (work.statuses ?? []).join(", ")), ]); }), ), ]); } -function renderDates(startDate: string, endDate?: string) { - if (endDate) { - return `${startDate}-${endDate}`; - } - - return startDate; -} - interface Work { name: AnyNode; description: string; @@ -63,7 +56,7 @@ interface Work { // TODO: use Date instead of string startDate: string; endDate?: string; - statuses: Status[]; + statuses?: Status[]; } enum Role { @@ -300,7 +293,6 @@ const CHRONOLOGICAL_WORKS: Work[] = [ ], startDate: "2018", endDate: "2019", - statuses: [Status.AsIs], }, { name: Link("Master Progress", { href: "https://masterprogress.ru" }),