Bill Gates | Fotografía cortesía de El comercio
Que tal a todos, gracias por seguir leyendo este blog. Pues soy un usuario común y corriente que trabaja con alguna versión de Windows (desde la versión 3.11 hasta la actualidad con Windows 7), yo se que muchos no van a concordar conmigo pero al menos por experiencia personal puedo decir que en más (mucho más en realidad) de una ocasión se siente uno frustrado por usar este sistema operativo y las respectivas aplicaciones que son desarrolladas por la empresa tras el mismo. Suspiro y de no ser porque deveras lo necesito ya habría formateado mi PC y hubiera instalado otro, pero no, hay que seguir, suspiro y sigo trabajando.
Si, he reemplazado la mayoría de las aplicaciones Microsoft por otras pero hay algunas donde no nos queda más remedio que tener que usarlas. Tal vez no es gran cosa y dirán que solo son un quejumbroso, que Windows/sus aplicaciones no falla, que Windows esto, que Windows lo otro... Igual y si, pero, "¿porqué no le preguntamos lo mismo a Bill Gates?".
Visito diversos blogs, foros y sitios web con regularidad pues son informático y me gusta estar al tanto de las novedades del medio (osea la informática), esta noticia ya tiene algún tiempo pero no había dado con ella. Me pareció graciosa y me siento identificado con lo que sucede en ella, es por ello que la comparto y aprovecho para hacer una reflexión para aquellos que somos programadores de sistemas porque sobre nosotros recae mucha responsabilidad muchas veces.
En el blog de "NEOTEO" podemos encontrar el artículo "El correo electrónico de un furioso Bill Gates por Movie Maker (2003)" , en el se narra la experiencia de Bill Gates (en ese entonces al frente de la empresa Microsoft, hoy en día retirado de la misma) al querer instalar Movie Maker allá en el año 2003. Haciendo un poquito de historia Movie Maker fue un programa con el que Microsoft plantó cara a otros programas de edición de videos, al ser gratis no podemos exigir tampoco mucho, pero honestamente creo que se quedaba corto para cosas más avanzadas, siendo más un programa "rápido" para editar alguno que otro video y compartirlo, nada mal.
Honestamente no recuerdo si venía preinstalado en Windows XP, pero suponiendo que no; esto explicaría porque Bill Gates trató de instalarlo desde la red y la gran frustración que se llevo. Todo esto queda relatado en un correo interno que diriguió a sus subordinados en aquel entonces y que ahora conocemos al revelarse el contenido de ese correo. Por cierto, pueden leerlo en formato PDF desde https://blog.seattlepi.com/microsoft/files/library/2003Jangatesmoviemaker.pdf y en el blog de NEOTEO ver su respectiva traducción al idioma Español.
Todo comienza cuando Gates busca el programa Movie Maker en la sección de descargas de microsoft.com, resultado infructuosos sus interntos pues el programa no aparece por ninguna parte, además de ser excesivamente lento el proceso de búsqueda en el portal con varios errores en el proceso. La idea era que apareciera algo así en pantalla, pero nada (captura de pantalla actual).
Tras varios intentos fallidos terminó pidiendo ayuda a uno de sus empleados (Amir Majidimeh) quien le responde que debe escribir "movie maker" y no "moviemaker" en el buscador (¡válgame!), bueno, ahora si ya encuentra su programa y trata de descargarlo y entonces se presenta otro problema: No se puede descargar directamente, hay que ir a Windows Update y buscar ahí y descargarlo desde esa fuente.
Ya se podrán imaginar a Gates perdiendo la paciencia, pero hace lo que le pide el portal, su software se descarga, se instala y ahora debe "reiniciar" (no pregunten porque, cosas de Microsoft), ok, reinicia el pobre hombre ya llevando mucho tiempo entre buscar Movie Maker (tuvo que ir a un sitio externo porque en la sección de descargas de Microsoft pues siemplemente no hay eso, una descarga directa), descargar e instalar y ¡sorpresa!, Movie Maker no está instalado por ninguna parte.
Bueno, la tragedia continua si leen el artículo original, pero hasta aquí vamos a dejar para hacer una reflexión, esperando todos haber aprendido algo de esto.
Primero:
No podemos tener un portal "lento" para ofrecer una búsqueda al usuario, es cierto que las bases de datos con el paso del tiempo irán creciendo hasta llegar a ser verdaderos gigantes pero también hay métodos para optimizar la búsqueda, siempre indexen todos los campos a usar en una consulta, eso va a agilizar el proceso de búsqueda. Del mismo modo limiten la búsqueda solo a cierta cantidad de resultados y paginen esos resultados. Ejemplo:
Tengo una tabla con 1,319 registro y quiero uno en particular, puesto que ya tengo todos los campos a consultar indexados ejecuto algo como lo siguiente:
SELECT ID, USER FROM seguros_policy_res_test FORCE INDEX (PRIMARY) WHERE TRIM(USER)='ruben'
Y obteniendo efectivamente solo el registro que corresponde a "Ruben" y con el tiempo de ejecución:
Mostrando registros 0 - 0 (1 total, La consulta tardó 0.0014 seg)
Ahora haremos lo mismo pero limitando los resultados a un único registro:
SELECT ID, USER FROM seguros_policy_res2 FORCE INDEX (PRIMARY) WHERE TRIM(USER)='ruben' LIMIT 0, 1
Mostrando registros 0 - 0 (1 total, La consulta tardó 0.0004 seg)
¡Brutal!, el tiempo cae a solo una tercera parte del que necesitaríamos si no hacemos este acotamiento.
Ahora veamos los resultados sin indexar ningún campo, removeré todos los indices creados y veamos la diferencia:
SELECT ID, USER FROM seguros_policy_res_test2 WHERE TRIM(USER)='ruben'
Mostrando registros 0 - 0 (1 total, La consulta tardó 0.0015 seg)
SELECT ID, USER FROM seguros_policy_res_test2 WHERE TRIM(USER)='ruben' LIMIT 0, 1
Mostrando registros 0 - 0 (1 total, La consulta tardó 0.0004 seg)
Sin hacer el acotamiento a un registro y sin aplicar ningún indice vemos que la consulta se retrasa un segundo, no es gran cosa pero multiplen eso por la cantidad de usuarios que pudiera haber en algún momento conectados, los recursos del servidor, etc y entonces el resultado puede ser un servicio lento y frustrante para quienes lo están usando en ese momento. Conclusión: mientras más rápido pueda ejecutarse una consulta, es mejor, si pueden bajarle un segundo a la ejecución, háganlo, sus usuarios se lo van a agradecer.
Hay que aclarar que el ejemplo anterior no es del todo exacto, solo hay una persona ocupando el sistema en ese momento (su servidor), además depende de los recursos en uso en ese momento en la PC donde se ejecutó el experimento, pero eso nos lleva a la conclusión de que debemos optimizar tanto como sea posible nuestras consultas para que al momento de transladar ese sistema de local a real no nos vayamos a encontrar con situaciones incomodantes como las que ya hemos mencionado.
Hay otras técnicas para seguir optimizando nuestras consultas, quizá en otro artículo vaya a retomar esto, pero por lo pronto sería bueno darle un vistazo a nuestros sistemas y asegurarnos que de verdad se encuentren optimizadas nuestras consultas y si hay posibilidades de mejora pues entonces llevarlas a cabo.
Otra observación: podemos encontrar muchos resultados, pero como recomendación personal nunca muestren todos esos resultados a la vez. Mejor dividan esos resultados en páginas, esto hará que la carga del servidor al momento de mostrar los resultados (y enviarlo, sobretodo en conexiones lentas) sea mucho menor.
Segundo:
Nunca den por hecho que el usuario lo sabe todo y siempre va a hacer las cosas tal y como nosotros las hemos pensado. Si hay dos formas de hacer las cosas, una bien y otra mal, ¿cuál creen que es probable que elija el usuario?, exacto, la que está mal y hay que anticiparse a ese hecho (véase "La ley de Murphy"). Había dos formas de formas de buscar Movie Maker en la página de Microsoft: "moviemaker" y "movie maker". Los programadores de Microsoft dieron de alta el producto usando la clave "movie maker" pero nunca pensaron que el usuario podría haber escrito "moviemaker" y por lógica nunca habría resultados. ¿Qué se puede hacer para evitar este problema?.
Mi recomendación es: independientemente del lenguaje de programación que estemos usando, al momento de captar el texto que usuario desea buscar siempre dividirlo en palabras, nunca buscarlo tal cual. Dividirlo en palabras y luego armar una consulta SQL con todas las palabras que el usuario introdujo, luego unir en esa consulta el texto que usuario introdujo (esto para si no hay resultados traer entonces lo que usuario "buscó" como mínimo) y luego armar otra consulta donde se eliminan todos los espacios (que era el caso de "moviemaker"). Esto nos permitirá tener una consulta que abarca más áreas de oportunidad y por ende mayores probabilidades de exito. También si es posible dividan en dos o más partes el texto si notan que no hay espacios entre las palabras, eso hubiera tenido como resultado que "moviemaker" se hubiera dividido en "movie" y "maker" dando resultados positivos en el proceso de búsqueda.
Ejemplo:
El usuario ingresa el siguiente texto a buscar: "contaminación del aire".
Descompondremos esto en una consulta que abarque todos los aspectos que ya hemos mencionado antes (conviene previamente eliminar palabras redundantes como el, la , los, etc porque solo añadirán "ruido" a nuestra consulta):
SQL = "SELECT * FROM TABLA WHERE DESCRIPTION LIKE '%contaminación%' OR DESCRIPTION LIKE '%aire%' OR DESCRIPTION LIKE '%contaminacióndelaire%' OR DESCRIPTION LIKE '%contaminaciónaire%'
Esto nos dará como resultado una cadena de búsqueda que contemple la posibilidad de buscar los temas "contaminación" y "aire". Suponiendo que no hubiera un artículo que hablara de "contaminación del aire", pero si de otros tipos de contaminación, entonces al menos le ofreceríamos al usuario un artículo que leer. Claro, todavía queda pendiente ordenar esos resultados por relevancia para ofrecerle en primer lugar lo que más se acerque a lo que está buscando, quizá agregando puntos a los resultados, es decir si un resultado coincide con todas las palabras (por ejemplo 3, entonces se le darían 3 puntos), mientras que si solo hay una concordancia entonces solo tendría un punto.
Tercero:
Siempre ofrezcamos al usuario lo que estamos anunciando. Parece siemple pero no lo es, en este caso Gates buscó y encontró el software Movie Maker en la sección de descargas de Microsoft, ¿pero porque tenía que ir a Windows Update para descargarlo?, y peor aún, tenía que ir manualmente a ese sitio y buscar el producto por si mismo. ¿No hubiera sido más sencillo poner un botón/enlace que dijera "Descargar" y apuntara directamente al recurso (aunque estuviera en otro servidor)?.
Cuarto:
Los sistemas Microsoft tienen la manía de tener que reiniciar para todo, pero ¿porqué tener que reiniciar por cualquier cosa?, ¿de verdad es necesario?, ¿afecta a algún componente del sistema operativo lo que acabamos de instalar como para justificar el reinicio del mismo?. Movie Maker es un simple editor de video, no veo como para que "tener que reiniciar".
Además reinciar el equipo implica que el usuario tendrá que guardar todos sus documentos previamente, esperar varios minutos a que reinicie su equipo (y dependerá de los recursos del mismo, haciendo muchas veces esto algo lento al tener que liberar toda la memoria en uso), además es probable que el usuario esté ocupado como para tener que parar varios minutos. En conclusión: si no es necesario reiniciar entonces para que molestar al usuario con esta petición.
Quinto:
Asegurarnos de que nuestros sistemas funcionen antes de ofrecerlos al usuario y siempre estar al pendiente del mismos, siempre revisando posibles errores y liberar los parches necesarios para corregir cualquier desperfecto. Una recomendación personal: las actualizaciones deben ser "opcionales", es decir siempre dejar que el usuario las instale por si mismo y cuando tenga tiempo para ello, no queramos obligarlo a que las instale y de paso reiniciar su sistema. Es muy frustrante no poder seguir trabajando porque "tenemos que instalar una actualización". Tampoco lo obliguen a instalar Java o algún otro complemento, el sistema si es web y trabaja del lado del servidor (ASP, PHP, etc) no necesita para nada de plugins (las páginas web del gobierno Mexicano son famosas por ello y es un verdadero dolor de cabeza tener que usarlas) y si trabaja integrante del lado del usuario eviten al máximo tener que usar una versión especial del navegador web, es muy probable que el usuario no lo use.
Todo puede trabajar sin problemas en nuestra computadora al momento de desarrollar un programa, pero en la PC del usuario la historia puede ser muy diferente. Configuraciones diferentes, hardware defectuoso, permisos del sistema que no consideramos, etc. Y todo ello hacer que el sistema falle, siempre hay que considerar estos factores y probar nuestro sistema en diversos escenarios por si algo sale mal. Creo que ese fue el caso de la computadora de Bill Gates, aparentemente Movie Maker se instaló pero no fue así, ¿qué salió mal?, bueno, ahí los programadores tendrían que averiguarlo.
¿Qué hemos aprendido?
Espero no se hallan aburrido con tantos detalles pero esa no era la intención de este artículo, más bien aprender algo de una anécdota. Creo que nos hemos llevado algo de tarea para pensar y poner en práctica. Siempre hay area de oportunidad y nunca demos por hecho que todo va a estar bien cuando no es así. El usuario siempre puede "meter la pata" y es muy probable que lo haga, así que hay que anticiparse a ello y con ello reducir las posibilidades de que nos estén reportando a cada rato errores en nuestros sistemas. Gracias por leernos, nos vemos en un próximo artículo.