← Назад к вопросам

Какие технологии использовал в последних проектах?

1.3 Junior🔥 171 комментариев
#Опыт работы и проекты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Tech Stack в последних проектах

Проект 1: Аналитический слой для SaaS платформы (2024-2025)

Контекст

Средняя SaaS компания с ~50K активных пользователей. Задача: создать централизованное хранилище данных и аналитические витрины.

Использованные технологии

Database & Data Warehouse:

  • PostgreSQL — основная БД приложения
  • BigQuery — хранилище данных (выбрали за простоту и масштабируемость)
  • Reason: бюджет ограничен, но нужна масштабируемость

ETL & Pipelines:

# Используем dbt (Data Build Tool) для трансформаций
# Структура проекта dbt:
# models/
#   staging/  — очистка сырых данных
#   marts/    — бизнес-витрины
#   intermediate/ — промежуточные таблицы

# Пример модели dbt (models/marts/fct_orders.sql)
SELECT 
    o.order_id,
    o.user_id,
    o.created_at,
    o.total_amount,
    COUNT(oi.item_id) as items_count,
    u.country,
    u.signup_date
FROM {{ ref('stg_orders') }} o
JOIN {{ ref('stg_order_items') }} oi ON o.order_id = oi.order_id
JOIN {{ ref('dim_users') }} u ON o.user_id = u.user_id

Data Pipeline Orchestration:

  • Apache Airflow — планирование DAG'ов (ежедневные и еженедельные синхронизации)
  • GCP Cloud Functions для event-driven pipeline'ов

Пример DAG:

from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta

default_args = {
    'owner': 'analytics',
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

with DAG('dbt_daily_refresh', default_args=default_args, schedule_interval='0 4 * * *') as dag:
    
    dbt_run = BashOperator(
        task_id='dbt_run',
        bash_command='dbt run --select tag:daily --project-dir /opt/dbt'
    )
    
    dbt_test = BashOperator(
        task_id='dbt_test',
        bash_command='dbt test --project-dir /opt/dbt'
    )
    
    dbt_run >> dbt_test

BI & Visualization:

  • Looker — основной инструмент для дашбордов и отчётов
  • SQL Derived Tables для расчётов в Looker
  • Tableau для ad-hoc анализов и экспорта

Пример Looker dashboard:

LookFile → Connected to BigQuery views
Dimensions: time, user_segment, product_category
Measures: revenue, order_count, average_order_value
Filters: date_range, region, user_cohort

Data Quality & Validation:

  • Great Expectations — для проверки качества данных
import great_expectations as ge

# Валидация данных перед загрузкой в витрины
df = ge.dataset.PandasDataset(orders_data)
df.expect_column_values_to_not_be_null('order_id')
df.expect_column_values_to_be_of_type('created_at', 'datetime64')
df.expect_column_values_to_be_between('total_amount', 0, 100000)

results = df.validate()
if not results['success']:
    send_slack_alert(f"Data quality issue: {results}")

Version Control & Collaboration:

  • Git (GitHub) — все SQL, dbt, Python в репозитории
  • Code review перед деплоем
  • dbt docs для документации моделей

Проект 2: A/B Testing Platform (2023-2024)

Контекст

Мобильное приложение с 500K DAU. Нужно было создать инфраструктуру для экспериментов и анализа.

Используемые технологии

Event Tracking & Collection:

  • Amplitude (третий инструмент) — сбор событий из приложения
  • Kafka (в backend) — streaming для real-time событий
  • Custom Python SDK для трекирования

Analysis & Statistics:

  • Python — основной язык анализа
import pandas as pd
import numpy as np
from scipy import stats

# Загрузка данных из Amplitude API
df_test = pd.read_csv('s3://bucket/amplitude_export.csv')
df_control = df_test[df_test['experiment_group'] == 'control']
df_variant = df_test[df_test['experiment_group'] == 'variant']

# t-тест для проверки разницы конверсии
conversion_control = df_control['converted'].sum() / len(df_control)
conversion_variant = df_variant['converted'].sum() / len(df_variant)

t_stat, p_value = stats.ttest_ind(
    df_control['converted'],
    df_variant['converted']
)

print(f"Control: {conversion_control:.2%}")
print(f"Variant: {conversion_variant:.2%}")
print(f"P-value: {p_value:.4f}")
print(f"Statistically significant: {p_value < 0.05}")

# Confidence interval
from scipy.stats import binom
ci_control = binom.interval(0.95, len(df_control), conversion_control)
ci_variant = binom.interval(0.95, len(df_variant), conversion_variant)
print(f"CI Control: {ci_control}")
print(f"CI Variant: {ci_variant}")

Jupyter Notebooks для анализа и визуализации

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style='whitegrid')
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# Plot конверсии по дням
df.groupby(['day', 'experiment_group'])['converted'].mean().unstack().plot(ax=axes[0, 0])
axes[0, 0].set_title('Conversion Rate Over Time')

# Plot когорт по retention
retention_data = df.groupby('cohort')['day_retained'].sum()
retention_data.plot(kind='bar', ax=axes[0, 1])
axes[0, 1].set_title('Retention by Cohort')

plt.tight_layout()
plt.savefig('experiment_analysis.png', dpi=300)

Metabase — для внутренних отчётов

-- Native SQL query в Metabase
SELECT 
    DATE(event_time) as event_date,
    experiment_group,
    COUNT(*) as event_count,
    COUNT(DISTINCT user_id) as unique_users,
    SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) as conversions,
    ROUND(100.0 * SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) / COUNT(*), 2) as conversion_rate
FROM events
WHERE experiment_id = {{experiment_id}}
GROUP BY 1, 2
ORDER BY 1 DESC;

Проект 3: Cohort & Retention Analysis (2023)

Контекст

Улучшение retention в приложении для обучения. Нужна была детальная когортная аналитика.

Используемые технологии

Data Preparation:

  • Pandas — очистка и подготовка данных
  • NumPy — вычисления
import pandas as pd

# Построение когортной таблицы
df['cohort'] = df.groupby('user_id')['first_session_date'].transform('min')
df['cohort'] = pd.to_datetime(df['cohort']).dt.to_period('W')  # По неделям
df['activity_date'] = pd.to_datetime(df['activity_date']).dt.to_period('W')
df['period_number'] = (df['activity_date'] - df['cohort']).apply(lambda x: x.n)

# Создание матрицы когорт
cohort_data = df.groupby(['cohort', 'period_number'])['user_id'].nunique()
cohort_pivot = cohort_data.unstack(fill_value=0)

# Нормализация (процент от начальной когорты)
cohort_percent = cohort_pivot.divide(cohort_pivot.iloc[:, 0], axis=0) * 100
print(cohort_percent)

Visualization:

  • Matplotlib + Seaborn для static графиков
  • Plotly для interactive charts
import plotly.graph_objects as go

fig = go.Figure(data=
    go.Heatmap(z=cohort_percent.values, 
               x=cohort_percent.columns,
               y=cohort_percent.index.astype(str),
               colorscale='Viridis'))

fig.update_layout(
    title='Weekly Cohort Retention (%)',
    xaxis_title='Week Since Signup',
    yaxis_title='Cohort'
)
fig.show()

Проект 4: SQL-Heavy Analytics (текущий)

Контекст

Маркетплейс с жёсткими требованиями по производительности. Нужна была оптимизированная аналитика.

Технологии

Advanced SQL:

-- Window functions для расчёта running totals
SELECT 
    user_id,
    order_date,
    order_amount,
    SUM(order_amount) OVER (PARTITION BY user_id ORDER BY order_date) as cumulative_amount,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date) as order_number,
    RANK() OVER (ORDER BY order_amount DESC) as amount_rank
FROM orders;

-- Recursive CTE для иерархии категорий
WITH RECURSIVE categories_tree AS (
    SELECT id, name, parent_id, 0 as level
    FROM categories
    WHERE parent_id IS NULL
    
    UNION ALL
    
    SELECT c.id, c.name, c.parent_id, ct.level + 1
    FROM categories c
    JOIN categories_tree ct ON c.parent_id = ct.id
)
SELECT * FROM categories_tree;

-- LATERAL join для top-N per group
SELECT u.user_id, u.username, o.*
FROM users u
CROSS JOIN LATERAL (
    SELECT order_id, order_date, amount
    FROM orders
    WHERE user_id = u.user_id
    ORDER BY order_date DESC
    LIMIT 5
) o;

Query Optimization:

  • EXPLAIN ANALYZE для профилирования
  • Индексы (B-tree, HASH, GiST)
  • Partitioning по дате для больших таблиц
-- Создание партиционированной таблицы
CREATE TABLE orders_partitioned (
    order_id BIGINT,
    user_id INT,
    created_at TIMESTAMP,
    amount DECIMAL
) PARTITION BY RANGE (DATE(created_at));

CREATE TABLE orders_2024_q1 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

Мой Tech Stack Summary

КатегорияОсновнойАльтернатива
DatabasePostgreSQLBigQuery, Snowflake
WarehouseBigQueryRedshift, Snowflake
ETLdbtAirflow, Prefect
BI ToolLookerTableau, Metabase
PythonPandas, NumPy, ScipyPolars, DuckDB
VisualizationMatplotlib, Seaborn, PlotlyAltair, Bokeh
NotebooksJupyterGoogle Colab
Version ControlGit-
DocumentationMarkdown, dbt docsNotion, Confluence

Новое, что изучаю

  • DuckDB — embedded analytics database (очень перспективно)
  • Polars — быстрая альтернатива Pandas
  • DBT Cloud — managed dbt окружение
  • Syntax для streaming analytics

Этот стек позволяет мне работать от сбора данных до insights, и я готов быстро адаптироваться к новым инструментам.