Como se llama a los desarrolladores
En mi blog utilizo los términos "programador", "codificador", "desarrollador" e "ingeniero" indistintamente para evitar la tautología. Sin embargo, creo que hay algunas diferencias entre estas palabras y otras similares.
En este artículo, discutiremos un conjunto de sustantivos típicos para designar a una persona que escribe código. Daré mi interpretación de cómo estos términos se relacionan con el nivel de dominio.
Interpretación de valores.
Las definiciones presentadas aquí no son oficiales. No conozco ninguna definición formal o estándar aceptado. Sin embargo, muchas personas tienen una fuerte opinión sobre este tema. Mi comprensión de cada término se basa en 30 años de experiencia en la industria del software, pero estoy absolutamente preparado para que otros no estén de acuerdo con mi interpretación.
No quiero discutir ni convencer a las personas con una opinión diferente. En general, es casi imposible hablar de una opinión correcta o incorrecta. Sin embargo, si aún no se ha formado una posición sobre este tema, espero que esta guía le brinde cierta claridad.
Enfoque tripartito
Para mayor claridad, cada término recibirá tres características:
1. Nivel de dominio
Una descripción del nivel de habilidad para este término, en mi interpretación.
2. Paralelo a las artes marciales.
Una analogía con las filas de las artes marciales. En particular, comparamos el nivel técnico de habilidades con los colores de los cinturones de los artistas marciales.
3. Código de muestra
Un ejemplo de cómo una persona de este nivel debe abordar una tarea de programación simple. La definición aquí es trivial y no pretendía ser un ejemplo realista. El objetivo es comparar y discutir los niveles de habilidad. Por simplicidad, el ejemplo se selecciona para adaptarse a un especialista de cualquier nivel. Aquí está el problema que consideraremos:
Calcular la suma de enteros
Juega conmigo y presenta esta tarea como intermedia para mucho más difícil. En nuestro universo ficticio, una tarea requiere un pensamiento serio y tiene muchas soluciones y enfoques potenciales. Imagine que este es el módulo central del sistema que desea escalar.
Usaré Ruby para ejemplos triviales de implementación. El código es bastante simple: es comprensible incluso si no conoce a Ruby.
3. Lista
Sustantivos discutidos:
- Novato
- Codificador
- (Hacker)
- Programador
- Investigador (informático)
- Desarrollador de software
- Ingeniero de software
- Arquitecto de software
Entonces comencemos.
Cinturones de artes marciales

Cuando vivía en Italia en mi juventud, hace unos 20 kilogramos, practiqué judo y kung fu durante varios años. Luego aprendí que en muchas artes marciales el nivel de habilidad corresponde al color del cinturón. Por lo general, el color cambia de blanco a negro, donde el nivel de experiencia corresponde a la oscuridad del cinturón.
Un principiante usa un cinturón blanco porque no tiene experiencia. El color blanco significa "nuevo y limpio". A medida que entrenas, el cinturón se oscurece, mostrando progreso. El color representa la suciedad acumulada con el trabajo duro y el sudor. Un artista marcial con muchos años de experiencia finalmente alcanza el cinturón negro, lo que significa un alto nivel de conocimiento y habilidades.
Tradicionalmente, los cinturones eran solo negros o blancos. En las últimas décadas, han aparecido más flores. Hoy diferentes escuelas de artes marciales usan diferentes colores. El esquema depende del estilo, la escuela y el país.
¿Por qué estamos hablando de artes marciales?
Los colores del cinturón se utilizan para establecer un paralelismo entre las habilidades de software y las habilidades de artes marciales. Para hacer esto, tome el esquema de color comúnmente utilizado en Europa: blanco, amarillo, naranja, verde, azul, marrón y negro.
La siguiente tabla muestra los niveles de desarrollador de los que hablé. Para cada uno, se muestra el color del cinturón y la posición, que generalmente se le da a un especialista en este nivel:
Nivel profesional | Nivel de artes marciales (color del cinturón) | Publicar ejemplo |
---|
Novato | Blanco | |
Hacker | Street Fighter (sin cinturón) | |
Codificador | Amarillo | Desarrollador Junior (Jr.Dev) |
Programador | Naranja | Desarrollador de software |
Investigador (informático) | Verde | Desarrollador de software |
Desarrollador de software | Azul | Desarrollador Senior de Software (Sr. Software Dev) |
Ingeniero de software | Marrón | Desarrollador principal (desarrollador principal) |
Arquitecto de software | Negro | Arquitecto de software |
El nivel de habilidades de ingeniería está relacionado con las habilidades técnicas y de trabajo en equipo. El título de la publicación es un ejemplo de cómo se llama a una persona en este nivel en la industria (esto depende en gran medida de la empresa y la región).
Novato: Cinturón Blanco

Tienes que comenzar en alguna parte, y generalmente este es el nivel de "ninguna experiencia en absoluto". Un novato en el desarrollo de software es alguien que acaba de familiarizarse con la programación y se encuentra en las primeras etapas de capacitación. Los principiantes aún no pueden programar con confianza y no entienden programas simples, sin consultar libros, libros de texto o pedir consejo a un amigo experimentado.
Los principiantes pueden escribir código de trabajo, pero a menudo no entienden los detalles de por qué funciona este código. Pasan mucho tiempo buscando fragmentos de código en StackOverflow o sitios similares y combinando estos fragmentos hasta que algo funciona.
Las herramientas poderosas no son solo habilidades confiables.
Para hacer las cosas aún más confusas, muchos lenguajes y marcos "modernos" permiten a cualquiera generar estructuras y algunas implementaciones de programas complejos sin comprender lo que sucede detrás de escena. Por ejemplo, iniciar una aplicación simple de Ruby on Rails y aceptar solicitudes HTTP se puede organizar usando varios comandos desde la línea de comandos.
Aquí se explica cómo hacerlo bajo * nix:
$ gem install rails
…
$ rails new website
…
$ cd website
$ bin/rails server
...
Hecho Esto es suficiente para que el servidor responda a las solicitudes HTTP del navegador. Si se compara con las artes marciales, esta es la forma de aparecer en el tatami con armadura y armas. La armadura te permitirá vivir un poco más, y con un arma puedes ganar la batalla. Pero tal victoria no te convierte en un artista marcial calificado. Estas herramientas simplemente le permiten hacer algo complejo sin la capacitación y el esfuerzo tradicionales.
No me malinterpretes. Herramientas como Ruby on Rails le permiten hacer las cosas rápidamente, y son geniales. De hecho, me parece fantástico reducir el tiempo que lleva escribir el código estándar inicial. Este es un gran comienzo para el proyecto, pero solo un cinturón blanco es suficiente.
La verdadera batalla comienza donde termina el tutorial, donde las herramientas no pueden generar automáticamente la aplicación que necesita. Para seguir adelante, debes convertirte en un codificador.
Ejemplo
Si un principiante quiere escribir un programa que resume un conjunto de números usando Ruby, entonces puede buscar en Google la pregunta y encontrar
esa página . Este es el primer resultado de Google al momento de escribir este artículo. En la página StackOverflow, la respuesta más prolífica con 524 votos:
array.inject(0){|sum,x| sum + x }
Por supuesto que funciona. Aquí hay un ejemplo:
$ irb 2.4.2 :001 > array=[1,2,3] => [1, 2, 3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6
Esto puede funcionar para un principiante, pero no comprende las características de este código. ¿Qué tan legible es? ¿Qué tan rápido es en comparación con otras opciones? ¿Es fácil de mantener? Por que funciona ¿Qué sucede exactamente cuando se ejecuta esta línea? ¿Cuánto tiempo de CPU se usa? ¿Se definen las variables
suma yx después de ejecutar esta línea?
El desarrollador novato de Ruby no conoce las respuestas a la mayoría de estas preguntas.
Codificador: Cinturón Amarillo

Un codificador puede, sin ayuda externa, recopilar muchas líneas de código de computadora para resolver problemas simples. El resultado no será muy bonito, pero el codificador comprende por qué funciona el programa y completa con éxito la tarea.
Primer paso necesario
Llamé a mi blog CoderHood, porque todos los que se ganan la vida programando en algún momento alcanzaron el nivel del codificador. La palabra Coderhood refleja la vida de un desarrollador en el mundo de la tecnología, comenzando con el primer cinturón amarillo.
La principal diferencia entre un principiante y un codificador es que el codificador puede escribir código y comprenderlo. Es posible que no entiendan en detalle lo que sucede detrás de escena, pero él sabe por qué escribió exactamente ese código.
En la industria, a un codificador generalmente se le asigna una posición como un "desarrollador junior" (desarrollador junior) o un pasante (desarrollador en formación).
Ejemplo
Creo que el "codificador Ruby" podrá encontrar la mayoría de los siguientes métodos para calcular la suma de una matriz de enteros y comprender la diferencia entre ellos:
$ irb 2.4.2 :001 > array=[1,2,3] => [1,2,3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 2.4.2 :003 > sum=0;array.each { |x| sum+= x } => 6 2.4.2 :004 > array. sum => 6 2.4.2 :005 > array.inject(0, :+) => 6 2.4.2 :006 > array.reduce(0, :+) => 6 2.4.2 :007 > eval array.join '+' => 6
Si está interesado, algunos de estos métodos son terribles, pero funcionan.
Hacker: jeans sin cinturón

Puse un "hacker" en la lista porque me preguntaron al respecto. Pero no es adecuado para nuestra discusión.
No es la habilidad principal
No creo que "piratear" sea una habilidad necesaria en el desarrollo de un desarrollador de software. Dicha experiencia es útil para aprender a probar y proteger aplicaciones y sistemas de software, pero no veo aquí una descripción del "nivel de habilidades" general. Clasificaría esto como un área determinada de actividad, y no como un nivel de habilidad técnica. De hecho, el nivel de habilidad de un hacker puede ser cualquiera. Algunos de ellos son increíbles, mientras que otros
no lo son.
Dado que la piratería no es un paso necesario en el desarrollo de un desarrollador, según mi analogía, un hacker no tiene un cinturón tradicional. Se parecen más a los luchadores callejeros que usan jeans.
Algunos de ellos son malvados matones, otros están tratando de sobrevivir, otros son buenos tipos que protegen al resto, pero la mayoría están en algún punto intermedio.
Muchos tipos de "hackers"
Hay muchos tipos de hackers. Algunos pueden programar, otros no. El significado de la palabra depende del contexto y de quién la usa. Algunas definiciones comunes:
- Un experto en informática que se adhiere a una subcultura de tecnología y programación.
- Una persona que puede comprometer la seguridad informática con fines maliciosos (sombrero negro) o de investigación (sombrero blanco).
- Un desarrollador que hace el trabajo de la manera más rápida y sucia.
- Una persona que estudia, experimenta o investiga sistemas de telecomunicaciones, equipos y sistemas conectados a redes telefónicas. Estos hackers también se llaman phreakers.
- Un ingeniero calificado que trabaje muy cerca del hardware para obtener un mejor control del sistema en aras de hacer un buen trabajo (es decir, exprimir más el rendimiento del equipo) o con fines maliciosos (es decir, usar agujeros de seguridad y encontrar una forma de evitar la protección de la sala de operaciones sistemas).
Algunos ejemplos
Tipo 3
Un hacker de tipo 3 puede elegir esta opción de sumar una matriz de enteros:
$ irb
2.4.2: 001> 'echo "1 2 3" / bc'.to_i
=> 6
El método funciona, al menos en algunos sistemas, pero es ... un "truco completo". También los hackers no calificados que pueden programar. Resuelven problemas de formas dudosas, generalmente ejecutando comandos de línea de comandos ilegibles hasta que de alguna manera obtienen el resultado deseado.
Tipo 5
Los hackers tipo 5 trabajan a un nivel muy bajo. Estas habilidades no son fáciles de adquirir y pueden ser muy valiosas si está intentando configurar la protección del software o crear aplicaciones de alto rendimiento. Nunca he sido un "hacker", pero programé a un nivel bajo (C y ensamblador) y aún en el fondo me considero un especialista en programación de bajo nivel.
Los hackers tipo 5 pueden ser fantásticos luchadores callejeros, con habilidades locas que limpiarán la nariz de muchos programadores profesionales en algunas tareas especializadas. Tales "piratas informáticos" podrían sumar una serie de enteros utilizando ensamblador
como este .
Programador: cinturón naranja

Un programador puede escribir aplicaciones que funcionen, comprende los algoritmos básicos y conoce los conceptos básicos de la informática. Puede hacer que el programa funcione, incluso si no es muy escalable y compatible a largo plazo. Como regla general, un programador funciona bien solo. No es el hecho de que será un buen jugador de equipo.
La mayoría de los desarrolladores se detienen en este nivel, especialmente si no planean estudiar la teoría de la informática. Los programadores pueden escribir código decente y trabajar en la industria del software a ese nivel a lo largo de sus carreras.
Desde una perspectiva laboral, los programadores a menudo se denominan "Desarrolladores de software" o "Ingenieros de software".
En un ejemplo simple de la suma de una matriz de enteros, un programador puede escribir código de esta manera:
Este código implementa un útil comando de línea de comando para resumir una lista de números. Si lo llama sin parámetros, muestra un mensaje de uso útil. De lo contrario, imprime la salida estándar. Aquí hay un ejemplo de uso:
$./sum
Usage:
sum [ , ]
$ sum 1 2 3
6
Esta es una "solución completa", autodocumentada y algo abstracta, porque el programa se puede llamar desde la línea de comandos.
Investigador: Cinturón Verde

El investigador (informático) estudió informática en la escuela o en el trabajo. Él tiene una buena comprensión de tales conceptos:
- Base Base-N (N = 2, 10, 16)
- Operaciones binarias
- Lógica booleana
- Complejidad algorítmica y notación big-O
- Estructuras de datos (matrices, listas vinculadas, árboles B, árboles rojo-negros, colas, pilas, tablas hash, montones, conjuntos, gráficos)
- Algoritmos de clasificación y cuándo usarlos
- Comprensión básica de la integridad de NP
- Algoritmos básicos de subprocesos múltiples
- Administración de memoria y recolección de basura (solo porque su lenguaje de programación se encargue de la administración de memoria en sí no significa que pueda omitir este tema)
- Punteros (necesita al menos comprender el concepto, incluso si no codifica en C) y la diferencia entre pasar parámetros por valor o referencia.
- Conceptos de OOP (interfaces, herencia, constructores, destructores, clases, objetos, abstracciones, encapsulación, polimorfismo, etc.)
- Diseño orientado a objetos y plantillas
- Recursividad
- Algunos conceptos básicos sobre programación dinámica, análisis de avaricia y amortización, comparación de cadenas y algoritmos de aproximación
El investigador es licenciado en informática o durante muchos años trabajó como desarrollador, estudiando informática aplicada en el trabajo. Como saben,
no creo que un título de CS sea necesario para una carrera de desarrollo exitosa .
El mero estado de un "científico de la computación" no te convierte en un excelente programador. Aquí la analogía con los colores de los cinturones parece ser violada. Pero esto no es así. Piensa de este lado: incluso en el mundo de las artes marciales, hay especializaciones. Algunos cinturones verdes hacen algunas cosas mejor que otros. La progresión es no lineal. El color del cinturón a menudo representa el nivel de experiencia y la cantidad de trabajo gastado en dominar el arte marcial, en lugar del nivel requerido de habilidad en todos los aspectos.
El científico probablemente escribirá el mismo código para la suma de números que el programador. La diferencia es que el científico puede decir de inmediato que la complejidad de este algoritmo es O (n) tiempo. Como ya se mencionó, este es un ejemplo elemental, pero captó la idea.
Desarrollador de software: Blue Belt

Un desarrollador de software puede manejar proyectos más grandes y complejos. En comparación con un programador e investigador, él:
- Escribe código más limpio, más estructurado, mantenido, documentado y legible.
- Permite menos errores.
- Funciona mas rapido.
- Trabaja mejor como equipo y comprende el valor de los procesos de desarrollo.
- Localiza y optimiza mejor los cuellos de botella en los sistemas de código y software.
- Tiene mas experiencia.
Ejemplo
En un ejemplo simple de una suma de enteros, un desarrollador de software puede resolver el problema creando un servicio que proporcione una API web. La interfaz toma un conjunto de enteros y devuelve la suma.
Creo que la aplicación estará bien documentada y la configuración de soporte, irá acompañada de pruebas, tendrá la estructura de código correcta y será mantenida fácilmente por otros desarrolladores.
En Ruby, la aplicación principal que usa Sinatra podría verse así:
require 'sinatra' require "sinatra/config_file"
Un buen desarrollador de software es consciente de las muchas limitaciones de esta solución en comparación con otras. Por ejemplo, se limita a la suma de un conjunto de números que cabe en un URI; no hay verificación explícita de errores; las líneas deben comenzar con un número, etc.
Ingeniero de software: Brown Belt

La diferencia entre un desarrollador de software y un ingeniero de software es sutil; Lo admito totalmente. Estos términos se usan comúnmente como sinónimos. Sin embargo, supongo que el ingeniero de software es un especialista con conocimiento en el campo de la informática y una amplia experiencia como desarrollador de software. Las principales diferencias:
- Capacidad para crear sistemas más escalables.
- Longevidad Trabajan más y con menos problemas.
- Menos errores y mejor calidad de código.
- Capacidad para actuar como gerente técnico de proyectos y equipo.
- Excelentes habilidades de colaboración y comunicación.
- Suficiente conocimiento de la arquitectura de software para hacer el trabajo.
En las empresas, dichos desarrolladores pueden tener las posiciones de "desarrollador senior" o "desarrollador senior".
Ejemplo
Un ingeniero de software puede escribir una aplicación como desarrollador creando un servicio y proporcionando una API para tomar un conjunto de enteros. Pero creo que la decisión del ingeniero incluirá algunas mejoras:
- Resultados de almacenamiento en caché.
- Abstracción del concepto de la suma a cualquier expresión matemática en la consulta.
- Registro, autenticación, seguimiento de ganchos, etc.
El ejemplo se vuelve estúpido
Como puede ver, un ejemplo demasiado simple en esta etapa se vuelve un poco tonto. Todo se reduce a una discusión sobre cómo mejorar una solución ya redundante a un problema trivial.
Por ejemplo, administrar un caché con los resultados de operaciones simples en un pequeño conjunto de números es más difícil y más lento que los cálculos simples. Un caché tendría sentido en el caso de una gran variedad de números para pasar a la API, pero luego la lista no encajaría en el URI de la solicitud.
Puede mover la lista de números al cuerpo de la solicitud, pero ya no será la API RESTFUL y la solicitud ya no se almacenará en caché. En este punto, será tentador cambiar la solicitud a POST, pero nunca se almacenará en caché. En cualquier caso, la discusión puede seguir y seguir.
Parte critica
¿Ves lo que está pasando? A medida que las habilidades del desarrollador mejoran y los proyectos se vuelven más complejos, sucede algo divertido. Los problemas se alejan cada vez más del "código central". En cambio, van a procesar cada vez más el contexto en el que funciona el código principal.
Como resultado, los desarrolladores altamente calificados pasan la mayor parte del tiempo mejorando los aspectos del sistema, como la escalabilidad, el rendimiento, la verificación de errores, la confiabilidad, el mantenimiento, la abstracción, la portabilidad, el procesamiento de las condiciones de contorno, etc.
Además, aprenderán cómo trabajar de manera más eficiente o mejorar la interacción con otros desarrolladores y cómo abordar el trabajo para minimizar los riesgos, etc. El desarrollo del software cambia de codificación a sistemas de ingeniería y resolución de problemas.
Arquitecto de software: Cinturón negro

Todos los desarrolladores e ingenieros deberían poder diseñar las partes de los sistemas y productos que pretenden construir. El "Arquitecto de software" lleva esta habilidad a un nivel superior y toma una decisión al diseñar interacciones de alto nivel de sistemas de software más grandes desarrollados por otros ingenieros.
Ejemplo
En nuestro ejemplo, entre otras cosas, un arquitecto puede dibujar dicho diagrama para dirigir el desarrollo de un servicio para sumar enteros:

Para resolver eficazmente tales problemas, un arquitecto de software necesita años de experiencia en todos los niveles. Esta experiencia práctica entra en la memoria muscular. Permite al arquitecto tomar las decisiones correctas de alto nivel sin centrarse en los detalles.
Sin embargo, no creo en arquitectos puros, es decir, ingenieros que toman decisiones a tiempo completo a un alto nivel. Creo que un arquitecto confiable debería bajar al nivel de detalles individuales y salir de allí cuando sea necesario. Está listo para sumergirse de manera regular y efectiva en el código.
En artes marciales, el cinturón negro es maestro y mentor. Creo que la capacitación y la tutoría también son tareas de un arquitecto de software. La enseñanza de la que estoy hablando no es directa (conferencias), sino que se hace más con el ejemplo, mostrando el camino y guiando a las personas a tomar sus decisiones.
Conclusiones
Los luchadores serios estudian artes marciales toda su vida; Los desarrolladores de software serios hacen lo mismo. Espero que hayas encontrado útil esta discusión. Espero que proporcione un contexto para algunos términos mal definidos, e idealmente ayude a explicar cómo usarlos con mayor precisión.