Аудит кода расчёта средних параметров зарплаты

Assert проходит для этих данных, но расчёт смешивает разные валюты и не доказывает годовой рост зарплаты. Нужны нормализация данных и явно определённые метрики.

Короткий ответ

Что ответить на собеседовании

Assert проходит для этих данных, но расчёт смешивает разные валюты и не доказывает годовой рост зарплаты. Нужны нормализация данных и явно определённые метрики.

Подробный разбор

Ответ с пояснениями

Условие

Провести ревью кода проекта, который:

  • принимает payload с информацией о сотрудниках (возраст, зарплата);

  • рассчитывает:

    • средний возраст персонала;
    • среднюю величину зарплаты;
    • среднее увеличение зарплаты по сравнению с заданными базовыми значениями;
    • сотрудника с наибольшей зарплатой;
    • сотрудника с наименьшей зарплатой;
  • проверяет корректность работы через assert.

import json
import math

payload = [
    {"id": 1, "name": "Laith", "surname": "Simmons", "age": 68, "salary": "£27888"},
    {"id": 2, "name": "Mikayla", "surname": "Henry", "age": 49, "salary": "¥67137"},
    {"id": 3, "name": "Garth", "surname": "Fields", "age": 70, "salary": "¥70472"}
]

class Data:
    def do(self, data, iage, isalary):
        average_age_increase = math.floor(
            sum(e['age'] for e in data) / len(data)
        ) - iage
        average_salary_increase = math.floor(
            sum(int(e['salary'][1:]) for e in data) / len(data)
        ) - isalary
        yearly_avg_increase = math.floor(
            average_salary_increase / average_age_increase
        )
        salaries = [int(e['salary'][1:]) for e in data]
        threshold_max = str(max(salaries))
        max_salary_person = [e for e in data if e['salary'][1:] == threshold_max]
        threshold_min = str(min(salaries))
        min_salary = [e for e in data if e['salary'][1:] == threshold_min]
        
        return json.dumps({
            'avg_age': math.floor(sum(e['age'] for e in data) / len(data)),
            'avgSalary': math.floor(
                sum(int(e['salary'][1:]) for e in data) / len(data)
            ),
            'avg_yearly_increase': yearly_avg_increase,
            'max_salary': max_salary_person,
            'min_salary': min_salary,
        })

ds = Data()
calculation_result = ds.do(payload, 20, 20000)
test_result = json.dumps({
    'avg_age': 62,
    'avgSalary': 55165,
    'avg_yearly_increase': 837,
    'max_salary': [{
        'id': 3,
        'name': 'Garth',
        'surname': 'Fields',
        'age': 70,
        'salary': '¥70472'
    }],
    'min_salary': [{
        'id': 1,
        'name': 'Laith',
        'surname': 'Simmons',
        'age': 68,
        'salary': '£27888'
    }]
})
assert calculation_result == test_result  # True

Ответ

Assert проходит для этих данных, но расчёт смешивает разные валюты и не доказывает годовой рост зарплаты. Нужны нормализация данных и явно определённые метрики.

Численно код получает avg_age=62, avgSalary=55165, avg_yearly_increase=837; максимальная сумма у Garth, минимальная у Laith. Однако фунты и иены сравниваются после удаления символа валюты — экономического смысла такое среднее не имеет.

Другие проблемы: пустой список, нулевой знаменатель, раннее округление и хрупкий разбор зарплаты срезом. Отношение разности зарплат к разности возрастов не является наблюдаемым годовым приростом без истории доходов. Возвращайте словарь с едиными именами полей, а JSON формируйте на границе API. В тестах сравнивайте структуру, проверяя также пограничные случаи и равные минимумы/максимумы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее