Este artículo será especialmente útil para los ingenieros novatos, así como para aquellos que quieran cultivar el liderazgo en ingeniería, buscar el crecimiento y alcanzar nuevas alturas. Los candidatos también descubrirán qué se espera de ellos en las entrevistas técnicas y los criterios de selección empleados en estas entrevistas.
Existen diferentes enfoques para definir el conjunto requerido de habilidades para un programador. Los requisitos varían según la empresa, el proyecto y el equipo con el que trabaje. El más común define a un programador "Experimentado" como aquel que no solo conoce la teoría sino que trabaja exitosamente con problemas prácticos reales; sabe cómo encontrar soluciones a problemas no estándar.
Aparentemente, todos los programadores experimentados tienen una característica importante en común: la capacidad de buscar información relevante. Hay otras cualidades importantes, como el amor por la programación y el deseo de trabajar. Si alguien no tiene ganas de trabajar, incluso la experiencia y el talento impresionantes serán inútiles. En el trabajo, me crucé con aquellos que estaban bien versados en tecnología, pero que eran reacios a trabajar.
Las habilidades básicas del programador implican una buena memoria, la capacidad de concentrarse y aprender nuevas tecnologías y el pensamiento lógico. En resumen, un programador experimentado debe tener un "cerebro vivo" que funcione bien. No puedes seguir sin él. Estas importantes características determinan tu propensión a la programación como profesión desde la infancia.
El resto de las características que describiré se pueden dividir en dos categorías: conocimiento técnico y rasgos personales. Si el conocimiento técnico puede adquirirse en diversas capacitaciones y cursos y perfeccionarse en la práctica, las cualidades personales (o habilidades blandas) no son tan fáciles de adquirir si van en contra de la naturaleza de una persona. En cualquier caso, los programadores experimentados se abren camino y aprenden mucho en estas dos áreas.
Está claro que un programador experimentado está bien versado en una o más tecnologías y algunos marcos. Pero, antes de dominar una determinada tecnología, el programador adquiere conocimientos sobre la arquitectura básica de sistemas y redes, estructuras de datos y algoritmos; administración de sistemas, e Informática en general. Tanto los administradores del sistema como DevOps siguen este camino. En términos de programación como tal, es importante comprender las estructuras de datos y los algoritmos, las abstracciones de la tecnología y los principios de programación orientada a objetos.
Después de aprender un determinado lenguaje, un programador procede a estudiar marcos y bibliotecas. Estas son abstracciones superiores que unen otras más pequeñas. Para los desarrolladores de Frontend, son React, Angular y Vue.
Los siguientes puntos describen el funcionamiento interno del "cerebro viviente" de un programador ideal
🔴 Comprensión profunda de la tecnología y búsqueda del mejor enfoque
Un programador experimentado debe conocer varias tecnologías y aplicar los mejores enfoques. Este conocimiento no es superficial sino que se domina en la práctica. Un enfoque sistemático le permite ver el panorama general del proyecto; percibirlo como un todo en lugar de parcialmente, y luego elegir el mejor enfoque para su desarrollo. Los conceptos de productividad y eficiencia a veces se confunden. Puede terminar el proyecto rápidamente, pero cometer muchos errores, y la depuración llevará más tiempo que un cuidadoso proceso de desarrollo paso a paso.
La velocidad no siempre es un signo de calificación de Ingeniero Superior. En cambio, la orientación a resultados es una característica integral. La eficiencia de las acciones y movimientos pesa más que numerosas líneas de código y velocidad. Encontrar un enfoque para el desarrollo de proyectos en el que la calidad y la velocidad estén equilibradas está al alcance de un ingeniero experimentado.
🔴 Mantenerse atento a la UX
Un buen hábito de un programador es estar constantemente atento a la experiencia del usuario, pensando en cómo se verá el programa desde el punto de vista del usuario y si será conveniente y claro.
No es necesario ser diseñador para predecir cómo funcionará una característica. También será útil dominar las pruebas de código para evitar errores en el proceso de desarrollo.
🔴 Compromiso con el proceso técnico
Seguir el proceso técnico puede considerarse un buen hábito de cualquier programador, especialmente uno experimentado. Este es un matiz crucial. Antes de cambiar una variable o función, debe verificar dónde se está utilizando.
Es necesario profundizar en la documentación técnica; esto ayudará a evitar errores tontos y ahorrará tiempo y los nervios del Tech Lead. Bueno, las personas con experiencia saben esto y enseñan a otros 🙂
🔴 Escribir código legible con el que otros puedan trabajar fácilmente
Esta habilidad deriva de la anterior. Será fácil para todos trabajar en el proyecto dado que el proceso técnico se sigue a fondo. Recuerda que otros también pueden trabajar con tu código, por lo tanto, escribe como si lo hicieras por ti mismo. Su "muleta" puede retroceder como un boomerang. Es mejor probar y refactorizar regularmente su código, ser cuidadoso con lo que llama variables y funciones, y pensar en los demás.
Elegir la tecnología adecuada para el proyecto es una habilidad crucial. Los programadores experimentados a veces insisten en usar tecnologías a las que están acostumbrados incluso cuando el resto del equipo tendrá dificultades para hacerlo. En su lugar, debe tomar decisiones que tengan en cuenta a todo el equipo; consultar, discutir y coordinar sus acciones con otros.
🔴 Análisis cualitativo y desarrollo de la arquitectura
Para analizar y comprender cualitativamente la arquitectura, debe conocer la teoría y tener suficiente experiencia práctica. Un ingeniero sénior puede realizar un análisis completo de los requisitos y desarrollar una arquitectura de software con una implementación efectiva en varios niveles.
Al mismo tiempo, es esencial lograr un equilibrio entre la legibilidad del programa y la eficiencia del desarrollo. Para evitar problemas en la etapa de planificación, un programador experimentado conoce diferentes tecnologías y puede elegir la correcta.
🔴 Habilidad para explicar esquemáticamente
Para programadores experimentados, y especialmente para Tech Leads, la capacidad de explicar información sobre los principios de la tecnología gráficamente y utilizando diagramas simples es una habilidad muy útil.
Los cuadros, gráficos y diagramas brindan una visión holística tanto de la tecnología como del proyecto. El enfoque del sistema de visualización simplifica el trabajo de todo el equipo. De esta manera, Tech Leads puede transmitir la imagen completa a otros.
🔴 Creando un flujo de trabajo efectivo
Los ingenieros experimentados distinguen entre el desempeño del equipo y el suyo propio. Para aumentar la eficiencia del equipo, crean un flujo de trabajo o eligen nuevas tecnologías, como la implementación automática.
Además, intentan animar a otros programadores del equipo a aprender más y analizar sus errores durante la revisión del código.
Un programador experimentado es muy consciente de la importancia de lograr los objetivos comerciales y es capaz de equilibrar la implementación y la calidad del código. Después de todo, si profundiza en la calidad del código, una tarea puede llevar un mes y puede seguir rehaciendo las cosas hasta sus últimos días, llevando todo el proyecto a la perfección. Pero para que el negocio crezca, debe encontrar un equilibrio entre la calidad y los requisitos del cliente.
Hay programadores que se enfocan solo en tareas comerciales y llenan su código con 'muletas'. Solía trabajar en un proyecto, que tuvo que cerrarse por completo después de 2 años de desarrollo porque cada nueva característica tardó un mes en implementarse. Ese 'guiso' de enfoques y tecnologías era simplemente imposible de trabajar. Así es como el deseo de hacerlo más rápido conduce a tristes resultados.
Conocí a programadores que profundizaron en la calidad del código y se quedaron atascados en una tarea durante 2 meses. Honestamente, me sorprendió que mantuvieran sus trabajos. Al final, la tarea resultó ser insuperable. Eso significa que encontrar un equilibrio es vital.
El perfeccionismo está cerca de mi corazón. Sin embargo, tiene que haber un enfoque saludable sin exagerar las cosas. Por lo general, las personas no cambian. Incluso en las entrevistas, noto a esas personas y entiendo que trabajar con ellas será un desafío.
Los siguientes puntos destacan las ventajas del perfeccionismo saludable
🔴 Habilidad para trabajar en equipo
Por defecto, está claro que los jugadores de equipo son valorados en cualquier proyecto. Esto habla de su naturaleza de no confrontación y la capacidad de asumir responsabilidades, comunicarse y ser confiable.
Puedes tener tu propia opinión y seguir escuchando a los demás.
🔴 Confianza en tareas complejas
Los programadores experimentados tienen confianza, pero no son obstinados. No le temen a las tareas difíciles, porque ya han alcanzado un cierto nivel de experiencia y tienen el conocimiento técnico suficiente, lo que les permite hacer frente a las complejidades.
Los ingenieros experimentados pueden planificar un proyecto desde diferentes perspectivas, brindar buenos consejos y mantenerse orientados a los resultados desde el desarrollo del marco hasta la codificación. Esas personas son muy valoradas en el equipo; es un placer unirme a ellos en batallas profesionales. Siempre puedes aprender algo.
🔴 Deseo constante de desarrollar y encontrar la información necesaria
Una vez más, los ingenieros experimentados conocen bien varios marcos y pueden trabajar con numerosas tecnologías. Y para esto, necesita evolucionar constantemente y buscar oportunidades para aprender cosas nuevas fuera del trabajo. Las personas con experiencia aprenden rápidamente y captan las nuevas tendencias que son necesarias para su trabajo. Algunos ingenieros piensan que es suficiente aprender solo de sus propios errores. De hecho, en la práctica, obtienes muchos conocimientos, pero necesitas profundizarlos en base a las experiencias de otras personas. Hoy en día hay suficiente información en línea, realmente puedes aprender mucho.
Probablemente, dominar el dominio de un proyecto sería una ventaja adicional. Por ejemplo, si estás en un proyecto Fintech, se espera que comprendas el valor del software desde una perspectiva comercial y que conozcas ciertos procesos funcionales en esa área.
🔴 Habilidad para mantener el equilibrio
Cuando un proyecto está en desarrollo, pueden ocurrir varias situaciones imprevistas y pueden surgir errores. Cogen a programadores inexpertos por sorpresa y los acorralan. Los ingenieros experimentados saben que todo debe resolverse con la cabeza fría porque el pánico y los gritos no ayudarán. Aunque, tal vez, los errores fueron causados puramente por factores humanos.
Un programador experimentado encontrará una solución alternativa mientras mantiene el equilibrio. Es más fácil encontrar una solución no estándar a un problema con calma que emocionalmente.
🔴 Habilidad para compartir conocimientos y dar retroalimentación
Idealmente, los programadores experimentados comparten conocimientos con otros; participar en webinars, conferencias y hackatones. Compartir el conocimiento de un libro o la teoría de otra persona es una cosa, y contribuir con su propia experiencia, sus 'dolores' pasados, es otra. La creación de redes es realmente útil, aunque a algunos no les guste.
Un programador experimentado sabe lo importante que es dar retroalimentación sobre el trabajo de otros. Esto brinda a los jóvenes profesionales la oportunidad de comprender sus áreas de crecimiento potencial, qué corregir y qué errores evitar.
La retroalimentación oportuna se trata de una gestión transparente y una comunicación efectiva. Es bueno si los programadores en la posición de Team Lead entienden y practican esto.
🔴 Habilidad para admitir tus errores
Otra buena característica de un programador experimentado es admitir errores. Esta habilidad significa que uno sabe cómo asumir la responsabilidad. Los errores son una oportunidad para aprender una lección y adquirir una experiencia valiosa para el futuro. En lugar de asumir la culpa de los errores de otra persona, Tech Lead puede brindar información útil durante la revisión del código y decir cómo resolver un problema específico.
Los programadores experimentados definitivamente no tirarán a un junior 'debajo del autobús' y señalarán con el dedo la culpa del novato. Todo el equipo trabaja, y cada uno tiene su propia área de responsabilidad. Alguien está jugando y afecta a todo el equipo. Tener eso en cuenta hace que sea más fácil generar confianza y relaciones transparentes.
Los fallos pueden ser tanto técnicos como humanos. Por ejemplo, si un empleado no va a trabajar regularmente, es un factor humano.
En cuanto a fallas técnicas importantes, no encontré tales, porque no trabajé a menudo con programadores por debajo del nivel Senior. Obviamente, las posibles fallas de los ingenieros Senior y Junior se encuentran en diferentes dimensiones.
Yo lo llamaría un error al enviar código a un repositorio sin ejecutar una prueba. Lo mejor es automatizar este proceso, como se hace en nuestra empresa. Otro error es el código 'crutching'. A veces existe el deseo de hacer código rápidamente, pero si este proceso acelerado degrada la calidad, se hará evidente en el futuro.
Hay varios enfoques para la calidad del código. Los principios SOLID definitivamente deben ser considerados. Si realiza una función polimórfica, debe asegurarse de que no rompa las áreas donde ya se usa. Al realizar correcciones de código, debe considerar cuáles serán las consecuencias y cómo lo afectarán en general.
No seguir el proceso técnico es una falla del programador. En el contexto de mi equipo, está creando solicitudes de incorporación de cambios, ejecutando una prueba de calidad del código, realizando pruebas funcionales y comprobando las tareas que realiza usted mismo. Si sigue el proceso técnico diseñado en la empresa, las fallas se minimizarán. Sin embargo, debo admitir que no todas las empresas tienen los procesos correctamente configurados, y esto también puede ser un requisito previo para futuras fallas.
En general, creo que los fracasos de los mayores se derivan de la pereza y los fracasos de los jóvenes provienen de la inexperiencia y la falta de atención. Los errores de Juniors afloran donde menos los esperas. El trabajo de un Junior, como tal, es un fracaso continuo al principio, que debe ser corregido constantemente. Pero para eso están los Juniors.
La pereza de Senior parece estar acostumbrado a un proceso y confiar en él, pensando, "bueno, entonces lo arreglaré más tarde". A menudo no siempre termina bien, pero aun así termina mejor que en el caso de Junior🙂
Los programadores sin experiencia se pueden identificar en dos etapas: primero, durante una entrevista, y en segundo lugar, y lo peor de todo, durante el trabajo, si se perdió el "falsificador".
Preguntas que me ayudan a evaluar la experiencia de un programador:
Esta es la primera parte de las preguntas que ayudan a determinar qué tan bien informada está una persona y las perspectivas de trabajar juntos. Si un candidato se confunde en esta etapa, las cosas solo empeorarán.
Sucede que un programador tiene 5 años de experiencia y está bien versado en 10 tecnologías, pero cuando haces preguntas básicas de esta lista, es posible que no haya respuestas. Es probable que suceda lo mismo con un conjunto de preguntas del siguiente bloque.
Durante las entrevistas tecnológicas, no doy tareas algorítmicas complejas, porque la entrevista siempre es estresante y odiaría agravarla. Incluso si un desarrollador está acostumbrado a trabajar con ciertas tecnologías, es normal olvidar cómo realizar ciertas tareas; nadie es perfecto. La profundidad del conocimiento y la rápida resolución de problemas son las cosas en las que hay que centrarse.
En general, evaluamos tanto las habilidades blandas como las habilidades duras durante las entrevistas. El bloque técnico de preguntas difiere según la tecnología y el proyecto.
Algunos programadores tienen mentores que brindan asesoramiento y orientación. Yo no tenía todo eso. Estudié por mi cuenta y encontré la información necesaria por mi cuenta. Aunque recibí un título en cibernética económica y ya conocía los conceptos básicos, mientras leía la filosofía de Java, era difícil entender la nueva abstracción.
Hubo un tiempo en que los cursos de Java Rush me ayudaron mucho; todo se explicó fácilmente y pude practicar de inmediato. Pero no se trata de la parte delantera.
Esto es lo que me ayudó a convertirme en programador. Estudié el resto de la documentación técnica oficial, así como busqué información en cursos de video gratuitos. Eso fue suficiente para mi.
Al mismo tiempo, es un error pensar que obtener un título en un curso le abrirá la puerta a una empresa de TI. Sin conocimiento, este pedazo de papel no tiene sentido. Asistir a cursos por el bien de un diploma no tiene sentido.
Hasta cierto punto, puedes obtener información estructurada, pero debes recordarla y debe ser la base y el comienzo para tu crecimiento futuro. Una de las características de un buen programador es la capacidad de encontrar información de calidad.
Si puedes hacerlo, todo estará bien. Pero si esperas que alguien te lo explique, estás muy equivocado. Recomendaría el autodesarrollo y la búsqueda de cursos en línea disponibles. Y si ya trabajas como programador, puedes tomar cursos de Udemy, los que necesitas para tu trabajo.
Cuanta más experiencia gana un desarrollador, más se da cuenta de la importancia del desarrollo en el área de Liderazgo en ingeniería. Y esto no se trata sólo de aquellos ingenieros que ya gestionan equipos; pero también sobre aquellos que siempre están al tanto de las tendencias, aprendiendo cosas nuevas y desarrollando de manera integral sus habilidades duras y blandas para compartir su conocimiento y competencia con otros.