Estoy programando en Java, en un estilo muy OO, solo. Nunca tuve la oportunidad de trabajar con otros programadores (al menos todavía no soy profesional).
Por curiosidad, quería preguntar: ¿Cómo funciona trabajar con un equipo en un proyecto, especialmente cuando se trabaja en un proyecto OO?
¿Cómo funcionan las tareas de división? ¿Cómo desarrollar algo que funcionará con éxito con algo que otro programador desarrolló? ¿Cómo y cuándo se comunican los programadores?
Gracias
object-oriented
teamwork
Aviv Cohn
fuente
fuente
Respuestas:
¡Espero poder ayudarte un poco, o al menos apuntarte en la dirección correcta!
Sin embargo, como un descargo de responsabilidad, es un tema enorme , y uno que realmente creo que toma " ser arrojado " para obtener una comprensión profunda. Dicho esto, haré un resumen rápido de los dos problemas principales:
Con respecto a los proyectos de OOP específicamente: honestamente, no puedo ver demasiados problemas específicos de OOP que no están presentes en otros lugares.
De hecho, creo que la programación estilo OOP es increíblemente adecuada para el desarrollo del equipo. Una característica clave de OOP es que no debería conocer todos los detalles sobre cada objeto con el que interactúo: solo necesito saber qué puede hacer y cómo puedo lograr que lo haga.
Las abstracciones que OOP puede proporcionar son increíbles en un equipo.
Fuente de control
Es necesario que haya un lugar central para el almacenamiento del proyecto, y uno que permita a múltiples desarrolladores acceder a la base de código en cualquier momento. Aquí es donde entran en juego sistemas como Git (o SVN).
Solo puedo hablar específicamente sobre Git, ya que nunca he usado SVN, sin embargo, creo que son similares pero con una terminología diferente.
Usando Git puedo crear un repositorio con todo el código fuente para un proyecto determinado, y luego permitir que mi equipo acceda al repositorio. Para cada función o corrección de errores que se realice, los desarrolladores individuales pueden crear su propia "rama", lo que significa que el desarrollo puede ocurrir en pistas paralelas.
Una vez que se completa una característica o corrección, se puede " fusionar " nuevamente en la base de código del proyecto principal. Git puede detectar cualquier " conflicto " y el desarrollador responsable puede resolverlo a nivel fuente.
No estoy seguro de si habrás usado Git antes, pero puede parecer bastante complejo al principio, pero gracias a su reciente popularidad (en parte a Github ) hay una gran cantidad de tutoriales y recursos.
Si no lo ha usado antes, ¡le recomiendo que se registre en GitHub y se familiarice de esa manera! (Alternativamente, Bitbucket es una alternativa similar, pero le permite tener depósitos privados de forma gratuita).
Git Flow es un excelente flujo de trabajo basado en Git que es increíblemente útil para los equipos. Al igual que Git en general, una vez que trabajas con él por un tiempo, ¡es difícil imaginar trabajar en un equipo sin él!
Comunicaciones
Una vez que supera todas las barreras técnicas, realmente llega al problema fundamental que afecta a la mayoría de los proyectos (técnicos o no), y eso es comunicación.
Todo el equipo debe ser consciente de quién está haciendo qué, cuándo lo está haciendo y qué afecta.
La responsabilidad debe estar claramente definida
Esto es obvio, pero la mayoría de los proyectos utilizarán algún tipo de sistema de tickets, donde se registran las solicitudes de características o errores, y luego se asignan a un miembro específico del personal. ( JIRA , Unfuddle , etc.) A menudo están integrados en el sistema de control de fuente, lo que simplifica un poco la vida. (BitBucket y GitHub proporcionan seguimiento de problemas para los repositorios de Git alojados con ellos).
Esto detiene o ayuda a evitar al menos que los desarrolladores trabajen accidentalmente en los mismos problemas.
Sin embargo, esto no es una solución completa; aún debe asegurarse de que los desarrolladores conozcan las responsabilidades de otros desarrolladores. Sé en el pasado que he solucionado otros problemas con los que me he tropezado en el curso de la reparación de un error específico, simplemente porque tiene sentido. (" Bueno, ya estoy aquí. Esto podría funcionar con un refactorizador y tal vez pueda verificar cualquier otro problema "). Luego tuve que disculparme con otros desarrolladores ya que estaban trabajando en esos otros problemas que tuve arreglado, desperdiciando nuestro tiempo.
En general, estos problemas se pueden solucionar ...
Reuniones regulares
Algunas metodologías de gestión / desarrollo de proyectos dictan métodos de comunicación específicos o intervalos de reunión. En general, los sistemas más productivos que he visto han sido las reuniones matutinas en las que todos los miembros de un equipo explicarán rápidamente lo que están haciendo; si limita esto solo a los miembros del equipo de desarrollo y tiene pautas claras sobre qué para comunicarse, entonces estos pueden ser increíblemente efectivos. Siempre he tratado de seguir:
Otros miembros del equipo pueden entender de inmediato que " Fergus está trabajando para corregir ese error que se registró el otro día, sin embargo, eso significa que está trabajando en algún código que necesito mirar. Lo consultaré antes de hacer cualquier cambio". ".
Reuniones arquitectónicas
Recientemente trabajé con un gran equipo que tenía un " chat tecnológico " quincenal , donde se debatían cuestiones arquitectónicas más grandes. Todos los miembros del equipo tuvieron tiempo de comprender los problemas más importantes que enfrenta el proyecto y pudieron discutir posibles soluciones.
Personalmente me encantó esto, no contribuí mucho ya que era bastante nuevo en el proyecto, pero poder escuchar las discusiones me dio mucha información; Muy pronto pude entender el proyecto, así como los estilos de pensamiento individuales.
La comunicación es el único problema que puede derribar a cualquier equipo. Técnico o no, si las personas no son conscientes del panorama general, existe una mayor posibilidad de que fallen.
Otros asuntos
Es bueno asegurarse de que todos tengan la misma configuración o estilo cuando trabajen en equipo. ¿Que quiero decir?
Configuración
Si está trabajando en un proyecto de Java, entonces quizás sea una buena idea asegurarse (al menos para entornos de desarrollo, ciertamente no para pruebas). Las versiones de JVM entre el equipo pueden ser una buena idea. Luego IDEs. Ayuda principalmente si todo el equipo está utilizando Eclipse o NetBeans o su IDE de elección.
En un proyecto web puede ser que todos los desarrolladores necesiten una pila específica; con versiones específicas de Apache o PHP .
Pensar en factores como este simplemente le permite al equipo "gelificar" un poco más rápido en mi mente.
Estilo
Tabs vs espacios? ¿CamelCase o spacing_with_underscores? Por pequeñas que sean estas preguntas cuando trabajas solo, cuando trabajas con un equipo más grande, realmente quieres luchar por un estilo común.
De hecho, no deberías poder saber quién escribió una sección específica de código, solo debes saber que pertenece .
Esta es la razón por la cual muchos proyectos de código abierto publican abiertamente pautas / guías de estilo de formato de código fuente: para tener una idea de lo que contienen, eche un vistazo a las Guías de estilo de Google para sus propios proyectos de código abierto.
Tareas y pruebas unitarias
Esto no se limita a los equipos, pero voy a mencionarlo rápidamente por una razón en particular: hace que la vida en equipo sea mucho más fácil.
Si tiene un flujo de trabajo complejo con muchas dependencias, o un proceso de construcción largo, entonces a menudo es útil automatizar esto usando un corredor de tareas. Para proyectos web, GruntJS es increíble, aunque proviene de Java, supongo que Apache Ant puede ser bastante similar.
Como individuo, uso GruntJS para construir mi sitio antes de implementarlo en mi servidor FTP: un comando Grunt es todo lo que necesito para compilar y minimizar mi CSS / Sass , comprimir mis activos y luego cargar mis archivos.
Sin embargo, como miembro del equipo, puedo usar GruntJS para verificar que no he roto ninguna prueba, y que no he introducido ningún error al no estar completamente al tanto de otras partes del proyecto. Esto es, por supuesto, adicional a los beneficios que me brinda como desarrollador individual.
También puedo usarlo para poder clonar un proyecto usando mi paquete de control de origen (Git) y ejecutar un comando para instalar todas mis dependencias. Esta es una gran ventaja, ya que el tiempo dedicado a conseguir un nuevo desarrollador en la posición en la que realmente pueden comenzar a desarrollar puede ser bastante grande, sin siquiera considerar el tiempo que lleva acostumbrarse a una base de código desconocida.
Documentación
Los mejores proyectos que he visto han tenido documentación (ya menudo bastante excesiva) dirigida a desarrolladores. Este tipo de documentos pueden explicar cosas como:
1. El entorno de desarrollo:
2. Flujo de trabajo
3. Responsabilidades en el equipo:
4. Una " tubería " para el futuro
Ejemplos
Puede valer la pena mirar el flujo de trabajo de un proyecto de código abierto para tener una idea de cómo funciona, ya sea uno establecido con su propio flujo de trabajo (a menudo muy documentado) o uno de los muchos ejemplos en GitHub.
Una última palabra de advertencia
Si te encuentras trabajando en un equipo que logra hacer todo esto correctamente ... ¡ odiarás estar en otro lugar ...! Tómalo de mí, una vez que hayas experimentado un buen equipo, los problemas repentinos en otros lugares realmente pueden arrastrarte hacia abajo. (¡Sin embargo, esa es una historia para otra publicación!)
fuente