Category Archives: Programacion

Temporada 3 – Rock Developer

Es un tema de controversia, siempre lo ha sido. ¿Cúal es la mejor forma de desarrollar productos?

El día de hoy discutimos sobre las razones para usar la metodología de desarrollo ágil en el tan esperado regreso del podcast RockDeveloper.

Reciban un cordial saludo de sus conductores Cesar Reyes y Iaax Page

Control de Calidad

Ultimamente han venido a mi cabeza ideas de analogías sobre el control de calidad, y he querido expresarlas aquí.

Que sucede comunmente cuando se desarrollan proyectos a pequeña-mediana escala y estos son evaluados por los usuarios finales ?

Les dibujo un panorama antes. Una micro-empresa los contrata para el desarrollo de una aplicación web, donde tienen que administrar la venta en línea de ciertos productos. Esta aplicación tiene dos ámbitos: uno público para el consumidor final, y otro administrativo para personal entrenado. Gente que sabe, o debería saber hacer su trabajo.

Bueno, pues bien, empeiza la etapa de pruebas por los usuarios (como es un proyecto pequeño, no existe departamento de calidad, el departamento de QA son, los usuarios finales, y uno mismo) , y estos hacen y deshacen de la aplicación llevándola a condiciones que el desarrollador no se imagina.

El triste escenario más común, es que el usuario final, encuentre no uno, ni dos, sino varias maneras de hacer fallar el sistema, y el desarrollador quede en vergüenza, argumentando que un sistema debe contemplarlo todo y evitar mensajes de error inesperados. Que sucede a continuación ? El desarrollador, quien está sujeto a la aprobación del cliente puesto que él tiene su cheque en espera, baja la cabeza, y corrije los fallos.

Ahora… Hablemos con la verdad.

Se sabe en el mundo del desarrollo dos cosas :

1- El desarrollador piensa que el usuario es un estúpido, incompetente, con un coeficiente por debajo de un ratón buscando queso.

2.- El usuario piensa que el desarrollador es un idiota arrogante, necio y además perezoso, que siempre se negará a hacer algo a pesar de que sea para su beneficio.

Pues bueno, yo creo que ambos tienen razon, y no al mismo tiempo.

Aceptemos, que ya estamos bajo este paradigma, y como desarrolladores, estamos hartos de probar una y otra vez nuestra propia aplicación, y no entendemos, como alguien puede hacerlo tan mal una sola vez mientras que nosotros hacemos el proceso perfectamente siempre. Aceptémoslo, NO LE TENEMOS PACIENCIA AL USUARIO, NO TENEMOS TIEMPO PARA SU INEFICACIA. Y es entendible, puesto que nuestro trabajo (hablando exclusivamente como desarrolladores) es desarrollar instrucciones lógicas para que una máquina haga su labor, no capacitar ni bordear todas las infinitas causas de un error. Tal vez ese trabajo le corresponda a alguien más, alguien destinado para atención al cliente. Un mediador.

Y, del otro lado, como usuarios, muchas veces hemos usado una aplicación, esperando que sea tan intuitiva como una interfaz de iPhone. Yo, al menos, he hecho berrinche pensando cómo es posible que los diseñadores de la interfaz de una aplicación no pensaron en que desconozco por completo del tema, y su aplicación no me permite avanzar puesto que no me manda ningún mensaje de error. Inmediatamente me dibujo en mi cabeza la imagen de un programador rascándose la barriga diciendo ‘Que se joda el usuario, si no hace bien las cosas, no es mi problema’.

Ahora… creo que es responsabilidad del usuario investigar antes sobre un producto, antes de usarlo. El usuario espera de la computadora y su software demasiado, y creo que esto es gracias a la dramatización de las películas, que han humanizado el software: Programas que hablan con personas, que son capaces de analizar la realidad sin los sensores adecuados, alguien recuerda como Kitt, el auto increible, podía averiguar cuantas personas habían en una habitación ? tambien contenía todos los planos de todos los edificios que se puedan imaginar. Una vez, escaneó las huellas de una llanta, y le dio  a Michael Knight la marca, modelo de neumático, y la matrícula del auto que lo manejaba. Creo que eso le ha dado un concepto erróneo de las computadoras a las persona que NO SABEN DE COMPUTADORAS.

Ahora, imaginen esto: Llega un cliente a un concesionario de autos, y pide una prueba de Manejo.

Arranca el carro, mete primera velocidad y avanza, inmediatamente mete quinta velocidad, y el carro hace ruidos extraños. entonces, el usuario reclama “porque el carro no contempló esto?!!!”.

Luego, se baja del automóvil, le saca el aire a una llanta, y sigue manejando, el auto obviamente pierde control rápidamente, y el usuario vuelve a reclamar: “porque el carro no sabe prevenir este problema?!!”

Luego le vacía el anticongelante, el carro se recalienta, y vuelve a reclamar…

Se que suena absurdo, pero, no es absurdo que una persona también meta letras en un campo donde le piden la edad ?

No es absurdo que una persona quiera crear una factura cuando ni siquiera ha elegido un producto a facturar ?

“Es que, el usuario puede andar distraido, y teclear erroneamente datos”

o “El usuario no tiene porque sufrir la complejidad del sistema, el sistema debe guiarlo intuitivamente a través del proceso”

Nuestros líderes de proyecto siempre nos decían “Piensa que el usuario es el ser más tonto que hayas imaginado”

Creo que en la computación se le está deslindando cierta responsabilidad al usuario final, se le está permitiendo ser tonto, o descuidado, y se le está cargando todo un esfuerzo en evitar catástrofes a los sistemas por medio de procesos de calidad.

No estoy en contra de la calidad de un sistema, pero, vamos, la gente sabe que si metes aluminio al microondas, se descompone. La gente sabe que si le echas otro liquido que no sea gasolina al tanque de un auto, dañas el auto. La gente sabe que si haces una fogata dentro de un refrigerador, se quema !

PORQUE NO PODEMOS EXIGIR CIERTO SENTIDO COMUN A UN USUARIO EN COMPUTACION ??

Ahora… dos cosas:

1- La tecnología, le hace la vida más fácil a la humanidad. Hoy en día es más difícil estropear un automovil que hace 30 años, puesto que la mayoría trae sensores que alertan a las personas para hacer las revisiones y reparaciones adecuadas a tiempo. Aun así, un auto de línea económica no tiene el mismo sistema de calidad y confort que un auto de super lujo. Sabemos que el auto de superlujo tendrá una mejor computadora, tendra mas sensores y mejor control sobre tracción, frenos, motor, etc.

Porque no podemos llevar esta analogía al software ? Enfocarnos en el tipo de usuario que tenemos enfrente, y saber que tipo de control de calidad estamos dispuestos a desarrollar, y cuanto el esta dipuesto a pagar. Por que el control de calidad cuesta, tiempo y recursos hombre.

Tal vez el usuario espera un control de calidad de super-lujo, cuando está pagando el tiempo y esfuerzo para desarrollar un control de calidad austero. Seamos realistas y proyectemos esa realidad al usuario.

2.- La tecnología continuamente va avanzando, y la humanidad se va adaptando a ella. Volviendo a la analogía de los autos, Hace 10 años tener frenos ABS era carísimo puesto que estaba en sus inicios y solo las marcas que la habian desarrollado podian implementarla. Hoy en día tener frenos ABS en un automóvil es más economico, y esto es porque ya están probados, refinados y el sistema ha madurado, y al extenderse en todas las marcas, se vuelve menos complicado de implementar.

Asi sucede con el software y la gente. Hoy sabemos que la validación básica de un formulario no es tan complicada que hace 10 años, y esto es gracias a los patrones de diseño, frameworks y otras herramientas como el paradigma AJAX nos resuelven gran parte del camino.

Espero haber aclarado el punto de todo este rollo que les he escrito:

Es cierto, hoy en día es más fácil implementar validaciones básicas, y también es cierto que es responsabilidad nuestra asegurar un nivel de calidad adecuado. Pero tampoco se vale como usuario ponerse en el papel de ‘no se usar una computadora’ . Si no sabes como usar algo, usalo bajo tu propio riesgo, tomate el tiempo de aprender, lee el manual, pregunta, no esperes que el cielo se te abra y te caiga la respuesta del cielo.

Los programadores no tienen excusa para ser flojos y antipaticos con el usuario.

Los usuarios no tienen excusa para ser ignorantes y tontos.

Versionitis

Creo que cada vez más se libera software más frecuentemente, hasta microsoft lo empieza a hacer, recuerdo cuando no podían liberar algo hasta una nueva version del Visual Studio o Service Pack que lo soportara. Ahora tenemos el ejemplo de chrome, donde en menos de 3 años ya van en la version 13 y Firefox anuncio que le va a seguir los pasos.

Pasa tambien en los video juegos, donde salen “actualizaciones”, que corrigen bugs, o que le agregan funcionalidad.

Esto tiene que ver mucho con las metodologias agiles, que dicen que hay que hacer iteraciones cortas, y en cada iteración se debe tener un producto entregable. Entonces cada 2, 3 semanas el cliente tiene nueva funcionalidad en su sistema.

Y la reflexion es si esto es bueno o malo, definitivamente tener nueva funcionalidad mas frecuentemente es bienvenido, pero esto provoca la incursión de mas bugs. Para evitarlo se necesita tener una disciplina de pruebas, tener pruebas de unitarias y de integración que te aseguren que al estar escribiendo código nuevo, no se rompa funcionalidad previa.

Tambien algo que es necesario para poder hacer actualizaciones tan frecuentemente es, el que estas, sean lo mas sencillas posibles, por ejemplo chrome, ni siquiera te das cuenta que hay una version nueva. Otro ejemplo de esto es en wordpress, en este tipo de aplicaciones web creo que es mas difícil alcanzar eso.

Definitivamente no estoy en contra de liberar mas frecuentemente, pero si hay que proteger al usuario de errores mas frecuentes y de actualizaciones complicadas.

Festival Latinoamericano de Instalacion de Software Libre

Por fin está listo el podcast del mes de Marzo.

En esta ocasión nos acompañó Alexandro Colorado, un entusiasta promotor del software libre, para platicarnos acerca del FLISOL y su realización en la ciudad de Cancún, lugar donde actualmente radicamos Cesar, Iaax y un servidor, así como el buen JZA (Alexandro) .

Espero les guste esta amena charla de aproximadamente 40 minutos, donde JZA nos comparte su experiencia como colaborador del proyecto OpenOffice.org y su vision de la filosofía del Software Libre.

Aprovechamos este espacio para animar a todos los escuchas a participar en el FLISOL ya sea en Cancun o en donde sea que radiquen (esperemos que se realice un FLISOL en tu ciudad), ya que la colaboración es la materia prima de este movimiento.

Les adjunto los datos de JZA para cualquier información sobre el FLISOL.

JZA
Coordinador Nacional para Mexico del FLISOL
twitter: @flisolmexico
web: http://flisol.info/Mexico

Gracias,  apoyen el movimiento y comenten. Nos vemos en Abril.

Pd.- La cancion del final es una sorpresa para aquellos amantes del llamado Art Rock.

Aprende Ruby on Rails en Español

Este próximo 28 de agosto la gente en @railsmx estará transmitiendo en vivo su primera conferencia virtual.

 

Con la finalidad de atraer nuevos desarrolladores a la comunidad de rails, nuestra temática será una introducción intensiva al desarrollo en Ruby on Rails, así que si tú o alguien que conozcas está interesado en aprender Ruby on Rails no faltes este sábado 28 de agosto.

Conéctate desde las 10am y hasta las 8pm estaremos charlando sobre temas básicos de rails, incluso tocaremos los conceptos iniciales de Ruby como lenguaje para que no tengas pretexto.

Para mas información sobre la conferencia visita la pagina de rails.mx y aprende a desarrollar usando Ruby on Rails

Saludos

Iaax Page
Consultor en Diseño de Experiencia de Usuario, Desarrollo Web y Marketing On-Line
Software, Ingeniería y Diseño
Redes Sociales: TwitterFacebookLinkedIn

 

Instalando Ruby 1.8.7 con Rails 2.3.5 en CentOS 5

Después de mucho esperar por fin empezamos a desarrollar en Ruby on Rails.

Una de las primeras tareas es crear un servidor de desarrollo con las caracterísiticas del servidor de producción. En nuestro caso es un CentOS 5.

CentOS esta basado en Red Hat, eso ya lo hace por si solo interesante, sin embargo una de las particularidades especiales de este SO es que usa YUM para instalar y actualizar software, lo cual espero les resulte igual de grato que a mi.

CentOS puede instalar una versión de Ruby por defecto, si me preguntan, aconsejo omitirla, ya que de cualquier modo lo que necesitaremos será la versión mas estable de ruby donde las Gems si compilan. En este momento esa versión es la 1.8.7. Instalar Ruby con YUM tampoco es una opción ya que descarga la versión 1.8.5  –Siempre puedes ejecutar yum erase ruby, si ya instalaste esta versión.

En este tutorial deberas estar logeado como root o tener permisos de sudoer para poder ejecutar algunas instrucciones.

Manos a la obra

1.- Instalar GCC

sudo yum install -y gcc

Gcc es la herramienta que usaremos para compilar ruby. Puedes omitir el sudo si estas logeado como root. El modificar -y le indica a YUM que asuma SI a todas las preguntas, esto te ahorra tiempo, si quieres interactuar puedes omitirlo y estar atento a la instalación, incluso usar el modificador -v para que YUM te platique todo lo que esta haciendo.

2. Descargar Ruby 1.8.7-p72 desde ruby-lang.org

cd /usr/src
sudo curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz

Asegurate de descargar el paquete de ruby marcado con -p72, de lo contrario algo podría no funcionar correctamente.

Una vez que el paquete de ruby 1.8.7 fue descargado procedemos a descomprimirlo, configurar, compilar e instalar.

Copilando ruby

tar xzvf ruby-1.8.7-p72.tar.gz
cd ruby-1.8.7-p72
./configure
make
make install

En este momento, si todo ha salido bien, podemos ejecutar el comando which ruby para ver si tenemos ruby instalado correctamente y ruby -v para enterarnos de la versión de este.

Comprobando la instalación

which ruby
ruby -v

El primer comando nos devuelve la ruta donde ruby esta instalado, y el segundo la versión de este.

3. Descargar las Gems

El procedimiento es muy similar, usamos curl para descargar y tar para descomprimir. Despúes procedemos a compilar GEM con ruby setup.rb

cd ..
curl -O http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-1.3.5.tgz
tar xzvf rubygems-1.3.5.tgz
cd rubygems-1.3.5
ruby setup.rb

En este momento si corremos el comando gem list nos debe devolver una lista vacía de las gemas disponibles, esto es porque aun nos falta instalar rails, mysql y mongrel.

4. Instalando Rails y Mongrel

cd /
gem install rails
gem install mongrel

Despues de haber corrido el comando para instalar rails, 8 gemas deben haberse instalado para ruby, si corremos el comando gem list, nos devolvera la lista de gemas instaladas, en este momento debemos poder ver rails version 2.3.5, rake 0.8.7 y compañía.

Una vez que mongrel este instalado tendremos 13 gemas en total, ya que mongrel instala a algunos de sus amigos consigo.

Creando la primera aplicación en rails bajo mongrel

Es hora de probar que nuestro trabajo ha funcionado. Hasta el momento, lo único que hemos hecho es instalar ruby, rails y mongrel.

Puedes cambiar ahora de usuario y abrir una nueva terminal para ejecutar el siguiente código

cd /home/[type_username-here]/Desktop
rails demo
cd demo
ruby script/server

En este momento si has seguido todos los pasos en forma ordenada debes ser capaz de abrir en tu navegador favorito la dirección http://localhost:3000 y ver el mensaje de bienvenida de rails.

Felicidades, ahora tienes Rails instalado en CentOS 5. Por el momento me despido esperando que esto les pueda servir un poco, pero regresare pronto con mas sobre Ruby on Rails.

Próximos artículos

  • MySQL para Ruby on Rails
  • Creando un cluster de mongrel balanceado con Apache.

Iaax Page
User Experience Designer & Web Developer

Quien es que? Roles en el equipo de desarrollo de software

Equipo de Desarrollo de Software

El equipo de desarrollo de software, en las pequeñas y medianas empresas.

Los Desarrolladores

  • Arquitecto de Sofware
  • Gerente de Proyecto
  • Lider de Proyecto
  • Desarrollador Sr.
  • Desarrollador Jr.
  • Programador

Los Diseñadores

  • Arquitecto de Experiencia de Usuario
  • Diseñador de Experiencia de Usuario
  • Diseñador de Interaccion

En muchas orgranizaciones, estos puestos pueden o no estar presentes. Lo mas importante es tener un equipo organizado, aplicando metodologias de desarrollo modernas.

Saludos

Iaax Page y Cesar Reyes

Patron de Desarrollo Model View Controller

Arquitectura: El Domo de Roma.

Arquitectura: El Domo de Roma.

En esta ocacion en el podcast de Rock Developer Cesar Reyes y Iaax Page nos hablan sobre el patron de arquitectura Model View Controller. Y como este nos ayuda a desarrollar mejor.

Vinculos del podcast

Este es el episodio Numero 9 del podcast. Estamos trabajando para agregar un mejor feed que les permita descargar los episodios desde el iTunes. Un mejor plugin para el reproductor de MP3 y algunas otras cosas interesantes.

Queremos convertir a RockDeveloper en una mejor comunidad.

Muchas Gracias por su apoyo y no se olviden de hacer click en el boton retweet, en la esquina superior derecha de este post.

Saludos cordiales,

Iaax Page y Cesar Reyes

Ejecutar una tarea asincrona en java con spring

A veces necesitamos ejecutar una tarea que lleva un tiempo considerable y que el usuario no necesariamente necesita ser informado en el momento, por ejemplo el envío de un correo de notificación (en algunos casos), el hacer un proceso x que lleva tiempo, etc…

La clase TaskExecutor de spring abstrae la de java.concurrent.Executor de manera tal que es mucho mas facil con spring, SimpleAsyncTaskExecutor (asincrono), SyncTaskExecutor (sincrono), SimpleThreadPoolTaskExecutor y otros mas.

Pongo un ejemplo del uso del SimpleAsyncTaskExecutor

private TaskExecutor taskExecutor;

public void setTaskExecutor(TaskExecutor taskExecutor) {
    this.taskExecutor = taskExecutor;
}

taskExecutor.execute(new Runnable(){
    public void run() {
        ...
    }
});

Aquí mostramos la configuración de nuestra clase usando un TaskExecutor en spring.

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

<bean id="myBean" class="org.myproject.MyBean">
    <property name="taskExecutor" ref="taskExecutor"/>
</bean>

Cuando usamos hibernate y tenemos relaciones “lazy” en nuestros objetos que son traidos con hibernate, esto nos puede traer problemas al usar simplemente el TaskExecutor, tenemos que hacer una especia de OpenSessionInThread para poder tener la session abierta y que se reutilice esa session a lo largo del codigo ejecutado.

Pongo un ejemplo de como seria esa implementación. El código es similar a la implementación del OpenSessionInViewFilter de spring.

public abstract class OpenSessionInThreadTask implements Runnable{

    private ApplicationContext ctx;

    public OpenSessionInThreadTask(ApplicationContext ctx) {
        this.ctx = ctx;
    }

    protected abstract void runInternal();

    public final void run(){
        SessionFactory sessionFactory = lookupSessionFactory();
        boolean participate = false;

        // single session mode
        if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
            // Do not modify the Session: just set the participate flag.
            participate = true;
        }
        else {
            Session session = getSession(sessionFactory);
            TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
        }

        try{
            runInternal();
        }

        finally {
            if (!participate) {
                // single session mode
                SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
                closeSession(sessionHolder.getSession(), sessionFactory);
            }
        }
    }

    protected SessionFactory lookupSessionFactory() {
        return ctx.getBean("sessionFactory", SessionFactory.class);
    }

    protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);
        FlushMode flushMode = FlushMode.MANUAL;
        if (flushMode != null) {
            session.setFlushMode(flushMode);
        }
        return session;
    }

    protected void closeSession(Session session, SessionFactory sessionFactory) {
        SessionFactoryUtils.closeSession(session);
    }

}

Y por ultimo el uso de la clase OpenSessionInThreadTask, de hecho esta clase ya se encuentra en forza.

taskExecutor.execute(new OpenSessionInThreadTask(ctx){
    public void runInternal() {
        ....         
    }
});

Bueno espero que haya sido de su ayuda, no olviden dejar en los comentarios cualquier duda o aporte.

Pimp my Site! Optimizacion de Sitios Web

Ford Focus

Ford Focus

El podcast

Antes hablamos sobre las librerias JS, ahora nos concentraremos en como “Tunear” de manera adecuada un sitio web, vamos a enchular el rendimiento de nuestros sitios.