How to use Redis with MuleSoft. A quick start presentation.
Programmer visions
1. Visiones sobre el mundo de la
programación
José Manuel Ortega Candel
jmoc25@gmail.com
2. 2
1.Introducción
En este artículo voy a tratar la profesión de programador para intentar responder a las
preguntas que toda persona que se quiera introducir en este mundo debería hacerse en
algún momento. También comentaré los diferentes perfiles que podemos encontrar, así
como las cualidades que debe tener todo aquel que quiera desarrollar una carrera en un
campo tan amplio como es la programación. Comentaré aquellas metodologías que han
surgido en los últimos años para el trabajo en equipo y explicaré el concepto de
framework, en particular en aquellos aplicables en entornos Java/J2EE. Por último,
mencionaré los libros técnicos que todo programador debería tener como referencia en
su trabajo diario.
En ocasiones, se ha comentado que ser programador es una profesión vocacional para
la cual es necesario tener un talento especial y, como los lectores saben, es una
profesión donde la intuición, la imaginación, el pensamiento lógico y el orden juegan un
papel fundamental. También es cierto que hoy en día cada vez existen más herramientas
para facilitar el trabajo a los empiezan, y, gracias a la evolución en ingeniería del
software, algunas funciones de programación han sido automatizadas. De esta forma,
los programadores han ido asumiendo algunas de las responsabilidades llevadas a cabo
normalmente por los ingenieros de software.
Otra de las características a destacar, es que en esta profesión hay que realizar un
esfuerzo extra para mantenerse actualizado, y la formación es casi continua en la
búsqueda constante de la mejora, además, es tan importante formarse y conocer varios
de lenguajes de programación (alto y medio-bajo nivel), como conocer las metodologías
para trabajar en equipo.
En primer lugar, me gustaría comentar las claves y el conjunto de buenas de prácticas
que todo programador debe tener presente en su trabajo diario.
3. 3
2. Claves para ser un buen programador
Rodearse de buenos programadores, tanto en la formación como en el trabajo
diario.
Interesarte por la programación y estar constantemente actualizado.
Hablar con otros programadores y obtener feedback sobre cómo optimizar el
código que estás desarrollando.
Trata de programar con frecuencia, diariamente si es posible.
Trabajar en proyectos con otros programadores.
Al escribir código, intentar cumplir con los estándares de cada lenguaje.
Adquirir buenas prácticas y conocimientos sobre metodologías y patrones de
diseño.
Dedicar muchas horas y tener una gran disciplina y compromiso con tu trabajo.
Leer libros técnicos sobre programación que te ayuden a reciclarte y a conocer
nuevos lenguajes y metodologías de desarrollo.
Reutilizar todo el código que sea posible. Esto es lo que se conoce como “No
reinventar la rueda”.
A la hora de escribir código hacerlo de forma modular y escalable.
3. Buenas prácticas de programación
Conocer los fundamentos de la Ingeniería del Software.
Saber manejarse con estructuras y tipos abstractos de datos (listas, pilas,
colas, árboles, hashes).
Conocer los principios básicos de la Algoritmia.
Conocer patrones de diseño y aplicarlos a la resolución de problemas.
4. 4
4. Perfiles de programador
Dentro del ámbito de la programación podemos encontrar diferentes perfiles
dependiendo del entorno para el cual vaya destinada la aplicación (dispositivos móviles,
sitios web, procesos de una base de datos, aplicaciones de escritorio, aplicaciones dentro
de servidores, mainframes).
Debido a que las tendencias actuales del mercado son muy cambiantes, esto exige que
los programadores tengan la capacidad de aprender nuevos lenguajes de programación.
Es por eso hay que tener en cuenta todos los posibles perfiles junto con los lenguajes
más representativos con los que se relaciona:
Programador Entorno Web: Aquí hay que diferenciar la parte relacionada con
los aspectos visuales de la parte que ejecuta la lógica de negocio.
Front End - HTML,XML, JavaScript
Back End - Ruby on Rails/Python/Java/C#/PHP/Asp .Net
Programador Entorno Host/ MainFrames: Cobol, Perl, C/C++,Shell Scripts
Programador Entorno móvil: Android (Java), iOS (Objective-C)
Aplicaciones de escritorio: Visual Basic .Net, Delphi, Java
Base de datos: PL/SQL, Transact SQL
5. Lenguajes
No importa la cantidad de lenguajes que domine un programador, lo importante es
conocer los distintos tipos, así como los paradigmas y metodologías que los envuelve.
Cada uno de estos lenguajes tienen sus particularidades, pero todos pueden clasificarse
en pocas familias de lenguajes de programación (procedimentales, orientados a objetos,
funcionales, scripting, orientados a etiquetas).De entre todos los paradigmas, el más
importante es el de orientación a objetos, el cual es fundamental conocer hoy en día
para el desarrollo tanto de aplicaciones web como de escritorio.
En mi opinión, hay que conocer como mínimo uno de cada tipo de paradigma, ya que
en cada uno se ofrecen perspectivas diferentes para la resolución de problemas.
Un lenguaje de “scripting” (Ruby, Perl, Bash ShellScript) que te permita
automatizar tareas y desarrollar prototipos rápidos.
Un lenguaje de “medio/bajo nivel” (C) que te permita conocer cómo se
maneja la memoria, acceder a hardware directamente y que te permite entender
cómo funcionan las optimizaciones que luego se aplican en lenguajes de alto
nivel.
5. 5
Un lenguaje de alto nivel que normalmente usarás para trabajar (C++, Java,
Objective-C, Javascript, PHP, Python). Uno de los lenguajes que más está
destacando hoy en día es Python, que es un lenguaje de script y bastante rápido
si lo comparamos con otros más pesados como Java, con el cual se puede
programar empleando programación lineal, estructurada y orientada a objetos
tanto aplicaciones de escritorio como aplicaciones web.
6. Las cualidades de un buen programador
Más allá de controlar más o menos lenguajes, lo que hace un programador se diferencie
del resto es su capacidad para trabajar en equipo e investigar en nuevas metodologías
que pueda aplicar en su trabajo diario. Entre estas cualidades destacan:
6.1. Capacidad para trabajar en equipo
Todo programador debe ser capaz de trabajar de forma conjunta con otras
personas para el desarrollo de un proyecto en los términos de calidad, eficiencia
y plazos establecidos por el cliente. La programación, en particular, es un campo
en el que la comunicación con otras personas ha de ser fluída, abierta y efectiva
si se quiere obtener un buen resultado. El aspecto más importante es la división
de las tareas de forma equitativa y acorde a las capacidades y competencias de
cada miembro del equipo.
6.2. Gestión de proyectos
Sea cual sea la dificultad del proyecto, el líder deberá hacerse cargo del proyecto
y asignar el trabajo. El gestor de proyectos supervisará la planificación y el
análisis y se hará cargo del diseño del sistema, su programación y su
implementación. Un buen programador es el que es capaz de ir aprendiendo de
la gente que le rodea (analista, jefe de equipo) y a medida que va adquiriendo
experiencia tener responsabilidades cada vez mayores en los proyectos en los
que trabaje.
6.3. Idiomas inglés
La mayoría de documentación y libros están en inglés, por lo que es
fundamental conocerlo bien y saber manejarse con los aspectos técnicos básicos
de un lenguaje tales como la creación de variables, clases, objetos, funciones.
6.4. Competencia profesional
Todo programador ha de ser competente en una gran variedad de lenguajes de
programación, o al menos tener interés por aprender otros lenguajes además de
los que ya sabe. Formar un equipo de programadores competentes en diversas
áreas asegurará el éxito de cualquier proyecto.
6. 6
6.5. Resolución de problemas
Hoy en día es prácticamente imposible saberse de memoria un lenguaje al
100%, de forma que la tendencia es conocer la sintaxis que se emplea. Lo más
importante no es saber programar en un lenguaje y saberse el API de memoria,
sino estar preparado para resolver un problema en el lenguaje que en ese
momento se nos pida profesionalmente.
7. Habilidades más importantes para los programadores del futuro
Además de tener habilidades analíticas y de resolución de problemas, los programadores
se verán obligados a adquirir una serie de conocimientos y destrezas en función del
campo en el cual desarrolla su carrera profesional.
7.1. Conocer al menos uno de los "3 Grandes" (Java, .NET, PHP). Hoy en
día es imprescindible conocer al menos uno de los 3 grandes sistemas de
desarrollo: Java, .NET o PHP. A medida que los proyectos crecen y se van
añadiendo funcionalidades, vamos a necesitar conocer los frameworks y librerías
asociadas a cada sistema con profundidad.
7.2. Aplicaciones RIA - Rich Internet Applications. La tendencia en RIA es
conocer el uso de herramientas que faciliten la creación de aplicaciones web
como si fuesen de escritorio gracias al uso de tecnologías como HTML5,
JavaFX, SilverLight, así como las mejoras que se están desarrollando en los
motores JavaScript de los navegadores.
7.3. Servicios web. REST, SOAP, JSON son términos con los cuáles un
programador tendrá que manejarse cuando se introduzca en el desarrollo de
servicios web.
7.4. Habilidades de comunicación. Cada vez más, los programadores están
participando en las reuniones que no son de desarrollo , pero sí fundamentales
para obtener el feedback necesario para que nuestro trabajo cumpla las
necesidades del cliente. Para ello, es necesario mejorar las habilidades de
comunicación con nuestros analistas y jefes de proyectos.
7.5. Conocer nuevos lenguajes. Lenguajes como Ruby, Python o Groovy
todavía no están entre los grandes, pero cada vez son más populares gracias al
uso de frameworks como SilverLight y Grails.
7. 7
7.6. Metodologías ágiles. Los desarrolladores que tengan experiencia en trabajar
en equipo y en ambientes ágiles son muy demandados y van a serlo más en los
próximos años. El uso de metodologías ágiles como Scrum, Kanban, Extreme
Programming(XP),Test Driven Development (TDD),Lean-Agile, se están
utilizando cada vez más en los proyectos.
7.7. Desarrollo móvil. Existen varios enfoques en el desarrollo móvil:
aplicaciones web diseñadas para funcionar en dispositivos móviles, y
aplicaciones que se ejecutan directamente en los dispositivos y que han sido
programadas de forma nativa.
7.8. Conocimientos de Cloud Computing. Términos como SaaS (Software as a
Service) y aplicaciones en la nube son cada vez más populares y será necesario
conocer el funcionamiento de estos sistemas.
7.9. Proyectos Open Source. Otros de los aspectos que más ha crecido en los
últimos años es la posibilidad de colaborar en proyectos Open Source. Algunas
de las tareas a destacar son:
1. Traducir/Documentar, donde con pocos conocimientos técnicos
puedes ayudar a traducir las interfaces de usuario, pantallas,
botones, menús o comentarios en el código fuente. Otra
posibilidad es la realización o traducción de la documentación,
los manuales de ayuda o el sitio web del proyecto.
2. Reporte de errores, donde se requiere un mayor conocimiento
funcional de la aplicación ya que hay que determinar las
condiciones bajo las cuáles se produce el error.
3. Beta-tester, donde los programadores determinan cómo se va a
comportar el programa bajo distintas condiciones y casuísticas.
Su trabajo es probar los programas exhaustivamente e informar
todo lo que van encontrando en el camino.
4. Mejorar un sitio web, si controlas alguno de los gestores de
contenidos más usados del mercado como Joomla, WordPress o
Drupal es una excelente alternativa para terminar alguna sección
de una página que esté incompleta, corregir errores o
simplemente colaborar con la publicación de actualizaciones. En
este apartado también cabría incluir la posibilidad de mejorar el
posicionamiento del sitio haciendo tareas de SEO.
8. 8
8. J2EE: Java en la empresa
Las arquitecturas basadas en Java han tenido una gran evolución en el dominio
empresarial en los últimos años. Las razones principales de su éxito en la empresa han
sido:
Programación independiente del Sistema Operativo
Gran variedad de librerías existentes
Rapidez de desarrollo y en el aprendizaje
Fiabilidad y escalabilidad
Una de las mayores ventajas que aportan las arquitecturas basadas en Java es la
flexibilidad con respecto al desarrollo de las aplicaciones, en el sentido de que permite
comenzar el desarrollo de una aplicación en un entorno windows, y luego realizar la
subida a entornos productivos en servidores Unix/Linux, con las garantías de que la
aplicación se va a comportar de forma muy similar en todos ellos.
8.1. Herramientas y frameworks J2EE
El número de librerías que se han desarrollado para Java no lo tiene ningún otro
lenguaje a día de hoy. Existen multitud de librerías que nos permiten simplificar
muchas de las tareas que necesitamos realizar. Por ejemplo, la librería log4java
nos simplifica las tareas de generación de ficheros de logs.
Entre las herramientas que se emplean en proyectos Java/J2EE podemos
destacar:
Entornos de desarrollo: Eclipse, NetBeans, IBM WebSphere
Servidores J2EE:Tomcat,GlassFish,JBoss,WebLogic
Control de versiones/repositorios de código: CVS, SVN, Git
Gestión de proyectos :Jira, Quark, Confluence, Jenkins, Maven, Junit
Frameworks: Apache Struts, Spring, Java Server Faces, Enterprise Java Beans,
Java Persistence API, Hibernate
Los frameworks como herramientas de trabajo ofrecen un desarrollo ágil en el sentido
que te permiten abstraerte de funcionamientos a bajo nivel y poder centrarte en el nivel
funcional de la aplicación.
Uno de los frameworks más extendidos en el desarrollo de aplicaciones J2EE es el de
Spring, que cubre gran cantidad de posibilidades como configuración en ficheros XML,
facilidades para la creación de workflows (flujos de trabajo) y programación orientada a
aspectos (AOP).
9. 9
8.2.Metodologías ágiles en J2EE
El uso de metodologías ágiles como Scrum, XP se ha extendido en entornos
Java/J2EE en los últimos años, por ser las más adecuadas en entornos donde los
requerimientos de negocio son desconocidos o cambiantes.
Otra de las metodologías destacadas que también se utiliza mucho en entornos
donde hay cambios de forma contínua de requisitos es TDD (Test Driven
Development), donde el objetivo es desarrollar las pruebas a partir de los
requisitos y posteriormente se realiza el refactoring que permita pasar las
pruebas.
Para aplicar algunas de estas metodologías en el trabajo diario, una de las
mejores herramientas es trello, que permite organizar las tareas y realizar un
seguimiento de las mismas, así como visualizar los actores involucrados en cada
una de ellas.
8.3. Estructura proyectos J2EE
En cuanto a la estructura que tienen los proyectos que emplean arquitecturas
J2EE podemos destacar:
Departamento I+D: Se dedican a la investigación, innovación y desarrollo de
las nuevas tecnologías que formarían la parte de arquitectura. Dentro del mismo
habría un departamento de arquitectura que se encarga del desarrollo de una
arquitectura J2EE, utilizando algunos de los frameworks comentados
anteriormente.
Jefes de proyecto, analistas y programadores se encargarían de los análisis,
diseños, desarrollos, pruebas y mantenimiento del conjunto de aplicativos de la
empresa. Todos ellos emplearían como base la arquitectura ya desarrollada por
el departamento de I+D.
Es muy importante que toda aplicación empresarial separe la parte de
Presentación (Front-end) de la parte de lógica de negocio (Back-end).Es lo que
típicamente se conoce como MVC (Modelo Vista Controlador).
Este modelo de separación en 3 capas toma especial importancia en aplicaciones
donde evolucionan de forma independiente cada una de las capas, porque
muchas veces se solicita modificar la lógica interna de una aplicación sin que se
vea modificada la forma de presentar estos elementos y viceversa.
10. 10
La parte de front-end muchas veces resulta ser la parte fundamental de un portal,
pero en la empresa, en muchas ocasiones, nos encontramos que es al contrario y
que la gran complejidad de una aplicación se encuentra en los procesos de
negocio que se realizan en parte de back-end.
9. Libros técnicos
Título Autor Editorial
Clean Code: A Handbook of
Agile Software Craftsmanship(1)
Robert C. Martin Prentice Hall
Head First Design Patterns Elisabeth Freeman, Eric
Freeman, Bert Bates
O'Reilly
Pragmatic programmer: from
journeyman to master
Andy Hunt, David
Thomas
Addison-Wesley
Code Simplicity: The Science of
Software Design: The
Fundamentals of Software
Max Kanat-Alexander O'Reilly
Design Patterns: Elements of
Reusable Object-Oriented
Software(2)
Erich Gamma, Richard
Helm, Ralph Johnson,
John Vissides
Addison-Wesley
(1)Disponible también en español con el título: Código Limpio: Manual de estilo para el
desarrollo ágil de software
(2)Disponible también en español con el título: Patrones de diseño
11. 11
Para sentar las bases para ser un buen programador es fundamental aprender sobre
patrones de diseño y buenas prácticas de programación. Para ello, es interesante contar
con libros de referencia como “Clean Code” o “Patrones de diseño”. Estos libros
tratan de explicar que más allá de que el código compile, e incluso que funcione, está la
buena organización del código y su óptima implementación.
10. Conclusiones
La experiencia como programador te permitirá descubrir que al final todos los lenguajes
funcionan igual y que el objetivo final de todo programador es abstraerse del lenguaje
para la resolución de problemas y plantear soluciones a los mismos sin conocer a fondo
un lenguaje en concreto. Esta capacidad de abstraerte del lenguaje te permitirá pasar de
ser un programador, a otro cargo con mayores responsabilidades y hacer evolucionar tu
carrera un paso más allá. Los mejores programadores no son sólo aquellos que saben
más lenguajes ni escriben más código sino aquellos que además lo hacen pensando en
patrones de diseño, con unos algoritmos y aplicando técnicas de programación
avanzada.