domingo, 6 de enero de 2008

Las malas prácticas del programador web (parte 1)


Cuando una persona quiere aprender a programar web, pregunta en algún lado, le dicen que tiene que aprender PHP y acto seguido va a Google donde preguntará por "php tutorial" o algún término similar, pero muchas veces esto que parece tan sencillo los termina llevando a cometer muchos errores.

Cuando una persona quiere aprender a programar web, pregunta en algún lado, le dicen que tiene que aprender PHP y acto seguido va a Google donde preguntará por "php tutorial" o algún término similar.

Dicha busqueda lo conducirá a millones de resultados, que cubrirán todos los conceptos fundamentales, pensados para aquel que nunca en su vida programó, de una manera sumamente sencilla y resumida.

Esto es genial, el novato se encuentra con muy buen material muy rápidamente que le permite aprender y hacer sus primeros scripts en poco tiempo. Es así que es sumamente común en estos sitios encontrar código como el siguiente:

<html>
<body>

<?php

$link = mysql_connect("localhost", "admin");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT * FROM contactos", $link);
echo "Nombre: ".mysql_result($result, 0, "nombre")."<br>";
echo "Dirección: ".mysql_result($result, 0, "direccion")."<br>";
echo "Teléfono :".mysql_result($result, 0, "telefono")."<br>";

?>

</body>
</html>


Sin embargo, tanta simplicidad tiene un problema fundamental. En el afán de ser simples, todos estos sitios mezclan código HTML con código PHP, y aunque muy bueno para el novato (¿que necesidad hay de confundir más a quien recién comienza?), en la vida real, esto es algo que se intenta evitar.

A saber, no es posible separar por completo el código PHP del HTML. Los valores php se deberán imprimir con echo o una función similar, pero de ahí a poner consultas a la base de datos en medio del HTML hay un mundo de diferencia. Una cosa es imprimir resultados y datos y otra es aplicar la lógica de la página en medio del HTML.

El motivo es simple: que el código sea mantenible. Si uno tiene 300 páginas como la anterior, cada una con 300-400 líneas de código HTML / PHP, el día que se quiera modificar algo abrá que revisar todos los archivos línea por línea. Si por el contrario se los mantuviese separados, podríamos reducir nuestra busqueda a la mitad, dependiendo de si queremos modificar los datos que mostramos (una consulta a la base de datos por ejemplo), o la lógica del sitio (a dondese copian los archivos subidos, por decir algo) o el COMO lo mostramos (agregar un div o una clase a un elemento del DOM).

Incluso si tu sitio no es tan grande, conforme pasa el tiempo, y se realizan modificaciones, el código se va degradando. Cada vez es más complicado de seguir. Comienzan a aparecer condicionales que encierran bloques de código HTML, que te dificultan saber si ya cerraste un tag que se abría arriba.

Para peor, no es que estos sean temas de los que no hay material en internet. De hecho, hay tan buen material sobre como hacer sitios profesionales, como buen material para comenzar. El problema creo yo radica en que no hay nada en el medio. No he conocido un sólo sitio para aprender PHP que luego de enseñarte a hacer sitios sencillos diga "ahora que sabés PHP, vamos a hacer las cosas bien" y hable de estos temas o ponga links a sitios que los traten.

Conozco a muchas personas que trabajaron muchos años en varios proyectos propios sin siquiera imaginar que lo que ellos hacían no era profesional, y se han sorprendido al ser rechazados para algún trabajo.

Si tu eres uno de estos programadores y realmente quieres hacer las cosas mejor, como primer paso te recomiendo investigues a Smarty, un motor de templates html que te permitirá separar el códgo HTML del PHP sin cambiar mucho la forma en que venías haciendo las cosas.

Una vez te sientas cómodo con ello, deberías comenzar a leer un poco sobre patrones de diseño, en particular MVC y otros patrones relacionados al mismo como ser Front-Controller, y para cuando creas entender de que se trata te recomiendo mirar algunos frameworks PHP y usarlos. Vas a ver lo muy diferente que es y las ventajas que trae. Para concluir, dejo links a un par de frameworks recomendados:

Zend Framework
Symfony

2 comentarios:

El Oso dijo...

No he conocido un sólo sitio para aprender PHP que luego de enseñarte a hacer sitios sencillos diga "ahora que sabés PHP, vamos a hacer las cosas bien" y hable de estos temas o ponga links a sitios que los traten.

Recuerdo haberme topado con un dilema similar cuando me presentaba a los concursos docentes en la UBA. Yo di varios años clase en la primera materia de programación de la Licenciatura en Ciencias de la Computación, y durante la prueba de oposición frente al jurado yo les explicaba que, tal cual comentás, primero se le debe enseñar a resolver el problema, que pueda entenderlo y armar un código que lo resuelva. Finalmente cuando lo ha conseguido, explicarle como ordenar todas esas ideas y poder no solo resolverlo, sino que además resolverlo bien. Se armó un cruce de opiniones en el cual el jurado me criticaba el por qué no directamente se le explica desde el comienzo como resolverlo bien. Mi respuesta fue que "ud a un bebé no le enseña a correr sin haberle enseñado a caminar y a gatear antes". Si bien no me pudieron responder nada, debo confesar que el método de ellos me parecia tan válido como el que yo defendía. Respecto a la enseñanza de informática, hay una carrera universitaria al respecto: Profesorado en Ciencias de la Computación. Se hace en la UBA, en horarios totalmente inaccesibles, y el perfil del egresado no es "profesor del secundario" sino investigador en méodos de enseñanza de ciencias informáticas.
Obviamente igual todos terminan siendo docentes para ganarse el pan.

Saludos
Mariano

Juan Martín Sotuyo Dodero dijo...

Muchas gracias por el comentario Mariano.

Debo reconocer que hay algo de razón en lo que dicen tus profesores, pero no creo sea adecuada para quien no tiene completamente definida su voación o la fuerza de voluntad suficiente.

Es posible enseñar a hacer las cosas bien de una. El problema con ello, creo yo, es que para quien recién empieza, hablarle de objetos y hacerle escribir 400 líneas para un "hola mundo" termina dandole la impresión de que la programación es algo tedioso y complicado en demasia (no es que sea algo sencillo, pero cuando todo es desconocido cualquier cosa asusta), y eso tiende a desalentar. Es el mismo motivo por el que muchos de los que empiezan a programar sólos lo hacen con VB y no con C. Quieren ver resultados rápidos que les permitan ganar confianza y seguir avanzando.

Por otro lado, temo que de los sitios que enseñan a resolver bien las cosas, parten de que uno tiene ya una base, y no se detienen a explicar que es una sentencia if o un bucle for.

Sea como sea, el punto es el mismo. No hay un punto intermedio que permita a la gente, en un aprendizaje constructivo, llegar a una solución técnicamente correcta.