Matriz de Competencias del Programador

Reacciones-programadores-portada
Standard

Esta publicación es el resultado de la experiencia como programador y de la lectura de varios libros, no tanto de una tecnología o plataforma en concreto, si no más bien de conceptos, patrones y buenas prácticas.

En particular decidí escribir al respecto por un par de blogs y un libro que fueron seminales para esta idea:
– La discusión por la cuál nació la idea de este post, aquí se referencia la matriz, y a aparte hay una discusión muy interesante a favor y en contra de estos puntos.
– La matriz de la cual me tomé la libertad de traducir y agregar mis comentarios.
– 97 cosas que todo programador debería saber. A través de historias y anécdotas de programadores experimentados, van ilustrando algunos de los puntos considerados en esta matriz.
Cabe mencionar que más que volvernos expertos en herramientas, yo valoro los atributos como que este fuerte en los conceptos necesarios para ser programadores exitosos, ya que debido a la experiencia, las herramientas, frameworks, etc., pueden variar, pero las buenas bases y prácticas aceleran la adopción de nuevas tecnologías y mejora el desempeño de los equipos.
Gran parte de estos puntos los estamos utilizando activamente en Hunabsys, para definir que buscamos en nuestros equipos de desarrollo, en qué los vamos a entrenar y como base para seleccionar algún nuevo integrante.

Comentario a favor y en contra.

– Alguien puede pensar que es como un test de IQ de inteligencia, en parte es cierto, pero nos da una referencia de que estamos con base en fundamentos de lo que es un buen programador.
– Probablemente es buena referencia para distinguir un programador muy bueno y un principiante, pero probablemente con experiencia puedes distinguir bien donde identificas a uno intermedio.
– Esta matriz mide el potencial, no la excelencia, puedes ser muy bueno en todas estas areas, pero no necesariamente un programador productivo.
– Algunas cosas son exageradas del modo “divertido”, como los libros de nivel 0 (2n). 😃

 Matriz

Nota 1. Me tomé la libertad de agregar mis propios comentarios en la sección de comentarios (duh), adicionales a los de la fuente original.
Nota 2. Se usa como referencia a los niveles los niveles de complejidad ciclomática, lo cual se me hizo gracioso. 😃
Nota 3. Me tomé otra libertad, la de no traducir todos los términos, ya que me parece que se entienden mejor si mantienen su nombre en inglés.
Nota 4. De hecho te sugiero que revises la matriz en su versión original en inglés. 😉
Ciencias Computacionales
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Estructuras de DatosNo sabe la diferencia entre un Array y un LinkedListCapaz de explicar el uso Arrays, LinkedLists, Dictionaries, etc. en tareas prácticas de programaciónConoce las compensaciones de las estructuras básicas de datos, Arrays vs. LinkedLists. Capaz de explicar como los hashtables pueden ser implementados y pueden manejar colisiones, PriorityQueues y cómo implementarlos, etc.Conocimientos de estructuras avanzadas de datos como B-Trees, heaps binomiales y fibonacci, AVL/Red Black trees, Splay trees, Skip Lists, tries, etc.- Trabajar con un desarrollador top es una oportunidad muy buena y hay que aprovecharla.
- Un buen conocimiento de estructuras de datos y algoritmos es muy útil.
AlgoritmosNo es capaz de encontrar el promedio de los números en un arreglo (aunque no lo crean, te encuentras a cada gente)Algoritmos básicos de ordenamiento, búsqueda recorrido y recuperación de estructuras de datos.Algoritmos de Tree, Graph, Simple Greedy y divide y vencerás. Es capaz de entender la relevancia de los niveles de esta matriz.Es capaz de reconocer y codificar soluciones dinámicas de código, tiene buen conocimiento de algoritmos de grados, buen conocimiento de computación de algoritmos numéricos, es capaz de identificar problemas de NP, etc.
Programación de SistemasNo sabe que es un compilador, linker o intérprete.Conocimiento básico de compiladores, linkers e intérpretes. Conoce que es un ensamblado de código y cómo funciona a nivel de hardware. Tiene algún conocimiento de la memoria virtual y paginamiento.Entiende el modo kernel vs. modo de usuario, multi-threading, sincronización de primitivas y cómo son implementadas, es capaz de leer código de ensamblado. Entiende como las redes funcionan, entiende los protocolos de redes y programación a nivel de sockets.Entiende el stack completo de programación, hardware (CPU + Memoria + Caché + Interrupciones + microcódigo), código binario, ensamblador, enlace de programación estática y dinámica, compilación, interpretación, compilación JIT, garbage collection, heap, stack, direccionamiento de memoria, ...
Ingeniería de Software
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Control de Versiones de CódigoRespaldos en carpetas por fechaUsuario de VSS y empezando con CVS/SVNCompetente usando las características de CVS y SVN. Sabe como hacer ramas y uniones, hacer parches y hacer setup de repositorios, etc.Conocimientos en sistemas VCS distribuidos. Ha probado Bzr/Mercurial/Darcs/Git- Un sistema de versiones distribuido como GIT es obligado.
Automatización de BuildsSolo sabe hacer build desde un IDESabe como hacer builds desde la línea de comandosPuede preparar un script para un build básico de un sistemaPuede preparar un build para un sistema y también la documentación, instaladores, generar notas de liberación y etiquetar el código en el control de versiones- Si estas en serio, necesitas saber armar tus propios builds.
Automatización de PruebasPiensa que todo el trabajo de pruebas es trabajo del testerHa escrito pruebas unitarias automáticas y puede hacer buenos casos de pruebas unitarias para el código que ha escritoHa escrito código de manera TDDEntiende que es capaz de preparar pruebas automáticas funcionales, de carga/performance y de UI.- Conocer al menos TDD es necesario.
Programación
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Descomposición de ProblemasSólo tirar líneas de código y usando copiar-pegar para reusoCapaz de dividir un problema en múltiples funcionesCapaz de hacer funciones/objetos reutilizables que solucionan el problema en generalUso de estructuras de datos y algoritmos apropiados y hace código genérico/orientado-a-objetos que encapsula aspectos del problema que son sujetos a cambiar- A veces me han hecho preguntas en entrevistas para validar siquiera que puedo tirar código, así de crítico es esto.
Descomposición de SistemasNo es capaz de pensar más allá del nivel de un(a) sólo(a) archivo/claseCapaz de dividir el espacio de un problema y diseñar una solución mientras esté dentro de la misma plataforma/tecnologíaCapaz de diseñar sistemas que se extienden a múltiples tecnologías/plataformasCapaz de visualizar y diseñar sistemas complejos con múltiples líneas de productos e integraciones con sistemas externos. También debería de ser capaz de diseñar sistemas de soporte de operaciones como monitoreo, reportes, recuperación de fallas, etc
ComunicaciónNo puede expresar sus pensamientos/ideas a sus compañeros. Ortografía y gramática pobresSus compañeros pueden entender lo que se dice. Buena ortografía y gramática.Es capaz de comunicarse efectivamente con sus compañerosCapaz de entender y comunicar pensamientos/diseños/ideas/especificaciones sin ambigüedades y ajusta su comunicación de acuerdo al contexto- En una economía global, con equipos donde no hablamos inglés nativo, esto puede ser crítico.
Organización de Código en un archivoSin evidencia de organización en un archivoLos métodos son agrupados lógicamente o por accesibilidadEl código está agrupado por regiones y bien comentado con referencias a ortos archivos fuentesEl archivo tiene encabezado de licencia, resumen, bien comentado, uso consistente de espacios en blanco. El archivo debe verse hermoso.- A menudo salen de la escuela con el enfoque de "así funciona", en lugar de llevar un orden en su código fuente.
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Organización de Código a través de archivosNo piensa en organizar código a través de archivosLos archivos relacionados son agrupados en una carpetaCada archivo físico tiene un propósito único, por ejemplo una definición de una clase, una implementación de una característica, etc.Código organizado a un nivel físico hace match con el diseño y el mirar a los nombres de archivos y distribución de carpetas provee un vistazo en el diseño- A diferencia de la anterior, en estos puntos de busca una visión más completa de la solución.
Organización del Árbol de ArchivosTodo está en una carpetaSeparación básica de código en carpetas lógicasNo hay dependencias circulares. Binarios, bibliotecas, documentos, builds, código de terceros, todo organizado en carpetas apropiadasLayout físico del árbol de archivos hace match en la jerarquía lógica y en la organización. Los nombres de directorios y de organización proveen un vistazo dentro del diseño del sistema.
Legibilidad de CódigoNombres monosílabosBuenos nombres para archivos, variables de clases, métodos, etc.No hay funciones largas, comentarios explicando código no usual, bug fixes, supuestos de códigoSupuestos de código son verificados usando asserts, flujo de código natural — no anidado muy profundo de condicionales o métodos- A mi en lo particular me gusta que mi código esté auto documentado. (variables, métodos y clases)
Codificación DefensivaNo entiende el conceptoCheca todos los argumentos y asserts en los supuestos críticos en el códigoSe asegura de checar los valores de retorno y revisa las excepciones en el código que pueden fallarTiene su propia biblioteca para ayudarse a codificar a la defensiva, escribe pruebas unitarias que simulan los fallos.- Validaciones, validaciones, validaciones.
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Manejo de ErroresSolo codifica el ‘happy case'Manejo básico de errores en el código que puede lanzar excepciones/generar erroresSe asegura que los errores/excepciones dejan el programa en buen estado, recursos, conexiones y memoria son todos limpiados correctamenteCodifica para detectar posibles excepciones desde antes, mantiene una estrategia de manejo de excepciones consistente en todas las capas del código, hace guías para el manejo de excepciones para todo el sistema.- El poder identificar los diferentes flujos de error ayuda en las estimaciones.
IDEUsa un IDE para la mayoría de la edición de textoConoce como sacarle la vuelta a la interface, capaz de usar los los menús del IDE.Conoce los atajos de teclado para la operaciones más usadas.Ha escrito macros personalizadas- VI es un plus.
APINecesita mirar la documentación frecuentementeTiene las APIs que son más usadas frecuentemente en memoriaConocimiento vasto y en profundidad del APIHa escrito bibliotecas que funcionan con base en el API para simplificar las tareas usadas más frecuentes y para para rellenar los huecos en el API- Ejemplos de API: Una biblioteca Java, .net o una API custom de la aplicación.
FrameworksNo ha usado ningún framework fuera de la plataforma centralHa escuchado pero no ha usado los frameworks populares disponibles para la plataforma.Ha usado más de un framework de manera profesional y tiene buenos conocimientos en los idiomas de los frameworksAutor de framework- Aquí le doy mucho peso a la calidad de conocimientos que tiene sobre los frameworks.
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
RequerimientosToma los requerimientos dados y codifica para la especificaciónTiene preguntas en relación a los casos omitidos en la especificaciónEntiende la foto completa e identifica areas completas que necesitan ser especificadas.Capaz de sugerir mejores alternativas y flujos para los requerimientos dados basado en experiencia- Esto mejora con la experiencia.
ScriptingSin conocimiento de herramientas de scriptingArchivos por lotes/shell scriptsPerl/Python/Ruby/VBScript/PowershellHa escrito y publicado código reutilizable- Si tu enfoque es trabajar con datos, los scripts son obligatorios.
Base de DatosPiensa que Excel es una base de datosConocimientos básicos de conceptos de bases de datos, normalización, ACID, transacciones y puede escribir selects simplesCapaz de diseñar buenos y normalizados esquemas de bases de datos manteniendo en mente los queries que se van a ejecutar, uso competente de vistas, stored procedures, triggers y tipos definidos por el usuario. Conoce la diferencia entre indices clusterizados y no clusterizados. Competente en el uso de herramientas ORM.Puede hacer administración básica de base de datos, optimización de performance, escribir queries select avanzados, capaz de remplazar uso de cursores con sql relacional, entiende como la data es almacenada internamente, entiende como los indices son almacenados internamente, entiende como las bases de datos pueden ser "espejeados", replicados, etc. Entiende como funciona el commit en dos fases.- Cualquiera puede decir que ha usado n número de DBMS, pero los conceptos son lo más importante.
Experiencia
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Lenguajes con experiencia profesionalImperativo u Orientado a ObjetosImperativo, Orientado a Objetos y Declarativo (SQL), valor agregado si entiende la diferencia entre dynamic typing y static typing, weak typing y strong typing y tipos inferidos estáticosFuncional, valor agregado si entienden lazy evaluation, concurrencia, continuacionesConcurrente (Erlang, Oz) y Lógico (Prolog)- Scala
Plataformas con experiencia profesional12-34-56+
Años de experiencia profesional12-56-910+
Conocimiento de DominioSin conocimiento de dominio.Ha trabajado en al menos un producto del dominioHa trabajado con múltiples productos en un mismo dominio.Experto de dominio. Ha diseñado e implementado varios productos/soluciones en un dominio. Buenos conocimientos con los términos estándares, protocolos usados en el dominio.- Ejemplo de dominio, plataformas propietarios y/o open source.
Conocimiento
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Conocimiento de HerramientasLimitado al IDE primario (VS .net, Eclipse, etc.)Conoce alternativas a las herramientas populares y estándarBuen conocimiento de editores, debuggers, IDEs, alternativas open source, etc., etc. Por ejemplo alguien que conoce la mayoría de las herramientas de la lista de poder de Scott HanselmanHa escrito actualmente herramientas y scripts, con valor agregado si han sido publicados.
Lenguajes que ha sido expuestoImperativo u Orientado a ObjetosImperativo, Orientado a Objetos y Declarativo (SQL), valor agregado si entiende la diferencia entre dynamic typing y static typing, weak typing y strong typing y tipos inferidos estáticosFuncional, valor agregado si entienden lazy evaluation, concurrencia, continuacionesConcurrente (Erlang, Oz) y Lógico (Prolog)
Conocimiento del código baseNunca ha revisado el código baseConocimiento básico del layout de código y como construir el sistemaBuena experiencia trabajando con el código base, ha implementado varios bug fixes y probablemente algunos features pequeños.Ha implementado múltiples features de mayor tamaño en el código base y puede visualizar fácilmente los cambios requeridos para la mayoría de los features o bug fixes.
Conocimiento de tecnologías futurasNo ha escuchado de las próximas tecnologíasHa escuchado de las próximas tecnologías en el campoHa bajado los alpha preview/CTP/beta y ha leído algunos artículos/manualesHa jugado con los previews y actualmente ha construido algo con el y valor agregado ha compartido eso con la comunidad
2n (nivel 0)n2 (nivel 1)n (nivel 2)log(n) (nivel 3)Comentarios
Conocimiento interno de plataformasCero conocimiento de los internos de la plataformaTiene conocimiento básico de como funciona la plataforma internamenteConocimiento profundo de los internos de la plataforma y puede visualizar como la plataforma toma el programa y lo convierte en código ejecutableHa escrito herramientas para mejorar o proveer información en los internos de la plataforma. Por ejemplo disassemblers, decompilers, debuggers, etc.
LibrosSeries Unleashed, 21 days, Hour, Dummies, etc.Code Complete, Don’t Make me Think, Mastering Regular ExpressionsDesign Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man monthStructure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Database systems, by C.J. Date, Thinking Forth, Little Schemer- La mayoría de los libros y series de libros que valen la pena, están en inglés, y es mejor leerlos en su idioma original.
BlogsHa escuchado de ellos pero nunca tiene el tiempo.Lee blogs de tecnología/programación/ingeniería de software y escucha podcasts regularmenteMantiene un link de blog con una colección de algunos artículos útiles y herramientas que el/ella ha coleccionado.Mantiene un blog en el cual comparte puntos de vista personales y pensamientos sobre programación.- Todo programador que se respete, sigue un par de blogs, no sólo como consulta cuando tiene un error.

Comentarios Finales

Una matriz como esta nos sirve como referencia general, independientemente de a cuál rubro le das mas peso, y nos da lineamientos de qué estamos buscando para como programador.
Te invito a que te evalúes a manera de ejercicio, y si necesitas ayuda de como prepararte mejor en alguna área deja un comentario. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *