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)));
|
||||
} 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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" }),
|
||||
|
|
Loading…
Reference in a new issue