Mejorando técnicas de programación
Igor Támara
Senior Software EngineerEn esta oportunidad ofreceremos algunos "trucos" para mejorar las habilidades de programación; en ocasiones previas hemos tratado el tema de elegir el primer lenguaje de programación y la conveniencia de comenzar a aprender a programar desde el colegio; si se sabe leer y escribir seguramente se puede aprender a programar, por lo menos los elementos básicos de la resolución de problemas.
Las competencias básicas para programar profesionalmente son: escribir con fluidez en el teclado, aprender a escuchar e interpretar, dividir los problemas en otros más pequeños, entender que el problema completo es más que la suma individual de sus partes, leer código de otros, publicar código y estar dispuesto a recibir críticas respecto a lo hecho.
Escribir con fluidez en el teclado
Fuimos dotados con 10 dedos y desde los años setentas se vio la necesidad de optimizar la comunicación entre nuestro cerebro y el computador para decirle exáctamente qué debe hacer y cómo debe hacerlo. Específicamente me refiero a teclados de "carne y hueso" no los teclados en pantalla, en los cuales es difícil alcanzar la velocidad que los teclados mecánicos. Algunas opciones para aprender a usar el teclado con los dedos optimizados son
Mario teaches typing, gtypist, tuxtype. Para que sea más divertido se puede jugar en red.
Aprender a escuchar e interpretar
Esto es justamente lo más complejo, es el primer paso para aprender a resolver problemas y en la época en que estuve en el colegio en matemáticas como estudiantes eramos expuestos a un problema en un texto, tal vez con algunos dibujos, ese problema debía solucionarse con operaciones matemáticas sencillas, una cosa es tener agilidad mental o memoria para haberse aprendido las tablas de multiplicar, pero otra cuestión mucho más compleja es emplear estas herramientas en contexto para dar solución.
Recuerdo que aunque sentía que era complejo lograr describir el proceso de solución de un problema, una vez que me entrené en este tipo de resolución de problemas, cada vez podía hacerme más ágil, de hecho, estos problemas conducen a olimpiadas matemáticas u olimpiadas de programación, en primaria participé en olimpiadas de matemáticas y algo también en secundaria, más adelante hablaremos más de olimpiadas.
Volviendo a resolución de problemas, dado un enunciado de un problema, debíamos hacer una T, en el lado izquierdo dábamos el plan de solución, planteábamos nuestra estrategia para solucionarlo y las operaciones que debíamos hacer, en el lado derecho ejecutábamos las operaciones matemáticas necesarias que habíamos interpretado y finalmente colocábamos nuestra respuesta.
La educación en Colombia requiere volver a tomar buenas prácticas para hacernos más próclives a resolver problemas, en tal medida para hacer una efectiva aplicación de saberes a la vida real se requiere que desde las matemáticas podamos concretar las soluciones desde años tempranos, más adelante habrá más tiempo para continuar construyendo niveles de abstracción necesarios para generalizar las soluciones. Tenemos que desde lo educativo garantizar que nuestros jóvenes saben leer, interpretar, hacer pequeños algoritmos de solución de acuerdo a cada una de las capacidades esperadas en sus edades específicas.
Dividir los problemas en otros más pequeños
Mi hermano me mostró cómo se programaba cuando yo tenía como 8 o 9 años, la idea es entrenarse con problemas muy pequeños y que ojalá tengan un significado. Después en la universidad en las estrategias de solución venía la frase célebre de "divide y vencerás", atacar problemas más pequeños es más sencillo y Unix fue pensado de esa forma, ofrecer un conjunto de herramientas que pueden unirse para solucionar problemas, por lo tanto, cuando uno aprende acerca de comandos pequeños en Linux, este tipo de herramientas constituyen pequeños bloques de Lego que pueden unirse, combinarse y generar resultados rápidos y replicables con facilidad, estas recetas de oneliners ahorran tiempo considerable.
El problema es mucho más que la suma de sus partes
Simplificar los problemas es una necesidad y al respecto hay un ejemplo muy interesante, la librería leaflet que destronó a openlayers, Google destronó a Yahoo, al mostrar a los usuarios una interfaz sencilla de búsqueda y no intrusiva con algoritmos innovadores en su momento. Las APIs bien escritas por dentro tienen toda su complejidad, pero al exterior exponen lo necesario para que la caja negra de la librería o el servicio haga lo que tiene que hacer. En tal medida el hecho de que Python traiga sus baterías incluídas en los principios fundamentales de la construcción del lenguaje de programación y su facilidad para interoperar con otras librerías, hace que sea muy sencillo.
Ahora bien, resolver las partes individuales de forma elegante no basta, porque generalmente se requiere una solución, con el siguiente esquema mostramos los órdenes de complejidad cuando varias partes interactúan.
Cuando hay una parte, no hay relación entre las partes(para ponerlo sencillo), Cuando hay dos partes hay una relación, cuando hay tres partes, hay tres relaciones, cuando hay cuatro partes hay 6 relaciones, cuando hay 5 partes hay 10 partes, cuando hay 6 partes hay 15 relaciones, cuando hay 50 partes, hay 1275 relaciones. En general cuando hay n partes, la cantidad de relaciones que hay es ((n x (n + 1))/2, es decir, el orden de complejidad aumenta de forma cuadrática.
Leer códigos, publicar y recibir críticas
El hombre es el gran imitador y como tal, puede aprender de sus propios errores, de los errores de otros o lo que los demás hacen, puede aprender buenas prácticas, el open source permite esto, la explosión de proyectos que se han ido popularizando y el compartir el código ha venido de la mano con la conectividad, con la necesidad de reconocimiento innata en el hombre, el entendimiento de romper la complejidad a partir de soluciones colaborativas ha hecho que sourceforge, github, bitbucket, google code hayan permitido que resolver problemas sea algo social y no individual.
Licencias permisivas como GNU GPL, y que garantizan que se privilegia el conocimiento por encima de la monetización pueden ayudar a balancear el acceso al código para aprender cómo solucionar y cómo no solucionar, desde el estado es posible lograr apoyo a las iniciativas para mejorar las condiciones laborales, un primer paso es exigir que los productos que compren y las soluciones puedan ser exploradas sin necesidad de DNAs que restrinjan la posibilidad de hacer soluciones propias y que garanticen la autonomía estatal. Cada vez que en una licitación del estado se exige que se emplee un software privativo se está eliminando la posibilidad de que el estado tenga autonomía y que se ate a un único proveedor impidiendo que nuevos actores accedan a ofrecer soluciones alternativas.
Hay dos proyectos para recomendar y que han entendido claramente que el aprender a programar es una actividad de doble vía y que prácticas tan buenas como: code review, pair programming, automated tests, assertions, optimisations, TDD sean una realidad:
exercism.io
Un programador normalmente encuentra el editor de texto que más le gusta: emacs, vi, sublime text, pycharm. Normalmente tiene una máquina de trabajo y un ambiente con el cual puede ser productivo. La línea de comandos debe ser algo natural, dado que escribir con diez dedos debe en general ser más rápido que una mano con un mouse. Exercism.io emplea la línea de comandos para poner retos en Go, Python, Ruby, Javascript y otros lenguajes.
checkio.org
Checkio.org es pythoncéntrico con una interfaz web atractiva y que permite tener el editor en línea, obtener badges, tener puntos por publicar, permite hacer comentarios, permite hacer traducción a otros idiomas de los problemas, plantear más ejercicios e involucrarse.
Como bono, hay un proyecto sumamente interesante Codespells, es imaginarse scratch con superpoderes para que fácilmente uno pueda ser un mago de la programación con batallas en línea al mejor estilo de RPG con FPS para programadores. Un futuro prometedor con el kickstarter exitoso con el que inició.
Referentes
- La imagen del banner
- El dibujo del ejemplo del problema lo proporcionó Sara, Gracias :).
Written by Igor Támara
A seasoned developer, Igor brings expertise in designing and building complex software systems. With a focus on quality and performance, they lead projects that drive innovation and deliver reliable solutions to meet user needs.