According to a Belitsoft survey published this week, 42% of code written by React developers is now generated by AI tools — and that figure is projected to reach 65% by the end of 2027. With 90% of developers reporting regular AI tool usage in their workflow, the industry has moved well past the "AI as assistant" phase into something more structural.
What's Actually Changing in Practice
GitHub Copilot, Claude Code, and Cursor have become standard tools on most teams. The impact isn't uniform — some tasks benefit dramatically, others remain human work.
Scaffolding and Boilerplate
AI excels at generating typed component scaffolding, API client code, and form validation logic. A prompt like "create a paginated table component with TypeScript generics" produces working code in seconds:
interface Column<T> {
key: keyof T;
header: string;
render?: (value: T[keyof T], row: T) => React.ReactNode;
}
interface DataTableProps<T> {
data: T[];
columns: Column<T>[];
pageSize?: number;
}
export function DataTable<T extends { id: string | number }>({
data,
columns,
pageSize = 20,
}: DataTableProps<T>) {
const [page, setPage] = useState(0);
const total = Math.ceil(data.length / pageSize);
const rows = data.slice(page * pageSize, (page + 1) * pageSize);
return (
<div className="overflow-x-auto">
<table className="min-w-full text-sm">
<thead>
<tr>
{columns.map((col) => (
<th key={String(col.key)} className="px-4 py-2 text-left font-medium">
{col.header}
</th>
))}
</tr>
</thead>
<tbody>
{rows.map((row) => (
<tr key={row.id}>
{columns.map((col) => (
<td key={String(col.key)} className="px-4 py-2">
{col.render ? col.render(row[col.key], row) : String(row[col.key])}
</td>
))}
</tr>
))}
</tbody>
</table>
</div>
);
}The output is functional. The question is whether the design fits your architecture — that's still a human judgment call.
Test Generation Alongside Implementation
Generating tests at the same time as implementation has become a natural workflow:
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
test("renders all rows", () => {
const data = [
{ id: 1, name: "Alice", role: "Engineer" },
{ id: 2, name: "Bob", role: "Designer" },
];
const columns = [
{ key: "name" as const, header: "Name" },
{ key: "role" as const, header: "Role" },
];
render(<DataTable data={data} columns={columns} />);
expect(screen.getByText("Alice")).toBeInTheDocument();
expect(screen.getByText("Bob")).toBeInTheDocument();
});
test("paginates to the next page", async () => {
const data = Array.from({ length: 25 }, (_, i) => ({ id: i, name: `User ${i}` }));
render(<DataTable data={data} columns={[{ key: "name", header: "Name" }]} pageSize={10} />);
expect(screen.getByText("1 / 3")).toBeInTheDocument();
await userEvent.click(screen.getByRole("button", { name: /next/i }));
expect(screen.getByText("2 / 3")).toBeInTheDocument();
});The combination of implementation + tests from a single prompt forces you to think about behavior upfront — similar to TDD, but faster to bootstrap.
Code Review Focus Has Shifted
When boilerplate is AI-generated, reviewers spend less time on syntax and more on design correctness, edge case handling, and business logic alignment. This is an improvement — but it requires reviewers to be more alert to subtle issues that AI commonly introduces.
Common Issues in AI-Generated Code
| Issue | Example | Mitigation |
|---|---|---|
| Security gaps | Unescaped user input, missing CSRF protection | Maintain a security review checklist |
| Performance blind spots | N+1 queries, unnecessary re-renders | Profile before shipping |
| Over-abstraction | Hooks that wrap a single useState | Apply YAGNI strictly |
| Stale patterns | Using deprecated APIs | Pin library versions in prompts |
Practical Recommendations
If you're standardizing AI tool usage on your team:
- Include constraints in prompts: "TypeScript strict mode", "Zod for validation", "no external dependencies"
- Always review error paths: AI tends to optimize for the happy path and handle errors superficially
- Generate tests with implementation: Don't treat test generation as a separate step
- Document architecture constraints in a context file (e.g., CLAUDE.md) so AI-generated code fits your project's patterns by default
The 42% figure is significant, but the quality gap between teams using AI well and teams using it carelessly is widening. The advantage compounds — but only when human judgment governs what actually gets merged.