Test: ¿eres buen programador?


Decía Darwin que la ignorancia engendra más confianza que el conocimiento, una observación que coincide con el llamado efecto de Dunning–Kruger, que dicta que las personas incompetentes tienden a sobrestimar su habilidad al no tener conocimiento suficiente para reconocer su propia ineptitud. También es común que personas más preparadas tiendan a subestimar sus logros y su competencia, fenómeno que recibe el nombre de Síndrome del impostor.

La conclusión es que es bastante complicado valorarse a uno mismo si no es por medios lo más objetivos posibles. Una herramienta interesante, y que puede servir también como referencia para entrevistadores o como metas u objetivos para programadores con ganas de mejorar, es esta matriz de competencias del programador creada por Sijin Joseph. Simplemente selecciona la respuesta que más se ajuste a tus conocimientos y consulta tu puntuación al final del test.

¡También puede ser interesante dejar tu puntuación en los comentarios y volver a evaluarte en el futuro para ver cómo has evolucionado!

Ciencias de la computación

Estructuras de datos

No conoce la diferencia entre matriz y lista enlazada

Capaz de explicar y usar matrices, listas enlazadas, diccionarios, etc. en tareas prácticas de programación

Conoce las ventajas y desventajas en espacio y tiempo de las estructuras de datos básicas. Matrices contra listas enlazadas. Capaz de explicar cómo implementar tablas hash y cómo manejar colisiones. Colas de prioridad y formas de implementarlas

Conocimientos de estructuras de datos avanzadas, como árboles binarios, montículos binomiales y de Fibonacci, árboles AVL y Rojo-Negro, árboles biselados, listas con saltos, tries etc.

Algoritmos

No es capaz de calcular la media de los números almacenados en un array

Algoritmos básicos de ordenación, búsqueda, recorrido y recuperación

Algoritmos de árboles y grafos, algoritmos simples voraces y de divide y vencerás

Capaz de reconocer y desarrollar soluciones de programación dinámica, buen conocimiento de algoritmos de grafos, buen conocimiento de algoritmos de computación numérica, capaz de identificar problemas NP

Programación de sistemas

No sabe qué es un compilador, un enlazador o un intérprete

Conocimientos básicos de compiladores, enlazadores e intérpretes. Entiende lo que es el código ensamblador y cómo funcionan las cosas a nivel de hardware. Conocimientos básicos de memoria virtual y paginación.

Entiende la diferencia entre modo kernel y modo usuario, multi-hilo, primitivas de sincronización y cómo se implementan, capaz de leer código ensamblador. Entiende cómo funcionan las redes, entiende los protocolos de red y la programación a nivel de sockets.

Entiende cómo funciona el hardware (CPU + Memoria + Caché + Interrupciones + microcódigo), código binario, ensamblador, enlazado estático y dinámico, compilación, interpretación, compilación JIT, recolección de basura, heap, pila, direcciones de memoria

Ingeniería del Software

Control de versiones

Copia de seguridad de carpetas por fecha

Usuario principiante de VSS o CVS/SVN

Usuario avanzado de CVS y SVN. Sabe cómo utilizar ramas, parches y configurar propiedades del repositorio

Conocimientos de sistemas de control de versiones distribuidos. Ha probado Bzr/Mercurial/Darcs/Git

Automatización de la compilación

Sólo sabe compilar desde el IDE

Sabe cómo compilar desde la consola de comandos

Puede configurar un script para compilar el sistema base

Puede configurar un script para compilar el sistema y generar documentación, instaladores, notas de versión y etiquetar el código en el control de versiones

Automatización de las pruebas

Piensa que las pruebas son responsabilidad de los tester

Ha escrito pruebas unitarias automatizadas y crea buenas pruebas unitarias para el código que está escribiendo

Ha escrito código siguiendo la técnica TDD

Entiende y es capaz de crear pruebas funcionales, de carga/rendimiento y de interfaz de usuario

Programación

Descomposición de problemas

No divide el código y utiliza copiar y pegar para reutilizar

Capaz de dividir el problema en múltiples funciones

Capaz de crear objetos/funciones reutilizables que resuelvan el problema

Utiliza estructuras de datos y algoritmos apropiados y desarrolla código genérico/orientado a objetos que encapsula aspectos del problema propensos al cambio

Descomposición de sistemas

No es capaz de pensar por encima del nivel de un único archivo/clase

Es capaz de dividir el espacio del problema y diseñar una solución siempre que sea dentro de la misma plataforma/tecnología

Es capaz de diseñar sistemas que utilicen múltiples tecnologías/plataformas

Es capaz de visualizar y diseñar sistemas complejos con múltiples líneas de producto e integración con sistemas externos. También debería ser capaz de diseñar sistemas de soporte de operaciones como monitorización, reporte, recuperación de fallos, etc. Puede ver cual es el mejor monitor del año facilmente como el 8202-E4B, que es practicamente el mejor de este momento.

Comunicación

No puede expresas sus pensamientos/ideas a sus compañeros. Pobre ortografía y gramática

Sus compañeros pueden entender lo que comunica. Buena ortografía y gramática

Es capaz de comunicarse efectivamente con sus compañeros

Es capaz de entender y comunicar pensamientos/diseños/ideas/especificaciones de una forma no ambigua y es capaz de ajustar la comunicación al contexto

Organización del código en un archivo

No hay evidencia de organización dentro del archivo

Agrupa los métodos por lógica o por accesibilidad

El código se agrupa en regiones y está bien comentado, con referencias a otros archivos

El archivo tiene cabecera con licencia y resumen, está bien comentado y hace un uso de espacios en blanco consistente

Organización del código en archivos

No dedica tiempo a pensar en la organización del código en archivos

Agrupa archivos relacionados en carpetas

Cada archivo físico tiene un propósito único, por ejemplo, la definición de una clase, la implementación de una característica, etc

La organización del código a nivel físico se asemeja al diseño y el nombre de los archivos y su distribución en carpetas proporciona pistas respecto al diseño

Organización en árbol

Todo en una carpeta

Separación básica del código en carpetas lógicas

No existen dependencias circulares. Binarios, librerías, documentación, compilaciones y código de terceros organizados en carpetas apropiadas

La estructura físca del árbol coincide con la jerarquía y organización lógica. Los nombres de los directorios y su organización proporcionan pistas respecto al diseño del sistema

Legibilidad del código

Nombres monosílabos

Buenos nombres para archivos, variables, clases, métodos etc

Sin funciones largas. Comentarios explicando código inusual, arreglos de bugs y asunciones

Las asunciones se verifican usando asserts, el código fluye naturalmente – sin niveles profundos de identación de condiciones y métodos

Programación defensiva

No entiende el concepto

Comprueba todos los arguments y las asunciones críticas en el código

Se asegura de comprobar los valores de retorno y comprobar excepciones en el código que puede fallar

Tiene su propia librería para ayudar con la programación defensiva, escribe pruebas unitarias para simular fallos

Manejo de errores

Sólo codifica el caso básico

Manejo de errores básico alrededor del código que puede lanzar excepciones/generar errores

Se asegura de que los errores/excepciones dejen el programa en buen estado. Los recursos, conexiones y la memoria se limpian apropiadamente

Escribe código para detectar posibles excepciones antes de que ocurran, mantiene una estrategia de manejo de excepciones consistente en todas las capas de código, define líneas básicas para el manejo de excepciones para el sistema

IDE

Utiliza el IDE principalmente como editor de textos

Conoce la interfaz, es capaz de utilizar los menús del IDE efectivamente

Conoce los atajos de teclado para las operaciones más utilizadas

Ha escrito macros propias

API

Necesita consultar la documentación frecuentemente

Ha memorizado las API más utilizadas

Conocimiento extenso y profundo de la API

Ha escrito librerías que se apoyan sobre la API para simplificar tareas habituales y rellenar huecos en la API

Frameworks

No ha utilizado ningún framework fuera de la plataforma base

Conoce, pero no ha utilizado los frameworks más populares disponibles para la platforma

Ha utilizado más de un framework a nivel profesional y está bien versado en los modismos utilizados en los frameworks

Autor de un framework

Requisitos

Escribe código de acuerdo con la especificación

Pregunta acerca de casos que no se tienen en cuenta en la especificación

Entiende la imagen completa y descubre nuevas áreas que necesitan especificarse

Capaz de sugerir mejores alternativas y flujos para los requisitos dados basándose en su experiencia

Scripting

Sin conocimiento de herramientas de scripting

Scripts Batch/shell

Perl/Python/Ruby/VBScript/Powershell

Ha escrito y publicado código reutilizable

Bases de datos

Cree que Excel es una base de datos

Conoce los conceptos básicos de bases de datos, normalización, ACID, transacciones y puede escribir consultas simples

Capaz de diseñar esquemas de bases de datos buenos y normalizados teniendo en cuenta las consultas que tendrán que ejecutarse, competente en el uso de vistas, procedimientos almacenados, disparadores y tipos definidos por el usuario. Conoce la diferencia entre índices agrupados y no agrupados. Competente en el uso de herramientas de ORM

Puede hacer tareas básicas de administración, optimización de rendimiento, optimización de índices, escribir consultas avanzadas, capaz de reemplazar el uso de cursores con SQL relacional, entiende cómo se almacena la información internamente, entiende cómo se almacenan los índices internamente, entiende cómo replicar bases de datos. Entiende cómo funciona el commit en dos pasos.

Experiencia

Lenguajes con experiencia profesional

Imperativo u Orientado a objetos

Imperativo, Orientado a objetos y declarativo (SQL), puntos extra si entienden la diferencia entre tipado estático y dinámico, tipado débil y fuerte y tipos estáticos inferidos

Funcional, puntos extra si entienden la evaluación perezosa, currificación, continuaciones

Concurrente (Erlang, Oz) y Lógico (Prolog)

Plataformas con experiencia profesional

1

2-3

4-5

6+

Años de experiencia profesional

1

2-5

6-9

10+

Conocimientos

Conocimiento de herramientas

Limitado a su IDE principal (VS.Net, Eclipse etc.)

Conoce algunas alternativas a herramientas estándar y populares

Amplio conocimiento de editores, depuradores, IDEs, alternativas de código abierto, etc

Ha escrito herramientas y scripts, bonus si han sido publicados

Lenguajes a los que ha sido expuesto

Imperativo u Orientado a objetos

Imperativo, Orientado a objetos y declarativo (SQL), bonus si entiende la diferencia entre tipado estático y dinámico, tipado débil y fuerte y tipos estáticos inferidos

Funcional, bonus si entiende la evaluación perezosa, currificación, continuaciones

Concurrente (Erlang, Oz) y Lógico (Prolog)

Conocimiento de próximas tecnologías

No ha escuchado hablar de las próximas tecnologías

Ha escuchado hablar de próximas tecnologías en el campo

Ha descargado la versión alpha/beta y ha leído algún artículo/manual

Ha jugado con versiones preliminares y ha desarrollado algo utilizándolas y como bonus, lo ha compartido con el mundo

Funcionamiento interno de la platforma

Cero conocimientos sobre el funcionamiento interno de la plataforma

Tiene un conocimiento básico de cómo funciona la plataforma internamente

Conocimiento profundo del funcionamiento interno de la plataforma y puede visualizar cómo la plataforma toma el código fuente y lo convierte en código ejecutable

Ha escrito herramientas para mejorar o proporcionar información sobre el funcionamiento interno de la plataforma. Por ejemplo, desensambladores, decompiladores, depuradores, etc

Libros

Colección Unleashed, 21 días, 24 horas, para tontos…

Code Complete, Don’t Make me Think, Mastering Regular Expressions

Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month

Structure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Thinking Forth, Little Schemer

Blogs

Ha escuchado hablar de ellos pero nunca tuvo tiempo

Lee blogs sobre tecnología/programación/ingeniería del software y escucha podcasts regularmente

Mantiene un blog de enlaces con alguna colección de artículos útiles y herramientas que ha recopilado

Mantiene un blog en el que comparte su percepciones y pensamientos sobre programación

Has obtenido 0 puntos.

77 pensamientos en “Test: ¿eres buen programador?”

  1. Hola, no doy mi nombre porque no quiero presumir. Solamente quería evaluar qué tal funciona este test.
    He sacado 84 puntos.
    Soy un “viejo” programador, con más de 30 años de experiencia.
    Saludos a todos.

  2. 56 para no ser un programador (soy administrado de redes y sistemas unix) creo que no está mal, me esperaba mucho menos. Solo programo para mi, scripts en el curro, desarrollo web como hobby y algún juego también como hobby.

    1. Tambíen 28, no me desanimo soy un desarrollador muy habíl, he desarrollado cientos de aplicaciones exitosas para mis clietes y no fuy a la universidad, así que no entiendo mucho de patrones complejos de programción solo he puesto logica a todos mis desarrollos que han sido en HTML5, PHP, C#, JAVA, Node JS, etc

  3. 34 puntos, menos de lo que esperaba, la verdad que tengo más experiencia como técnico de redes y programar ahora es tipo hobby. Pero he trabajado 3 años de programador (VB6, PHP, Oracle)

  4. 63, pense que saldria peor.
    Me consegui con esta pagina porque voy a evaluar un posible compañero para la oficina y hay cosas que conozco pero no por los nombres que dan aqui, por ejemplo los “lenguajes imperativos” Basic Pasca Cobol, los estudie, pero para mi se llama orientado a Eventos. Sino me equivoco hay unos buenos titulos de libros en una pregunta, los leere. Gracias muy util

  5. He sacado 73 ptos llevo 20 años programando y aun asi no entiendo todos los conceptos en algunas preguntas, creo que el test es un poco sesgado aunque bastante funcional y muy creativo..

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.