Manejando el cambio desde el punto de vista de management.

Si tienes o eres parte de cualquier empresa moderna estos días sabrás que, para mantenerse en el negocio, uno debe adaptarse al mercado, a las nuevas tecnologías y lenguajes que van apareciendo. A veces, incluso cuando no hay ninguna ventaja significativa desde el punto de vista técnico, el cliente es significativamente más receptivo a comprar las cosas que están desarolladas usando la última tecnología, o las últimas técnicas. A veces el client quiere saber si usas SCRUM o desarrollo ágil, incluso cuando no sabe lo que significan.

Eso significa que, de una forma u otra, te ves obligado a evolucionar con la tecnología para adaptarte a los cambios en el mercado, a las nuevas tecnologías que van surgiendo, a nuevas formas de hacer las cosas. Puede que te veas forzado a migrar del escritorio a la "web 2.0" o pasar de un sistema con una base de datos central a un sistema más escalable, con una base de datos distribuida (esté justificado o no, a veces el mercado es muy caprichoso).

Cuando esto pasa, ¿cómo debes manejar ese cambio en tu equipo? ¿Cómo van a tomarselo?

Por supuesto habrá gente que aceptará el cambio gustosa, sin ningún tipo de problemas o que incluso estén deseando cambiar a ese nuevo lenguaje o esa nueva forma de hacer las cosas, pero en la mayor parte de las situaciones vas a encontrar gente que se resiste a dicho cambio y es importante entender las razones que llevan a ese tipo de comportamiento si quieres manejarlo bien.

En primer lugar la gente tiene aversión al cambio (con la excepción de unos pocos). Es decir, la gente tiende a evitar los riesgos, y todo cambio es un riesgo, una modificación del status quo anterior.

En segundo lugar la gente suele tener miedo de DONDE les situarán esos cambios. Miralo de esta forma: un desarrollador de tu equipo siempre se planteará: "si cambiamos al lenguaje xxx, ¿cómo afectará eso a mi trabajo? ¿cómo afectara a mis posibilidades de tener un ascenso? ¿puede poner en riesto mi puesto de trabajo? ¿me van a echar si no me adapto lo suficientmente rápido?. En otras palabras, muy probablemente no conocen el nuevo lenguaje o la nueva tecnología, o al menos no son tan expertos como en la vieja, es normal (en cualquiera) sentir miedo de quedarse anticuados o perder su antigua posición como "expertos" en su area.

Red SOStenible

Red SOStenible

Consideramos imprescindible la retirada de la disposición final primera de la Ley de Economía Sostenible por los siguientes motivos:

1 -Viola los derechos constitucionales en los que se ha de basar un estado democrático en especial la presunción de inocencia, libertad de expresión, privacidad, inviolabilidad domiciliaria, tutela judicial efectiva, libertad de mercado, protección de consumidoras y consumidores, entre otros.

Monet 0.1.0-alfa

First released: Jue, 12/10/2009 - 12:36
Download: Monet-0.1.0a_0.zip
Size: 291.68 KB
md5_file hash: 928c22c15b2c67ed9b6395c5496ae3f3
Last updated: Jue, 12/10/2009 - 12:36

Versión alfa.

Soporte para hooks y servicios, intercepción automática y gestor de plugins.

Monet Plugins Library

Muchos sistemas de plugins están basados en la implementación de interfaces fijos que amplían la definición de un plugin permitiendo realizar una determinada cantidad de operaciones que en cualquier caso siempre es fija, de forma que, por ejemplo si un plugin proporciona un menu se define el interfaz IPluginMenu, si implementa un toolbar la interfaz IPluginToolbar y así sucesivamente para cada una de las funcionalidades que se pretende que un plugin pueda proporcionar.

El enfoque de Monet está orientado a permitir que cada plugin pueda definir servicios, utilizables por otros plugins, en ba

En defensa de los derechos fundamentales en Internet.

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

NOTA: Este manifiesto fue redactado conjuntamente por periodistas, bloggers e internautas, en una maratoniana sesión durante la tarde-noche de ayer. Si estás de acuerdo, difúndelo por todas las vías que puedas.

Usando referencias débiles (weak references)

Introducción

Una referencia débil (weak reference) es un concepto estrechamente unido al de recolector de basura, lo cual significa que solo esta presente en aquellos lenguajes que tienen un recolector de basura.

Para clarificar lo que es una referencia débil primero tenemos que explorar (en términos simples) que es el recolector de basura y los fundamentos en los que se basa para trabajar.

Fundamentos del recolector de basura

Los lenguajes imperativos tradicionales siempre han tenido que manejar manualmente la memoria de los tipos por referencia. De esta forma, cada vez que deseabamos obtener una nueva instancia de una clase o una estructura en memoria necesitabamos crearla reservando la memoria necesaria, memoria que quedaba reservada en el heap.

En ese momento la memoria quedaba marcada como usada, de forma que cuando pidieramos otro "trozo" de memoria no obtuvieramos la misma dirección.

Evidentemente, en algún momento, dejabamos de necesitar ese primer fragmento de memoria, de forma que necesitamos decirle al sistema que esa parte del heap ya no nos es necesaria y por lo tante esta disponible. Esta operación se conoce como "liberar la memoria". Y ese es más o menos el problema que ha estado introduciendo bugs en las aplicaciones durante más de tres decadas. Si se nos olvida liberar esa memoria, entonces nunca se queda libre y por tanto nunca la recuperamos ni podemos usarla de nuevo. Con el tiempo (o con un bucle muy rápido) terminamos consumiendo toda la memoria disponible, lo que nos lleva primero a un impacto en el rendimiento de la aplicación y finalmente a que la aplicación se cierre por falta de memoria.

UAC y Windows 7. Microsoft escucha.

Hace no mucho hablaban en kriptópolis sobre un fallo de seguridad en la configuración del UAC en Windows 7 que permitía a cualquier programa malicioso cambiar la configuración del UAC sin avisar al usuario, hasta desactivarlo, y por tanto poner en peligro todo el sistema.

Inicialmente en el blog de desarrollo de Windows 7 se descolgaron diciendo que:

Microsoft’s position that the reports about UAC do not constitute a vulnerability is because the reports have not shown a way for malware to get onto the machine in the first place without express consent

que traducido viene a ser que eso no es una vulnerabilidad porque los informes no han mostrado aún una forma de infiltrar malware en una máquina si que se le de consentimiento expreso... lo cual, a decir verdad, nos sonaba a todos como excusa barata.

Por suerte, en un movimiento tardío pero en mi opinión muy acertado, tras recibir bastantes feedback negativos, parece que se han echado atrás y han decidido que, efectivamente, constituye una vulnerabilidad:

we are going to deliver two changes to the Release Candidate that we’ll all see. First, the UAC control panel will run in a high integrity process, which requires elevation. That was already in the works before this discussion and doing this prevents all the mechanics around SendKeys and the like from working. Second, changing the level of the UAC will also prompt for confirmation.

Es decir, en primer lugar el UAC apartir de la release candidate pasará a ejecutar como un proceso de alta integridad, lo cual significa que no se puede atacar con procedimientos comunes (como el SendKeys que permite mandar pulsaciones de teclado a la aplicación) y por otro, TODA acción sobre el UAC que requerirá una elevación de privilegios.

Es sin duda una noticia excelente, por un lado por el fallo de seguridad que, en efecto, consituía el tipo de funcionamiento anterior, y por otro por comprobar que la gente de Microsoft, responde y tiene muy encuenta los comentarios que recibe de sus usuarios.

Test Driven Development (actualización)

Veréis, llevo leyendo el blog de Joel Spolsky cerca de dos años ya, y siempre he considerado que cada opinión suya tiene un enorme valor. Podría decir que cada vez que el habla, yo asiento.

Si escribes un artículo criticando el Desarrollo dirigindo por las pruebas, que es una de las metodologías con más "buzz"1 del momento, esperas que un montón de gente no este de acuerdo o sencillamente piensen que te has vuelto loco... a fin de cuentas el "Test Driven Development" "mola" ¿no?

Dicho esto, cuando Joel y Jeff Atwood hablan de esas cuestiones y básicamente confirman lo que has dicho... bueno, debo decir que me siento halagado. Principalmente porque esos dos tienen un enorme impacto en internet, en segundo lugar porque normalmente coincido totalmente con ellos, y en tercer lugar... bueno, porque está bien tener razón... o por lo menos que la gente "popular" piense lo mismo que tu.

Respecto a lo que dicen (es una transcripción de uno de sus podcasts), bueno, ¿que puedo decir? Solo una pequeña cosa, al final Jeff dice:

...porque lo que importa es lo que entregas al cliente, y como de satisfecho está el cliente con lo que le has entregado. Hay muchas, muchas maneras de llegar ahí.

Bueno, eso es cierto pero, ¿qué tiene que ver con lo que estamos hablando? Todas las metodologías se diseñan teniendo eso en cuenta, todo el mundo quiere entregar un producto excepcional al cliente; bueno, de hecho todo el mundo quiere hacer dinero entregándole ese producto excepcional. Así que claro que hay muchas formas, de lo que hablamos es de elegir la mejor manera de hacerlo, eso es lo que las metodologías proporcionan, una forma de hacer las cosas, una estructura sobre como trabajar.

Al final, las metodologías son solo una parte de la ecuación. Otras partes includen el sentido común para adaptarse a cada situación, el conjunto de herramientas adecuadas y, principalmente, la gente que trabaja en el proyecto. De esa forma, no estoy diciendo que hacer pruebas unitarias es malo, todo lo contrario, hacerlas para todo es lo que es malo. ¿Por qué? Porque fallamos en utilizar nuestro sentid común para decirnos que debe ser probado y qué no necesita serlo.

Y ese es básicamente el problema con el Desarrollo dirigido por las pruebas, puesto que las pruebas dirigen el desarrollo, tienes que hacerlas para todo lo que necesita ser desarrollado, o de otra forma no "dirigirán"...

  1. 1. Buzz es un término ingles que informalmente significa cierta excitación ("a sense of excitement")

Atributos en .NET

.NET incorpora el concepto de Atributo qué, junto con lo mecanismos de .NET Reflection como iremos viendo en esta serie de artículos nos va a permitir añadir una enorme flexibilidad a nuestros programas.

Los atributos nos permiten la definición de metadatos asociados al código y su posterior lectura y uso para dar forma a nuestros programas. En la siguiente serie de artículos vamos a ver como podemos crearlos y utilizarlos así como los patrones de diseño que podemos utilizar con ellos.

El primer artículo va a consistir en una introducción a los atributos y a la forma de crearlos y declararlos.

En el segundo artículo veremos como leer dichos atributos usando .NET reflection y como obtener la informacion relevante de ellos, adaptando el comportamiento de nuestro código a lo que esté definido.

En un tercer artículo veremos en detalle algunos de los atributos que proporciona el propio framework de .NET, como funcionan y para que podemos utilizarlos.

Por último daremos una introducción a la programación orientada a aspectos y su implementación mediante .NET así como a algunos conceptos de uso de atributos algo más avanzados.

Tutorial de SQL. SELECT Parte II

Introducción

En el artículo anterior vimos el uso más básico de la clausula SELECT de SQL, sin embargo apenas arañamos la superficie en cuanto a la cantidad de tipos de selecciones que podemos hacer.

En este segundo artículo vamos a explorar las posibilidades de los comandos de conjunto que nos permiten realizar operaciones sobre las filas que devolvemos (como devolver una suma, o el número de filas) así como el uso de la orden GROUP BY que está íntimamente relacionado con lo anterior. Por otro lado exploraremos las intersecciones que se pueden realizar entre consultas (JOIN).

Funcions de conjunto y Group By

Las funciones de conjunto (aggregate functions en inglés) son una serie de funciones aplicables a cada columna devuelta por un SELECT que nos permiten realizar determinadas acciones sobre ellas. Ejemplo de dichas funciones son obtener la media de una columna, obtener el número de columnas devueltas u obtener el valor máximo de entre los resultados de una columna.

La sintaxis genérica podríamos definirla así

SELECT func1(col1), func2(col2), col3 FROM Tabla WHERE Condicion GROUP BY col3

Como vemos el uso de las funciones de conjunto va asociado al uso de la palabra GROUP BY. Más adelante veremos algunos usos de esta palabra reservada, de momento vamos a ver algunos ejemplos:

  • Count: Probablemente la función de agrupación más usada, devuelve el número de ocurrencias de la columna en cuestión.

SELECT Count(*) FROM Personas;

Nos devolverá el número de filas que hay en la tabla Personas, es completamente equivalente a, por ejemplo