¿Por qué siempre siento que mi código del último trimestre no estaba bien escrito?

Esto es completamente natural. Hay 3 razones principales

Accesorio de la solución
Cuando se te ocurre una solución, es natural comenzar a pensar en la solución como tu bebé y apegarte a ella. Alejarse de la solución y volver a ella después de un tiempo le permite criticarla mejor.

Es por eso que tenemos revisiones de diseño y código. Y esta es la razón por la que no debes tomar la crítica de tu diseño y código personalmente. Es perfectamente natural estar a la defensiva sobre su código. No es productivo, y tienes que luchar conscientemente contra el impulso.

Mentalidad de los ingenieros
Un ingeniero siempre busca cosas para mejorar. Es perfectamente natural mirar algo que has hecho y encontrar formas de mejorarlo. Este tipo de perspectiva debería fomentarse entre todos los ingenieros.

Crecimiento personal
Cuanto más aprende, más encuentra fallas en lo que ha hecho. La primera gran aplicación del lado del servidor que escribí comenzó un hilo para cada usuario que atendió. ¡Pensé que el diseño era lo MEJOR! 5 años después, aprendí sobre las maravillas de Thread Pools y colgué la cabeza avergonzado.

Esa sensación que te produce ver el código antiguo y avergonzarte de él: nunca desaparece. Se vuelve poco frecuente, pero nunca desaparece. Nunca debería desaparecer. Si se ha ido, entonces has perdido tu ventaja.

En el caso general, esto probablemente se deba a que el primer 75-80% del código es fundamental y fácil de escribir. El último 15-20% es donde uno resolverá el problema real. Resolver el problema real puede llevar más tiempo que escribir los cimientos o las tuberías. Esta es la razón por la que existen marcos. La base está hecha, solo resuelve tu problema.

Otra posibilidad es que las personas simplemente se emocionen cuando estén cerca de resolver un problema y corran hacia la línea de meta. A veces eso lleva a un código descuidado. Y esa última parte que escribiste termina siendo un poco pobre en comparación con todo lo que has hecho allí.

Para responder a la última parte de su pregunta, cuando vuelve a mirar el código, los ojos con los que lo mira tienen más experiencia. Ha resuelto más problemas, ha dejado pasar este problema en particular por un tiempo y puede haber encontrado una solución mejor sin el tiempo para implementarlo. Es posible que haya aprendido un nuevo paradigma que funciona mejor aquí. Hay muchas razones para que ocurra la madurez del código. De cualquier forma que lo corte, nunca debe dejar de aprender en un campo que está en constante evolución. La madurez puede ser simplemente darse cuenta de que tienes mucho que aprender y saber cuándo el código es simplemente lo suficientemente bueno.

Cada vez que los buenos desarrolladores miran el código (y realmente no importa quién lo escribió) ven alternativas, posibles refactorizaciones a la espera de suceder o simplemente algo que no tiene mucho sentido.
Todavía tengo que mirar un código y ver la Mona Lisa .
Si se siente aventurero, siga adelante y refactorice, pero recuerde que siempre se escribe un fragmento de código para satisfacer algunos requisitos que incluyen legibilidad y facilidad de mantenimiento .
Tengo un consejo para ti. Si encuentra su código pasado por debajo del par, comience a escribir en los comentarios las razones por las que eligió el diseño. De esta forma, cuando lea el código unos meses después, recordará por qué lo hizo de esta manera o tendrá una razón válida para estar feliz de seguir evolucionando y mejorando como ingeniero de software.

No es algo malo Si sientes que tus viejos códigos son malos, estás creciendo, siempre siento que mis viejos códigos son malos.

Nunca hay los mejores códigos, solo mejores códigos.

Debe aprender a pensar las cosas dinámicamente, algunos códigos malos no son un gran problema, si y solo si puede seguir mejorando. Creo que nunca hay un trato de una vez por todas, quiero hacer algo grandioso que necesitas para seguir mejorando.