Cuando empezamos a hacer proyectos con java similares a los que hacíamos en C++ y con la experiencia de ellos, lo primero que hicimos, porque sabíamos que era un punto muy importnte, fue nuestra propia librería de sockets. Una librería que facilitaba a la gente que tuviera que enviar mensajes el envío de los mismos. La librería se guardaba el mensaje y lo enviaba cuando hubiese conexión. Esta librería aisla a la gente de si los bytes del mensajes se envía todos de golpe o en varios bloques, de si la conexión se rompe o no, etc.
En un momento dado, gente de otro departamento nos pidió un trozo de nuestro proyecto, con el que pensaban comunicarse mediante sockets. Aislamos ese trozo, haciendo un main() aparte, instanciamos nuestra clase de sockets y todo listo en menos de un día de trabajo. Los del otro departamento hicieron su parte de código. Como no tenían librería de sockets, los codificaron con las funciones básicas de sockets que da Visual C++. Luego nos tocó integrar. Una parte importante del tiempo de integración se fue en depurar su código de sockets, recién salido del horno.
Y no hicieron librería de sockets.
Un par de años después, la misma persona del otro departamento viene con la misma necesidad, necesita un trozo de nuestro proyecto -otro distinto- al que se va a conectar con sockets. Nuevamente, en menos de un día preparamos toda nuestra parte. Esa persona, sin embargo, hizo copy-paste del código de sockets del proyecto de hacía dos años y lo puso en su nuevo proyecto. Luego modificó lo que creyó necesario. Y otra vez gran parte de la integración se nos ha ido en depurar otra vez errores similares a los que depuramos hace dos años en su código de sockets. Estos nuevos errores se debían en parte a la modificación del código pegado.
Y siguen sin hacer la librería de sockets.
Una de las pegas del código reutilzable es que no te das cuenta del tiempo que ahorras. Usamos nuestra librería de sockets una y otra vez y nos parece lo más natural del mundo. No piensas en el tiempo que ahorras si tuvieras que codificarla y depurarla cada vez en cada proyecto. Igual que no piensas en el tiempo que ahorras al usar directamente un JTextField o un JButton en vez de codifcártelo tú mismo cada vez -y depurarlo-. Afortunadamente, de vez en cuando pasan estas cosas con gente que trabaja de otra manera, y te das cuenta de la cantidad de tiempo que ahorras habitualmente de forma inconsciente.
Y la gran pega es que el jefe NUNCA se va a dar cuenta de lo útil que es el tiempo que malgastaste al principio de los tiempos, cuando tardaste dos semanas en hacer unos sockets tontos que el del otro departamente hizo en dos días. Tampoco se da cuenta que en el siguiente proyecto tú dedicaste 0 días a los sockets mientras que el del otro departamente nuevamente dedica dos días, y otros dos en el siguiente y otros dos en el siguiente…