Adicción al desarrollo

La mayoría me conocéis mas como alguien de Infraestructura, pero durante mucho tiempo mi carrera estuvo más enfocada al desarrollo, ahora que los avatares del destino me han centrado en aspectos alejados del código puro y duro, una voz en mi interior no paraba de presionarme para que desarrollara algo de cierto “calado”, por supuesto que en estos últimos años he hecho pruebas de concepto, diseñado cosillas, asesorado e incluso dado alguna que otra charla sobre desarrollo sobre todo en lo relacionado a la integración y SDKs de productos de Microsoft, pero lo que me llamaba la atención era hacer un producto completo y complejo con el fin de tener experiencia práctica con algunos conceptos del Framework 3.0 que el trabajo no me ha dado ocasión de probar, también me llamaba la atención usar Scrum con TFS.


Mi novia que es developer se unió al proyecto y aprovechando la jornada de verano nos pusimos manos a la obra, una vez montado el entorno, lo siguiente fue el análisis y la definición de la arquitectura y la elaboración de las pruebas de concepto que la validasen.


Diagrama de la arquitectura de la solución a alto nivel:



La aplicación es un smart client así que las pruebas de concepto de la arquitectura se centraron sobre todo en probar cual era la manera más eficiente de mover los datos, las pruebas corroboraron lo que ya había leído y todos sabéis: WCF con endpoints TCP y serializaciones personalizadas o binarias acompañadas de evitar el uso de datasets (aunque tengo que decir que en 2.0 me ha sorprendido alguna de las optimizaciones que he visto) dado que muchos servicios WCF correrían sobre un host de tipo Windows Service realice pruebas de stress y escalabilidad para garantizar el funcionamiento en balanceo y los niveles adecuados de hilos que usaríamos.


Comparativa entre el tiempo necesario para mover los datos usando serialización binaria o xml.


Figure 2 Remoting End-to-End Time


El interfaz a cargo de mi novia también tuvo sus pruebas, aunque en un principio nos decantamos por no usar WPF finalmente la aplicación usara algunos controles WPF, otro aspecto que hubo que probar es el modulo de notificaciones a los usuarios a través de Broker de SQL y WCF, el sistema ha demostrado una escalabilidad “brutal” y una fiabilidad fuera de toda duda.


La seguridad plenamente basada en el modelo de .Net y en SQL Server donde los nunca pueden leer o escribir en tablas y siempre tienen que usar SPs para modificar y Vistas a través de querys parametrizadas para leer (aunque hay algún SP para lectura) las vistas proporcionan la seguridad a través de estar ya filtradas por joins que garantizan que los usuarios solo verán los datos que les interesan y los SPs también contemplan seguridad por roles en cuanto a la seguridad en .Net ya la conocéis y el que no la conozca que se lea el estupendo libro de Marino Posadas sobre seguridad en .Net.


A partir de ahí documentamos todo lo referente a nomenclaturas y normas de codificación, comentarios, etc, era muy importante para nosotros garantizar que todo el código que escribiéramos seria auditable por FXCop y otra pequeña herramienta que hemos programado.


De esta forma después de la build diaria, se corren las pruebas de testing, se valida la calidad del código y su adecuación a las normas de codificación, se evalúa el performance de la solución, se crea la documentación con SandCastle y se despliega a las maquinas virtuales.


En el trasfondo del código se dejan ver las Enterprise Library 3.1 que convenientemente heredadas en una capa propia nos permiten ahorrarnos mucha codificación que francamente no creo que pudiera hacer mejor ;-).


En este momento mientras que mi novia sigue generando un grid WPF (sacado del de XCeed) que permita filtrar automáticamente, elegir los campos a mostrar o no y otra serie de funcionalidades, yo estoy con “CodeGen” el generador de código que nos permitirá generar algunos de los elementos básicos de la aplicación.  


Captura de pantalla del Codegen con una tabla de prueba:


Lo sé, lo sé, hay muchos generadores en el mundo, pero yo quería uno del cual entendiera el 100% del código generado, tuviera el código fuente, estuviera orientado a smart client y lo más importante: tratara las entidades como yo quiero y no generara una línea de mas.


De momento tengo prácticamente terminado el generador del código SQL (falta mas testing, algun hint y generar automaticamente las pruebas unitarias de todos los metodos de llamada al codigo generado ) y empezada la parte del generador de clases manager de entidades y de las propias entidades, donde los validadores y la injeccion de políticas de las Enterprise Library tiene un papel importante.


El generador de SQL genera:


-Un  insert.


-Un  update.


-Un update para cada FK.


-Un delete.


-Un select de registro.


-Un select de registro desde vista.


-Un select de multiples registros parametrizado con paginación de SQL 2005.


Opcionalmente:


-Una tabla de auditoría que incluye todos los campos de la tabla seleccionada más un ID, un campo que indica la operación realizada, otro campo para almacenar el login del usuario que realizo la acción y un campo datetime, estos dos últimos con sus correspondientes defaults.


-Incorporar a todos los SPs generados una llamada a un SP de inserción en la tabla de auditoría dentro de una transacción, de esta forma embebemos la auditoria en la propia BD evitando ocuparnos de ella en la aplicación, dado que ningún rol podrá acceder a las tablas directamente, podemos decir que gran parte de la auditoria o la totalidad en algunos casos, queda cubierta con el generador.


El código generado también ayuda a la gestión de los nulos, a mover las excepciones entre las capas, es increíble con que velocidad se generan miles de líneas ;-).


En la parte de las entidades queda mucho por hacer pero es muy interesante como por ejemplo el propio generador añade los atributos de los validators a las propiedades de las entidades de manera que si por ejemplo en la base de datos hemos definido que un campo sea un varchar(20) la propiedad de tipo string de la clase no pueda contener más de 20 caracteres, obiamente todo el codigo generado a de ser usado a traves de partial class o herancias (depende del caso).


Estoy ultimando un modulo que permite crear un pequeño BPM juntando Visio, WWF y policy injection.


Os dejo reconociendo que disfruto de cada línea de código que programo.


Os ire contando mas de mis avances con este proyecto.


 

Un comentario en “Adicción al desarrollo”

  1. Leyendo este articulo, y viendo el resumen escueto que has hecho del enfoque que le quieres dar, solo espero alguna vez tener un “%” del indice de conocimientos que tienes, en todas las facetas del desarrollo. Yo no llevo mucho en este mundo a nivel profesional, como un año y medio, aunque le dedico muchisimo tiempo, no solo laboral, si no de mi tiempo libre, y me he sentido contigo cuando dices lo de “disfruto de cada línea de código que programo”.

    En concunclusión, eres el arrase.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *