Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import 2024 #412

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/routes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ afup_barometre_homepage:
methods: GET
controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController
defaults:
path: /about
path: /report/2024
permanent: false

afup_barometre_form:
Expand Down
Binary file added public/reports/2024/distribution_salaire.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/reports/2024/evolution_salaire.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/reports/2024/nombre_reponse_genre.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/reports/2024/repartition_specialite.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/Campaign/Format/FormatFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public function createFromCode($code)
{
$class = '\App\Campaign\Format\Formats\Format'.$code;
if (!class_exists($class)) {
throw new \InvalidArgumentException(sprintf('Code %s invalid', $code));
throw new \InvalidArgumentException(\sprintf('Code %s invalid', $code));
}

return new $class();
Expand Down
9 changes: 9 additions & 0 deletions src/Campaign/Format/Formats/Format2024.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

declare(strict_types=1);

namespace App\Campaign\Format\Formats;

class Format2024 extends Format2023
{
}
2 changes: 1 addition & 1 deletion src/Campaign/Importer/CampaignImporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public function import(
\DateTime $startDate,
\DateTime $endDate,
$filename,
$separator = ';'
$separator = ';',
) {
$campaign = new Campaign();
$campaign
Expand Down
2 changes: 1 addition & 1 deletion src/Command/BarometreImportCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class BarometreImportCommand extends Command
{
public function __construct(
private readonly CampaignRepository $campaignRepository,
private readonly CampaignImporter $campaignImporter
private readonly CampaignImporter $campaignImporter,
) {
parent::__construct();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Enums/EnumsCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public function __construct(iterable $enums = [])
public function getEnums($alias): EnumsInterface
{
if (!isset($this->enums[$alias])) {
throw new \InvalidArgumentException(sprintf('Enums %s inconnu', $alias));
throw new \InvalidArgumentException(\sprintf('Enums %s inconnu', $alias));
}

return $this->enums[$alias];
Expand Down
23 changes: 15 additions & 8 deletions src/Enums/JobTitleEnums.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,24 @@ class JobTitleEnums extends AbstractEnums
public const SYSADMIN = 9;
public const DEVOPS = 10;

public const DEV_JUNIOR = 11;
public const DEV_CONFIRME = 12;
public const DEV_SENIOR = 13;
public const DEV_EXPERT = 14;
public const TECH_LEAD = 15;

protected array $choices = [
self::DIRECTEUR => 'Directeur et Directrice, cadre dirigeant',
self::RESPONSABLE_EQUIPE => "Cadre intermédiaire, responsable d'équipe",
self::CHEF_PROJET => 'Chef/Cheffe de projet',
self::LEAD_DEVELOPPEUR => 'Lead développeur/Lead développeuse',
self::DEV_JUNIOR => 'Développeuse / Développeur Junior',
self::DEV_CONFIRME => 'Développeuse / Développeur confirmé',
self::DEV_SENIOR => 'Développeuse / Développeur Senior',
self::DEV_EXPERT => 'Développeuse / Développeur Expert',
self::TECH_LEAD => 'Tech Lead',
self::RESPONSABLE_EQUIPE => "Responsable d'équipe",
self::CONSULTANT => 'Consultante / Consultant',
self::ARCHITECTE => 'Architecte',
self::CONSULTANT => 'Consultant',
self::FORMATEUR => 'Formateur/Formatrice',
self::DEVELOPPEUR => 'Développeur/Développeuse',
self::SYSADMIN => 'Sysadmin',
self::DEVOPS => 'Devops',
self::CHEF_PROJET => 'Chef/Cheffe de projet',
self::FORMATEUR => 'Formatrice / Formateur',
self::AUTRE => 'Autre',
];

Expand Down
4 changes: 4 additions & 0 deletions src/Enums/StatusEnums.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@ class StatusEnums extends AbstractEnums
public const CDI = 2;
public const FREELANCE = 3;
public const SANS_EMPLOI = 4;
public const ALTERNANCE = 5;
public const FONCTIONNAIRE = 6;

protected array $choices = [
self::CDD => 'Contrat à durée déterminée',
self::CDI => 'Contrat à durée indéterminée',
self::FREELANCE => 'Freelance / entreprise individuelle',
self::ALTERNANCE => 'Alternance / contrat pro / apprentissage',
self::FONCTIONNAIRE => 'Fonctionnaire',
self::SANS_EMPLOI => 'Sans emploi',
self::AUTRE => 'Autre',
];
Expand Down
2 changes: 1 addition & 1 deletion src/Filter/DepartmentFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ protected function getChoices()
$choices[self::ALL_BUT_PARIS] = 'Tous sauf île-de-France';

foreach (new Departments() as $number => $label) {
$choices[$number] = sprintf('%s - %s', $number, $label);
$choices[$number] = \sprintf('%s - %s', $number, $label);
}

return $choices;
Expand Down
2 changes: 1 addition & 1 deletion src/Filter/DistrictFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ protected function getChoices()
$choices = [];

foreach (new Regions() as $number => $label) {
$choices[$number] = sprintf('%s - %s', $number, $label->getLabel());
$choices[$number] = \sprintf('%s - %s', $number, $label->getLabel());
}

return $choices;
Expand Down
27 changes: 26 additions & 1 deletion src/Filter/JobTitleFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,32 @@ public function buildQuery(QueryBuilder $queryBuilder, array $values = [])
return;
}

$queryBuilder->andWhere($queryBuilder->expr()->in('response.jobTitle', $values[$this->getName()]));
$filterValue = $values[$this->getName()];

$filterValue = $this->supportOldValues($filterValue);

$queryBuilder->andWhere($queryBuilder->expr()->in('response.jobTitle', $filterValue));
}

private function supportOldValues(array $values): array
{
$mapping = [
JobTitleEnums::DEV_JUNIOR,
JobTitleEnums::DEV_CONFIRME,
JobTitleEnums::DEV_SENIOR,
JobTitleEnums::DEV_EXPERT,
];

$oldTitle = [
JobTitleEnums::DEVELOPPEUR,
JobTitleEnums::LEAD_DEVELOPPEUR,
];

if ([] !== array_intersect($values, $mapping)) {
$values = array_merge($values, $oldTitle);
}

return $values;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/Menu/MenuBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ protected function getBaseMenu()
$menu->setChildrenAttribute('class', 'nav navbar-nav');

$menu->addChild(
'menu.result2023',
'menu.result2024',
[
'route' => 'afup_barometre_campaign',
'routeParameters' => ['campaignName' => 2023],
'routeParameters' => ['campaignName' => 2024],
'routeAbsolute' => UrlGeneratorInterface::ABSOLUTE_URL,
]
);
Expand Down
4 changes: 2 additions & 2 deletions src/Query/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function __construct(Connection $connection)
*/
public function createTemporaryTable($tablename)
{
$sql = sprintf('CREATE TEMPORARY TABLE `%s` %s', $tablename, $this->getSQL());
$sql = \sprintf('CREATE TEMPORARY TABLE `%s` %s', $tablename, $this->getSQL());

$this->connection->executeStatement($sql, $this->getParameters(), $this->paramTypes);
}
Expand All @@ -40,7 +40,7 @@ public function createTemporaryTable($tablename)
*/
public function dropTemporaryTable($tablename)
{
$sql = sprintf('DROP TEMPORARY TABLE IF EXISTS `%s`', $tablename);
$sql = \sprintf('DROP TEMPORARY TABLE IF EXISTS `%s`', $tablename);

$this->connection->executeStatement($sql);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Report/AbstractReport.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ abstract class AbstractReport implements ReportInterface

public function __construct(
protected int $minResult = 10,
protected array $childReports = []
protected array $childReports = [],
) {
}

Expand Down
2 changes: 1 addition & 1 deletion src/Report/SalaryReport.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class SalaryReport extends AbstractReport
public function execute()
{
$this->queryBuilder->select('count(distinct response.id) as nbResponse');
$this->queryBuilder->addSelect(sprintf('ROUND(response.grossAnnualSalary / %s) as salarySlice', self::SLICE));
$this->queryBuilder->addSelect(\sprintf('ROUND(response.grossAnnualSalary / %s) as salarySlice', self::SLICE));
$this->queryBuilder->having('nbResponse >= :minResult');
$this->queryBuilder->setParameter('minResult', $this->minResult);
$this->queryBuilder->addGroupBy('salarySlice');
Expand Down
4 changes: 2 additions & 2 deletions src/ReportManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public function __construct(
Connection $connection,
FormInterface $form,
ReportCollection $reportCollection,
FilterCollection $filterCollection
FilterCollection $filterCollection,
) {
$this->connection = $connection;
$this->form = $form;
Expand Down Expand Up @@ -134,7 +134,7 @@ public function createBaseQueryBuilder()

$this->filterCollection->buildQuery($filterTableBuilder, $data);

$temporaryTablename = sprintf('tmp_%s', md5(serialize($data)));
$temporaryTablename = \sprintf('tmp_%s', md5(serialize($data)));
$filterTableBuilder->dropTemporaryTable($temporaryTablename);
$filterTableBuilder->createTemporaryTable($temporaryTablename);

Expand Down
129 changes: 129 additions & 0 deletions templates/Campaign/report2024.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
{% extends "layout.html.twig" %}

{% block title %}Résultats de la campagne {{ campaignName }}{% endblock %}

{% block meta %}
{{ parent() }}
<meta property="og:title" content="Baromètre des salaires du PHP - Résultats {{ campaignName }}" />
<meta property="og:type" content="article" />
<meta property="og:url" content="{{ absolute_url('/report/'~campaignName) }}" />
<meta property="og:description" content="Les résultats du baromètre des salaires en PHP {{ campaignName }} sont disponibles. Consultez les résultats de l'enquête de référence pour le milieu PHP menée par l'AFUP" />
<meta property="og:site_name" content="Baromètre des salaires - AFUP" />
{% endblock %}


{% block content %}
<div class="row report2015">
<div class="col-md-8">
<h1>Résultats de la campagne {{ campaignName }}</h1>

<p>
L’AFUP est ravie de vous présenter les résultats de son enquête effectuée en début d’année auprès d’environ 600 devs. Cette année est marquée par une stagnation des salaires, sur fond d’écart des salaires entre les hommes et les femmes ne se réduisant pas, une parité loin d’être atteinte, et Laravel qui gagne en popularité. On vous explique tout cela en détail.
</p>

<h2>A propos de la campagne 2024</h2>
<p>Comme chaque année l’AFUP effectue une enquête auprès des développeurs et développeuses PHP. Cette enquête a eu lieu du 15 avril au 15 juillet 2024.</p>
<p>Jusqu’à présent l’enquête du baromètre avait lieu de septembre à décembre et nous étions globalement satisfaits de cela. Mais nous savions que nous pouvions faire mieux, en effet nombre d’entre-vous nous ont signalé que l’enquête arrivait tard dans l’année, bien après une période d’entretiens annuels arrivant généralement en décembre et janvier. C’est une des raisons qui a poussé l’équipe du baromètre à changer la période d’enquête : cela a donc eu un impact sur le nombre de réponses, très probablement dû avec la proximité avec l'enquête précédente. Nous espérons qu'en 2025 nous atteindrons un nombre de réponses similaire à 2023. Le nombre de réponses (595 personnes) de cette enquête nous permet tout de même d’en faire des analyses intéressantes.</p>

<p>Cette année, nous n’avons pas ajouté de nouvelle question à l’enquête. Le seul changement notable et la précision sur les postes de dev, nous demandons maintenant aux répondants et répondantes s’ils/elles sont junior/confirmé/senior ou expert. Cela ne change rien pour l’analyse cette année, mais espérons en tirer des analyses de tendances intéressantes dans les prochaines années.</p>

<h2>Profil des personnes ayant répondu</h2>
<p>Les personnes ayant répondu :</p>
<ul>
<li>sont en majorité des hommes : pour 90%, les femmes étant représentées à hauteur de 9% et les personnes non binaires à 1% ;</li>
<li>ont pour l’âge médian 34 ans ;</li>
<li>sont en CDI : cela reste de loin, le statut le plus représenté avec 93% des personnes ayant un contrat de travail de ce type ;</li>
<li>dans une zone géographique à forte densité (l’Ile-de-France et la région Rhône-Alpes représentent à elles seules 44% des réponses (elles représentaient 56% des réponses en 2023)) ;</li>
<li>travaillent en majorité dans une PME (pour 82%) ;</li>
<li>utilisent en majorité Symfony (pour 70%, -5 points par rapport à l’année prochaine) ;</li>
<li>utilisent à 56% une distribution Linux ;</li>
<li>font de la veille technique chaque semaine (pour 58%) ;</li>
<li>25 % sont issues d’une reconversion ;</li>
<li>96% font du télétravail, et ces personnes le font à 34% à temps plein ;</li>
<li>19% ont suivi une formation au cours des deux dernières années, et pour 15% (-9 points) de ces derniers, cela a eu un impact sur leur rémunération ;</li>
<li>utilisent à 85% PHP 8 (+11 points)</li>
</ul>


<h1>Analyse</h1>

<h2>Une stagnation, voire une baisse des salaires</h2>

<p>Cette année, nous constatons pour la première fois depuis 10 ans une baisse des salaires sur les postes de développeur/développeuse. Là où la médiane était à 44,5k l’année dernière, elle est à 44k, cette année. Cette baisse fait suite à neuf années successives d'augmentation. Nous pouvons noter que le salaire moyen stagne pour passer de 48,3k à 48,4k. Les 10% des salaires les plus bas stagnent eux en passant de 32,9k à 33,6k.</p>

<a href="{{ absolute_url('/report/salary?filter[campaign][]='~campaignId~'&filter[job_title][]=11&filter[job_title][]=12&filter[job_title][]=13&filter[job_title][]=14') }}" class="report-image">
<img src="{{ asset('reports/2024/evolution_salaire.png') }}" alt="Évolution des salaires"/>
</a>

<h2>Toujours pas de réduction de l’écart de salaire entre les femmes et les hommes</h2>

<p>Comme tous les ans, nous étudions les écarts de salaire par genre. Malgré une augmentation constatée du salaire des femmes depuis 2023, l’écart du salaire entre les hommes et les femmes persiste et reste très élevé : il y a plus de 4k de différence pour le même poste.</p>

<p>Nous constatons une réduction de 10% du salaire entre les hommes et les femmes. En début d’année, l’INSEE a publié une étude sur l’écart des salaires dans le privée (<a href="https://www.insee.fr/fr/statistiques/7766515" title="Écart de salaire entre femmes et hommes en 2022 ">https://www.insee.fr/fr/statistiques/7766515</a>), qui calculait une réduction de 23% sur toute la population du privé. Malgré une forte différence, celle-ci semble moins importante que sur les autres métiers (mais n’en est pas moins un problème).</p>

<a href="{{ absolute_url('/report/gender?filter[campaign][]='~campaignId~'&filter[job_title][]=11&filter[job_title][]=12&filter[job_title][]=13&filter[job_title][]=14') }}" class="report-image">
<img src="{{ asset('reports/2024/evolution_salaire_moyen_genre.png') }}" alt="Évolution du salaire moyen par genre"/>
</a>

<h2>Un très long chemin vers la parité</h2>

<p>Nous pouvons constater que, pour les postes de développeur/développeuse de junior à senior, la part des hommes se réduit. Sur les trois dernières années, la réduction est de 2 points, et de 6 points sur les six dernières années. Bien que ce changement soit encourageant pour renforcer la parité dans notre secteur, sa lenteur reste regrettable : à ce rythme, l'égalité ne serait atteinte qu'aux alentours de 2055 !</p>

<a href="{{ absolute_url('/report/gender?filter[campaign][]='~campaignId~'&filter[job_title][]=11&filter[job_title][]=12&filter[job_title][]=13&filter[job_title][]=14') }}" class="report-image">
<img src="{{ asset('reports/2024/nombre_reponse_genre.png') }}" alt="Évolution du nombre de réponses par genre"/>
</a>

<h2>Le télétravail est définitivement entré dans les mœurs</h2>

<p>Malgré une légère diminution du télétravail permanent (ou 100% télétravail), qui a reculé d’un peu plus d’un point depuis 2022, 80 % des dévs interrogés continuent de pratiquer régulièrement le télétravail. La très forte hausse observée depuis 2020 fait désormais partie intégrante des habitudes professionnelles.</p>

<a href="{{ absolute_url('/report/remote_usage?filter[campaign][]='~campaignId~'&filter[job_title][]=11&filter[job_title][]=12&filter[job_title][]=13&filter[job_title][]=14') }}" class="report-image">
<img src="{{ asset('reports/2024/repartition_teletravailleurs.png') }}" alt="Évolution de la répartition des télétravailleurs"/>
</a>

<h2>La tendance Laravel en France se confirme</h2>

<p>Nous pouvons noter que maintenant 15% des devs se disent spécialistes de Laravel. C’est plus de 3 points depuis l’année dernière. En France, Symfony reste le framework de prédilection avec plus de 67% de répondantes se disant spécialistes de ce framework.</p>

<p>Depuis maintenant 2 ans nous n’avons plus aucune personne répondante spécialiste du framework Zend/Laminas. Il y a 11 ans, celui-ci représentait 22% des réponses.</p>

<p>A noter que le nombre de spécialistes Wordpress et Drupal continue de se réduire. Pour ce point nous avons pour hypothèse que la communauté touchée par l’AFUP et répondant au baromètre est généralement moins portée sur ces frameworks. Cela pourra être un axe d’amélioration des prochaines enquêtes, de tenter de mieux toucher ces communautés.</p>

<a href="{{ absolute_url('/report/speciality?filter[campaign][]='~campaignId~'&filter[job_title][]=11&filter[job_title][]=12&filter[job_title][]=13&filter[job_title][]=14') }}" class="report-image">
<img src="{{ asset('reports/2024/repartition_specialite.png') }}" alt="Évolution des spécialités"/>
</a>


<h2>A propos du baromètre</h2>

<p>Le baromètre des salaires AFUP est un projet open-source porté par des bénévoles. Nous sommes toujours à la recherche de personnes pour aider sur ce projet, que ça soit côté technique, pour le lancement de l’enquête ou l’analyse des résultats. Si vous souhaitez participer vous pouvez envoyer un message à [email protected].</p>


<h2>A propos de l’AFUP</h2>

<p>L'<a href="http://www.afup.org" title="Association Française des Utilisateurs de PHP">association française des utilisateurs de PHP</a> (AFUP) vous présentent pour la douzième année consécutive le baromètre des salaires AFUP – 2024.</p>

<p>Comme chaque année, le baromètre AFUP répond aux questions que se posent les professionnel·le·s de notre secteur :</p>
<ul>
<li>Combien gagne un·e développeur·euse débutant·e ?</li>
<li>Comment les salaires évoluent-ils avec l'expérience ?</li>
<li>Quelles sont les technos qui rapportent le plus ?</li>
<li>Dans quelles villes touche-t-on les meilleurs salaires ?</li>
</ul>

<p>Nous espérons que vous aurez une vision claire du marché après consultation de ce baromètre des salaires en PHP.</p>

<h3>AFUP</h3>
<p>L'<a href="http://www.afup.org" title="Association Française des Utilisateurs de PHP">AFUP</a>, Association Française des Utilisateurs de PHP, est une association loi 1901, qui a pour objectif principal de promouvoir le langage PHP auprès des professionnel·le·s et de participer à son développement. Elle organise de nombreux événements tout au long de l'année, notamment le Forum PHP et les AFUP Day, elle diffuse et partage les connaissances auprès des utilisateurs et utilisatrices de PHP, et participe à la valorisation des développeurs et développeuses PHP sur le marché du travail.</p>


<div class="col-md-4">
<h1>Résultats détaillés</h1>

<div class="well">
{% block menu_reports knp_menu_render('reports_menu', {}, 'reports') %}
</div>
</div>

</div>
{% endblock %}
Loading