
Los IDEs basados en IA están cambiando nuestra forma de programar: desarrollo más rápido, menos problemas con el código repetitivo y sugerencias instantáneas. Pero existe una realidad técnica que debemos abordar:
La IA no solo acelera la codificación , también acelera los errores . 💥
Tras trabajar con Cursor, Copilot y Windsurf en diferentes entornos, he observado que la IA no suele generar código incorrecto. En cambio, genera soluciones técnicamente correctas que ignoran el contexto empresarial y el conocimiento del dominio cruciales.
Esto es lo que los asistentes de codificación de IA generalmente hacen mal:
❌ Sugerencia de IA: Parece eficiente pero tiene un sutil problema de consulta N+1
const getUsersWithOrders = async (): Promise<UserWithOrders[]> => { // Fetch all users - seems reasonable const users = await prisma.user.findMany({ where: { status: 'ACTIVE' } }); // For each user, get their orders - the subtle N+1 query issue const usersWithOrders = await Promise.all( users.map(async (user) => { const orders = await prisma.order.findMany({ where: { userId: user.id }, orderBy: { createdAt: 'desc' }, take: 5 // Just get recent orders }); return { ...user, orders }; }) ); return usersWithOrders; };
const getUsersWithOrders = async (): Promise<UserWithOrders[]> => { // One efficient query with proper inclusion of related data const users = await prisma.user.findMany({ where: { status: 'ACTIVE' }, include: { orders: { orderBy: { createdAt: 'desc' }, take: 5, } } }); // Server-side data transformation if needed return users.map(user => ({ ...user, orders: user.orders, // Transform any data if required totalSpent: user.orders.reduce((sum, order) => sum + order.total, 0) })); };
interface User { id: string; name: string; email: string; } const getUserDetails = async (userId: string): Promise<User> => { const response = await fetch(`/api/users/${userId}`); if (!response.ok) throw new Error('Failed to fetch user'); return await response.json(); };
import { ApiService } from '@/services/api'; import { User } from '@/types/user'; import { handleApiError } from '@/utils/error-handling'; export const getUserDetails = async (userId: string): Promise<User> => { try { return await ApiService.get<User>(`users/${userId}`); } catch (error) { return handleApiError(error, 'Failed to fetch user details'); } };
❌ Sugerencia de IA: Cálculo de descuento técnicamente correcto
const calculateDiscount = (price: number, discountPercent: number): number => { const discountAmount = price * (discountPercent / 100); return price - discountAmount; };
const calculateDiscount = (price: number, discountPercent: number): number => { // Company policy: Maximum discount is 40% unless approved const effectiveDiscount = Math.min(discountPercent, 40); // Business rule: Discounts are calculated after tax in our system const priceWithTax = addTax(price); const discountAmount = priceWithTax * (effectiveDiscount / 100); // Format to company standard: always round to nearest cent return Number((priceWithTax - discountAmount).toFixed(2)); };
El patrón es claro: la IA destaca por generar código sintácticamente correcto y algorítmicamente sólido. Lo que constantemente falla es:
1. Reserve la IA para el código repetitivo, pero revise los puntos de integración con cuidado : la IA se destaca en generar patrones repetitivos, pero a menudo pasa por alto cómo se conectan los componentes en sistemas más grandes.
2. Elabora indicaciones precisas y contextualizadas .
3. Verifique los casos extremos que la IA podría pasar por alto.
describe('calculateDiscount', () => { it('correctly calculates a 20% discount on $100', () => { expect(calculateDiscount(100, 20)).toBe(80); }); it('handles zero price', () => { expect(calculateDiscount(0, 15)).toBe(0); }); it('handles zero discount', () => { expect(calculateDiscount(50, 0)).toBe(50); }); it('handles decimal precision correctly', () => { expect(calculateDiscount(9.99, 10)).toBe(8.99); }); it('rejects negative prices', () => { expect(() => calculateDiscount(-10, 20)).toThrow(); }); it('rejects invalid discount percentages', () => { expect(() => calculateDiscount(100, 101)).toThrow(); expect(() => calculateDiscount(100, -5)).toThrow(); }); });
Estos no son “errores” en el sentido tradicional, sino más bien una limitación fundamental: la IA no puede comprender el dominio de su negocio, los estándares de la empresa o el contexto completo de la arquitectura de su aplicación como lo haría un miembro experimentado del equipo.
En resumen, la IA es una herramienta poderosa, pero no es tu director de tecnología. Piensa críticamente. Revisa con ahínco. Programa con inteligencia.
📢 “El Diario del Ingeniero” es donde desciframos el mundo de la IA, la Web3 y la ingeniería de software, sin rodeos. Suscríbete para obtener información detallada, mejores prácticas de programación y experiencias reales de depuración.
🛠 Suscríbete al boletín → Bitácora del Ingeniero