This commit is contained in:
parent
a45afa62b8
commit
b3f2e41c7d
6 changed files with 151 additions and 22 deletions
62
data/works/eng.md
Normal file
62
data/works/eng.md
Normal 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
60
data/works/rus.md
Normal 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)
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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" }),
|
||||||
|
|
Loading…
Reference in a new issue