sábado, 5 de marzo de 2016

El Gerente de Proyecto de SW.


¿Debe ser el Gerente Funcional o el Recurso Técnico (Arquitecto de SW / Desarrollador Senior)?
Es una práctica común en nuestro medio seleccionar como Gerente del proyecto al Gerente encargado del área en la que se desarrolla el proyecto o para la que servirá el producto o servicio resultante; en otros casos la designación recae en la persona con mayor conocimiento técnico o especialista exitoso de la empresa.
En el primer caso el Gerente de proyecto cuenta con el nivel de empoderamiento y toma de decisión requerida, sin embargo su responsabilidad funcional no le permite mantenerse en el detalle del proyecto lo que genera más bien la toma de acciones reactivas las mismas que no necesariamente aseguran lograr los resultados.
En el caso del recurso técnico o especialista exitoso, asume un rol tan importante con poco conocimiento o preparación en la disciplina de gestión de proyectos. Adicionalmente las organizaciones no cuentan con una metodología de gestión de proyectos en la que pueda apoyarse.
Con frecuencia, los proyectos gestionados de esta manera no logran los resultados que la organización requiere y se corre el riesgo de perder a un excelente técnico o especialista.

Pongo estos dos ejemplos, que me parece serán los más acertados para la Gestión de Proyectos de SW, ya que mencionar a otros “especialistas de proyectos” sin experiencia en software o en la industria en que se ejecuta el proyecto sería dar más riesgos al proyecto.
Por eso, como Ingeniero de SW, creo que es importante prepararnos como PMP, para dar a conocer las oportunidades, amenazas, hablar de tiempos, alcances, costos y demás temas de gestión de proyectos traducidas a palabras que pueda entender el negocio.

miércoles, 25 de febrero de 2015

CSharp Reflection


Buscando una solución para crear un esquema  de consumo de clases dinámico, me encontré con Reflection de C#.

Descripción del problema:
Tengo a cargo un desarrollo que consiste en aplicar correcciones a varios clientes de la empresa ABC que no cumplen con ciertas reglas de negocio.

Datos:
Al rededor de 60 reglas de negocio que no se cumplen.
Al rededor de 8000 clientes que no cumplen con las reglas de negocio.
Existen 45 reglas de negocio que pueden ser corregidas automáticamente.

Alcance:
El desarrollo parte desde el envío de los clientes para que dinámicamente se les apliquen las correcciones, es decir, cada reglas de negocio no cumplida, entrega al proceso que he denominado CORRECTOR un listado de clientes y este entrega una notificación con una lista de clientes corregidos por el proceso automático y otra lista de clientes para ser analizados por el usuario experto del negocio (donde no se pudo automatizar el proceso).

Solución:
1.- Cada CORRECTOR de regla de negocio va en un clase diferente (puede existir una clase abstracta que encierre los principales métodos).

  public interface ICorrector
    {
        CorrectorResult Corrector(string customerId);
    }

    public class CorrectorResult
    {
        public CorrectorCode Code { get; set; }
        public String Message { get; set; }
        public String ClassName { get; set; }
        public CorrectorResult(string className)
        {
            this.ClassName = className;
        }
    }

    public enum CorrectorCode
    {
        Ok,
        Error,
        NotExist
    }

   public class Rule0001Corrector : ICorrector
    {
        public CorrectorResult Corrector(string customerId)
        {
            var result = new CorrectorResult("Rule0001Corrector");
         
            //TODO: Implementation
         
            result.Code = CorrectorCode.Ok;
            result.Message = "Regla de Preventa 0001 aplicada exitosamente";

            return result;
        }
    }

 public class Rule0002Corrector : ICorrector
    {
        public CorrectorResult Corrector(string customerId)
        {
            var result = new CorrectorResult("Rule0002Corrector");


            result.Code = CorrectorCode.Ok;
            result.Message = "Regla de Preventa 0002 aplicada exitosamente";

            return result;
        }
    }


2.- El CORRECTOR Reflection que invoca cada clase de regla de negocio.

    public class RuleCorrectorReflection
    {
        private ICorrector rule;
        public CorrectorResult Result { get; set; }
        public RuleCorrectorReflection(string ruleClassName, string customerId)
        {

            //Obtiene Type del corrector de la regla
            Type correctorType = Type.GetType(ruleClassName);
         
            //Instancia el corrector de la regla
            var correctorInstance = Activator.CreateInstance(correctorType);
         
            //Setea en la interface para darle el comportamiento
            rule = (ICorrector)correctorInstance;

            //Obtiene el resultado
            Result = rule.Corrector(customerId);
        }

    }