Main menu

Pages

Ein Blick auf Trends bei Entwicklerjobs: eine Metaanalyse von Stack-Overflow-Umfragen

Meta description

Ich interessiere mich sehr für die Trends, die wir auf dem Arbeitsmarkt für Softwareentwickler sehen. Manchmal ist es wirklich schwierig, eine kohärente und genaue Geschichte darüber zu erzählen, was passiert, weil es so schnell passiert und nur sehr wenige Menschen Daten darüber sammeln.

Hier sind zum Beispiel einige Fragen, auf die ich gerne eine Antwort wissen würde:

  • Bedeuten „DevOps“ und eine verstärkte Cloud-Nutzung weniger traditionelle Betriebsaufgaben?
  • Bedeuten Dinge wie Firebase und Supabase weniger Backend-Aufgaben?
  • Bedeuten Dinge wie Rückenwind weniger Designer?
  • Werden wir mehr Spezialist oder mehr Generalist die Rollen?
  • Spezialisieren sich die Leute immer noch als DBAs?

Ich habe alle Antworten auf die Beschäftigung von Entwicklern aus den Stack Overflow-Umfragen der letzten 9 Jahre zusammengestellt, damit ich anfangen kann, einige dieser Fragen zu beantworten. Wenn Sie neugierig auf die Jobaussichten für Entwickler sind, hoffen wir, dass diese Daten hilfreich sind.

Zunächst eine Anmerkung zu den Daten

  1. Alle Zahlen in den Tabellen stellen den Prozentsatz der Befragten dar, die sich selbst als einen bestimmten Jobtyp bezeichneten.

  2. Die von SO gestellten Fragen haben sich im Laufe der Jahre geändert, daher müssen wir dies mit einem riesigen Salzkorn nehmen.

  3. Ich habe die Antworten normalisiert. Zum Beispiel “Entwickler, Backend” und “Backend-Webentwickler”, die ich in “Backend” gruppiert habe.

  4. Der Stapelüberlauf ermöglichte es den Leuten, nach 2015 0 bis mehrere Berufsbezeichnungen auszuwählen, davor waren sie anscheinend auf eine beschränkt.

  5. In einigen Jahren hatten Entwickler mehr Joboptionen zur Auswahl.

  6. Ich habe viele Off-Topic-Jobtypen wie “Entwickler von Unternehmensdienstleistungen” und “Auserwählter” geworfen.

  7. Dies sind nur Stack Overflow-Daten, daher werden sie jedes Jahr durch die Größe ihrer Benutzerbasis verzerrt.

Kommen wir also zu den Daten. Ich werde das Skript, das ich geschrieben habe, um die aggregierten Daten zu erstellen, sowie einen Link zu den Rohdaten am Ende dieses Artikels entfernen.

Webtrends: Full-Stack, Frontend und Backend

Jahr

ein ganzes Paket

Frontend

Backend

2013

24.5

4.31

7.88

2014

25.72

5.02

9.3

2015

25.93

4.76

8.07

2016

37.88

5.13

10.82

2017

51.05

2.47

5.08

2018

44.87

35.22

53.92

2019

47.5

29.98

45.75

2020

42.08

28.38

42.24

2021

39.42

21.85

34.84

2022

39.17

21.72

36,99

Im Jahr 2013 betrug das Verhältnis von Front-End-Entwicklern zu Full-Stack-Entwicklern 15/85, während das Verhältnis von Back-End-Entwicklern zu Full-Stack-Entwicklern 24/76 betrug.

Der Trend „mehr Full-Stack, weniger Spezialisierung“ setzt sich in den zehn Jahren der Daten fort. Es ist wichtig zu beachten, dass sich die Umfrage 2017/2018 dramatisch verändert hat, weshalb wir eine große Veränderung in den Zahlen sehen.

Deutung Nr. 1

Es scheint vernünftig zu schlussfolgern, dass der Trend in den letzten zehn Jahren darin bestand, dass der Prozentsatz der Entwickler abnimmt nur Frontarbeit bzw nur Hintergrundarbeit. Immer mehr werden als Full-Stack-Ingenieure bezeichnet.

Denken Sie auch daran Stärke sein, dass es im Laufe der Jahre mehr kleine und mittlere Unternehmen gegeben hat. Kleine Unternehmen brauchen im Allgemeinen mehr Generalisten, aber jetzt vermute ich nur.

Deutung Nr. 2

Das Verhältnis von Front-End- zu Back-End-Ingenieuren ist ziemlich konstant geblieben, mit knapp doppelt so vielen Back-End-Ingenieuren wie Front-End-Ingenieuren.

Das hat mich tatsächlich überrascht, ich hatte erwartet, dass das Verhältnis von Front-End- und Back-End-Ingenieuren im Laufe der Jahre enger wird.

IT-Operations-Trends: Back-End, DevOps und traditionelle Operationen

Jahr

Backend

DevOps

Operationen

2013

7.88

0

2,96

2014

9.3

1.61

2,85

2015

8.07

1.23

1,77

2016

10.82

1.92

1,79

2017

5.08

7.81

13.66

2018

53.92

9.66

18:33 Uhr

2019

45.75

11:43 Uhr

15.93

2020

42.24

10.51

13.11

2021

34.84

9.75

10.82

2022

36,99

13.2

11.8

In meinem Skript habe ich versucht, mehr „traditionelle Ops“-Rollen in die „Ops“-Kategorie aufzuteilen und die „DevOps“-Sachen in die „DevOps“-Rolle. Zum Beispiel „SRE“, das ich als „DevOps“ betrachtete, während „Systemadministrator“ „ops“ ist.

Datenvorbehalt für 2017

Was ist 2017 passiert? Ehrlich gesagt scheinen die Daten einfach kaputt zu sein. Ich habe die Daten manuell ausgegraben, weil sie laut Website behaupten, dass 24 % der Webentwickler angaben, sie seien Backend und 75 % der Befragten gaben an, Webentwickler zu sein.

Im Moment habe ich das Gefühl, dass sie sich für diese Zahlen qualifiziert haben müssen, weil es einfach nicht zu meinem Ende passt. Ich werde 2017 aus meiner Analyse in den Interpretationen ausschließen.

Deutung 1

DevOps scheint gegenüber traditionellen Operationen an Zugkraft zu gewinnen. Im Jahr 2013 hat sich niemand als „DevOps“-Person identifiziert, aber bis 2020 und 2021 steigen die Zahlen sehr ähnlich.

Es sei darauf hingewiesen, dass die DevOps-Zahlen im Jahr 2016 tatsächlich die „Ops“-Zahlen für ein einziges Jahr in den Schatten stellten. Ich vermute, dass 2016 ungefähr zu der Zeit war, als viele Unternehmen gerade damit begannen, ihre „Ops“-Teams in „DevOps“-Teams umzubenennen, um cool auszusehen.

Es ist schwer, sich über diese Zahlen zu viele Gedanken zu machen, da DevOps meiner Meinung nach im Allgemeinen schlecht gemacht ist. Ich glaube nicht, dass „Ops“-Titel und „DevOps“-Titel in den meisten Unternehmen so unterschiedlich sind.

Deutung 2

„DevOps“ scheint in den letzten Jahren am wenigsten untergegangen zu sein, tatsächlich hat es 2022 einen guten Sprung gemacht. Betrachtet man jedoch „DevOps“ und „Ops“ zusammen, dann fällt die Kategorie auf ist noch etwas runter.

Interessanterweise tendierte „Ops“ von Anfang an nach unten, während „Back-End“ bis 2016 nach oben tendierte, als sich der Trend umkehrte und abwärts ging.

Zuerst nahm ich an, dass wir nur den gleichen Trend sehen, den wir in der Webentwicklung gesehen haben: mehr Generalisten, weniger Spezialisten.

Allerdings wurde ich skeptisch, weil, als ich durchschaute alles Job-Kategorien ist mir fast aufgefallen alles von ihnen tendierten nach unten … was eindeutig nicht der Fall sein kann, wenn wir uns die Prozentsätze ansehen – es ist ein Nullsummenspiel.

Ich beschloss, meinem Skript einen neuen Abschnitt hinzuzufügen, um tiefer einzutauchen. Ich habe berechnet, wie viele Jobs im Durchschnitt jeder Ermittler beansprucht, und diese Daten erhalten:

Jahr

Backend

DevOps

Operationen

avg_jobs_per_user

2013

7.88

0

2,96

1

2014

9.3

1.61

2,85

1

2015

8.07

1.23

1,77

1

2016

10.82

1.92

1,79

1,89

2017

5.08

7.81

13.66

2.48

2018

53.92

9.66

18:33 Uhr

2,79

2019

45.75

11:43 Uhr

15.93

2.84

2020

42.24

10.51

13.11

2.59

2021

34.84

9.75

10.82

2.21

2022

36,99

13.2

11.8

2.27

Es scheint, dass die Entwickler von 2013 bis 2015 darauf beschränkt waren, nur eine Antwort einzureichen, was dazu beiträgt, die extrem niedrigen Zahlen zu berücksichtigen. Von 2019 bis > 2021 ist die durchschnittliche Anzahl von Jobs pro Benutzer jedoch gestiegen Niederwas der “allgemeinsten” Theorie widerspricht.

Es ist auch erwähnenswert, dass Stack Overflow im Laufe der Jahre tatsächlich spezialisiertere Kategorien hinzugefügt hat, die ich mir dann erlaubt habe, in diese größeren Gruppen zu gruppieren.

Es gibt also gute Beweise dafür, dass Entwickler sind mehr spezialisiert, oder zumindest, dass es mehr gibt die möglichen Wege auf die du dich spezialisieren kannst.

Allerdings gibt es auch nach Betrachtung dieser Daten gute Gründe zu der Annahme, dass Backend-Entwickler immer mehr „DevOps“-Arbeit leisten werden, insbesondere in kleineren Unternehmen.

Datentrends: Data Science, Data Engineering und Backend

Jahr

type_data_science

Dateningenieur

Backend

2013

0

0

7.88

2014

0

0

9.3

2015

2.12

0,69

8.07

2016

3.83

0,7

10.82

2017

9.14

0

5.08

2018

7.17

0

53.92

2019

7.27

6.55

45.75

2020

6.19

5.8

42.24

2021

5.12

5

34.84

2022

4.67

4.91

36,99

Deutung

Es ist für mich sehr interessant, dass Data Engineering erst 2019 wirklich in Umfragedaten auftauchte. Bis dahin haben Backend-Ingenieure und Datenwissenschaftler diese Rolle vermutlich verschlungen. Diese neue Spezialisierung ist sicherlich interessant.

Maschinelles Lernen ist in den letzten zehn Jahren absolut gewachsen, aber es sieht so aus, als hätte es 2017 eine Art „Hype-Blase“ gegeben?

Die restlichen Daten

Ich habe über meine persönlichen Interpretationen bezüglich der Daten gesprochen, die ich am interessantesten fand, aber hier sind sie alles Die Daten, die ich für Sie zur Selbstkontrolle gesammelt habe:

Jahr

avg_jobs_per_user

ein ganzes Paket

Frontend

Backend

DevOps

Operationen

tragbar

Schreibtisch

eingebettet

Daten_Wissenschaft

Dateningenieur

Spiel

Management

Qualitätssicherung

Ausbildung

Muster

Analytiker

Verkaufsleiter

ignorieren

2013

1

24.5

4.31

7.88

0

2,96

6.48

9.53

2.16

0

0

0

7.49

0

0

0

0

0

34.7

2014

1

25.72

5.02

9.3

1.61

2,85

7.57

9.43

2.42

0

0

0

5.9

0

0

0

0

0

30.18

2015

1

25.93

4.76

8.07

1.23

1,77

7.28

6.65

2.33

2.12

0,69

0,63

1.44

0,63

0

0,57

0

0,23

35.66

2016

1,89

37.88

5.13

10.82

1.92

1,79

7.39

6.05

2.26

3.83

0,7

0,52

10.04

0,68

0

0,59

1.02

0,21

98,65

2017

2.48

51.05

2.47

5.08

7.81

13.66

16.2

20.3

6.52

9.14

0

3.37

0,5

2.44

1.42

3,94

3.69

0,3

100

2018

2,79

44.87

35.22

53.92

9.66

18:33 Uhr

19.02

15,99

4,87

7.17

0

4.7

7,99

6.27

3.68

12.16

7.65

1.13

26.63

2019

2.84

47.5

29.98

45.75

11:43 Uhr

15.93

16.54

19:48 Uhr

8:15 Uhr

7.27

6.55

4,99

6.34

7.15

10.18

10:33 Uhr

7.08

1.1

28.37

2020

2.59

42.08

28.38

42.24

10.51

13.11

14.71

18.28

7.37

6.19

5.8

4.33

5.54

6.12

8.67

8.25

6.24

1

30.18

2021

2.21

39.42

21.85

34.84

9.75

10.82

11.74

13.23

5.51

5.12

5

2.53

6.37

4.33

5.56

5.53

4.54

0,76

34.51

2022

2.27

39.17

21.72

36,99

13.2

11.8

10:42

13.03

5.35

4.67

4.91

2.51

10:44 Uhr

4.23

5.78

5.14

4.37

0,71

32.06

CSV-Rohdaten

Hier ist ein Link zu den CSV-Rohdaten auf Stack Overflow.

Mein Szenario

Hier ist das vollständige Python-Skript, mit dem ich die Zahlen berechnet habe. Sorry für den schlampigen Code, ich habe nicht viel Zeit im Code verschwendet.

Der wahrscheinlich interessanteste Teil der Handlung ist der get_mapped_job function down ist der Punkt, an dem ich all die vielen Arten von Jobs, die von Stack Overflow-Benutzern gemeldet werden, zu den wenigen zusammenfasse, die ich in das Diagramm aufgenommen habe.

import csv

outpath = "csv/out.csv"

type_devops = "devops"
type_ops = "ops"
type_backend = "backend"
type_frontend = "frontend"
type_mobile = "mobile"
type_fullstack = "fullstack"
type_desktop = "desktop"
type_embedded = "embedded"
type_data_science = "data_science"
type_ignore = "ignore"
type_management = "management"
type_education = "education"
type_design = "design"
type_marketer = "marketer"
type_data_engineer = "data_engineer"
type_game = "game"
type_analyst = "analyst"
type_qa = "qa"


def main():
    files = [
        (2013, [6]),
        (2014, [6]),
        (2015, [5]),
        (2016, [8, 9, 10]),
        (2017, [14, 15, 16, 17]),
        (2018, [9]),
        (2019, [12]),
        (2020, [13]),
        (2021, [11]),
        (2022, [11]),
    ]

    out_dict = {}
    jobs_per_user_dict = {}

    for f_tup in files:
        counts = {}
        path = f"csv/{f_tup[0]}.csv"
        print(f"generating report for {path}")
        out_dict[f_tup[0]]: {}
        with open(path, "r") as csvfile:
            rows = csv.reader(csvfile, delimiter=",")
            count = 0
            rows_cpy = []
            jobs_per_user = []
            for row in rows:
                count += 1
                rows_cpy.append(row)
            for row in rows_cpy:
                try:
                    jobs = get_jobtext_from_cells(f_tup[1], row)

                    mapped_jobs = set()
                    for job in jobs:
                        mapped_jobs.add(get_mapped_job(job))
                    jobs_per_user.append(mapped_jobs)
                    for mapped_job in mapped_jobs:
                        if mapped_job not in counts:
                            counts[mapped_job] = 0
                        counts[mapped_job] += 1
                except Exception as e:
                    print(e)

            avg_jobs_per_user = 0
            for user_jobs in jobs_per_user:
                avg_jobs_per_user += len(user_jobs)
            jobs_per_user_dict[f_tup[0]] = round(
                avg_jobs_per_user / len(jobs_per_user), 2
            )

            for job in counts:
                counts[job] /= count
                counts[job] *= 100
                counts[job] = round(counts[job], 2)
            out_dict[f_tup[0]] = counts

    write_out(out_dict, jobs_per_user_dict)


def get_jobtext_from_cells(indexes, row):
    if len(indexes) == 0:
        return []
    job_texts = []
    for i in indexes:
        cell = row[i]
        cell_job_texts = cell.split(";")
        job_texts += cell_job_texts
    return job_texts


def write_out(out_dict, jobs_per_user_dict):
    types = [
        type_fullstack,
        type_frontend,
        type_backend,
        type_devops,
        type_ops,
        type_mobile,
        type_desktop,
        type_embedded,
        type_data_science,
        type_data_engineer,
        type_game,
        type_management,
        type_qa,
        type_education,
        type_design,
        type_analyst,
        type_marketer,
        type_ignore,
    ]

    with open(outpath, "w") as csvfile:
        w = csv.writer(csvfile)
        w.writerow(["year", "avg_jobs_per_user"] + types)
        for year in out_dict:
            row = [year, jobs_per_user_dict[year]]
            for t in types:
                row.append(out_dict[year][t] if t in out_dict[year] else 0)
            w.writerow(row)


def get_mapped_job(job):
    job = job.lower().strip()
    if job == "":
        return type_ignore
    if job == "devops specialist":
        return type_devops
    if job == "designer":
        return type_design
    if job == "c-suite executive":
        return type_management
    if job == "analyst or consultant":
        return type_analyst
    if job == "back-end developer":
        return type_backend
    if job == "windows phone":
        return type_mobile
    if job == "i don't work in tech":
        return type_ignore
    if job == "growth hacker":
        return type_marketer
    if job == "desktop developer":
        return type_desktop
    if job == "analyst":
        return type_analyst
    if job == "executive (vp of eng., cto, cio, etc.)":
        return type_management
    if job == "mobiledevelopertype":
        return type_mobile
    if job == "engineer, data":
        return type_data_engineer
    if job == "graphics programmer":
        return type_game
    if job == "systems administrator":
        return type_ops
    if job == "developer, game or graphics":
        return type_game
    if job == "desktop software developer":
        return type_desktop
    if job == "nondevelopertype":
        return type_ignore
    if job == "elected official":
        return type_ignore
    if job == "engineering manager":
        return type_management
    if job == "web developer":
        return type_fullstack
    if job == "machine learning specialist":
        return type_data_science
    if job == "data or business analyst":
        return type_analyst
    if job == "devtype":
        return type_fullstack
    if job == "response":
        return type_ignore
    if job == "developer, qa or test":
        return type_qa
    if job == "machine learning developer":
        return type_data_science
    if job == "developer, front-end":
        return type_frontend
    if job == "database administrator":
        return type_ops
    if job == "android":
        return type_mobile
    if job == "webdevelopertype":
        return type_fullstack
    if job == "blackberry":
        return type_mobile
    if job == "system administrator":
        return type_ops
    if job == "mobile developer - android":
        return type_mobile
    if job == "developertype":
        return type_fullstack
    if job == "ios":
        return type_mobile
    if job == "developer with a statistics or mathematics background":
        return type_ignore
    if job == "qa or test developer":
        return type_qa
    if job == "educator or academic researcher":
        return type_education
    if job == "engineer, site reliability":
        return type_devops
    if job == "marketing or sales professional":
        return type_marketer
    if job == "student":
        return type_ignore
    if job == "back-end web developer":
        return type_backend
    if job == "educator":
        return type_education
    if job == "front-end developer":
        return type_frontend
    if job == "developer, desktop or enterprise applications":
        return type_desktop
    if job == "senior executive/vp":
        return type_management
    if job == "occupation":
        return type_ignore
    if job == "scientist":
        return type_ignore
    if job == "developer, full-stack":
        return type_fullstack
    if job == "graphic designer":
        return type_design
    if job == "developer, embedded applications or devices":
        return type_embedded
    if job == "embedded application developer":
        return type_embedded
    if job == "quality assurance":
        return type_qa
    if job == "graphics programming":
        return type_game
    if job == "senior executive (c-suite, vp, etc.)":
        return type_management
    if job == "it staff / system administrator":
        return type_ops
    if job == "business intelligence or data warehousing expert":
        return type_data_engineer
    if job == "full stack web developer":
        return type_fullstack
    if job == "developer, mobile":
        return type_mobile
    if job == "front-end web developer":
        return type_frontend
    if job == "desktop applications developer":
        return type_desktop
    if job == "other (please specify):":
        return type_ignore
    if job == "mobile developer":
        return type_mobile
    if job == "devops":
        return type_devops
    if job == "enterprise level services developer":
        return type_ignore
    if job == "data scientist":
        return type_data_science
    if job == "executive (vp of eng, cto, cio, etc.)":
        return type_management
    if job == "mobile developer - ios":
        return type_mobile
    if job == "game or graphics developer":
        return type_game
    if job == "which of the following best describes your occupation?":
        return type_ignore
    if job == "other":
        return type_ignore
    if job == "desktop or enterprise applications developer":
        return type_desktop
    if job == "c-suite executive (ceo, cto, etc.)":
        return type_management
    if job == "embedded applications/devices developer":
        return type_embedded
    if job == "product manager":
        return type_ignore
    if job == "mobile application developer":
        return type_mobile
    if job == "mobile developer - windows phone":
        return type_mobile
    if job == "data scientist or machine learning specialist":
        return type_data_science
    if job == "educator or academic":
        return type_education
    if job == "embedded applications or devices developer":
        return type_embedded
    if job == "quality assurance engineer":
        return type_qa
    if job == "enterprise level services":
        return type_ignore
    if job == "full-stack developer":
        return type_fullstack
    if job == "na":
        return type_ignore
    if job == "academic researcher":
        return type_education
    if job == "manager of developers or team leader":
        return type_management
    if job == "marketing or sales manager":
        return type_marketer
    if job == "developer, back-end":
        return type_backend
    if job == "full-stack web developer":
        return type_fullstack
    if job == "designer or illustrator":
        return type_design
    if job == "programmer":
        return type_ignore
    if job == "developer":
        return type_ignore
    if job == "manager":
        return type_management
    if job == "engineer":
        return type_ignore
    if job == "sr. developer":
        return type_ignore
    if job == "full stack overflow developer":
        return type_fullstack
    if job == "ninja":
        return type_ignore
    if job == "mobile dev (android, ios, wp & multi-platform)":
        return type_mobile
    if job == "expert":
        return type_ignore
    if job == "rockstar":
        return type_ignore
    if job == "hacker":
        return type_ignore
    if job == "guru":
        return type_ignore
    if job == "self_identification":
        return type_ignore
    if job == "occupation_group":
        return type_ignore
    if job == "cloud infrastructure engineer":
        return type_devops
    if job == "project manager":
        return type_management
    if job == "security professional":
        return type_ops
    if job == "blockchain":
        return type_backend
    if (
        job
        == "mathematics developers (data scientists, machine learning devs & devs with stats & math backgrounds)"
    ):
        return type_data_science
    raise Exception(f"job not mapped: {job}")


main()

Auch hier gepostet

WIRD GELADEN
. . . Kommentare & Nach!

Blog In 2021 joker0o xyz

Commentaires