Ayuda: Cómo educar a una futura hacker?

Mis estimados amis y lectores de este blog, tengo una amiga a quien quiero adoptar como Padawan y enseñarle “computación.” Tiene dormitantes tendencias hacker y rasgos de geek, así que va a ser relativamente sencillo, por no decir interesante.

El punto es que no sé por dónde empezar.

Eché un ojo al índice del “How to become a hacker” de ESR, pero no es lo que busco; ya que quiero enseñarle computación en sí. Estaba pensando tomar paralelamente cosas básicas como bits y bytes y por otro lado (para que no se aburra) cosas básicas de más alto nivel y hardware.

Podrían recomendarme ideas? Ya después yo las ordeno, o si me pueden dar pautas en cierto orden, sería mejor. Quiero dejar claro que no quiero enseñarle “Windows,” ni “Linux,” ni “a programar,” ni a “ensamblar” sino a entender y a moverse por sí misma, para que llegue a ser independiente en el menor tiempo posible.

Cómo aprender PHP

Como saben, me gano el pan haciendo aplicaciones web en PHP. Frecuentemente recibo preguntas de muchos tipos, así que intentaré contestar algunas.

Empezaremos con ésta: ¿Cómo puedo aprender PHP?

La respuesta más precisa es a la vez la más genérica: Tal como aprenderías cualquier otra nueva habilidad. Leyendo, investigando y practicando, practicando, practicando. Como en toda cosa valiosa, esto toma trabajo y esfuerzo duro. Como podrás leer a continuación, no todo es tan fácil como parece.

En primer lugar, hay una distinción importante que hacer: aprender PHP no es lo mismo que aprender a programar, así como aprender a escribir el abecedario no es lo mismo que aprender a escribir poesía.

– “Aprender PHP” es aprender la sintaxis del lenguaje, cómo se escribe un programa, cuáles son las funciones, sus estructuras de control, bucles, etc.
– “Aprender a programar” es aprender a resolver problemas usando un lenguaje de programación.

Muchas personas confunden ambas cosas, y cuando piensan en “aprender PHP” están metiendo ambos conceptos en la misma bolsa, y no es así. Tu primer paso es diferenciar ambas cosas.

Probablemente habrás sentido curiosidad por PHP al ver lo fácil que es, y es muy cierto. PHP es un lenguaje muy fácil de aprender. Pero ojo, eso no significa que aprender a programar sea igual de fácil.
Es por este motivo que muchos diseñadores web intentan hacer programas con PHP y el resultado no es una aplicación robusta, ni segura, ni escalable. [1] Es por ello que vemos muchos websites hackeados porque sus autores no saben programar. Saben PHP y no es lo mismo.

Entonces vamos a reformular nuestra pregunta: “¿Cómo puedo aprender a programar y aprender PHP?”

Eso está mejor, pero todavía está incompleto.

Verás, PHP es un lenguaje para programar aplicaciones web. Es cierto, se puede usar fuera del contexto de la web (cosa que personalmente hago a menudo), pero cuando nos referimos a “programar en PHP” estamos hablando de “programar una aplicación web.”

Entonces lo segundo que tenemos que aprender es cómo funciona la web. Debes ser capaz de entender los siguientes conceptos:

1) El concepto de cliente/servidor.
2) El protocolo “http”.
3) Métodos GET y POST — cómo funcionan y cómo se diferencian.
4) El lenguaje HTML.
5) Cómo funciona a grandes rasgos un navegador web.
6) Cómo funciona a grandes rasgos un servidor web.

Ya puedo ver sus caras de “TODO ESO TENGO QUE APRENDER!?” Como les dije en un principio, aprender PHP requiere trabajo y esfuerzo duro. Ok, pasemos a una pregunta más sensible: “¿Pero Jaime, es realmente necesario que conozca todo esto?” La respuesta es “No.”
Entonces, ¿por qué razón hago esta lista? Porque tarde o temprano la falta de estos conceptos te va a traer problemas. [2]

Depende mucho de hasta dónde quieres llegar. ¿Quieres hacer un par de cosillas con PHP, un contador por aquí, un gráfico al azar en la portada y nada más? Perfecto, no es necesario que te tragues esa lista.
¿O quieres ser un buen programador? ¿De aquellos que buscan la excelencia y definen el futuro? Oh, entonces coge tu taza de café y vamos a aprender lo que es necesario aprender. De tí depende.

Una vez que tengas los conceptos de la web bien aprendidos, el siguiente paso es aprender poco a poco PHP y poco a poco programar. Hay tutoriales regados por la web, varios en español inclusive. Te recomiendo que busques un tutorial que te enseñe primero lo básico del lenguaje. Aquí unos tips en tu aprendizaje:

1) No copies y pegues. Escribe cada uno de los ejemplos a mano. Debes ser capaz de poder escribir cientos de líneas de código a mano. Debes ser capaz de recordar la sintaxis de PHP. No quiero decir que debas saberte de memoria cada una de las funciones de PHP, llevo cerca de cinco años en esto y todavía tengo que consultar la sintaxis de str_replace. Lo que quiero es que te familiarices con la forma del lenguaje, de cada comando.

2) Lee todo el manual. Si, todo. O para ser más literales, échale un vistazo a todo el manual. Un desliz frecuente es implementar todo un programa y luego descubrir que había una función en PHP que hacía eso. La idea de echarle un vistazo a toda la librería de funciones es que sepas qué cosas hay disponibles, de modo que más adelante al menos puedas pensar: “Hmmm… me parece haber visto una función que hacía eso.”

3) Elige un pequeño proyecto. Piensa en algo que te sea útil y te gustaría tener, que sea sencillo y simple. Por ejemplo: una lista de direcciones web, una tabla de colores HTML, una lista de tus gastos, etc. Luego mira qué es lo que te falta saber para poder implementarlo y averigua cada cosa, un paso a la vez. “Ah, necesito saber cómo guardar cosas en un fichero,” entonces lee el manual de PHP sobre ello o busca en Google tutoriales. “Ok, necesito saber cómo guardar lo que escribí en esta caja de texto,” entonces mira el manual de PHP o busca en Google por algún tutorial.

Se me acabó el tiempo. Este post no pretende ser ninguna guía exhaustiva, a este paso creo que voy a terminar escribiendo un libro. Si tienen alguna pregunta o duda, escriban un comentario o un mail a j@jgwong.org. Les aviso que soy tardo para contestar, así que no desesperen.

Espero que esto les sea útil. La programación es fascinante.

Notas
[1] Debo aclarar que no tengo nada en contra de los diseñadores que deciden aprender PHP; todo lo contrario, les animo a que aprendan a programar lo cual les puede abrir innumerables puertas para competir con la mejor de las ventajas: la diferenciación.

[2] Las personas que carecen de estos conceptos fundamentales son los que más tarde tienen confusión entre el cliente y el servidor. Muchos se confunden pensando que PHP puede hacer lo mismo que Javascript, que PHP puede imprimir, etcétera. Esta es la sencilla razón.

Redefiniendo y reprogramando el Miedo

Este es el segundo de una serie de tres posts. Haz click aquí para leer el primero.

Me es frecuente ver en las listas de correo del PLUG (el Grupo de Usuarios de Linux de Perú) personas que hacen preguntas que tendrían una respuesta inmediata si se atrevieran a probarlo.
Es entendible que la persona puede tener miedo a arruinar la configuración o malograr algo si intenta un comando o programa que le es desconocido. Es perfectamente razonable, sobre todo si la computadora o servidor es crítico o pertenece a un cliente.

Pero esto entra en contraste con la actitud hacker. Qué quiero decir con la “actitud hacker”? A aquella que no tiene miedo de romper algo para entender cómo funciona.

Es importante detenerme un instante y aclarar el término “hacker.” NO me estoy refiriendo a aquellos vándalos que destruyen por diversión o por falta de autoestima. NO me estoy refiriendo a personas que hacen daño. Estoy hablando de hackers en su término original: desde los fans de modelos de locomotoras hasta Leonardo Da Vinci.

Has visto a esos niños que les regalas un auto de juguete y a las pocas horas ya lo rompieron o desarmaron? Sí? Hay de los dos tipos:

a) Aquellos que lo hacen por descuido, por placer o por un intento triste de llamar la atención de sus padres.
b) Aquellos que lo hacen por curiosidad.

Los futuros Hackers pertenecen al segundo grupo. Su curiosidad por saber cómo es que el auto se mueve por sí solo es más fuerte que su deseo de conservar el auto intacto. Intentarán armarlo nuevamente, pero eso es un plus, una parte del reto.
Dicho en otras palabras, disfrutan más satisfacer su curiosidad que jugar con el juguete en sí. No les importa romper el plástico o perder un tornillo por ahí.

Obviamente, a veces lamentas haberlo roto. Todo tiene un precio.

La curiosidad te lleva a hacerte preguntas y a cuestionar cosas que otros dan por sentado, cosas que otros no quieren ni pensar porque les incomoda la idea que algo podría estar mal. Esta misma curiosidad con frecuencia te mete en problemas (Galileo, alguien?); pero el hacker vive resolviendo problemas. Su mundo está lleno de acertijos por revelar, problemas por resolver, barreras por romper.
Tengo una amiga que cuando vio la chapa de la puerta de mi oficina dijo: “Esta es de las fáciles.” Es la misma que me pidió que desarme mi celular nada más verlo y la que le brillaron los ojos cuando abrí el interior de mi primera laptop — para luego decepcionarse cuando ya no quise desarmarla más.
Lo tiene escrito en la cara: HACKER. Me muero de ganas de enseñarle todo cuanto sé.

La persona que mencioné al principio, la que tiene miedo de echar a perder algo, puede ser un gran entusiasta de la computación, considerarse un gran experto, leerse todas las revistas de computación y un largo etcétera; pero nunca va a llegar lejos, porque carece lo esencial, la pasión que define y caracteriza a un verdadero hacker: la curiosidad que no tiene miedo de malograr.

Así es como muchos borramos todo nuestro disco duro por error. :) Por supuesto que no queremos volver a pasar por eso, pero eso no nos detiene a recompilar el kernel conociendo la posibilidad de que no vuelva a reiniciar. No nos detiene a desarmar inexpertamente la PC para instalar una Sound Blaster Pro conociendo la plausibilidad de que no vuelva a encender. No nos detiene de mandar un hombre a la Luna conociendo la desconcertante tragedia que no podamos traerlo de vuelta con su familia.

Tienes miedo de malograr? Malogra.

Es como esa obra de arte llamada “Buscando a Nemo,” donde el extremadamente desconfiado papá le dice a su acompañante sobre Nemo, su hijo perdido:

– “No quiero que le pase nada!”
Ella, pensativa – “Eso es extraño…”
– “Qué cosa?”
– “Pues si lo proteges para que no le pase nada… pues nada le va a pasar.

Es como participar en esos programas concurso donde puedes elegir el premio o perderlo todo con solamente elegir una puerta. La puerta ganadora? La puerta que te robe todo? Eliges abrir la puerta o quedarte con lo que has ganado hasta el momento?
Oh sí, puedes conformarte con lo que tienes hoy, con la seguridad del momento y no arriesgarte a ganar o perder.

No elijas esa opción. Elige abrir la maldita puerta. Sí, puedes perderlo todo, pero también puedes ganar. Y si no lo intentas, si no te arriesgas vas a vivir hasta el resto de tus días con la pregunta hiriente de siempre: “Y qué si hubiera ganado?”

“Y qué si me lo concedían?”

“Y qué si ingresaba?”

“Y qué si me daban el aumento?”

“Y qué si ella también me quería?”

Como dice mi amigo Oliver, “Sólo hay una forma de saberlo.”

No me importa que no tengas una computadora. Tú eres una máquina. Hackéate a tí mismo.

Sí, te puedes romper las rodillas en el intento. Sí, puedes perder tu trabajo, perder todo tu dinero, ir a la cárcel, ser objeto de burla, que te asalten, que hagan trizas tu corazón, que te mates saltando del avión a más de mil metros de altura.

“Qué rayos estás haciendo?” te van a decir. “Estás loco!”

Y qué vas a contestar?

“Sip. Se me perdió un tornillo por ahí.”