Suponiendo que sigas un primer principio de diseño móvil, ¿es posible tener una única base de código para plataformas web, web móvil, iOS y Android? En caso afirmativo, ¿cuáles son los pros y los contras de este enfoque?

Es completamente posible si su aplicación es simple. Si su aplicación es compleja, es posible en su mayor parte , pero cuanto más sofisticada se vuelva su aplicación, más probable es que necesite un código específico de la plataforma para brindar a sus usuarios la mejor experiencia posible en cada plataforma.

La ventaja es, por supuesto, que su base de código general será más pequeña, ya que gran parte se reutilizará. Esto puede muy bien superar todos los inconvenientes a continuación. O puede que no, eso dependerá de lo que haga su aplicación y de cuánto valore las cosas que pierde al adoptar este enfoque.

Un inconveniente es que estará programando contra una abstracción de la plataforma real. Las abstracciones siempre se rompen si las empujas lo suficiente. Habrá capacidades de cada plataforma que no podrá aprovechar al máximo, porque la abstracción no las incluye.

Por ejemplo, si diseñas toda tu interfaz de usuario alrededor de dispositivos con capacidad táctil, no tendrás un gesto de “desplazamiento” de la interfaz de usuario. O bien, si utiliza el cursor estacionario como un gesto de la interfaz de usuario, los usuarios de dispositivos con capacidad táctil lo encontrarán muy frustrante. Para un ejemplo específico, observe cómo al pasar el cursor sobre el elemento “Inicio” en el banner superior de Quora, aparece una ventana emergente de notificación. Ahora intenta duplicar eso en un dispositivo con capacidad táctil … no puedes desplazarte con el dedo. Por supuesto, esto se puede resolver mediante un código específico de la plataforma.

Una forma de obtener escritura una vez que se ejecuta en todas partes es hacer toda su lógica del lado del cliente en Javascript, y hacer que el Javascript haga solicitudes XMLHTTP al servidor para obtener los datos necesarios en tiempo de ejecución, por lo que solo una página la carga tiene lugar alguna vez. Su “aplicación” nativa puede ser poco más que un navegador en modo de pantalla completa.

Puede desarrollar una aplicación muy sofisticada de esta manera: vea Outlook Web Access en Exchange 2013, por ejemplo (me gusta este ejemplo porque trabajé en él). Un inconveniente de este enfoque es que no obtienes la velocidad del código nativo en dispositivos que admiten código nativo. Otro inconveniente es que los depuradores de Javascript no son tan sofisticados como los buenos depuradores de código nativo. Otro inconveniente es que puede terminar recreando muchos elementos básicos de la interfaz de usuario que son mucho más fáciles de implementar (o que son gratuitos) con desarrollo nativo (por ejemplo, cuadros de lista verticales donde cada elemento de la lista contiene múltiples líneas de texto formateado) . Otro inconveniente es que puede terminar con MUCHOS javascript, lo que lleva tiempo descargar cuando se inicia la aplicación. Otro inconveniente es que HTML es pésimo como lenguaje de especificación de GUI; se puede hacer, pero es una clavija cuadrada en un agujero redondo.

Otro inconveniente es que es probable que cada versión de su aplicación tenga un aspecto muy similar en todas las plataformas. Se podría decir que esto es una ventaja, sin embargo, si la mayoría de sus clientes individuales solo usan una sola plataforma, es posible que no estén contentos de que su aplicación no tenga el mismo aspecto que una aplicación nativa.

Dicho todo esto, no es necesariamente un mal enfoque. Como mencioné, trabajo en un producto que utiliza este enfoque.

Pero tiene inconvenientes. Se podría argumentar que los usuarios obtendrían mejores resultados si cada plataforma tuviera una aplicación nativa, pero por otro lado, tomaría más tiempo (o más personas / más dinero) desarrollar múltiples aplicaciones nativas.

Hay productos como PhoneGap ( http://phonegap.com/ ) y Titanium ( http://www.appcelerator.com ) que le permiten escribir sus aplicaciones en JavaScript que pueden compartirse en diferentes plataformas.