Blog
Why Contractors Take Three Weeks to Become Useful and What to Do Before Day One
10 min read
The contractor's day rate is running. They have been on the engagement for two weeks. They have read the repo, attended the onboarding call, asked questions in Slack, and pushed one small bug fix. The engineering manager who hired them is starting to wonder whether they got the right person. The contractor is starting to wonder why nobody can give them a straight answer about how the authentication service connects to the rest of the system. Both of them are right that something is wrong. Neither of them is diagnosing the actual problem.
The actual problem is that the contractor's ramp-up model — a repo link, a Confluence page, a call with an engineer who has limited time — was designed for a world where onboarding friction was an acceptable cost. For a full-time employee hired for a two-year tenure, two weeks of orientation is a rounding error. For a contractor on a six-week engagement, two weeks of orientation is a third of the contract. That math is not an accident to fix — it is a structural failure to solve differently.
Why contractor onboarding costs more than employee onboarding
Full-time engineers absorb codebase context over months. They sit next to the people who built things. They overhear conversations about architecture decisions in standup. They attend the post-mortems where the history of why a system is structured the way it is gets re-explained. None of that happens for a contractor. They get a defined start date and a defined deliverable, and the expected knowledge transfer is compressed into whatever time the existing team is willing to give them.
The asymmetry is economic in a way that is easy to miss. A full-time employee costs salary regardless of their productivity level. An employee who takes six weeks to ramp is a six-week investment. A contractor costs a day rate, which means the first two to three unproductive weeks are not a delayed investment — they are immediate cash spent on orientation rather than output. If the contractor's day rate is meaningful, two weeks of orientation represents a significant portion of the engagement cost producing nothing the engagement was hired to produce.
There is also a time pressure problem that does not exist for employees. A contractor who is still finding their footing in week three of a six-week engagement is already behind. There is no "they will get there eventually" — there is a deadline. That time pressure makes mistakes more likely, not less, because the contractor is making decisions faster than their knowledge of the system warrants. Code review catches those mistakes, which creates review cycles that burn more senior engineer time than the original knowledge transfer would have.
And unlike employees, contractors rarely inherit the informal context that makes a system navigable. They do not get the post-mortem documents. They do not know which engineer owns which service emotionally, or which parts of the codebase are known to be fragile, or which Jira tickets represent genuine priority versus things that have been kicked down the road for a year. All of that context has to be transferred explicitly, and explicit transfer is expensive and incomplete.
What contractors actually receive vs. what they actually need
The standard contractor onboarding package is: a repository link, access credentials, an onboarding document of variable quality, and a call with an engineer. In most organizations, the onboarding document is six months to two years out of date. The engineer on the call is not the one who built the services the contractor will be working on, or is the one who built them and has not touched them since the major refactor eighteen months ago. The call runs forty-five minutes and covers the top-level architecture at a level of abstraction that is accurate but not useful for writing code.
What a contractor needs to become productive quickly is different from what they typically receive. They need to understand the service boundaries — not in the abstract, but specifically enough to know where to put logic for the feature they have been hired to build. They need to know the conventions — not the ones written in the style guide (which may exist), but the ones embedded in how the existing code is actually structured. They need to understand the history — not the full history, but enough to avoid accidentally reverting decisions that were made deliberately.
Above all, they need a way to answer questions without waiting. A contractor who is blocked on a question and waiting for a Slack response is not billing toward the deliverable. They are billing toward overhead. The more questions that require a human to answer, the more the contractor's productive time is fragmented by wait states. In a team where senior engineers are busy — which is all teams — those wait states are long.
The specific things that make contractors slow
Unknown conventions are the first productivity killer. Every non-trivial codebase has conventions that are not written anywhere: how errors bubble up through the service layer, what the testing strategy is for this kind of module, where database queries live in the architecture, how configuration is managed across environments. A contractor who does not know these conventions does not violate them maliciously — they just reach for the pattern that made sense at their last engagement. Code review catches the deviation. The fix takes time. The senior engineer who caught it explains the convention. The contractor now knows it. The next contractor will not.
Invisible dependencies are the second productivity killer. Services depend on each other in ways that are not obvious from the code structure. PaymentService calls FraudCheckService on every transaction, but that call is buried in a private method three levels down from the entry point. The contractor who changes the payment flow without knowing about FraudCheckService ships something that inadvertently bypasses fraud detection. This makes it past code review because the reviewer did not trace the full call chain either. It surfaces in production, or in QA if you are lucky.
Undocumented system behavior is the third productivity killer. The system does things the documentation does not describe. The feature flag system has a nuance where flags are evaluated per-tenant, not globally, which changes how rollouts work. The background job queue has a retry behavior that interacts badly with certain database operations. The cache invalidation strategy has an edge case that only surfaces under specific load conditions. A contractor does not know any of this. They will not know it until they encounter it — which means they will encounter it at the cost of time, and possibly at the cost of production reliability.
Unknown ownership is the fourth productivity killer. The contractor needs to change the notification service. Who owns it? The original author left eight months ago. Their manager thinks the platform team handles it now. The platform team thinks it is still under the product engineering team. The contractor sends a Slack message to the wrong channel, gets redirected, sends another message, and eventually finds the engineer who has the most recent context. This took two days. The change itself took four hours.
Why "write better docs" does not solve it
The documentation-as-solution instinct is understandable but wrong for a structural reason: documentation is a snapshot, and codebases are moving targets. An architecture guide written when the system had five services is wrong when the system has twelve. The onboarding document updated six months ago does not reflect the infrastructure migration completed last quarter. The convention guide published last year does not capture the new error handling pattern adopted after the incident in February.
Writing better documentation is a practice that requires ongoing discipline from engineers who are already resource-constrained. Documentation requires maintenance. Maintained documentation requires ownership. Owned documentation requires someone to update it every time the underlying system changes. In practice, this does not happen — not because engineers are negligent, but because documentation maintenance is the lowest-urgency task in any sprint when there is a backlog of features and bugs competing for the same time.
There is also a discovery problem that documentation cannot solve. A new contractor does not know what questions to ask until they have already made a mistake. The convention about how errors are handled — they did not know to look for that in the documentation because they did not know the codebase had a specific convention. The invisible dependency between PaymentService and FraudCheckService — there is no document titled "invisible dependencies in the payment flow." The documentation that would be useful is the documentation that describes what a new person would not think to look for. That is almost impossible to write proactively.
What a contractor actually needs is not a better answer prepared in advance to questions they have not asked yet. It is a way to get specific, grounded answers to the questions they think to ask in the moment — when they are about to open a file and need to know what service owns a concept, or when they are about to make a change and need to know what else depends on the thing they are changing.
What instant codebase access does for contractor productivity
The week-one questions that currently require finding the right engineer and waiting for a response have specific, verifiable answers in the codebase. The information is not missing — it is inaccessible without the right tool. Queryable codebase context converts those questions from "find the right human and wait" into "ask the system directly and proceed."
Questions contractors ask in week 1 — answered directly by queryable codebase context:
Architecture:
-> "What are the main services and how do they communicate?"
Answer: current service map with sync/async boundaries, queue names,
gRPC vs. REST breakdown — grounded in actual code, not a slide deck
-> "Which service owns user authentication? Where does token validation happen?"
Answer: AuthService owns issuance; API gateway middleware validates
on all downstream calls; specific middleware file and line referenced
-> "Why is OrderService separate from FulfillmentService?"
Answer: the actual boundary — OrderService handles creation and
mutation; FulfillmentService owns post-payment state — with the
services that cross-call and why
Conventions:
-> "How are errors handled in this codebase?"
Answer: Result<T, E> pattern in the domain layer; exceptions for
infrastructure errors; two example services to reference
-> "How should a new background job be structured?"
Answer: base class in JobQueue, retry configuration pattern,
three existing jobs to use as reference
-> "Where do database queries live — service layer, repository, or model?"
Answer: repository pattern, specific file structure, one example
service that follows it cleanly
History:
-> "What is LegacyPaymentAdapter — is it still used?"
Answer: yes, three enterprise clients on the v1 billing flow;
do not remove; PaymentService delegates to it for those accounts
-> "Are the v1 API routes live?"
Answer: yes, two of them; endpoints listed; removal blocked
on customer migration tracked in JiraThe key quality here is specificity. A contractor who asks "how are errors handled in this codebase?" does not need a philosophy of error handling — they need to know which pattern this specific codebase uses, with enough detail to implement it correctly. A queryable semantic index of the actual codebase returns an answer grounded in what the code actually does, not what a style guide says should be done. That distinction matters because in many codebases the style guide and the actual code are different things.
The impact compounds over the engagement. A contractor who starts day three with a real understanding of the service architecture makes correct decisions in code. Those decisions pass code review. The senior engineer who was going to catch the architectural mistake instead reviews code that does not need structural changes. The feedback cycle shortens from days to hours. The contractor ships faster and the senior engineer spends less time on review correction and more time on the work only they can do.
What a contractor can do on day 3 — with vs. without system context:
WITHOUT SYSTEM CONTEXT:
Day 3 state: has read the README, has a local environment running,
has had one architecture call that covered ~10% of what matters.
Assigned task: add rate limiting to the public API endpoints.
Questions they cannot answer without asking someone:
- Which endpoints are "public" vs. internal?
- Is there an existing rate limiting pattern in the codebase?
- Where does middleware live — API gateway, per-service, or both?
- Is there a feature flag system to roll this out gradually?
- What does "gradual rollout" even look like in this stack?
Result: sends five Slack messages. Waits. Gets partial answers.
Starts implementing based on incomplete information.
Day 4 code review reveals two wrong assumptions.
---
WITH SYSTEM CONTEXT:
Day 3 state: same setup, but has been querying the codebase
directly since day 1.
Before opening any files, queries:
-> "What endpoints are exposed publicly vs. internally?"
Gets: the public route prefix, the internal service mesh routes,
and which are authenticated vs. unauthenticated
-> "Is there existing rate limiting anywhere in the codebase?"
Gets: yes — RateLimiter middleware in api-gateway/middleware/,
currently applied to /auth routes only; config in gateway.config.ts
-> "What does the feature flag system look like?"
Gets: LaunchDarkly client in shared/flags/, existing flag structure,
how to add a new flag and wire it to a route
Result: opens the right files on day 3. Implements against existing
patterns. Code review passes. Ships on day 4.The difference on day three is not about intelligence or experience — it is about access. A highly experienced contractor working from incomplete information is less effective than a mid-level contractor who can query the system for exactly the context they need before making each decision. Information access is the variable, not capability.
The week-by-week impact
Contractor onboarding — current model vs. with codebase context access:
CURRENT MODEL:
Week 1 Receives repo link, outdated Confluence page, 45-min onboarding call
with an engineer who covers the top-level architecture.
Spends the week reading files, asking questions on Slack, waiting
for responses. Unclear on service ownership, error handling
conventions, and where the business logic actually lives.
Output: environment set up, zero production code shipped.
Week 2 First ticket assigned. Touches two services they have never seen.
Makes three architectural decisions that turn out to be wrong —
caught in code review. Rewrites. Three Slack threads asking
"is this the right pattern?" No one is sure who the right person
to ask is. One question sits unanswered for two days.
Output: one ticket closed, two in review limbo.
Week 3 Starts to develop intuition. Asks fewer questions. Still does not
know about the background job system, the feature flag setup, or
the two deprecated services that still have live traffic.
Makes a change that interacts with a deprecated service.
Output: two tickets closed, one reverted.
Weeks 4-5 Finally shipping consistently. Three weeks of the contract rate
spent on orientation that produced minimal output.
WITH CODEBASE CONTEXT ACCESS:
Day 1 Before any Slack message, queries: "What are the main services and
how do they relate?" Gets a specific, current answer grounded in
the actual codebase. Understands service ownership and the
system map without a meeting.
Day 2-3 First ticket. Queries the system before opening files:
"What's the error handling convention in this codebase?"
"What services does PaymentService depend on?"
Gets precise answers. Makes correct architectural decisions
first time. Code review passes.
Week 2 Operating on unfamiliar services with context. Queries the
background job system, feature flag setup, deprecated services.
Gets grounded answers. No silent mistakes with dead code paths.
Week 3 Shipping independently. Senior engineer pull-asides are
occasional, not daily. The contract rate now maps to output.The difference in weeks one through three is not cosmetic. A contractor who ships one ticket in week one versus zero tickets in week one is shipping 100% more in that week. Across a six-week engagement, compressing the orientation phase by two weeks means the engagement produces two additional weeks of actual output — at the same cost. That is the ROI argument, and it is not marginal.
There is a secondary benefit that is harder to quantify but equally real: fewer architectural mistakes means less time spent in code review correction cycles, less senior engineer time consumed explaining why a mistake is a mistake, and less risk of something making it to production that reveals a gap in system understanding. The cost of a production incident caused by a contractor who did not know about a critical dependency is not just engineering time — it is customer impact, post-mortem overhead, and the reputational cost of explaining to the rest of the organization why the external hire caused a production issue.
What this means for engineering leaders who hire contractors
The question to ask before a contractor starts is not "how do we write better onboarding documentation?" It is "what does this contractor need to answer their own questions from day one?" Those are different questions with different answers. The documentation question leads to more writing. The information-access question leads to a different tool.
Engineering leaders who hire contractors regularly are absorbing the ramp-up cost repeatedly. Every new contractor engagement starts the same orientation cycle: the same architecture questions, the same convention discoveries, the same invisible dependencies eventually surfaced in code review. The knowledge transfer happens, but it does not persist — it happens to each contractor individually and then disappears when they leave. The next contractor starts from zero.
A queryable codebase layer does not just help the current contractor — it means the cost of bringing the next contractor up to speed is also lower, because the system knowledge is persistent and accessible rather than locked in the heads of engineers who have to re-explain it each time. The organizational benefit compounds with each engagement.
Final take
Contractors are expensive precisely during the period when they are not yet producing. That period is almost always longer than estimated, for a specific and fixable reason: they have no reliable way to build an accurate mental model of the system quickly, so they build it through trial, error, and repeated interruptions of engineers who have limited time to give them.
The fix is not a better onboarding document. It is giving contractors the ability to query the codebase directly — so they spend day one asking the system questions, not waiting for a human to find time in their calendar. Kognita is a managed platform that makes this possible without running anything on the contractor's laptop, without requiring them to clone the full repo for context purposes, and without any action from the engineering team beyond the initial connection. The contractor arrives, the system is ready, and the first day of the contract rate maps to actual output rather than overhead.