# Побудувала на Python генератор CV, рекомендацій, портфоліо та супровідних листів на основі бази даних — 41 модуль, 10 580 рядків — що відтворює шість форматів виводу з одного джерела SQLite на 23 таблиці, зібраного ідемпотентним конвеєром із 19 кроків.

липень 2026

**Ситуація.** CV, аркуш рекомендацій, портфоліо та супровідний лист — це ті самі факти, впорядковані чотирма способами, і тримати їх як чотири документи означає робити кожне виправлення чотири рази, а зрештою не робити. Три мови множать це на три. Режим відмови полягає не в тому, що документ хибний; він у тому, що два документи розходяться, і ніщо не каже, який із них поточний.

**Завдання.** Одне джерело фактів мало виробляти кожен документ, кожною мовою, у кожному форматі, з упорядкуванням, яке вирішує код, а не той, хто останнім редагував файл.

**Дія.** Джерелом є база даних SQLite із двадцяти трьох таблиць — досягнення, посади, компанії, регіони, категорії, послуги, профілі, рекомендації, резюме, — зібрана конвеєром із дев'ятнадцяти кроків, що йде від порожнього файлу до повної бази даних однією командою. Кроки впорядковано, і кожен написано так, щоб його було безпечно повторювати, тож конвеєр можна виконати проти наявної бази даних, не дублюючи жодного рядка. Сорок один модуль Python загальним обсягом 10 580 рядків подають із неї шість вихідних форматів: HTML, PDF у двох варіантах, звичайний текст, Markdown і JSON, через шість шаблонів Jinja і вісім таблиць стилів. Залежності часу виконання втримано рівно на двох, шаблонний рушій і рендерер PDF, з тим аргументом, що генератор документів, який не вдасться встановити за п'ять років, нічого не зберіг. Націлювання є повноцінним поняттям, а не ручним редагуванням: профіль обирає, які досягнення з'являються і в якому порядку, тож документ, спрямований на один різновид читача, є запитом, а не копією.

**Результат.** Шість форматів, три мови й п'ять тем виходять з однієї бази даних, а виправлене речення виправляють один раз. Ціна в тому, що система тепер є єдиним способом виробити документ — більше немає файлу, який можна поспіхом відкрити й відредагувати, а додати мову означає додати її скрізь, перш ніж узагалі щось збереться.

---

- Роль: Python‑інженер
- Категорії: [Архітектура рішень](https://software.engineer.company/uk/categories/solution-architecture/), [Backend‑розробка](https://software.engineer.company/uk/categories/backend/), [Full‑Stack розробка](https://software.engineer.company/uk/categories/full-stack/), [Бази даних](https://software.engineer.company/uk/categories/databases/), [SQL](https://software.engineer.company/uk/categories/sql/), [Автоматизація та CI/CD](https://software.engineer.company/uk/categories/automation/), [Python](https://software.engineer.company/uk/categories/python/), [Інтернаціоналізація](https://software.engineer.company/uk/categories/i18n/)
- Послуги: [Архітектура платформи та рішень](https://software.engineer.company/uk/services/platform-architecture/), [Backend- та API‑розробка](https://software.engineer.company/uk/services/backend-development/), [Full‑Stack продуктова розробка](https://software.engineer.company/uk/services/full-stack-development/), [Інтернаціоналізація та локалізація](https://software.engineer.company/uk/services/i18n-localization/), [Проєктування та моделювання баз даних](https://software.engineer.company/uk/services/database-design/)

<https://software.engineer.company/uk/portfolio/built-a-database-driven-cv-and-portfolio-generator-144/>
