CodersRank, el Perfil Definitivo de un Desarrollador

Dicen que un desarrollador bueno no es el doble de productivo que uno mediocre, sino hasta 50X. Cincuenta veces. Ah pero entonces es fácil. Contratemos puros de los 50X y nos ahorramos el 98% del presupuesto. No tan rápido. Cómo saber quiénes son y donde están? (Sin que tengas que contratar a 100 para que 98 te borren la base de datos). Pues bien, La plataforma CodersRank, apunta a determinarlo de manera analítica y automatizada.

 

El clásico Currículum

Han hecho un currículum? Yo he hecho cientos. Ahora existen sitios donde uno llena un formulario con su perfil, pero no hay como un buen CV donde hacer casi una autobiografía que los reclutadores no leen. Si eres joven la tienes en google docs. La mia la tengo en un .doc. Ni siquiera .docx

Después de donde cuentas tu vida, en la parte de tus habilidades en programación, pones:

Lenguajes de Programación

  • PHP: medio
  • ABAP: terrible
  • Javascript: Avanzado

Aunque, para ser sinceros, lo que más se ve es algo al estilo

Lenguajes de Programación: PHP, Javascript, ABAP

Y eso sería todo. No dice mucho en realidad. ¿Por qué no tener una medida empírica de esa experiencia, si hay tantas fuentes de información?

 

CodersRank al rescate

El año pasado, trabajando en silencio pero con un norte ambicioso, un grupo de desarrolladores húngaros planteó una idea: ¿Será posible determinar de forma analítica y automática la experiencia de un desarrollador en determinado lenguaje?

Como toda gran idea, esta empezó con una prueba de concepto aterrizada: tomar un conjunto de desarrolladores para quienes se supiera

  • El nick de Github
  • El nick de StackOverflow
  • Opcionalmente: el país

La parte de StackOverflow es más o menos directa. Las respuestas pertenecen a preguntas, las preguntas tienen tags, y los moderadores y usuarios de S.O. taggean todo. No al nivel de corregir la corrección de la corrección como en Wikipedia eso sí.

Para Github se puede usar el API y revisar los repositorios públicos donde haya contribuido, pero la verdad no sé cómo. Una vez intenté sacar mi propia actividad y la manera con el API v3 era muy rebuscada, a través del endpoint contributors del namespace repo y de ahí más anidaciones. El API v4 implementa elegantemente GraphQL y es un poco más directo listar tus contribuciones por lo que ví es información suficiente para los puntitos verdes, no para saber en qué cantidad has participado.

coderanker01

¿Se van haciendo una idea?

Pero al grano: Evaluar la experiencia de un desarrollador a partir de las fuentes abiertas nos da una idea de su conocimiento en cada lenguaje. Esto tiene un efecto secundario, que es permitir que los desarrolladores del mundo se comparen entre sí, por lenguaje o país:

Después de mucho procesar y poblar con más de 30.000 “semillas”, CodersRank salió al público mostrando el resultado de su algoritmo de evaluación, en la forma de un leaderboard donde se puede segmentar por país, ciudad y lenguaje.

Todo requiere Iteraciones

Todas las ideas que en el papel se ven bien tienen tres características que he visto repetirse

  • No era tan fácil como decían los comerciales
  • Hay que iterar y a veces pivotear
  • Terminas aprendiendo que lo que le da más valor a tu producto no es lo que uno pensaba sino características menores y beneficios colaterales. Si eres pillo se volverán tu foco en la siguiente iteración
  • La implementación de una gran idea pone sobre la mesa comportamientos, casos de uso y escenarios inesperados que no puedes predecir. Y es por eso que el último 10% del proyecto demora más un 90% del proyecto.

Las iteraciones de CodersRank tuvieron que considerar aspectos que se fueron presentando a medida que calculaban los rankings. Cuando le enseñas a una máquina a consolidar información que es imposible consolidar a mano tú no conoces los agregados hasta que tu algoritmo los arroja. Entonces dices: “pero qué máquina más tonta, no entendió lo que le pedí…”

En la foto ven una de las primeras iteraciones. Notarán que casi todos son usuarios-máquina de proyectos que se copian en Github a nombre del robot. Esto desvirtúa un ranking orientado a personas.

coderanker02

Iteración siguiente: limpiar a esos robots. Hecho esto, obtuvieron un ranking de personas que me cuadraba bastante: Taylor Otwell (creador de Laravel) y Marco Pivetta (@ocramius, creador de Doctrine y coautor de una treintena más de librerías recurrentes ) liderando en PHP, y así mismo próceres en cada lenguaje.

Cuando CodersRank se abrió a los usuarios, salió a la luz otro problema. Los usuarios que se inscriben conectan sus cuentas (Github / Stack Overflow) y con ello permiten determinar de manera más rica su dominio de cada lenguaje. Ergo, la tabla de posiciones tenía a distintos desarrolladores evaluados con criterios distintos.

coderanker03

En ese momento yo aparecía segundo en Chile, pero claro, era uno de los pocos que habían conectado su cuenta y tenía un boost que lo hacía medio mentiroso.

Adicionalmente, el algoritmo de evaluación fue evolucionando y por lo mismo los puntajes van cambiando. Yo perdí como un tercio de mi puntaje cuando dejaron de puntuar los archivos SQL.

(Lástima, yo tengo como 150GB en dumps de bases de datos bajo control de versiones. Fuera de broma: Tengo que purgar esos repos con un buen git filter branch.)

Paso siguiente, comparar peras con peras y dejar sólo a los usuarios inscritos y evaluados con el algoritmo más reciente. Da igual si con eso borran la mitad del ranking (o más), ¡si total es mejor hacerlo ahora que cuando salgan a la bolsa!

Por ejemplo, así quedó el ranking mundial para C#

coderanker04

¡Hay un chileno ahí! Siempre hay un chileno

¿Cómo se calcula el puntaje?

Como puede verse en este Blogpost, hay varios aspectos que interactuan:

  • El origen de la información
  • La contribución estimada
  • El lenguaje de ésta
  • La obsolecencia de la misma

En StackOverflow los tags de la pregunta determinan el lenguaje a evaluar. El historial de contribuciones de un usuario puede resumirse a una lista que empareja lenguajes con puntaje.

En Github, en cambio, el referente es github/linguist, la librería con que la famosa plataforma de versionamiento clasifica el lenguaje asociado a cada archivo bajo control de versiones, y de esa manera estima el lenguaje o lenguajes de un repositorio.

El puntaje, en este caso, tiene que ver con las contribuciones (modificaciones) hechas por cada usuario en un determinado proyecto.

La obsolescencia, finalmente, se refiere a que tus contribuciones se van devaluando en el tiempo.

coderanker05

CodersRank apunta a mostrar la experiencia relevante hoy de un desarrollador en cada lenguaje. Si hace 5 años hiciste una librería alternativa a jQuery (y no tuvo mucho éxito pero escribiste muchísimo código) en ese momento tu experiencia con Javascript estuvo en su cénit.

Si nunca volviste a escribir una línea de JS tiene sentido pensar que te quedaste un poco atrás y se te olvidó la mitad. Mirando mi código antiguo, lo honesto sería decir que se me olvidó todo y si pudiera viajar al pasado me golpearía.

Evolución Contínua

Desde la primera prueba de concepto y de darse a conocer en distintos medios, CodersRank ha ido evolucionando y añadiendo funcionalidades. Por ejemplo, el gráfico temporal le sirve a uno mismo para ver cómo ha evolucionado

Esta representación apilada de tu dominio de cada lenguaje tiene el beneficio adicional de poder comparar cuál es el mix que te da de comer. Acá abajo sale que mi pyme tiene su origen el 2013. Claro que me demoré 5 años más en fundarla. También veo que me estanqué. Tendré que darle buen uso a mi suscripción a Medium.com

coderanker06

ero el objetivo de CodersRank es convertirse en el perfil más completo de un desarrollador. Para esto añadieron la posibilidad de ingresar tu experiencia laboral, certificaciones, intereses, expectativas salariales y la clave de tu WiFi (nah, eso no).

Con la adición de la experiencia laboral, es posible tener un ranking de la potencia de código por empresa, lo cual lleva la competencia a una segunda derivada. A mí al menos me gusta trabajar con desarrolladores que pueda admirar!

Otras mejoras han sido, por ejemplo

  • La incorporación progresiva de otras fuentes de datos
    • (repositorios privados, mediante el uso de repo_info_extractor
    • Gitlab
    • En el corto plazo se viene la integración con Bitbucket y Hackerrank
  • La inferencia de los frameworks en que tienes experiencia, a partir de un análisis más granular de tu experiencia en cada lenguaje (cuando ofrecen trabajo no es para javascript genérico, es para ReactJS específicamente) (pero Vue es mejor).

coderanker07
Este no es mi perfil, uta el tipo seco

CodersRank y el Software Open Source

CodersRank tiene varios repos donde puedes colaborar, pero el mismo hecho de registrarse y unirse a la comunidad enriquece el ranking para los demás. Unidos venceremos y eso. Como desarrolladores, siempre he pensado que uno de nuestros motivadores junto con la cerveza tibia y el pollo crudo es el prestigio, la reputación. Pero la reputación no tiene significado fuera del contexto de tus pares. Mientras más pares, más objetiva tu reputación.

En referencia a los repos donde puedes colaborar, anda a la organzación Codersrank en GitHub. Ahí veo dos repos donde puedes colaborar ahora sha. contribute:

  • Repo Info Extractor: esta librería permite que un usuario suba sus repos privados a CodersRank para ser evaluado también por esos conocimientos. Son archivos zip que sólo contiene más o menos cuánto código cambiaste en cada lenguaje por cada commit (en particular en origin/master). Doy fe que no se chorea nada privado. Usa las extensiones de archivos para inferir el lenguaje pero va evolucionando para entender el commit y diagnosticar mejor la experiencia. Son reglas muy específicas para cada lenguaje (por ejemplo, puedes inferir que se está usando Vue.js en un proyecto si parseas los requires o imports. Pero si examinas PHP de este siglo nadie hace require salvo del autoload.php. Tendrías que ver los “use statements” y determinar cuáles realmente están en uso. Vamos metiendo AST y demases. Hay muchos lenguajes donde puedes tomar la titánica empresa de hacer un parser en Python para determinar las dependencias en uso.
  • Libraries: junto con lo anterior, para saber que el código no sólo es JavaScript sino que usa Vue.js, éste está en una lista blanca de paquetes que se consideran frameworks o librerías. Requerir un script local no cuenta. Requerir vue/router no lo hace una librería independiente. Esta lista es sólo JSON. Ahí cualquiera puede contribuir sin programar siquiera!

CodersRank tiene también un API abierta que puedes usar para hacer tu propio dashboard o analizar cortes de la información. Un Dev de su equipo interno construyó Developers Leaderboard con esa API.

coderanker08

(Yo debiera hacer un generador de botones SVG con tu puntaje para cada lenguaje)

Entrevista con los Fundadores

Esta no es, como en casi todos mis artículos, una PseudoEntrevista. Les presento a los verdaderos CR Karoly Paczari and CTO Peter Karakas con quien sostuvimos varias semanas de conversación más que nada porque chutié este artículo harto tiempo.

Capa9: Cuando se les ocurrió la idea de CodersRank, la pensaron com ouna manera de que los desarrolladores se comparasen entre sí, o como una manera de planificar y progresar en tu carrera? Lo segundo mete a los empleadores al modelo.Karoly, CR: Se le ocurrió a Peter, el CTO. Estaba trabajando en Lazada, Vietnam. La compañía la compró Alibabá más tarde, pero en ese tiempo él tuvo que hacer un proceso de recruitement sin más recursos que un browser. Tenía que contratar entre 30 o 300 desarrolladores dependiendo del escenario y nadie puede hacer ese proceso de la manera tradicional. Hackeó el proceso usando el API de Github para ver quienes sabían algo de los lenguajes y librerías necesarios y bueno, sirvió más que el enfoque tradicional. Entonces se dio cuenta que si se hacía como un motor de inteligencia tenía más potencial que el uso puntual que le dio.

Capa9: Por qué sacaron a los developer más top de los rankings? Me encantaba revisar el top 100. Muchos de mis ídolos estaban ahí.

Peter Karakas, CTO: Dos razones
  1. Posibles complicaciones legales porque en el fondo era juntar información que puede considerarse personal. No tenemos plata para gastar en abogados aunque creamos que no tiene nada de malo
  2. Era injusto comparar desarrolladores que habían configurado muchas fuentes de datos (repos privados, por ejemplo) contra otros que eran data recolectada orgánicamente.
Karoly, CR: Ahora tenemos un algoritmo mucho más sofisticado que el que teníamos en la iteración anterior. Este algoritmo V2.0 recoge otra información, mucha más y de manera distinta. Pero ocurre que requiere recursos y tiempo para hacer sus análisis. Era imposible correrlo para todos los 7.4 desarrolladores de la iteración anterior. Hubo que elegir. Además cuando recopilas información de gente que no lo ha autorizado, empiezan a llegar notificadiones de GPDS. Mejor dejarlo.

(Nota del editor, GPDR es una regulación que le da a una persona autoridad para controlar su información en Internet. Información que es pública y en otro escenario no puedes controlar una vez que se vuelve tal, en Europa es protegida por GPDR lo cual significa que si una empresa usa esos datos sin tu consentimiento explícito, es sancionado. Opera desde el 2018 creo, y se aplica a empresas que operan en Europa (da igual donde estén basadas) o con ciudadanos europeos. Por eso está lleno de banners “usamos cookies, acepta por favor”.)

Capa9: No se puede hacer un ranking que no tome en cuenta el puntaje de repos privados? Seguro que GPDR tampoco permite rankings anonimizadoss, sin nombre ni país?

Karoly, CR: (Con cara de “la pregunta weona…”) Puede ser buena idea separar la experiencia en privada vs open source. Gracias por la idea. La pondremos en este papel (bota el papel disimuladamente).
Acerca de los que no se registraron, si los mostramos anonimizados y sin país en realidad aporta poco. Con el tiempo habrá más desarrolladores, no hace falta meter datos de distinto origen.

Capa9: Han pensado puntuar los repos de librerías? Por ejemplo, dos proyectos que tienen la misma cantidad de Javascript podrían evaluarse con el mismo score, pero si uno tiene 10M de descargas en NPM y el otro cero, algo debe significar. Igual para Packagist, Rubygems, PyPi y otros

Peter Karakas, CTO: Medidmos experiencia, no popularidad. Pero si tu librería tiene 10M de descarga debes haber llegado a ese punto porque le metiste harto trabajo y seguramente vas a haber recibido puntaje en su momento. Y esas librerías de 10M de descargas no las hace una persona sola, de quién es el mérito? Lo que sí sería bueno es sacar inteligencia en base a quienes son tus compañeros de proyecto.

Capa9: Que ven como futuro para CodersRank? Que se convierta en el linkedin de los desarrolladores? Un portfolio como Behance? Una plataforma de reclutamiento? Todo lo anterior?

Karoly, CR: Queremos reforzar el crecimiento profesional de los desarrolladores. Tenemos muchas ideas para lograr eso con el tiempo. Hace poco añadimos el “Learning Path” en beta para armar una especie de introducciones interactivas a tópicos recurrentes. Pero la manera más directa de ayudar a alguien con su carrera es sugerirle puestos de trabajo que cuadran con su experiencia.
Nosotros partimos siempre de la página de perfil. Ahí hay un perfil 360 de la experiencia actualizada permanentemente. Es la experiencia real de tu vida como desarrollador y queremos hacerla estable y precisa. Cuando estemos satisfechos veremos cómo más se puede avanzar desde otros aspectos hacia el mismo fin, pero las prioridades no las hemos decidido aún.

Capa9: Cómo piensan rentabilizar el proyecto? Van a esperar y ver qué aspecto prende más antes de seleccionar de donde vendrá el ingreso?

Karoly, CR: Oficialmente el plan es cobrar a las empresas por el servicio de ponerlos en contacto con candidatos para un puesto. Pero nos importan más los desarrolladores, aśi que tenemos que ver cuál es la mejor solución. No queremos que le hagan spam a los usuarios sólo porque paguen. Esta idea la validaremos cuando sea oportuno.

Palabras al Cierre: Discurso vs Reputación

¿Qué es lo que empuja a un desarrollador a desarrollar más y mejor? La pregunta del millón tiene muchas respuestas:

  • Ganarse la vida
  • Añadir features a sus proyectos personales
  • Arreglar bugs en librerías Open Source que utiliza en otros proyectos
  • Arreglar bugs en sus proyectos personales Open Source para que los usuarios dejen de quejarse en las issues de Github
  • Amor por el código
  • Matar el tiempo
  • Perfeccionarse
  • Mejorar los proyectos open source donde contribuye

Todo eso es cierto pero, saben qué es, según yo, lo más importante? Yo lo expresaría como: Maximizar mi reconocimiento como desarrollado entre mis pares. Y como corolario Aumentar mi prestigio relativo en comparación con mis pares. Porque, claramente, eso de “no compararse con los demás” está en la línea con “lo importante es competir” pero muy en el fondo competir le da el sabor a la vida y esta es una industria donde el reconocimiento de tus pares es un factor de peso.

Aunque es cierto que CodersRank no habla sobre prestigio sino como un benchmark analítico de dar valoración para el subjetivo concepto de la experiencia, para mí como desarrollador It’s All About Reputation. Sin embargo, para qué nos vamos a hacer los virtuosos, hay que pagar las cuentas. Y además, si uno es bueno en lo que hace, gana más plata. Lo justo es justo.

Alguna vez trabajaste con un colega que fuera… cómo decirlo… no un gran desarrollador pero un extraordinario vendedor? Yo sí. Y en mi interior sentía que era injusto que a otra persona la evaluaran en base a su discurso más que su código y habilidades técnicas. Pero esa situación también te hace dudar de tu propio talento así que guardas silencio para no hacer un papelón.

No te preocupes, querido lector. Todos tenemos el Síndrome del Ipostor. Guarda relación con que tu valor percibido (en un proceso de contratación o el onboarding en una empresa) depende de un discurso que nada tiene de técnico. Imagínate que alguien de Recursos Humanos te toma el cuestionario pregunta: “Sabes bases de datos”? Qué respondes?

  1. He mandado muchos pull requests a los repos de Doctrine, Sequelize y AdoDB
  2. Parché un memory leak de Postgres, cuando lo corres con CUDA en una GeForce GTX 960.
  3. Sé mucho. Pregúntele a mi anterior empleador que pensaba que yo sabía mucho.
  4. Tengo un largo historial de deuda técnica en bases de datos relacionales y documentales
  5. Gané la medalla “Unsung Hero” en Stack Overflow

Todos sabemos que la respuesta correcta es la 3. Pero cualquiera de las otras me dice más acerca del candidato. Eso es el origen del síndrome del impostor. El proceso de reclutamiento está más hecho y nosotros no podemos cambiarlo, pero quizás mediante CodersRank sí empujar la balanza.

Si se vuelve un benchmark conocido, y hace que la habilidad técnica cuenta. ¿Qué debiera importar para ser un buen desarrollador? Según yo

  • Experiencia, pero en el sentido de código relevante, commits y respuestas validadas o destruidas por mis pares.
  • Evolución de actividad en el tiempo. Hay tendencia ascendente? Dejé de usar SQL Server el 2012 (es la verdad).
  • Ser capaz de usar tu conocimiento para ayudar a otros a pasar obstáculos sugiriendo soluciones acorde a las buenas prácticas y lidiando con desarrolladores mal genio (esto es la definición de participar en StackOverflow)
  • Validación y compromiso con las buenas prácticas. Si un desarrollador cumple con lo anterior , el discriminante será la cobertura de tests en su código, ¿hace tests siquiera? Sigue una guía de estilo? ¿Es consistente con ella? ¿Se deployan usando CI/CD? ¿Tengo los passwords en un TXT?

CodersRank puede hacer sólo una parte de esto, pero de por sí es mucha información y está evolucionando. Alimentamos el modelo con nuestra actividad, y el modelo la devuelve en lenguaje entendible para los que te reclutan.

Pero igual yo me muevo por reputación. Gracias a todos y vayan a inscribirse!

 

Comparte tus impresiones con la comunidad en este tema.

Acerca del autor:

Amenadiel, fundador de Asisteknia y Chilehardware, chw.net, también conocido como FFF

[IMG]