import { getLang, initLangToggle } from './i18n.js'; const DATA = { ru: { name: 'Гаммель Дмитрий', title: 'PHP-разработчик (Backend, Middle+/Senior)', tagline: 'От электрического сигнала до строчки кода.', statusLabel: 'STATUS: OPEN TO WORK', aboutHeading: 'cat about.txt', about: [ 'PHP-разработчик с 6-летним коммерческим опытом, специализация — backend, сложные запросы к базам данных, работа с legacy-кодом. Прошёл путь от рядового разработчика до архитектурных и лидерских задач: спроектировал аналитический контур на ClickHouse, ускоривший формирование отчётности в 15-20 раз, неофициально возглавлял разработку модуля документооборота в банковской IT-инфраструктуре, вырос от специалиста без опыта в PHP до фактического руководителя команды за 3 месяца работы в digital-агентстве.', 'Разносторонний технический бэкграунд: начинал с электротехники и АСУТП, писал управляющий софт для автоматизированных систем — например, для фонтана, который до сих пор работает в центре Кургана под моей программой. Такой путь даёт понимание логики «от электрического сигнала до строчки кода» — это помогает быстро разбираться в сложных legacy-системах и нестандартных задачах.', 'Разностороннее образование — от электротехники до начального музыкального и театрального — помогает находить нестандартные решения и легко находить общий язык с людьми разного склада.', ], experienceHeading: 'ls -la experience/', experience: [ { period: 'март 2026 — настоящее время', duration: '5 месяцев', location: 'Екатеринбург', role: 'Программист АСУТП и КИПиА', company: 'Уралэнергоаква', bullets: ['Временный период вне основной специальности после завершения проекта в ЭТП ГПБ. Продолжаю развиваться как PHP-разработчик, активно ищу позицию по профилю backend-разработки.'], }, { period: 'июль 2022 — март 2026', duration: '3 года 9 месяцев', location: 'Екатеринбург', role: 'PHP-разработчик', company: 'ООО «ЭТП ГПБ» (дочернее АО «Газпромбанк»)', bullets: [ 'Разрабатывал и поддерживал внутреннюю систему электронного документооборота для согласования и контроля исполнения договоров.', 'Поддерживал и развивал legacy-проект на Zend Framework, участвовал в архитектурном переходе на Symfony; PHP 7.4 → 8.0.', 'Переписывал построители запросов на «чистый» SQL с оптимизацией под PostgreSQL, внедрял сервисный слой архитектуры.', 'Спроектировал и реализовал аналитический контур отчётности на ClickHouse — сократил время формирования отчётов с 3–4 минут до 10–15 секунд.', 'Реализовал интеграции с внутренними банковскими сервисами, включая проверку электронной подписи и машиночитаемых доверенностей.', 'Работал с очередями сообщений (RabbitMQ) для асинхронной обработки задач.', 'Неофициально возглавлял разработку нового модуля документооборота: планировал архитектуру, проводил код-ревью, довёл проект до MVP.', 'Работал по Scrum: месячные спринты, таск-трекер YouTrack, оценка задач методом Planning Poker.', ], }, { period: 'март 2021 — июль 2022', duration: '1 год 5 месяцев', location: 'удалённо', role: 'PHP-разработчик', company: 'фриланс/субподряд · kupisever.ru', bullets: [ 'Дорабатывал бэкенд действующей B2B-платформы (доска объявлений) на Yii2 в качестве субподрядчика, работал самостоятельно на удалённом проекте. Стек: PHP, Yii2, PostgreSQL, RabbitMQ, Docker.', 'Разработал модуль email-рассылок с очередями сообщений (RabbitMQ): веб-форма конструктора писем с текстовым редактором и гибкой настройкой параметров рассылки.', 'Реализовал модуль категорий объявлений — административную часть (бэкенд) и клиентское меню (фронтенд).', ], }, { period: 'июль 2020 — март 2021', duration: '9 месяцев', location: 'Курган', role: 'PHP-разработчик (с обязанностями руководителя группы)', company: 'ИстВуд', bullets: [ 'Интернет-магазины на 1С-Битрикс: вёрстка, интеграция готовых модулей, доработка бизнес-логики под задачи клиентов.', 'Реализовал интеграции с 1С (обмен товарными каталогами и заказами) и платёжными системами (эквайринг).', 'Реализовал нестандартный механизм автоматического получения и обновления каталога товаров (несколько тысяч позиций, ежесуточное обновление) для интернет-магазина на кастомном шаблоне вне типовых решений Bitrix.', 'Разработал функционал онлайн-записи на приём к врачу для сайта частной клиники; реализовал интеграцию с фискальным регистратором.', 'Участвовал во внедрении Битрикс24: настройка бизнес-процессов и цепочек согласования закупок.', 'Фактически руководил командой из 3 разработчиков: распределял задачи, контролировал качество реализации, проводил технические собеседования.', ], }, { period: 'октябрь 2019 — февраль 2020', duration: '5 месяцев', location: 'Курган', role: 'Техник по телекоммуникациям', company: 'Урал-М', bullets: ['Настройка и обслуживание систем СКУД, видеонаблюдения, радиоканальной связи; работа с 1С.'], }, { period: 'апрель 2014 — июль 2018', duration: '4 года 4 месяца', location: 'Курган', role: 'Техник-электрик', company: 'Кирпичный завод, Мясокомбинат, Хлебозавод', bullets: ['Электромонтажные и наладочные работы на производственных предприятиях.'], }, ], skillsHeading: 'skills --list', skillGroups: [ { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'ООП', 'Go (изучаю)'] }, { title: 'electrical / automation', items: ['АСУТП', 'КИПиА', 'СКУД', 'Видеонаблюдение', 'Радиоканальная связь', 'Электромонтаж', '1С'] }, { title: 'soft', items: ['Оптимизация SQL-запросов', 'Обучение и адаптация junior-разработчиков', 'Быстрая обучаемость'] }, ], educationHeading: 'cat education.txt', education: [ { year: '2013', degree: 'Неоконченное высшее', school: 'Тюменский государственный нефтегазовый университет (ТюмГНГУ)', detail: 'Институт кибернетики, информатики и связи, Электроэнергетика и электротехника' }, { year: '2011', degree: 'Свидетельство о квалификации «Электромонтёр 3 разряда»', school: 'ФГБОУ ВПО «Тюменский государственный университет»', detail: '' }, ], contactHeading: 'cat contact.txt', contact: { email: 'cactozzz93@gmail.com', telegram: 't.me/Cactozz', telegramUrl: 'https://t.me/Cactozz' }, }, en: { name: 'Dmitry Gammel', title: 'PHP Developer (Backend, Middle+/Senior)', tagline: 'From electrical signal to line of code.', statusLabel: 'STATUS: OPEN TO WORK', aboutHeading: 'cat about.txt', about: [ "PHP developer with 6 years of commercial experience, specializing in backend: complex database queries, legacy code, architecture. Grew from a line developer into architecture and leadership work — designed a ClickHouse analytics pipeline that sped up reporting 15-20x, informally led a new document-workflow module in a bank's IT infrastructure, and went from a PHP beginner to de facto team lead within 3 months at a digital agency.", "Broad technical background: started in electrical engineering and industrial automation (ACS/KIPiA), writing control software for automated systems — including a fountain that still runs in the center of Kurgan on my program. That path gives an understanding of the full chain, from electrical signal to line of code, which helps me get up to speed fast in complex legacy systems and unfamiliar problems.", 'A varied education — from electrical engineering to early music and theater — helps find unconventional solutions and get along with people of very different backgrounds.', ], experienceHeading: 'ls -la experience/', experience: [ { period: 'Mar 2026 — present', duration: '5 months', location: 'Yekaterinburg', role: 'ACS/KIPiA Programmer (industrial automation)', company: 'Uralenergoakva', bullets: ["A temporary role outside my core specialty after wrapping up the ETP GPB project. Keep growing as a PHP developer and actively looking for a backend position."], }, { period: 'Jul 2022 — Mar 2026', duration: '3 years 9 months', location: 'Yekaterinburg', role: 'PHP Developer', company: 'ETP GPB LLC (subsidiary of Gazprombank)', bullets: [ 'Built and maintained an internal document-workflow system for contract approval and execution tracking.', 'Maintained a legacy Zend Framework project and took part in the architectural move to Symfony; PHP 7.4 → 8.0.', 'Rewrote query builders as raw SQL optimized for PostgreSQL, introduced a service-layer architecture.', 'Designed and built a ClickHouse analytics pipeline — cut report generation time from 3–4 minutes to 10–15 seconds.', 'Built integrations with internal banking services, including e-signature and machine-readable power-of-attorney verification.', 'Worked with message queues (RabbitMQ) for async task processing.', 'Informally led development of a new document-workflow module: planned the architecture, ran code review, took it to MVP.', 'Worked in Scrum: monthly sprints, YouTrack, Planning Poker estimation.', ], }, { period: 'Mar 2021 — Jul 2022', duration: '1 year 5 months', location: 'Remote', role: 'PHP Developer', company: 'Freelance / subcontract · kupisever.ru', bullets: [ 'Worked as a subcontractor on the backend of a live B2B classifieds platform on Yii2, working independently on a remote project. Stack: PHP, Yii2, PostgreSQL, RabbitMQ, Docker.', 'Built an email-campaign module with message queues (RabbitMQ): a web-based email builder with a text editor and flexible send settings.', 'Built the listing-categories module — both the admin backend and the client-facing menu.', ], }, { period: 'Jul 2020 — Mar 2021', duration: '9 months', location: 'Kurgan', role: 'PHP Developer (acting team lead)', company: 'IstWood', bullets: [ 'Built and maintained online stores on 1C-Bitrix: markup, module integration, business-logic customization.', 'Built integrations with 1C (catalog and order exchange) and payment systems (acquiring).', "Built a custom mechanism for automatically fetching and updating a product catalog (several thousand SKUs, daily updates) on a custom template outside Bitrix's standard tooling.", 'Built online doctor-appointment booking for a private clinic site; integrated a fiscal register for automatic receipts.', 'Took part in rolling out Bitrix24: configured business processes and procurement approval chains.', 'Acting lead of a 3-developer team: assigned tasks, reviewed quality, ran technical interviews.', ], }, { period: 'Oct 2019 — Feb 2020', duration: '5 months', location: 'Kurgan', role: 'Telecom Technician', company: 'Ural-M', bullets: ['Set up and maintained access-control, video-surveillance and radio-link systems; worked with 1C.'], }, { period: 'Apr 2014 — Jul 2018', duration: '4 years 4 months', location: 'Kurgan', role: 'Electrical Technician', company: 'Brick factory, meat plant, bakery', bullets: ['Electrical installation and commissioning work at manufacturing plants.'], }, ], skillsHeading: 'skills --list', skillGroups: [ { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'OOP', 'Go (learning)'] }, { title: 'electrical / automation', items: ['Industrial automation (ACS)', 'KIPiA', 'Access control', 'Video surveillance', 'Radio links', 'Electrical installation', '1C'] }, { title: 'soft', items: ['SQL query optimization', 'Mentoring junior developers', 'Fast learner'] }, ], educationHeading: 'cat education.txt', education: [ { year: '2013', degree: 'Incomplete higher education', school: 'Tyumen State Oil and Gas University', detail: 'Institute of Cybernetics, Informatics and Communications — Power Engineering and Electrical Engineering' }, { year: '2011', degree: 'Qualification certificate, Electrician grade 3', school: 'Tyumen State University', detail: '' }, ], contactHeading: 'cat contact.txt', contact: { email: 'cactozzz93@gmail.com', telegram: 't.me/Cactozz', telegramUrl: 'https://t.me/Cactozz' }, }, }; const ASCII_CACTUS = ` , , |\\_/| .--| |--. ( | | ) \`--| |--' | | .--| |--. ( | | ) \`--| |--' | | | | __| |__ (_________)`; function renderExperience(list) { return list .map( (job) => `
  • ${job.period} · ${job.duration} · ${job.location}

    ${job.role} — ${job.company}

  • ` ) .join(''); } function renderSkillGroups(groups) { return groups .map( (g) => `
    ${g.title}
    ` ) .join(''); } function renderEducation(list) { return list .map( (e) => `
  • ${e.year}
    ${e.degree}
    ${e.school}
    ${e.detail ? `
    ${e.detail}
    ` : ''}
  • ` ) .join(''); } function render() { const t = DATA[getLang()]; document.title = `cacto — ${t.name}, ${t.title}`; document.getElementById('resume-root').innerHTML = `
    ${t.statusLabel}

    ${t.name}

    ${t.title}

    ${t.tagline}

    01${t.aboutHeading}

    ${t.about.map((p) => `

    ${p}

    `).join('')}

    02${t.experienceHeading}

      ${renderExperience(t.experience)}

    03${t.skillsHeading}

    ${renderSkillGroups(t.skillGroups)}

    04${t.educationHeading}

    05${t.contactHeading}

    `; } render(); initLangToggle(render);