Lo que valen los test case

Seguro que más de uno, tras leer esta entrada, decide buscarme y matarme, pero os lo tengo que contar, y supongo que por el título ya habéis adivinado de qué va la cosa: otra diatriba del RFOG.

Ya sabéis que yo no soy muy dado a las formalidades esas de seguir un método de desarrollo como Scrumm o Agile o como quieran llamarse, y que siempre he dicho que los test units no sirven para nada… al menos en mi trabajo.

Bueno, pues ahora le toca el turno a los “test case”… Según yo los entiendo, se trata de pasar una pieza de código más o menos importante y/o completa por una serie de test automatizados (o no) para determinar si los cambios realizados para resolver un problema han roto otra parte.

El concepto es hacer pequeños tests (los units esos) sobre pequeños bloques de código como funciones y demás. Y luego, cuando ya tienes un módulo completo e independiente (sea lo que quiera que signifique eso en tu caso), lo vuelves a verificar como un todo.

Y si has sido bueno y has hecho los deberes, todo debe funcionar perfectísimamente bien y no presentar ningún problema final, y si lo hace, pues vuelves a revisar el código e iteras.

Luego queda un paso final, que es poner delante del monitor (o lo que sea) a alguien y que compruebe a mano que todo va bien.

***

Esa es mi visión de una secuencia de verificación de código, pero en mi caso muchas veces te encuentras con serias limitaciones, como las que os voy a contar, aunque realmente no puedo hacerlo como quisiera porque tiene que ver con mi trabajo y no puedo hablar con mucho detalle sobre él.

El caso es que tenía una secuencia como la descrita que falló estrepitosamente en producción, o más bien que falló en la etapa final de verificación del producto, que es sacarlo a la calle y dejar que los lusers lo revienten, como así ha sido.

Supongamos por un momento que tenemos un algoritmo del que sólo hay una implementación razonable y posible con los recursos disponibles, y que encima dicho algoritmo es la primera vez que se realiza en donde trabajas, por lo que no hay experiencia anterior ni reutilización de código.

Y encima el algoritmo es indivisible, es decir, no se puede dividir en tareas más pequeñas y verificables. Bueno, sí, pero esas partes son triviales y ni siquiera necesitan un unit test por lo de siempre: un qsort va a funcionar y te va a dejar el tema ordenado sí o sí, y todavía va a funcionar mejor si usas de origen ya algún contenedor STL ordenado…

Y es en este caso donde entran a pleno rendimiento todas esas metodologías chachi piruli Juan Pelotilla que tanto bombo y platillo tienen.

Ahora suponed que con esfuerzo uno hace un análisis de lo que va a ser la entrada al algoritmo y descubre que tiene cuatro variaciones sobre otras cuatro, es decir, 16 familias o grupos de datos. Y a mano, hace al menos dos tests para cada una de ellas. Es decir, calcula a mano, para dos entradas de cada familia, qué dos salidas debe haber.

Y lo mete todo en un test por tabla iterativo. Ante cada entrada se procesa ésta y se compara la salida obtenida con la que se debería obtener, y si todo coincide, se pasa a la siguiente.

Aparte se generan entradas aleatorias y se anotan las salidas, y se le aplican todas las comprobaciones heurísticas posibles, como por ejemplo que el total de la entrada debe ser el total de la salida, que si A es cero, B debe ser cero, etc., pero lo que no se puede hacer es tener un código que verifique los datos porque ese código sería exactamente el mismo y no se puede realizar un algoritmo inverso porque el resultado es entrópico: no se puede obtener el origen en base al resultado.

Si recordáis otra entrada similar a ésta, ese proceso sí que se podía verificar ya que el PC tenía artimética de 32 bits pero el origen no, y lo que se tenía que simular era eso: cierta aritmética de 32 bits en un procesador de 8 bits en el que, encima, el compilador hacía cosas mal.

Bueno, volviendo al presente, una vez todos los casos funcionaban bien, y se generaban millones de secuencias sin que aparentemente nada descuadrara, y se revisaran algunas de forma aleatoria, se integró el algoritmo en el equipo de destino y… falló.

***

Tardó dos semanas pero falló. Vuelta al laboratorio. Primero se encontraron errores chorra de otras partes del código que alimentaban a la rutina con datos incorrectos, pero aun así seguía fallando miserablemente en uno de los 16 casos.

Escribirlo es infinitamente más sencillo que encontrarlo. Me refiero a delimitar el problema a una de las 16 familias, pero tras muchas pruebas, muchos análisis de logs, se encontró.

Luego uno miró los test cases y no vio error alguno… excepto que estaban mal. Es decir, la salida que el programa generaba era incorrecta, y como la salida coincidía (recordemos que pese a ser determinista es entrópica, como un compilador) con lo que decía el test, la cosa fue para adelante.

El primer problema es cómo cojones se pudo equivocar uno en eso. Para mí está claro: dislexia. Invertí dos valores de una tabla, que encima coincidían con la salida incorrecta. Una de esas casualidades que uno encuentra en la vida y que piensa que no deberían ocurrir porque son tan improbables… antes de que Murphy haga su aparición, claro.

Pues bien, una vez corregida la tabla, rápidamente se encontró el error… que era bien estúpido. Para que os hagáis una idea, después de una ordenación mediante quicksort (estamos en C embebido), se recorría la ordenación buscando un elemento con una característica concreta, pero la comparación se hacía… sobre la tabla sin ordenar, o más bien sobre el índice de uno de los elementos ordenados pero tomando la tabla de origen como base del índice… En fin.

Aquí entra una de las cosas que me molan mucho: código auto defensivo. En el caso de las otras familias el código no fallaba porque se recuperaba del error anterior debido a las seguridades insertas en él, pero en el caso que nos ocupa se concatenaba una debilidad de la auto defensa con el error y al final el algorrino terminaba fallando.

***

Ya como conclusión me gustaría hacer algunos comentarios. Los tests estaban mal. Si hubieran estado bien el problema se habría detectado inmediatamente, pero el hecho es que sirvieron de poco o de nada.

En el caso que nos ocupa, el algoritmo era bastante complejo y encima se tenían recursos limitadísimos en la máquina de destino, por lo que no se podían hacer grandes implementaciones ni grandes comprobaciones, y de hecho todavía no se está seguro de que se haya solventado por completo. Las verificaciones automáticas siguen ejecutándose todas las noches, con la ventaja de que ahora los fallos terminan en un bucle infinito desde el cual se puede determinar qué falló y por qué.

Pero la advertencia es muy seria, y es la conclusión a la que quiero llegar. Los tests no sirven para nada, o casi para nada. Porque cuando uno los necesita de verdad, nunca puedes estar completamente seguro de que estén bien. De hecho, los propios tests son código, y podría darse, y os aseguro que se da, la situación en la que un error en el código a comprobar, más un error en el código del test producen una salida correcta.

Es evidente que uno puede tener todo el cuidado del mundo en hacerlos, pero nadie está a salvo de equivocarse. Y al menos yo pienso que, si puedes hacer un test del que estés seguro que no va a fallar es porque no lo necesitas, ya que también estás seguro de que el código funciona bien porque es ese mismo código el que te indica la correctitud o no del test.

Y sobre la verificación de parámetros de entrada, en muchos casos es un objetivo irreal. En el caso que nos ocupa, el algoritmo (y nuestros tests) son completamente incapaces (o casi) de verificar que la entrada es incorrecta salvo en los casos más triviales. Y, de nuevo, los tests no sirven para nada.

Con esto no quiero decir que no se deban hacer tests, que se deben hacer, y cuantos más mejor, si no que cuando más útiles deberían ser, menos utilidad tienen, y encima podría decir que se trata de una relación exponencial inversa…

Lo que puede ganar un spammer al día (o cómo mentir con los números)

Leí ayer una entrada de Microsiervos que fue procesada como una curiosidad más sin mayor importancia más que el hecho de que un spammer podría ganar unos 7.000 dólares al día. Mucha pasta me pareció a mi, pero es Microsiervos y supongo que habrán contrastado la noticia (poco después vi la fuente original desde Zite o Flipboard y como ya la había leído antes la ignoré).

Pero hace un rato me llamó la entrada de “Grandes dilemnas de la Web: ¿abrir enlaces en ventana nueva, o no?”, del mismo Microsiervos. Esta sí que la he leído entera y he descubierto que existen más atajos para abrir en una ventana secundaria y que Alvy no ha puesto: el botón central del ratón (por cierto, los que tengáis un Magic Mouse os jodéis, como me jodo yo. Viva la ergonomía Applera). Así se lo he hecho notar en el formulario de contacto, que no me gusta un pelo…

Y de refilón he vuelto a la entrada anterior y me he dado cuenta de un número. Aparte del hecho de que no me gustan las ecuaciones lineales como la mostrada (más que nada porque la vida no es lineal), hay al menos un número (si no todos) que a todas luces no es correcto.

Uno de los factores de la multiplicación es E, que se corresponde con el “número de correos basura que cada ordenador infectado envía cada día”. Y da un valor de 1,7 millones de correos.

En otras palabras, un ordenador infectado envía 70.833 correos a la hora. O 1.180 correos cada minuto. O casi 20 correos cada segundo.

¿Lo veis? ¿Cómo puede un ordenador infectado enviar 20 correos cada segundo? Ni siquiera con múltiples CC. Tengamos en cuenta que el envío de un correo en una red más o menos decente tarda unos 500 ms, o dos correos por segundo en el caso de que los servidores SMTP respondan bien a tal marea de envíos.

Podemos calcularlo de otra forma. A 1KB por correo, supone una subida de 1.7 GB de datos. O 20Kbyte/s, que son unos 200KB/s… ¿A cuántos les sube así su internet?

Pues eso.

Debemos dividir ese número al menos entre 10, con lo que los beneficios son ahora de 700 dólares (y ya pagaría yo por esos 700 dólares/día)…

No obstante hay más inexactitudes. Sin contar la anterior, es el porcentaje de aquellos que deciden comprar tras haber recibido el correo, seguir el enlace y comprar. Es el resultado de multiplicar F por V por B. El valor que nos dan es de aproximadamente un 3.4 por mil de compras. De cada mil mensajes que llegan, la gente compra 3 productos, a 100 dólares el producto.

Desde mi punto de vista, algo completamente irreal.

¿Queréis mi aproximación, basada en un cálculo de servilleta mental?

7 dólares al día. 70 con suerte.

El fanboy rabioso (o la obsolescencia programada de Apple)

Si os pensáis que porque el RFOG se haya hecho fanboy
de MAC va a empezar a hablar bien de esa plataforma estás en un craso, qué digo craso, crasísimo
error. No sólo voy a hablar mal, sino que voy a hablar muy mal.

Hoy le toca a la obsolescencia programada. Todos sabéis lo que es. Eso en Apple no existe. Salvo contadas ocasiones en las que el producto ha salido una pifia (me vienen a las mientes ciertas versiones del iPod), los productos de Apple son muy duraderos, tienen una gran calidad y siempre funcionan como el primer día. Y cuando no es así y tu aparato no cumple con lo esperado, en general Apple suele solucionarte el problema incluso estando fuera de garantía y de Apple Care
siempre y cuando los defectos sean evidentes (vamos, que no te presentes con un MacPro oxidado por el agua del mar y pretendas que te lo cambien por uno nuevo)…

¿Dónde está, pues, la obsolescencia programada de la plataforma Apple?

Pues veámoslo.

***

Lo primero que nos llama la atención es el hecho de que de vez en cuando, y a veces sin un motivo demasiado justificado, hacen borrón y cuenta nueva. Sí, ya sé, ayer decía que eso era una ventaja. Vale. Pero también es un inconveniente, y este caso sólo se jode al usuario, que tiene que comprarse un nuevo equipo porque el viejo se ha quedado obsoleto y ya no funcionan los nuevos programas.

No me refiero a que el equipo se quede viejo por avances de la técnica, me refiero a la obsolescencia programada: simplemente iOS 4.3 no está disponible para un iPod de segunda generación sin haber ninguna justificación…

Otro caso es el de iMovie, que no funciona en un iPad de primera generación cuando los usuarios han demostrado que sí lo hace y que simplemente a Apple no le sale de los cojones permitir la instalación ahí con la excusa del rendimiento.

Recuerdo una de las últimas betas de Xcode 4, justo antes de su versión final. Resulta que se equivocaron y sólo se instalaba en Lion (también en beta). Es decir, Snow Leopard no podía
ejecutar Xcode 4 por algún tipo de esotérica limitación… Unas horas después sacaron una versión que
podía hacerlo. ¿Cuál era, pues, el impedimento? Para mí estuvo claro: Apple quiere que te compres su Lion y abandones el Snow… porque, de nuevo, Lion no se ejecuta en equipos antiguos y así actualizas. Pero resulta que Lion
que se ejecuta (y encima perfectamente) en esos ordenadores (como se ha demostrado
)…

O en otras palabras: he decidido obsoletar ciertos equipos porque sí, porque yo lo valgo, y si quieres el Lion, o el iOS 4.3, o el iMovie, o lo que sea, pasa por caja y actualiza tu equipo. Obsolescencia programada a más no poder.

***

En relación a este tema hay otro que quiero creer es incidental y no hecho exprofeso. Tu iCosa funciona a las mil maravillas. Suave como la seda, cumple su función perfectamente dentro de los límites marcados. Si alguna aplicación da un poco por culo, seguro que pronto sacan una nueva versión con las mejoras pertinentes. Por si no lo sabías, las iCosas (y los MAC también), envían silenciosamente y sin decírselo a nadie a Apple información sobre fallos y otras zarandajas, pero claro, cuando lo hace Microsoft se pone el grito en el cielo, pero cuando lo hace Apple no.

¿Cómo puedes comprobarlo? Instala un firewall
en condiciones y verás cuántos programas de las tripas de un MAC intentan conectarse con Apple. Prácticamente casi todos y prácticamente de forma continua desde que haces login.

Decía que tu iCosa funciona perfectamente. Pero se acerca una keynote
de Apple. Y de repente el aparato empieza a hacer cosas raras
. No me refiero a que deje de funcionar, o se cuelgue, no. Me refiero a que de repente los programas ya no van tan fluidos y hay como ciertos “enganches”. Yo me di cuenta con el iPad. Justo unos días antes de la presentación de su segunda versión, empezó con el baile. Y con él continua.

Claro, claro, eso no aparece como por arte de magia. Aparece cuando actualizas una nueva versión de iOS, o cuando lo conectas al iTunes y lo actualizas. Recuerdo que con mi iPod de segunda generación pasó lo mismo cuando salió la tercera…

Me gustaría pensar que no es intencionado, que simplemente las nuevas mejoras del sistema hacen que este vaya algo peor… aunque sean mejoras. También podría tratarse de fragmentación en el sistema de ficheros o en la memoria, pero si lo restauras y sigue haciéndolo entonces no se debe a eso.

En fin, que sin quedar demostrado del todo, para mi es una causa más. Imaginaos que tenéis la golica
de la nueva versión, que encima te la presentan como la rehostia de mejor, más rápida, más guay del Paraguay y más c00l
, y de repente tu iCosa ya no funciona como antes…

***

¿Por qué son tan cortos los cables USB de las iCosas? ¿Por qué se rompen tan fácilmente? ¿Por qué cada cierto tiempo mueven una pestañita unos milímetros para que las nuevas iCosas no encajen en los cables de las viejas iCosas (caso de los iPad 1 y 2)?

Lo primero se debe a que el cobre está caro… ¿o será a que si el cable es corto sufrirá más tirones y se romperá antes? De lo segundo ni hablemos: es evidente por sí mismo.

Con más morro que nada, cada cierto tiempo, si quieres las nuevas iCosas, tendrás que comprarte los nuevos complementos que sólo se diferencian de los anteriores en la pestañita que ya no engancha bien
, al económico precio de 30 euros un cable que cuesta medio…

***

¿Os habéis preguntado por qué los auriculares de las iCosas son tan incómodos, con esa forma tan grande para unos oídos de tamaño medio? Yo sí. Porque en la tienda venden otros mucho más cómodos… y bastante más caros. Menos mal que el conector es más o menos estándar y siempre puedes usar unos comprados en cualquier sitio. Aquí no aplican el concepto de obsolescencia programada
, sino el de te vendo algo que no puedes usar para que todavía te gastes más dinero, que viene a ser más o menos lo mismo.

***

Esto lo conozco por terceras partes, porque en mi caso no suelo usar muchas aplicaciones diferentes en mis iCosas. El hecho es que hay programas que no funcionan en según qué versiones de iOS, y justo al revés: si quieres tener tal o cual programa, tendrás que mantener una versión obsoleta, con los problemas de seguridad que eso supone. Aunque bueno, casi da igual, ya que los productos de Apple no es que lo sean mucho
.

El mayor problema viene cuando has actualizado por error, o simplemente porque ignoras que tu querido programa es incompatible, y entonces la has jodido bien jodida porque no existe manera documentada para volver hacia atrás en tu iCosa excepto que tengas una copia de seguridad… que, para ser sincero, muy pocos tenemos si no es la que iTunes nos hace por defecto, y ya se encarga él de dejarnos sólo la última…

Bueno… estoooo… ¿existe alguna forma de mantener una copia de seguridad de tus iCosas aparte de la que hace el propio iTunes? De nuevo a pasar por el aro.

En el caso del OS X es algo diferente, y aquí sí, aquí sí que puedes volver hacia atrás cuando quieras… mientras a Apple le salga de las narices mantener otros programas marcados como compatibles con versiones antiguas del sistema operativo que, como ya hemos demostrado más arriba, nada tiene que ver con que funcionen o no…

***

NOTA: aquí
tenéis otra entrada mía relacionada en cierta medida con ésta.

MAC Rationale vs Windows Rationale en el desarrollo

Todavía estoy leyendo temas generales sobre el
desarrollo en MAC, de hecho aún no he pasado de los manuales que describen las
tecnologías y los diferentes bloques en que se divide el desarrollo en MAC.

No obstante me ha surgido una curiosa
reflexión que quiero compartir con vosotros. Todavía no estoy muy seguro de que
sea completamente cierta, porque todavía no he profundizado en los conceptos
MAC y lo que he leído tiene más que ver con la publicidad del desarrollo en esta plataforma que otra cosa, pero
creo que tiene muchos visos de ser real como la vida misma.

Y lo más curioso de todo es que tiene mucho
que ver con el desarrollo Windows, y más cercanamente al de las tecnologías
.NET. Cuanto más leo sobre Cocoa, QuickTime (que no sólo es un programa sino una
tecnología), etc., más me parece estar leyendo sobre .NET, o más bien sobre la
forma en la que se publicita .NET.

Se habla de grandes grupos de tecnologías
orientadas a objetos, con grandes rendimientos y grandes facilidades ofrecidas
a los desarrolladores. Calcado uno de otro. Ahora habrá que ver la pura
realidad.

Del lado .NET ya lo tengo claro: mucho ruido y
pocas nueces, al menos para desarrollo de sistemas. Quiero creer que del lado
MAC no será igual, pero cualquiera sabe. Ya os iré diciendo.

***

Pero no, no es sobre eso sobre lo que os
quería hablar. Veamos por un lado la arquitectura lógica expresada por los
manuales de MAC, que creo es más real que la dicha por los de Windows.

Debajo del todo un ordenador de Apple hay un
Kernel BSD que no es otra cosa que una variante de UNIX igual que es Linux. Y
luego hay un sistema POSIX de toda la vida que de nuevo tiene que ver con el
mundo UNIX (que viene a ser como una serie de servicios que simplifican el
acceso al núcleo del sistema igual que una consola de comandos en Windows
permite trabajar con ficheros sin tener que tocarlo).

Aunque Apple lo ha llamado Darwin, no deja de
ser lo que es, y de hecho Apple publica
todo el código fuente
de ello. Al ser un estándar debe estar separado.
Realmente está separado.

Encima de eso hay una serie de capas, Cocoa,
Carbon, QuickTime. Más o menos. Pero lo que es cierto es que esos subsistemas
están completamente separados del núcleo o más bien encima de él.

En Windows creo que no es así. En su momento,
en las versiones NT originales sí que lo era (o al menos así se publicitaba).
Recordemos la capa HAL que podía ser para un montón de procesadores y luego el
sistema NT Executive nativo, que corría sobre dicha capa. Pero ahora, después
de la unificación con la plataforma 9x en lo que fue Windows XP dudo mucho que
siga siéndolo.

Porque ahora no hay soporte para ARM, ni para
SuperH, ni para PPC. Sólo Intel x86 y dando gracias. Me juego un gallifante a
que ahora está todo mezclado y revuelto (y de ahí los problemas de Microsoft
para volver a añadir soporte para ARM). Porque si no fuera así no se entendería
cómo puede funcionar el sistema de vídeo sobre Win32 accediendo al driver que
está en el núcleo (sí, ya sé, anillos, gateways
y todo eso, pero no voy por ahí)…

Bueno, quizás en esto me equivoque, pero si
alguien me explicara cómo el hecho de reproducir un vídeo dentro de un
navegador pueda generar una BSOD estando los sistemas separados, que me lo
diga. Porque me ha pasado. Y no una, sino varias veces. Putas ATI.

De todos modos luego veremos alguna razón más
de ello y quizás uno de los puntos más fuertes de por qué Microsoft está un
poco contra la espada y la pared.

***

Apple ya lo ha hecho al menos dos veces y lo
va a hacer una más. En x64 no va a haber Carbon, que es como se le llama al
subsistema que soporta programar en C y C++ de forma nativa. En x64 sólo vamos
a tener Cocoa (Objetive-C y Objetive-C++) y POSIX (que yo sepa). En su momento,
con el cambio de PPC a x86 repitió jugada, haciendo borrón y cuenta nueva y
forzando a muchas empresas de software a reescribir sus programas. Como cosa
curiosa os diré que Apple encargó a Adobe la creación de su iPhoto, iVideo y
demás programas de esa plataforma y Adobe los mandó a freír espárragos porque
estaban como locos rehaciendo sus propios programas. Creo que hubo otro cambio
rompedor más en los MAC pero ahora no recuerdo qué.

Bueno, el meollo del asunto está en que a
veces es conveniente hacer borrón y cuenta nueva. Hasta donde sé, el API de MAC
OS X y el de iOS es un API moderno, orientado a objetos y bastante potente. Ya
os diré si realmente es cierto cuando me enfangue las manos con ello.

***

Ahora volvamos a Windows. Aquellos que hayan
leído sobre el tema, sabrán lo que son los subsistemas.
Para los que no, una pequeña introducción.

Win32 es un subsistema. POSIX es un subsistema
(o lo era hasta que lo quitaron). De hecho, en las primeras versiones de NT
había hasta un subsistema OS/2.

Un subsistema es una API completa que sirve
para que las aplicaciones escritas para tal subsistema se ejecuten en él, sean
independientes del núcleo y no puedan afectarlo en ninguna manera. Ved la
siguiente imagen de la Wikipedia y fijaros arriba a la derecha.






















 http://en.wikipedia.org/wiki/File:Windows_2000_architecture.svg

Básicamente esa debería ser la arquitectura de
Windows. Fijaros también en lo que hemos hablado antes sobre el HAL y el
Executive.

¿Realmente Windows es así? Creo que no.
Teóricamente si cogéis un programa 100% compatible POSIX y lo ejecutáis en
Windows 2000, debería funcionar. ¿Lo hace? Pues no. En su momento lo probé y no
funcionaba. Tampoco lo hacía uno de OS/2 cuando ese subsistema estaba, todavía,
presente. No es que no funcionaran bien o hicieran alguna cosa rara, es que la
mayoría de veces simplemente no cargaban.

¿Ha visto alguno de vosotros un Windows NT
ejecutado en un ARM o en un SuperH? Yo no y no creo que funcionen. ¿Vais viendo
ya por dónde voy?

Con esto no quiero decir que nunca hayan
llegado a funcionar, lo que quiero decir es que yo al menos no lo conseguí en
su momento. En un MAC moderno podemos ejecutar prácticamente cualquier comando
típico UNIX, desde un “ls” hasta un “ps” pasando por un “dd” o lo que queramos.
Aparte de los que la propia Apple ha añadido, que hay unos cuantos.

De nuevo no me malinterpretéis, en ningún
momento estoy diciendo que un MAC sea mejor que un Windows por eso. Simplemente
estoy diciendo que en un MAC sí que están separadas y presentes las distintas
piezas, o al menos así lo creo. De nuevo el tiempo me lo dirá, y yo a vosotros.

***

Y ahora entramos de lleno en .NET. ¿Por qué
.NET no es un subsistema y sin embargo está construido sobre Win32, que no es
precisamente un API limpia y ordenadita sino más bien todo lo contrario? ¿Por
qué no aprovecha Microsoft la arquitectura de los subsistemas para hacer a .NET
miembro de derecho propio dentro de Windows y no un mero envoltorio que cada
vez se va pareciendo más a lo que envuelve, sobre todo en el tema de la guarrería?

Si ya .NET es algo grande en el aspecto del
rendimiento y funcionalidad (comparado con su contrapartida Java y a veces con
el propio Win32), ¿qué rendimiento no tendría si fuera un subsistema
independiente?

¿O es que toda la estructura arquitectónica de
Windows es una mentira como un castillo y no puede haber otros subsistemas
cooperando sobre el ejecutivo?

Me gustaría que alguien me aclarara todo esto,
porque sinceramente no lo entiendo. Yo tengo mi teoría, que no voy a exponer
aquí no sea que se me acuse de lo que creo no soy, y menos ahora que tengo mi calentón de fanboy…

 

iPad/iPod/i<Cosa> vs. E-ink y otras petisoperías

[Esta entrada también se ha publicado aquí]

Llevo como una semana leyendo exclusivamente
con el iPad y mi nuevo iPod Touch de cuarta generación, que para quien no lo
sepa tiene una resolución casi idéntica a la del iPad pero en una pantalla
mucho más pequeña, por lo que si tienes buena vista la calidad de lectura es
acojonante. Y no, no me molesta el brillo de la pantalla, y si con treinta años
pegado diez horas al día a una no me he quedado ciego, no creo que me quede en
otros treinta, no al menos por culpa de ellas.

Pese a las críticas a las plataformas de Apple,
y su evidente limitación en algunos dispositivos, cada vez estoy más convencido
de su utilidad, por encima de Windows. Vamos, que me estoy convirtiendo en un switcher de pro y al completo, pues le
estoy dando un tiento al Xcode 4 y me he bajado (y estoy leyendo –que es
diferente a bajarse-) un montón de documentación sobre programar en OS X.

A lo largo de mi historia de amor/odio con
Apple, he ido rodeándome, sin quererlo, de muchos de sus dispositivos.

Primero fue un iPod de segunda generación, que
ahora duerme el sueño de los justos pues lo tengo de mero despertador pero que
en su momento me acompañó en muchos viajes y cuitas.

Unos meses después vino un iMac (2008) como
quien no quiere la cosa, o más bien como capricho. Ya llevaba un tiempo
echándole los ojos a un portátil de Apple, pero los precios me echaban para
atrás. Sin embargo, un día en el Mediamarkt mi hermana me dio el empujón que me
faltaba y me volví con un flamante Core2Duo de 24”.

Tras la emoción inicial también quedó criando
malvas, más por no entender el OS X que por otra cosa, ya que es un aparato
silencioso y que cumple como un jabato. De hecho se quedó como plataforma para
actualizar el iPod y luego el iPad.

Porque el iTunes en Windows es una mierda. Se
atasca y atasca el sistema (incluso en mi i7 con 8 núcleos) sin subir ninguna
CPU a un porcentaje de uso remarcable. Es como si el driver USB fuera una
castaña pilonga. En algún momento tuve las bibliotecas compartidas entre mi
anterior PC (un QuadCore) y el iMac gracias a algún que otro truco, pero ya no.

Más tarde vino el iPad. ¡Ay el iPad! Ese
elemento denostado por todos pero que ha tenido un éxito inmenso, más allá de
cualquier expectativa… Y es que, pese a las bocas llenas de despectiveces de los expertos, ese tipo
de tabletos (expresión copiada de Juan Luis Chulilla) era algo
esperado con ansia.

No voy a entrar aquí en que si no es un PC,
que no lo es, o la era post-PC del haba de Steve. Es lo que es. Un aparato para
estar tumbado en el sofá y ver una película, o leer, o revisar el correo. Y
quien niegue la utilidad de eso está más ciego que un topo. Por lo menos para
los singles como yo que se pasan el
día a solas… y hay unos cuantos singles
por el mundo.

Bueno, como os decía, vino el iPad. El mismo
día que salió en USA lo compré a un revendedor americano, por lo que el lunes o
el martes siguiente lo tuve aquí y pude, por fin, pasar más tiempo en el sofá
que delante del ordenador. Sí, yo soy ese tipo de gandul que es capaz de hacer
los trabajos de Hércules si luego va a estar tranquilo tocándose las bolas.

Se me olvida decir que antes de esto vino un
Time Capsule como disco de copia de seguridad para el Time Machine, Windows y
como router. Lo cierto es que como disco de seguridad para Windows no sirve
porque la mitad de las veces se desconectaba solo, y  Windows 7 terminó de rematarlo. Pero como
router es insuperable, y cuando viene alguna visita que quiere WiFi le activo
la de invitados y me ahorro de compartir claves y demás zarandajas. Y es un
equipo robusto. El cable modem ha sido cambiado dos veces, mientras que el TC
ahí sigue, haciendo de Time Machine para mi Snow Leopad.

No me cansaré de repetirlo: el iPad es la
rehostia. Y no, no me voy a comprar el iPad 2. Porque la inclusión de las
cámaras me la trae floja, y el que pueda ir hasta nueve veces más rápido
también. No soy un gamer. Soy un reader. Lo actualizaré cuando le pongan
una pantalla más grande o con más resolución. O se rompa el que tengo.

Durante el día, en el trabajo, voy revisando
las RSS en los tiempos muertos y las entradas que me interesan las envío al
Instapaper. Por tiempo no siempre puedo hacerlo, pero es lo habitual.

Cuando llego a casa y hago las tareas comunes
(revisar el correo y las news en el PC MAC, cenar, ducharme, ponerme
cómodo), me tumbo en el sofá (en
cursiva porque es una cama de esas con motor que puede adoptar la postura que
quieras) con mi iPad a mano. Leo las RSS que me han quedado y las que me
interesan las voy pasando al Instapaper
desde el propio programa. Para mis sindicaciones principales uso MobileRSS,
y para las secundarias (libros gratis, libros gratis, y algún que otro relacionado) NewsRack (tengo dos cuentas de
Google).

Luego le toca el turno a Fipboard y a Zite.
Este último es un reciente descubrimiento y todavía me estoy haciendo a él (y
él a mi). Digamos que utiliza una serie de algoritmos basados en tu cuenta de
Twitter y de Google Reader para ofrecerte noticias relacionadas a tus
intereses. Y se va auto configurando según lo que hagas, lo que leas y cuánto
tiempo le dediques a cada tarea. Sí, ya sé, todo termina en unos servidores que
a saber qué van a hacer con la información que capturen. Hablando en plata me
la trae más que floja que sepan que mis intereses sean C++ o los piticos de
boina…

Tras eso cargo el Instapaper y me recreo en la
lectura de todo lo que me he ido pasando. A veces reenvió por correo o saco a
Facebook o Twitter algo. Eso me ocupa sobre una hora u hora y media, dependiendo
de las novedades que haya.

El siguiente paso consiste en o bien cerrar el
iPad y abrir un libro-e o libro-p o bien seguir con el iPad, que es lo que
estoy haciendo últimamente. Y luego a mimir, a veces incluso en el mismo sofá
si hace frío, tengo la chimenea encendida, y estoy perraco para cambiar de
cuarto… En verano no sé cómo será mi rutina, porque el anterior mi casa estaba
de otra forma y la habitación que ahora es mi cuarto de estar era la de
trabajo…

Sí, la tele la tengo de adorno, en otro
cuarto, y que siga así por muchos años.

***

Ahora metamos el PC en medio. Es decir, cuando
llego a casa lo enciendo y encendido se queda hasta más o menos cuando me voy a
dormir. A ratos me levanto y miro las news o miro algo que no puedo hacer en el
iPad.

Algunos días, cuando estoy de humor y la
jornada de trabajo no ha sido muy opresiva, programo en casa mis cosas tras la
sesión con el iPad (o antes). Sí, tengo proyectos personales a medio hacer,
algunos de ellos interesantes.

Y es aquí dónde viene la crisis del PC… y
personal. Entre septiembre y noviembre de 2010 mi situación laboral cambió
drásticamente. Básicamente fui miserablemente engañado por mi jefe, aunque él
diga que no. Yo curraba en casa. La central en Madrid cerró por temas que no
tienen que ver con la crisis y de los que ni puedo ni quiero hablar, y fue
trasladada a una ciudad a media hora de coche de dónde vivo. O al pueblo en
donde vive mi jefe.

Yo trasladé mis cosas allí temporalmente para
terminar un proyecto que corría prisa. ¡Qué inocente que fui! Pasaron dos meses
y seguía allí. Al final todo explotó. Tuve una gordísima con mi jefe y todo
quedó claro: no sólo fui engañado para cambiar mi forma de trabajar, sino que
luego encima se regodeó diciéndome que ya no podía protestar, que legalmente
tenía un mes y ya habían pasado dos. Las promesas de ir sólo uno o dos días a
la semana se las llevaron el viento. Mintió como un cosaco.

Pero no sólo fue eso. En el proceso se
perdieron 1000 euros que se me debían de unos extras realizados un tiempo antes
y no se me pagaron y “hazte cuenta de que eso no lo vas a ver nunca”. Y también
perdí mi PC. Mi versión es que cuando yo empecé a trabajar en mi casa había un
PC de nivel medio/alto que era mío. Cuando dejé de currar en mi casa no quedó
ninguno. Según mi jefe, el PC lo había pagado él. En cierta medida así era,
puesto que del original no quedaba ya ninguna pieza, todas ellas rotas u
obsoletas en el desarrollo de mi labor profesional. El hecho de facto es que al empezar yo tenía un
PC y al terminar no tenía ninguno.

Depresión al canto, ideas muy malas de
llevarlo a los tribunales con todo y a por todas. Sondeo de familiares y
conocidos para el tema. Todos me daban la razón y afirmaban las palabras y
promesas que habían oído de mi jefe, pero nadie se comprometió a decirlas ante
un juez (y dándoles gracias por avisarme antes y no hacerlo en el momento
crucial). Su palabra contra la mía. Y mejores abogados, como llegó a decirme.
Hubo unos días en los que la baja por depresión se tornó una salida demasiado tentadora,
una baja larga y demoledora par él…

Lo curioso y lo que más me jode es que encima
él queda como el bueno de la película. Como Steve Jobs, su distorsión de la
realidad es legendaria entre sus conocidos y familia (por desgracia yo mismo).
Según él me dio posibilidad de traérmelo y usar la morralla que había en la
empresa, pero claramente las facturas de muchas cosas estaban a nombre de la
empresa. Es preferible perder un ordenador que luego ser acusado de robar
material de la empresa. Aun así me traje todo lo que tenía una factura a mi
nombre…

Pero no, había de por medio otras razones para
seguir de las que no debo hablar… así que decidí tragar y seguir. Horario a
rajatabla. Cero concesiones. Pasar de él. Todavía tengo cartas en el bolsillo
para jugar, pero las cosas se están volviendo “amigables” de nuevo. De nuevo
vueltas a casa a las diez de la noche (antes no eran “vueltas a casa” pero eran
“retiradas de currar”)… Pero no, no lo voy a consentir.

***

Bueno, centrándonos en el tema, yo estaba en
casa, depresivo y sin ordenador. No, sin ordenador no. Tenía mi fiel iMAC, ya
algo obsoleto y con un rendimiento no muy bueno al menos comparado con el PC…
Así que volví a usarlo.

Pero cometí un error. Instalé el vmWare Fusion
y le metí todo lo que tenía en una máquina virtual con Windows 7. Imaginaros un
iMAC con 4GB de RAM corriendo una VM con 2GB asignados… Lento.

Por mi cabeza pasó un Mac Pro de 12 cores con
mucha RAM. Pero el precio se iba –mucho- de madre. Además, no es oro todo lo
que reluce, el rendimiento en determinadas circunstancias no era el esperado en
semejante bestia. Así que del de 12 cores bajé al de 4… y me dije que por ese
precio tenía un PC el doble de potente, así que eso hice.

Un i7 de 4 núcleos HT que son 8, 16GB de RAM,
4 discos SSD y uno SATA II en una súper placa Gigabyte con más chipsets que
operaciones cosméticas llevan algunas, además de una ATI 6850. Y un monitor de
24” a 1920 x 1200 (en lugar de los ahora 1080 habituales) para complementar el
que había podido rescatar del ordenador que era mío pero no era mío. Una bestia
parda, vamos. El iMAC de nuevo a la otra mesa, como actualizador del iPad e
iPod…

 Pero la
procesión iba por dentro. Como un runrún. Cada vez que cogía un libro para
ponerme a estudiar como antes me venían a las mientes que eso iba a servir para
mejorar mi curro… y lo dejaba. Si abría el Visual Studio lo mismo. Empecé a
usar C++ Builder, que no uso en el curro, pero daba igual.

No quiero. No quiero mejorar para mi jefe. Lo
siento. Las tres horas al día menos de tiempo libre que tengo las tiene que
pagar de alguna manera. Sí, ya sé, pensaréis que no estaba mejorándome para mi
jefe sino para mi. Pues sí y no, pero no es una cosa de querer, es una cosa de
poder. A fecha de hoy no puedo estudiar si lo que estudie sirve para lo dicho.
Está en mi y en mi espíritu. Punto.

Por lo tanto estoy en crisis. Crisis profunda.
No puedo hacer código en casa. Ni siquiera puedo leer un tema técnico sobre
desarrollo sin que me de asco. Sí, ya sé. La depresión… O simplemente largarme.
Tengo para vivir una muy larga temporada sin trabajar. Pero no, esa es la
solución fácil. Es el camino que no debo tomar. O al menos no ahora. Como dice
el refrán, a todo cerdo le llega su San Martín. Veremos.

***

Y seguimos con el runrún. También me comentaron
en algún foro que para qué cojones quería un MAC si lo iba a usar como un
Windows. Así que fui a por un PC de gama alta. Y me lo compré. Estamos ya en
diciembre, han pasado tres meses desde el desastre.
Gracias, Noelia, a ti también te las tengo que dar. Por ser como eres.
Simplemente por eso.

Pero la realidad estaba en que quería usar el
MAC como un Windows, o metiéndole un Windows dentro, o como queráis verlo. ¿Y
por qué no usar un MAC como… un MAC? Aceptar sus ventajas e inconvenientes y
tirar hacia delante…

Joder, a veces uno es tonto y se le escapa lo
evidente…  Pero todavía no estaba
convencido del todo. Yo soy un windowsero rabioso, un fanboy de Windows… Y vino
el león. Y Xcode 4.

Ha habido un par de semanas en la que un día
he tenido el PC y al otro el MAC. Y vuelta a cambiar de nuevo. Eso de perder 20
años de experiencia a mis 40 suena un poco fuerte… Indecisión. Culo inquieto. Y
eso que el rendimiento de mi iMAC en real es bastante decente.

Hala, de nuevo a confesarme. No, claro que no
es perder 20 años de experiencia, ni mucho menos. Es como cierta lástima a
abandonar, a tomar un camino nuevo y diferente. Perder el MVP. No es que lo
vaya a perder de la noche a la mañana ni mucho menos. Todavía respondo en los
foros, pero si os dais cuenta desde la crisis no he publicado apenas nada en mi
blog de desarrollo. Y tengo temas para hacerlo, pero me faltan las ganas, sobre
todo cuando te das cuenta de que encima eres un MVP incómodo.

Yo no escribo en el blog ni respondo en los
foros para ser MVP. Sólo faltaría eso. Escribo y respondo porque me apetece y
punto. Pero ahora ya no me apetece, o apenas lo hace. Se suma mi crisis, la
incomodidad que genero, el hecho de que MS esté perdiendo puntos a pasos
agigantados. Nada es decisivo, pero afecta. Bueno, las ganas y mi crisis sí que
son decisivas, pero siempre se puede hacer un esfuerzo. Pero no, simplemente no
me apetece.

Y es que, también, el proyecto MVP está
muerto. Microsoft lo ha matado lentamente. ¿Cómo pueden estar tan ciegos? ¿Cómo
cojones pueden llevar 10 años con un sistema de ayuda para Visual Studio que
simplemente no funciona (por poner un ejemplo evidente)? ¿Es que no ven lo
evidente?

Así que se me quitan las ganas cuando encima
tengo pocas. La opción fácil es mandarlo todo a tomar por culo. Sin más… Pero
no, de nuevo esa es la salida fácil. No hablo del MVP, al final eso me da
igual. Si he perdido el interés la culpa es de Microsoft. Simplemente que se
jodan.

Hablo de mandarlo TODO a tomar por culo. Es
una opción. No la mejor pero una de ellas.

***

Hay otras. La cacharrería de Apple me mola. El
Magic Mouse es… mágico. El Trackpad ya ni os digo. El teclado extendido en el
centro. A la izquierda la tableta. A la derecha el ratón. Enfrente hacia la
derecha el iMAC, a su izquierda el monitor secundario. Mola.

Detrás del iMAC, un Book Studio Edition II for
MAC de 2TB en RAID 0, recientemente adquirido, conectado al iMAC por FireWire
800. Conectado al PC por eSata va más rápido, pero yo lo quiero en mi MAC.

El iTunes no hace cosas raras cuando actualiza
mi iPad o mi iPod. El iMac no hace ruido alguno. Se suspende solo (bueno, el PC
también, pero el iMAC lo hace con más estilo. :-P). Y la pantalla es
acojonantemente buena. El monitor secundario tampoco está mal, es un BENQ que
tiene entradas para todo y en su momento costó casi lo que se me debe…

Alfred, Snap. CleanMyMac, BetterZip, VideoLAN,
Transmission, Speed Download 5, Calibre. Mola. El Fusion para abrir una máquina
virtual Windows de tarde en tarde. Ahora ya no cometo el error de usar Windows
virtualizado. Si me hace falta algo que requiera rendimiento enciendo el PC y
lo controlo por escritorio remoto. El sempiterno Office (Versión 2011), a la espera
de que salga Pages 11…

No me hace falta nada más.

Bueno, sí, un iMAC algo más rápido y con más
RAM, pero con el añadido del Book Studio de momento me sobra. Esperemos a la
próxima actualización de los iMAC (los expertos dicen que para junio o julio),
aunque un i7 con 8GB de los actuales tampoco estaría mal. 27” de monitor. Qué
gozada.

Vendo mi PC recién comprado. Y mi Touchsmart
TM2 con algo más de un año.

Xcode 4, en este momento compilando QT 4.7.2,
aunque no creo que lo use. Un montón de PDF para leer en el iPAD en relación a
Cocoa, Xcode y desarrollo MAC. Mola. Mola mazo.
J

El iPad no tiene sistema de ficheros, pero me
la trae al pairo. Mi mayor preocupación a la hora de leer un PDF es si hacerlo
en el GoodReader o en el iAnnotatePDF. Mi mayor preocupación a la hora de leer
un EPUB o un MOBI es si hacerlo en el iPod o en el iPad, y luego en qué
aplicación (tengo para elegir. Las que más me gustan son el iBooks, el Kindle
for iPad/iPhone, el Stanza o el i2reader).

Si quiero meter un fichero al iPAD, lo enchufo
al MAC, lo paso a la aplicación correspondiente y a otra cosa mariposa. Sí, ya
sé, se puede hacer igual desde Windows. Pero solo cuando el iTunes quiere (no
entro si es a propósito o no). Las copias de seguridad del i<Cosa> me
tardan un montón en Windows. En MAC son rapidísimas.

No hay multitarea real. No me hace falta. El
GoodReader habla con las otras aplicaciones compatibles. Y el MobileRSS, y el
NewsRack, y el Instapaper. Y el Dropbox.

Mola.

Mola mazo.

Y tengo un nuevo reto: aprender a programar en
MAC. Y eso a mi jefe no le sirve para nada. Lo mismo hasta vendo alguna
aplicación en la tienda…

Mola.

Mola mazo.

J