Mantengámonos en la duda, seremos más sabios

Siempre me ha resultado bastante complicado afirmar algo con rotundidad, y no por falta de confianza, sino por declararme ignorante y porque considero que hay alguién mas inteligente que yo que podría dar una mejor aproximación, por eso en mis conversaciones uso frecuentemente frases del tipo "Personalmente opino que...", "Bajo mi punto de vista.." "Yo creo que..."

También me resulta extraño conocer a personas que se sienten con la autoridad para afirmar. Bajo mi punto de vista la afirmación implica en muchos aspectos ignorancia . A groso modo una persona que afirma es una persona que bajo su punto de vista sabe y por consiguiente no necesita aprender más.

En la historia humana, durante muchos siglos, hemos vivido en la ignorancia y lejos de aceptarla y combatirla hemos mirado para otro lado y nos hemos declarado sabios. ¿Por qué desde hace 300-400 años estamos creciendo a pasos agigantados en cuanto a ciencia se refiere? La respuesta es que alrededor del año 1500 d.c se produjo lo que los historiadores conocen como La revolución científica. ¿Como se produjo ese revolución? Uno de los detonantes de dicha revolución fue Cristobal Colón al descubrir América. El descubrimiento de América produjo un cambio en la mentalidad de Europa, significaba que no todo estaba hecho, que había por hacer todavía muchas cosas. Colón no era científico pero sentó el cambio de mentalidad, a Colón le siguieron científicos de verdad como Isaac Newton o Galileo Galilei, o unos estadistas que fundaron el primer fondo de pensiones en irlanda, que se apoyaba en la estadística para mantener la estabilidad del sistema.

En resumidas cuentas, la revolución científica se dió porque aceptamos nuestra ignorancia, y solamente si aceptamos nuestra ignorancia podemos seguir aprendiendo. En épocas anteriores el que quería saber algo debía consultar al sabio local y este basaba su respuesta en su experiencia o en Escrituras Sagradas, que a menudo, si el dilema no se encontraba en dichas escrituras se entendía que ese problema no era importante, porque si fuese importante Dios lo hubiese contemplado en sus escrituras (o a través de sus profetas)

A modo de ejemplo ilustrativo voy a contar una anécdota que me pasó hace unos días.

Hace unos días, tuve un problema con un sistema de comunicacion sobre internet y decidí pedir consejo en StackOverflow. Basicamente el problema que tenía es que experimenté lentitud con la librería de comunicación volley de Android, haciendo pruebas comprobé que para acceder a un json de 0,27 KB (unos 300 Bytes) volley empleaba de media un 1000 ms. Un tiempo inaceptable para tal cantidad de información. Los tiempos eran parecidos tanto por WiFi como por 3G, sin embargo desde las herramientas de desarrollador de firefox comprobé que éste únicamente tardaba 150 ms.

Un detalle a puntualizar es que el servicio REST funciona sobre SSL y usa compresión GZIP, esto fue en la primera causa del problema que pensé, así que me dirijí a StackOverflow para exponer mi caso proporcionando las pruebas obtenidas y preguntar si había alguna forma de optimizar volley.

El primer comentario que obtuve fue de CommonsWare que es bastante importante en StackOverflow y una de las eminencias en Android. Su comentario fue el siguiente

You are comparing apples with oranges. The network tab in Firefox reports the network access time. The time between millis and System.currentTimeMillis() in your code is for both network access time and JSON parsing time.

Y su comentario es cierto, pero yo eso ya lo sabía. Lo que yo quería saber es si ese tiempo de procesamiento de json o el tiempo de acceso a la red eran normales para un json de solo 300 bytes ya que intuía que no era así. Su siguiente respuesta a mi contestanción sobre si ese tiempo de procesamiento json era razonable fue la siguiente

"json parsing could take that time?" -- sure. You might run a test where you use JSONObject to parse a static String containing a typical HTTP response payload, to see how long it takes in the same environment

Como no tenía nada que perder hice los cambios perninentes en el código para recuperar un string sin procesar y procesarla yo, en vez de obtener un objeto JSON de primeras. Con este cambio hecho hice algunas pruebas y esto son algunos de los resultados:

D/Before process:1132
D/After process:1133
D/Before process:918
D/After process:920

Aquí muestro 2 pruebas que hice, calculé el tiempo justo cuando volley recuperaba el contenido como tal y después de haber convertido el String a un JSONObject. Como se puede apreciar, en la primera prueba este procesamiento json solo llevo 1 ms y en el segundo caso 2 ms. Tiempos más que aceptables según mi experiencia y teniendo en cuenta el tamaño del json. Las pruebas que hice antes de usar Strings son las siguientes:

D/Before process:1041
D/After process:1045
D/Before process:907
D/After process:908

En estas pruebas usé la misma terminología, pero se refieren a cosas distintas, en este caso ya no recibimos un String sino un JSONObject, por tanto el tiempo medido en Before process simboliza el tiempo que volley ha empleado en acceder a la red y en transformar el string en un JSONObject, por tanto aquí Before process es el After process de las pruebas anteriores. En cambio en estas pruebas After process se refiere a tiempo que ha transcurrido desde que se ha hecho la petición hasta que el JSON ha sido parseado, es decir, hasta que se han extraido los datos de interes del json, por tanto lo que no interesa en este caso es el Before process y como podemos observar es similiar a la prueba hecha con strings, de hecho es incluso más rápido usar el método que nos devuelve un JSONObject en vez de un string, a diferencia de lo que había pronosticado CommonsWare.

Respondí con las pruebas realizadas y ya no obtuve más respuesta.

El problema ya está solucionado y como supuse inicialmente era una fallo de la gestión de la capa SSL, un fallo generado por mi mismo, que fuí el que programó dicha capa.

Lo que me sorprendió fue la tajante respuesta de CommonsWare como si tuviese la verdad absoluta, esto no es una crítica a CommonsWare ni mucho menos, solamente es un ejemplo que me ha servido de lo que quería expresar, que una persona bastante competente y con bastantes conocimientos.

P.D Tras hacer los cambios pertinentes en la capa de seguridad y criptografía SSL obtengo unos tiempos de entre 140 y 300 ms, tiempos más que aceptables.