¿Por qué el tío Bob sugiere que los estándares de codificación no deberían escribirse si puedes evitarlo?
Si está preguntando razones detrás de su opinión, entonces puede tener una respuesta solo si él publicará una respuesta aquí ( nuestra opinión es irrelevante), sin embargo ...
¿Por qué no debería escribir un estándar de codificación?
Si está preguntando si tiene razón al respecto: déjeme ser el único impopular (hasta ahora) que diga que no tiene ninguna razón para evitarlo.
ESCRIBIRLO ABAJO . Sin embargo, intentaré explicar mis razones ...
David sugirió en un comentario que el punto principal de la respuesta de Stephen no es por qué no debería escribir documentos, sino en qué forma están. Si las pautas se formalizan en las herramientas (no solo en la revisión manual del código), entonces puedo estar de acuerdo (cuando la ley no requiere otra cosa). Tenga en cuenta que desafortunadamente las herramientas no pueden verificar todo (la teoría de la computación no es nuestra amiga) a menudo porque están limitadas a una unidad o paquete de traducción específico o como su idioma favorito llame a un límite .
Sin embargo, la redacción del tío Bob no me hace pensar que está hablando de eso.
¿Puedo estar en desacuerdo con un experto tan alto? Lo hago, para casi todos los puntos en la publicación citada (ver también la segunda parte de esta respuesta para más detalles). Tratemos de entender por qué (suponiendo que ya sepa que las pautas de codificación no son solo problemas menores de formato ).
- En algunas circunstancias, la ley exige normas de codificación escritas.
- Leo la documentación y estoy seguro de que no estoy solo. Los miembros del equipo pueden cambiar con el tiempo, el conocimiento no puede estar en una base de código de 5 a 10 años o en la mente de los miembros del equipo. Las organizaciones deberían despedir a las personas que no siguen las pautas internas.
- Los estándares de codificación, una vez que hayan sido aprobados , no cambiarán con frecuencia y si lo desea, debe saberlo. Si los estándares cambiaron, entonces su documentación (en el código) está desactualizada porque todo su código no sigue el nuevo estándar. Reformatear / refactorizar puede ser lento, pero siempre debe seguir una guía autorizada por escrito .
- Es mejor leer un documento de 5 páginas que inspeccionar 10 / 20K LOC para extrapolar una regla (que puede comprender erróneamente, por cierto), no hay duda al respecto.
- Es irónico que alguien que escribió muchos libros sobre principios de diseño y estilo de codificación sugiera que no debe escribir sus propias pautas, ¿no es mejor si nos deja con algunos ejemplos de código? No, porque las pautas escritas no solo le dicen qué hacer, sino también otras dos cosas de las que carece el código: qué no hacer y razones para hacerlo o no.
La "programación de autoorganización gratuita" es buena para un chico ninja de 16 años, pero las organizaciones tienen otros requisitos :
- La calidad del código debe otorgarse (y definirse) a nivel de empresa: no es algo sobre lo que un solo equipo pueda decidir. Es posible que ni siquiera tengan las habilidades para decidir qué es mejor (¿cuántos desarrolladores, por ejemplo, tienen todas las habilidades requeridas para revisar MISRA o incluso simplemente entender cada regla?)
- Los miembros pueden moverse a través de diferentes equipos: si todos siguen los mismos estándares de codificación, entonces la integración es fluida y menos propensa a errores.
- Si un equipo se autoorganiza, los estándares evolucionarán con el tiempo cuando los miembros del equipo cambien; entonces tendrá una enorme base de código que no sigue los estándares aceptados actuales .
Si está pensando en las personas antes del proceso , solo puedo sugerirle que lea sobre TPS: los seres humanos son una parte central de Lean, pero los procedimientos están altamente formalizados.
Por supuesto, una organización pequeña con un solo equipo puede dejar que el equipo decida los estándares a adoptar, pero luego debe anotarse. Aquí en Programmers.SE puede leer publicaciones de Eric Lippert: Supongo que todos estamos de acuerdo en que es un desarrollador experimentado, cuando trabajó para Microsoft tuvo que cumplir con sus pautas escritas (incluso si algunas reglas pueden ser incorrectas , no aplicables o inútiles) a él.) ¿Qué pasa con Jon Skeet? Las pautas de Google son bastante estrictas (y muchas personas no están de acuerdo con ellas), pero debe cumplirlas. ¿Les falta el respeto? No, probablemente trabajaron para definir y mejorar tales pautas, una empresa no está compuesta por un miembro (o un equipo) y cada equipo no es una isla .
Ejemplos
- Decidió no usar herencia múltiple y clases anidadas en C ++ porque los miembros reales del equipo no lo entienden bien . Más tarde, alguien que quiera usar herencia múltiple debe explorar todo el 1M LOC para ver si alguna vez se ha usado. Es malo porque si las decisiones de diseño no están documentadas, debe estudiar toda la base de código para comprenderlas. E incluso entonces, si no se ha utilizado, ¿es porque está en contra del estándar de codificación, o está permitido, pero simplemente no hubo situaciones anteriores en las que la herencia múltiple fuera una buena opción?
- En C # había sobrecargado los métodos para proporcionar parámetros predeterminados porque su base de código comenzó cuando los parámetros opcionales no estaban disponibles en C #. Luego cambió y comenzó a usarlos (refactorizando el código antiguo para usarlos cada vez que tenía que modificar tales funciones). Incluso más tarde, decidió que los parámetros opcionales son incorrectos y comienza a evitar usarlos. ¿Cuál es la regla que te dice tu código? Es malo porque el estándar evoluciona, pero la base de código es más lenta y si es su documentación, entonces está en problemas.
- Jon pasó del equipo A al equipo B. Jon tiene que aprender un nuevo estándar; mientras aprende, probablemente introducirá errores más sutiles (o, si tiene suerte, solo tomará mucho tiempo comprender el código existente y hacer que la revisión del código sea más larga).
- El equipo A pasa a una base de código que anteriormente pertenecía al equipo B. Tiene estándares de codificación completamente diferentes. ¿Volver a escribir? ¿Adaptar? ¿Mezcla? Todos ellos son igualmente malos.
Tío Bob
Déjelos evolucionar durante las primeras iteraciones.
Es cierto, hasta que no tenga un estándar y su organización le haya asignado la tarea de construir uno.
Permítales ser específicos del equipo en lugar de específicos de la compañía.
No, por todas las razones explicadas anteriormente. Incluso si piensas formalizar solo el formateo de código (lo menos útil que quieras formalizar), todavía tengo memoria de guerras interminables (e inútiles) sobre el formateo. No quiero vivirlos una y otra vez, configúrelo de una vez por todas.
No los escriba si puede evitarlo. Más bien, deje que el código sea la forma en que se capturan los estándares.
No, por todas las razones explicadas anteriormente (por supuesto, a menos que refactorice todo su código de una sola vez cuando cambien las pautas). ¿Quieres dejar tu código tal como está? ¿Cómo inspecciona la base de código para comprender las pautas actuales ? ¿Busca por antigüedad del archivo y adapta su estilo de codificación a la antigüedad del archivo de origen?
No legisles un buen diseño. (por ejemplo, no le digas a la gente que no use goto)
Es cierto que las pautas deben ser cortas o nadie las leerá. No repitas lo obvio.
Asegúrese de que todos sepan que el estándar se trata de comunicación y nada más.
No solo, un buen estándar se trata de calidad a menos que desee tener un estándar solo sobre detalles menores .
Después de las primeras iteraciones, reúna al equipo para decidir.
Vea el primer punto y no olvide que un estándar de codificación suele ser un proceso que tardó muchos años en desarrollarse y refinarse: ¿pocas iteraciones, tal vez con desarrolladores junior? De Verdad? ¿Desea confiar en la memoria de un miembro senior (si lo hay)?
Tres notas:
- En mi opinión, los inconvenientes son más graves con algunos lenguajes que con otros, por ejemplo, en C ++, un estándar a nivel de empresa es aún más necesario que en Java.
- Es posible que este razonamiento no se aplique por completo (y los motivos del tío Bob pueden ser menos extremos ) si está trabajando en una empresa muy pequeña en la que solo tiene un equipo pequeño.
- Estás contratado (como equipo) y trabajarás solo con un nuevo proyecto, luego lo olvidarás y seguirás adelante. En este caso, es posible que no le importe (pero su empleador debería ...)