Escolar Documentos
Profissional Documentos
Cultura Documentos
Reutilizacin
Usabilidad
Variables
Comparaciones
Complejidad
Seguridad
Validacin de datos
Optimizacin
Excepciones
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
CONTENIDOS
3
11
12
14
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
sto es un recopilatorio de Gambadas orientada a dar consejos generales para programadores sobre cmo escribir un mejor cdigo.
Para ello revisaremos algunos de los errores ms comunes que to-
Error #1:
uchas veces, por desgracia, los programadores escribimos ms para el compilador que para las
personas. Hay muchos ejemplos:
Esa expresin sper-optimizada que el compilador entender sin problemas pero que una persona tendr dificultades para comprender.
Esa estructura en la que, por ahorrar espacio (ya sabemos que el GB disco duro va carsimo),
omites los parntesis y llaves, y adems escribes en una sola lnea varias instrucciones ya que, de
todos modos, se van a interpretar bien.
Divides el cdigo en varias partes, cada una en una clase diferente, entrelazndolos mediante
eventos o llamadas encadenadas. S, seguro, es cool pero, aunque creas lo contrario, la Separacin de Responsabilidades no es eso y adems lo que haces es liar tu cdigo tremendamente.
Cualquiera le sigue la pista!
Usas nombres de variables tan clarificadores como s, res, i o n. Estupendo, has ahorrado unos
bytes, pero no sera mejor que las variables tuvieran un nombre adecuado a la funcin que cumplen y siguiendo algn tipo de notacin?
No usas comentarios, porque al fin y al cabo el cdigo es muy fcil de entender y siempre puedes ejecutarlo paso a paso. Claro que, ahora acurdate de por qu hacas precisamente eso y no
otra cosa. O explcale a otro programador aquella optimizacin que hiciste por aquel motivo de
rendimiento tan concreto.
Los mejores cursos online para programadores
www.campusMVP.es
En todo esto lo que subyace es la siguiente pregunta: Si alguien tiene que leer tu cdigo lo entender? Podr seguirle la pista enseguida? O lo que es ms importante: lo entenders t si lo vuelves
a leer dentro de tres meses? El compilador traga con todo y lo entiende todo, pero las personas no.
Aunque muchos no lo crean, lo ms importante de un buen cdigo no es lo optimizado que est
(salvo en muy pocas excepciones), sino lo fcil de mantener que sea en el futuro. Y esto depende
de la persona que lo escribe y de lo fcil que lo haga para otras personas.
As que escribe cdigo ms amable y fcil de seguir. Piensa en las personas (incluso en ti mismo)
que ms adelante tendrn que leerlo y entenderlo para darle soporte, y piensa menos en el lenguaje
o el compilador.
Ah!, y usa comentarios, pero comentarios que tengan sentido. No tengas miedo de extenderte. Sabes aquel viejo chiste que dice que si se desvelara el cdigo completo del ADN del hombre, el 90%
seran comentarios? Pues aplcate el cuento ;-)
Error #2:
os programadores que ya tienen unos cuantos aos de prctica a sus espaldas recordarn los
tiempos de Visual Basic 5.0 o de ASP 3.0 clsico. Estos lenguajes tenan el problema de contar
con variables globales, es decir, aquellas que son accesibles desde cualquier parte de tu cdigo.
La ventaja de las variables globales es que te permiten acceder a su contenido en cualquier momento
y desde cualquier lnea de tu cdigo, por lo que vienen genial para compartir informacin. La parte
mala de las variables globales es exactamente la misma: al poder acceder a ellas desde cualquier
parte nunca puedes estar seguro de su valor.
Lo que ocurre es que muchas de las veces que vas a usar una variable global, asumes que sta con-
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
Error #3:
unos meses. Otro factor adicional es el poder hacer el testing adecuadamente. Si tenemos un cdigo
muy largo y por lo tanto con muchos condicionales, bucles, etc... se hace difcil testearlo bien y llegar
a una buena cobertura de cdigo. De hecho existe una medida formal de la complejidad del cdigo:
la Complejidad Ciclomtica. Aunque su uso formal es complicado y la frmula compleja, existe una
regla general muy interesante para calcular la CC de manera aproximada y saber si tu cdigo es demasiado largo: cuenta el nmero de condicionales y bucles que tiene tu rutina y smale 1. Si tienes
ms de 9 o 10 ya sabes: refactoriza, extrae mtodos, simplifica... Tu cdigo y t mismo lo agradeceris
en el futuro.
Error #4:
n problema muy comn en los programadores es que son incapaces de imaginarse situaciones diferentes a las que ya han
considerado en su cdigo. Y lo cierto es que a veces les falta imaginacin. As, ocurren cosas como
que un campo que slo puede aceptar nmeros
enteros se valida -en efecto- para comprobar que
no tiene decimales, pero no se nos ocurre que los
usuarios quiz tengan la brillante idea de introdu-
unca, jams, en la
vida, te fes de nada
que llegue introducido
por un usuario.
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
As que no te olvides: por elegancia y robustez de la aplicacin pero sobre todo por seguridad: valida absolutamente todo lo que te llegue desde los usuarios, y piensa en todos los posibles casos
dependiendo del tipo de datos que vayas a recibir. Incluso piensa en qu ocurrira si te mandan la
informacin usando un tipo de datos diferente al que esperabas inicialmente. Tu aplicacin, tus datos
y tus usuarios te lo agradecern.
Error #5:
radicionalmente se han utilizado diversas tcnicas para notificar que algo ha fallado dentro
de un mtodo o funcin.
Por ejemplo, algo muy tpico que constituye una costumbre muy mala es capturar siempre todas las
excepciones de manera genrica. Por qu lo haces? Lo bonito de estas tcnicas es que nos permiten ser muy especficos con el tipo de excepcin que capturamos en el catch, pudiendo as hilar fino
en la gestin o delegarla al nivel de la pila de llamadas que ms nos interese.
Otra mala praxis tpica es la de capturar los errores de manera genrica para, a continuacin, dejar
el catch en blanco. No lo hagas! Si pasa algo que no te esperabas (y siempre pasa algo que no te
esperas) no te enterars. S, tu aplicacin no romper, pero si deja de funcionar correctamente no
tendrs manera de saber por qu ocurre.
Si eres de los todava devuelven constantes para marcar que han ocurrido errores, olvdate de esa
tcnica desfasada y adopta la gestin estructurada :-)
Error #6:
a expresin ms comn para este error es Optimizacin prematura y fue acuada por el legendario informtico Donald Knuth en su libro clsico de 1974 Structured Programming with
go to Statements. A pesar de haber pasado casi 40 aos el principio sigue siendo perfecta-
mente vlido.
Esta expresin se refiere a la situacin comn en la que un programador tiene a un pequeo demonio sentado en su hombro dicindole: Seguro que si tocas ese cdigo puedes hacer que vaya mucho
ms rpido. Hazlo ahora!. Y lo hace :-)
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
No podemos dejar que, sin un anlisis global de rendimiento, pequeas consideraciones sobre la
eficiencia o rendimiento de un cdigo afecten a nuestras decisiones de diseo. En concreto Donald
deca:
Debemos olvidarnos de las pequeas eficiencias, digamos el 97% del tiempo: la optimizacin prematura es la raz de todo mal.
A lo que aada:
De todos modos no debemos pasar por alto las oportunidades de ese otro 3%
Lo que quera decir es que, sin tener unas mediciones
precisas y globales de la aplicacin, no deberamos optimizar por el mero hecho de que pensemos que podemos
mejorar el rendimiento. Hay optimizaciones triviales (ese
3%) que deberamos hacer (como no concatenar cadenas
de texto en un bucle largo), pero todo lo que no sea as
de obvio es mejor dejarlo de lado hasta que realmente lo
ebemos olvidarnos
de las pequeas
eficiencias, digamos el
mizacin prematura es la
Error #7:
Obviamente la seguridad es algo deseable y que se da por hecho, pero lo cierto es que la mayora
de los sistemas son inseguros. Esto es especialmente cierto para aquellos que estn conectados a
Internet o a una red, que en la actualidad son la mayora.
Muchos programadores tienden a pensar que la seguridad es ms bien cosa de la gente de sistemas: para eso, esos tos feos se dedican a colocar cortafuegos, sistemas de deteccin de intrusos,
defensas ante ataques DDOS y dems ingenios para controlar las comunicaciones.
Lo cierto es que en la mayor parte de los sistemas que se asaltan usando medidas tcnicas (y no
ingeniera social), se utilizan debilidades en la forma en la que est escrito el cdigo.
Ya hablbamos en el Error #4 de esta serie sobre la importancia de validar los datos. En aquella
ocasin nos referamos ms bien a la evitar posibles errores por conversiones o tipos de datos invlidos. Pero realmente, esta validacin debe hacerse tambin para evitar problemas de seguridad. Ataques como los de Inyeccin de SQL, Cross-Site-Scripting (XSS), Cross-Site Request Forgery (CSRF)
son muy comunes y en gran parte se pueden mitigar validando los datos de entrada desde el punto
de vista de seguridad.
Otra cuestin que generalmente se hace mal, es todo lo que tiene que ver con el tratamiento de
informacin confidencial: desde la gestin de credenciales y claves de acceso, hasta el almacenamiento seguro de datos de manera que slo puedan ser accedidos por ciertos usuarios. Se suele
almacenar ms informacin confidencial de la realmente necesaria, muchas veces se guardan contraseas en claro en las bases de datos (escapa como de la peste de los sitios que te ofrecen recuperar
tu clave por email, y no generar una nueva: mala seal!), en otras ocasiones los algoritmos de cifrado
son muy dbiles o no se utilizan adecuadamente....
Y eso nos lleva a la cuestin de la criptografa: se suele utilizar muy mal. Por ejemplo, no se hace un
uso adecuado de los salt para cifrado o clculo de hashes (recomendamos encarecidamente que te
leas este artculo de Troy Hunt), nos inventamos nuestros propios algoritmos de cifrado o seguridad
(la madre de todos los errores!), se utilizan claves de
cifrado dbiles, no se entiende bien cmo funcionan
los sistemas de clave pblica....
Existen infinidad de otros puntos a considerar. Podramos escribir un libro solo sobre este tema (de hecho
los hay y muy buenos). La idea con la que debemos
quedarnos es que en cada lnea de cdigo que escribas tienes que pensar en la seguridad. No puede
ser un pensamiento a posteriori, cuando ya est todo
terminado.
Para hacerlo bien deberamos tener formacin en seguridad (para saber por dnde nos pueden venir los
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
10
problemas), planificar la seguridad a alto nivel junto con la arquitectura de la aplicacin, y luego
pensar en cualquier dato que manejemos y en cmo podra verse comprometido. Es laborioso pero
no hay otra manera...
Error #8:
11
hacer entonces la comparacin? No tiene sentido hacerlo y sobra el comparador, que generalmente
ponemos por mimetismo con el caso general. Sera ms lgico y elegante simplemente escribir:
if (miBooleano){
}
....
Verdad?
Quiz la nica excepcin a esta regla no escrita de elegancia en el cdigo puede darse en el lenguaje
JavaScript. Como se trata de un lenguaje poco tipado se suele utilizar el comparador === para
asegurar que una variable no slo tiene un valor determinado, sino que adems ambos valores (el de
la variable y el del valor con el que se compara) son exactamente del mismo tipo y no se convierte
implcitamente durante la comparacin:
if (miBooleano === true){
....
}
No siempre es necesario o tiene sentido, pero en algunas ocasiones puede ser til si debemos asegurar igualdad en valor y en tipo. Esta sera la excepcin.
Quiz te parezca que nos hemos puesto excesivamente puntillosos con este asunto, pero realmente
en estos pequeos detalles se marcan las diferencias entre los buenos y los grandes programadores
;-)
Error #9:
muchos programadores les cuesta horriblemente pensar cmo lo hara uno de sus usuarios.
El mayor problema suele ser que, como el programador conoce muy bien cmo est hecho
el programa por debajo y cul es la manera correcta de trabajar con l, tiende a adaptar
el paradigma de funcionamiento a este conocimiento. Pero eso hace que muchas veces nos olvidemos por completo de cmo piensan los usuarios, que slo quieren solucionar sus problemas y sacar
adelante sus tareas.
Para ver un ejemplo en la prctica consideremos cmo han funcionado histricamente los procesadores de texto. El programador sabe cmo funciona un ordenador y sabe que lo que el usuario
escribe en la pantalla se va almacenando en algn lugar de la memoria. Estos datos se perdern si
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
12
13
As que la moraleja sera: no dejes para el final la interfaz, y trata de pensar siempre como un usuario y no como un tcnico. Imagina que no sabes nada sobre cmo funciona tu aplicacin ni sobre
cmo est organizada, y piensa en cambio en cmo es el esquema mental de tus usuarios. Conseguirs software mucho ms exitoso y que la gente quiera usar :-)
Error #10:
Reinventar la rueda... y
todo lo contrario
Por mucho que algunos quieran negarlo, esta profesin tiene mucho de ego personal, con una alta
dosis de obsesin por el control y un pellizco de
dificultades para delegar.
El sndrome del No Inventado Aqu (ms conocido como NIH por sus siglas en ingls), se refiere a
desechar la opcin de utilizar algn componente externo de software que no haya sido creado por
uno mismo o dentro de la empresa. Es lo que se llama tambin Reinventar la rueda.
Los motivos para caer en el NIH pueden ser mltiples, y se parecen a una lista de pecados:
Orgullo: El cdigo no me gusta porque no est escrito siguiendo mi estilo, as que no me quiero
molestar en comprenderlo.
Obsesin por el control: Si uso algo que no he hecho yo, no har exactamente lo que yo quiero
y como yo lo quiero.
Desconfianza: Tengo la certeza de que no va a ser tan seguro o estable como algo que haga yo
mismo o mi equipo.
Egosmo: aunque al cliente le urge, prefiero hacerlo a mi manera que acelerar la entrega con algo
en lo que no confo.
Avaricia mal entendida: si lo construimos nosotros nos ahorraremos el dinero de las licencias. Ya.
Pero cul ser el verdadero coste de desarrollar algo remotamente similar?.
Duda: qu pasar en el futuro si dejan de mantenerlo o desaparece?.
Narcisismo: si lo hago yo mismo ganar muchos puntos ante los jefes por la proeza.
Soberbia: si no resuelvo yo mismo las dificultades tcnicas, entonces este trabajo carece de sentido. Yo, y solo yo, debo ocuparme de esto y llevarlo a buen puerto, as que rechazo cualquier
ayuda externa.
facebook.com/campusMVP
twitter.com/campusMVP
www.youtube.com/campusMVPes
14
Lo cierto es que para casi cualquier cosa que necesitemos ya existir en el mercado algo que se parezca mucho a lo que buscamos, o que ser exactamente lo que nos hace falta. Entonces por qu
reinventar la rueda y hacerlo nosotros?.
Existen algunos motivos (aunque pocos) por los que es mejor ocuparnos nosotros mismos y de
verdad ponernos a reinventar la rueda en lugar de comprar o descargar un componente externo:
La licencia de lo que hay en el mercado no nos permite distribuirlo dentro de un paquete comercial.
Si buscamos algn componente o biblioteca del que hay poca variedad, y hay indicios autnticos de que los pocos proveedores existentes no merecen confianza (vemos cdigo inestable,
empresas que en cualquier momento desaparece, proyectos Open Source que hace aos que no
se actualizan...). En este caso quiz es mejor idea implementar algo nosotros mismos. Si algn
componente es Open Source podemos partir de ese cdigo para hacerlo, pero ojo con la licencia
y lo que nos permite hacer.
Lo que necesitamos es, en realidad, el ncleo de funcionalidad de nuestro producto. En este
caso no hay duda: si ests seguro de que el producto tiene sentido lo lgico es construirlo. Si te
limitas a comprarlo, cualquier otro puede venir despus a competir con vosotros. Claro que esto
dara para un gran debate sobre si lo que importa es el producto o es el marketing y la forma de
llegar al mercado... Pero eso quiz sea tema de otro artculo algn da :-)
En resumen: por regla general lo mejor es no tener miedo a utilizar cdigo ajeno y debemos tratar
de no reinventar la rueda constantemente. El trabajo de programador es entregar a tiempo y con
calidad soluciones que funcionen, no demostrar lo buenos que somos retrasando el proyecto y
aumentando los riesgos por el mero hecho de querer hacerlo todo uno mismo. Ahora bien, si lo
que necesitamos es parte de la funcionalidad esencial del producto, entonces s que merece la pena
invertir en construirlo.
15