DOI: 10.5281/zenodo.17878061
title: Replication Package for "What's in a Software Engineering Job Posting?"

description: Purpose

These artefacts accompany a research article submitted to the ICSE'26 Research Track. They include JupyterNotebooks, TSVs, Excel, JSONs, design files, PDFs, and READMEs. Running these artefacts is fairly straightforward, as they are all JupyterNotebooks designed to run in a Python virtual environment (or Docker). Any system that supports either of those two things should be able to run these artefacts. Simply follow the instructions under the "Setup" and "Usage" sections below. What you'll find is that the results are already displayed within the outputs of the notebooks. For more details regarding the scientific work, check out the title and abstract below, as well as our full article available at https://doi.org/10.1145/3744916.3773188.

Provenance

Marvin Wyrich - wyrich@cs.uni-saarland.de - Saarland University, Saarbrücken, Germany

Lloyd Montgomery - lloyd.montgomery@uni-hamburg.de - University of Hamburg, Hamburg, Germany

Please cite this work as: Wyrich M, Montgomery L. What’s in a Software Engineering Job Posting? In Proceedings of the IEEE/ACM 48th International Conference on Software Engineering 2026 Apr 12. https://doi.org/10.1145/3744916.3773188

Title: What’s in a Software Engineering Job Posting?

Abstract: A well-rounded software engineer is often defined by technical prowess and the ability to deliver on complex projects. However, the narrative around the ideal Software Engineering (SE) candidate is evolving, suggesting that there is more to the story. This article explores the non-technical aspects emphasized in SE job postings, revealing the sociotechnical and organizational expectations of employers. Our Thematic Analysis of 100 job postings shows that employers seek candidates who align with their sense of purpose, fit within company culture, pursue personal and career growth, and excel in interpersonal interactions. This study contributes to ongoing discussions in the SE community about the evolving role and workplace context of software engineers beyond technical skills. By highlighting these expectations, we provide relevant insights for researchers, educators, practitioners, and recruiters. Additionally, our analysis offers a valuable snapshot of SE job postings in 2023, providing a scientific record of prevailing trends and expectations.

Artefact: 10.5281/zenodo.17606700

Data

As an overview, our scientific work is a Thematic Analysis of Software Engineering job postings, producing primarily qualitative results in the form of labels on the data and a Thematic Map. In the data, this begins as a set of 100 PDFs (0_job_postings below), we then extract the metadata and text of each job posting into CSV format (1_data_transformation) and store that information in GoogleSheets / Excel for manual analysis (3_thematic_analysis) with help from scripts to view the data in different ways (2_coding_support). Once our analysis was complete, we transformed the Thematic Map into an interactive visualisation (4_label_transformation and 5_label_visualisation) and performed frequent set analysis (6_frequent_set_analysis) and position analysis (7_position_analysis).

We split the artefact into multiple folders, where the folders represent different stages of the analysis process. Here is a high-level explanation of everything in this repo. Within each folder described here, you will find an additional README that explains the relative contents in more detail.





0_job_postings: The PDFs of the collected job postings. Also includes a README explaining the data collection process.




1_data_transformation: Transforms the extracted text of the job postings (n=100) into separate lines for our analysis, where each line is a single sentence. We then copied these lines into the Google Sheet (number of lines = 4,165).




2_coding_support: A multi-purpose analysis script that supported the "coding" portion of the Thematic Analysis. The script pulls from both TSV exports of the "SEJP Thematic Analysis.xlsx" sheet, and optionally directly from GoogleSheets using the GoogleCloud API.




3_thematic_analysis: Scientific analysis artefacts for the Thematic Analysis.




4_label_transformation: Transforms the results of the Thematic Analysis (rows are themes, subthemes, and codes), into the interactive visualisation where the rows are evidence pieces and the columns display the thematic labels.




5_label_visualisation: Contains the results of visualising the Thematic labels in an intuitive way: rows as evidence and columns as labels.




6_frequent_set_analysis: Script that outputs all sets of thematic themes (and subthemes).




7_position_analysis: Script that outputs the results of the positional analysis.




figs: Output figures are stored here, as well as the design file used to create figure 1 in the article.




Dockerfile: Instructions for Docker.




LICENCES.md: The licences for the code. One for the code (MIT) and one for the data and other non-code scientific artefacts (CC-BY 4.0). See the "Licenses" section below and the LICENCES.md file for the full information.




README.md: Top-level explanation of the entire repository. This file.




requirements.txt: Lists the packages needed for the Python virtual environment. These are installed automatically when following the instructions in the INSTALL.md file.



Setup

System Requirements

Operating System





This code was developed and tested on macOS Sonoma, Sequoia, and Tahoe. We also successfully ran the artefact on multiple Linux distros during the development of the Dockerfile.




Depending on the Python environment you are running in (different Linux distros, etc.), you may have to install additional dependencies, such as venv. We cannot create a set of instructions that works for all possible OSs, and we refrain from overcomplicating the installation instructions below accordingly. Our requirements.txt file dictates all version-specific dependencies needed by our Python scripts.



Python 3.12





This code was tested and run using Python 3.12. It might work with some previous versions, and it will likely work with future Python versions.



Optional: Docker





This repository is also runnable via Docker. This requires that you have Docker installed on your machine.



Installation and JupyterLab Activation Instructions

Option A: Python Virtual Environment - Minimal and Recommended

Navigate to the place on your computer where you downloaded the files. Change directory into the SEJP folder.

cd SEJP

Install, create, and load a Python virtual environment.

pip install --upgrade pip  # Upgrade pip, just good practice
python -m venv .venv  # Create the virtual environment
. .venv/bin/activate  # Activate (enter) the virtual environment
pip install --upgrade pip  # Upgrade pip inside the venv, just good practice

Install all necessary dependencies, as defined by the requirements.txt file.

pip install -r requirements.txt

Run the JupyterLab server, which also launches the Notebooks in your browser

jupyter lab --port 8888

Option B: Docker Image - Verbose

NOTE: Requires that Docker is installed on your machine.

Build the docker image using the Dockerfile:

docker build --tag 'sejp_image' .

Run the Docker Image:

docker run --rm -p 8888:8888 'sejp_image'

Usage

The scripts for this analysis are written in JupyterNotebook. You can either run the JupyterNotebooks in your browser, or configure them to run in your favourite IDE (such as VSCode). I will explain here how to run in your browser, since this requires the least effort.

Running Jupyter...

... in the browser

If you followed Options A or B above, your computer should have automatically opened a browser with the notebook browser landing page. If not, view the terminal window and copy and paste one of the links they provide you there. It should have a format such as this: http://localhost:8888/lab?token=???? where the token is set to something random each time.

... in your IDE

This requires you to look up the specific "instructions" for your IDE of choice and running Jupyter Notebooks. Most of them, however, still require you to get Jupyter running, and then you "select" the running server. VSCode, for example, does this fairly automatically once you configure the Python virtual environment with Jupyter installed inside it and have the necessary plugins installed.

Navigating and Running the Code

(For the purpose of these running instructions, I will assume you are running Jupyter in the browser.)

Now that your computer browser is open to the Jupyter Notebook file browser, let's run the different available scripts. The purpose of each script in this repository is explained in the README.md.

To run the scripts, use the JupyterLab file browser to open each script. In the left sidebar, click the folder icon, then select the sub-directory you wish to explore. For example, the 1_data_transformation has 1_data_transformation.ipynb, which you can double-click to open it in the JupyterLab browser editor.

Once a script is open, you can explore the already-compiled-and-ran outputs of the cells. If you wish to re-run the notebook from scratch, then I recommend that you use the menu option: Run → Run all Cells. The input files for each script are already included in each sub-directory. The output files are all put in separate ./output folders in each sub-directory. You are free to delete the output folders, and re-run all cells to watch the script re-create these files.

As with any JupyterNotebook, you can change the code and re-run individual cells to watch the output change.

Licences

The code is licensed under MIT. The licence is included in this repository and further information can be found here: https://opensource.org/licenses/MIT

The data is licensed under CC BY 4.0. What’s in a Software Engineering Job Posting? © 2025 by Marvin Wyrich and Lloyd Montgomery is licensed under CC BY 4.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/4.0/