miércoles, abril 29, 2009
|
Debido a mi experiencia en la industria, y muchos de los artículos que publico acá en eliax, por lo general recibo unos cuantos emails semanales de personas jóvenes en ambiente universitario quienes me preguntan básicamente "¿Qué debería yo estudiar para mantenerme competitivo en el mercado de la informática?
La respuesta no es una, pero responderé de tal manera que espero pueda ayudar al menos a unos cuantos. Lo primero a entender es que "informática" cubre muchísimas cosas, pero voy a asumir que hablamos sobre todo de "programación". Sin embargo, aun en programación hay dos grandes vertientes que puedes seguir (o ambas si así lo prefieres): Software de Aplicaciones, y Software de Sistema. Por Software de Aplicaciones me refiero a poder crear (por ejemplo) programas para el mundo de los negocios, desde una simple agenda hasta portales de Internet, o desde un sistema de mensajería hasta una aplicación web para dar servicio al cliente. Por Software de Sistema me refiero mas a programas de bajo nivel, que están mas cerca del hardware, y que incluye desde crear un simple driver para un puerto serial, hasta crear módulos para un sistema operativo (como Linux). Así que voy a dar recomendaciones para ambos entornos por separado. Software de Aplicaciones Aquí creo que ante todas las cosas, se concentren en tecnologías web, y opcionalmente también en tecnologías móviles (aunque pronto será una necesidad ya que todo será móvil). Si lo que les enseñan en la Universidad es todavía como programar en Pascal o C, y no a como desarrollar aplicaciones web, no es que estén perdiendo el tiempo pero ciertamente están jugando en la cancha equivocada. Si donde estudias no te ofrecen las siguientes tecnologías que nombro a continuación, recomiendo que utilices la web (y en particular a Google) para aprender por tu cuenta. Hoy día no es esencial comprar libros, ya que hay muchísimos recursos gratuitos en Internet para casi cualquier cosa que te puedas imaginar. Así que para Software de Aplicaciones, recomiendo lo siguiente como mínimo: 1. Lo básico de páginas web estáticas. Es decir, HTML y CSS. 2. Lo básico de páginas web dinámicas con Javascript. 3. Alguna tecnología de generación dinámica de páginas web, como puede ser PHP, JSP, ASP o Coldfusion. 4. Integración de páginas web dinámicas con generación dinámica de páginas web, es decir, el concepto llamado "AJAX", que implica Javascript, HTML, preferiblemente CSS, y lo básico de XML y/o JSON (desde el punto de vista estructural, no tanto en detalle). Aquí también es bueno aprender de herramientas como JQuery y Prototype. 5. Saber Adobe Flash ayuda, pero personalmente trato de mantenerme alejado ya que rompe el esquema de aplicaciones web, aunque tiene sus usos prácticos. Sin embargo hoy día AJAX y HTML 5 están poco a poco reemplazando a Flash en muchas aplicaciones. 6. SQL, así como al menos una base de datos como MySQL o Postgress. 7. No está de mas saber Java, pues puede ser mucha ayuda para resolver ciertos tipos de problemas. Además con Java aprendes técnicas de programación mucho mas sofisticadas que con simple PHP o Javascript. 8. Dominar al menos una herramienta de desarrollo. Para desarrollo web recomiendo Dreamweaver. Para Java utilizo Netbeans pero Eclipse es igual de potente (sino mas, pero también requiere de mas esfuerzo configurarlo). 9. Saber un poco de Photoshop te puede sacar de muchos aprietos. 10. No está demás aprender técnicas de MVC para separar la lógica y el interfáz de usuario de tu aplicación (y de paso el mismo almacenamiento de los datos). 11. Algo útil también es Servicios Web (Web Services), lo que implica saber al menos los conceptos de WSDL y SOAP. 12. Otra cosa que puede venir útil es poder integrar con portales y servicios en la web, como Google Maps, Twitter, RSS, FedEx, Paypal, etc. 13. Es bueno conocer el concepto de un Contenedor de Aplicaciones, como lo hace J2EE o Coldfusion. Software de Sistema Crear Software de Sistema por lo general requiere de mayor experiencia por parte del programador, así como ser muy cuidadoso en el diseño, y poder saber técnicas avanzadas de optimización de bajo nivel (a veces hasta el nivel binario, haciendo trucos como un shift a la izquierda o derecha de los dígitos binarios para multiplicar o dividir). Aquí es muy importante conocer técnicas de código bien estructurado y documentado, así como tener un arsenal de todo tipo de utilidades y trucos para comparar archivos, diagnosticar tu código, medir el rendimiento, etc. A tal fin recomiendo como mínimo lo siguiente: 1. Conocimiento del lenguaje C y C++. Si piensas programar en Mac OS X, también debes mojarte las manos con Objective C. El lenguaje C y sus variantes por lo general serán tus herramientas principales. 2. Java. Aunque no puede hacer todo lo que hace C, sí se acerca mucho, y es bastante útil para crear aplicaciones de redes o de interconexión. En muchos casos a este nivel hay programadores que pasan mas tiempo en Java que en el mismo C. 3. Saber moverte en la linea de comando, sea el DOS/CMD de Windows, o el Shell de Unix/Linux/OS X. 4. A veces ayuda poder hacer Shell Scripts, sea en DOS, sh, Perl, etc. 5. Saber depurar tu código tanto en tiempo real como paso-a-paso. 6. Entender técnicas de optimización de código (profiling), utilizando la regla del 80/20 (concéntrate en optimizar esa pequeña parte del código que te da el 80% del beneficio, pues optimizar el resto es posible que no te incremente mucho el rendimiento). 7. Ayuda bastante conocer varios lenguajes y entornos de programación, como Pascal/Delphi, Visual Basic, PL1, COBOL, etc. No porque los vayas a utilizar, sino porque en este campo es posible que te topes algún día con código que debas entender y que no estará escrito en C. Además, notarás que cuando vayas por el cuarto o quinto lenguaje, que la mayoría se parecen unos con otros, y que los mismos patrones se repiten en casi todos. Por ejemplo, si estoy aprendiendo un lenguaje nuevo, y necesito hacer algo como buscar una palabra dentro de una frase, lo último que trato de hacer es escribir yo mismo el código, sino que trato de adivinar si existe una función que ya haga eso similar a como se hace con otros lenguajes. 8. Entender bastante bien lo que es un API, y como leer documentación sobre ellos, así como proveer tu propio API a otros programadores. 9. Dependiendo de tu campo, es importantísimo aprender sobre al menos Sockets y HTTP para programar aplicaciones de redes, así como entender la diferencia entre TCP y UDP, y cuando utilizar cada protocolo. 10. Haber programado al menos unas cuantas veces al mas bajo nivel posible (cuando menos con Assembly Language en un micro-controlador) es de una utilidad que no se pueden imaginar hasta el día que les haga falta. Por ejemplo, programar en C tiene muchas repercusiones a bajo nivel que se entienden mejor cuando uno sabe Assembly/Machine Language, ya que entienden mejor los conceptos de punteros, registros, etc. En mi caso, por mas alto nivel que sea el lenguaje de programación (como Coldfusion, Javascript o Java), siempre estoy consciente de lo que ocurre "tras bastidores" a bajo nivel, lo que me ayuda a diagnosticar problemas que de otra forma hubiera sido casi imposible o tomado muchísimo tiempo de investigación. Técnicas Avanzadas Como dije, esas son las cosas básicas que como mínimo recomiendo aprendan. Sin embargo, cuando entren al mundo laboral, en particular si terminan haciendo trabajos para grandes empresas o multi-nacionales, notarán que les hacen falta mas conocimientos específicos, y algunos de esos que me vienen a la mente ahora son: 1. Cómo integrar sistemas construidos bajo diferentes plataformas. Hay decenas de formas, que van desde integración a nivel de base de datos, hasta screen-scraping, o integración a través de archivos planos (bastante feo) hasta integración por servicios web. En este tema herramientas como Java y XML ayudan mucho en algunos casos. 2. Entender el concepto de un JIT (Just-In-Time Compiler) y entender cómo funciona. Esto es muy importante con temas de Java, .Net y mas recientemente con Javascript, y de paso les permitirá escribir código mucho mas eficiente. 3. Entender temas de Máquinas Virtuales (como la JVM - Java Virtual Machine), pues muchas veces no podrás corregir errores en tus aplicaciones si no tienes una intuición sobre lo ocurre tras bastidores (como por ejemplo, con el uso de la memoria). Así mismo, y relacionado a esto, entender los temas de Garbage Collection (Recolectores de Basura) en relación a las VM. 4. Es importante saber algunos temas básicos de seguridad, como Certificados Digitales, lo que es un Hash, cifrado simétrico vs asimétrico, SSL, etc. 5. Entender el concepto de un Connection Pool, que es un tema crítico para escalar aplicaciones a grandes cantidades de usuarios, en particular cuando se aplica a base de datos, aunque también aplica a objetos en memoria, y es muy utilizado en conexiones de redes. 6. Entender el concepto de Connection Polling (no confundir con Connection Pool) que en muchos casos nos ayuda a crear protocolos bi-direccionales cuando uno de dos extremos no puede iniciar una conexión al otro lado. Esta es la manera principal como funciona GMail y programas de chateo por páginas web. 7. Entender el concepto de un Message Queue, así como cuándo utilizar un Buffer en su mas amplia definición. 8. Entender conceptos de replicación de datos, servidores redundantes, etc. 9. Entender conceptos como DNS, DNS dinámico, etc. 10. Tu arma mas poderosa será la de copy-paste. No reinventes la rueda. Si alguien ya resolvió el mismo problema que tratas de resolver y ofrece su código o algún componente, utilízalo. Aquí Google y la documentación de tu entorno de desarrollo son tus mejores amigos. Para que tengan idea, yo diría que entre el 40 y el 80% del código que yo escribo hoy día (dependiendo del proyecto) lo copio de proyectos anteriores que he realizado, y el resto es código muy específico al proyecto que estoy trabajando. 11. Saber Linux te podría abrir muchas puertas y resolverte muchos problemas, sí como permitirte aprender de conceptos de bajo nivel en sistemas operativos. 12. Recuerden que algunos de estos temas ya los he tratado en eliax, por lo que pueden hacer búsquedas dentro del blog a ver si encuentran un punto de partida para aprender algunos de estos temas. Además es posible que quieran visitar la sección de Software en eliax. - Pues eso es lo que se me ocurre en estos momentos. Si se me ocurre otra cosa (o alguien pone algo interesante en los comentarios) quizás actualice la lista para agregar unas cuantas cosas mas. Por ahora, espero que esto sea de utilidad para algunos de ustedes... Y como siempre, pueden acceder a mas artículos similares en la sección de "Pregunta a eliax", y enviar sus preguntas por este medio. autor: josé elías |
31 comentarios |
Educación , Pregunta a eliax |
Comentarios
Añadir Comentario |
"Muy interesante, me encantan estas noticias que te sorprenden y te ponen a pensar...
Gracias Elías!"
Gracias Elías!"
en camino a la singularidad...
©2005-2024 josé c. elías
todos los derechos reservados
como compartir los artículos de eliax
Seguir a @eliax
Que buen punto has tocado hoy y respondes a una de las grandes dudas que tenemos, a la hora de buscar en que especializarnos.
Me han dado una beca, de capacitación actualización y practicamente estamos viendo de todo, iniciamos con sql, ahorita estamos con html, xml, css, validaciones, y continuaremos con uml, java script, java, hacer proyectos y hacer testing a estos.
La mayor parte de los puntos que mencionas, los hemos o los vamos a ver, pero gracias por los tips, ya que podre complementar el curso.
Saludos desde México.