Tales about Aviation, Coaching, Farming, Software Development

Java o PHP para desarrollar una aplicaciĆ³n web

Inspirado por la discusión con un cliente quiero publicar mis pensamientos sobre la cuestión "Java o PHP para desarrollar una aplicación web". Aquí en Panamá y aparentemente en otros países de América Latina PHP es mas famoso que Java. Hay muchas empresas pequeñas que se dedican a la creación de paginas web y ellos usan PHP para añadir funciones de interacción a las paginas. Todo esto me hace recordar la situación en Alemania hace como 8 anos atrás.

Creo que es importante que se comparan manzanas con manzanas.

PHP es principalmente una tecnológica para paginas web.

Java es un lenguaje como C/C++ o Smalltalk para realizar cualquier aplicación que se puede programar. Paginas web solamente son una forma de user interface. Con Java puedo crear aplicaciones desktop para diferente plataformas con Swing o RCP. Puedo crear applets para el browser. Y uso OOP (object-oriented programming) juntos con una cantidad de otras técnicas para crear un producto de calidad.

Java no se debe comparar con PHP. Mas bien con Microsoft .NET y alla con C# que es como el Java de Microsoft.

Veamos TDD (test driven development). No solamente ayuda eso para diseñar las clases - los objetos que se usan en el código - pero también puedo comprobar que el código no tiene errores. Herramientas como Cobertura, EMMA y Clover reportan la coberatura por unit tests. Un buen ejemplo es el reporte de Cobertura para el proyecto open source Tapestry.

Con una herramienta como Selenium puedo comprobar el user interface - o sea las paginas - de manera automática como si un robot seria usando toda la aplicación múltiples veces al día. Si se hace algún error, ya se lo ve dentro de una hora en el próximo build.

PHP frameworks como ATK y Smarty no solucionan el problema mayor de PHP: no hay separación de asuntos. La separación de asuntos me permite de desarrollar código que atiende los asuntos asignados a la capa en que reside.

Una clase en la capa de infraestructura comunica con la base de datos y retorna objetos de valores que se pasan a la capa de negocio. Yo puedo comprobar la funcionalidad de esa clase en aislamiento antes que se desarrolla el resto de la aplicación.

Una clase en la capa de negocio que requiere datos de una base de datos para poder trabajar se puede correr en un test con una simulación de la infraestructura, porque no depende directamente del código en la capa de infraestructura. Le puedo pasar un mock object que tiene la misma interfaz que el objeto real, pero actúa como defino en mi test.

Con TDD puedo verificar la función correcta de cada hielo en el código, porque me permite de usar cada linea de código en una forma de laboratorio. Y si hago cualquier cambio siempre y automáticamente se comprueba todo el código de nuevo.

Claro ideas como TDD, continuous integration, dependency injection y otras no son algo exclusivo para Java. Se puede usarlas con C, C++ y con PHP también. Pero porque la historia de PHP (scripting language para paginas web) dudo mucho que los que usan PHP tienen mucho experiencia con eso. Para la mayoría de los programadores Java también es algo nuevo - aunque la idea existe desde mucho tiempo.

Nosotros usamos la metodología Scrum y usamos técnicas generales como DDD, TDD y CI. Usamos Java porque es un lenguaje universal que nos permite aplicar eso en cualquier proyecto para cualquier plataforma y no nos limite a proyectos web. También usamos Java porque es un lenguaje OOP (object-oriented programming) y por este hecho nos ayuda diseñar en una manera limpia. OOP fue inventado como antes de 20 anos y hay muy buena experiencia con eso.

En PHP se ha cambiado mucho últimamente. Se ha extendido PHP para poder programar con objetos. Pero sin embargo en http://www.php.net se dice: "PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML." Wikipedia tiene una buena definición para "scripting language".