Tuesday, March 3, 2015

Alabanzas al Software

Cualquier cosa que suceda en el mundo, puedes saberlo por las redes sociales, navegando en la Web o leyendo en alguna aplicación. La información fluye en un mar creado por bits que van más rápido que un pestañeo.Piensa en tu madre  y la contactarás, menciona una palabra y te darás cuenta que su significado puede ser representado de muchas formas.

Hay Software para todo, para incrementar los ingresos un negocio hasta para reírse del último video de tú mascota. Las empresas pueden cooperar creciendo juntas mientras comunican e identifican automáticamente cuando una necesita de un servicio, mientras que la otra tiene todo preparado para entregar sus beneficios.

La gente está conectada para siempre con todo. Tus mejores amigos, a miles de kilómetros de distancia, están contigo sabiendo tus últimos pensamientos y contando sus historias locas que han experimentadp. Los compañeros de curso se encuentran allí, en alguna parte, esperando por saber de tus pensamientos, queriendo saber más sobre ti, el tiempo dejó de ser una barrera.

Es posible ser lo que quieras, un ingeniero, un doctor, un filósofo, profesor o desarrollador de Software. Con tan solo decir la palabra recibirás más documentos que en todas las universidades juntas. Compartiendo cursos, tutoriales, leyendo y escribiendo documentos, incluso puedes llegar a ser el profesor. Faltan años para ver toda la información sobre un tema.

El uso del Software da la posibilidad a los seres humanos de no trabajar en cosas que nadie quiere o son muy difíciles de hacer, tales como cálculos brutales o trabajos forzosos, habiendo robots con la suficiente inteligencia artificial para realizar tareas específicas, trabajos repetitivos o apoyando en otras que requieren demasiado tempo para un humano. Sé un buen tipo con estos amigos abstractos y físicos porque ellos fueron creados para ti por unos artesanos locos que aman a sus hijos.

No podemos dejar de lado los video juegos, ¿Cuánto tiempo de ocio has gastado jugando? Hay juegos para muchísimos estilos y diferentes gustos. Un lugar donde existe la posibilidad de ser un héroe, un espía, un guerrero o Mario Bros, esas experiencias no están lejos de ti, puedes experimentar esas sensaciones y hacer cosas fantásticas.

Incluso tus comprar son más fáciles, rápidas y baratas. Todos los productos pueden tener características adicionales usando Software. Puedes estar en tu departamento, cansado por un día difícil, buscar alguna comida gustosa y escogiendo un par de opciones (clics) tendrás allí el regalo del día. Ahorrar tiempo en un mundo rápido no tiene precio.

Esos fueron mis pensamientos sobre lo hermoso y beneficioso que puede ser el Software, algunas veces siendo irónico y exagerado. No olvides leer la contraparte sobre este tema según mi punto de vista.

Tuesday, February 24, 2015

Patrones de Diseño

Los patrones de diseño son recursos usados por desarrolladores y arquitectos con el propósito de resolver un problema común. Mas que poseer un patrón, ellos tienen un contexto común que es usado para compartir conocimientos. Ellos tienen una poderosa herramienta que provee soluciones que también reflejan un contexto sobre un problema de desarrollo.

Saber donde aplicar un patrón de diseño para obtener una solución acorde al problema es difícil, requiere desarrolladores experimentados y un amplio conocimiento para llegar a elegir la solución correcta. Los desarrolladores en el camino a tomar buenas decisiones de diseño se dedican a aprender la intención o motivo para cada patrón, ven ejemplos de implementaciones, leen libros o cualquier actividad para mejorar sus habilidades.

Tipos de Patrones


Sin embargo, hay muchos tipos de patrones de diseño tales como los patrones orientados a objetos (OOP), arquitecturales, patrones para desarrollar en Android, y otros recomendados por compañías como Microsoft para ser usadas en sus sistemas. Los desarrolladores pueden encontrar esas soluciones probadas en diferentes contextos, variando la forma de ser implementados  y comúnmente haciendo una combinación entre éstos.

El Otro Lado


Algunas veces, los patrones de diseño no son la solución necesitada porque se aplicó el patrón incorrecto o simplemente, porque el problema a resolver no requiere uno. Tales prácticas son también conocidas como anti-patrones.
Cuando se implementa un diseño, entonces se busca que el sistema sea más flexible para ciertos tipos de implementaciones. Los desarrolladores tienen que trabajar con las ventajas y desventajas de los patrones seleccionados y los beneficios deben ser mayores, en caso contrario, los desarrolladores podrían odiarte por tus malas decisiones que producen un desarrollo más lento, además de un sistema que aumenta su complejidad rápidamente.

¿Balas de Plata?


Las soluciones proveídas por los patrones son probadas y los buenos desarrolladores tienen una noción sobre lo que sucede en la parte del sistema donde es implementado uno. Ellos saben más rápido cuál es y dónde arreglar un problema, donde hacer un cambio o añadir una nueva funcionalidad. El conocimiento de los patrones es más allá de los sistemas implementados, equipos y compañías, por tanto, es necesario tomar esa ventaja y usarlos.

Sunday, August 24, 2014

Clean Code - Acto social

Cuántas veces como programadores nos hemos sentido percibidos como gente solitaria que está frente a un computador, quizás algunas veces aceptamos eso porque nuestro código es algo que podemos crear solos o buscando recursos desde la Internet. Nada más lejos de la realidad cuando se trabaja en equipo.

El acto de programar


El programador crea o modifica otro código existente, así adapta la funcionalidad que va a implementar. Él piensa en la mejor forma de hacer entendible su código, así alguien más va a reconocer rápidamente lo que hace y sus cambios serán más certeros. El programador no es un ente solitario, el trabaja con código de otras personas. Programar es un acto social. Así es presentado el arte de programar en el libro Clean Code.

Comunicar


El libro, o biblia de la programación para otros, se centra en facilitar la comunicación de la intención del código, con sus funciones, clases, variables, etc., ¿Por qué eso es tan importante? pues porque nada asegura que el mismo programador trabaje en la misma pieza de código, éste puede tener asignadas otras tareas o ya no es parte de la empresa. En el Software, el código es una de las mejores documentaciones que se puede dejar y éste tiene un propósito, una razón para existir, y es mejor comunicarlo fácilmente siendo coherente.

Fundamentos


El libro recomienda como tiene que formarse una clase, las mejores opciones de nombres, variables, tamaño de las funciones, niveles de abstracción, principios de responsabilidad, entre otros. Explica porque lo pequeño es mejor, ayuda a elegir nombres adecuados, la importancia de proporcionarle un formato común al código, el autor hace fuertes críticas de los comentarios de código que explican algo que no puede hacerlo por sí mismo, además de entregar un montón de heurísticas que sirven como guía al momento de codificar.

Recomendaciones


El autor no pasa por alto el diseño. Agregar o cambiar código, por mínimos que sea, tiene un grado de impacto en el diseño del sistema y condiciona su evolución. El autor abarca principios que ayudan a hacer un trabajo de programador profesional, algo serio que proporciona valor y que todos nuestros compañeros de trabajo seguramente agradecerán porque no será un dolor de cabeza leer ese compás de líneas que sigue un ritmo idéntico al que tiene el programador que lo lee. No hay que olvidar que estamos frente a recomendaciones y varios de éstas son discutibles o incluso abiertas a mejoras, aplicables según criterio.


El libro sigue la premisa de que el Software codificado va evolucionando, su complejidad aumenta y a menos que seas el primero en escribir código, siempre vas a tener que entender lo que hace el código existente, y eso toma tiempo. Programar es conversar contigo mismo y con otros desarrolladores, el idioma en común, así como las convenciones y fluidez son fundamentales para lograr una buena comunicación.

Sunday, August 17, 2014

La atracción de JSON

Cuando algo se está volviendo cada vez más complejo y se encuentra que está realizando más cosas de las que necesita hacer, entonces eso comienza a desperdiciar el tiempo de la gente, las comunicaciones a los desarrolladores.
A las personas les gustan los formatos simples, estos son más fáciles de entender y tienen solamente las cosas necesarias para hacer lo que realmente necesitan hacer.

La llegada de XML


Algo como esto ha sucedido con XML y JSON, primero llegó XML  a nuestro mundo para satisfacer la necesidad de tener un estándar independiente del lenguaje de programación para intercambiar datos entre diferentes plataformas, y eso fue resuelto en una elegante forma. Así, cada vez que se necesitaba intercambiar datos entre dos diferentes plataformas sin considerar el lenguaje de programación en que estos fueron implementados fue usado XML. Los datos usaban XML, las bases de datos estaban enviando datos usándolo, los Servicios Web SOAP también lo usaban, etc. Era la única opción.

La llegada de JSON


Entonces  llegaron algunas alternativas, una de ellas fue JSON que estaba alcanzando los mismos objetivos de XML con diferencias que hacían algunas cosas más fáciles y otras más difíciles. Los desarrolladores tienen más opciones y ellos pueden adaptarse mejor a las necesidades de sus plataformas. JSON llegó con la promesa de ser más rápido con su formato liviano que tenía menos complejidad que su antecesor.

Cualidades de JSON


Una de las ventajas de JSON es su relación con AJAX que necesita cargar rápidamente los datos y asincrónicamente sin retrasar la renderización de las páginas. Las páginas sociales necesitan refrescar su información una abundante cantidad de veces, pequeñas optimizaciones pueden tener un gran impacto en la eficiencia y performance de una aplicación Web. Por otro lado, las aplicaciones usando gran cantidad de información (Big Data) llegaron con sus propias necesidades, algunas de ellas eran el almacenamiento y manipulación de sus colosales datos, JSON provee una forma más rápida para usar esas gigantes bases de datos basadas en documentos.
JSON es un formato para intercambiar datos y se enfoca en una sencilla forma para permitir su validación y parseo que son implementados en el lenguaje que usa este formato, entregando una fácil forma de manipular sus elementos anidados. A diferencia, XML parsea los datos usando un DOM (Document Object Model) o un Schema por el lado del cliente que requiere una respuesta en XML.

Si se considera el tamaño de los documentos XML y los del JSON, debido a la complejidad del XML, ese usa una mayor banda ancha cuando se envían datos sobre la red. Si además consideramos que cada vez los dispositivos como iPhones y Tablets son más populares en la actualidad, semejante cantidad de datos en una red lenta causa tardanza en la carga de páginas y una peor experiencia de usuario. Actualmente XML es ampliamente usado y tiene sus propios beneficios, pero JSON ha llegado a ser el preferido para intercambiar datos en internet en los últimos años.

Saturday, June 21, 2014

Spikes - Descubriendo mundos

Es común que los desarrolladores siempre estén enfrentando nuevos desafíos, muchos de ellos son pequeños o abordables y algunas personas ya han resuelto un problema parecido en el mismo equipo o en la Internet. En otras ocasiones ellos se enfrentan a desarrollos completamente nuevos y ellos no tienen idea de cómo abordarlos.
El riesgo puede ser muy grande y el tiempo de la implementación del nuevo requerimiento podría tomar días o hasta años. Después de codificar el requerimiento, si es que pueden, los desarrolladores tienen que testear como está funcionando todo el sistema y si se cumplieron las expectativas. Nada parece claro y es difícil ver tierra en el mar. Es necesario hacer algo más antes de estimar la dificultad, impacto y tiempo para implementar el requerimiento.

Spikes


Los Spikes son una invención de la metodología Extreme Programming (XP), desarrollar un Spike es hacer una implementación de algo relacionado a un potencial requerimiento. ¿Por qué es necesario hacer un Spike antes de un requerimiento?
Los Spikes son útiles cuando el requerimiento es hacer un cambio arquitectural, probar una nueva tecnología, añadir una gran funcionalidad o cambiar una actual implementación y revisar si eso es posible, también es útil para saber mejor el tiempo que tomará el desarrollo, cómo la implementación resulta afectada, y revisar si las funcionalidades tendrán el comportamiento esperado. Definitivamente, el requerimiento es demasiado inmaduro y necesita algo de trabajo para convertirse en un requerimiento con un alcance lograble. 
Además, ellos son usados para investigaciones, diseño, prototipados, o aumentar el conocimiento y reducir el riesgo de un alcance técnico.

Spikes emergiendo


Todos los requerimientos para construir una funcionalidad tienen un riesgo, esta información desconocida puede ser descubierta mientras el requerimiento esta construyéndose, en una conversación de equipo, usando el criterio del desarrollador, discutiendo, colaborando, negociando, etc. El equipo determina hacer un Spike cuando el riesgo es muy algo o ellos realmente necesitan saber más sobre un requerimiento que puede ser demasiado grande. Usando Spikes el equipo obtendrá la información con datos convincentes, entonces los miembros del equipo pueden ver y tomar mejores decisiones.
Cuando el equipo o el Product Owner determina que hay que hacer un Spike, este puede ser estimado y priorizado tal como los otros requerimientos. El mayor valor de un Spike es la información obtenida, no el código desarrollado.

Como enfrentar un Spike


La recomendación es implementar un Spike con un pequeño programa. Es importante investigar y leer, pero es aún más importante escribir código para experimentar, no profundizar solamente en la teoría. Lo complejo tiene que ser ignorado, solo hay que enfocarse en obtener algo funcionando, no importa si el código no es reusable porque éste es un experimento. Documentar y mostrar los resultados a los compañeros es imprescindible. Evitar el código de producción cuando es posible, si no lo es, entonces hay que usarlo, pero no se puede comitear.
Durante un Spike, los desarrolladores no pueden comenzar profundizando porque los Spikes no se encuentran bien definidos. El que investiga en esa niebla puede perderse en el mar de información o intentando hacer muchas cosas al mismo tiempo. También, es importante tener en mente que los Spikes no entregan valor al usuario directamente, por lo tanto, ellos deben ser usados con precaución.

Finalmente, Spikes pueden ser útiles algunas veces, pero la mayoría de los requerimientos no necesitan usar este tipo de desarrollos. Es importante tomarse un tiempo y decidir si es necesario el Spike y esa decisión puede ser crítica en algunos casos para el futuro del proyecto.

Saturday, June 14, 2014

Servidores - Computadores como servicios

¿Tú eres alguien conocido? ¿Cómo vas a ser conocido si nadie puede comunicarse contigo? Estás solitario(a) y hablas con nadie más que una persona a la vez. Mañana doscientas personas requerirán hablar contigo, después de mañana mil, y la cantidad puede continuar incrementando. ¿Cómo vas a llevar eso? ¿Qué tienes tú que es muy importante para ellos y para ti?

¿Qué es un servidor?


Un servidor es un computador que provee servicios para otros computadores en una red, es claro que esta es una básica definición para un servidor. Todos los computadores pueden ser un servidor, no es necesario tener un sistema operativo especial instalado para hacer eso.
Los verdaderos servidores son computadores que trabajan las 24 horas, 7 días a la semana, ellos son estables, se recuperan de fallas, etc. Un servidor puede ser sólo un computador o un computador unido con otros computadores o artefactos electrónicos que trabajan juntos.
Un servidor puede proveer archivos compartidos, una impresora compartida, aplicaciones compartidas, administración de clientes, un servidor de base de datos y más. Así, en el caso de archivos compartidos, este tiene la habilidad de almacenar carpetas y archivos en una parte y los usuarios pueden acceder y actualizarlos. En un servidor Web, los usuarios pueden acceder a la información con un Browser  (Chrome, Firefox, IE, etc.) e interactuar con lo proveído en páginas como Google, Facebook, tú propio blog, sitio Web de tu compañía, etc.

Sistema operativo de un servidor


Un sistema operativo (OS, Operative System) para un servidor es una alternativa cuando es necesario más poder. Estos OS son más robustos, seguros, estables y caros que los OS comunes. Estos pueden soportar miles de usuarios, pero en estos OS es más difícil tener el mismo software instalado en un computador personal stándar. La autenticación también es más fuerte, a nadie le gustaría que hackers usen bugs para acceder a la información sensible de una compañía y los servidores están expuestos.

Hardware del Servidor


Parecido al caso del OS del servidor, si se necesita un comportamiento especial para el servidor, entonces es necesario un hardware especial. El hardware puede ser más de una fuente de poder para mantener al servidor siempre proveyendo servicios, más de una disco duro, administración de redes, y más, hay muchos tipos de hardware para servidores. El procesador y la memoria también son importantes para soportar muchas solicitudes y aplicaciones.
El hardware también intenta asegurar que el servidor esta siempre funcionando y proveyendo sus servicios, este nunca debería apagarse.

Las empresas pueden mejorar cuando usan servidores, sus procesos pueden moverse más ágilmente y ser más poderosos. Los productos de la compañía pueden trabajar usando servidores con servicios específicos y los potenciales clientes pueden conocer mejor a la compañía a través de un sitio Web. Es necesario recordar que el servidor es una cosa y éste trabaja con software que provee sitios Web, servicios Web, u otras aplicaciones para asegurar el futuro de la empresa.

Sunday, June 8, 2014

Rule Engines - Software tomando decisiones

Piensa cómo tomas las decisiones en tu vida. Cuáles criterios usas para seleccionar tú trabajo, mascotas, casa o una escuela para tus niños. Tú sabes que algunas decisiones son más importantes que otras, el resto de tu vida puede depender de algunas de ellas. No pases por alto las decisiones clave.
¿Te gustaría tener la información para tomar mejores decisiones? Las decisiones están basadas en hechos y la experiencia previa. ¿Existen algunas reglas que pueden guiarte para tener lo que quieres?

Automatizando decisiones


Un sistema puede tener la capacidad para tomar decisiones usando su conocimiento base. Su base de conocimiento es nada más que condiciones y acciones. Si las condiciones son cumplidas, entonces el sistema decide acciones a tomar
Por otra parte, las condiciones y acciones no son seleccionadas aleatoriamente, hay expertos en un dominio específico que tienen el conocimiento para recomendar la mejor decisión dependiendo de los hechos que se han cumplido. Un sistema, además tiene la capacidad de automatizar las decisiones, los expertos solamente determinan en qué condiciones la compañía tiene que tomar las acciones. En otras palabras, si las condiciones son ciertas, las acciones son ejecutadas..

Motor de reglas


El Rule Engine es quién examina las reglas con el Inference Engine, es decir, es un Software que ayuda a administrar las reglas del sistema.
El Rule Engine es código que trabaja separado del código de implementación y tiene la posibilidad de cambiar sin tener que pedir ayuda a los programadores. Los expertos del dominio pueden adherir nuevas reglas y hacer los cambios cuando quieran.
Un Rule Engine estándar puede incluir: un Business Rule Repository que es una base de datos para almacenar las reglas del negocio, un Rule Engine Execution Code que tiene el actual código programado para reforzar las reglas y un Business Rule Editor que es una interfaz de usuario intuitiva para definir, editar, documentar y diseñar reglas.

Usuarios del negocio pueden definir las reglas


Con verbalizaciones, los usuarios pueden definir las reglas usando su propio lenguaje. Naturalmente, ellos definen las condiciones y acciones a tomar sin cambiar el código del programa, separando el trabajo del programador y las definiciones de los analistas del negocio.
Verbalizaciones pueden ser soportadas por diferentes sentencias, muchas de ellas pueden significar lo mismo, enfocándose en la expresividad, claridad y formalidad.

Variedades de Rule Engines

Hay muchos tipos de motor de reglas, esos pueden tener reglas de inferencia u otros tipos, usar código Java, C++, u otros, ser Open Source o no. Algunos de ellos tienen características adicionales como arboles de decisión, flujos de reglas, versionamiento de despliegues, simulaciones, reportes, etc.


El Rule Engine te ayuda a decidir "qué hacer", pero no "cómo hacerlo", así separa los objetos del dominio con la lógica que está en las reglas, minimizando los cambios futuros. También provee una aplicación con buenos diseños cuando es usado adecuadamente.