July 2009 - Posts
El bueno de Santiago Bilinkis me avisa que se está organizando la reunión TED para Buenos Aires. Qué son las conferencias TED?
TED: Ideas worth spreading es una conferencia anual donde se presentan personas relevantes en sus ámbitos, presentando ideas que les interesan y apasionan. Las conferencias TED han ido creciendo en estos años en popularidad, y hasta diría, influencia. Son una plataforma para presentar ideas nuevas. Pueden ver un ejemplo en:
(comentado en mi post de blog personal: Sixth Sense, Sexto Sentido)
Pueden ver las conferencias en línea, en:
Charlas de TED
Hace un tiempo, los organizadores de TED autorizaron que se organicen reuniones similares, usando la idea, y ahora se está organizando una para aquí, Buenos Aires, Argentina. Pueden ver más detalle en el post de Bilinkis (emprendedor argentino, cofundador de OfficeNet):
Se viene TEDxBuenosAires
Ahí, Santiago explica:
¿Cuál es la idea de TEDxBuenosAires?
La idea es armar en los próximos meses una conferencia TEDx en Buenos Aires, reuniendo a varias de las personas con las ideas más extraordinarias de la Argentina. El objetivo es identificar y difundir ideas y contenidos que impacten positivamente a la Argentina de hoy y del futuro.
Este evento TEDx independiente será organizado bajo licencia de TED.
¿Cómo puedo mantenerme informado?
Para mantenerte al tanto de las novedades del TEDxBuenosAires podés unirte a este grupo de Facebook o a este de LinkedIn, o si no seguir en Twitter a @TEDxBuenosAires. En unas semanas estará también online un site en http://www.tedxbuenosaires.org.
Se puede colaborar de dos formas:
- En la difusión del evento (espero que este post ayude)
- Sugiriendo oradores (ahí en el post de Bilinkis tienen los datos a enviar y la dirección de contacto)
La organización está a cargo de varias personas, espero que aparezca más detalle en el sitio del evento.
Lo importante es que se está organizando, y espero que sea una forma de poner en la palestra a pensadores, hacedores, y gente, que tenga cosas interesantes, pero aún mejor, cosas importantes para decir. En nuestro país no está muy difundido aún el proponer ideas y tratar de difundirlas. Parece que todo tiene que pasar por el poder político, cuando nos olvidamos que ese poder es un poder delegado, un poder que tenemos nosotros.
En estos días, se está realizando:
http://www.tedxpatagonia.com/
en Chile. Veremos cómo resulta.
Pueden ver algunas de las conferencias TED que me gustaron o llamaron la atención para estudiar más en detenimiento en:
http://delicious.com/ajlopez/ted
Algunas de muestra (muchos están subtitulados en español, elegir el idioma en el control del video):
Golan Levin makes art that looks back at you Video on TED.com
Tom Wujec on 3 ways the brain creates meaning Video on TED.com
¿Cómo es el Universo- Por Stephen Hawking
TED Blog- The next Web of open, linked data- Tim Berners-Lee on TED.com (donde menciona al siguiente video)
Hans Rosling shows the best stats you've ever seen Video on TED.com (muy buena presentación, vean cómo presenta los datos duros)
Benjamin Wallace on the price of happiness Video on TED.com
Dan Gilbert researches happiness Video on TED.com
Bill Gates unplugged Video on TED.com (importante lo que transmite, pero vean como cautiva a la audiencia, con mosquitos reales)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Cuando no seguimos metodologías ágiles, esperamos que la especificación del sistema surja de conversaciones y análisis iniciales, trabajamos por unos meses, y luego entregramos algo al cliente. Por lo que ha pasado en muchos casos, esto es el camino a entregar algo que no es lo que necesita o espera el cliente. El resultado está ejemplificado en esta imagen:

(La primera vez que la ví, estaba publicada en una revista de los 50, referida a la ingeniería en general, no al desarrollo de software).
¿Cómo consigue Scrum (y metodologías ágiles en general) luchar con este síndrome de entregar cualquier cosa? Involucrando al cliente desde el principio del desarrollo, no sólo a través del product owner, que es el principal contacto del equipo con el cliente, sino también entregando al final de cada sprint una aplicación andando, que puede ser probada por los interesados, y de esta manera ir consiguiendo retroalimentación del cliente final, para que no pase lo del dibujo de arriba.
Al ir avanzando iterativamente, y viendo cómo la aplicación es tomada por el cliente, podemos ir refinando nuestra puntería, para llegar a algo que realmente sirve y tenga valor para el cliente final. Destaco “cliente” en vez de “usuario”: en mi jerga, cliente es alguien para el que el sistema tiene valor de negocio, mientras que usuario es quien lo usa. Este último puede no estar tan interesado en el valor de negocio, sino en que su trabajo sea fácil. El cliente es más importante: es alguien que usa el sistema, pero con interés personal en que todo tenga valor de negocio, y no sea una aplicación cualquier más.
También hay que interactuar con varios clientes, no siempre con uno solo. En la aplicación en desarrollo, pueden haber varias personas que ameriten ser clientes involucrados en lo que vamos entregando. Como ejemplo, el lunes pasado, en nuestro equipo, entrevistamos a un cliente, muy interesado en el resultado final de lo que estamos desarrollando. Es un cliente interesado en que el sistema sea algo mejor de lo que tiene ahora, y brindó su tiempo para explicarnos temas y detalles. Fue muy interesante la reunión: es un cliente de las trincheras, que está en el día a día de lo que debe hacer el sistema. Y fue interesante, porque hasta ese momento habíamos tenido algunas reuniones, pero con clientes que estaban algo alejados del trabajo de línea. Y a partir de la reunión, conseguimos ver más claro una parte del dominio del sistema, que nos aclara realmente cuál es el trabajo al que debemos ayudar con la aplicación.
Fue también importante, conseguir en esa reunión, una forma de seguir en contacto con este cliente en concreto. Una reunión no termina ahí. La relación con el cliente debe seguir a lo largo del tiempo, y no terminar en notas de una reunión. Una de las ideas que quiero implementar, en este caso, es tener un servidor de prueba accesible para esta persona y su grupo, para que vayan probando lo que estamos construyendo, como ya estamos haciendo con otras partes y otros clientes finales. Un pequeño detalle: durante la reunión se tomaron notas, directamente, en notebooks, para no tener que pasar después de papel a formato electrónico. Las notas se enviaron a la lista de correo del proyecto, para que todos las tengamos disponibles, hayamos estado o no en la reunión.
Pero es importante ir entregando, incrementalmente, interactuando con el cliente de la trinchera.
No es cuestión de caer un lunes, dentro de seis meses, e instalar la hamaca del árbol, que el cliente no esperaba ni necesitaba.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Muchas veces, en mis charlas de los últimos años, menciono esta frase “No somos vulcanos”. La comenté en el seminario que dimos con el bueno de Martín Salías en el MUG de Argentina:
Cómo programar y no morir en el intento
¿A qué me refiero con eso de “No somos vulcanos”?
A que somos humanos, y tenemos características que condicionan la forma en que hacemos software. Ejemplos.
Si fuéramos vulcanos, el cliente sabría lo que quiere casi desde el primer momento, o lo analizaríamos sin ambigüedades en unos momentos, al comienzo del desarrollo de un sistema.
Si fuéramos vulcanos, podríamos escribir el programa que necesitamos, desde el principio al final, sin necesidad de pruebas intermedias, o avances paso a paso.
Si fuéramos vulcanos, podríamos escribir y entender rutinas de decenas de líneas y docenas de parámetros. Podríamos manejar más de 5 o 9 cosas al mismo tiempo.
Si fuéramos vulcanos, al ver una nueva forma de hacer las cosas, solamente nos bastaría explicarla para que el equipo la adopte: sería la opción racional, y luego de una demostración lógica de su utilidad, la nueva práctica sería adoptada inmediatamente sin resistencia.
Si fuéramos vulcanos, no habría necesidad de ritos, como reuniones diarias, sino que haríamos lo que tenemos que hacer, sin mayor dificultad.
Si fuéramos vulcanos, encararíamos las tareas que lógicamente tenemos que encarar, cada día, en una secuencia que quedaría clara desde el principio, en vez de dar vueltas y vueltas, o desviarnos, o distraernos, intentando aplazar lo que no queremos hacer, o evitando las tareas que no nos interesan.
Si fuéramos vulcanos, todos tendríamos una clara idea de cuánto vamos a tardar en construir este software que tenemos entre manos.
Si fuéramos vulcanos, escribiríamos las pruebas de software, porque sabríamos de su valor a largo plazo, en vez de tener que escribirlas y correrlas rápidamente, para tener un “feedback” que sicológicamente nos ayuda a tener confianza en lo que estamos haciendo.
Si fuéramos vulcanos, no nos apoyaríamos tanto en las pruebas cuando cambiamos algo: al alterar algo del software, seríamos inmediatamente conscientes de los efectos laterales del cambio y detectaríamos al momento qué otras partes del sistema cambiar, para que todo siga funcionando como se espera.
Si fuéramos vulcanos, nos bastaría leer una vez una explicación de un patrón, para entender al punto su aplicación, intención y contexto.
Si fuéramos vulcanos, no tendríamos que partir el sistema en partes que fueran más manejables para nuestra mente humana.
Si fuéramos vulcanos, las APIs sólo tendrían versión 1.0, la única forma de armar esa API, de aquí a siempre.
Si fuéramos vulcanos, no habría distintos protocolos, aplicaciones clientes y servidores, distintos lenguajes SQL, dialectos de bases de datos, diferencias pequeñas en algo que debería ser implementando de una sola forma. Habría un solo formato de gráficos, otro único de video, y así.
Hasta me atrevería a decir que si fuéramos vulcanos, no haría falta SVN con historia, siempre iríamos avanzando, sin necesidad de volver atrás en algún momento.
Pero como somos humanos, necesitamos la ayuda de estrategias, prácticas, herramientas, y paciencia y voluntad y perseverancia, para llegar a construir software de una forma aceptable. Necesitamos de los ritos, como la reunión diara de standup en Scrum. Como somos vulcanos, no podemos imponer un cambio en una empresa o equipo, tenemos que ir produciendo el cambio de a poco, como escribía en Ser catalizador de cambios. Necesitamos de “soft skills” para manejar las relaciones con los demás, entendiendo no solamente las razones, sino también las emociones, miedos, ambiciones, alegrías y preferencias de los demás, en el día a día. Mucho de las disciplinas de XP, o Scrum, se deben a la naturaleza humana. Como el pair programming, que en Vulcano sería totalmente una pérdida de tiempo la mayor parte de las veces, acá refuerza la tarea, al ser dos humanos que se compensan en sus debilidades. En Vulcano, dos cabezas piensan igual que una, porque la lógica es la misma.
¿Se les ocurren otras diferencias con los vulcanos?
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
A veces me preguntan: cuántos desarrolladores senior se necesitan en un equipo Scrum? Yo veo que Scrum puede aplicarse no sólo para desarrollo de software. Pienso que es más interesante, ver algunas características de capacidad y actitud, que he visto en los equipos en los que he trabajado o he visto trabajar.
A) El talentoso: es el desarrollador (o diseñador gráfico, o arquitecto) que se destaca en lo suyo. Todos los miembros del equipo lo reconocen con excelente en su especialidad. Es el que saca las papas del fuego, cuando hay algo que no funciona, y que encuentra soluciones viables y originales a problemas bloqueantes. Su vida es la programación o el diseño, o lo que sea en lo que se destaque.
B) El entusiasta: es quien cada día pone todas las ganas para hacer avanzar el trabajo, el que está dispuesto a aprender algo nuevo, a enseñarlo, a ayudar a alguien con trabas en su trabajo. Está consciente de la dinámica del trabajo y del equipo, y siempre está dispuesto a estar ahí, para apoyar, ayudar en algo, y avanzar en el desarrollo de la etapa.
C) El ordenado: su vida pasa por otro lado (el ajedrez, la música de cámara, la fotografía, la colección de bolitas), y trabaja en el desarrollo de software porque es su medio de vida. Pero es ordenado. Cuando se le pide hacer algo, lo hace bien, o si se traba, informa adecuadamente. Es un pequeño tanque sherman, alguien que avanza, despacio pero sin pausa, y que no se desvía de lo que tiene que hacer.
D) Los demás: los que no tienen talento, tampoco demuestran entusiasmo por lo que hacen, y además, son desordenados: toman un trabajo y no lo terminan nunca, no informan del estado, se desvían a cada momento, y están en la suya. Tampoco demuestran entusiasmo en mejorar.
Varios puntos, para aclarar esta tipología:
- En el equipo, debería haber gente del tipo A, B, C. Si no tienen A, deberían estar disponible alguno, como consultor, mentor, como alguien que ayuda a los equipos, aunque no sea miembro.
- Reconozcamos, son pocos los A. En nuestra profesión, hay gran dispersión de nivel, no todos llegan a A.
- Esto es una tipología, no una clasificación. Una persona no es A o B o C o D, con o exclusivo. No, alguien puede ser A en un tema, B en otro, y D tal vez en otro. Alguien puede ser A en desarrollo, B en diseño de software, pero no dotado especialmente en eso, C en escribir documentación, y D en deployment.
- Cada miembro del equipo, debe, en el tiempo, reconocer en que tipo está para cada actividad que necesita encarar.
- Un junior entusiasta, puede llegar a ser talentoso en un ámbito. Pero muchas veces, el talento se detecta en la etapa de recruiting.
- Si alguien está en D en algún ámbito, debe trabajar para llegar a B o C, y ser ayudado por el equipo. Por ejemplo, si alguien no le gusta documentar y se pierde en esa tarea, debería trabajar su capacidad y sus inclinaciones, para llegar a ser por lo menos ordenado en la documentación que escribe, si no puede llegar a entusiasmarse por la tarea.
- Si alguien está en D en alguna tarea, cuando le toque esa tarea, sería bueno que la comparta, en “pair programming”, con alguien C o B. Si alguien no está entusiasmado por el tema deployment, cuando le toque una tarea de ese tipo, podría hacer par con un entusiasta del tema, o con alguien ordenado, alguien que lo va acompañar para que la tarea se realice y se compruebe, sin desviarse en el camino.
- Esto de trabajo a pares complementarios, se puede extender. Hay veces que tenemos entusiastas desordenados. Gente que pone toda la fuerza en llevar a cabo algo, pero que no se concentran o se desvía o no tiene claro el camino. Puede hacer par con un ordenado o con un talentoso, para que el entusiasmo se encamine por el camino correcto. Muchas de las motivaciones del “pair programming”, el trabajo de a pares, se debe a la compensación de las distintas cualidades de los miembros del equipo.
- Lo más difícil, es cuando alguien con D en un tema, no muestra ni siquiera la inclinación de mejorar en eso con el equipo. Es el caso de la gente que se queja de algo, pero no hace nada para ver en qué puede él mejorar para que la queja disminuya, o qué puede sugerir para que eso mejore. O que siempre rehúye una tarea, poniendo excusas. Es un tema difícil, habrá que ver cada caso en particular. Pero desde ya, hay que disminuir la posibilidad de que haya un D “encallado”, alguien que no quiere salir de esa zona personal suya, para pasar a alguna otra letra. Desde el punto de vista de manejo del equipo, el trabajo de pares puede mitigar el efecto de un “D encallado”.
Pero hay una cualidad que no debe faltar, algo que es fundamental, para que Scrum pueda avanzar: cada miembro DEBE SER UN JUGADOR DE EQUIPO. Debe tener la capacidad y la inclinación (y sino, debe cultivarla) de trabajar en equipo. No hay “prima donnas” en un equipo Scrum. No hay gente que no practique la comunicación. No debe haber “camarillas”, o “yo me corto solo con este tema”. Cada miembro del equipo debería estar al tanto de lo que hacen los demás (de ahí la importancia de la reunión de daily standup).
Antes de clasificar a los demás miembros de su equipo, primero, en qué tipo está Ud, para desarrollo, documentación, comunicación, instalación, comprobación, diseño?
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Ya hace casi tres años que estoy trabajando en proyectos con equipos que siguen metodologías ágiles, y una es Scrum. Quiero comentar hoy uno de los “ritos” de Scrum, una reunión diaria de Standup.
Se reúnen todos los miembros del equipo, a una hora, todos los días, preferentemente al inicio de la jornada. Cada uno de los miembros contesta, por turno, estas tres preguntas:
- Que hizo el anterior día en el proyecto
- Que se compromete a hacer este día
- Comenta cualquier “blocking issue”, cualquier problema que lo tenga bloqueado en el avance.
La reunión se llama standup, porque se realiza de parado: la idea que se promueve es que la reunión es corta. Las preguntas de arriba, prácticamente se contestan en menos de un minuto por participante. Vean que no se pretende un gran detalle en describir lo que se hizo. Si alguna actividad necesita más descripción, seguramente se planteará una reunión aparte, o el armado de un documento que explique qué se hizo. Pero no es el objetivo de la reunión entrar en detalles.
Se espera que cada integrante esté presente. Si un integrante no puede venir, y estaba previsto, debería enviar un email o mensaje, contestando esas preguntas. La reunión es física, presencial. Es más raro tener equipos distribuidos en Scrum. Alguna vez vi, que al estar un integrante lesionado y trabajando desde su casa, el standup se hizo vía mensajería instantánea (y se descubrió en ese momento, que la respuesta a esas preguntas, se podía hacer de forma breve).
Si un integrante llega tarde, deberá explicar, y no repetir esa conducta. Es conveniente planear las reuniones de standup para que se realicen a la misma hora. Si algún integrante no puede venir a esa hora, se trata de buscar alguna alternativa, como cambiar el horario de la reunión. Otra señal de salud, es el orden: no se interrumpe a alguien que está contestando las preguntas, y no se plantean discusiones o conversaciones entre los miembros. Si hay alguna duda o diferencia sobre algún tema, se trata de organizar una reunión adicional, entre los miembros interesados.
Pero el gran objetivo de la reunión, es la disciplina y la comunicación. Al ser diaria, y estar planeada, la salud del standup refleja la disciplina del equipo. Y la comunicación, un pilar de Scrum, se ve reflejada en un rito diario, donde los integrantes se ven las caras y comienzan una nueva jornada con una tarea concreta. Si un nuevo integrante se incorpora, esta reunión lo comienza a incorporar en las actividades del equipo.
Hasta diría que hay un componente psicológico en la reunión: el contacto directo del equipo y su sincronización. Si bien el equipo, en Scrum, trabaja en un lugar físico en estrecho contacto, la reunión de standup imprime al día una especie de compromiso colectivo, y un punto, un hito, de volver a estar en sintonía cada miembro con el resto. Pueden organizarse reuniones de sync-up, de sincronización, para informar el avance de los compromisos durante el día. En otros casos, se informa el avance o bloqueos por algún medio, como un email.
En general, alguien del equipo anota los compromisos tomados, o cada uno de los miembros se hace cargo de anotar los suyos, y comunicarlos, en una lista de correo o en alguna herramienta de soporte (desde un simple pizarrón, hasta un sistema informático). La cuestión es que si alguno de los involucrados quiere saber qué se está haciendo, una fuente de información es el resultado de la reunión diaria de Standup.
Para quien no esté practicando Scrum, esta reunión puede parecer trivial, o hasta “salteable”. Les recomendaría que si van a encarar Scrum, esta actividad es la que MENOS se debe cambiar. Disciplina, comunicación, sintonía, equipo, todo se refuerza en cada daily standup.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Recuerdo los ochenta, cuando hizo furor en el mundo el ya clásico cubo de Rubik. En la universidad de Buenos Aires, Facultad de Ingeniería, nos reuníamos a discutir las distintas formas de resolverlo, los operadores y trucos. Recuerdo que fue mi primer aplicación nerd de teoría de grupos, conmutadores, centralizadores, y demás. Hubo un número de colección de la Scientific American, con el cubo en la tapa (una imagen de computadora, creo), y creo recordar, David Singmaster (yo creía entonces que era un seudónimo de algún otro matemático) como uno de los principales contribuyentes al artículo de tapa.
Uno de los problemas de manipular el cubo era que debía mantenerse en buen estado, sin fricción si fuera posible. Alguna vez hice una versión sobre un monitor CGA o VGA, con pocos colores, para poder ensayar algunos pases sin tener que usar un cubo real.
Pero pasan los años, y hoy tenemos esta nueva versión, el Rubiks Touch Cube, que estará a la venta en estos dias, digamos que a u$s 150 (sí, si quieren, pueden enviarme uno… :-)
Otra aplicación más, inesperada, para las interfaces touch.
La información original la encontré en
http://www.raton.cl/2009/07/23/tecnologia-touch-para-el-super-clasico-cubo-rubik/
via algún twitter, de @juandamia
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Han pasado dos meses desde la última reunión virtual de ALT.NET Hispano. La última fue el pasado 24 de Mayo, con la participación del bueno de Fabio Maulo, por supuesto hablando de NHibernate. Ya han habido 5 reuniones VAN:
Si no conocen qué es una reunión VAN, pueden consultar
VAN meetings
Para ver cómo se desarrolla una VAN de ALT.NET Hispano ver
Descripcion-de-Reuniones-VAN
Ahora se viene una nueva reunión virtual, el próximo 1ro. de Agosto, pueden registrarse en:
http://eventioz.com/admin/events/van-hispano-1-de-agosto-de-2009/registrations
El tema será CSLA.NET, el framework de aplicaciones para .NET, que nació en su tiempo en Visual Basic clásico.
Pueden ver el resultado de las anteriores reuniones virtuales en:
http://altnet-hispano.pbworks.com/Historial-de-reuniones
Algunas reuniones fueron pasadas a video, como ejemplo, pueden ver al bueno de Fabio Maulo en:
http://altnet-hispano.pbworks.com/NHIbernate.2009-06-22-12-54-41
Si no conocen qué es ALT.NET pueden visitar:
¿Qué es ALT.NET?
Es un movimiento… así de sencillo, pero también de entrada hay que decir que no hay una definición totalmente oficial ni exacta, hay descripciones y principios (tal vez no leyes) que rigen cómo piensa y actúa un alt.netero. De hecho, si buscas en la Web, seguramente vas a encontrar diferencias en como lo entienden unos y otros, aunque también es necesario aclarar que las diferencias son muy pequeñas y no muy distantes.
que nació de un post original de Jorge Gamba:
Que es ALT.NET
Pueden seguir la actividad del movimiento en Twitter:
@AltNetHispano
El sitio wiki de la comunidad:
http://altnet-hispano.pbworks.com/
Ahí leemos:
(tomado del sitio altdotnet.org)
"Somos una comunidad, independiente y con fines específicos, de desarrolladores comprometidos por un deseo de superarse, desafiar supuestos, y que se ayudan entre sí perseguiendo la excelencia en la práctica de desarrollo de software."
Posts relacionados:
ALT.NET Argentina, ALT.NET Hispano, primera reunión en Buenos Aires
ALT.NET Buenos Aires Primera Reunión
(Imagen tomada de http://altnet-hispano.pbworks.com/)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Hace dos semanas, terminé de dar un curso de ASP.NET, con máquinas, en el laboratorio del Microsoft User Group de Argentina, en Buenos Aires, contando con diez asistentes, con los que tuvimos 30 horas explorando el desarrollo de sitios dinámicos con .NET. Los ejemplos que fuimos desarrollando y otros que bajamos de ejemplos míos, están disponibles para bajarse desde:
Material del Curso de ASP.NET en el MUG
(Siempre pueden bajar lo que tratamos en mis cursos, desde
Materiales de Cursos
ya sea ASP.NET, .NET, arquitectura, Java, JSP, Spring, Struts, etc… así como las presentaciones que se usaron)
Hay varios ejemplos para estudiar, que podría explicar más en detalle en algún post, pero vaya ahora una introducción:
AjFirstExample
En este ejemplo
tenemos una base de datos, que pueden instalar usando cualquiera de los dos directorios Sql, y dos soluciones, una en VB.NET y otra en C#.
En el directorio Sql, tenemos:
Podemos lanzar la creación de la base con el comando ExecuteAll.cmd, que contiene
@REM -------------------------------------------------------------
@REM You can change server.
@REM -------------------------------------------------------------
SET sqlServer=%1%
if "%1%"=="" set sqlServer=(local)
call CreateDatabase %sqlServer%
rem TBD:
rem call LinkData %sqlServer%
rem call InsertData %sqlServer%
goto end
:end
Si lo invocamos sin parámetros, va a conectarse con nuestro MS SQL Server (local). Si queremos ir contra otra instancia, por ejemplo, contra .\SQLEXPRESS, hay que invocarlo como:
ExecuteAll.cmd .\SQLEXPRESS
Crea una base simple, AjFirstExample, con dos tablas, clientes y proveedores, y procedimientos almacenados:
El ejemplo sigue algunos linemamientos de Patterns & Practices, de Microsoft, como tener separados Business Entities de Business Components. La solución tiene varios proyectos:
WebClient es el sitio web. AjFirstExample.Services es una capa de servicios lógicos (no tecnológicos, como podría ser un Web Service), que es un .DLL que se invoca directamente de el sitio web. Es lo que en patrones llamamos una Service Layer. AjFirstExample.Entities contiene entidadas simples, con datos, sin conducta ni persistencia. Está muy orientada al ejemplo, que apenas es un CRUD (Create Read Update Delete) de entidades, fragmento:
Imports System.Collections.Generic
Imports AjFirstExample.Entities
Imports AjFirstExample.Business
Imports AjFramework.Data
Public Class SupplierService
Private Shared mSupplierComponent as new SupplierComponent
Public Shared Sub Insert(entity as Supplier)
mSupplierComponent.Insert(entity)
End Sub
Public Shared Sub Update(entity as Supplier)
mSupplierComponent.Update(entity)
End Sub
Public Shared Sub Delete(id as Integer)
mSupplierComponent.Delete(id)
End Sub
Public Shared Function GetById(id as Integer) as Supplier
return mSupplierComponent.GetById(id)
End Function
AjFirstExample.BusinessComponents tiene lógica de validación antes de grabar o insertar una entidad, y AjFirstExample.Data termina encargándose de la persistencia, usando un DataService, que yo había codificado dentro de algo que uso en mis cursos, AjFramework.
En las páginas web, es común conversar con el servicio, para tomar y enviar datos a ese proyecto:
Public Partial Class Admin_CustomersPage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
'Put user code to initialize the page here
If Not IsPostBack Then
gvwData.DataSource = CustomerService.GetList
gvwData.DataBind()
End If
End Sub
End Class
Este ejemplo lo tienen también en ese mismo .zip implementada en C#. Van a ver que ha sido generada directamente por AjGenesis, el generador de código que uso para armar gran parte de mis ejemplos y del desarrollo del día a día que emprendo:
'
' File generated using AjGenesis
' http://www.ajlopez.com/ajgenesis
' http://www.ajlopez.net/ajgenesis
' Open Source Code Generation Engine
'
Si tienen que cambiar el string de conexión, deben modificar el web.config del proyecto web, en el sector:
<AjFramework>
<Parameters>
<Parameter Name="ConnectionString" Value="server=.\SQLEXPRESS;database=AjFirstExample;Integrated Security=true"/>
</Parameters>
</AjFramework>
Hay otro ejemplo para bajarse e instalar de la misma manera:
AjTest
Con las mismas ideas:
pero con más entidades:
Cada departamento contiene empleados. Los proyectos contienen tareas, y las tareas se pueden asigna a empleados. Cada empleado tiene "Skills”, competencias, y cada competencia tiene empleados. Desde las páginas de administración, pueden ingresar los datos de estas entidades.
Sin embargo, la relación entre estas entidades, no está en la entidad misma, sino en cómo recuperamos los datos necesarios desde el servicio. En vez de tener dentro de Department una lista de Employee, los empleados de un departamento se obtienen desde código, ejemplo:
protected void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
if (!IsPostBack) {
IdEntity = Convert.ToInt32(Request["Id"]);
Entity = DepartmentService.GetById(IdEntity);
dtgDataEmployees.DataSource = EmployeeService.GetByDepartmentEx(IdEntity);
DataBind();
}
}
Un ejemplo, donde usamos una base similar, pero en el código establecemos las relaciones, está en:
AjTestCSharp3Linq.zip
Acá usamos Linq2Sql
donde las entidades, generadas por el wizard de Linq2Sql, ya tienen las relaciones incorporadas. Entonces, una vez obtenido un Deparment, podemos pasar a Employees en una simple propiedad que tiene el objecto departamento:
protected void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
if (!IsPostBack) {
LinqDepartmentsService service = new LinqDepartmentsService();
IdEntity = new Guid(Request["Id"]);
Entity = service.GetDepartment(IdEntity);
dtgDataEmployees.DataSource = Entity.Employees;
DataBind();
}
}
Un último ejemplo más, para este post rápido:
AjFirstExampleWcfCSharp3.zip
En este caso, seguimos usando Linq, lo que viaja a la presentación, son mensajes Windows Communication Foundation, hay un sitio web que expone servicios WCF, y de la parte del cliente, código de gateway para llegar a esos servicios:
En vez de llegar a la presentación las entidades de .Data, de Linq, pasamos mensajes de Data Contract de WCF:
namespace AjFirstExample.Services.Contracts
{
using System;
using System.Runtime.Serialization;
[DataContract]
public class Customer
{
[DataMember]
public Guid Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Address { get; set; }
[DataMember]
public string Notes { get; set; }
}
}
Bueno, espero que puedan sacar algo útil de estos ejemplo, vean también los archivos de ejemplos que fuimos desarrollando en cada clase.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Antes de ayer, 20 de Julio, @hallo twittereaba:

Recibió varias respuestas, acá va una mía y otra que recibió:
Lo que pasa es que hemos estado generando código por décadas. La herramientas que usamos para eso tiene nombre: compilador. Recuerdan los viejos días? Había que setear los relés en la ENIAC, o usar el panel frontal de la micro Altair para inicializar su memoria. Los compiladores acudieron en nuestra ayuda, generando código desde un modelo de más alto nivel: el lenguaje de programación.
Pero por las últimas tres décadas, no elevamos el nivel de abstracción: seguimos usando lenguajes de programación directamente, para programa. Algunas excepciones: el lenguaje SQL, que nos relevó de recorrer cursores o buscar en índices ISAM, o el diseñador de formularios de Visual Basic, que nos liberó de escribir decenas de páginas de código de Windows a la Petzold.
El generar código desde un modelo (como trato de promover desde mi proyecto personal AjGenesis), es la manera de obtener y usar un nuevo “lenguaje”: sea un DSL, domain specific language, o un DSM, domain specific model, o lo que querramos usar como punto de partida.
Hoy mismo tenemos demasiadas tecnologías, con miríadas de detalles y configuraciones a atender. Pienso en Spring Framework, Hibernate, Struts 2, JavaServer Faces, ASP.NET MVC, Web Services, Windows Communication Foundation, etc… Sabemos más cosas hoy de cómo desarrollar software, pero las aplicaciones actuales están infectadas de toneladas de detalles técnicos, fruto de problemas y errores. Muchos de esos detalles podrían ser derivados desde un modelo, como en mostrado en ejemplos de AjGenesis que he posteado por acá en los últimos años, creando salidas para diferentes tecnologías.
Si lo miran bien, esto es lo mismo que decir: “a=fact(4)” es el modelo, y registros de procesador, manipulación de pila, reserva y liberación de memoria, son los detalles que nos resuelve un compilador.´
Más respuestas en Twitter:
Sí, la manipulación de registros de procesador puede ser interesante la primera vez que la aprendemos, pero después de horas y horas de trabajo, y con fechas de entrega para mañana, puede volverse no sólo aburrida, sino también problemática. Es por eso que hubo motivación para crear assemblers, macro assemblers, lenguajes de alto nivel y compiladores para los mismos.
En mi tweet de arriba, mencion la inteligencia artificial. Bien, debo admitir que es sólo una idea, pero pienso que la generación de código es un campo apropiado para la inteligencia artificial aplicada, que es un término demasiado amplio hoy en día. Daría para otro post en detalle.
Otra pregunta:
Bien, es difícil que en corto y mediano plazo consigamos generar todo desde un modelo. Lo que más afecta: hay muchas tecnologías y cada año aparece un nuevo muchacho en elbarrio (Scala, Clojure, Rest, Cloud Computing, Sharding, aplicaciones móviles… etc…). Entonces, no hay una sola forma de generar software, siempre habrá trabajo para estudiar y aplicar nuevas tecnologías. Pero veo que en cada una de esas tecnologías, hay lugar para aplicar la generación de código, y si partimos de un modelo de alto nivel, el pasaje de una tecnología a otra debe ser menos traumático.
Estoy de acuerdo. Pero déjenme soñar: aplicaciones creando aplicaciones… No podríamos generar en el futuro ese tipo de aplicaciones? … Por lo menos para cuando lleguemos a la Enterprise de Star Trek :-)
Generanción de código: sky is the limit (es la frase directrix de AjGenesis… :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Sigo con la costumbre coleccionar enlaces, de distintos temas. Los que me llamaron la atención:
PHP
Es el lenguaje más usado para el desarrollo de sitios dinámicos en la web. Tiene la simplicidad necesaria, y también el soporte de clases, librerías, acceso a base de datos como para hacerlo más poderoso. Tal vez se ha quedado en el desarrollo web, perdiendo en el terreno de programas de consola, servicios, o de ventanas. Hay montañas de código de ejemplo para estudiar y aprender. Algunos enlaces:
PHP programming tips and tricks Code Purity
Scripts Directory of PHP, ASP, ASP.NET, Java, Javascript, Perl and more! – Scripts
43 Must Read PHP Articles and Resources Hi, I'm Grace Smith
How To Create Your Own Stats Program (JavaScript, AJAX, PHP) Noupe
25 Resources to Get You Started with PHP from Scratch - Nettuts+
15 Wonderfully Creative Uses for PHP
Hay cantidad de sitios manejadores de contenidos (CMS) pueden ver
10 New PHP Content Management Systems(CMS)
http://php.opensourcecms.com/
Para un rápido Altas, bajas y modicaciones ver AjaxCRUD.com - Use PHP & AJAX to CRUD from a mysql database (create / read / update / delete)
No creo que alguien pueda pasar fácilmente de PHP a ASP.NET pero pueden leer Move from PHP to ASP.NET
Tiene sus años, pero es interesante Understanding MVC in PHP - O'Reilly Media
Un armador de proyectos, a la Apache Ant, pero en PHP: Phing
Comenzando con Joomla Beginners - Joomla! Documentation
Veo implementando el Template Attribute Language en PHP: http://phptal.org/
DEBEN VER PHPCamp: learn something new everyday
Para perderse en enlaces, http://delicious.com/ajlopez/php
.NET
Para los que quieren ver manejadores de contenido (CMS) en ASP.NET:
http://aspx.opensourcecms.com/
El área de código abierto de .NET está bien activo: Open Source .NET projects
Para estudiar: Expert to Expert- Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) Going
Un ejemplo de referencia FabrikamShipping – Home con Geneva Framework, autenticación federada y tutti li fiocci.
Un camino a explorar: reemplazar ORM (Object Relational Mapping) en runtime por generación de código: .NET ORM, Object Relational Mapping for .NET Telerik
Librería para Twitter http://tweetsharp.com/
ASP.NET MVC 1.0 ejecutando en Mono shaml-architecture - Google Code Basado en s#arp-architecture
Para mapear objetos http://automapper.codeplex.com/ (menos para el bueno de Rodolfo Finochietti que prefiere hacerse su propio mapeador :-)
Siempre es molesto el DataBinding a propiedades simples, habría que ver qué tal funciona http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx (nested property binding)
Más de todo esto en http://delicious.com/ajlopez/dotnet
Generación de código
El proyecto Sculpture está muy bien armado, aunque focalizado en .NET http://sculpture.codeplex.com/ Es open source, se trasladó a la empresa:
http://www.dawliasoft.com/
Tienen una implementación de referencia: VotingManager.zip que partiendo de 55 líneas, consiguen generar una aplicación de 4111 líneas. Bueno, nada que el AjGenesis no pueda hacer… :-) … pero es más bonito.
Hibernate Class Generation Using hbm2java - O'Reilly Media Estoy reviendo esto, quiero comenzar a usar el tag <meta> para usar hibernate.cfg.xml y archivos .hbm.xml para alimentar como modelo a AjGenesis.
Para estudiar dos “approachs” Angle Bracket Percent - CodeDom vs T4- two approaches to Code Generation
Veo el editor de T4 T4 Editor - tangible T4 Editor plus UML tools
Desde AjGenesis puedo leer el archivo .dbml de Linq2Sql, que se puede generar desde la línea de comando con SqlMetal, tengo que estudiar Oleg Sych - » T4 Toolbox- LINQ to SQL classes generator
Yo tenía esta idea, pero la deseché por ser algo “convoluted”, pero es interesante: Using ASP.Net for Code Generation . En su tiempo, usé también PHP como lenguaje de generación, pero me gustó tener un lenguaje dedicado a generación con objetos dinámicos (AjBasic) con acceso a un framework de base (.NET por ahora), cosa que no tiene PHP en principio. Y en cuanto a usar ASP.NET, me obligaba a usar un lenguaje tipado .NET, que me resistía a hacerlo.
Siguiendo con T4, el lenguaje de templates de Visual Studio, a estudiar Angle Bracket Percent - The MVC T4 template is now up on CodePlex, and it does change your code
Parece interesante Sample Fluent NHibernate T4 Templates for Code Generation via LINQ To SQL
Steven Kelly siempre tiene algo interesante sobre DSM (Domain Specific Models) y generación de código. Comenta sobre Code Generation 2009 en Code Generation 2009 round-up
Para los que estén con el framework .NET de Lohtka, CSLA, pueden visitar el
CslaGenerator Google Groups
Ruby es un lenguaje que se presta a la generación de código, ver esto, de hace algunos años, pero a cargo del bueno Jack Herrington, autor de Code Generation in Action (alguien que vió la luz!!! :-) :
Como siempre, más información en http://delicious.com/ajlopez/codegeneration
Lenguajes de Programación
Descubriendo un clásico: Let's Build a Compiler
Un texto corto How does a an interpreter compiler work
Para estudiar Create a Language Compiler for the .NET Framework Using C# usa Reflection.Emit, bien a lo macho… :-)
Hay que escribir intérpretes y compiladores, “compiler generators are for sissies” :-), pero si quieren, pueden ver The Compiler Generator Coco/R
Más para ver Free Compiler Construction Tools- Lexers, Parser Generators, Optimizers (thefreecountry.com) y Basics of Compiler Design (pdf)
Para estudiar:
Michael Feathers on Programming Languages
Synrc Io Language CLR
Io (programming language) - Wikipedia, the free encyclopedia
InfoQ- The Ioke JVM Language- The power of Lisp and Ruby with an intuitive syntax
Ending the Era of Patronizing Language Design
Un volver a vivir:
History of the BASIC family of languages
Otro para el canal “Volver”, entorno de desarrollo xBase:
Xailer - El entorno de desarrollo definitivo en xbase
Free Pascal compilers and Pascal Programming - Freebyte's Guide to
Se acuerdan de MUMPS? MUMPS - Wikipedia, the free encyclopedia
Para leer APL, COBOL, & Dijkstra Paul Murphy ZDNet.com
Podría volver a estudiar: COBOL Programming Course, The COBOL Programming Language
Lista para buscar recursos Free Programming Tools, free compilers, free software components and
Excelente contenido Google Code University Programming Languages
Hay que ir viendo:
Clojure ver InfoQ- Rich Hickey on Clojure's Features and Implementation
Scala
Yo sigo trabajando en reimplementar las ideas de Clojure en C#, lo llamaba AjClojure, pero Rick Hickey (el creador de Clojure) me pidió que le cambiara el nombre (al fin tengo evidencia de que alguien lee mi Twitter!!! :-) Así, que en un rapto de imaginación, se llama AjSharpure. Pueden ir viendo mis avances en:
http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure
Más para ver sobre los lenguajes que me interesan en:
http://delicious.com/ajlopez/programminglanguages
http://delicious.com/ajlopez/smalltalk
http://delicious.com/ajlopez/logo
http://delicious.com/ajlopez/scala
http://delicious.com/ajlopez/lisp
http://delicious.com/ajlopez/forth
http://delicious.com/ajlopez/haskell
http://delicious.com/ajlopez/python
http://delicious.com/ajlopez/ruby
http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/cobol
MVPs
El bueno de Rodolfo Finochietti fue nombrado Microsoft MVP por segundo año consecutivo. Felicitaciones @rodolfof! MVP for another year. También felicitaciones para el pibe Woloski, que renovó el nombramiento.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Estuve trabajando, como un spike dentro del proyecto Medusa, para reproducir el ejemplo ASP.NET que viene descripto en el Mere Mortals Framework Developer's Guide, que usa la base de datos MS SQL Northwind. Lo escribí usando VB.NET como lenguaje (en la guía de Mere Mortals, que pueden bajar del sitio del framework, se describe también en C#).
El sitio del framework es
Oak Leaf Products
Pueden bajar la guía de:
DOWNLOAD the MM .NET Developer's Guide
Lo que escribí pueden bajarlo de mi Skydrive:
MMNorthwind.zip
Pueden cargar la solución en VS 2008 (tienen que tener las DLLs del Mere Mortals framework en su máquina).
La página que busca las órdenes de compra por código de cliente es CustomerOrders.aspx:
The first column is a link, that points to OrderEdit.aspx, where you can edit
Si necesitan cambiar la conexión a la base, pueden modificar el web.config:
Diferencias: no estoy usando procedimientos almacenados para todos los Business Objects, como hace el ejemplo original, sólo en los lugares que necesito. Se puso entonces que el tipo de comando asumido a enviar al framework es .Text, en vez de .StoredProcedures. Tampoco puse la misma master page del ejemplo.
En el proyecto Medusa, el equipo está trabajando para mejorar la validación de campos y reglas de negocios, y mensajes de error, generando una aplicación web completa, usando AjGenesis, partiendo de un modelo que nace de la base de datos.
Espero poder escribir y publicar templates y tareas de AjGenesis, para generar algo como el ejemplo de arriba: una aplicación web, pero desde un modelo como el que uso en mis otros ejemplos de AjGenesis. Keep tuned! :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Ya hace unos meses había escrito
Enlaces y noticias - Angel Java Lopez
Noticias y enlaces II - Angel Java Lopez
Vuelvo a la carga con algunos enlaces y noticias, de temas que me interesaron en estos días.
Java
Ya tienen algunos años: Java BluePrints- Guidelines, patterns, and code for end-to-end applications
Protect Your Java Code - Through Obfuscators and Beyond
Un inicio en JavaFX A Taste of JavaFX for the Uninitiated
Sahoo's Blog- Developing Hybrid (OSGi + Java EE) applications in GlassFish
Una interesante y bien presentada aplicación de Java para resolver el puzzle Eternity II Martin Hapl - Eternity II
Quieren generar bytecodes de Java? ASM - Home Page
Distributed Programming in Java
Y video de JBoss Business Rules Management:
Además:
J2ME and Location-Based Services
Maven - Maven in 5 Minutes
An introduction to Maven 2 – JavaWorld
Blog con artículos de Java, JDBC, JSP, JSF The BalusC Code
Encontré esta grilla I N F I N I S P A N - Open Source Data Grids - JBoss Community
Como siempre, más enlaces en http://delicious.com/ajlopez/java
Clojure
Estoy trabajando para entender la implementación de Clojure, escribiendo AjClojure, Pueden ver mis avances en:
Mientras, aperitivos:
InfoQ- Rich Hickey on Clojure's Features and Implementation
Scala
Tengo que estudiar en detalle Scala, algunos enlaces:
Scala as the long term replacement for java/javac?
Home - Parleys - Parleys.com - The Feel of Scala
The busy Java developer's guide to Scala- Class action
Más en http://delicious.com/ajlopez/scala
Bueno, espero que se entretengan…. :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Ayer escribía sobre la popularidad de los lenguajes de programación:
Popularidad de Lenguajes de Programación
Justo ayer, también, @ebersys escribía en Twitter:
El bueno de Eber Irigoyen es miembro activo de Alt.NET hispano:
Vive en Salt Lake city, Utah, visiten su blog:
Que quieres desarrollar hoy?
Yo disiento con eso de “el mejor lenguaje es el que conoces mejor”. Mi contestación en Twitter fue:
Pero de donde puede venir eso de “el mejor lenguaje es el que conoces mejor”? Bueno, como comentaba ayer, hay grupos de lenguajes, y mucho de nosotros, estamos trabajando con .NET o Java o ambos. Son lenguajes de uso general, donde podemos hacer aplicaciones de consola, gráficas, o web. En los dos casos, más que lenguaje, tenemos un framework de clases, y entornos de desarrollo, desde Eclipse hasta Visual Studio. Creo que uno puede pensar que “el lenguaje que conoce es el mejor”, si está en uno de esos dos grupos: programando en Java o en .NET. Son más que lenguajes: son interminables clases y capacidades y plugins y wizards, que nos ayudan a hacer multitud de aplicaciones.
Pero sigo pensando que, si limitamos la pregunta a lenguajes, el mejor lenguaje es el que mejor se adecua a lo que tengo entre manos. Claro que con .NET o con Java, vamos a poder hacer más tipos diferentes de aplicaciones. Pero siempre es importante, si podemos elegir, considerar que hay lenguajes de todo tipo, con énfasis en distintos aspectos de la programación. Por ejemplo, en mi caso, en mi proyecto de generación de código AjGenesis, he elegido desde el principio, adoptar un lenguaje dinámico, no tipado, porque me parece lo más adecuado, flexible, adaptable, a lo que quería hacer (leer Generación de Código, AjGenesis y AjBasic). Y estoy muy contento con la elección.
Por otro lado, si vamos a hacer aplicaciones de empresa, nos baste .NET o Java, y en ese caso, elegiremos, si podemos, “el que conocemos mejor”.
Pero insisto: si vamos a .NET o Java, no vamos a “un lenguaje”, vamos a una tecnología, un framework de clases, y alguna IDE, vamos más allá de elegir un lenguaje. En este caso, destacaría la experiencia de desarrollo que nos dé la IDE que elijamos. En estos casos, tengo que comentar que tanto Eclipse como Visual Studio, son una gran ayuda a la hora del desarrollo. En mi opinión, Eclipse es demasiado “todo es un plugin”, cosa que en Visual Studio todo viene más armado y coordinado desde el principio. (Hace un tiempo que no veo NetBeans: cuando lo veía, me parecía que era mucha “bajada de línea” de Sun, donde se soportaba sólo lo que a Sun le importaba. Si le importaba JSF, desaparecía del mapa JSP y así.)
Entonces, uno podría pensar que la mejor herramienta es la IDE, el framework, la tecnología. Pero acá debo alzar la mano, y recordar una escena de Rambo II. Rambo sale de la cárcel, y vuelve a la selva, a rescatar a su antiguo jefe y entrenador, que ha sido capturado por el enemigo. En un campamento amigo, un agente especial le muestra un galpón, lleno de armas: orgulloso, le presenta a Rambo una tras otra arma, una más sofisticada y poderosa que la otra. Rambo no parece impresionarse, y pronuncia la frase, lapidaria: “La mejor arma es una mente despierta”.
Lo mismo digo: parafraseando a Rambo, “la mejor herramienta es una mente despierta”. No hay IDE, lenguaje, tecnología, plataforma, framework, que sustituya lo que tenemos entre las orejas. Si como desarrolladores no pensamos, no meditamos en lo que hacemos, por qué lo hacemos, qué necesitamos lograr, y solamente programamos de tal forma, porque está de moda, o está en los libros, o usamos tal framework, sin entenderlo cabalmente, sin ver cuál es el problema que resuelve, y lo vemos como una panacea o “silver bullit”, si en vez de pensar, digo, nos embarcamos ciegamente en el desarrollo, no hay IDE que nos ayude. Lo que Salamanca non da, natura non presta. Lo que no pensemos, no lo va a solucionar la IDE, ni el lenguaje.
Si uno piensa, puede llegar a ser productivo hasta en Assembler… :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Me temo que AjLisp y AjBasic lo usamos yo y nadie más… snif… :-). Pero hay lenguajes más populares que esos. Ya es clásica la lista de TIOBE Software:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
donde aparece Java como el lenguaje más popular, lo que no me asombra. Pero sí me llama la atención la popularidad de C y C++, que deben tener su gran uso en el ambiente Unix, Linux, y otros. Como cuarto, encuentro hoy, Julio de 2009, a PHP, que lo entiendo: la mayor parte del código de sitios dinámicos está en PHP, lejos quedaron los años del predominio del venerable Perl. Y recién en sexto y séptimo lugar, está Visual Basic (parece que agrupan el de .NET y el clásico), y C#. Vean que al final de la lista, aparecen lenguajes con mínimos porcentajes, pero aparecen: RPG, Pascal, Abap, Lisp/Scheme. Más abajo, en la misma página encontraran la lista de posición 21 a 50, donde aparecen COBOL, Objective-C, Fortran, Logo, Prolog, Ada (todavía anda por ahí? :-), Scala, Erlang…. y esta es la lista de 51 a 100:
ABC, AD, Algol, Alpha, Applescript, Beta, Boo, C shell, cg, Clean, Cobra, cT, Curl, Dylan, Eiffel, Euphoria, Factor, Fan, Icon, IDL, Inform, Io, Lingo, MAD, Magic, Maple, Mathematica, MAX/MSP, MOO, MUMPS, Natural, Oberon, Occam, Oz, PL/I, Postscript, PowerBuilder, Progress, Q, R, Revolution, REXX, S-lang, SIGNAL, SPSS, SuperCollider, VBScript, Verilog, VHDL, XSLT
Notable lista, recomendaría tantos lenguajes de esa lista, simplemente para aprender nuevas formas de programar (notable que aparezca todavía MUMPS, REXX, tendría que ver con más detalle a Io). Esta lista de popularidad se basa en el examen de búsquedas en Google, hace un tiempo pasaron a agregar MSN y Yahoo.
Pero en estos días, encontré otra página:
http://langpop.com/
con información de ranking de popularidad, pero con agrupadas con distintas fuentes, como Yahoo Search, search en Google Code, Freshmeat, Craiglist, Amazon.
En lo que veo hoy ahí, julio de 2009, según Yahoo Search C es más popular que Java. Pero para Craiglist, primero PHP, segundo SQL (!!!), en Amazon ganan C, C++ y C#, por encima de Java. Y así, noto dispersión de los resultados, dependiendo de la fuente.
La popularidad de un lenguaje importa. No tanto para entender el lenguaje (muchos lenguajes “boutique” tienen interesantes conceptos, a estudiar con detalle), sino para tener una idea de qué tecnología ha sido adoptada por la comunidad, pero habría que ver más allá: por qué la eligieron, y en qué tipo de proyectos. Dudo que haya muchas aplicaciones desktop, en PHP.
Resumen: gran cantidad de lenguajes, hay lenguajes viejos, desde COBOL y Smalltalk, y más “nuevos” como Boo, Ruby, Python. Y `cuatros grandes grupos: Java, C/C++, lenguajes .NET (VB.NET, C#), PHP, como claros grupos líderes.
Pienso que, como desarrolladores de software, debemos tener contacto con esos cuatro grupos, y además, con alguno de los “otros”, para aprender otras ideas y formas de programar.
No me enojo si intentan ver AjLisp o AjBasic… :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
En el Proyecto Medusa, donde estoy trabajando, se está reimplementando en .NET un sistema de salud, que originariamente estaba escrito en Clipper. Es un sistema bastante grande, que tiene varios casos de uso, desde temas administrativos y contables, hasta turnos, farmacia, stock de medicamentos, cocina para dietas, y seguimiento de pacientes.
Recuerdo que en los ochenta, me topé con DBase II, en varios sistemas operativos, el venerable intérprete, y más adelante, a fines de los ochenta, me encontré con la sorpresa de un compilador, el Clipper de Nantucket, para DOS. Otros recordaran al Fox, que luego, al ser adquirido por Microsoft, pasó a Windows como Visual Fox (no recuerdo si primero Fulton y cía pasaron su producto a Windows y luego Microsoft lo compró, o si primero pasó Fox de DOS a Microsoft, y ahí lo portaron a Windows).
Para los que quieran recordar cómo era el lenguaje, encontré estos enlaces:
CA-Clipper 5.3 . Guide To CA-Clipper – Menu
Clipper (programming language) - Wikipedia, the free encyclopedia
Hay ejemplos con código en:
The Oasis Clipper Source. Over 300,000,000,000 bytes served!
Preguntas frecuentes sobre Clipper y sus sucesores en:
Frequently Asked Questions (FAQ 2.31) about CA-Clipper and CA-Visual Objects
Como comentaba un miembro del equipo Medusa, Clipper mientras fue de Nantucket, se mantuvo actualizado, cuando lo compró Computer Associates, entró en un derrape del que no se recuperó.
Si todavía tienen archivos Fox, Clipper, DBase dando vueltas por ahí, pueden probar los productos de:
CodeBase Products Overview
Y parece interesante, con soporte de SQL Server, y de varias plataformas, el Proyecto de código abierto:
Harbour Project
Como lenguaje, Clipper tenía sus “quirks”, como:
- El uso de SET, como SET EXACT OFF, SET EXACT ON, que cambiaban todo al conducta del programa
- El uso de work areas para acceder a datos
- Cosas como MEMVARS, que todavía tengo que recordar que era… :-)
Por mi parte, estoy divirtiéndome escribiendo un intérprete, AjClipper:
Ya tengo dos simples programas corriendo en mi intérprete:
y
? "This is a test"
foo := "Hello"
bar := "World"
? foo, " ", bar
Pueden ejecutarlo con
AjClipper.Console HelloWorld.prg SimpleTest.prg
No será, “Uy, qué bruto, qué programa”, pero va tomando cuerpo. Pueden seguir mi avance en el trunk de AjCodeKatas:
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjClipper
Están escritos los tests (dando verde, por ahora):
Buen Code Coverage:
Cualquier enlace interesante sobre Clipper, bienvenido! Iré agregándolos en http://delicious.com/ajlopez/clipper
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Hace ya un tiempo que vengo pensando en reflotar AjContab:
http://www.ajlopez.com/ajcontab/
Encuentro este mensaje viejo, en la lista de Arquitectura del MUG de Argentina
http://www.mail-archive.com/arquitectura@mug.org.ar/msg00504.html
AjContab es un viejo ejemplo que daba en mis cursos de .NET 1.x, hace unos años. Debería reescribirlo, en ASP.NET 2, VS2008, tal vez ASP.NET MVC? Veré. Pero en estos días habia tweeteado:
http://twitter.com/ajlopez/status/2258288758
La idea es tener:
- Múltiples Tenants
- Múltiples Empresas
- Múltiples Planes de Cuenta por Empresa
- Múltiples Ejercicios
- Usuarios y Roles
- Minutas/Asientos
- Reportes como Balance, Libro Diario, Libro Mayor
Al escribirlo en PHP/MySql, podría colocarlo fácilmente en línea. Me serviría como ejercicio de repaso de PHP, y comenzaría a tener un proyecto con Ajax, Javascript, JQuery quizás? Trataría de codificarlo liviano, para no ponerle demasiada arquitectura o parafernalia al principio. En todo caso, eso lo dejaría para la versión .NET o Java.
Será interesante ver cómo los usuarios reciben la idea de tener un sistema así en la web. En el Proyecto Medusa (que mencioné hace poco, en Generación de código con AjGenesis para Mere Mortals Framework), está incluido el desarrollo de un sistema contable en web. AjContab me serviría para afilar las uñas en el tema de poner este tipo de aplicaciones andando.
En cuanto tenga algo publicado, escribo por acá. Keep tuned! :-)
Sugerencias? Bienvenidas!
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Ayer, gracias a un tweet de @chillicoder, me enteré de la aparición del primer número de la revista de la gente de Pragmatic Programmer:
http://www.pragprog.com/magazines
Les recomiendo bajarse la edición actual, de Julio. Yo la bajé desde esa página en formato PDF, pero también está disponible para otros formatos (notablemente, para Kindle). Esta edición no tiene desperdicio.
Encuentro una editorial y artículo de Michael Swaine, un buen reencuentro con este autor, que debo estar leyendo desde que escribía en la Dr. Dobb’s.
Leo un artículo donde explican su posición para poner a disposición este material, sin restricciones, y sobre cómo lo producen, en formato PDF (usando iText). Cada artículo tiene enlaces al final, sobre los temas y productos mencionados. Es bueno ver cómo uno de los primeros artículos explica cómo producen la propia revista y otros materiales. Es parte de lo ágil: explicar, dejar algo, que sirva para que las buenas prácticas o cosas aprendidas, puedan difundirse más allá del equipo que lo usa.
Hay un artículo de Andy Lester (programador desde hace 20 años, visitar su blog http://www.theworkinggeek.com/), sobre “The layoffs are coming”, donde explica tips para conseguir trabajo, o mantenerse en el mismo. En un mundo cambiante y en crisis, vemos que también el programador americano promedio se ve afectado.
Michael Swaine entrevista a Rick Hickey (que creó Clojure, un dialecto muy popular de Lisp, que corre sobre la máquina virtual de Java, que por alguna extraña razón, es más popular que AjLisp… :-). Un artículo sin desperdicio, que tengo que leer en detalle. Pueden visitar http://clojure.org/ y he coleccionado enlaces que me parecieron interesantes en http://delicious.com/ajlopez/clojure. (bueno, vería también http://delicious.com/ajlopez/lisp y http://delicious.com/ajlopez/functionalprogramming si están aburridos un fin de semana…. :-). Esta misma revista incluye un artículo técnico sobre Clojure, sobre su manejo de exceptions.
El bueno de Dave Thomas es entrevistado por Swaine, sobre el proceso de publicación de los libros y revistas, y el mercado de libros electrónicos. Son temas importantes: qué va a pasar con el libro impreso? Hay cambios, y Thomas explica su visión.
Hay un artículo de autor John Shade, sobre Microsoft, Google, y Wolfram Alpha, cómo es la pelea por la arena de los buscadores. Finalmente, hay un calendario de eventos que vienen (me temo que algo centrado en eventos de EE.UU.)
Y si alguien todavía no lo conoce, les recomiendo la visita a todo el sitio
http://www.pragprog.com
y los blogs de Andy Hunt http://andy.pragprog.com/ y Dave Thomas http://pragdave.pragprog.com/. Tienen videos y podcast, yo prefiero lo escrito: http://www.pragprog.com/articles
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Luego del éxito de Agiles 2008, en Buenos Aires, Argentina, este año se está organizando la nueva edición en Florianápolis, Brasil, para el 6 al 9 de Octubre de 2009. Esta es la llamada a participar:
Estimado colega,
Qué opinas de formar parte del equipo de expositores que reune nombres como Brian Marick, Diana Larsen, Matt Gelbwaks, Naresh Jain, Dave Nicolette, Alan Cyment, Alexandre Magno, entre otros? El próximo lunes 6 de julio será la última oportunidad para presentar tu propuesta de charla en Ágiles 2009!
Ágiles 2009, a realizarse en Florianópolis, Brasil, es un evento sin fines de lucro, organizado por profesionales entusiastas del tema, unidos por el objetivo de crear un espacio amplio de discusión sobre las metodologías ágiles y su adopción en América Latina.
Como expositor, tendrás acceso libre a la conferencia y otras ventajas que los organizadores están preparando para ti! Puedes proponer una presentación, un tutorial, un reporte de experiencias o un workshop. Accede a http://www.agiles2009.org/es/submissions.php para ver la información que debes proporcionar para presentar tus propuestas.
Esperamos contar contigo en Ágiles 2009!
Comité Organizador
www.agiles2009.org
Tienen más información en español en:
http://www.agiles2009.org/es/index.php
y el programa del congreso en:
http://www.agiles2009.org/es/program.php
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez