A shortlist in 72 hours, contributing inside two weeks, and a 30-day guarantee if the fit is wrong.
72-hour shortlist · 30-day replacement guarantee · Month-to-month
This is the most common hiring mistake in the category, and it’s expensive.
A Django backend engineer, a data engineer building pipelines, an ML engineer deploying models, and an automation specialist all describe themselves as Python developers. Their CVs look similar. Their day-to-day work has almost nothing in common.
Hire a data engineer for a Django project and you get someone who can write the code but has never thought about request lifecycles, authentication, or migrations against a live database. Hire a web developer for a data pipeline and you get code that works on a sample and falls over on the real volume.
The screening question that matters isn’t “do you know Python.” It’s which of those four jobs the person has actually done, repeatedly, in production.
We spend most of the discovery call working out which one you need. Sometimes the answer isn’t the one in the job description.
Django for batteries-included applications with admin and ORM. FastAPI for async APIs and typed contracts. Flask for something small. A candidate who defaults to one regardless of context hasn't thought about it.
asyncio is genuinely different from threaded thinking. We check whether they've shipped async code or only read about it.
Poetry, pip-tools, Docker. "It works on my machine" is a Python speciality and it costs your team days.
Most Python roles are database roles. ORM fluency without SQL understanding produces queries that work and don't scale.
pytest, fixtures, and whether they test behaviour or implementation. Python's flexibility makes untested code expensive.
A live conversation in English, every time. Where most remote placements fail.
Because the title covers four jobs, the expensive failure here is a mismatch rather than incompetence. The person is genuinely good — at something else.
Put a data engineer on a Django product and you get code that runs. What you don’t get is migration discipline. They add a non-nullable column to a table with two million rows, the migration takes an exclusive lock, and writes queue behind it for ninety seconds during business hours. Nobody wrote a bad line of Python. The person simply hadn’t operated a schema change against live traffic before.
Reverse it and the failure is quieter. A web developer builds the pipeline, tests it on a 10,000-row sample, and it passes. In production it loads the full extract into memory, the container hits its limit, and the nightly job dies at 2am. It half-wrote yesterday’s data before it died, so the numbers are wrong rather than missing — which is worse, because nobody notices for a week.
Both cost a month or more, and both are avoidable at the screening stage by asking which of the four jobs someone has actually done in production, repeatedly.
Mid-level (3–5 years). Builds features against an existing architecture. Comfortable with a framework, an ORM, and standard tooling. Needs direction on structure.
Senior (5–8 years). Makes architectural decisions and defends them. Sets project structure, testing conventions, and data access patterns. Can diagnose a slow endpoint without guessing.
Lead (8+ years). Owns backend or data direction, mentors, handles the infrastructure and cost conversation.
Django or FastAPI backends. Application development, API layers, admin tooling. The largest share of requests.
Data pipelines. ETL, scheduled jobs, Airflow orchestration, warehouse loading. Different skill from web work — see our data engineering service.
ML deployment. Taking a model someone else built and making it run reliably in production. Distinct from ML research, and more commonly what’s actually needed. See hire AI & ML engineers.
Automation and internal tooling. Scripts that became systems. Usually needs someone senior enough to know when to stop scripting and start building. Related: AI integration and automation.
Python 2 migration. Still real, still painful, and needs someone who has done it before rather than someone learning on your codebase.
Week one. They read the models and the migration history before touching a view. Expect questions about environment setup, how dependencies are pinned, and whether there’s a test database with representative data. If your project has no dependency lock file, a good hire will say so in the first week rather than quietly working around it.
Weeks two to four. They ship a feature with tests. They should also flag at least one thing the ORM is doing badly — a list view issuing a query per row is the classic, and select_related or prefetch_related is the answer. Someone who has run Django at scale spots it on sight.
The warning sign is scripts instead of applications. Functions that do everything, no tests, configuration read from wherever is convenient. It’s the habit of someone whose Python has always been analysis code, and it doesn’t survive contact with a system other people maintain.
Ask what they deleted. Python codebases accumulate helper modules, one-off scripts, and dependencies added for a single function call. A developer who spent part of their first month removing things — and can explain what each removal made safer — is treating the codebase as something that has to be maintained rather than something to add to.
Writing the job description without naming the job. “Senior Python developer, 5+ years” attracts all four specialisms and gives you no way to compare them. Say Django product work, or batch pipelines, or model deployment. The shortlist improves immediately and the interviews get shorter.
Believing ORM fluency implies SQL competence. It routinely doesn’t. A developer can be fast and productive in the Django ORM and unable to read an EXPLAIN plan. That’s fine until the first slow page, at which point it’s the only skill that matters. Ask for both.
Hiring an ML engineer for what is a data problem. Teams ask for model work when their actual blocker is that the data is scattered, inconsistent, and not accessible on a schedule. The model isn’t the constraint. Fixing the pipeline first is cheaper and usually removes the need for the other hire. See hire data engineers.
Hiring from the wrong half of the language. The four Python jobs draw on different libraries, different tooling, and different instincts. Someone who spent five years in notebooks and pandas will not naturally write a maintainable Django service, and a Django developer is rarely the right person to build a training pipeline. The job title hides the difference; the interview has to surface it.
Rates depend on seniority, domain focus, and engagement length. Tell us the role and we’ll give you a firm number.
Tell us the role and we will send a shortlist within 72 hours.
Tell Us the RoleTell us the role. Three to five profiles within 72 hours.