Archivo de la etiqueta: Soft Skills

El Triángulo de la Documentación de Código

Hace un tiempo propuse que deberías escribir código que se documente solo, y luego agregarle documentación. En el artículo original, escribí:

La idea de que “tu código debería de documentarse solo” no es un get out of jail free card para no documentar tu código. Las ocasiones en tu carrera profesional donde escribir documentación no agrega valor a tu trabajo son muy pocas. Tan pocas, de hecho, que no se me viene ninguna a la mente. ¿Tal vez cuando estás trabajando en un proyecto propio? Pero hasta Damian Conway dijo que “la documentación es una carta de amor que le escribes a tu yo del futuro”.

Hoy me encontré una idea que aumenta mi punto: El Triángulo de la Documentación de Código.

Este modelo mental nos dice que toda pieza de código está documentada en 3 dimensiones distintas, cada una respondiendo una pregunta muy particular.

  • ¿Qué?: Tu código, en sí, explica lo que estás haciendo.
  • ¿Por qué?: Los comentarios que le agregas a tu código, explican tu proceso de toma de decisiones y la razón de tus soluciones.
  • ¿Cómo?: El contexto dentro del cual estás desarrollando tu programa; la descripción original del problema.

Si te enfocas en escribir código que “se documente solo”, en un futuro no sabrás por qué llegaste a esa solución, ni cómo esa solución es apropiada para el problema original.

Recuerda, agregar documentación a tu código (en forma de comentarios, glosarios, RFCs, pruebas, etc.), no es una admisión que no fuiste lo suficientemente inteligente para escribir “buen” código, sino un acto de compasión. Demuestra tu interés porque la siguiente persona que modifique tu código pueda enfocarse en agregar valor al proyecto — y, muy probablemente, esa siguiente persona vas a ser tú.

GitHub Copilot ahora disponible de manera general

Hace un par de días, GitHub anunció que Copilot está ahora disponible de manera general.

Cualquier persona, hoy puede pagar $10 USD mensualmente por un compañero de pair programming creado con inteligencia artificial.

Buen momento para recordar lo que escribí hace casi exactamente un año:

Con el aspecto técnico resuelto (parcialmente) por inteligencias artificiales, las discusiones técnicas dejarán de ser la parte más importante del desarrollo. Los “programadores” ahora se dedicarán a tener discusiones sobre la ética y seguridad del código generado por la computadora. Las tareas técnicas serán resueltas, en su mayoría, gracias a la ley de Moore. Desarrollar software ya no se tratará de programar.

Aún habrá trabajos para escribir código, pero requerirán una alta especialización. Las personas que sigan escribiendo código lo harán para crear la infraestructura que soportará al resto del ecosistema: compiladores, IA, generadores de código, redes, etc.

Si estás en la industria del software y piensas que tu único trabajo es programar, heads up. Le acaban de poner fecha de caducidad a tu carrera. Y tienes de dos: o te pones a refinar tus soft skills, o comienzas a especializarte en tecnologías fundamentales.

El nombre que le pones a las cosas sí importa

“En las ciencias de la computación, hay únicamente dos problemas difíciles de responder: la invalidación de un caché, y cómo nombrar cosas.” — Phil Karlton

La cultura del Internet después modificó este refrán para incluir errores de enumeración de índices, pero esa es otra historia.

La realidad es que Phil tenía mucha razón: decidir cómo nombrar las entidades que manipulamos al programar es una de las tareas más difíciles de nuestra profesión. No por nada es tan común ver variables, métodos, clases, funciones, o cualquier otro elemento de programas, con nombres genéricos, como x, builder o manager.

Algunos argumentan que invertir tiempo en nombrar los componentes de un programa de manera coherente es una pérdida de tiempo. Las veces que he participado en discusiones donde se intenta impulsar la idea de que alguien debería poder diferenciar una variable X de otra simplemente por el nivel de sangría del código son demasiadas. Creo que desafortunadamente esto es otra muestra de lo inusual que es el sentido de compasión en la industria de la tecnología.

Al igual que agregar documentación completa a tus proyectos, usar nombres descriptivos y semánticamente correctos es un acto de compasión.

El lenguaje es el medio a través del cual los humanos razonamos sobre las ideas de nuestro día a día. Al compilador no le importa el nombre de tu variable, pero a la persona que va a leer y contribuir a tu código sí. Y como siempre, es importante recalcar que esa persona puedes ser tú mismo, años después.

Utilizar nombres descriptivos y semánticamente correctos para los componentes de tu programa no solamente hace más accesible la lectura de tu código. También te ayuda a razonar mejor sobre la solución que estás implementando. En algunos casos, hasta te podría salvar, potencialmente, de introducir vulnerabilidades de seguridad críticas.

Conforme he ganado experiencia colaborando en esta industria, he encontrado una relación, casi directa, entre el nivel de atención a la nomenclatura y semántica de los componentes de un programa y su fiabilidad.

Después de todo, me pregunto: si no te tomaste el tiempo de nombrar algo de una manera correcta y con sentido, ¿realmente habrás entendido el problema que estás intentando resolver?

Presentación: Cómo mis Soft Skills me volvieron mejor desarrollador

Tuve el honor de ser invitado a participar en el meetup de Perú .NET Development. Hablé sobre cómo los Soft Skills me ayudaron a convertirme en un mejor developer, y aquí está la grabación de mi participación.

Mil gracias a Julissa por la invitación.

Repite lo que dices, múltiples veces

Tomasz Tunguz, escribiendo en su blog:

Los grandes líderes entregan sus mensajes con palabras memorables que repiten constantemente.

Muchas personas creen que liderar significa dar órdenes. Pero no es así. Liderar significa lograr que un grupo de personas le pongan esfuerzo, atención y empeño a resolver un problema en particular. Y una de las mejores formas de hacer eso es tener un mensaje claro.

Tip para ser mejor líder: ponle nombre a tus iniciativas, y repítelas como si no conocieras otra palabra.

¿La carrera de un desarrollador de software se termina a los 35?

Cuando hablo de Soft Skills con “programadores de hueso colorado”, la reacción más prevalente es la de “¿por qué dejaría de programar, si es lo que más me gusta en la vida?” Pero la medida en que te guste algo no es siempre indicativo de los ánimos que tienes de hacerlo.

Este artículo explora lo que sucede con algunos desarrolladores de software cuando cumplen 35 años. Esta es una edad interesante porque, digamos, si iniciaste a programar en tus veintes, a los 35 es probable que ya tengas una década, o más, de experiencia. 10 años haciendo lo mismo es suficiente tiempo como para comenzar a cuestionarte si te ves haciéndolo por otros 10. Para algunos, la respuesta es sí. Para otros, como yo, la respuesta es un resonante no.

Algunas de las conclusiones a las que llega el autor:

  • Dejas de llamarte “programador” y comienzas a especializarte en resolver cierto tipo de problemas para el mejor postor
  • Pones tu negocio o startup
  • Te sales de la industria completamente

Mi objetivo con Soft Skills para Devs, y con este Newsletter, es ampliar el panorama de los desarrolladores de software de LATAM. Lo que quiero es ayudarte a que desarrolles habilidades que te permitan tener opciones para hacer un cambio en tu carrera cuando ya no quieras programar. ¿Estás lista?

Enlace: https://www.dottedsquirrel.com/dev-careers/

Las 4 fases del conocimiento: aprende a identificar en cuál estás

La semana pasada participé en un taller donde aprendimos el valor de escuchar sin intentar resolverle los problemas a otras personas. En la explicación que dio el facilitador, compartió un concepto que me voló la cabeza: las fases del conocimiento.

Durante el taller, usó esta idea para recalcar la importancia de mantenerse receptivo ante los sentimientos de los otros.

No lo había escuchado nunca, pero se me hizo una forma extremadamente práctica de entender cómo es que el conocimiento se vuelve parte de nuestra vida. Y hoy te quiero compartir ese concepto para que lo utilices cada que quieras aprender algo nuevo.

El conocimiento puede existir en 4 fases dentro de nosotros: Punto Ciego, Aprendizaje, Aplicación y Encarnación.

Las fases del conocimiento: Punto Ciego, Aprendizaje, Aplicación y Encarnación

Cada una de estas 4 fases se vive de manera consciente o inconsciente.

  1. Punto Ciego: Inconsciente. No sabes lo que no sabes. Asumes y supones, pero no te cuestionas por qué de las cosas. Simplemente, aceptas la realidad tal cual. Caes en dogmas y vas por la vida sin preocuparte por los efectos de tus acciones en el mundo que te rodea.
  2. Aprendizaje: Consciente. Por alguna razón, te diste cuenta de tu punto ciego y estás buscando, de manera consciente, expandir tu conocimiento. Estás estudiando, investigando, encontrando maneras de desbloquearte. Haces preguntas, investigas y te vuelves más receptivo a nuevas ideas.
  3. Aplicación: Consciente. Estás cristalizando tus aprendizajes de la fase pasada. Tomas lo que estudiaste, lo que aprendiste, y lo aplicas para terminar de asimilar el conocimiento. La aplicación de lo que has aprendido, a su vez, genera más preguntas. En esta fase es donde descubres tu propia versión de la verdad.
  4. Encarnación: Inconsciente. Lograste dominar tu craft y ahora puedes ejecutarla sin pensar — logras aplicar tu conocimiento de manera inconsciente. En esta fase es donde el conocimiento se vuelve sabiduría. Vuelves a no saber por qué sabes lo que sabes.

Si tienes la suficiente astucia, te darás cuenta de que este no es un proceso lineal, sino cíclico. Cuando logras encarnar el conocimiento, en tu mente se libera espacio para poder ponerle atención a otros aspectos de tu vida. Es ahí donde descubrirás más puntos ciegos, y podrás comenzar el camino de nuevo.

Esta forma de pensar también encaja perfectamente con el efecto Dunning-Kruger (el inverso del síndrome del impostor): “mientras menos sabes, más crees que sabes.” Te hice una gráfica.

La próxima vez que rechaces una idea, pregúntate:

  • ¿Es este mi punto ciego?
  • ¿Hay algo más que pueda aprender de este tema?
  • ¿Podré aplicar lo que aprenda de esto?

Cosas que no te enseñaron en la escuela, pero debes saber para trabajar en la industria del software

A continuación te comparto cosas que no te enseñaron en la escuela, pero que debes de saber si quieres trabajar en la industria del software.

  1. Tú te pones tus propias metas. En la escuela tenías la comodidad de llevar un “plan de estudios”. Sabías lo que seguía en cada paso. Acá afuera nadie va a entregarte un plan de estudios para tu carrera profesional. Tienes que definirlo por ti misma.
  2. No tienes que pedir permisos. ¿Quieres aplicar para un trabajo? ¿Te urge cambiar de tecnología? ¿Te gustaría ganar en dólares y vivir en LATAM? ¿Tu sueño es trabajar para un unicornio? ¿Lo que quieres es pasar más tiempo con tu familia? Date. Nadie te detiene.
  3. Debes de tomar decisiones por tu cuenta. En la escuela te condicionaban a aprender una metodología preestablecida. Salirte del protocolo era castigado. En la vida real tienes que aprender a tomar decisiones y a hacerte responsables de sus consecuencias. Nada más.
  4. Puedes irte en cualquier momento. Tenía un profe que se quejaba de los alumnos diciendo “es que ustedes creen que las cosas van a ser como ustedes quieran”. ¿Y por qué no? Si estás en un trabajo o situación que no te favorece, ¿para qué te quedas? No te pongas la camiseta.
  5. Se espera que sepas colaborar, no que te sepas todos los lenguajes de programación del mundo. Saber más lenguajes de programación solo significa que sabes más lenguajes de programación. Aprende a resolver problemas colaborando — técnicos, de negocio, de usuario.
  6. Saber hacer la pregunta correcta es más importante que ser una enciclopedia de conocimiento. Expandiendo en el punto anterior un poco. “No es la respuesta de StackOverflow, es que sepas lo que tienes que Googlear para encontrarla.”
  7. Programar es un medio para resolver problemas, no un fin. Sí, yo sé que es bien divertido programar. Te aconsejaría que no te clavaras únicamente en eso. Puedes programar toda la vida y no resolver ningún tipo de problema. Y te van a pagar por resolver problemas.
  8. Una solución que es correcta el día de hoy, mañana puede ser considerada ineficiente. Yo creo que en software no hay soluciones “exactas”, sino soluciones “ideales para la situación actual, con el conocimiento que tenemos”.
  9. Existen lenguajes más aptos para resolver ciertos tipos de problemas. Hay desde “lenguaje especializado” que es complicado de aprender, pero te dará soluciones compactas, a “lenguaje genérico” que es fácil de aprender, pero será lejos del ideal para resolver todo.
  10. Mientras más “escalas” de posición, se trata menos del código y más de las personas. Las habilidades más valiosas de alguien considerado “Sr.” son las sociales y de liderazgo. Gente que programe “bien” hay un montón.
  11. Necesitas una red de apoyo. Sí o sí. Rodéate de gente que te quiera ver crecer y que comparta tus principios y valores.
  12. Aprende a valorar tu trabajo. Costo ≠ Valor.  No cobres por el esfuerzo físico que lleva hacer una tarea. Cobra por el valor del problema que estás resolviendo.

Originalmente compartí este hilo en Twitter, donde también puedes seguirme.

Trabajo remoto: encuentra uno antes de que sea demasiado tarde

Deberías de buscar trabajar de manera remota tan pronto como puedas en tu carrera.

Muchos piensan que para trabajar de manera remota necesitas estar en el pináculo de tu carrera. Que la progresión es Jr., Mid., Sr., trabajo remoto. Pero la realidad es que para trabajar de manera remota se necesitan más soft skills que conocimientos técnicos. Te lo dice alguien que nunca ha trabajado en una oficina en toda su vida.

Trabajar de manera remota no solamente es atractivo porque (probablemente) te pagarán en una moneda extranjera. Aunque sea bastante relevante para tu calidad de vida, hay algo mucho más profundo a lo que me gustaría que le prestaras atención: trabajar de manera remota es un ejercicio de paciencia, tolerancia y humildad. Tendrás la oportunidad de trabajar con personas de todo el mundo, con pasados completamente diferentes al tuyo, motivaciones diametralmente opuestas y habilidades que ni siquiera podrías haber imaginado que se podrían obtener.

Al trabajar de manera remota te expondrás a otras maneras de resolver problemas. Ideologías de trabajo que tal vez no hagan sentido para ti; principios y valores que harán cuestionarte si estás haciendo lo suficiente.

Es por eso que es tan importante que tengas esta experiencia tan pronto como puedas en tu carrera. Porque así no tendrás un marco de referencia de “la forma correcta” de hacer las cosas. Estarás menos viciado, y será mucho más fácil adaptarte al cambio sin juzgar el proceso. Desarrollarás habilidades que te ayudarán a ser mucho más eficiente, productivo y tolerante. Y más que una tecnología o lenguaje de programación, la base de tu carrera será tu tolerancia, eficiencia, adaptabilidad y compasión.

Como dice Seth Godin, la tolerancia crea resiliencia en los humanos. Tolerancia a diferentes habilidades y preferencias nos ayuda a trabajar con diversidad de pensamiento, técnica y experiencia. La combinación de estos factores produce mejores resultados al final del día.

Así que no, no te esperes a ser el mejor en cierta tecnología para buscar un trabajo remoto. Exponte al reto.

Gana perspectiva antes de que encuentres una “forma correcta de hacer las cosas” que funcione únicamente en tu burbuja.

GitHub Copilot: si solamente sabes programar, tu carrera tiene fecha de caducidad

Hay personas en esta industria que reducen su trabajo a algo meramente mecánico: escribir código.

Lo que uno como desarrollador de software está buscando constantemente es la automatización de tareas mecánicas y manuales. La ironía es que, en sí, programar también es una tarea mecánica y manual. Y como tal, eventualmente también será automatizada.

Hace unos días GitHub presentó Copilot — un servicio que prácticamente programa por ti. Lo único que tienes que hacer es describir a grandes rasgos qué es lo que quieres hacer. Copilot genera el código que tú habrías escrito.

Naturalmente los memes no se hicieron esperar. Tampoco las discusiones sobre si el código que está generando esta herramienta cumple con licencias de distribución adecuadas. Pero muy pocas personas se pusieron a ver lo que acababa de pasar: los soft skills en desarrolladores de software acaba de volverse mucho más valiosos.

La tendencia es clara. La verdadera ventaja competitiva para un desarrollador de software no será la parte técnica, sino las habilidades interpersonales.

Con el aspecto técnico resuelto (parcialmente) por inteligencias artificiales, las discusiones técnicas dejarán de ser la parte más importante del desarrollo. Los “programadores” ahora se dedicarán a tener discusiones sobre la ética y seguridad del código generado por la computadora. Las tareas técnicas serán resueltas, en su mayoría, gracias a la ley de Moore. Desarrollar software ya no se tratará de programar.

Aún habrá trabajos para escribir código, pero requerirán una alta especialización. Las personas que sigan escribiendo código lo harán para crear la infraestructura que soportará al resto del ecosistema: compiladores, IA, generadores de código, redes, etc.

Si estás en la industria del software y piensas que tu único trabajo es programar, heads up. Le acaban de poner fecha de caducidad a tu carrera. Y tienes de dos: o te pones a refinar tus soft skills, o comienzas a especializarte en tecnologías fundamentales.

Ser bueno técnicamente es solamente una parte de lo que te toca hacer

Ser bueno técnicamente en X o Y tecnología no te hace bueno en todo lo demás que conlleva trabajar en esta industria. Necesitas ponerle más atención a eso.

Es muy de programadores creer que como somos buenos en X, automáticamente somos buenos en Y. Pero eso está muy lejos de la realidad.

Puedes dominar Linux, y carecer aún de la empatía necesaria para poder ser líder de un proyecto.

Puedes ser un experto en Ruby on Rails, y necesitar ayuda para saber cómo arreglar una discusión en tu equipo.

Puedes haber escrito el libro sobre trabajo remoto y aún así regarla horriblemente… porque nunca desarrollaste el hábito de resolver problemas desde la empatía y la compasión.

Y ejemplos como estos hay miles. Todos hemos conocido alguien muy bueno en la parte técnica, pero que funcionalmente es más un blocker que un apoyo (o una molestia, cuando menos) para el equipo.

Un líder…

  • con actitud de “quítate yo lo hago”…
  • que responde preguntas de manera condescendiente…
  • que no protege a su equipo…

… pero que es muy bueno en Linux. ¿… yay?

El argumento de que necesitas ponerle más atención a tus soft skills no es una negación de que la tecnología es importante. A final de cuentas es la parte operativa que te toca desempeñar.

Y es ahí donde se abre la discusión.

¿Cómo le vas a hacer para darte cuenta de que la parte técnica es únicamente eso, UNA PARTE, de lo que te toca hacer en esta industria?

Encontremos la respuesta juntos.

Comunicación síncrona: ¿qué es, cuándo usarla y por qué?

La comunicación síncrona usualmente sucede a través de medios que yo llamo “efímeros”. Este tipo de medios favorece la velocidad en la que los mensajes pueden ser transmitidos sobre cualquier otro factor.

La comunicación síncrona se caracteriza porque requiere que todas las partes involucradas estén prestando atención a lo mismo durante el mismo periodo de tiempo. Como con HTTP 1.1, que la conexión entre el cliente y el servidor debe de mantenerse vigente para que el mensaje pueda llegar de un lugar a otro. Si uno de los dos componentes deja de poner atención, la conexión se termina y el mensaje no es comunicado.


El protocolo HTTP 1.1 requiere que ambas partes se mantengan en sintonía para que el mensaje pueda ser comunicado correctamente.

Los medios de comunicación síncrona son usualmente efímeros. Es decir, que solamente “existen” mientras están siendo usados. Una llamada telefónica, por ejemplo, se podría considerar un medio de comunicación síncrono:

  • Todas las partes necesitan poner atención a la llamada para que esta sea productiva.
  • Si uno de las dos partes cuelga el teléfono, la comunicación se termina.
  • Esa llamada en particular únicamente existe mientras está sucediendo. Al terminarse no es posible volver a tener esa misma llamada. (Se podría volver a tener la misma conversación, pero no la llamada.)

Existen muchos medios de comunicación síncronos a tu disposición. Es importante que aprendas a identificarlos y a usarlos de manera adecuada. Aquí hay algunos otros ejemplos de medios de comunicación síncrona que te podrás encontrar en tu carrera:

  • Conversaciones de pasillo.
  • Mensajes instantáneos (Slack, Google Chat, Teams, WhatsApp, Telegram).
  • Videoconferencias (Google Meet, Whereby, Zoom).
  • Sesiones de pair programming.

¿Cuándo debes usar la comunicación síncrona?

Por lo general se utilizan medios de comunicación síncrona cuando el mensaje es relevante únicamente durante un periodo de tiempo. Un ejemplo de esto es cuando se quiere notificar de algún evento, como que una tarea se terminó en tiempo y forma.

Lo que debes de considerar al momento de comunicar algo a través de medios síncronos, es que el riesgo de que ese mensaje se pierda y no vuelva a ser encontrado es bastante alto. Por lo general, deberías de evitar utilizar medios de comunicación síncronos asumiendo que la información que compartas va a poder ser recuperada después.

Aunque algunos medios de comunicación síncronos, como los mensajes directos, tienen la habilidad de buscar información pasada, la realidad es que no están diseñados para esto. La mayoría de estas herramientas están diseñadas con la conveniencia en mente, no con la consigna de que deberían de ser un acervo de información hacia el futuro.

De manera más concisa, está bien usar medios de comunicación síncronos si…

  • El mensaje que quieres comunicar es relevante únicamente durante un marco de tiempo definido. Es decir, no importará si ese mensaje se pierde en el éter, porque de todos modos únicamente aportaba valor si se consumía al momento en que lo enviaste. Ejemplo: “ya va a comenzar la llamada”.
  • Existe un sentido de urgencia de tu parte. Por ejemplo, en caso de que tengas una emergencia porque el servicio está caído, es mucho más práctico llamar por teléfono a la persona de DevOps para que apoye que enviarle un correo (asíncrono) para notificarle.
  • No estás tomando decisiones que impacten de manera estructural el futuro del proyecto o del equipo. Por ejemplo, ¿tú y tu equipo están intentando decidir qué librería de linting van a utilizar en el proyecto? Discutirlo en un chat grupal está bien — es una conversación. Pero si estás intentando decidir qué topología de red se va a instalar en un edificio, esta conversación debería de ser llevada en medios que estén diseñados para preservar la información a largo plazo.

Combinando la comunicación síncrona y la asíncrona

Algo que debes de tomar en cuenta es que una conversación que inicia de manera síncrona tiene la capacidad de convertirse en asíncrona, si así se requiere. Y de hecho, siempre que estés comunicando algo a través de medios síncronos, deberías de poner mucha atención si algo de lo que se está compartiendo debería preservarse.

Notificar que un proyecto se completó de manera exitosa es claramente información apta para ser comunicada síncronamente. Puedes hacerlo a través de Google Chat o Slack. Sin embargo, el historial y resumen de entrega del proyecto completado es información que se debe de preservar, y por lo tanto deberías de preservarlo en una carpeta compartida de Google Drive o Dropbox. 

Lo anterior es un ejemplo de cómo, para el mismo propósito, combinarías la comunicación síncrona y la asíncrona.

La comunicación siempre está en flujo

No siempre será posible utilizar el medio correcto para compartir lo que quieres. Y está bien. Eres humano.

Lo importante, más allá de que utilices tal o cual aplicación para comunicar algo, es que comiences a generar la conciencia de que no solamente importa qué dices, sino cómo lo dices y a través de qué medio. Sobre todo si estás en una posición de liderazgo, pues cómo tú comunicas pone la pauta para el resto del equipo. Y créeme, no hay nada más complejo que intentar ponerle orden a la comunicación de un equipo de un día para otro.

Ejercitar tu músculo para saber si estás usando el medio adecuado para comunicarte con tu equipo es uno de los pasos que debes de tomar para mejorar tu carrera profesional. Hacerlo no solamente te abrirá los ojos a un mundo de empatía más allá del código, sino que te hará mucho más digno de confianza ante tu equipo. Sabrán que tú, más que un miembro más de la banda, serás una pieza catalizadora de organización y orden.

5 Soft Skills para dominar si desarrollas software

Los Soft Skills son imprescindibles para cualquier desarrollador de software. Puede que seas capaz de codificar mientras duermes, pero si no tienes la capacidad de comunicarte te encontrarás en una situación incómoda. Y a menos que pretendas trabajar por tu cuenta para siempre, no es lo ideal.

Un estudio en el estado de Sonora demuestra que los mismos desarrolladores de software dicen que los Soft Skills son igual o más importantes que conocer ciertas tecnologías.

Este artículo te enseñará los Soft Skills principales que pueden ayudarte a hacer o deshacer tu carrera como desarrollador de software.

Comunicación

La buena comunicación es una habilidad esencial para cualquier trabajo profesional. Pero es especialmente importante para los desarrolladores de software que son serios con su trabajo. Desarrollar software, a final de cuentas, se trata de resolver problemas — para y con otras personas.

No importa si trabajas por tu cuenta como freelancer o en un equipo de desarrollo, vas a tener que comunicar ideas complejas a otras personas. Lo único que cambia es el medio. El diseño de una API comunica cómo debería ser utilizado tu servicio. Cómo redactas reporte de un bug comunica muchas veces no solamente lo que se debe de resolver, sino cómo debería de resolverse.

Los desarrolladores de software, como personas lógicas que somos, tendemos a pensar en términos de unos y ceros. Pero tener esta misma mentalidad al momento de comunicarnos con otras personas, especialmente personas que no tienen nuestra misma formación, no hace otra cosa más que perjudicar nuestra carrera.

Aprende a comunicar, y verás cómo tu código e ideas se vuelven 100% más efectivos.

Negociación

Los desarrolladores de software también tendrán que negociar con personas. Es raro el escenario en el que no tendrás la necesidad de discutir con otra persona para resolver un problema.

Si trabajas eres freelancer, por ejemplo, tendrás que negociar fechas de entrega, alcance del proyecto y hasta tu compensación. Si eres parte de un equipo, tendrás que encontrar la manera de llegar a acuerdos con respecto a metodologías de trabajo, herramientas y hasta qué convenciones seguir.

¿Usarás tabs o spaces?

¿Por qué deberíamos de usar Ruby y no Elixir?

¿Deberíamos desarrollar este feature antes de refactorizar el sistema?

No hay manera de que te escapes de tener que negociar cuando desarrollas software. Incluso, si lo piensas, diseñar una API se trata meramente de negociar qué es lo que el usuario te debe de dar vs. lo que tú le vas a regresar.

Ser excelente negociando hará tu vida desarrollando software mucho más productiva. No

Habilidades interpersonales

Empatía, tacto, persuasión, liderazgo, entre otras. Las habilidades interpersonales son importantes cuando hay que interactuar con otros miembros del equipo para que no se sientan molestos o disgustados por tu presencia. No es divertido tener un compañero grosero, combativo, que se queja de todo y no sabe cómo adaptarse al grupo.

Pero, yo diría, son mucho más importantes porque desarrollar software, al final del día, se trata de resolverle problemas a las personas.

Muy rara vez se desarrolla un software para que funcione en un vacío. Es casi seguro que si estás desarrollando una aplicación o sistema, o implementando un algoritmo, es porque alguien, en algún lado, necesita resolver un problema. Es aquí donde las habilidades interpersonales marcan la diferencia entre un software mediocre (dogmático, apegado a las ideas del programador) y un software realmente útil (usable, que resuelve los problemas del usuario).

Cuando desarrollamos software tenemos que tener siempre en mente a nuestro usuario. Por más novedosa que sea nuestra arquitectura, o más eficiente sea nuestro algoritmo — nada de eso importa si no estamos resolviendo el problema de la persona que usará nuestro desarrollo.

Sucede exactamente lo mismo en el contexto del equipo de desarrollo: ¿de qué sirve que seas el que más sabe de algún tema si nadie quiere trabajar contigo?

Eres una persona, y te mueves en un mundo de personas. No dejes que tus habilidades interpersonales se echen a perder.

Trabajo en equipo

Complementando a las habilidades interpersonales, viene el trabajo en equipo. Que es similar, pero no lo mismo. El trabajo en equipo es uno de los Soft Skills más citados en currículums, pero no muchos saben realmente qué significa.

Más allá de poder comunicar ideas complejas a tus compañeros, y de poder “llevar la fiesta en paz”, la habilidad de trabajar en equipo se podría resumir en la siguiente frase: tú no eres lo más importante del equipo.

Debes de ser capaz de observarte dentro del contexto del equipo, y ver cómo puedes apoyar, no cómo puedes obtener más control. Un desarrollador que sabe trabajar en equipo gestiona soluciones, delega responsabilidades y apoya en lo que puede. Pero nunca bloquea esfuerzos, acapara responsabilidades o tiene actitud de “quítate, yo lo hago”.

Seguramente has escuchado el término 10x Programmer — hace referencia a un programador que hace el trabajo de 10 personas, presumiblemente porque es tan bueno. Pero piénsalo de esta manera: un 10x Programmer no solamente hará el trabajo de 10 personas, sino que hará que 10 personas no quieran trabajar con él o ella. Y, a largo plazo, esa es una posición en la que no quieres estar. Muy bueno tirando código, pero insoportable al momento de colaborar.

No seas ese rockstar.

¿Quieres ser un 10x Programmer? Trabaja en equipo y haz que 10 personas crezcan para cumplir sus metas y objetivos.

Paciencia

Seguido me preguntan qué es lo que se necesita para poder desarrollar software profesionalmente. Muchas personas no se esperan que la respuesta que usualmente comparto es: paciencia. Un Soft Skill que usualmente pasa desapercibido porque es personal.

Desarrollar software es como armar un rompecabezas en tu cabeza. Solamente que no sabes cómo se debería de ver el diseño final, ni qué tamaño debería tener, ni si está en la orientación correcta. Si te frustras fácilmente, no sabes cómo lidiar con incertidumbre, y buscas la gratificación inmediata de todas tus experiencias, probablemente serás miserable desarrollando software.

No solamente deberás ser paciente con tus propios problemas — cuando estés intentando encontrar un error en un programa o aprendiendo una nueva tecnología. También deberás de ser paciente con personas que no hablan el mismo idioma que tú, o que no tienen la misma experiencia empírica. Tendrás que explicar conceptos complejos a personas que no saben de lo que estás hablando, y te harán preguntas sin sentido. Deberás lidiar con cientos de intentos fallidos para configurar alguna parte de tu stack.

Desarrollar software es un ejercicio de paciencia constante.

Si no eres paciente contigo mismo, y con las personas que te rodean en tu industria, probablemente la pasarás mal.

Y si estás leyendo esto porque apenas estás considerando iniciar tu carrera desarrollando software, te ofrezco una disculpa. Sé que puede sonar nada divertido, y hasta como una advertencia de que no lo hagas. Pero, por experiencia propia te digo: hasta las veces que perdí la paciencia y lloré porque no podía configurar una simple tabla en mi aplicación de iOS valieron la pena. Porque durante los siguientes 10 años pude aprender de los mejores, viajar por el mundo, hablar en conferencias y mi código hoy corre en cientos de millones de dispositivos. Porque fui paciente.