Mostrando las entradas con la etiqueta Software. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Software. Mostrar todas las entradas

Top 10 de cosas que molestan a los programadores

viernes, 29 de octubre de 2010
Este post fue escrito por Kevin William Pang en Agosto del 2008, al ver su contenido me identifique en cada una de sus palabras y me vi obligado a pedirle su autorización para compartir este top 10 en español.
La versión en ingles esta aquí

10. Comentarios que explican el "como" y no el "porque"
Los niveles introductorios de programación siempre recomiendan a los estudiantes que deben poner comentarios a su código constantemente. La idea es la de tener tantos comentarios como se puedan en vez de no tener ninguno. Desafortunadamente algunos programadores se toman muy a pecho este precepto y comentan cada linea de código, es por eso que muchas veces encontraras este tipo de lineas de código.
Se entiende que es lo que hace el código? Si bien hay muchas lineas de comentarios describiendo lo que el código hace, no hay ninguna que diga por que lo hace.
Consideremos la misma porción de código con un enfoque de comentarios diferente:
Mucho mejor! De todas formas no tenemos un entendimiento exacto del propósito del codigo pero ya tenemos un punto de partida para entenderlo.
Los comentarios se suponen que están para ayudar al lector a entender el código, no la sintaxis. Esta bien  asumir que el lector tiene un entendimiento básico de como funciona un loop, no hay necesidad de escribir un comentario como "iterar la lista de clientes". Con lo que el lector no estará familiarizado es por que tu código funciona de la forma en la que lo escribiste.
Snippet extraído del post de Jeff Atwood "Coding without comments"

9. Interrupciones
Muy pocos programadores pueden ir de 0 a codificar en un parpadeo. En general, el programador tiende a ser mas como una locomotora que como un Ferrari; es posible que nos tome un tiempo comenzar a codificar, pero, una vez que empezamos podemos realizar una gran cantidad de trabajo. Lastimosamente es difícil entrar en tal concentración cuando tu tren de pensamientos se ve descarrilado constantemente por clientes, administradores y compañeros.
Simplemente hay demasiada información que mantener en mente mientras trabajamos en una tarea como para poder dejarla, atender otro asunto y luego volver en el punto que habíamos dejado sin perder el ritmo. Las interrupciones matan nuestra concentración y retomarla es una tarea que consume tiempo, frustranrte y lo pero de todo es que produce errores.

8. El monstruo del alcance
[El Síndrome del lavadero o Arrastramiento del alcance (Scope creep en inglés) en gestión de proyectos se refiere a aquellos cambios no controlados en el alcance de un proyecto. Este fenómeno puede ocurrir cuando el alcance de un proyecto no se define, documenta, o controla correctamente.
Típicamente, el aumento del alcance consiste en productos nuevos o nuevas características de productos ya aprobados que hacen que el equipo de proyecto se desvíe de su propósito original. Debido a su tendencia a centrarse en solamente una dimensión de un proyecto, el arrastramiento del alcance puede también dar lugar a que el equipo de proyecto exceda su presupuesto y cronograma originales. Mientras el alcance de un proyecto crece, más tareas se deben terminar con el mismo coste y cronograma que la cantidad original de tareas del proyecto.]
El arrastramiento del alcance puede tornar un requerimiento simple en un monstruo complejo y horrible que consume nuestro tiempo. Es solo necesario un par de "teclazos" por parte del ingeniero de requerimientos para que esto suceda:
  • Versión 1: Mostrar un mapa con la ubicación
  • Versión 2: Mostrar un mapa 3D de la ubicación
  • Versión 3: Mostrar un mapa 3D de la ubicación por el cual el usuario pueda navegar
Lo que habría sido una tarea de 30 minutos se ha convertido en un sistema complejo que puede llegar a tomar cientos de horas hombre. Aun peor, la mayormente los arrastres de alcance ocurren durante el desarrollo, lo que requiere de re-trabajo, refactoring y muchas veces botar código que ya se había escrito días antes.

7. La administración no entiende de programación
La administración/gestión no es un trabajo facil. La gente es dificil; Mantener a un gran grupo de programadores contentos y unidos es una tarea titanica. Sin embargo, eso no quiere decir que la administración deba mantenerse fuera de un entendimiento básico del trabajo que se esta realizando. Cuando la administración no puede entender el desarrollo encarado es muy probable que se arrastren los alcances y fechas limites poco realistas. y, en general, frustración en ambos lados de la mesa. Esta es una queja común entre los programadores. Esta es una queja común entre programadores y también la fuente de muchos miedos 

6. Documentar nuestras aplicaciones
Si, existen aplicaciones que generan la documentación del código que escribimos, esa documentación es buena para otros programadores. Si trabajamos con una aplicación que sera utilizada por gente normal va a ser necesario escribir una documentación que una persona promedio pueda entender (por ejemplo, como funciona la aplicación, manual de usuario, etc.).
No es difícil ver que esta tarea es una carga muy pesada para los programadores. Fíjense en todos los programas Open Source que hay disponibles, cual es el común denominador en las tareas que mas ayuda solicitan? Documentación. Creo podre hablar en nombre de todos los programadores cuando digo "Puede alguien mas hacerlo?"

5. Aplicaciones sin documentación
Nunca se dijo que no somo hipócritas. Lo programadores están siempre solicitando librerías de 3ros para integrar en su trabajo. Y para poder hacer eso "necesitamos documentación". Des afortunadamente, como mencionamos en el punto 6 programadores odian escribir documentación. No, la ironía no se ha perdido.
No hay tarea mas frustrante que tratar de usar una librería de 3ros cuando no tenemos la menor idea de que es lo que hace la mitad de la función que queremos usar. Cual es la diferencia entre funcionPobrementeNombrada() y funcionParecidaPobrementeNombrada()? Necesito verificar nulos antes de usar la PropiedadX? Seguramente sera con prueba y error...

4. Hardware
Cualquier programador que alguna vez fue llamado para depurar un error extraño en la base de datos o por que el controlador RAID no funciona correctamente sabe que los problemas de hardware son dolorosos. Parece haber una mala concepción que si un programador trabaja con computadoras, seguramente sabemos como arreglarlas. Esta bien, esto puede ser cierto para algunos programadores, pero reconozco que la gran mayoría de nosotros no nos importa una vez que el assembly ya esta compilado. Nos concentramos en las tareas de alto nivel de tal forma que las cosas funcionen como deberían en ese estrato.

3. Ambigüedad
"El sitio web no funciona". "La funcionalidad X no funciona correctamente". los requerimientos ambiguos son dificiles de concretar. Va a ser siempre una sorpresa para mi como la gente ajena a la programación se exaspera al tratar de explicar como reproducir un problema a un programador. Pareciera que no entienden que "esta roto, no funciona, arregla lo" no es suficiente información para solucionar el problema.
El software es (mayormente) determinístico. Y nos gusta de esa manera. Dennos el gusto al hacernos saber que paso del proceso esta mal en lugar de pedirnos que "lo arreglemos".

2. Otros programadores
Los programadores no siempre se llevan bien entre ellos. Impactante, pero cierto. Este podría ser fácilmente el #1 así que solo nombrare algunas de las situaciones mas comunes que molestan a sus colegas de programación:
  • Ser gruñón al punto de ser hostil
  • No entender que hay un tiempo para discutir la arquitectura del sistema y tiempo para hacer las cosas.
  • Imposibilidad de comunicarse efectivamente y confundir la terminología
  • Apatía hacia el código base y el proyecto
Y como broche de oro la molestia mas grande para un programador

1. Código propio después de 6 meses
Alguna vez volteaste a ver algún código viejo tuyo con cara de dolor? pero que estupidez! como pudiste? quémalo... quémalo con fuego...!
Buenas noticias, no estas solo.
La verdad es, el mundo de la programación es un mundo en constante cambio. Lo que consideramos buenas practicas hoy puede ser obsoleto mañana. Simplemente no es posible escribir un código perfecto por que los estándares que se usan para juzgar el código están en constante evolución. Es difícil aceptar que to código, por muy lindo que sea hoy, probablemente sea ridiculizado en un futuro. Es algo frustrante ya que no importa cuanta investigación hagamos con las ultimas herramientas y tecnología, diseños, frameworks y buenas practicas siempre vamos a ver que falta algo mas. Para mi, esta es la cosa mas molesta para un programador. La fragilidad de lo que hacemos es necesaria para impulsar a las mejoras, pero no puedo dejar de sentirme como uno de esos monjes que pintan con arena.
Bien, ahí están. Top 10 de cosas que molestan a los programadores. Si ves que falta alguno por favor envía tus comentarios.

Off Topic 1 billion hungry

lunes, 25 de octubre de 2010
Por favor apoya a este movimiento, Únete a la red de lucha contra el hambre.


www.1billionhungry.org/andresurena/ 








Mitos y Leyendas del desarrollo con herramientas .Net

lunes, 22 de marzo de 2010
Desde hace ya un tiempo atrás, vengo enterándome que hay gente que cree que el desarrollo con Microsoft Framework.Net en todas sus versiones es pago y que la licencia es prohibitiva por sus altos costos. Es por tal razón que quiero aprovechar este Post para hablar un poco sobre este mito.

Para empezar bien, cuando una persona descarga el instalador del Framework está aceptando los términos y condiciones de la licencia, cabe destacar que en ningún momento se solicita un pago por la descarga o se evaluara una llave de código al ser instalado, es más, este framework puede ser instalado en una PC que no tenga una versión genuina de Windows (en cualquiera de sus versiones superiores a Win2k).

Esta licencia solicita que no se altere (entre otras cosas bastante básicas) la línea base del framework y que al redistribuirse hay ciertos archivos que no deberán ser empaquetados en la versión final de nuestro software.

Eso va en términos generales, podríamos ir línea por línea del EULA del Microsoft Framework .Net, pero, el desarrollador promedio no verá más puntos de interés en este documento, para poder bajar la versión 3.5 de esta plataforma y leer la documentación pueden visitar el siguiente enlace haciendo click aquí.

Ahora, las herramientas de desarrollo o también conocidos por sus siglas en ingles IDE (Integrated Development Environment) algunos si son pagos como Visual Studio que viene en muchas versiones orientado para diferentes roles dentro del desarrollo de software, desde los desarrolladores, pasando por testers, Arquitectos, profesionales de IT y Project Leaders. Estas herramientas pueden o no ser costosas dependiendo el rol al que están orientadas, pero no son las únicas disponibles para el desarrollo, Microsoft en su afán de expandir su plataforma .Net ha creado herramientas (IDEs) gratuitos, estas son las versiones Express de sus productos, que van desde Microsoft SQL Express para el manejo de datos a pequeña escala hasta IDEs de los lenguajes estrella de la plataforma.

Podemos ver con más detalle estas herramientas siguiendo el siguiente enlace.

Estas herramientas son completamente funcionales.

Espero les haya sido de ayuda.

HttpHandlers implementación básica

lunes, 1 de febrero de 2010
Flexibilidad, palabra clave al construir aplicaciones web, con httpHandlers podemos llegar un poco mas allá con muy poco esfuerzo.

El concepto detrás de los httpHandlers es brindar un punto en el que se pueda re-definir el procesamiento de una solicitud http, esto se presta para la implementación de muchos y diversos esquemas y patrones para la implementación de aplicaciones web.

Un handler tiene 2 caras, una que mira hacia la aplicación web y que es la que ve en detalle que es lo que hace y como, la otra cara mira hacia Internet Information Services, esta cara se encarga de tomar la solicitud http y llevarla al lugar que le corresponde dentro de la aplicación.

La idea del post es dar a conocer como se puede implementar un handler.

Pasos a seguir:


Creación de la clase que implemente la interfaz iHttpHandler (System.Web)
La clase podemos localizarla en 2 lugares, un (el mas cómodo) una clase dentro del directorio App_Code o en su defecto en un proyecto de assembly que haga referencia a System.Web e implemente la interfaz, para cualquiera de los dos casos la clase debería verse así

public class DemoHttpHandler : IHttpHandler
{

    #region IHttpHandler Members

    bool IHttpHandler.IsReusable
    {
        get { return false; }
    }

    void IHttpHandler.ProcessRequest(HttpContext context)
    {
        //Código para manipular el context
    }

    #endregion
}


Escribir el código necesario para la manipulacion del contexto web
El objeto HttpContext trae consigo a los objetos Response, Request entre otros mas que permiten la manipulación de la solicitud http hacia el sitio web, la manipulación no tiene limites (salvo la imaginacion del desarrollador) por lo que no me explayare mucho en esa parte.

Modificación del archivo web.config para apuntar al handler
Como todas las configuraciones de una aplicación .Net, los handlers tienen su sección propia muy sencilla que se ve de la siguiente forma:

Como se puede apreciar un nodo de http handlers es facil de entender, aquí sus partes
verb = verbos que serán interceptados por el handler, GET,POST,PUT, etc.
path = Extensión o nombre de archivo si es necesario que sera interceptado por el handler ni bien se lo solicite
type = El nombre de la clase (si es que la implementamos dentro del App_Code) , el nombre del assembly al que pertenece
validate = en caso de ser verdadero se verificara que la clase pueda ser cargada en memoria aun si no se ha realizado una solicitud, de ser falso se realizara esa verificación en cuanto se haga una solicitud.



Configuración del mapping en el directorio virtual de IIS para controlar las solicitudes http
Esta configuración se la puede realizar en IIS en sus versiones 5.1 o superior y dependiendo de la versión y el idioma la forma de encontrar donde es que se hace esta configuración, pero en términos generales se encuentra siempre en el mismo lugar (cambian ligeramente los nombres de los tabs y botones), y como dicen que una imagen vale mil palabras les paso las imágenes de la configuración del IIS

En el caso de la última imagen existe un check que verifica si el archivo solicitado existe, si es que se va a crear contenido dinámico en nuestro código este check deberá permanecer sin selección.

Con todo esto ya tenemos listo el handler y funcionando perfectamente, lo demás dependerá del código de implementación dentro del método ProcessRequest de nuestra clase.

Compresión de archivos con .Net

miércoles, 27 de enero de 2010
Muchas veces nos vemos en la necesidad de enviar información generada por una aplicación hacia un cliente, pero esta es demasiado grande o tiene demasiadas partes como para realizar una sola tarea para lograr el objetivo, compresión de archivos es una solución.

.Net Framework nos permite comprimir archivos o informacion en memoria haciendo uso del namespace System.IO.Compression.

Este namespace contiene 2 clases que representan a los 2 algoritmos de compresion que vienen incorporados con .Net, Deflate y GZip, el codigo que se presenta mas adelante utiliza GZip.


using System;
using System.IO;
using System.IO.Compression;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class CompressClass
{
    private byte[] LeerBytes(Stream param)
    {
        byte[] buffer = new byte[param.Length];
        using (MemoryStream ms = new MemoryStream())
        {
            int bytesRead = 0;
            do
            {
                bytesRead = param.Read(buffer, 0, buffer.Length);
                if (bytesRead > 0)
                {
                    ms.Write(buffer, 0, bytesRead);
                }
            } while (bytesRead > 0);

            return ms.ToArray();
        }
    }
    public static byte[] GetCompression(Stream param)
    {
        using (MemoryStream memoria = new MemoryStream())
        {
            using (GZipStream algoritmogzip = new GZipStream(memoria, CompressionMode.Compress, true))
            {
                algoritmogzip.Write(LeerBytes(param), 0, (int)param.Length);
            }
            return memoria.ToArray();
        }
    }
}

Como podrán ver por el código, es muy sencillo, no hay para que complicarse.

El resultado o retorno del método lo he dejado intencionalmente como un arreglo de bytes, esto para que se pueda utilizarlo como respuesta de un response en u entorno web o para que lo carguen al objeto stream de su preferencia.

Somo usar la clase
byte[] compressInfo = CompressClass.GetCompression(new StreamReader(Server.MapPath("images/piechart.tiff"), true).BaseStream);

Software de actualización de software

lunes, 25 de enero de 2010
Hace aproximademente unos 2 años una nueva forma de despliegue de aplicaciones viene cobrando mucha fuerza entre los distribuidores de sistemas operativos y aplicaciones que ahora esta siendo adoptada por los proveedores de hardware.

Al decir software de actualización de software no me refiero a un programa que al iniciarse busca su última versión en internet, ese fue solo el primer paso hace un tiempo atras, ahora lo que se quiere conseguir es que el usuario al iniciar su equipo de computo (cualquiera que este sea y bajo cualquier sistema operativo) este -el equipo- cuente con las últimas versiones tanto de los controladores de los dispositivos con los que cuenta como como las aplicaciones de software instaladas en él.

Hace ya un buen tiempo que este tipo de soluciones estan dando vueltas en el mundo informático, lo malo es que las soluciones propuestas solo eran usadas por entendidos en el tema y no por el usuario final (que son los mas numerosos).

Una excelente implementacion de este tipo de sistemas y hasta ahora la estrella de este nuevo tipo de aplicaciones seria iTunes del mundo de la manzana, una implementación simple, extensible, muy clara, y como ya todos sabemos muy costosa para ciertas cosas; el concepto de ésta aplicación es en si avanzado para la época en la que se lanzo, es decir, esta marcando una tendencia.

Hasta donde se puede ver, este servicio debería contar con ciertas características que son básicas para su buen funcionamiento.


  • Deberá implementarse como un servicio, claro esta, orientado al lado de "la fuerza" en el que será desplegado.
  • Este -el servicio- deberá ser liviano, rápido y con un motor de busqueda muy preciso.
  • El uso de medios estandares de comunicacion es obligatorio
  • Deberá ser extensible a traves de estandares no solo para un mismo proveedor de software sino tambien para proveedores de contenido.
  • Deberá permitir la creación de imagenes o copias de respaldo del estado del sistema en un momento dado
  • El cliente de este servicio (aplicación de cara al usuario final) deberá ser simple y ergonomica al uso que el usuario le dará (mucha información puede causar mucha confusión).


Si bien estos son solo unos puntos a ser implementados, hay varias compañias que estan presentando sus propias visiones de lo que es un servicio de estos, personalmente he podido usar el SoftPaq de HP el cual me parecio muy bueno, tiene un par de fallas en el tema de la versión de algunos paquetes pero soluciono el tema de tener que buscar los controladores de la ultima notebook que compré.

Otra compañia que apuesta al servicio es Intel con la propuesta que lanzo en el CES2010 si bien esta compañía es nueva en el area del desarrollo de software a apostado con todo y como es costumbre en productos con su sello marcará un rumbo a seguir.

A continuación presento una serie de enlaces que muestran a este tipo de servicios siendo ofrecidos (los que yo conozco). Hay muchas otras empresas que seguramente ofrecen actualizaciones de la misma forma.


Metodología ZEN para el desarrollo de software

jueves, 23 de abril de 2009

Aunque a muchos les parezca que esto no tiene sentido alguno, es necesario comprender que el desarrollo no solo es un proceso artesanal, sino que hasta podría considerarlo artístico. Sé que esto puede malinterpretarse pero en las siguientes líneas tratare de explicarme tan claro como el lenguaje escrito me lo permita.

La idea de un sistema, programa, herramienta de software o como quiera denominarse a una pieza de código compilado que cumple una función especifica es la de solucionar un problema o una situación dada para el manejo de información y/o cumplimiento de un proceso que puede o no ser administrado por una persona/s.

Esto puede llegar a ser una explicación muy simple en lo que a la cantidad de cosas que una pieza de código puede hacer, para alguno, para otros la explicación calza bastante bien; pero la idea de estas líneas no es la de tirar una verdad absoluta o de intentar conquistar los cerebros de los desarrolladores, sino, la de establecer una forma de entendimiento al momento de encarar el análisis de un proyecto de esta índole.

Es conocido por todos que el ser humano es el único ser de la creación que no es capaz de llevarse bien con su entorno, al plantear esta idea saltan a mi mente todos los conflictos bélicos y demás cosas que no son parte de este articulo, salvo que, hablemos de la forma en la que entablamos las negociaciones. Que tiene que ver esto con el desarrollo? bueno al momento de analizar una situación en la que es necesario implementar una pieza de cogido, es 100% seguro que deberemos entrar en negociaciones no solo con la persona que está encargando esta pieza, sino con el mismo equipo con el que se trabaja. Tenemos dos tipos de equipos de trabajo los cuales se dividen a su vez en más partes, definamos las primeras dos clases:

Grupos pequeños

Los grupos pequeños tienen a ser muy agiles, claro está, si es que este equipo se conoce bien, a fondo, conocen sus fortalezas y sus debilidades. En este punto quiero hacer hincapié.

Un equipo que conoce sus debilidades puede usarlas para fortalecerse a sí mismo al trabajar sobre ellas.

Un equipo pequeño que no tenga conciencia de sus debilidades es por lo general un equipo susceptible al conflicto, cada uno de los integrantes de este ve en su compañero de trabajo no a una persona que trabaja a su lado sino a una persona que le puede quitar su trabajo. Suena duro, pero así se presentan las cosas. Es sobre este tipo de equipo que me explayare y analizare cuales son los factures que debiesen tomar en cuenta sus integrantes para comenzar a fortalecerse.

Cada uno de los integrantes del equipo debiese conocer a todos sus compañeros, no solo en el ámbito laboral, sino como persona, esto podría parecer que no tiene relevancia y ahora explico porque si la tiene.

Al encarar una negociación muchas veces no logramos exactamente lo que queremos hacer, es en este momento que la personalidad de cada uno manifiesta su estado de ánimo de diferente manera. Algunos entablan una negociación en la que tanto uno como el resto salgan ganando, esta es la negociación ideal, así todos quedan contentos y el trabajo se aliviana tremendamente. Pero qué pasa si un miembro del equipo no está conforme con lo que se le asigno, o como termino la negociación, este miembro del equipo no ha ganado, es mas siente que ha perdido, he aquí el inicio de un problema muy grave.

El hecho que evite que no nos sintamos orgullosos del trabajo realizado comprende un fracaso tanto en lo personal como en lo profesional

Muchas veces me he encontrado en la situación en que uno de los miembros de mi equipo se siente frustrado por la forma en la que la negociación ha concluido, y es necesario que esa frustración sea:

Comunicada (de la mejor forma posible)

Tratada (entablar una negociación)

Solucionada (no puede quedar así)

Si estos pasos no son ejecutados tenemos una bomba de tiempo dentro del equipo, no porque aquella persona que no está "feliz" con el trabajo sea la bomba, sino por la situación en la que esta se encuentra, es necesario que el equipo se mantenga como tal.

Como comunicar frustraciones:

Al sentir que estamos perdiendo cada quien demuestra su sentir de diferente manera, depende de muchos factores, estado de ánimo, carácter, entorno, retribuciones, etc. la única forma de transmitir este sentimiento de frustración es hablando francamente con el equipo, mejor aun si se lo hace antes de cerrar la negociación (ideal) pero de no poderse tratar este asunto en una mesa redonda, el equipo de trabajo es como una familia, ya que durante un tiempo (tiempo de vida del proyecto) tendrán que compartir sus experiencias y verse las caras a diario.

(Continuará...)

Arquitectura de Software

El día 22 de febrero tuvimos el agrado de compartir un desayudo/presentación del grupo arquitectum.org en la ciudad de Córdoba. Pudimos ver que en muchas de las definiciones sobre el rol que cumple el arquitecto de software en una empresa estaban bien concebidas dentro del perfil que se está desarrollando en Harriague & Asociados. Entre los temas que se discutieron entra la forma recomendada por Microsoft del organigrama del área de Arquitectura, además, cuales son las responsabilidades del arquitecto en cada una de sus "facetas" por decirlo así, comencemos por el principio.

Definición del área de arquitectura (el qué, cómo y con qué)

Si bien el rol del arquitecto de software viene circulando desde hace mas de 10 años por los laboratorios de sistemas y las áreas de ingeniería de software, no se ha estandarizado una definición exacta de que es un arquitecto de software, es en este sentido que se busca en diferentes fuentes bibliográficas definiciones más claras de que es o como este debiera ser tanto como rol unipersonal como de un área que se dedique a la arquitectura de software, la siguiente definición.

“Arquitectura de software es la suma de los módulos complejos, procesos y los datos del sistema, su estructura y exactas relaciones entre sí, cómo puede ser y se espera que sea, sus extensiones y qué tecnologías participan, deducir las capacidades exactas y flexibilidad del sistema desde el cual se puede formar un plan para la implementación o modificación del sistema.” (Hohmann, 2003)

Con seguridad esta definición no abarca todos los aspectos de un arquitecto de software pero, toca las esenciales. Cabe mencionar que dentro de la gran gama de definiciones de diferentes autores se puede considerar que la arquitectura es diseño, si bien una de las tareas del arquitecto es “diseñar” una solución, el término diseño está siendo mal empleado y causa confusión al momento de la delegación de responsabilidades.

Si bien al momento de la creación de una solución de software para un cliente participan muchos roles y con responsabilidades muy claras sería bueno definir el objetivo (en términos no técnicos) que es lo que un arquitecto y el resto de su equipo debe hacer.

¿Qué?

El “Que” del desarrollo de una solución es el resultado de la unión de los requerimientos de un cliente que llegan a un arquitecto y este al tener una visión clara del entorno en el que se encuentra el cliente, las necesidades del mismo y las expectativas de crecimiento de este como resultado del uso de la solución que vamos a proveer, definen el propósito u objetivo de la aplicación de la mano de un modelado de negocios que es realizado en forma conjunta con los analistas que forman parte del equipo. Considérese que el arquitecto es el director de una orquesta sinfónica se encarga de coordinar a cada uno de los músicos para que la pieza que interpretan salga de acuerdo a la partitura.

¿Cómo?

Una vez con el modelado de negocios en mano y con un equipo de analistas funcionales, se confecciona la documentación técnica del proyecto, esto consiste en el análisis, modelado y diseño de la solución a los requerimientos del cliente. El arquitecto cumple el rol de organizador y facilitador de definiciones y como un validador de la evidencia del modelado.

¿Con qué?

Esta tarea es orquestada ( de nuevo por el arquitecto) y esta vez cambia el equipo de trabajo, ahora seguirá su trabajo junto con un metodólogo y un líder técnico con un framework de trabajo bien consolidado para definir cada una de las partes de la solución, esta vez si se toma muy en detalle a la solución, las decisiones deberán ser tomadas de acuerdo a la tecnología que vaya ser utilizada por el equipo de desarrollo, presupuesto y cronograma del proyecto (a esta altura ya debiera estar bien definido el equipo de trabajo del proyecto).

Organigrama propuesto

Esta más que claro que cada compañía tiene sus propios organigramas y definiciones de puestos de trabajo, y no es intención de nadie tratar de cambiar esto, lo que se intenta es dar una guía de cómo se pudiese que un área de desarrollo de soluciones se organice.

 

Si bien este organigrama toma en cuenta todas las áreas que se puedan involucrar en el mantenimiento y medianamente el desarrollo de aplicaciones, no cuenta con un área específica de ingeniería de software esta es esencial para toda aquella empresa que desee brindar servicios de software factory.

Calidad del servicio de arquitectura

Así como el término es aun algo poco definido, el servicio de arquitectura es aun más desconocido, la pregunta es, ¿Necesito un arquitecto para el proyecto? La respuesta a esa pregunta (si uno hace las cosas bien) va a ser siempre SI. Un arquitecto es aquel individuo que posee la visión más clara del negocio donde va a implementar una solución, y es capaz de hablar varios idiomas, por esto entiéndase, que es capaz de hablar con el cliente acerca de cómo encarar la solución en el mismo lenguaje que usa el cliente (lenguaje de negocios) y por otra parte es capaz de bajar a tierra todos esos conceptos en la forma más clara y técnica posible para poder comunicarse con los desarrolladores.

Características

A grandes rasgos se considera que un arquitecto de software debiese tener algunas (sino todas) de las siguientes características:

  • Visionario (ver el bosque y no solo los árboles)
  • Referente para su equipo de trabajo – consultor
  • Guardián de las estrategias y definiciones
  • Evangelizador de frameworks sin estar atado con la tecnología
  • Diseñador con criterio corporativo

Conclusiones

Está claro que el rol de un arquitecto, de forma estándar, no está definida del todo, sobretodo en nuestro entorno latinoamericano de trabajo, y depende de las buenas definiciones y trabajo arduo que tenemos por delante el definir a cabalidad el rol, sus responsabilidades y habilidades.

Bibliografía

Albin, S. T. (2003). The Art of Software Architecture—Design Methods and Techniques. Indianapolis, Indiana: Wiley Publishing, Inc.

Hohmann, L. (2003). Beyon Software Architecture: Creating and Sustanining winning Solutions. Boston Ma: THE ADDISON-WESLEY .

Metodologìa ZEN de trabajo en grupo (Cont.)

Como ya se había tratado de establecer en un post anterior la forma de trabajar con Ingenieros de sistemas (y ramas anexas) para poder realizar un proyecto en grupo, debe obedecer a ciertos lineamientos que todo ser humano debe seguir para tener exito en todos los proyectos que emprende (si, se a determinado científicamente que el Ing. de sistemas es un ser humano :D)

Grupos grandes.

Entendamos como grupo grande a un conglomerado de personas que manteniendo su individualidad pretenden afrontar un reto en el que todos deben dirigirse a un mismo punto desde diferentes caminos. aunque este enunciado suene algo rimbombante, es eso lo que se pretende cuando se trabaja en grupo.

Tomemos el punto de vista de la teoría de sistemas; cada sistema puede estar en el marco de un sistema mas grande, es esta relación simbiótica la que permite que un macro sistema compuesto de muchos subsistemas pueda realizar una tarea específica por ejemplo el cuerpo humano. Imaginen que uno de los pulmones no esta de acuerdo con el funcionamiento de el corazón, o que un riñón decide dejar de funcionar sin ninguna razón aparente, ésto causa problemas no solo a esos organos sino a todo el cuerpo ocasionando un sinfin de síntomas que evitan que el resto del cuerpo funcione como deba. se podría decir que esto es una enfermedad.

Asi como las enfermedades el hecho que uno o varios de los integrantes de un equipo de trabajo no se sienta bien ya sea con el trabajo que realiza, con su grupo de compañeros, con el entorno en el que trabaja o algun otro elemento de su mundo laboral, causa que el equipo entero comience a experimentar los síntomas de una enfermedad comunmente llamada "empleado descontento".

Sintomas claros de esta "enfermedad" son:

Trabajo mediocre.-

Podría calificarse de trabajo mediocre al resultado de:

  • La falta de comunicacion de abajo hacia arriba
  • El empleo de mas horas de lo planificado para una tarea de baja complejidad
  • El rehusarse a la utilización de las herramientas de control del proceso de trabajo (conciente o inconcientemente)
  • La pérdida de tiempo en actividades no propias del trabajo en horario laboral
  • Descontento con cualquier cambio en el entorno laboral

Las sutilizas del comportamiento humano deben ser bien identificadas, y es en este campo donde se deben realizar reuniones unipersonales con el equipo para recibir un "feedback" de la situación de "la persona" que esta detras del empleado, es muy factible que las inconformidades que ese empleado tenga sean muy fáciles de satisacer o de negociar, las negociaciones deberán encararse de forma Ganar - Ganar, es decir que ni la empresa ni el empleado deben sentir que despues de una negociación han perdido algo.

Si, como lo debes estar pensando, estas trabajando con un grupo grande de gente el hecho de reunirse con cada uno de ellos sería un problema logístico de proporciones bíblicas(bueno no tanto) entonces ¿que se debiera hacer?

DIVIDE Y VENCERAS

Hay formas(muy prácticas) de poder dividir al personal que esta asignado a un grupo de trabajo de tal forma que la comunicación ya sea de abajo hacia arriba o vice versa sea fluida y sin distorciones; una sola persona no es capaz de tener toda la visibilidad en detalle de la gestión de un proyecto y de recursos humanos.

Una de estas técnicas es la de dividir los grupos de trabajo, demasiado sencilla, pero, es muy efectiva, de esta forma podemos afrontar el reto de tener una idea muy clara de que pasa con el equipo de trabajo desde diferentes ópticas. Ahora, hay que saber que preguntar y como preguntarlo.

Muchas veces nos vamos a encontrar con desarrolladores y analístas que son muy sueltos y relajados al momento de hablar, con estas personas es muy poco probable que tengamos problemas al momento de la entrevista de feedback(llamemoslo asi por ahora); donde es posible que encontremos algo de dificultad en la comunicación es en esas personas que por alguna razón se sienten intimidados ya sea con el jefe o con el líder de proyectos. Es aquí donde el equipo de recursos humanos entra en acción y se encarga de las entrevistas, lo ideal sería comenzar por los mas juniors hacia arriba.

Esta temporada de entrevistas debiera tomar como máximo un par de semanas... sí solo un par y esto debido a que si se emplea demasiado tiempo en esta etapa la muestra recogida puede no estar del todo real, ya que la coyuntura se ha distendido y muchas situaciones pueden darse (ya se positivas o negativas) que afecten la información.

"... Como mantener a sus recursos rentables..."

La frase que acaban de leer es uno de los temas a tratar en una convención de dueños de empresas de diferentes rubros. Si bien el término rentable esta ampliamente aceptado, no es el correcto (o por lo menos para los recursos que son rentables).

En algún punto las empresas dejaron de contratar personas y empezaron a incrementar su bienes inmuebles? la respuesta a esa pregunta es un categórico NO, una de las cosas que podrian hacer para "mantener a sus tan apreciados recursos rentables" es dejar de considerarlos un mueble o un equipo que se conecta a la empresa de 9-5 (o el horario que sea) y empezar a tratarlos como personas.

SI SEÑORES los empleados son personas (aunque hay varios que clasificaron con la mínima nota), muchas veces el empleado migra a otra empresa en busca no solo de un sueldo mas alto, sino de un trato mas digno o de mejores oportunidades de crecimiento.

Quiero terminar con ese ultimo parrafo ya que este tema da para mas

 

(Continuará)

Software sin licencia viene con truco

Después de tantas acaloradas discuciones con personas de diferentes grupos y profesiones tengo ahora el agrado de decirles que yo tengo la razón!!!

Esta declaración viene a consecuencia de una nota la cual respalda los constantes errores de los que yo fuí partícipe en la empresa donde trabajaba antes (por razones mas que evidentes no puedo decir el nombre, pero aquellos que me conocen saben de quien hablo), constantes perdidas de datos, corrupción de versiones y etiquetas de VSS, pantallas azules al menos 1 por día en alguna PC y un sin fin de errores que no solo interrumpian el trabajo sino que lo volvian frustrante.

En una oportunidad tuve la "suerte" de trabajar en la localización de un demo para dicha empresa, este demo tenía errores muy particulares, cansado de esa situación (y hechandole la culpa a la PC) cambie de máquina y me puse a trabajar en mi notebook donde tengo todo el software licenciado (gracias a un buen amigo que me regalo el msdn universal) y grande fue mi sorpresa cuando el demo comenzo a funcionar perfectamente sin realizar ninguna modificación.

¿Cosa de Mandinga? Tal vez, pero de algo estoy seguro, desarrolladores capaces de crear un SO que es utilizado por gran parte de los usuarios de PC del mundo son capaces de PROTEGER su trabajo y sus productos con backdoors como estos.

Si bien a muchos esto perjudica, hay que considerar que al usar un software pirata se perjudica al creador de ese software.

Si, ya se, "Las empresas de software son moustros llenos de dinero y poder asi que no les afecta"

Y la pregunta del millon es, ¿Y que pasa si el software que hacemos nosotros llega a ser pirateado y usado de forma masiva?

Las leyes se cumplen, no se negocian.

Nota completa