viernes, 4 de diciembre de 2015

Alta Cohesión y Bajo Acomplamiento, ¿Que es eso?

La primera vez que escuche el termino, me pareció algo extraño, pero se refiere a un término usado en la ingeniería de software que determina que al desarrollar las clases deben contar con métodos que les permitan sobrevivir por si solas , que no se apeguen a otros objetos en sus llamados, que si al realizar un cambio en una clase que es llamada por otras clases , esto no sea de alto impacto, por ejemplo , la adición de una nueva propiedad, no debe afectar ningún método.

¿Qué es cohesión?

Concepto aplicado al diseño de clases que hacen que esta, solo se dedique a una cosa en especial y que trabajará en conjunto con otras clases y librerías, pero sin perder la esencia para lo cual fue creada.

Es muy importante este concepto para Ingenieros y Desarrolladores debido a que en ocasiones he encontrado código creado que hace mil cosas, esto hace que la clase sea muy grande, difícil de enriquecer y sin el concepto de COHESIÓN.

Ejemplo: Analicemos un modelo de datos en el cual debemos mantener empleados y sus respectivos salarios.



Este último modelo obviamente es mejor porque piensa en el empleado y el salario como dos clases distintas con comportamiento propio.


¿Qué es acoplamiento?

Acoplamiento corresponde a como está relacionado un componente con otro y como un cambio puede afectarle en su comportamiento al resto de componentes, en otras palabras está dado por la dependencia entre una y otra clase, por eso es que en la medida en que podamos debemos buscar el más BAJO ACOPLAMIENTO, para no caer en que al modificar una clase, se afecte el comportamiento de otra.


Ejemplo: Analicemos el modelo de datos anterior y si vamos a crear una consulta de Empleado la forma correcta, seria usar sus propios atributos para filtrar los datos y evitar enviar muchos parámetros en la cabecera del método.


Aquí los llamados a los métodos




Alguien podría decir, pero los dos funcionan y vaya que es CIERTO!, pero existe una gran diferencia, un modelo el modelo con ALTA COHESIÓN Y BAJO ACOPLAMIENTO, crecerá más fácil , mantendrá las responsabilidades entre sus componentes y será menos costoso su mantenimiento a mediano y largo plazo.





martes, 28 de julio de 2015

WCF – Windows Communication Foundation

Como WCF es una plataforma para construir aplicaciones orientadas  a servicios, es importante para entender el concepto, manejar definiciones de XML, XSD (Schema Definition), SOAP, Web Services Description Language (WSDL) y SOAP (WS-Addressing, WS-Security, WS-Policy etc.).

WCF and Web Services Standards


WCF está organizado en contratos y estos se relacionan directamente con un estándar de servicios

Definición del Comportamiento de los contratos

El comportamiento está dado por los atributos provistos por la librería System.ServiceModel  que regulan tres aspectos fundamentales:


  1. Como el servicio se comporta y que atributos expone
  2. Cuando el servicio puede producir  fallas y que tipo de fallas se pueden producir.
  3. Tipo de Comunicación requerida, si es en una sola vía o en dos vías entre el cliente y el servicio.
Patrón de Intercambio de mensajes (MEP)  Message Exchage Patterns

Corresponde a los valores que puede tomar la propiedad OperationContractAttribute y en la forma en que el cliente establece comunicación con el servicio.

1.       Request/Response

Como valor predeterminado IsOneWay contiene “false”, así que si tu no estas en un canal dúplex, estas usando Response/Request.

2.       OneWay

Se ajusta al caso en el cual necesitamos enviar mensajes a un servicio sin obtener respuesta, es decir enviar algún parámetro que desencadenará un proceso de lógica de negocio, sin retornar nada al cliente.

3.       Duplex

Se ajusta a dos escenarios:

El cliente realiza una petición al servicio para iniciar un proceso largo que cuando termine de ejecutarse debe confirmarnos en un mensaje de retorno que el proceso fue completado correctamente.

El cliente necesita recibir mensajes no solicitados del servicio.

Aquí trabajan en conjunto dos propiedades del servicio

  • CallbackContract : Se asocia con el ServiceContract y se encarga de responder.
  • ServiceContract : Se encarga de ejecutar la operación.


No siempre es buena idea utilizarlo, debido a que el cliente necesitará una conexión hacia el cliente, y esto no siempre es permitido por razones de seguridad.

Ejemplo de Arquitectura WCF




martes, 16 de junio de 2015

Importancia de la Seguridad en las Redes Wifi

Las redes inalámbricas están basadas en la tecnología 802.11, pero antes de analizar los riesgos en los cuales podría estar la información que manejamos en nuestros computadores, tabletas, celulares o cualquier otro dispositivo que se conecte vía wifi a internet, es importante establecer la diferencia que existe entre la conexión común que es por Cable y la red sin claves, la diferencia se deriva del medio físico y que al conectarnos por cable tendremos el 100% de los recursos de ancho de banda, y la conexión se realiza por un cable al puerto del router, en cambio por la red wifi, nos da más comodidad para movilizarnos sin perder la conexión y encontramos la red por medio de ondas de radiofrecuencia como la televisión o la radio.

Riesgos de seguridad en las redes wifi

Cuando se trata de evaluar los riesgos que supone contar con una red inalámbrica en nuestra casa o empresa, se tiene en cuenta el tema de la distancia, que a pesar de que existe un estándar para conectarse a una red  a una distancia de máximo 100 metros, es posible que esto no sea del todo cierto, ya que los equipos de red del atacante como de la red puede contar con tecnología para superar esta distancia, aquí también juegan un papel fundamental otros factores como los obstáculos, la densidad de los mismos, la potencia de transmisión, la sensibilidad de transmisión  y la utilización de antenas de alto alcance.

Los atacantes sobre Redes wifi son clasificados de la siguiente forma:

a)      De Negación de Servicio: Este ataque compromete la disponibilidad de la red wifi, mediante la técnica de producir excesivo ruido en las frecuencias de la red wifi, lo cual haría imposible que los dispositivos se pudieran conectar, este ataque puede ser utilizado en entornos críticos como redes inalámbricas de monitorización de hospitales o infraestructuras críticas.
b)       Inyección de Tráfico: Aquí es donde un atacante modifica el comportamiento de la red , por medio de la inyección de tráfico

c)      Acceso a la red: El atacante establece una conexión no autorizada con la red wifi, y de esta forma disponer de acceso completo de la red, aquí afecta la integridad de las comunicaciones.

Como las redes inalámbricas son señales que viajan por el aire, no es tan complejo para un atacante interceptar los paquetes de datos que viajan por la red, si estos no están cifrados, este ataque es indetectable y afecta la confidencialidad de las comunicaciones
En la actualidad existen diferentes tecnologías para configurar redes wifi como WEP, WPA y WPA2, 802.1x, etc.

Aunque esto implica diversas tecnologías para configurar la seguridad en la red wifi, se debe tener en cuenta dos aspectos importantes para garantizar los accesos no autorizados.

a)      Cifrado de Comunicaciones: para evitar que nadie pueda capturar los paquetes enviados en la red y acceder a ellos.
b)      Control de acceso a la red: por lo general cuando se contrata una conexión wifi, los puntos de acceso vienen por defecto abiertos, de esta forma cualquiera podría capturar el tráfico de la red o conectarse a la misma.
En ocasiones el proveedor de la red, dispone de un sistema de configuración tipo WEP (Wired Equivalent Privacy), el cual es considerado inseguro, pues a pesar de contar con clave de acceso y utilizar el algoritmo de cifrado RC4 y adicional el protocolo HTTPS, fue diseñada de forma vulnerable, de manera que un atacante equipado con tecnología podría obtener la clave en corto tiempo y vulnerar la red wifi.
Se recomienda que para las redes de tipo personal, se utilice bajo el protocolo WPA2 (Wireless Protected Access 2) en su variante  Personal, con claves con más de veinte dígitos tanto para la red como para los clientes.
Existen dos formas de configurar este tipo de redes WPA2:
a)      TKIP (Temporal Key Integrity Protocol)
b)      AES (Advanced Encryption Standard), esta es la más segura  pues cuenta con los mecanismos de encriptación actuales.

Para las redes empresariales también se puede utilizar de la forma WPA2 Personal, en su variante corporativa o Enterprise, estas utilizan un servidor RADIOUS (Remote Authentication Dial in User Service), generando contraseñas aleatorias y robustas con los protocolos 802.1x y EAP (Extensible Authentication Protocol).
Además de todos estos medios de seguridad, la compañía debe contar con un software para detectar intrusos en la red, para conocer cómo se está comportando la red wifi.
Los mecanismos ya conocidos para reducir el riesgo en la seguridad en las redes wifi, como por ejemplo la ocultación del nombre o la validación por la dirección pueden ayudar, pero un atacante con los conocimientos necesarios podría vulnerar la seguridad de estas.

Ingeniería de Software




En la actualidad la utilización de la tecnología del software marca una pauta diferenciadora entre las empresas en sus procesos de calidad, es por eso imperante para los profesionales que comprendan las características únicas del software y el enfoque usado para desarrollar y mantener el software.
Este artículo les dará una visión de que es el software y cuáles son los objetivos y elementos de la Ingeniería de Software, además abordaremos los conceptos del Ciclo de Vida del software y metodologías actuales.

¿Qué es el Software?
Importante diferenciador en el negocio y que corresponden a los programas y documentación asociada tal como requisitos, modelos de diseño y manuales de usuario.

Tipos de Software de acuerdo a objetivos Comerciales
Por lo general los Ingenieros de Software no parten de cero para la implementación del software, sino que corresponde a la reutilización del software existente, refinado con la mejor calidad.
Para que un software satisfaga las necesidades de los usuarios, debe cumplir con las siguientes características básicas:

Mantenibilidad (capacidad de poder mantenerse): el software debe evolucionar para cumplir con las necesidades de cambio, en las empresas los negocios son cambiantes, ya sea por regulaciones de ley, estrategias comerciales, nuevas directrices de la gerencia, etc. se debe contar con un producto que madure.

Fiabilidad: el software deber ser digno de confianza. Lo que significa que la integridad de los datos que presenta en consultas, reportes o cualquier otro medio de salida cuenta con total veracidad en la información.




Eficiencia: el software no debe hacer un uso derrochador de los recursos del sistema. Este es un punto de suma importancia debido a que por lo general en los servidores conviven varias aplicaciones que compartían recursos de memoria y de almacenamiento en disco duro, lo que nos indica que si una aplicación empieza en determinado momento a consumir demasiados recursos de memoria, terminará afectando el resto de aplicaciones instaladas en el servidor.


Aceptabilidad: el software debe ser aceptado por los usuarios para los que se diseñó. Esto significa que ha de ser entendible, usable y compatible con otros sistemas.

Componentes del Software
El software está compuesto por tres componentes:
Programas: Entregan la funcionalidad y rendimiento deseado o esperado por los usuarios, y que corresponden a las instrucciones escritas en lenguajes específicos que los computadores puedan interpretar y ejecutar.
Datos: Cuando el programa se coloca en marcha requiere unos datos iniciales para operar correctamente, de igual forma cuando se realizan las pruebas en el área de calidad, se necesitan datos, estos datos son contemplados cuando se diseña el programa, datos en la base de datos o archivos en ubicaciones específicas.
Documentos: Este componente cuenta con la descripción de todas las opciones del sistema, explicando los flujos de procesos que tiene la aplicación, que datos se necesitan para que una operación se realice correctamente, dado que en los programas existen opciones dependientes de otras.

El software se desarrolla
El software es un producto que se desarrolla bajo necesidades puntuales y aunque la ingeniería de software fomenta la reutilización de componentes, es muy poco probable de que un software sea igual a otro, pues no se diseña como los componentes de hardware de un computador, sino por las necesidades imperantes de los usuarios que cambian en la medida que cambia el negocio.
Para construir un producto de software es necesario entender cuál es la necesidad real de los usuarios y cuáles serían las ventajas de hacerlo y el impacto para el negocio de no hacerlo, luego de esto seleccionar el lenguaje y tecnología más apropiada para diseñarlo, por ejemplo para sistemas de aplicaciones Web, se pueden realizar en lenguaje PHP, ASP.NET, JAVA etc. y que motor de bases de datos utilizar es el de mayor ganancia teniendo en cuenta licencias, capacidad de almacenamiento y rendimiento se puede seleccionar bases de datos como PostgresSQ, Mysql , Sql Server, Oracle, etc.

Cambios en el software
A medida que surgen cambios en el negocio, la manera de realizar una negociación, puede impactar significativamente las aplicaciones de la empresa, por eso es muy importante mantener un registro de los mantenimientos que se van realizando, actualizaciones de consultas, reportes u opciones, sin que estos cambios afecten el normal funcionamiento de las demás opciones publicadas.
El software se construye a la medida
La construcción del software se da por incrementos en las opciones de acuerdo a los requerimientos específicos del cliente, y aquí es importante anotar que en la medida en que se pueda reutilizar componentes debe hacerse, valiéndonos de patrones de diseño y aplicación de las características de la programación orientada a objetos.
En mi experiencia he visto en negocios donde cuentan con programas a la medida para controlar sus operaciones con clientes con perfiles específicos, sin embargo una práctica poco útil que he visto es crear nuevos ambientes y bases de datos para clientes nuevos que ingresan a la operación , esto implica un alto costo en disco y mantenimiento,  que fácilmente puede ser solucionado por medio de las bondades de la PROGRAMACIÓN ORIENTADA A OBJETOS, aplicando la herencia y el polimorfismo, que nos enseñan a pasar propiedades a otros objetos y generar nuevos comportamientos dentro de la misma aplicación sin afectar los demás objetos.


CMMI -DEV en el desarrollo de Software



CMMI que traduce Capability Maturity Model Integration, es un modelo de madurez, para la mejora de procesos para el desarrollo de productos y de servicios; su objetivo es propósito es ayudar a las organizaciones a mejorar sus procesos de desarrollo y de mantenimiento, esto para los productos como los servicios.
El CMMI tiene clasificaciones las cuales son:
·         CMMI DEV: es un modelo para empresas que desarrollan y mantienen productos de software, ya sea para el uso o venta.
·         CMMI ACQ: es un modelo para empresa que tienen múltiples proveedores de desarrollo de software.
·         CMMI SVC: es un modelo para empresas que son proveedoras de servicios, ya sea de manera interna o externa.
De acuerdo a lo anterior nuestro para nuestro caso en particular se debe escoger el CMMI DEV que es el más adecuado para las características de nuestro proyecto.
CMMI DEV es un modelo que cubre las actividades para desarrollar productos y servicios, la practica de éste intentan cubrir el ciclo de vida del producto desde su concepción, entrega y mantenimiento, centrándose en el trabajo necesario para construir y mantener el producto en su totalidad minimizando los riegos y obstáculos, las prácticas del modelo son enfocadas al direccionamiento del desarrollo de requerimientos, soluciones técnicas, integración de productos, verificación y validación.

Este modelo tiene dos tipos de niveles: niveles de capacidad y niveles de madurez. Los cuales son aproximaciones para el mejoramiento de procesos.

Se enfoca en el Desarrollo y Mantenimiento aplicado a servicios y productos.

CMMI contiene constelaciones que son modelos aplicables al:

·         Desarrollo de Software
·         Gestión de Proyectos
·         Gestión de Procesos
·         Ingeniería de Sistemas
·         Ingeniería de Hardware
·         Ingeniería de Software
·         Otros Procesos de Soporte

Propósitos de las Áreas de proceso del CMMI-DEV:

Abajo he graficado un resumen de como el propósito de CMMI-DEV se adapta a nuestro proyecto:

domingo, 14 de junio de 2015

Análisis de Riesgos en Proyectos de Software






Los riesgos están inmersos en el desarrollo de todos los proyectos, incluso si no hablamos de software, sino de obras civiles o comerciales también hablaríamos de Riesgos, lo cierto es que el riesgo se relaciona con eventos futuros que afectan el normal curso de las actividades planeadas del proyecto y que necesariamente exigen de parte del equipo de trabajo encabezado por el líder de proyecto, un cambio o un toma de decisión para mitigarlo.

Los riesgos no deben suponer la realidad de “Catástrofes” en el cumplimiento o las entregas del proyecto, sino por el contrario una oportunidad para en un escenario diferente tomar en el proyecto mejores decisiones que impliquen cambios y favorezcan notoriamente el producto.

Considerando entonces el riesgo desde la Ingeniería de Software decimos que el Análisis y gestión del riesgo son una serie pasos que ayudarán al equipo de software a entender y manejar la incertidumbre que se susciten en el proyecto. Un riesgo es un problema potencial que puede hacerse realidad o no, pero que sin importar el resultado, es una buena práctica identificarlo desde un principio, evaluando cual es el porcentaje de probabilidad para que se haga  realidad y cuál sería su impacto.


Para aquellos que se vieron la película "Indiana Jones", recordarán que este personaje interpretado por Harrison Ford, cuando se enfrentaba a alguna dificultad decía:”¡No te preocupes, pensaré en algo!”, lo cual indicaba que el solo se preocupaba por los problemas cuando eran inminentes, de esta forma, hacia alguna acción valerosa que le resultaba bien, eso es muy parecido a lo que sucede en algunos equipos de desarrollo de software, quienes son “reactivos” ante los problemas y no los identifican antes, solo los enfrenta cuando tristemente aparecen.


En los proyectos de software  y en la mayoría de los proyectos de diversa clase, no es buena práctica hacer el papel de “bombero” para resolver, esto puede resultar muy tedioso y desgastante para el equipo, en este caso se deben contemplar todo aquello que amenaza nuestro proyecto para esto se deben realizar tres cosas claves:

·         Identificar riesgos potenciales
·         Estimar su probabilidad e impacto
·         Clasificarlos según su importancia


Luego de estos pasos se deben diseñar estrategias proactivas para la gestión del riesgo.

Riesgos del Software


Riesgos del proyecto

Los riesgos del proyecto afectan muchos aspectos del proyecto, pero principalmente afecta el calendario del proyecto y en consecuencia los costos iniciales pactados con el cliente, debido a que la mitigación del riesgo puede representar el aumento de participantes y recursos.

Riesgos Técnicos

Estos amenazan la calidad del software, cuando un riesgo técnico, por la implementación de un nuevo componente de generación de reportes sin que el equipo conozca las funcionalidades y ventajas de este o el grado de consumo de recursos del servidor y del explorador, puede traer graves consecuencias, en el diseño, desarrollo,  implementación y mantenimiento del software.

Riesgos de Negocios

Estos riesgos amenazan la viabilidad del proyecto:
1.       Diseñar y desarrollar un producto con calidad que en el mercado nadie quiere.
2.       Desarrollo de un aplicativo que ya no se acopla a las estrategias comerciales de la compañía.
3.       Desarrollo de un producto que la fuerza comercial no sabe cómo vender.
4.       Falta de financiamiento por parte de los altos ejecutivos del proyecto.

5.       Pérdida y falta de presupuesto para continuar con el proyecto.

Riesgos Impredecibles

En esta categoría se encuentran los más desafortunados, aquellos que no fueron detectados a tiempo, por más que los ingenieros de software se dediquen a invertir un tiempo tratando de identificarlos, estos son muy difíciles de encontrar , estos también merecen un tiempo considerable.

Identificación del riesgo


Este consiste en crear una lista de chequeo, con esta se pueden encontrar varios de los más comunes.


Bibliografía :  Ingenieria del Software, Un enfoque práctico. Roger S. Pressman Mc. Graw Hill

jueves, 11 de junio de 2015

Perfiles de Seguridad en el Desarrollo de Software


Agradeciendo esta vista de una capacitación en Desarrollo seguro de software en la ciudad de Bogotá, por la fundación OWASP