¿Qué es un proceso eficiente de desarrollo de aplicaciones web? ¿Se debe comenzar desde la estructura del sitio y la interfaz de usuario? ¿Debería uno mapear todos los recursos que tiene primero? ¿Debería uno mapear primero los modelos y considerar cómo se conectan antes de codificar?

Wow, esta pregunta es realmente complicada y creo que obtendrás muchas respuestas interesantes y diferentes. Comenzaré diciendo que creo que estás haciendo la pregunta equivocada.

Su pregunta supone que debe abordar su sitio en segmentos horizontales, es decir: realice TODO el modelado primero o realice TODA la interfaz de usuario primero. Si haces esto, estarás luchando con la forma en que Rails quiere hacer las cosas. Rails está diseñado para un desarrollo ágil, lo que significa abordar su proyecto en sectores verticales, es decir: hacer el esquema de la base de datos, modelo, enrutamiento, controlador, interfaz de usuario para una sola característica antes de continuar.

Entonces, lógicamente, la siguiente pregunta se convierte en “¿Qué función debo hacer primero?”, Y para lidiar con eso, necesitaremos profundizar un poco en la gestión de proyectos. Esta no es la forma de hacer un desarrollo ágil, pero es una forma, y ​​debería servir como iniciador para la discusión si tiene algún interés en seguirlo.

1. Escriba una lista de objetivos, roles y características.

  • Objetivos: cuáles son los objetivos de todo el proyecto: negocios y otros. Esto lo ayudará a decidir qué características son importantes.
  • Roles: ¿quién va a usar el sitio? ¿Visitantes, miembros registrados y administradores? ¿Diferentes personas tienen diferentes puntos de vista de la misma información en el sitio?
  • Características: ¿cuáles son las categorías básicas de interacción en el sitio? Por ejemplo: Usuarios: registro, uso de foros y blogs; Administradores: moderando el contenido del usuario

2. Escribe una lista de historias

  • Una historia es diferente a una característica porque representa un hilo único de interacción desde la perspectiva de un usuario en particular.
  • Es común expresar historias en forma “Como ____ quiero ____ para poder _____”. Esto te obliga a responder tres preguntas importantes: ¿para quién es esto? ¿Qué quieren hacer? ¿Por qué quieren hacerlo?
  • Si no puede completar una historia de esta forma, es probable que todavía no tenga una respuesta a una de estas tres preguntas, por lo que deberá pensar un poco para obtener las respuestas antes de que la historia sea procesable.
  • Ej: “Como administrador, quiero excluir a los usuarios del foro, para poder mejorar la calidad del contenido enviado por los usuarios en el sitio.
  • Escriba estas historias en tarjetas de notas. Esto lo ayudará en la estimación y priorización.

3. Estima las historias

  • La estimación es un tema enorme en sí mismo, pero la idea básica es asociar un nivel particular de esfuerzo con cada historia.
  • Las escalas más comunes son 0/1/2/3/4, 0/1/2/4/8. No creo que esto sea increíblemente importante, pero elige algo y quédate con él.
  • No se obsesione con la exactitud de las estimaciones. Muchas cosas afectan el tiempo que lleva terminar una historia, por lo que pequeñas diferencias en la complejidad de la historia tienden a perderse en el ruido.
  • Su objetivo aquí es diferenciar las cosas que requieren poco esfuerzo, como las historias que resultarán en que cree un modelo simple con un controlador REST, de las historias que requieren mucho esfuerzo, como la interfaz de su aplicación con una API de terceros desafiante, o una historia que requerirá que uses una tecnología con la que no estás muy familiarizado.
  • Escriba la estimación en cada tarjeta.


4. Prioriza las historias

  • Reorganice las tarjetas en el orden en que le gustaría abordar las historias.
  • Solo el propietario del producto puede realmente tomar esta decisión. Hay muchas cosas que entran en la priorización: plazos, pruebas de usuario, valor comercial, etc. La estimación puede tener mucho que ver con la priorización, ya que ilumina el costo de oportunidad. Tal vez el propietario del producto realmente quiera ese Panel de administración detallado, pero si todas las historias para hacer que ese trabajo sume un total de 40 puntos, ¿vale la pena gastar un mes solo en esta función? Quizás el dueño del producto todavía quiera la historia
  • ¿Hay alguna historia que no se ajuste al mínimo producto viable para lanzar? Si es así, debes moverlos hacia abajo. Intenta completar una aplicación que funcione lo más rápido posible para que puedas ponerla frente a los usuarios.
  • En este punto, generalmente muevo mis tarjetas a Pivotal Tracker, pero conozco a muchas personas que prefieren lápiz y papel.


5. Pruebe la primera historia hasta completarla

  • Comience con Cucumber Escriba una función de Pepino que cubra la interacción del usuario con el sitio de principio a fin. Defina los pasos indefinidos cuando llegue a ellos, y cuando llegue a su primer fallo, sabrá que hay un comportamiento que desea que su aplicación no tenga (esto sucederá muy rápidamente al principio, porque su aplicación en blanco no tener mucho comportamiento).
  • Si tengo interacciones de JavaScript que son una parte clave de la interacción del usuario, trato de que Cucumber las pruebe usando la etiqueta @javascript.
  • Continúe con RSpec Escriba la prueba del comportamiento que desearía tener.
  • Escriba su código Escriba el código para hacer pasar la especificación. Esto lo llevará a través de su aplicación, desde el enrutamiento a la interfaz de usuario, a los modelos, al esquema de la base de datos y al controlador. Abordará estas piezas de código en el orden en que sus pruebas lo dirijan.
  • Repita hasta que pase el pepino, y haya terminado con la historia.
  • Ahora es un buen momento para arreglar el estilo CSS, suponiendo que haya realizado el diseño. Si estoy trabajando solo o sin un diseñador, me gusta intentar trazar la interfaz de usuario en papel o en algo como Balsamiq Mockups antes de comenzar a codificar la historia.

6. Acepta la historia

  • ¿Es aceptable la historia? ¿Hace lo que querías que hiciera? Si no, debe regresar y hacer que funcione de la manera en que se suponía que debía hacerlo. Escribir pruebas de pepino de antemano ayuda a evitar que esto suceda.
  • ¿Pasan todas tus pruebas? No rompiste la construcción, ¿verdad? Si es así, debes arreglar lo que rompiste.
  • Si está trabajando solo, puede ser útil que alguien más lo acepte, ya que puede ser difícil ver su propio trabajo con ojos objetivos.


6. Repita hasta que termine

Así es como hago las cosas. De ninguna manera es la única forma de hacer cosas, pero es una forma muy común de hacer cosas en Rails. Creo que hay un buen debate en torno al valor de la estimación ágil, o de tecnologías particulares como Cucumber vs. Steak o RSpec vs Test :: Unit, pero la mayoría de los desarrolladores de Rails estarán de acuerdo en que el flujo de trabajo adecuado es: 1) Identificar un historia única 2) Escribir pruebas para ello 3) Completarlo.

Las ventajas de este enfoque son numerosas. Tiene algo que poner en frente de los usuarios para recopilar comentarios desde su primer registro. Su plan de proyecto es extremadamente flexible en términos de prioridades cambiantes y altamente tolerante a los requisitos cambiantes. Si ha realizado alguna cantidad de ingeniería, sabe que los requisitos cambiantes no son una cuestión de si, sino de cuándo y cuánto. Solo por esas 3 razones, debe abordar el desarrollo de su aplicación en sectores verticales en lugar de los sectores horizontales que sugirió en su pregunta.

Hay bastantes preguntas aquí, así que me centraré en la principal. Con suerte, en el camino, responderé algunas de las otras preguntas también.

A un alto nivel, una forma útil de medir la eficiencia del proceso de desarrollo web podría ser maximizar el porcentaje de tiempo centrado en entregar software valioso.

La palabra clave en la oración anterior es “valiosa”.

Debido a que las aplicaciones son creadas por y para las personas (al menos hasta que los robots se hagan cargo), maximizar el valor y minimizar el desperdicio puede requerir centrarse tanto en construir las cosas correctas como en construirlas correctamente.

Con ese fin, a continuación se presentan algunas lecciones aprendidas sobre cómo:

  • Determinar qué valoran los interesados
  • Desarrolle software flexible que maximice la velocidad de valor.
  • Desarrollar software sostenible.

Determinación del valor de las partes interesadas:

Muchos proyectos comienzan sin una comprensión clara de la combinación exacta de mensajería y servicios que los clientes potenciales y otras partes interesadas encontrarán valiosos.

Crear nuevas funciones en ciclos cortos y rápidos puede ayudar a su equipo a obtener esa comprensión. Las iteraciones cortas y rápidas también pueden reducir el costo del fracaso al permitirle experimentar más.

Algunas herramientas para ayudarlo a obtener un valor más rápido:

1: Imagine nuevas características como pruebas de valor en lugar de funcionalidad
Una prueba de valor es diferente de una característica en que su razón principal para existir no es agregar una funcionalidad valiosa para las partes interesadas, sino medir el valor de esa funcionalidad.

Cuando planifique la función, pregunte:

  • ¿Para quién?
  • ¿Qué problema / beneficio asumo que resolverá / proporcionará?
  • ¿Cómo mediremos si la función cumple con estos objetivos?

Es posible que haya visto conceptos relacionados con lo anterior como historias de usuarios o declaraciones de problemas en metodologías ágiles y lean, respectivamente. Aunque diferentes metodologías pueden adoptar diferentes enfoques, el objetivo común es ayudar a enmarcar y resolver los problemas que las partes interesadas valoran.

2: priorice sus funciones según el riesgo comercial
Para determinar qué características construir / probar primero, es útil mirar cada característica como una suposición del valor del cliente y preguntar: “¿Cuál de estas suposiciones sería más CARA si fuera incorrecta?” puede ahorrar una cantidad significativa de dinero y tiempo en el futuro.

3: Pon a prueba tus características en apretados bucles de “pensar / hacer / probar”.
Antes de implementar una nueva característica, es útil tener una buena métrica para medir su valor. Una métrica puede ayudarlo a hacer preguntas como “¿Cuál es la cantidad mínima de trabajo que podemos hacer para validar el valor de esta función?”

Por ejemplo, una encuesta bien diseñada o un prototipo en papel de baja fidelidad puede ayudar a validar (o invalidar) el valor de su función esperada antes de escribir cualquier código. Es posible que se sorprenda de cuánto puede aprender acerca de cómo las personas realmente interactuarán con su producto en un corto período de tiempo. Un beneficio adicional de las pruebas en papel es que para cuando se implementa la característica, ya se puede incorporar una cantidad significativa de conocimiento de interacción del usuario.

Aquí hay un consejo: para obtener una respuesta inicial rápida, pruebe el prototipo en papel con dos personas en su equipo, luego dos o tres personas que encuentre en el pasillo.

4: Integre las métricas de retroalimentación en las historias que implemente.
Siempre que sea posible, implemente un ciclo de retroalimentación que asigne nuevas características a uno de los indicadores clave de rendimiento de su negocio. Los bucles de retroalimentación pueden ser ligeros, como agregar un código de análisis, o más cualitativos, como encuestas de usuarios o tickets de mesa de ayuda.

Dar prioridad a la configuración de un panel de control que asigna las características de la aplicación a los indicadores clave de rendimiento de la compañía puede ayudarlo a asignar sus recursos de manera más eficiente.

Desarrollo de software flexible con la máxima velocidad de valor.

Cuando se trata de entregar software, un proceso de desarrollo ágil de software puede acelerar la entrega del valor comercial inicial y, a través de un proceso de planificación y retroalimentación continuas, maximizar ese valor durante todo el proceso de desarrollo.

Algunas prácticas de desarrollo ágil que he encontrado útiles:

1. Divida las características deseadas en una o más historias de usuario.
Las historias de usuario son piezas de funcionalidad que juntas se suman a una característica entregable que proporciona valor comercial. Una plantilla común para historias de usuarios ágiles es:
“Como , quiero para que “.
Esta plantilla especifica el tipo de persona que usará la función, lo que la función les permitirá cumplir y por qué quieren hacer esa tarea (valor comercial).

2. Especifique los criterios de aceptación para cada historia
Los criterios de aceptación son las condiciones que debe cumplir la historia para ser aceptada por un usuario, cliente u otra parte interesada. Piense en los criterios de aceptación como un contrato entre las partes interesadas y el equipo de desarrollo. Si la historia satisface los criterios de aceptación, el equipo ha cumplido su parte del trato.

Consejo: Obtenga la mayor cantidad posible de partes interesadas para firmar los criterios de aceptación. ¡De esta manera no te sorprenderás a última hora con nuevos requisitos!

3. Rebana tus historias verticalmente
Intente estructurar sus historias en segmentos verticales : incluyendo cada capa de software (UI, servicio, datos) que esté involucrada en hacer que una característica específica funcione. De esta manera, el desarrollador puede entregar una historia terminada que se puede probar por su valor con los usuarios reales.

Por ejemplo: un formulario con dos campos de entrada puede construirse en sectores verticales agregando la funcionalidad de la IU, el servicio y la capa de datos para un campo de texto a la vez.

Este artículo de Wikipedia ofrece una buena cartilla sobre cortes verticales.

4. Crear software en iteraciones cortas
Las iteraciones son unidades de tiempo de trabajo de desarrollo de software, a menudo de una o dos semanas de duración, que siguen un cronograma estricto.

Una iteración incluye …

  • Una reunión de planificación de iteración donde las historias son priorizadas, estimadas y seleccionadas para el desarrollo.
  • Reuniones cortas (de 5 a 10 minutos) todos los días para ayudar a monitorear el progreso del equipo hacia el cumplimiento de los objetivos de iteración. Una forma de hacerlo es hacer que cada miembro del equipo responda las preguntas “¿Qué hiciste ayer?”, “¿En qué estás trabajando hoy?” Y “¿Hay algo que bloquee tu progreso?” Cualquier discusión sobre estas respuestas debería ocurrir después La reunión ha terminado.
  • Implementación y demostración de las historias seleccionadas para la iteración.
  • Una retrospectiva donde el equipo discute qué fue exitoso acerca de la iteración y qué podría mejorarse.

En la práctica, cada uno de estos pasos tiene muchos matices. Entonces, si desea obtener más información, este libro explica bien el proceso en mayor profundidad.

Entrega de software sostenible:

Cuanto más exitosa sea su aplicación web, más personas probablemente interactuarán con la base de código. Aquí hay algunas ideas sobre cómo administrar la complejidad y mantener su base de código mantenible.

1. Desarrollo impulsado por pruebas de práctica.
Siempre que sea práctico, cree su software con prueba primero con TDD / BDD . Un conjunto de pruebas automatizadas puede ayudarlo a diseñar un mejor software desde el principio. También puede disminuir la probabilidad de que una nueva característica rompa la funcionalidad existente sin que usted lo sepa. Menos tiempo dedicado a corregir errores inesperados significa que puede ofrecer más funciones con el tiempo.

Si aparece un error, con un conjunto de pruebas automatizadas, puede escribir una prueba para ello, luego corregir el error para que la prueba pase. De esta manera, cada vez que ejecute sus pruebas automatizadas, probará que ese error en particular permanece fijo.

Al igual que el código de la aplicación, cada línea de su conjunto de pruebas deberá mantenerse. Este Slideshare de Sandi Metz tiene algunos consejos útiles sobre cómo probar lo que importa.

2. Desarrollar con la calidad del código en mente
La programación en pareja es una forma eficiente de transferir conocimiento a todo el equipo. La práctica también promueve la propiedad del código colectivo. Cuando todos en el equipo conocen la base del código, si un desarrollador se enferma, el equipo puede continuar trabajando. Como beneficio adicional, debido a que hay dos cerebros en un problema, el código de un par también tiende a ser más legible y de mayor calidad.

Si la programación de pares es demasiado costosa o poco práctica, la revisión frecuente del código también puede promover la transferencia de conocimiento. Al igual que la programación de pares, la revisión de código tiene compensaciones. Pero es otra forma de promover un código de mayor calidad.

3. Optimizar para facilitar la lectura
Finalmente, cuanto más fácil sea para alguien sin exposición previa entender su base de código, más fácil será escalar el equipo de desarrollo cuando su negocio despegue.

More Interesting

Al programar software y aplicaciones web, ¿cómo determina la etapa en la que se encuentra realmente? (es decir, beta, alfa, estable, etc.)

¿Cuál es la mejor manera de organizar / estructurar un grupo de programadores?

¿Cuál es la lista de habilidades que debe tener todo ingeniero de software integrado?

¿Deben los ingenieros diseñar?

Recientemente en mi empresa, hemos recurrido más a empresas externas para el desarrollo. Soy un desarrollador nuevo, ¿cómo puedo desarrollar mis habilidades en este entorno?

¿Qué habilidades y experiencia son necesarias para ser contratado como Ingeniero de Software III en Google?

¿Contratar programadores promedio es peor que quedarse solo?

¿Cuál es el campo de las matemáticas más requerido durante el desarrollo de software / juegos?

Con respecto al desarrollo web, ¿cómo hago para que una imagen de fondo grande se cargue rápidamente?

¿Cuándo es seguro llamarse desarrollador específico de un idioma? Por ejemplo, desarrollador Python o desarrollador Java.

En los proyectos de desarrollo de software, ¿qué porcentaje de tiempo se gasta en cada fase de SDLC? ¿Agile ha tenido algún impacto en la duración de cada fase?

¿Se puede considerar a un desarrollador de pila completa como ingeniero de software?

¿Qué es la automatización de software y cómo puede afectar a un codificador de núcleo duro?

Cómo escribir código para un fondo de pantalla que cambia semanalmente

¿Por qué las empresas despiden a las personas (debido al bajo rendimiento) cuando en cambio pueden entrenarlas para ser mejores, como en la industria india de TI?