Esta semana mi club de lectura está leyendo un artículo titulado "What Makes A Great Software Engineer?", de Paul Li, Amy Ko y Jiamin Zu. En él describen su estudio, que consiste básicamente en entrevistar a 59 ingenieros de Microsoft sobre los rasgos que consideran necesarios para ser un "gran" ingeniero de software. Intentan aportar algo de especificidad a una pregunta que, de otro modo, sería ambigua, a saber:
¿Qué atributos consideran los ingenieros de software expertos que deben tener los grandes ingenieros de software?
¿Por qué son importantes para la ingeniería de software?
¿Cómo se relacionan estos atributos entre sí?
Los resultados de su estudio me parecen fascinantes y me han dejado muchas citas estupendas de ingenieros senior+. Me hubiera gustado (y lo mencionan casi al final) un enfoque interdisciplinar que conciliara estos atributos con los pensamientos y opiniones de otros campos, no sólo de los ingenieros de "big tech". Mencionan que esto puede ser un área adicional de investigación, que ahora me pregunto si se ha hecho. Este artículo data de 2015, así que ya han pasado casi 10 años (¡!). ¡Cómo pasa el tiempo!
No puedo repasar todos los rasgos que mencionan pero hay algunos que me parecen dignos de comentar. También me parece interesante que muchos de estos atributos se alinean muy estrechamente con ciertos valores de la empresa como los Principios de Liderazgo de Amazon.
Mejorar - no estar satisfecho con el status quo
Apasionados: intrínsecamente interesados en el área en la que trabajan.
Mente abierta: dispuestos a permitir que la nueva información cambie su forma de pensar.
Basados en datos: realizan y evalúan mediciones de sus acciones y del software.
Conocedor de las personas y la organización: informado sobre las personas que le rodean: sus responsabilidades, sus conocimientos y sus tendencias.
Ve el bosque y los árboles: considera las situaciones a varios niveles, incluidos los detalles técnicos, las tendencias del sector, la visión de la empresa y las necesidades de los clientes o de la empresa.
Maneja la complejidad: es capaz de comprender y razonar sobre ideas complejas y entrelazadas.
Crea un contexto compartido - moldea la comprensión de la situación por parte de otra persona a la vez que adapta el mensaje para que sea relevante y comprensible para la otra persona.
Honesto: sincero (es decir, no endulza ni da vueltas a la situación en beneficio propio).
Elegante: programas o diseños sencillos e intuitivos que los demás puedan entender.
Creativo: soluciones novedosas basadas en la comprensión del contexto, las soluciones existentes y las limitaciones de las soluciones existentes.
Mi favorito es Honesto. Creo que la mayoría de la gente es lo bastante perspicaz para darse cuenta de este tipo de situaciones: cuando alguien está encubriendo o culpando a otro de algo que es culpa suya. Creo que las personas que lo hacen no se dan cuenta de lo fácil que es ver más allá para la gran mayoría de la gente. En un mundo de política de oficina, esto erosiona tu credibilidad y hace que tu equipo pierda la confianza en ti. Incluso más que mentir o encubrir es la confianza que se gana simplemente apareciendo cada día y esforzándose al máximo. He aquí una cita del artículo con la que me identifico:
Cuando alguien confía en ti, parte de esa confianza consiste en decir: '¿Sabes qué? Sé que esta persona siempre dice la verdad". Como resultado de ello, cuando dicen que algo es bueno, les creo totalmente porque no están intentando tergiversar algo o hacer que parezca mejor o lo que sea.
-Director de desarrollo de servicios Windows
Otro atributo del llamado "gran" ingeniero que admiro es la elegancia en el código. Creo que esta es una de las razones por las que me gustan tanto los problemas de LeetCode: son problemas en miniatura dentro de un entorno limitado. No puedes simplemente forzar tu camino, y he estado en muchas bases de código donde ese ha sido el caso. No sólo causa confusión, destruyendo la legibilidad y la mantenibilidad, sino que es repulsivo a la vista. Todos tenemos calendarios apretados y eso está bien, incluso es comprensible. Pero cuando ves un trozo de código realmente superlativo puede ser algo digno de admirar, como una puesta de sol en la playa o contemplando el gran cañón. Me dan ganas de refactorizar cosas que sé que no son elegantes o sucintas.
Creo que esto también tiene que ver con la honestidad e incluso con principios de liderazgo como "insistir en los más altos estándares". Honestidad porque es como engañarse a uno mismo cuando no se hace un programa conciso de esta manera. Y, de nuevo, para ganarse la confianza (otro LP), comprometer código de este modo eleva el listón (vale, ahora me estoy dejando llevar) para todo el equipo. Da a los demás el permiso casi para llevar altos estándares a su trabajo. Esto me recuerda la cita de Marianne Williamson (la escuché por primera vez en la película Coach Carter):
...Y cuando dejamos que brille nuestra propia luz, inconscientemente damos permiso a los demás para que hagan lo mismo. Al liberarnos de nuestro propio miedo, nuestra presencia libera automáticamente a los demás.
Así que sí, realmente creo en esta característica. Y creo que afecta a muchas otras. De hecho, creo que muchas de ellas, al igual que los LP amazónicos, están intrínsecamente entrelazadas.
Mejorar y ser apasionado también son rasgos que me suenan como propios del "gran ingeniero de software". Como se dice en el documento, uno puede quedarse desfasado rápidamente si no está constantemente aprendiendo cosas nuevas. Además, hay mucho que aprender, aunque sólo sea para ponerse al día. Por supuesto, siempre habrá ciertos fundamentos intemporales o primeros principios. El hecho es que la informática y la industria de la ingeniería de software tienen una gran profundidad y amplitud.
No existe un camino real hacia la ciencia. Sin duda, la pasión aporta la energía necesaria para complementar el primer rasgo. Tiene que haber algún motivo mayor que el dinero, por ejemplo, que alimente el deseo de mejorar. De lo contrario, es muy difícil. Cualquiera que haya asistido a una clase sobre un tema que no le interesa puede sentirse identificado. Se convierte en un trabajo pesado. En cambio, perfeccionar un oficio que te gusta puede ser mágico.
Basarse en datos parece una obviedad, todo el mundo debería basarse en cifras y hechos reales en lugar de en corazonadas. A veces es difícil separar lo que uno siente de lo que le dicen los números, pero quizá ese sea otro tema para otro momento.
Conocimiento de las personas y de la organización: en mi opinión, este es un rasgo infravalorado que mucha gente pasa por alto. Es útil conocer los puntos fuertes y débiles de las personas que te rodean, las personas con las que trabajas. Si diriges un proyecto, eres más capaz de delegar tareas, y si no lo haces, eres más capaz de repartir tareas en un equipo. En cualquier contexto, como programador eres capaz de ver claramente a quién puedes pedir ayuda. Se trata de un rasgo fundamental, teniendo en cuenta que otro aspecto de la lista es la autosuficiencia. Es tan importante no estar siempre pidiendo ayuda a tu jefe como eliminar los obstáculos aprovechando a los expertos que ya conoces. Pedir ayuda es inteligente, darse cabezazos contra la pared no lo es tanto.
En cualquier caso, me ha gustado este artículo y aspiro a realizar estos atributos en mi propio trabajo. Eso, tal vez, sea un esfuerzo constante.
Comentarios