Falla o Error

28 05 2009

Un error no se convierte en una falla hasta que te rehusas a corregirlo.
- Orlando A. Battista

Ultimamente me ha tocado ver a varios compañeros y amigos que a la hora de obtener una excepción inesperada en sus pruebas unitarias, las manejan dentro del test de la siguiente manera:

public void testIndexOutOfBoundsException() {
try{
//Este codigo arrojara una excepcion no esperada
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
catch (IndexOutOfBoundsException iobex){
fail();
iobex.printStackTrace();
}
}

Este manejo de errores aunque funcional, no es la manera optima de manejar los errores inesperados en nuestras pruebas por las sigueintes razones:

  1. Si aparece un error inesperado en tus pruebas, lo que quieres es parar la ejecución inmediatamente para corregirlo.
  2. Si tienes varias excepciones potenciales que son arrojadas en tu código, entonces tendras codigo redundante en la prueba solo para fallarla.
  3. Más lineas de código hacen que la prueba sea más díficil de leer.
  4. Semanticamente para JUnit una falla es diferente que un error. (A partir de JUnit 4.x esto cambia)

Entonces, por eso y muchas cosas más (:)), una manera de mejorar la forma en que manejamos errores no esperados es haciendo lo siguiente:

public void testIndexOutOfBoundsException() throws IndexOutOfBoundsException{
//Este codigo arrojara una excepcion no esperada
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}

Así está prueba al fallar detentra el proceso y despues de explicar a tus compañeros como pudiste obviar ese caso y tragarte tu orgullo, lo tendrás de arreglar.

Ahora, la pregunta es, ¿Qué pasa si quiero probar que de verdad mi código arroje una excepción bajo ciertas condiciones? En este caso, lo primero que me queda es felicitarte por que eso me indica no solo estás probando el camino amarillo, sino casos raros que pudieran generar errores, entonces, si esto pasa haremos lo siguiente en el código:

@Test(expected=IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}

Si se fijan, JUnit 4 nos proveé de una annotation para arrojar la excepción y de esa manera podemos probar nuestro código esta funcionando como es corrector. Para más información sigan el siguiente link:  http://junit.sourceforge.net/doc/faq/faq.htm#tests_7 . Y recuerda si alguíen te pregunta por que tus tests arrojan excepciones responde, “Por que una falla no es lo mismo que un error”.



¡Corre!, navegador, ¡Corre!

24 04 2009

A los que corren en un laberinto, su misma velocidad los confunde.
Seneca.

Mientras los usuarios demandan aplicaciones Web más rápidas y los programadores aplicaciones más faciles de mantener, algunos trucos salen a la luz y quisiera compartir uno con ustedes. Como ustedes saben (ó no) los navegadores Web tiene un numero predeterminado de hilos mediante los cuales pedirán recursos al servidor.  De manera que al mismo tiempo sólo tendran un par de imagenes ó CSS ó JS desde el lugar en el que este alojada su página. Esto es una pena ya que por más veloz que sea su servidor o la conexión de su cliente, sólo tiene un par de “canales” a la vez y los recursos tendran que formar una fila para cargarse.

Pero, ¿Cómo resolvemos este problema?, debemos de configurar diferentes “hosts” para nuestro recurso, el ubicar nuestras imagenes, CSS, JS y demás en diferentes servidores sería muy complicado y una pesadilla para mantener, de manera que hacemos uso de una de las herramientas con las que nos provee JSP 2.0, Funciones de EL (Expression Language) a la medida, veamos un ejemplo.

El servidor necesita cargar tres imagenes (puede necesitar muchas imageneres, CSS, y archivos JS, todo el contenido estatico necesario), de manera que nuestro código luce de esta manera:

<img src="http://www.misitio.com/encabezado1" alt="Encabezado 1" />
<img src="http://www.misitio.com/producto1" alt="Producto 1" />
<img src="http://www.misitio.com/noticia1" alt="Noticia 1" />

Para poder ser capaces de explotar al máximo las capacidades de los navegadores que visualizaran nuestra página, nuestro código debería verse así:

<img src="http://imagenesdeencabezado.misitio.com/encabezado1" alt="Encabezado 1" />
<img src="http://imagenesdeproducto.tusitio.com/producto1" alt="Producto 1" />
<img src="http://imagenesdenoticias.elsitio.com/noticia1" alt="Noticia 1" />

Para solucionar esto vamos a crear una funcion de EL a nuestra medida, primero creamos el código de nuestra funcion en una clase normal de Java:

public static String qualifiedResourcePath(String relativePath, ServletRequest request){
domainNames = domainNamesProperty.getStringArray();  //Obtenemos una propiedad de algún lado ;)
String protocol = getProtocolFromRequest(request);  // Si es http regresamos http en el protocolo y https si es seguro
int hashIndex = Math.abs(relativePath.hashCode()) % domainNames.length;  // Obtenemos un elemento del arreglo al azar
return protocol + "://" + domainNames[hashIndex] + relativePath;  // El producto final, un nuevo host y el path de nuestro recurso estatico
}

Nuestra declaración en el tld rezaría así:

<function>
<name>staticPath</name>
<function-class>com.misitio.elfunc.ResourcePath</function-class>
<function-signature>
java.lang.String qualifiedResourcePath( java.lang.String, javax.servlet.ServletRequest )
</function-signature>
</function>

Y ya sólo nos quedaría utilizarlo en nuestros JSP’s de esta manera:

<img src="${miprefijo:staticPath('/imagenes/miimagen1.jpg', pageContext.request)}" alt="Mi imagen 1" />

De está manera podemos engañar a nuestros navegadores y hacer que nuestra página se cargue más rápido si tenemos mucho contenido estatico y de imagenes. Hasta la próxima.



Año nuevo, lenguaje nuevo

19 01 2009

Todos los años iniciamos con nuevos propósitos, este año nuevo uno de los mios es seguir los consejos del Pragmatic Programmer (este libro es para mi unos de los mejores libros a leer si eres un programador, si no es que el mejor) en su página 14, el consejo que te dan (uno de tantos) es que cuides tu portafolio de conocimientos, que desarrolles tu carrera aunque en tu empresa o trabajo no te lo demanden, tienes que estar preparado para lo que el mercado pueda requerir, sin importar el que por el momento no uses ese conocimiento. Una de las maneras que sugieren ellos para mejorar tu portafolio es el aprender un lenguaje de programación cada año, los demás consejos se los daré luego. El estar preparado en épocas de recesión es la mejor manera que tienes para prevenir cualquier eventualidad, es importante cuides tu currículo en caso de que tengas que cambiar de aires. Entonces… estoy a punto de escoger un lenguaje de programación para este año, mientras evalúo mis opciones me gustaría comentaran que lenguaje les parece interesante y ¿Por qué? En estos momentos yo puedo programar en:

  •  Java
  • Ruby (& Rails)
  • VB .Net
  • Delphi
  • PHP
  • Javascript (Si, si es un lenguaje)
  • C/C++

Claro que no proclamo ser experto en estos lenguajes pero puedo ejecutar tareas relacionadas al trabajo sin ayuda, o con la ayuda de google, así que no los quiero meter en mi próximo lenguaje a aprender, sin que esto constituya el que los abandone y no siga aprendiendo de ellos. Las opciones que tengo son:

  •  ActionScript (& Flex)
  • C#
  • Scala
  • Groovy
  • Lua
  • Erlang
  • Python
  • Perl

Si tienen alguna otra opción me gustaría escucharla y si quieren ayudarme a elegir alguno de la lista, mandenme el porque les gusta y que ventajas o desventajas creen que me daría para programar.



Invierte en tu carrera.

30 11 2008

Invertir en conocimientos produce siempre los mejores beneficios.
Benjamin Franklin.

Una de las cosas que más me ha beneficiado en mi carrera (al menos en mi particular punto de vista) es el invertir en mi mismo y en mi carrera, a lo largo de ella esto es lo que he visto que yo he tenido que pagar de mi bolsillo para crecer un poco más:

  •     Mi pasaporte y visa de EEUU. (250 USD)
  •     Mis examenes de certificación de Java. (200 USD)
  •     Mi maestría (estudiandola todavía) (23,000 USD)
  •     Más de 20 libros de programación (Pragmatic Programmer, Java Certification, Design Patterns, Head First, etc.) (700 USD)
  •     Conferencias y Congresos. (500 USD)
  •     Mis clases de Inglés. (1000 USD)

En mi caso cada una de estas inversiones ha dejado muchisimo más en beneficios con el tiempo, estos beneficios han sido en conocimientos y también en beneficios en mi paquete de compensación como sueldo y rango.

Al ser un mejor programador debido a la experiencia y conocimientos que ganas con estos cursos y recursos empiezas a diferenciarte de los demás y a hacer mejor tu trabajo, las credenciales por si mismas no te ayudan en nada (Aunque la industria a veces quiera creer que sí), pero te ayuda a practicar, la practica hace al maestro, entonces invertir en ti mismo ayuda a mejorar día a día, algo que todos buscamos.

Pero… He visto mucha o quiza demasiada gente en esta industria que al carecer sus compañias de recursos o voluntad para pagarles el entrenamiento, examenes o tramites no mueven un dedo bajo el argumento de que la empresa lo debería pagar, esto es un craso error, tu ganas más que la empresa al prepararte, claro que la empresa va a tener a un mejor recurso trabajando para ellos, pero tu vas a tener una mejor capacitación, vas a hacer mejor tu trabajo y a estar más cerca de tus objetivos. El dejar en manos de tu empresa tu desarrollo profesional no sólo es un error, si no una invitación al suicidio profesional.

En estos tiempos díficiles de la economía las empresas sacrifican erroneamente este presupuesto, eso es un hecho, así que en lo que te activas como revolucionario para cambiarlo, también empieza a invertir en ti mismo. Dejo algunos ejemplos de excusas y respuestas para reafirmar el por que de cada decisión.

Excusa. Mi empresa no me quiere pagar la visa de EEUU.
Respuesta. La visa de EEUU es una de las herramientas más importantes de trabajar en una empresa internacional de software, el near shore ha hecho posible que los programadores mexicanos viajen a EEUU y obtengan capacitación del proyecto para despues terminarlo en México. Sin contar con la experiencia de vida y profesional que ganas con cada viaje.

Excusa. Mi empresa no me da voucher para mi certificación de Java.
Respuesta. ¡Paguesela usted! No es demasiado cara y en cuanto la tengas tienes dos opciones, aplicar para un mejor puesto ó irte a una empresa que la valore.

Excusa. Es que el presupuesto de educación fue recortado.
Respuesta. Siempre existe la manera de comprar un libro, de conseguir un curso a la medidad de nuestras necesidades, no lo dejes en manos de la empresa.

En epocas de vacas flacas lo mejor es prepararse para los imprevistos, no hay mejor manera de prepararse que invertir en tu futuro. Piensalo, ¿Cuánto gastas en partidos de las chivas o en cervezas?



Practicando programación.

17 11 2008

La victoria es del mas perseverante.
Napoleón Bonaparte

Estos ultimos días he estado sin proyecto ya que como consultor siempre hay un pequeño descanso entre proyectos para tomar vacaciones, recargar energías, quitarse lo malhumorado y practicar nuevas tecnologías, muchos toman el descanso de manera diferente, a mi en lo partícular me gusta practicar programación. El porque me gusta hacerlo será el tema de esta entrada (nombraré al post entrada en un afan de hacerlo todo en Español, aunque sigue sin convencerme el termino "entrada").

Me gusta practicar programación cada vez que puedo por que es escencial para desarrollar al programador humilde que todos queremos llegar a ser, la unica meta que tengo día a día, es ser menos maleta que el día anterior, esto me a ayudado a aprender algo nuevo durante cada día que he trabajado. No importa si en algún momento te sientes el más inexperto o poco habil en tu equipo de trabajo, esto nos pasa a todos, de hecho el no serlo significa que no estas aprendiendo de tus compañeros y quiza necesitas un nuevo reto. Pero, ¿Cómo se practica programación? Existen dos forma:

1. Practica como dios te dio a entender. A veces no importa que es lo que hagas para practicar, sólo escribe código, despues mejoralo y resuelve otro problema, repite esa serie durante mucho, mucho tiempo y empezaras a mejorar.

2. Busca retos cada día, he aquí algunas ideas.

Esto no es de un día para otro, pero al cabo de un tiempo, te iras dando cuenta que los conocimientos que vayas adquiriendo te sirven para muchas cosas, desde ayudar a tus compañeros, soprender a tus jefes, tener más tiempo para jugar Halo y demás. Al final de cuentas si este es tu trabajo, no hay razón por la cual no practicar para ser cada día mejor, ¿No lo crees?