Cuál es la diferencia entre un arquitecto de software y un ingeniero de software?

Creo que el título de arquitecto de software está un poco sobreutilizado y a menudo se confunde con el de diseñador de software (que es otro término confuso, porque no tiene nada que ver con el diseño como un esfuerzo artístico.)

Mis definiciones serían:

Arquitecto de software - esta persona se ocupa de los bloques de alto nivel. La conectividad entre los sistemas, la elección de las mejores tecnologías para los propios sistemas, y el mapeo de los requisitos de negocio en los requisitos de ingeniería. Tiene suficiente experiencia para entender cuándo se debe utilizar push/pull frente a pub/sub, por ejemplo, o cuándo es aceptable una db NoSQL en lugar de una base de datos SQL. También entiende los costes de la tecnología resultante (en términos de rendimiento y gastos operativos reales). Por último, un arquitecto tiene que entender el negocio, no sólo la tecnología.

Diseñador de software: una vez establecida la arquitectura, un diseñador es responsable de crear el diseño real del software. Puede crear un diseño para cada bloque arquitectónico modelando las clases apropiadas o las relaciones de la base de datos. También puede definir protocolos de cableado, formatos de archivo, etc.

Programador de software - una vez que se establece un diseño, el desarrollador de software implementa el diseño.

En orden de importancia, las decisiones tomadas a nivel de arquitectura son críticas y a menudo son muy difíciles y costosas de cambiar si se comete un error. Un error de arquitectura puede costar años en sistemas complejos. Un error de diseño puede costar unos cuantos sprints. Un error de programación se puede arreglar tan pronto como se identifique.

También hay que tener en cuenta que no hay ningún requisito de que una persona no pueda cumplir más de un papel. En las organizaciones formales, puede tener el arquitecto de software como una persona de alto nivel (o incluso un ejecutivo), con el diseñador siendo un líder de equipo de algún tipo, y el programador un contribuyente individual en ese equipo. Sin embargo, en la práctica, el arquitecto de software generalmente no deja un proyecto una vez que el trabajo de arquitectura se ha completado, y una vez que el trabajo de arquitectura se ralentiza, por lo general se involucra en el diseño, y en la programación.

La advertencia es, sin embargo, que el arquitecto es responsable de elegir los bloques tecnológicos en base a sus méritos, y no a su familiaridad, en cuyo caso puede acabar con una elección en la que puede contribuir poco a nivel de código. En esos casos, debería saber más y dejar la implementación a los expertos del dominio.

Esta es sólo mi opinión, sin embargo, estoy seguro de que hay muchas otras interpretaciones. Además, cuanto más sencilla es la aplicación, más superfluos se vuelven algunos roles. Para una aplicación sencilla, no se necesita un arquitecto. Si la aplicación es lo suficientemente sencilla, puede que ni siquiera necesites un diseñador. Pero siempre se necesita a alguien que la implemente.