Últimamente se habló mucho en twitter sobre el ingeniero 10x que inició un gran debate sobre lo que hace a un buen ingeniero. Se mencionaron algunas cosas realmente estúpidas como «los ingenieros 10x odian las reuniones» y «los ingenieros 10x llegan tarde a la oficina» y «el fondo del portátil de los ingenieros 10x suele ser negro». En general, parece que algunas personas piensan que si eres lo suficientemente inteligente, está bien ser un gilipollas.
En Wix intentamos dejar a los gilipollas fuera de la puerta. Creemos que los ingenieros 10x no son sólo personas que pueden producir 10x más rápido que la mayoría de la gente, es más, son personas que pueden hacer que todo un equipo sea 10x mejor teniendo una influencia positiva en cualquiera con el que trabajen.
Mucha gente pasa gran parte de su carrera en convertirse en lo que consideramos un ingeniero decente. Significa que es un buen codificador, que puede resolver problemas y que domina el uso de las herramientas que tiene a su disposición como IDE, depurador, servicios y frameworks. Este artículo trata de describir lo que nosotros, en Wix Engineering, creemos que convierte a un ingeniero decente en un ingeniero 10x.
Una de las capacidades más importantes de un ingeniero es ser capaz de trabajar de forma independiente. En pocas palabras, esto significa saber siempre lo que tienes que hacer y rara vez estar en una situación en la que esperas que alguien te diga lo que tienes que hacer. No significa que seas capaz de hacer todo por ti mismo, sólo significa que sabes cómo desbloquearte y cómo desbloquear a otros en tu equipo de una manera limpia que crea una deuda técnica mínima. Por ejemplo, si te bloqueas por algún problema, encontrarás una solución para él, ya sea obteniendo ayuda de tus compañeros o resolviéndolo por tu cuenta. Los ingenieros independientes tienen la capacidad de llevar un proyecto desde la idea hasta la producción a través de todas sus fases. Son capaces de definir cuáles son las cosas que necesitan para poder llevar a cabo una tarea y saben cuándo levantar una bandera si necesitan ayuda.
Planificación
Lo más difícil que se ve a los ingenieros menos experimentados es ser capaces de tomar una gran tarea y dividirla en pasos más pequeños. Esto es importante no sólo para que seamos capaces de estimar cuánto tiempo lleva algo, también es una parte crítica de la construcción de software de alta calidad. Planificar correctamente significa que el desarrollador puede lanzar la versión inicial del producto lo antes posible y empezar a recibir comentarios antes. Planificar correctamente significa que se tiene un diseño del sistema desde el principio y que se tiene una buena imagen de lo que se va a hacer antes de lanzarse al agua. Planificar correctamente significa que no hay grandes sorpresas que rompan el diseño mientras se desarrolla. Un buen ingeniero debe ser capaz de desglosar una tarea, definir el diseño y las fases de lanzamiento, y proporcionar documentos de diseño y estimaciones para mostrar su plan.
Humildad
Esta es una difícil. Incluso los ingenieros más fuertes muchas veces tienen lugar para crecer cuando se trata de la humildad. Significa no estar enamorado de tus propias soluciones. Ser capaz de escuchar y aceptar las soluciones de los demás. Asumir lo mejor de tus compañeros y cuando veas algo que parece un error, intentar entender el razonamiento que hay detrás. Abrir las cosas a la discusión. Deja que la gente sugiera sus propias soluciones. Comparte tus ideas y no te preocupes por obtener el crédito por ellas. Es más importante que todos se sientan cómodos con una idea y sientan que ha sido un esfuerzo de equipo que el que todos sepan que ha sido tu idea. Sé sincero. Reconozca el mérito de los demás. Nunca temas decir que te has equivocado o reconocer que otra persona tiene razón. La gente respeta a las personas que pueden cambiar su opinión.
Reutilizar
Puede parecer trivial, pero la mayoría de la gente no entiende que la mejor manera de progresar es construir sobre el trabajo anterior. Los ingenieros menos experimentados siempre tienen la mala costumbre de pensar que la mejor manera de avanzar rápido es ignorar todo lo que ya existe y empezar de nuevo. Los buenos ingenieros siempre buscarán a fondo, aprenderán, preguntarán y comprenderán todas las soluciones existentes ya disponibles. Incluso si la solución existente es deficiente, tratarán de ver cómo mejorarla antes de decidirse a sustituirla. Nunca descartarán una solución existente sin investigarla a fondo y sin hablar con el propietario de la solución existente.
Mente de infraestructura
Como se ha descrito anteriormente, la reutilización del trabajo anterior puede tener un gran impacto en las personas. Esto significa que los ingenieros deben estar siempre atentos para ver si tienen una oportunidad de crear algo reutilizable. Lo más fácil de hacer cuando se tiene esa oportunidad es ignorarla. Hacer cosas reutilizables siempre le cuesta más al «creador» que hacerlas no reutilizables, por lo que muchos miopes ignoran los beneficios que ellos y otros equipos obtendrán en el futuro. Un buen desarrollador identificará las oportunidades para crear cosas reutilizables, sabrá cómo hacerlas reutilizables de la mejor manera, e invertirá el esfuerzo en hacerlo.
Domina tu dominio
La única manera de llegar a buenas soluciones es entender a fondo el producto en el que estás trabajando. Los buenos ingenieros no sólo tienen un profundo conocimiento del producto que desarrollan. También entienden todos los casos de uso, comprenden la motivación del producto y pueden tener fácilmente una conversación significativa con el director de producto, desafiar las decisiones y ofrecer alternativas. Saben cuáles son las características importantes y cuáles son las menos importantes y saben cómo priorizar en función de ello y ofrecer soluciones cuando sea necesario. Esto es importante no sólo para el producto en el que trabaja, sino también para cualquier producto con el que se integre.
Curiosidad
Los buenos desarrolladores deben tener una sana curiosidad que se extienda mucho más allá de los límites de su dominio. Esto es especialmente cierto para aprender cómo funcionan realmente las tecnologías subyacentes, pero es igual de importante entender los productos en los que trabajan otros equipos, su arquitectura y cómo se conectan como un sistema completo. Tener este contexto más amplio puede ser impagable a la hora de resolver problemas complejos y una fuente de inspiración.
Sin límites
A menudo vemos que el origen de las malas soluciones y la mala arquitectura tiene su origen en que la gente tiene miedo de cambiar cosas que están fuera de los límites de su caja. El desarrollador del cliente tenderá a resolver las cosas en el cliente, incluso si es mejor resolverlo en el servidor. El desarrollador de aplicaciones tenderá a resolver el problema localmente, incluso si la solución pertenece a la plataforma o a la infraestructura. La razón de esto es simple. Es más fácil no crear discusión con un equipo diferente, es más fácil tratar el mundo más allá de tu alcance como una caja negra, es más fácil tratar con el diablo que conoces. Pero los buenos ingenieros deben saber que forman parte de un gran sistema y que ninguna parte del sistema está realmente fuera de su alcance. Discutir el cambio de arquitectura con otro equipo es saludable y útil, y puede aportar su perspectiva. Ofrecerte a contribuir al cambio que necesitas es estupendo para crear confianza entre los equipos. Tocar un nuevo dominio es una experiencia de la que sólo puedes beneficiarte. Y lo que es más importante, cuando tus límites se vuelven más flexibles, significa que tu impacto crece. Siempre que evites salir de tus límites, date cuenta de que lo que estás haciendo en realidad es impedir que tengas un mayor impacto.
Responsabilidad / propiedad
Aunque no sea evidente a primera vista, muy a menudo si indagas en la causa raíz de por qué algún proyecto se retrasó o fracasó, encontrarás que se reduce a la propiedad y la responsabilidad. La gente siempre tenderá a culpar a su entorno: «Tuve que esperar a que otro equipo completara algo», «Tuve un problema con el sistema y nadie tuvo tiempo de ayudarme», «Recibí las definiciones demasiado tarde». Un buen ingeniero sabe que esas cosas son casi siempre excusas. Cuando eres el propietario de la tarea y la responsabilidad de realizarla recae sobre ti, tu mentalidad debe ser que cada problema que encuentres es algo que tienes que resolver. Si te bloquea otro equipo, ve a hablar con él. Ofrécete para trabajar en pareja en el problema y no «eches» la responsabilidad a otro. Si aún no tienes definiciones, haz algunas suposiciones sobre cuáles serán las definiciones. Es mejor avanzar un poco y luego hacer ajustes, que sentarse a esperar. Si hay algo importante que te está retrasando, sabe cuándo levantar la bandera y saber cómo solucionar el problema para que al menos puedas avanzar en otro frente. Nunca te encuentres en una situación en la que otra persona sea responsable de resolver tu problema, es al revés – tú eres responsable de llegar a la línea de meta y tienes que lidiar con los obstáculos en el camino.
Comunicación
Este es un verdadero cambio de juego y a menudo la cosa más crítica que debe tener un ingeniero para ser capaz de tener un gran impacto en todo el equipo. Ser capaz de comunicarse es la cosa más grande que permitió a la humanidad convertirse en lo que es, obviamente la misma cosa es igual de crítica para cualquier aspecto de la vida, incluyendo la ingeniería de software. Los buenos ingenieros deben ser capaces de explicar con elocuencia sus ideas y opiniones. Deben ser capaces de debatir de forma inteligente y respetuosa con sus compañeros. La comunicación no consiste sólo en hablar, sino que es aún más importante saber escuchar. No todo el mundo en el equipo será capaz de expresar sus ideas tan bien y un buen ingeniero debe ser paciente y hacer las preguntas adecuadas para entender lo que piensan los demás y ayudarles a ser escuchados. Todo esto es igual de importante tanto para la comunicación verbal como para la escrita, y lo que es más importante, no se trata sólo de conversar: la vida de los desarrolladores está llena de toneladas de formas de comunicación: documentos, presentaciones, documentación, comentarios de código, mensajes de confirmación. Incluso escribir código legible y elegir buenos nombres de variables es una forma de comunicación.
Trabajo en equipo
Este es uno de los lugares en los que incluso los ingenieros experimentados fallan muy a menudo y ni siquiera saben que está sucediendo. Piensa en todas las veces que has dicho «es demasiado complicado, déjamelo a mí». Piensa en todas las veces que has dicho «esta tarea es para una sola persona, añadir más gente no lo hará más fácil». Piensa en todas las veces que no tuviste tiempo para ayudar a otra persona y nunca hiciste un seguimiento, o arreglaste/refactorizaste el código de alguien sin pedir su revisión, o hiciste un gran cambio sin consultar con tu equipo. Hay montones de ejemplos. Y la cosa es que incluso para los ingenieros experimentados parece en este momento como lo correcto. Pero se trata de un pensamiento táctico que sólo da resultados a corto plazo. Si queremos conseguir grandes cosas debemos asegurarnos de que podemos colaborar en equipo. No es casualidad que el trabajo en equipo venga justo después de la comunicación. Son las cosas que nos hacen más eficaces, es biología básica. Los grandes ingenieros no sólo colaboran, consultan, aprenden, ayudan, se emparejan y respetan a sus compañeros, sino que también son mentores, señalan los problemas, se interesan y aprenden de todo lo que ocurre en el equipo y tratan de ser útiles de forma proactiva incluso en cosas que no les conciernen directamente. Los ingenieros asombrosos saben cuándo y cómo plantear diseños que faciliten la colaboración de muchas personas en cosas en las que se espera mucho trabajo.
Mantener la sencillez
La complejidad de una solución puede ser uno de los asesinos silenciosos de la capacidad del equipo para avanzar y adaptarse. Es como la presión arterial alta. Para el ojo inexperto parece que todo está bien y que todo funciona como se espera, pero en realidad, en el fondo, algo que no afecta directamente a ninguna funcionalidad principal te está matando lentamente. Los buenos ingenieros crean soluciones pragmáticas y código legible, aunque escriban más líneas de código. No demuestres lo «inteligente» que eres utilizando todas las capacidades del lenguaje, creando niveles de abstracción redundantes, o escribiendo una función en una línea que nadie más pueda entender o depurar. No seas un purista, no sobre-ingeniería de soluciones donde no es absolutamente necesario y nunca tengas miedo de tomar algo que ya es complejo y tratar de simplificarlo.
Priorizar
No podemos hacer todo. No podemos resolver todos los problemas. No podemos ganar todos los debates. No podemos hacer que todo sea perfecto. Tenemos un tiempo limitado y unos recursos limitados y debemos utilizarlos sabiamente. Esto significa que debemos ser capaces de distinguir entre lo que debemos insistir en hacer, lo que podemos posponer y lo que debemos ignorar. Los desarrolladores toman esas decisiones docenas de veces cada día. Cuando nos planteamos investigar un fallo, cuando nos planteamos hacer algún refactor, cuando nos planteamos manejar algún caso de uso o caso límite, cuando nos planteamos dar un rodeo a nuestra tarea prevista e incluso cuando invertimos tiempo en convencer a alguien de nuestra opinión. Los buenos ingenieros saben ser implacables a la hora de arreglar, investigar, indagar o insistir en las cosas que son realmente importantes. Saben tomar nota y volver a tratar algo más tarde si es importante pero no urgente. Y saben dejar algo en paz o aceptar la opinión de otra persona incluso si no están contentos con ella cuando no es realmente tan importante.
Gestión del tiempo
Como se ha mencionado anteriormente, la triste verdad de nuestra existencia es que estamos limitados por el tiempo. Los productos que desarrollamos eventualmente tienen que salir a la luz, tenemos plazos y estimaciones y objetivos que cumplir. Los buenos desarrolladores deben desarrollar no sólo una intuición para estimar el tiempo que llevan sus tareas, sino que también tienen que ser inteligentes sobre cómo dividir y ordenar sus tareas en partes aún más pequeñas. Tienen que gestionar sabiamente sus interrupciones y el cambio de contexto. Esta intuición de la estimación del tiempo es una parte inseparable de la capacidad de priorizar, como se ha descrito anteriormente. Por ejemplo, si algo es lo suficientemente corto, puede valer la pena hacerlo aunque no sea súper importante. Y si es demasiado largo, podría ser mejor posponerlo un poco o consultar con sus compañeros o gerente.
Conclusión
Como se mencionó anteriormente, creemos que los ingenieros que son expertos en todo lo anterior pueden hacer que el equipo sea 10 veces mejor al influir e inspirar a sus compañeros. Los grandes ingenieros deben recordar siempre que esto forma parte de su trabajo diario: influir e inspirar. Esto significa que deben encontrar tiempo no sólo para hacer su trabajo, sino también para ayudar a otros a hacer el suyo. Esto se presenta de muchas formas: ser mentor de la gente de tu equipo, crear recursos para educar a la gente, asegurarse de que todo está bien documentado, estar siempre abierto a explicar y emparejarse con la gente y mucho más. Ser un buen mentor y educador significa que no sólo ayuda a los miembros de su equipo a crecer, sino que también profundiza su comprensión de todo lo que hace y le da una nueva perspectiva sobre la claridad de las cosas, la complejidad del sistema y los lugares donde las cosas pueden mejorar.
Estas son las características de los ingenieros 10x, no sólo en su impacto individual, sino también en su impacto en todos los demás. Pregúntate siempre qué puedes hacer para que tu impacto sea mayor, siempre hay más espacio para crecer.