Browse by Tags

Divulgacion de informacion: Esta en todos lados
Talvez hallas visto alguna calcomania como esta en la parte trasera de algun auto, y talvez te parecio ingeniosa/divertida/tonta, pero has pensado que es una forma de divulgacion de informacion? La pregunta muy probablemente cambie tu perspectiva sobre esta inocente calcomania en caso de que no lo vieras asi antes. Tristemente en paises de Mexico a sudamerica cada vez es mas comun la extorsion usando secuestros virtuales, que es cuando te llaman por telefono y te dicen que tienen secuestrado a tu hijo (los nombres estan en la calcomania, recuerdas?) y te piden que pagues inmediatamente el rescate, en los casos de secuestro virtual es mentira que tengan a la persona secuestrada, pero utilizan muchas artimañas para hacerte creer que asi es y utilizan el impacto y momento psicologico para aprovecharse de las personas. Este es solo un ejemplo de la manera en que estas personas conducen estas actividades y mi interes no es hablar de eso, sino hacer incapie sobre la divulgacion de informacion y de que esta puede estar en los lugares mas inocentes, si crees que eso no te puede pasar a ti, lamento decirte que eso te hace mas vulnerable.


Que tal esto, has visto algo asi?:


La cantidad de blogs que han sido hackeados por este detallito es demasiado grande, WordPress hace estos sitios demasiado facil de encontrar y es cuestion de usar una de tantas vulnerabilidades que aparecen para este sistema y lograr hacer algun daño

Tambien he visto sistemas en los que usan el numero de empleado para hacer login en las computadoras, el # de empleado es visible cuando la computadora esta bloqueada, y resulta que puedes llamar al help desk de la compañia, dar ese numero con el nombre de la persona y ellos resetean la contraseña y te la dan ahi mismo.

Desafortunadamente no hay reglas establecidas para prevenir el problema de la divulgacion de informacion, mi intencion es simplemente crear mas conciencia sobre el gran problema que esto puede llegar a representar en el desarrollo de software o incluso en tu vida personal. Lo unico que te digo es que este problema esta en todos lados, en tus comentarios, archivos de configuracion, en mostrar al usuario la version de tal o cual componente que uses en tu aplicacion, la misma version de tu app, el # de empleado, etc. aun en esa inocente calcomania.

La seguridad se atravieza en el camino de la usabilidad, y la usabilidad en el camino de la seguridad, es cuestion de analizar un poquito mas lo que exponemos en nuestras aplicaciones y tener cuidado.

No existe un sistema seguro, lo unico que podemos hacer es poner la barra mas alta y aunque no nos guste, la seguridad por obscuridad puede ser nuestro unico amigo algunas veces.
Duct tape programming: El codigo elegante no paga tu sueldo

Finalmente me di el tiempo de terminar este articulo sobre la conversacion de the Duct Tape programmer; antes de continuar con el articulo dedicare el resto de este parrafo para tratar de explicar el termino. La traduccion literal es programador de cinta gris; se usa esta expresion porque la cinta gris es un material muy resistente para uso multiple que se invento durante la segunda guerra mundial, donde se utilizo para reparar equipo militar rapidamente, cualquier cosa desde armas de fuego hasta aviones; hoy en dia se utiliza para reparar muchas cosas.

Este articulo ha provocado mucha polemica en las ultimas semanas en los medios sociales; gran parte de la comunidad bloguera y twittera tomo este articulo de Joel como un ataque a TDD, practicas agiles de desarrollo y desarrollo de software de calidad en general, algo que encaja perfectamente si lo analizas un poquito, estas personas viven de eso, es lo que venden, bloguean y twittean sobre esto todo el tiempo, asi que el post les toco unas fibras sensibles. Estos fanaticos de patrones y practicas han lanzado una campaña agresiva para convencer al mundo que a los programadores de cinta gris no les importa la calidad del software, que su codigo es inmantenible, que carece de todos esos atributos que esperamos del buen software. Estas personas son las mismas que minimizan el "contenido meramente tecnico", se les ve hablar y hablar (o escribir) sobre buenas practicas de desarrollo y quejarse de como todo el mundo siempre lo hace mal, pero nunca o raramente los ves hablar sobre implementaciones de algo remotamente relacionado con codigo, yo opino que la teoria esta bien, pero sin la practica no sirve de nada. Como siempre lo digo, el problema en todo caso, son los extremos.

Desafortunadamente para ellos el primer ejemplo de programacion con cinta gris que salta a la vista es StackOverflow, un sitio que ha sido desarrollado por programadores que abiertamente han aceptado sin problema alguno que usan tecnicas que no son precisamente agiles o dentro de los mas estrictos patrones de desarrollo, al mismo tiempo este sitio se ha mantenido funcionando al 100% y han agregado un sinnumero de caracteristicas desde su inicio hasta la fecha, lo cual me dice que tienen un codigo con cualidades que hace que esto sea posible; estoy seguro que el codigo no es algo que el programador promedio podria entender y seguramente los puristas encontrarian muchas cosas que les resultarian muy desagradables por aqui y por alla, pero es codigo que cumple su funcion, y lo hace excelentemente bien.


Cuando dije esto sobre SO en twitter, algunos no lo creyeron (mostrando incredulidad de que algo tan bueno pudiera estar hecho con cinta gris, pero hay podcasts donde hablan abiertamente sobre como conducen el desarrollo del sitio), alguien por ahi me respondio muy enojado tratando de minimizarlo alegando que era el unico ejemplo real de programacion exitosa usando cinta gris, desafortunadamente para ellos (una vez mas) si vemos el tremendo exito en los productos de Apple ultimamente, vemos programacion con cinta gris por todos lados, Apple es la Reina (o Rey?) de la programacion con cinta gris, especialmente el ecosistema de desarrollo para iPhone, los que han trabajado con el saben de sus grandes limitaciones y obstaculos que hay que sortear para escribir aplicaciones, pero al final, la gente esta feliz con el producto, y eso es lo realmente importante, a la gente no le importa si la arquitectura es una porqueria o si el codigo es horrible; lo dire una vez mas: no importa.

El problema mas grande de los puristas es que cuando te concentras solamente en hacer que cada linea de codigo este dentro de un patron de diseño, es muy facil cruzar las lineas de abuso de ingenieria y olvidarse de lo mas basico, que es el cumplir con tus clientes y terminar tus proyectos, si no lo terminas, no importa que tan bueno sea el codigo, desafortunadamente el codigo elegante no paga tu sueldo, terminar tus proyectos si lo hace.

Creo que el patron de desarrollo que uso mas frecuentemente es "lo que funcione mejor", no tengo miedo de usar programacion procedural, funcional, POO, dinamica, stored procedures o lo que se requiera, lo que me permita sacar adelante mi trabajo (bueno, a excepcion de XML, odio XML) de una forma que me permita siempre extender y/o modificar mis sistemas facilmente en un futuro, pero lo mas importante de todo es que estoy acostumbrado a entregar buenos resultados, siempre, sin excusas, con frecuencia predico una de mis frases favoritas: no es opcional, tiene que funcionar. Quiero aclarar un punto muy importante, soy muy estricto a la hora de escribir codigo, me gusta el codigo elegante, sigo principios SOLID, escribo pruebas unitarias cuando un codigo lo requiere, es solo que no me gusta forzar todo dentro de un patron, y no siempre escribo mis pruebas religiosamente antes que el codigo (ok, de hecho, nunca escribo las pruebas primero). Eso para mi, es el programador de cinta gris, el que sabe cuando abstenerse de la mera aplicacion de patrones y tiene siempre presente la mas importante caracteristica de tu software; el software que cumple y se entrega a tiempo es esa caracteristica, sin esta, no importa lo que hagas, aun si es una obra de arte, no vale un centavo.

Por otro lado, creo que si hay areas donde se puede ser purista y aplicar todos tus (des?)conocimientos, creo los que proyectos de codigo abierto o proyectos personales son ejemplos perfectos para aplicar todo esto, no hay fechas de entrega, no hay compromiso, no hay riesgos, estara listo cuando estara listo.

Cuando los puristas se encuentran acorralados ante las muestras de buenos resultados de la programacion con cinta gris, la salida facil -esto me recuerda como los mismos Agilistas dicen que cuando un proyecto Agil falla es porque no se aplico correctamente- es decir que se requiere gente muy talentosa para sacar adelante algo asi, y claro, nadie dijo que fuera facil, se requiere talento, se requiere leer y entender esos blogs de contenido meramente tecnico, experimentar, jugar, hackear; al final, el desarrollo de software es un problema humano. Yo creo que las metodologias son para compensar la falta de talento, pero ese es tema para otro post.

No hay reglas fijas y estrictas en el desarrollo de software, si fuera asi, este seria demasiado facil.
si no les gusta el termino "programador de cinta gris" pueden pasar a reclamarle a Mario Cornejo :)
La programacion es como un juego de ajedrez
Por mucho tiempo he pensado que el desarrollo de software es como un juego de ajedrez, pero aparentemente nadie ha hecho esta analogia antes, solo basta *bingearlo* para ver que hay exactamente (al tiempo de escribir este post) cero resultados (los mismos resultados en Google), afortunadamente esta situacion esta a punto de revertirse al tiempo que escribo este post y todo mundo vee la luz... o talvez no


Y bien, permitanme explicarles un poco sobre mi analogia

El programador mediocre
Uno podria argumentar que este es el programador promedio, pero eso es otra historia, este hace un movimiento sin pensar en los efectos secundarios, su capacidad de analisis es muy poca, hay tantos efectos secundarios (introducir nuevos bugs, seguridad, etc) pero este jugador ni siquiera esta enterado de ello, basicamente se basa en el debugueador y si corre en su maquina entonces esta listo; cuando las cosas inevitablemente no funcionan en produccion el simplemente hace otro movimiento que parece corregir el problema, este ciclo es frecuentemente repetido, si le das un proyecto grande a este tipo muy seguramente hara un movimiento estupido que resultara en Jaque Mate en el proyecto

El buen programador
Este analiza diferentes rutas y escoge la que cree adecuada, este jugador puede hacer un buen juego, de vez en cuando su analisis falla y comete algunos errores, pero el puede aprender de estos, este tipo normalmente entrega buen software con pocos errores que puede corregir rapidamente sin muchos problemas

El mejor
Genio, Guru o como quieras llamarle, este tipo puede hacer una gran cantidad de movimientos rapidamente, y todo en su cabeza, esta informado siempre de las mas recientes tecnicas para vencer a su oponente, pero no cae en el error de simplemente usarlas en su juego, sino que las prueba primero en sus proyectos privados y una vez que el mismo comprobo que son utiles entonces las usa en proyectos reales, conoce las tecnicas mas rapidas, cortas y que le dan el mayor beneficio, sabe las tecnicas para usar en los proyectos pequeños y las que debe usar en proyectos grandes, y sabe tambien que son muy diferentes, este jugador sabe lo que el oponente esta pensando, sabe como respondera el oponente a cada uno de sus movimientos asi que escoge cuidadosamente el mejor movimiento, este jugador conoce los efectos secundarios; las palabras "funciona en mi maquina" no estan dentro de su vocabulario.

Como podran ver las diferencias principales en mi analogia son la capacidad de analisis (seleccionar el movimiento) y los efectos secundarios (que pasa despues de hacer el movimiento). El oponente es tu proyecto de software, el movimiento es escribir el codigo, los efectos secundarios son todo lo demas que es afectado por este.

Cuando fue la ultima vez que creaste un nuevo bug cuando arreglabas aquel otro o agregabas funcionalidad a tu applicacion? o cuando *ellos* encontraron errores en la aplicacion justo despues de lanzarla a produccion? o cuando funciono en tu maquina pero no en el servidor?

Cada vez que vas a hacer un movimiento, detente un momento y piensa en los efectos secundarios, siempre hay efectos secundarios, si no puedes identificarlos, hay herramientas que te pueden ayudar a pensar, como las pruebas unitarias, y entre mas lo practiques, mejor jugador seras, y eso es una promesa
Como acumular deuda tecnica rapidamente
Leyendo el post de Mario Chavez: Lo importante es que funcione, inmediatamente me recordo la metafora inventada por Ward Cunningham "Deuda tecnica", la cual es descrita en su primer parrafo por Martin Fowler como:
Necesitas agregar una pieza de funcionalidad al sistema. Identificas 2 maneras de hacerlo, una es rapida, pero sucia, y sabes que te hara la vida mas dificil en el futuro. La otra resulta en un diseño limpio, pero te tomaria mas implementarla.
Hay muchos factores por los cuales creo que la mayoria de los desarrolladores escogen la primera ruta de sacarlo rapido, y "despues lo arreglo"; por supuesto que ya sabemos que el luego nunca llega, y a eso es precisamente a lo que se le denomina la deuda tecnica; vamos dejando las cosas para despues, y los sistemas se van enredando mas, el codigo se vuelve mas complejo, y al hacer cambios muchas veces se introducen nuevos errores, por la naturaleza misma de un codigo mal estructurado.

Esta deuda, como tal, se tiene que pagar de alguna manera, y mientras no se pague en su totalidad tendremos que pagar intereses; Mario describe algunos puntos como el costo de usar la metodologia de "solo haz que funcione"
  • Es muy difícil entender el código, posiblemente únicamente la persona que lo desarrolló, es el "puede" tener un entendimiento aceptable.
  • Existe una mayor posibilidad de tener "bugs" extraños y difíciles de duplicar y corregir.
  • El realizarle cambios al programa se vuelve cada vez mas complejo, porque no entendemos hasta que punto esos cambios van a afectar otras áreas de nuestro programa.
  • No hay forma de reproducir situaciones muy particulares que ocurren con nuestro software y si este inter-actua con otro mas, lo mas común es culpar al otro software.
  • Inicialmente quedamos "bien" con el cliente por entregar el software a tiempo, a la larga los errores y fallas de nuestro software nos ponen en una situación no muy buena, y si a esto le agregamos que le cobramos al cliente por arreglar nuestros "errores", pues todavía peor.
Este puntos, entre otros, son referidos en la metafora de la deuda tecnica como el interes que tenemos que pagar haber escogido la ruta facil y hacer que algo funcione sin preocuparnos por tener un codigo limpio.

La metafora se adapta muy apropiadamente al desarrollo de software, estoy completamente seguro que cualquiera que lea esto podra identificar su propia deuda tecnica, yo diria que no es opcional, de una u otra manera todos incurrimos en esta, la diferencia seria simplemente quien se endeuda mas y quien se endeuda menos.

Te resulta dificil hacer cambios al software? Solo hay una persona que puede hacer cambios a "ese" sistema? No entiendes el codigo? Tienes problemas al pasar el codigo a produccion?
Todos esos son sintomas de que estas pagando la deuda tecnica. Pagar los intereses es doloroso porque es trabajo extra que en muchos casos te lleva a endeudarte aun mas.

Una vez que estas en deuda, no hay de otra, hay que pagar, y hay formas de ir pagando, pero mejor aun, hay forma de minimizar la deuda en un principio; ya hablaremos de eso.