2010/01/09

Kohana101


Aprendiendo Kohana estoy desarrollando el tutorial Kohana101, publicado por Oscar Bajner.

Viendo que no hay mucho material sobre Kohana disponible en español, se me ocurrió que sería buena idea ir traduciéndolo mientras doy estos primeros pasos.

Ojalá sea de ayuda a quienes estén interesados en probar este interesante framework pero, por alguna razón, necesitan más material en español.

Pueden encontrar la traducción bajo mi colección sobre Kohana, en Knol.

2009/11/12

Trabajando con MVC


Lo que suelo hacer es ir como el cangrejo, de atrás para adelante:
  • Hago una vista estática, con datos en duro. Lo pruebo.
  • Ubico los datos que podrían ser dinámicos y uso variables y lógica de vista para generar los datos en duro. Todo eso en la misma vista. Lo pruebo, debe funcionar igual que antes.
  • La lógica de vista queda en la vista, pero paso al controlador la asignación de valores en duro a las variables requeridas por la vista. Lo pruebo, debe funcionar igual que antes.
  • Paso a un modelo la generación de los datos en duro requeridos por el controlador para enviar a la vista. Lo pruebo, debe funcionar igual que antes.
  • Creo un sistema de tablas de donde el modelo pueda extraer los datos que he venido usando en duro. Lo pruebo, debe funcionar como antes.

En cada paso, me inclino por la solución más natural y simple disponible. Evito considerar requerimientos que podrían ser buenos para el futuro o para otro caso. De ese modo la solución tiene lo que se necesita y nada más. Evito compromisos innecesarios y disminuyo las probabilidades de efectos secundarios.

Luego que algo funciona, trato de eliminar duplicaciones, y luego optimizar. Es mejor postergar la optimización lo más que se pueda, ya que optimizar frecuentemente ensucia el código con trucos y técnicas que no dejan ver bien la lógica de la solución.

Programar código directamente optimizado es una trampa, una ilusión. Hace más lento el desarrollo y complica transitar cada escalón. Cuando algo falla, está todo tan enredado que prefieres descolgarte por la baranda que revisar la escalera.

Es mejor programar por niveles de complejidad, dejando la optimización para el final. Como cuando se construye una casa; los acabados no se ponen hasta el final. De otro modo los constructores gastarían energía y tiempo extra en cuidar un mobiliario y accesorios que les estorba el paso, y que encima nadie puede usar bien.

Breve crítica sobre el uso del idiomas y variables con prefijos

Reconozco que para resolver muchos tipos de problemas, así como para organizar las cosas suele ser más sencillo pensar de atrás hacia adelante, como en el inglés (me parece que no por nada los lenguajes de programación están en inglés). De afuera hacia adentro. De lo general a lo particular. La organización de directorios, nombres, etc se hace más clara y más compatible con otras organizaciones, que si se fuerza a usar español sólo porque sí.

Sin embargo, si mis conceptos están en español, las variables directamente relacionadas con ellos también aparecerán en español (por ejemplo los nombres de las tablas, modelos, controladores), pero todas las demás variables internas (como los contadores), prefijos, sufijos, etc mantienen el estandar de un desarrollo en inglés. No es práctico traducir el nombre de las entidades, porque frecuentemente habrán conversaciones sobre ellas y carga el desarrollo llevar un tabla de equivalencias y pensar con esas equivalencias encima. Cuantos más ligeros, mejor.

Así, uso producto_precio en lugar de precio_producto, entidad_caracteristica en lugar de caracteristica_entidad.

Además, uso setPrecio(), getProducto(), etc, porque es más corto que establecerPrecio(), obtenerProducto(), etc. Hay IDEs, como Eclipse, que tienen generadores de getters y setters.

Esta forma práctica de usar el idioma no tiene que ver con el respeto a la lengua materna o lo que recomiende la RAE para hablar. Eso es otro asunto. Lo importante es que el desarrollo sea claro, práctico, el mantenimiento fácil, y que el programa funcione.

Por otro lado, me parece innecesario el uso de prefijos sólo para señalar que cierta variable pertenece a tal módulo asociado a tal tabla de la base de datos del proyecto tal. Quizás puedan ayudar a ubicar la variable dentro del contexto del proyecto, pero es poca ganancia comparado con el lastre que significará usar esas variables en el día a día. Es mejor usar variables nombradas lo más naturalmente y simple que se pueda.

Además, siguiendo un orden natural y claro no se necesitará señalar 'que cierta variable pertenece a tal módulo asociado a tal tabla de la base de datos del proyecto tal'; todo eso se podrá deducir por contexto.

Claro que todo esto no es algo rígido. Son simplemente pautas que trato de seguir y que voy corrigiendo conforme veo más casos, me equivoco y aprendo.

2009/11/08

Hello World en Kohana

Kohana es un framework PHP derivado de CodeIgniter. Los desarrolladores de Kohana decidieron que participara más la comunidad, que se adoptara PHP5, y que hubiera un ORM para acceder a la base de datos, entre otras mejoras que venían reclamándose hacía tiempo en los foros de CodeIgniter.

He usado CodeIgniter para un proyecto. Pude aprender a usuarlo mucho más rápidamente que CakePHP (de hecho, fueron varios disgustos sucesivos al reaprender varias de las bibliotecas principales de Cake lo que me animó a buscar afuera y probar CI).

Usar CI es simple, claro, directo. Permite incorporar fácilmente muchas de las cosas que ya sepamos de PHP, en lugar de forzarnos a reaprenderlas, como me sucedió con Cake.
Además me gusta mucho la forma en que permite organizar los controladores y, principalmente, las vistas.
Sin embargo, extraño algunas cosas de Cake, como la forma de acceder a la base de datos y la forma de mantener disponibles los datos del formulario una vez enviado.

Leí que Kohana es interesante como alternativa a CI (mis siguientes pasos serían probar también Yii y Adventure PHP Framework), y he decidido probarla.

2009/10/20

La importancia de comprender el proceso de solución

Muchas veces me he preguntado por qué frecuentemente parece tan problemático aplicar en proyectos del mundo real los esquemas de trabajo que aprendemos al estudiar.

El desarrollo de un sistema real suele ser un problema impreciso, a diferencia de los libros de texto, donde cada problema suele aparecer expresado de modo preciso.
Aún en los proyectos aparentemente simples, es normal encontrar imprecisiones en lo que el cliente tiene, lo que el cliente quiere y lo que realmente necesita.

Pero, aunque eso es un problema adicional al principal, pienso que no es la principal razón de las dificultades al desarrollar un proyecto.

Me parece que la principal razón es un problema de actitud frente a los problemas debido, básicamente, a la falta de comprensión de cómo se solucionan.

Muchas personas no han hecho nunca el intento de resolver algo desde cero. Casi siempre han podido solucionar lo que necesitaban adaptando o configurando una solución general desarrollada por alguien más.
Sin embargo, se les pone en proyectos de desarrollo que implican desarrollar desde cero, y entonces empiezan a ocurrir problemas.

Pienso que cuando una persona se ha acostumbrado a renunciar a buscar sus propias soluciones para usar las de otros, con el tiempo puede empezar a tener una visión distorsionada de lo que una solución es y del proceso necesario para lograrla.
Como las soluciones de otros suelen venir acabadas, pulidas y empaquetadas, una persona que no ha tenido experiencia hallando sus propias soluciones suele mirar con desconfianza el proceso de solución de otras personas.
Le es difícil entender la presencia de código auxiliar, y las sucesivas aproximaciones, simplificaciones y pruebas que ocurren en el proceso. Cree que las soluciones se deben construir tal cual se presentan al final, lo cual es como pretender que una casa se puede construir colocando cada parte con su cubierta y acabado final, cuando en realidad el proceso de construcción es por etapas.

George Polya escribió sobre el proceso de solución de problemas por uno mismo. Primero comprender el problema; familiarizarse con él; en qué consiste. Luego usar alguna estrategia de solución; quizás dividirlo, quizás simplificarlo, quizás expresarlo de otro modo, o en términos de problemas cuya solución conozcamos; probar y probar. Hallada la solución, comprobarla; ver si realmente satisface el problema. Finalmente, ver si puede hacerse de otro modo, quizás más rápido o con menos recursos.
Primero resolver la cuestión, luego optimizar la solución.

Pero cuando no se ha sido educado en solucionar problemas por uno mismo, sino en asimilar la solución de problemas tipo resueltos por otros, uno se puede llegar a acostumbrar a eso. Y, con el tiempo, llegar a pensar que todos los problemas se pueden resolver de ese modo.
Así, no es poco frecuente hallar personas que creen que toda solución debe aparecer ya optimizada.
La solución de un problema tipo puede aparecer optimizada porque ya es conocida.
La solución de un problema nuevo, en cambio, se construye gradualmente.

Muchas veces se dice que hay que evitar reinventar la rueda, y se mira con cierto desdén a una persona que lo intenta. Sin embargo, es importante. Porque quien lo hace entrena su mente en distinguir soluciones, y en construir el camino para hallarlas. Puede sentir cuál será el siguiente paso.

Quién sólo aplica soluciones es como alguien confinado a ir siempre por caminos ya trazados. Quizás tan temeroso que evita, aproximarse a los bordes, o siquiera mirar a los lados. Y, posiblemente, obstaculizando constantemente a quienes quisieran aventurarse más allá. Sin entender que los caminos no aparecen pavimentados de golpe, sino que deben construirse y, aún antes, descubrirse.

Solucionar un problema por uno mismo puede ser un proceso de exploración y descubrimiento, como aventurarse en un bosque. O también puede ser un proceso de sembrar, cultivar y cosechar.

Por supuesto que aplicar la solución de otro también tiene su mérito. Es una cuestión de técnica. De cómo, hecho el camino, lo puedo recorrer. Pero, ¿quién hace el camino?

Admitiendo que un proyecto tiene partes que desarrollar desde cero, debería dejarse espacio para el proceso de exploración y evolución que una solución desde cero necesariamente requerirá. ¿Lo hace usted?

2009/09/24

Conociendo PHP

Una presentación que hice para el Instituto José Pardo.
Viéndola desde SlideShare está además disponible el ppt original y las animaciones que no aparecen en la versión adaptada.