Ir al contenido principal

¿Y si lo reescribimos?

Llevaba varias semanas trabajando en las modificaciones y correcciones del proyecto. Era una herramienta iniciada por un programador que ya no trabajaba en la empresa. Un día simplemente ya no se presentó a trabajar. Por lo que no podíamos contactarlo para que nos explicara las decisiones tomadas o el porqué de ellas. El cliente estaba preocupado porque estábamos ya fuera del tiempo de entrega. Para mí como programador era frustrante tener que corregir ese proyecto, pero no quería que mi frustración me llevara a tomar una decisión equivocada que resultara en tiempo perdido tratando de rehacer algo para lo que ya no había tiempo disponible. "Los menos cambios al código fuente, en el menor tiempo posible..." me decía a mi mismo, esa era la meta.

Ya me había pasado antes, tener esa idea en la cabeza cada que veía el código fuente "¿Y si lo reescribimos? Sería más fácil en lugar de tratar de corregir esto... ¡No, no hay tiempo! Tardaría días para lograr que haga lo que ya hace". Así pasaron semanas, hasta que un día no pude soportar más esa sensación, lo decidí. "Esta semana no habrá avance, será para re-escribir lo que ya está hecho".

erase

Fue un riesgo decidir reescribir, podría haber terminado con algo igual de complejo a lo que tenía o con nuevos errores, además me habría quemado una semana más de desarrollo en algo que se tiraría a la basura. Si de por sí ya estaba atrasado el proyecto (ya me veían feo), una semana tirada sería muy malo. Afortunadamente no fue así. Aunque no lo terminé en una semana; el código fuente se veía más "solido", era fácil de extender. Al cabo de unas semanas ya se podían agregar las nuevas características fácilmente, la interfaz de usuario se veía mejor (eso siempre ayuda a que el usuario aprecie los cambios). Ahora de lo que me arrepentía era de no haberlo reescrito antes, de no haber tomado el riesgo y rescribirlo desde que descubrí que la deuda técnica era mucha, el miedo a perder tiempo me había hecho perder mucho más, sin contar la frustración y estrés que había sentido esas semanas.

Ahora la pregunta que me hago es ¿cuándo es buena idea reescribir? Como para casi todo, la respuesta ahora es: "depende". Quisiera poder contestar la pregunta con algo más preciso; pero aún no he encontrado la fórmula. Como programador, al recibir código fuente de otra persona podemos sentir las ganas de reescribirlo, solo por el síndrome de no inventado aquí. Esto nos puede retrasar un proyecto y costar dinero/esfuerzo sin ningún beneficio; pero otras veces, como lo que me pasó, es algo que puede beneficiar al proyecto. Saber cuándo es buena idea es algo que aún sigo definiendo.

Entender claramente las causas y estimar el impacto es clave para tomar la decisión de reescribir. Una vez tomada la decisión se puede empezar por definir interfaces y realizar la implementación usando (copiando) el código existente (con los ajustes necesarios). Eso evita que reescribas todo a la vez. Una vez teniendo el proyecto corriendo podemos cambiar las implementaciones, dividiéndolas quizás en más componentes reutilizables, etcétera… ese ya es otro tema.

A veces es más fácil reescribir en lugar de tratar de arreglar, otras veces rescribir es caro sin ningún beneficio real. Distinguir es la cuestión. ¿Tienes una idea, sugerencia o pregunta? Envíala a blog@developeando.com.

Comentarios

Entradas más populares de este blog

Bloqueos

Una de las preguntas típicas de las juntas matutinas en los equipos de desarrollo de software es ¿Hay algún bloqueo? Si lo hay, se trata de ver qué es lo que está esperando esa persona y encontrar la forma de que se desbloquee; pero ¿Qué son los bloqueos? Los bloqueos son obstáculos que te impiden realizar o avanzar en tu trabajo. Evitan que puedas seguir progresando en el proyecto.

He notado que es común en las personas con menos experiencia decir que tienen un bloqueo cuando están batallando, debido a su poca experiencia, en la forma de resolver un problema. Han intentado varias formas y se empiezan a quedar sin ideas de como puede ser resuelto el problema o como pueden cumplir con el requerimiento especificado. Al quedarse sin opciones de qué intentar dicen que tienen un bloqueo con la tarea y que a menos que alguien les diga como resolverlo, no se puede avanzar en la tarea.

En personas con más experiencia, ese tipo de bloqueos no ocurren, una persona con experiencia ha visto pro…

Firebird 2.1 UPDATE OR INSERT

Another great feature that I like in Firebird 2.1 is the UPDATE OR INSERT statement. It's a really time saver and it makes the SQL cleaner.

For example suppose I have a products table like the one I use in my last post and an inventory table to store the product stock. Before Firebird 2.1 if I want to set the stock for a product I needed to check if a record for that product_id already exists; if the product_id already exists then I write an update. If not then I write an insert statement. So I ended up with something like this:


IF EXISTS(SELECT * FROM inventory WHERE product_id = :product_id ) THEN
UPDATE
inventory
SET
stock = :stock
WHERE
product_id = :product_id;
ELSE
INSERT INTO inventory
(product_id, stock)
VALUES
(:product_id, :stock);

In this example I only update one field but when I have to update a big table I ended up with a big chunk of code and thinking: "there should be another (better) way to do this".

Fortunately now with Firebird 2.1 there…

Database Mail en MS SQL Server 2005

Configuración de Database Mail en MS SQL Server 2005

Primero se debe de habilitar, ya que por omisión el componente esta deshabilitado, Utilizando el SSMS (SQL Server Management Studio)


Si no esta habilitado aparecerá un mensaje preguntado si lo habilita, después aparece esta ventana donde se pregunta al usuario que es lo desea hacer.


Seleccionamos la primera opción para crear un perfil.


Configuramos el perfil y le agregamos por lo menos una cuenta.


Seleccionamos el perfil como public y default.


Para mandar correo se utiliza el procedimiento msdb.sp_send_dbmail por lo tanto el usuario que intente mandar correo debe de tener permiso para la base de datos msdb.

Referencias:
http://www.sqlservercentral.com/columnists/cBunch/introtodatabasemailinsql2005.asp