lunes, 29 de septiembre de 2014

Huelum, el Poli en crisis

Voy a desempolvar mi viejo blog para emitir una opinión acerca de un tema que me llega mucho.

Resulta que en estos días, el instituto del cual soy graduado (el Instituto Politécnico Nacional, el Poli) entró en crisis, y yo que quiero mucho a mi escuela y me importan mucho mis orígenes, y que soy bastante analítico con mi propia historia, me he tratado de informar y estar pendiente de lo que pasa aquí. La conclusión que saco de todo esto es, al final, una cuestión que va más allá de mi pertenencia al Poli, y podría interesar a cualquier otro mexicano o ciudadano del mundo que esto lea...



Todo inició con una serie de modificaciones en el reglamento interno del instituto y a cambios en los planes de estudios de las escuelas de nivel medio superior (CECyTs) y de la Escuela Superior de Arquitectura (ESIA) plantel Zacatenco, que no fueron del agrado de la comunidad politécnica. Para no hacer larga la introducción y puesta en contexto, en resumen (que como todo resumen va a dejar muchos huecos y ambigüedades aquí y allá) diré que por un lado se rumoraban cambios al reglamento que apuntaban a situaciones poco convenientes para los futuros egresados, y en general a la baja de calidad educativa de todo aquel que egresara de las escuelas del Poli, eso sin contar las afectaciones laborales a los maestros, cuestiones de dirección en el instituto, etc. (detalles para saber más, por ejemplo, aquí o aquí. Algunas de estas fuentes se escribieron recién iniciado todo, y se basan en información que, ya más informados, nos enteramos que no es del todo cierta). Del lado oficial del Poli, también hay información, la versión final (a día de hoy aún no publicada en la Gaceta y por lo tanto aún no promulgada) del reglamento aquí (PDF), y unas imágenes que intentan aclarar algunos mitos que se tienen al respecto acá.

El día jueves 25 de septiembre 2014, se inició una movilización masiva de estudiantes del Poli (de escuelas nivel medio superior y superior) que, he de decir, impresionó mucho. Aquí un video:



Cabe aclarar también que al principio se trataba de unas cuantas escuelas inconformes, pero que lograron un llamado masivo de todo el instituto que a partir de ese día se comenzaron a sumar al movimiento uno a uno los demás planteles. Prácticamente todos los CECyTs y escuelas de nivel superior se sumaron a la convocatoria de paro indefinido. Los estudiantes tomaron sus escuelas y anunciaron un paro hasta que se echaran para atrás los cambios al reglamento y planes de estudio que, desde la perspectiva de ellos, les afectaba en el nivel educativo, así como en todo lo antes ya expuesto.

Para mí, la gota que colmó el vaso de mi pequeño mundo sucedió cuando las escuelas de las cuales soy egresado, el CECyT 9 (la 'Bátiz') y la Escuela Superior de Cómputo (ESCOM) se unieron también al paro. Bátiz es un caso a destacar. NUNCA en su historia se había unido a paro alguno, esta es la primera vez.

Mi punto de vista respecto al paro, que a la fecha sostengo, es que este es ineficaz. Informándome un poco más, puedo decir que estoy de acuerdo con varios de los puntos que pelea el movimiento (que no con todos, muchos sólo son producto de la desinfomación, otros sólo suenan a propaganda manipulada (duélale a quien le duela), y otros puntos del Reglamento incluso los veo como benéficos aunque sean parte del conflicto). Pero en sí, el que la comunidad del Poli busque un mejor nivel educativo, y por lo tanto evitar que este nivel decaiga con medidas incongruentes, son los puntos por los cuales sí apoyo, entre uno que otro punto administrativo que no mencionaré.

Sin embargo sigo sin estar de acuerdo con el paro. Y externando esta opinión me han dicho de todo, que si estoy diciendo que mejor no hagan nada, que si no hacen eso entonces qué hacen para llamar la atención, que si no me preocupa el nivel educativo de mi país... Y no, la realidad es que no estoy diciendo que no hagan nada. También les aclaro que el propósito de  todo no es 'llamar la atención', sino lograr evitar que decaiga el nivel educativo del Poli, y sobra decir que me preocupa mucho el nivel educativo de México. Aprovecharé este renglón para decir además que los mexicanos son muy poco originales en sus movimientos de protesta. Marchas marchas marchas, paros, huelgas. Que a veces ni logran su objetivo. Y tratándose de estudiantes de una institución del tamaño del Poli, esperaba mucho más ingenio y creatividad a la hora de manifestarse. No se, si alguien le interesa le recomendaré este libro, a ver si alguien por fin lo lee y se le prende el foco de crear maneras creativas, auténticas y eficaces de protestar y lograr objetivos, ganándose además el apoyo del público, que aunque muchos no lo quieran creer (o no lo quieran ver o piensen que es lo de menos), pesa y mucho.

Estoy de acuerdo con esos puntos que mencioné del movimiento pero no con la manera en que lo manifiestan (salvo la marcha del jueves 25, aparte de impresionar, logró su objetivo: la directora del Poli tuvo que decir que los planes de estudio se iban a revisión, y el reglamento interno comenzó a comunicarse de manera más amplia). Para mi, el paro es la última opción, la que había que tomar luego de haberse movilizado de otras maneras (que dejo patente en la conclusión de esto), y es ineficiente por una razón importantísima: el medio para lograr resolver conflictos es el diálogo. Desde mi punto de vista el paro es el método más ineficaz para promover el diálogo, porque promueve también que entre los participantes se 'sectaricen' o se 'extremicen' las posturas, lo que cierra muchas veces los oídos al diálogo.

Las autoridades pueden tener muchísimos defectos. Es más, me atreveré a decir que gracias a su falta de disponibilidad para comunicar correctamente las cosas es que se provocó todo esto (sin eximir a la otra parte, ya hablaré de ello). Sin embargo, aún pueden poner en orden las cosas, si los estudiantes y su movimiento se saben mover para que lo hagan. Entre más se lleven al extremo las posturas, menos posibilidad habrá de arreglar esto con un sano diálogo y todos en santa paz. Y al final lo que puede suceder es una degradación del instituto. Y lo digo con preocupación. Dije que quiero mucho a mi escuela, y en verdad así lo siento.

En fin, acabo de ver (más bien escuchar) un par de videos que me movieron a escribir todo esto.

El primero es una 'filtración' de una sesión del Consejo General Consultivo del IPN (el órgano que discute todas las cosas que atañen a su gobierno, y que aprobó el miércoles 24 el nuevo reglamento). En el consejo, para quien no lo sepa, no sólo participa la directora del instituto (quien lo preside), sino también los llamados consejeros, un grupo de maestros y estudiantes de varios planteles del instituto, elegidos democráticamente por elección de parte de los miembros de dichos planteles. Así, tanto estudiantes como maestros tienen representación en el consejo, por lo que, en teoría (como todo en temas de democracia), se vela por los intereses de todos. El video (que más bien es audio), aquí:
Desde mi punto de vista, una sesión que muestra que en realidad, todo el Consejo estaba enterado de los cambios al Reglamento, y que acertadamente dice la directora, ellos NO informaron a la comunidad durante el proceso de revisión que se tuvo, desde julio me parece. Al menos aquí yo ya puedo señalar a un gran responsable: TODO el CGC.

El segundo video también es interesante. Muestra a una maestra (me parece que de UPIICSA), miembro del CGC informando a los maestros sobre la situación, cómo les afecta laboralmente, y asegurando que la aprobación final del Reglamento se llevó a cabo en sesión extraordinaria a la que a varios de los consejeros ni les informaron que se llevaría a cabo (si eso es cierto, me parece que debería de argumentarse alguna ilegalidad en el proceso, no lo sé).

Al final, puedo concluir unas cuantas cosas.

  • Primero que, al menos hasta ahora, el movimiento de los politécnicos tiene para mí razón de ser, en virtud al menos de la búsqueda de calidad educativa, o de la no pérdida de la misma. Muy a pesar de eso, estoy en contra del paro, aclaro otra vez.
  • Segundo que, estando contra el paro, no creo que la otra opción sea la inmovilidad. Hay posibilidad de presionar en el CGC. Si hay miembros como la maestra que habla en el video, y si la gente se pusiera a pedirle a sus consejeros que hiciera su chamba, (o si de menos leyeran a Saúl Alinsky) otra cosa sería...
  • Tercero y último, que hay un claro culpable de todo esto. Y no, no es la directora del Poli: es la comunidad politécnica en su totalidad. ¿Por qué? Porque tanto los consejeros NO informaron, como los representados por los mismos NO exigieron que les informaran. No sólo de esto, sino de todos los asuntos tratados en el consejo. ¿Cuántas veces los politécnicos repasan las resoluciones del consejo publicadas en la Gaceta oficial? ¿Cuántas exigen a su consejero que mueva tal o cual decisión en favor de su escuela? ¿O le piden cuentas de lo que sucede en las reuniones del CGC?


Así que, si algo podía haberse hecho para evitar esto (o mejor aún, si algo se puede hacer para evitar que vuelva a suceder), es justamente cambiar en aquello que TODOS los mexicanos adolecen. Una falta de cultura democrática que incluso enferma. Si en esto, que le inmiscuye directamente a los alumnos (o hasta a los profesores, no se) no se pusieron las pilas para pedirle a SUS consejeros (elegidos por ELLOS) cuentas claras, ¿cómo podemos esperar que algún día, o ya de una vez, le pidan cuentas a su diputado local, o al federal? Y si quisiera unirme al sospechosismo generalizado, podría decir también: una autoridad que quiera imponer sus intereses la tiene MUY fácil si cuenta con consejeros (o diputados) que no informan, y sobre todo con estudiantes/maestros (o pueblo) que no exigen. Al final es más fácil hacer una marcha y lanzarse a gritar consignas contra el presidente (o la directora del IPN, en analogía es lo mismo), que ejercer SU derecho democrático. Y lo mismo que no es el presidente (por muy Enrique Peña Nieto que sea) el culpable de la situación del país, sino todo su pueblo. Pobre México, por eso estás como estás...

O, como ya se dijo antes hace casi dos mil años... "El que es fiel en lo muy poco, es fiel también en lo mucho; y el que es injusto en lo muy poco, también es injusto en lo mucho."




---
Eru kaluva tielyanna

sábado, 5 de enero de 2013

Carta a los Reyes Magos, enero 2013

Queridos Reyes Magos:

Este año a pesar de algunos errores me esforcé mucho para portarme mejor. He intentado ser mejor papá y esposo.

Para el mundo les quiero pedir gente más comprometida con su vida y la de sus cercanos, pero también con los que no conocen.

Jóvenes mas despiertos y conscientes de su realidad, abiertos a percibir que la vida es más que la moda o el consumo, que sus puros gustos, que si mismos... Que hay Algo más y que los llama a encontrarlo, solo basta escuchar el silencio, escuchar al más pequeño e indefenso y salir de si...

Para los míos, que le pidan a El por salud, trabajo y sobre todo oportunidades para convivir y reír...

Si se les pega un buen juego de mesa, se los agradeceré ;)

¡¡¡Gracias!!!

martes, 1 de enero de 2013

Tu sabiduría

Tu sabiduría es sorpresa para el niño,
desafío para el que busca
y promesa para el que sueña.
Tu sabiduría es necia
para quien quiere ser Dios,
pero cierta para quien se sabe
humano,
finito y frágil.
Tu sabiduría es cruz donde se alza
el que ofrece un brazo amigo,
una palabra cierta,
un encuentro liberador.
Tu sabiduría es llave que abre
portones largo tiempo cerrados
y trae a nuestras estancias
un aire de libertad y gozo,
de comunión y fiesta.
Haznos sabios, señor,
con esa sabiduría tuya
de evangelio y reino,
de camino y mesa.

jueves, 4 de octubre de 2012

Haz de mi Señor un instrumento de tu paz

"¡Estoy hecho un lío, Señor! (¿Me oyes? ¿Estás ahí? ¿Existes?)... No me entiendo. No me sé.

¡Con lo fácil que sería ser como todo el mundo, seguir el camino normal, tener más de un par de zapatos y, de vez en cuando, celebrar un cumpleaños...!

Pero desde el día que tuve el coraje de decirme a mí mismo que no creía en lo que estaba haciendo, todo se me tambalea; mi fortaleza está casi derruída, como esta iglesia. Ya no sé en lo que creo ni lo que quiero hacer.

¿Por qué no dejar que todo siga adelante, decir las mismas mentiras que nos repetimos unos a otros, poner mis alegrías en conseguir de vez en cuando el último CD del artista de moda...?

Ahora ya es imposible. Aunque quisiera ya no podría engañarme otra vez. Y aquí estoy yo hoy, que quiero vivir a tope y no a sorbos... y ni siquiera sé por donde empezar...

Estoy hecho un lío, Dios. Y tú, ¿me oyes? ¿existes?

Tú eres el dios de mi niñez. El dios de las primeras mentiras; el "dios te ve" que justificaba tanta ley hipócrita de los mayores; el dios que estaba contento si yo me fastidiaba y que lloraba cuando me masturbaba... (bueno, cuando menos eso me dijeron).

El dios que justifica las guerras, que sanciona las injusticias
sociales, que enseña la sumisión, el acatamiento; que amenaza con la condenación eterna si te atreves a pensar por ti mismo... El dios de una Iglesia que emplea sus mejores energías en ver cómo seguir manteniéndose en el poder; el dios en quien no puede creer nadie medianamente inteligente al llegar a cierta edad... ¡Yo, como aquel señor, no soy ateo: solamente pido cosas dignas de creerse!

Pero tú eres también el Dios que salva el sentido de todo lo que existe: desde el humilde tronquito con una sola hoja hasta los trillones de estrellas regadas como un chorro de leche por los firmamentos perdidos.

Tú eres el Dios existente sin que nadie pruebe tu existencia. Tú no eres un político interesado en aumentar el número de votos, ni te aterroriza, como a las iglesias, que disminuya el número de creyentes, porque para ti lo de creyentes o ateos es algo secundario: todos somos hijos predilectos tuyos, carne de tu carne viva de Creador, hermosas criaturas pensadas una a una desde mucho antes de que el Universo estallase de alegría una mañana, borracho de vida.

En ti creemos los hombres cuando nos sentimos vivos y a ti te estamos viendo cuando vemos el latido de la vida todo alrededor.

Tú hiciste al perro que me mira con ojos candorosos preguntándome si lo voy a sacar a la calle; tú inventaste la lluvia que mansamente cae sobre los tejados de tejas rojas; tuya fue la idea de hacer crecer flores allí donde nadie llegará nunca a verlas, sólo por el gusto de que la belleza fuera gratuita.

De ti, Dios, tenemos semejanza cuando la madre sale corriendo para evitar que su hijito cruce solo la carretera; de ti cuando el hombre, después de un día agotador de trabajo, encuentra a los amigos en el
bar; de ti cuando en la calle la prostituta te agradece que le des fuego, sin repugnancia y sin lástima paternalista...

¿Qué importa que unos te llamen Dios y a otros simplemente se les llenen los ojos de lágrimas? Aunque para muchos tú no existas, todo lo bueno se parece a ti.

Estoy hecho un lío, Dios. ¿qué tengo qué hacer para no desperdiciarme? ¿Por dónde diablos se va a la gran alegría? No es el momento de seguir preguntándome si existes tú, sino de decidir cómo voy a existir yo.

"PADRE" te llamaba Jesús de Nazareth, que pasó por la vida haciendo el bien. Hasta que le exprimieron la vida cuando apenas empezaba a ser hombre. Todo por decirles a los poderosos, a los que deciden lo que
está bien y lo que está mal, que lo suyo estaba mal. Unos pescadores, un empleado de banca y unas cuantas mujeres menuditas le quisieron hasta el grito y la persecución. Porque se quitaba del sueño para andar curando gente, animando a los derrotados y llenando las tardes de paz y de esperanzas buenas.

EL era feliz así. ¿por qué? ¿qué tenía de grande su vida corta, rodeado de la escoria y la podredumbre de un rincón del mundo donde ni siquiera llegaban los periódicos? ¿Quién le pinchó en las venas esa locura de vivir abriendo nuevos mercados al amor? ¿Es que a la cumbre de la vida se llega yendo hacia abajo?

Jesús responde que aprovecha la vida quien pone manos a la obra para que haya vida en abundancia; quien no deja pobre con miseria ni enfermo con dolor ni doliente sin cariño. Que se vive en plenitud cuando se dedica la vida a producir vida (como el humilde asno que saca todo el día cubos de agua con la noria) y luego dejarlo todo más vivo cuando ya tú terminas....

Creer en ti no significa saberse el credo, sino pasar haciendo el bien. Ser cristiano significa hacerlo todo nuevo.

Que así sea en mí. Que esta sea mi locura. Yo engancharé mi vida a la tuya, como la manguera a la fuente y plantaré en mis entrañas la semilla de tu inmortalidad.



Haz de mí, Señor, un creador de cosas vivas;
haz de mí, Señor, un instrumento de tu paz.
Que donde haya odio, ponga yo amor;
donde haya ofensa, ponga perdón;
donde haya discordia, ponga unión;
donde haya error, ponga verdad;
donde haya duda, ponga confianza;
donde haya desesperación, ponga esperanza;
donde haya tinieblas, ponga luz,
y donde haya tristeza, ponga yo alegría.



Haz, en fin, Señor, que no me empeñe tanto en ser consolado, como en consolar;
en ser comprendido, como en comprender;
en ser amado, como en amar.
Porque dando es como se recibe,
olvidando es como se encuentra,
perdonando se es perdonado

y muriendo se resucita a la vida que no conoce fin.



Así rezó Francisco, el buenagente. Y cuando ya era casi de noche, cuando el silencio reposaba ya sobre cada piedra de aquella iglesita casi destruida el crucifijo de San Damián habló a Francisco y le dijo:

Francisco, ve y repara mi Iglesia, que como ves, amenaza ruina."




de "Oracion en San Damiano", del libro Francisco el Buenagente, de Cortés.

lunes, 9 de julio de 2012

Si yo fuera limpio de corazón descubriría…

Que todos somos obra de Dios, llevamos algo de bueno en el corazón.
Que todos valemos la pena, y nos queda algo de la imagen de Dios.
Que a todos hay que darles otra oportunidad.
Que todos somos dignos de amor, justicia, libertad, perdón.
Que todos somos dignos de compasión, respeto y de muchos derechos.
Que todas las criaturas son mis hermanas.
Que la creación es obra maravillosa de Dios.
Que no hay razón para levantar barreras, cerrar fronteras.
Que no hay razón para ninguna clase de discriminación.
Que no hay razón para el fanatismo y para no dialogar con alguien.
Que no hay razón para maldecir, juzgar y condenar a nadie.
Que no hay razón para matar, ni para el racismo.
Que todos los ancianos tienen un caudal de sabiduría, y los jóvenes, de ideales.
Que los adolescentes tienen un caudal de planes, y los niños, de amor.
Que las mujeres tienen un caudal de fortaleza, y los enfermos, de paciencia.
Que los pobres tienen un caudal de riqueza,
y los discapacitados, de capacidades.
Que hay razón para tender puentes, dar a todos la paz, trabajar por la paz,
amar y defender la creación.
Que hay razón para ser hermanos y seguir siendo amigos.
Que hay razón para sonreír a todos.
Que hay razón para dar a todos los buenos días, dar a todos la mano,
intentar de nuevo hacerlo todo mejor.
Que hay razón para seguir viviendo, para vivir en comunidad.
Que hay razón para prestar un oído a lo que dicen los demás.
Que hay razón para servir, amar, sufrir.
Que hay razón para muchas cosas más...



sábado, 23 de junio de 2012

En homenaje a Alan Turing, una máquina en Python

En homenaje a Alan Turing, en el centenario de su nacimiento, una máquina universal de Turing, implementada en Python.

El ejemplo toma una cadena de A's y B's arbitrarias y sustituye todo por A's. Cambiando las reglas de las transiciones y los símbolos usados se podría cargar cualquier máquina... Al final se produce una respuesta: Accept o Crash.

Tomada de: http://code.activestate.com/recipes/252486-turing-machine-simulator/

## {{{ http://code.activestate.com/recipes/252486/ (r1)
#!/usr/bin/env python
# (C) 2003 Ryan Phillips 
# Uses Python 3 
 
import sys

pr = sys.stdout.write

class MachineTapeException(Exception):
 """ Turing Exception Exception """
 def __init__(self, value):
  Exception.__init__(self)
  self.value = value
 def __str__(self):
  return self.value

class TuringErrorException(Exception):
 """ Turing Exception Exception """
 def __str__(self):
  return "Crash"

class TuringAcceptException(Exception):
 """ Turing Accept Exception """
 def __str__(self):
  return "Accept"

class MachineTape:
 def __init__(self, initialString=[], initialPos=0, blank="_"):
  """ The Tape uses a simple list.  It could easily be changed into a string if
      need be """
  self.tape = []
  self.pos = initialPos
  self.blank = blank
  self.initialString = initialString
  if len(initialString) > 0:
      for ch in initialString:
       self.tape.append(ch)
  else:
      self.tape.append(blank)

 def reinit(self):
  self.__init__(self.initialString)

 def move(self, check_char, changeto_char, direction):
  """ Only R, L directions are supported """
  # check to see if the character under the head is what we need
  if check_char != self.tape[self.pos]:
   raise MachineTapeException ("Tape head doesn't match head character")
  
  # at this point the head is over the same character we are looking for
  #  change the head character to the new character
  self.tape[self.pos] = changeto_char
  
  if direction == "L":
   self.move_left()
  elif direction == "R":
   self.move_right()
  else: raise MachineTapeException ("Direction is invalid")
 
 def read(self):
  """ return the character over the head """
  return self.tape[self.pos]
 
 def move_left(self):
  if self.pos <= 0: 
   self.tape.insert(-1, self.blank)
   self.pos = 0
  else:
   self.pos += -1

 def move_right(self):
  self.pos += 1
  if self.pos >= len(self.tape): self.tape.append(self.blank)
 
 def show(self):
  """ print the tape """
  for ch in self.tape:
   pr(ch)
  pr("\n"); pr(" "*self.pos + "^"); pr("\n")

"""
The program structure for the TM is created with a dictionary.
    To step algorithm:
 1. Check to see if the length of the string is zero and if we
     are in a final state
 2. If the currentstate is in the final states then raise an Accept
 3. If the currentstate is not in the program then raise an Error
 4. Check the head character
 5. If the head character is not in the program and in the current state then
     raise an Error
 6. Retrieve from the dictionary the dest_state, char_out, and movement
 7. set the current state to the new state
 8. write the tape, and move the head

Program Layout:
    [state][char_in] --> [(dest_state, char_out, movement)]
"""

class TuringMachine:
 def __init__(self, initialString, finalStates=[], blank="_"):
  self.blank = blank
  self.tape = MachineTape(initialString)
  self.fstates = finalStates
  self.program = {}
  self.initState = 0
  self.state = self.initState
  self.lenStr = len(initialString)
 
 def reinit(self):
  self.state = self.initState
  self.tape.reinit()
 
 def addTransition(self, state, char_in, dest_state, char_out, movement):
  if not self.program.has_key(state):
   self.program[state] = {}

  tup = (dest_state, char_out, movement)
  self.program[state][char_in] = tup

 def step(self):
  """ Steps 1 - 3 """
  if self.lenStr == 0 and self.state in self.fstates: raise TuringAcceptException
  if self.state in self.fstates: raise TuringAcceptException 
  if self.state not in self.program.keys(): raise TuringErrorException
  
  """ Steps 4 and 5 """
  head = self.tape.read()
  if head not in self.program[self.state].keys(): raise TuringErrorException
   
  """ Steps 6 and 7 """
  # execute transition
  (dest_state, char_out, movement) = self.program[self.state][head]
  self.state = dest_state
  try:
   """ Step 8 """
   self.tape.move(head, char_out, movement)
  except MachineTapeException, s:
   print s

 def execute(self):
  """ The TM will keep stepping forever until the TM accepts or rejects.
      This does allow for looping TM's """
  try:
   while 1:
    m.tape.show()
    m.step()
  except (TuringErrorException, TuringAcceptException), s:
   print s

if __name__ == "__main__":
    # machine to convert a string of A's and B's to
    # all A's and accept
    m = TuringMachine("ABBABB", [1])

    m.addTransition(0,'A',0,'A','R')
    m.addTransition(0,'B',0,'A','R')
    m.addTransition(0,'_',1,'_','L')

    # run the TM
    m.execute()
## end of http://code.activestate.com/recipes/252486/ }}}

martes, 19 de junio de 2012

Entorno No Integrado de Desarrollo (UDE)

Casi todos los desarrolladores que conozco acostumbran utilizar herramientas pesadas para hacer su trabajo.


Una de dichas herramientas, el IDE (entorno de desarrollo integrado) suele ser un programa grande que incluye en un sólo paquete las herramientas más comunes que un desarrollador puede llegar a necesitar.


Ese es el problema: asumir que el desarrollador VA a necesitar las herramientas, cuando en realidad sólo PUEDE que las necesite.


Por esa razón, tiene un tiempo ya que no utilizo IDEs para mi trabajo. O como leí alguna vez, utilizo un entorno NoIntegrado de Desarrollo (Unintegrated Development Environment).


Armar un entorno así no es nada difícil, y sólo requiere de un conocimiento concisio de las herramientas que en realidad tiene a su disposición un programador para hacer su trabajo, según el sistema sobre el que trabaje.




El primer elemento, el editor de texto, debe ser una herramienta sencilla y a la vez eficaz, que haga bien su trabajo. Suele ser una herramienta muy especializada, y aunque para muchos pueda parecer trivial, la realidad es que es la más importante de todas. Ideal que cuente con resaltado de sintaxis, y si es posible, integración con algunas de las otras herramientas (lo que haría del editor de textos, para efectos prácticos, un mini-IDE, pero eso es otro asunto). En gustos se rompen géneros, los hay para entornos gráficos de escritorio como para entornos de consola. Mi favorito, Emacs, tiene la posibilidad de integrarse con muchísimas herramientas más, además de poder ser programado y extendido (usando Lisp) para hacer mejor las labores que un editor de textos potente (propio de un programador) debe realizar. Claro, también está vim, gedit, en windows está notepad++, y un largo etcétera...


Anexo al editor de textos, no viene nada mal alguna herramienta para búsqueda de declaraciones, para localizar fácilmente los encabezados y declaraciones de funciones, clases y demás bichos que viven en un programa común. En Unix existen ctags y etags, que generan un pequeño archivo con las referencias para localizar estas declaraciones y que puede integrarse fácilmente a Emacs o vim.


Dependiendo el lenguaje de programación utilizado, por supuesto que se tiene que tener el compilador o intérprete adecuado al lenguaje en cuestión. Incluso los IDEs dependen de esta herramienta externa, pues los lenguajes de programación son algo tan vasto, que incluye librerías y extensiones por sí mismas, e incluirlas en un mismo paquete ya sería una exageración para el de por sí exagerado tamaño de los IDEs. No entraré en detalles de esta herramienta, ya que depende siempre del lenguaje en cuestión el tener el compilador o intérprete y las librerías adecuadas correctamente instaladas para su uso.


Y si el desarrollo que se está haciendo implica alguna plataforma específica, por ejemplo web, además se requerirá de algún entorno de desarrollo bien armado que incluya un servidor web, con cgi bien configurado, de forma que no sólo se escriba texto, sino que también se puedan hacer las pruebas adecuadas accediendo, por lo menos, a http://localhost , es decir a la propia máquina. Lo mismo aplica para motores de bases de datos y cualquier otro recurso del que haga uso el proyecto en el que se esté trabajando.


De la mano del proceso de compilación y lanzamiento para pruebas (o incluso a producción o 'deploy') del proyecto en que se esté trabajando, está la herramienta de generación y automatización de código. Compilar todo un proyecto puede ser un proceso complejo que incluya no solamente generar el código objeto (o como se llame en el lenguaje en particular que se use) de un archivo modificado, sino también puede haber dependencias entre los otros archivos, generación de código (por ejemplo para analizadores léxicos y gramaticales), producción de archivos de otros tipos (imágenes, documentación, etc.) que dependan directamente de otros archivos del proyecto. ¿Cómo hacer la vida sencilla a un desarrollador ante esta complejidad? La herramienta por antonomasia es make, que aunque se originó para proyectos en lenguaje C, es tan potente que puede ser usado para prácticamente cualquier proyecto de cualquier lenguaje, e incluso para cualquier otro proyecto que no sea de programación pero que requiera de la producción de archivos con base en dependencias.


Hablando del deploy, incluso este puede automatizarse de manera eficiente. Depende mucho del entorno en que el proyecto vaya a ser lanzado. Pensando por ejemplo en un proyecto web, si se cuenta con acceso SSH o FTP al servidor en donde será lanzado, se puede utilizar rsync. Algunos utilizan el versionador para estas labores, pero yo no lo recomiendo. Un versionador además de que incluye archivos ajenos al proyecto final ya lanzado, tiene un propósito específico. Recuerda: no uses un desarmador como martillo. Otros proyectos se lanzan en otros entornos o con otras condiciones. La idea en sí es encontrar las herramientas adecuadas que permitan estos procesos de manera sencilla, eficiente y precisa. Incluso simplemente copiar y pegar archivos puede servir, pero si se puede contar con una herramienta más avanzada (que mantenga por ejemplo un log del proceso del deploy, con capacidades de deshacer y revertir el proceso en casos de emergencia), mejor. Aquí, como en los otros casos, aplica también el principio básico de que, si no se cuentan con las herramientas adecuadas, habrá que crearlas. Por algo somos programadores, y por lo menos para el caso del deploy, algunos scripts en bash, sql, python y demás pueden bastar para lo que se requiere. 


Una de las herramientas más útiles que conozco para el desarrollo es el versionador. Con un versionador se puede, como su nombre lo indica, mantener versiones del código de un proyecto. ¿Para qué mantener versiones del código si de todas maneras lo que importa es el producto final? Por mil razones: a veces el desarrollo toma un camino que ya no agrada (porque funciona mal o porque cambian los objetivos) y es bueno poder regresar a una versión del código que no incluya esos últimos cambios; organizar equipos de desarrollo es muchísimo más fácil (en varios órdenes de magnitud) usando versionadores que administrándose como se pueda y dejando que todos hagan lo que deseen; los versionadores proporcionan la posibilidad de ramificar el desarrollo, dirigiéndolo hacia distintos objetivos cada rama, y posteriormente unificarlas de regreso, con los distintos desarrollos ya hechos de manera independiente. Hay muchos versionadores, pero los que valen la pena hoy en día son los llamados distribuidos, como Git (mi favorito) o Mercurial.


Y ¿qué desarrollo está completo sin un ciclo de depuración de errores? Alguna vez leí un artículo donde se mencionaba que el proceso de depuración (o debuggeo) conlleva cerca del 80% del tiempo de desarrollo de un proyecto. Así que más vale agarrarle el gusto a esta etapa del desarrollo, que está embebida dentro de todo el proceso, no es que vaya a encontrarse en algún lugar específico, al inicio o al final. Y se puede depurar haciendo simples prints de mensajes a consola, pero es mejor utilizar un debugger simbólico, como el que los IDEs acostumbran incluir. Claro está, dependiendo el lenguaje de programación usado, serán las herramientas de depuración con que se cuenten. Los proyectos en C y C++ pueden utilizar fácilmente gdb. Java cuenta con jdb. Python con pdb...


Dependiendo del lenguaje, sobre todo los interpretados, estos llegan a contar con una herramienta que a mi en lo particular me es muy útil. El shell del lenguaje donde se puede jugar libremente con el mismo, experimentar, probar cosas e investigar también. Python y Ruby, por ejemplo, tienen uno.


Y así puedo seguir enumerando más herramientas. Las que ya mencioné son las que más utilizo yo, pero existen otras. Por ejemplo, perfiladores de consumo de recursos (para la labor de optimización que, recuérdese, SIEMPRE se debe hacer hasta el final, y solamente una vez que ya se midió. El perfilador sirve precisamente para este propósito), o herramientas para armar pruebas (unitarias, funcionales, de estrés). Múltiples herramientas del sistema pueden aprovecharse para el desarrollo: buscadores de textos y de archivos, herramientas de diagnóstico, documentación, etc.




El punto es, como dije al principio, conocer todas y cada una de las herramientas individuales que suelen venir empaquetadas en un IDE, y así desmenuzadas, aprovecharlas al máximo y sin la obligación de tenerlas para no usarlas, con el consecuente consumo de recursos excesivo que los IDEs plantean. ¿O a poco no es cierto que Eclipse o Netbeans llegan a alentar tu máquina muchas veces?


Y además, se tiene la GRANDÍSIMA ventaja de poder elegir. Si un editor no te gusta eliges otro, si un debugger no te satisface, probablemente existan muchos más. Yo por ejemplo, cuando desarrollo en python, no utilizo el shell y el debugger por default que se incluyen con el lenguaje. Yo utilizo, como buen fan de la consola que soy, ipython como shell y ipdb (muy relacionado con ipython) como debugger. Es cosa de buscar, probar y elegir.




¡Ah! y no quiero terminar este post sin antes mencionar otro par de detalles de los UDEs (Unintegrated Development Environments). Conforme se quiera contar con más y mejores herramientas, se dará uno cuenta que el sistema sobre el que se trabaje también hará la diferencia entre PODER elegir, y TENER que elegir. Es decir, que la libertad que se tenga entre elegir por separado las herramientas para hacer un mejor trabajo de desarrollo, depende muy directamente del sistema sobre el que se trabaje. Y en algunos sistemas desafortunadamente, tanto la cantidad y disponibilidad de herramientas es más bien escasa (tanto que en muchos sistemas así a veces no queda de otra más que usar a fuerzas o a fuerzas un IDE), pero también las interfaces de desarrollo entre el proyecto y el sistema suelen ser pobres, defectuosas, mal documentadas, nada compatibles entre versiones diferentes del mismo sistema, en fin, que hacen de la labor de desarrollo lo que en inglés se conoce coloquialmente como un 'pain in the ass'. Yo por eso prefiero trabajar en un ambiente Unix. Es mi eleccion personal, sí, pero no sólo es mía, muchos desarrolladores estarán de acuerdo conmigo que trabajar en un sistema Unix es muchísimo más productivo, y hasta relajante, que trabajando en un Windows. Y claro, al decir Unix, abarco no sólo Linux o los BSDs, incluso Mac podría caer en esta categoría, lo malo es que no todos tenemos tanto dinero para pagarnos las herramientas, y además, en mi opinión, no es tan buen sistema para desarrollar: menos documentación, creo yo que menos gente en internet ayudando, más restricciones; es un entorno que, según leí alguna vez, podría compararse con un jardín amplio, grande y bello, pero que al final tiene bardas en los límites.


Y por cierto, acabo de mencionar casi por accidente el último recurso importante: internet. ¿Qué desarrollador puede preciarse de llamarse así si no sabe dónde y cómo buscar la información y documentos, ejemplos, ayuda que necesita entre otros desarrolladores (por ejemplo en foros o sitios dedicados a la consulta como stackoverflow) y que han enfrentado problemas similares? Simplemente para conocer más herramientas que cumplan las funciones ya enlistadas y otras, internet es fundamental. Yo soy de la opinión que un desarrollador no lo es más sólo por saberse un lenguaje o una tecnología de memoria al derecho y al revés. Esa función ya la cumple internet. Lo que se necesita es muchísima creatividad, y por supuesto un conocimiento y uso adecuado de las herramientas que convengan en el momento.