---
title: "Methodology 2026"
url: https://survey.stackoverflow.co/2026/methodology
year: 2026
licence: "ODbL 1.0 (https://opendatacommons.org/licenses/odbl/1-0/)"
---

# Methodology 2026

How the survey was run, who answered it, and how the numbers here were worked out.

**30,903** responses from **169** countries are used in these survey results.

## Survey fielding

The current local response extract includes 39,266 total rows recorded from June 23, 2026 through August 5, 2026, of which 30,903 are marked as valid responses.

The survey was promoted through stackoverflow.com, stackoverflow.blog and our email list to community members that are opted into learning about research opportunities or announcements.

The survey instrument should be referenced from the public Stack Exchange survey repository: [StackExchange/Survey](https://github.com/StackExchange/Survey).

The public call for feedback that informed the 2026 Developer Survey should be referenced from Meta Stack Overflow: [Help shape the 2026 Developer Survey](https://meta.stackoverflow.com/questions/438884/help-shape-the-2026-developer-survey).

## Valid responses

The current valid-response rule is implemented in `mark_valid_responses()` in `R/aggregation.R`. At a high level, the function adds an integer `valid_response` indicator to the response data.

When bot exclusion is enabled and the input data does not already include `is_bot`, the function first runs `flag_bots()`. The current bot flag uses Qualtrics response-quality fields, including reCAPTCHA score, duplicate respondent status, straightlining questions, unanswered questions, progress, duration, and whether `Country` was answered.

Responses are marked valid through either the primary inclusion rule or the substantive-response recovery rule.

Primary inclusion rule:

- `Consent` is present and equals `"I agree"`.
- `Employment` is present.
- The response is not flagged as a bot when bot exclusion is enabled.

Substantive-response recovery rule:

- The response answered all ten core fielding questions listed below.
- This recovery rule is evaluated independently of the primary non-bot condition, so a response with `is_bot == TRUE` can still receive `valid_response == 1` when it answered all ten core fielding questions.

Core fielding questions:

- `Country`
- `Currency`
- `Compensation`
- `TechDropDown`
- `Languages`
- `CodeTest`
- `Databases`
- `CloudPlat`
- `WebFramework`
- `DevIDE`

The survey-section scripts use `valid_response == 1` as the inclusion rule for exports, so the substantive-response recovery rule is preserved downstream.

## Write-in handling

Role write-ins from `Role_38_TEXT` are reviewed only among `valid_response == 1` responses, normalized to group repeated answers, and compared against existing and analyst-approved Role categories. Reviewed matches can recode `"Other, please specify"` into a final Role category while retaining `Role_Original` and `Role_NLP_Status`; unresolved write-ins remain grouped as `"Other"` in summaries.

SOChangeAddl written responses are eligible for public use only when `valid_response == 1`, `SOChangeAddlConsent` gives permission to share publicly, and `SOChangeAddl` is non-empty. Responses are decoded, translated to English when needed, and manually curated with `SOChangeAddlPublishText`, `SOChangeAddlInclude`, and `SOChangeAddlExcludeReason`; automated text flags are used only to support review, not to make final publish decisions.

## Compensation handling

Compensation is analyzed among `valid_response == 1` responses with non-missing `Country`, `Currency`, and positive numeric `Compensation`; values are converted to yearly USD using exchange rates, with a documented Ukraine-specific correction when likely USD values were entered under `UAH`. Compensation statistics and charts use rows where `CompensationStatsInclude` and `CompensationChartInclude` are `TRUE`, excluding rows with multiple quality flags such as very low or very high converted values, country outliers, suspicious raw-number patterns, non-employed respondents, or student/retired roles.

## Age

Age range for respondents.

Asked as: What is your age? (`Age`, single select, required, v2026.1)

All Respondents · n = 30,903

|  | Respondents | Percent |
| --- | ---: | ---: |
| 25-34 years old | 9,267 | 30.0% |
| 35-44 years old | 8,522 | 27.6% |
| 18-24 years old | 4,944 | 16.0% |
| 45-54 years old | 4,198 | 13.6% |
| 55-64 years old | 1,829 | 5.9% |
| Under 18 years old | 969 | 3.1% |
| 65 years or older | 822 | 2.7% |
| Prefer not to say | 352 | 1.1% |

## Gender

Gender of respondents

Asked as: Which of the following best represents your gender identity? (`Gender`, single select, optional, v2026.1)

All Respondents · n = 21,149

|  | Respondents | Percent |
| --- | ---: | ---: |
| Man | 18,191 | 86.0% |
| Woman | 1,393 | 6.6% |
| Prefer not to say | 899 | 4.3% |
| Non-binary | 431 | 2.0% |
| Prefer to self-describe: | 235 | 1.1% |

## Survey length

How do you feel about the length of the survey this year?

Asked as: How do you feel about the length of the survey this year? (`SurveyLength`, multi select, optional, v2026.1)

All Respondents · n = 14,347

|  | Respondents | Percent |
| --- | ---: | ---: |
| Too long | 9,399 | 65.5% |
| Appropriate in length | 5,026 | 35.0% |
| Too short | 250 | 1.7% |

## Difficulty

How easy or difficult was this survey to complete?

Asked as: How easy or difficult was this survey to complete? (`SurveyEase`, multi select, optional, v2026.1)

All Respondents · n = 14,442

|  | Respondents | Percent |
| --- | ---: | ---: |
| Neither easy nor difficult | 8,060 | 55.8% |
| Easy | 4,459 | 30.9% |
| Difficult | 2,212 | 15.3% |

Response data is released under the ODbL 1.0 (https://opendatacommons.org/licenses/odbl/1-0/).

Cite as: Stack Overflow Developer Survey, Stack Exchange Inc.
