jueves, 25 de junio de 2015

3. Desarrollando

De qué trata todo esto, todo esto surge de una inquietud, la inquietud de ver que muchos profesionales del cómputo se encasillan en solo hacer ABC, la inquietud de ver que todo mundo sabe programar pero solo conoce las estructuras básicas, la inquietud de ver que el tiempo pasa hay grandes logros pero en mi impresión nos estamos quedando cortos.

Tenemos el acceso a la información, pero la empleamos con fuerza bruta, ya no la depuramos, podemos construir grandes cosas pero en vez de ahorrar recursos construimos torres con más piezas de las necesarias.

Estamos cayendo en un exceso de confianza, en una facilidad por hacer entregas rápidas, a fin de cuentas si no es lo suficiente mente rápido, con más potencia al equipo con eso basta.

Hay exceso de metodologías tratando de solucionar las crisis del desarrollo, de cómputo, viendo el desarrollo desde muchos puntos de vista.

Hay otras que tratan de hacer que gente que no es de computo entienda los procesos, y buscando que las TI trabajen como una fábrica del siglo pasado.

Calidad, rapidez, costos, son palabras que están en nuestro vocabulario todos los días, sin embargo en muchos casos parece que no las entendemos.

Este blog tocara varios puntos, comentarios sobre algún tema normalmente enfocados al desarrollo, claro estos desde el punto de vista de un desarrollador más.

Técnicas y metodologías para mejorar nuestro código pienso empezar con patrones y anti patrones de diseño.

Y bueno algo que valla más allá de las bases de datos y que mejor que un poco de gráficos y animación, así que trabajaremos en un buen tutorial de DirectX, ya que realmente hay pocos que enseñen a fondo lo que es, así que hay mucho trabajo por delante.


Si una computadora más pequeña que tu celular llego a la luna, ¿Tu hasta donde podrás llegar?

miércoles, 24 de junio de 2015

2. Optimizar el performance (análisis)


Las 4 tareas de una optimización de performance son:

- Medición
- Diagnósticos de cuellos de botella
- Selección de optimizaciones
- Implementación de las optimizaciones

Nuestra principal herramienta son los contadores de rendimiento, algunas herramientas de desarrollo también nos permiten tomar una imagen de aquello que está ocurriendo en disco memoria y procesador.

Es necesario conocer el tiempo de cada una de las partes del proceso, para poder efectuar un análisis de cada uno de los componentes del mismo.

Se debe tomar en cuenta la velocidad de los componentes, una escritura en disco es más lenta que una escritura en memoria, y la memoria siempre será más lenta que el procesador, peor aún, si vive el almacenamiento en red, si está en la nube, si consume servicios, es necesario identificar en donde se encuentran cada uno de los cuellos de botella.

¿Cómo vamos a optimizar?, podemos iniciar procesos paralelos y aprovechar la capacidad del procesador, si algo se guarda en disco podemos mantenerlo más tiempo en memoria, si tenemos mucha información podemos hacer objetos más ligeros, divide y vencerás, has tareas específicas para que puedan ser medidas e incluso separadas y agrupadas.

Este punto es muy importante, tener cargada solo la información que vamos a emplear, muchas veces por hacer objetos genéricos se carga información que no es necesaria, al final todo esto se traduce en lecturas y escrituras que cuando se habla de grandes cantidades de información pueden representar el colapso del sistema.

Por más que tengamos mucha memoria disponible, hay que pensar que esta no es infinita, liberarla cuando sea necesario, analizar los objetos para determinar cómo se libera la memoria en cada parte del proceso.

¿Los componentes externos responden adecuadamente?, ¿cómo está la velocidad de acceso a discos?, ¿tengo errores?, ¿Se me encolan peticiones?

Hay que ver el sistema como un todo, y este todo abarca el sistema como tal, el sistema operativo, los dispositivos de hardware (tarjetas de red, discos, memoria), bases de datos, los desarrolladores tendemos a cegarnos y pensar que todo está en el código, es muy importante conocer toda la pintura y no solo los personajes que se encuentran en ella.

¿Cómo es nuestro diseño?, hay 2 puntos importantes que muchas veces nos generar grandes problemas de rendimiento y cuellos de botella, y tienen que ver directamente con el diseño.

-Arquitectura
-Frameworks

Porque la arquitectura, la premisa fundamental al construir una arquitectura es que esta deberá ser lo más sencilla posible, ¿Por qué?, porque una arquitectura sencilla es entendible, es fácil de implementar, y es rápida.

Al tener menos capas, la información pasa por menos lugares, cada capa se traduce en tiempo, objetos demasiado genéricos pueden ser muy grandes, o efectuar una gran cantidad de operaciones para llegar al resultado, como consecuencia se pierde el desempeño, crea una arquitectura acorde a tus necesidades, cada sistema es diferente, tiene diferentes requisitos por lo que su arquitectura debe ser diferente.

Frameworks, los frameworks son muy útiles, ya que implementan las mejores prácticas o nos facilitan el trabajo, pero muchos de ellos tienen el gran error que mencione en el punto anterior, objetos demasiado genéricos, objetos que son muy grandes, accesos a memoria para obtener tipos u objetos hacen una gran cantidad de operaciones para estar listos para los diferentes eventos para los que son programados, todo esto reduce el desempeño de tu sistema.

Mientras más cerca estemos del lenguaje maquina más rápido operara el sistema, no digo con esto que empleemos ensamblador en el desarrollo, lo que digo es que hay que buscar emplear funciones nativas del lenguaje, que sean ligeras y que controlemos completamente.

Si cumplimos todo lo anterior, saldremos de esa computación salvaje, en la que dependemos de la velocidad de los procesadores y no de un orden en la programación.

No todo lo que brilla es oro y no todo lo nuevo es lo mejor.

Pero recuerda como diría algún arquitecto de sistemas, todo depende… depende de la situación en la que te encuentres y de que tan alto requieras la optimización de tu código.

Bueno esto solo es un comentario

Carlos


Referencia
                Enhancing Performance Optimization of Multicore/Multichip Nodes with Data Structure Metrics

                Ashay Rane, James Browne

lunes, 22 de junio de 2015

1. Reflexión sobre el papel del Arquitecto

Vivimos una época de cambios, en las que tenemos mucha información al alcance de nuestras manos, mucha más información que en cualquier otra época de la humanidad, el día de hoy es muy fácil creerse experto en uno o varios temas, y sistemas es uno de esos temas en los que existen muchas personas que se consideran expertas en el área.

La computación es fácil, es lógica dicen muchos.

Si hay tantos expertos ¿Por qué hay tantos problemas en los sistemas? ¿Por qué muchos no son exitosos? Y ¿Por qué otros que si tienen cierto éxito se caen en cuanto empiezan a crecer? ¿Por qué antes con equipos menores a lo que es un celular de hoy en día se podía hacer el mismo trabajo de cómputo?, ¿Quién es el responsable?, ¿Qué herramientas tengo?

El mundo de computo cambia muy rápido hace solo unos cuantos años una computadora no tenía más de 4 Megas en RAM, 100 Megas de disco y un procesador de 33 MHz, hoy incluso un celular tiene más poder que eso.

La mayoría de los sistemas no hacen más almacenar información y consultarla, pese a los cambios tecnológicos siguen siendo ABC, si esto es así, ¿no deberíamos ser expertos en ellos?, y ser la mayoría de ellos exitosos.

La respuesta es Sí, entonces ¿Qué es lo que está pasando?

Bueno todo esto puede recaer en un individuo que día a día ha perdido su función, porque cada vez hay más personas que toman ese roll sin saber realmente que es lo que debería de hacer, esto hablando de un Arquitecto de sistemas.

¿Por qué el?, porque él es el principal responsable en la construcción de una aplicación. Él es el que debe conocer el ADN de la aplicación, sin embargo, el arquitecto de sistemas no necesariamente es el mejor desarrollador, o el mejor DBA, tampoco es el genio que vive encerrado en su cubículo y lo ven solo las noches de luna llena.

El arquitecto es aquel, que sabe que es lo que se quiere, que conoce las piezas, que puede defenderlas, que puede armarlas y lo más importante que puede transmitir que es lo que quiere, alguien que puede separar el todo y convertirlo en algo tan abstracto como un programa, sin necesidad de que él lo desarrolle.

Él debe conocer a todos aquellos involucrados en el sistema tener la capacidad para traducir entre diversos idiomas, traducir una imagen que vive en la mente de aquel que desea el sistema en imágenes que puedan servir para que uno o más desarrolladores puedan darle vida a este nuevo ser.


Platiquemos un poco, y veamos una gran analogía, la analogía de la palabra arquitecto, un arquitecto se define según la real academia de la lengua española como la persona que ejerce la arquitectura, y la arquitectura se define como el Arte de proyectar y construir edificios.

Ahí caemos en 2 cosas primero que nada es un Arte, sistemas por si solo es un Arte, es un trabajo que si bien tiene reglas, tiene mejores prácticas, muy pocos realmente las conocen, y aún menos las aplican, de construir edificios, realmente es lo que hacemos nosotros construimos edificios sobre los que circula la información.

Entonces que es un arquitecto, es aquel que es capaz de construir una torre de babel sin que esta colapse en el intento, y lo más importante debe manejar la complejidad nunca incrementarla, el mejor diseño de arquitectura no es aquel que tiene más capas, y que solo es capaz de entender el que lo creo y un grupo de personas cercanas, no el mejor diseño es el que es el más sencillo, aquel que puede entender cualquiera de los desarrolladores que conforman el equipo, y que cumpla con todo aquello que sea necesario en el proyecto.

Sencillez ante todo, el arquitecto no debe demostrar que él sabe lo que otros no saben, por el contrario debe balancear el proyecto para que aquellos que no saben puedan participar en él. No es un dios, es un maestro, no tiene la verdad absoluta, pero debe tener la visión de un todo.


Debe conocer, lo que fue, lo que es y lo que será. Ver el mapa desde arriba, pero poder entrar y revisar un detalle, debe tener ambas visiones la visión macro y la visión micro.

Entonces ¿Quién puede ser un arquitecto?

Aquel que comprenda el proyecto, que conozca, los requerimientos, que sepa quiénes son sus programadores, que pueda balancear sus complejidad, que pueda proponer, que sepa decidir que conviene al proyecto y que no necesariamente escoja lo más reciente en el mercado.

Un maestro, un aprendiz, un director, un escucha y un orador.

Es el papel más complicado en el desarrollo, porque realmente de él depende el éxito o el fracaso.

Imaginen que un arquitecto, que construye un rascacielos, realmente no entendiera el concepto, o ideara algo tan complejo que nadie pudiera construirlo, ¿Qué pasaría? Los proyectos se irían al fracaso, bueno lo mismo ocurre con un arquitecto de software, él debe comprender su verdadera responsabilidad, que no es eso diseñar, sino conocer el todo comprenderlo, transformarlo y obtener el resultado que espera que solicito el proyecto.

No es una tarea fácil, y hacerlo bien mucho menos.

Bueno solo es un comentario...Carlos