Trabajo para una pequeña empresa de desarrollo de software independiente. Hemos estado en el negocio durante casi tres años y las cosas van bastante bien. Tenemos un flujo bastante constante de proyectos para una base de clientes en constante expansión y, como resultado, hemos comenzado cuidadosamente a contratar personal nuevo y ayuda temporal. Ahora contamos con cinco miembros permanentes del personal, de los cuales dos son desarrolladores de tiempo completo y uno divide su tiempo entre el desarrollo, el diseño y la administración del negocio.
Debido a que la carga de trabajo ha aumentado, nos hemos encontrado con algunos problemas: trabajamos muchas horas, no cumplimos con los plazos, no podemos dar estimaciones precisas sobre cuándo se completará un proyecto y la calidad de nuestro código está disminuyendo. Me han pedido que presente un proceso de desarrollo que se adapte mejor a nuestra empresa y proyectos.
Por lo general, trabajamos en varios proyectos a la vez; esto es inevitable debido a la cantidad de proyectos que hemos asumido y la pequeña cantidad de desarrolladores que tenemos. Actualmente, más o menos dividimos esto en intervalos de dos semanas: trabajo en el proyecto A durante dos semanas, trabajo en el proyecto B durante dos semanas y luego, inevitablemente, aparecerá algún problema con el proyecto A o C y pasaremos el día previsto. para el proyecto B en el proyecto A y C.
Nuestros clientes son de todo el país y de diversos orígenes. Algunos son habladores, otros no. Algunos esperan actualizaciones semanales, otros no tienen problemas con no tener noticias nuestras durante dos meses. Preferimos trabajar en iteraciones pequeñas: sacar un prototipo y ponerlo en manos del cliente lo más rápido posible (generalmente alrededor de un mes después de que comenzó el desarrollo) y luego repetirlo cada dos o cuatro semanas. Descubrimos que esto es esencial para el tipo de proyectos que hacemos y el hecho de que nuestros clientes a menudo no tienen una idea real de lo que quieren hasta que tienen algo parecido a lo que quieren en sus manos por un tiempo.
En este momento, nuestro proceso de desarrollo es bastante sencillo, pero obviamente deficiente. A nuestro diseñador se le ocurre una idea para una aplicación y un diseño gráfico rudimentario, y nuestros desarrolladores (uno, dos o los tres) dividen el trabajo ad hoc y comienzan a construir. De vez en cuando, comprobamos dónde estamos y ajustamos si es necesario. No hay mucho más que eso.
He estado pensando en hacer revisiones de código: cada pieza de código es revisada por al menos un desarrollador que no lo escribió. Esta parece una buena manera de comenzar a mejorar la calidad de nuestro código, pero lleva mucho tiempo que simplemente no tenemos. Lo mismo ocurre con las pruebas unitarias: pasamos semanas escribiendo pruebas y, a menudo, nos encontramos constantemente teniendo que modificar las pruebas porque descubrimos que no estaban probando las cosas correctas o que no estaban probando lo suficiente. Ese proyecto tomó mucho más tiempo que los proyectos en los que no hicimos pruebas unitarias y simplemente eliminamos los errores cuando los encontramos. Además, no tuvimos nada que mostrar al cliente durante semanas. Posiblemente lo estábamos haciendo mal, por supuesto.
También he estado pensando en agregar un probador dedicado a nuestro equipo: alguien que encuentre, categorice e informe de errores, para que los desarrolladores tengan que dedicar menos tiempo a encontrar errores y brindar soporte a nuestros clientes, y tengan más tiempo para dedicarlo a en realidad corrigiendo errores y desarrollando la aplicación. Obviamente, esta es una inversión significativa para un equipo pequeño como el nuestro, pero tengo la sospecha de que es una forma más efectiva de gastar dinero que simplemente enviar más desarrolladores a un proyecto.
En cuanto a proporcionar mejores estimaciones, no tengo una idea real. Hemos incursionado en la planificación del póquer, pero en mi experiencia eso equivalía a poco más que las conjeturas tremendamente inexactas que ya estábamos haciendo. Finalmente, quiero formalizar más el proceso de diseño, hasta cierto punto. Obviamente, debido al desarrollo iterativo, realmente no podemos establecer ningún diseño en piedra, pero probablemente no estaría de más si dedicáramos más tiempo al principio a formalizar tanto la arquitectura de la aplicación como el diseño gráfico.
Básicamente, tengo una idea razonable de lo que podemos mejorar y lo que nos falta actualmente, pero no tengo ideas concretas sobre cómo podemos lograr este objetivo. Por lo tanto, recurro a Stack Exchange. Probablemente hay muchos de ustedes en empresas similares a la nuestra que lucharon con los mismos problemas. ¿Cómo los superaste o en qué trampas caíste que sugieres que evitemos?
Usted identificó cuatro problemas. De esos, vería los siguientes dos como sus principales problemas (es probable que estos sean el resultado de largas horas y plazos incumplidos):
La calidad de su código está cayendo : cuando la calidad es mala, termina haciendo mucho trabajo no planificado. Esto da como resultado largas horas y plazos incumplidos sin olvidar el impacto en la moral del equipo.
No se pueden dar estimaciones precisas sobre cuándo se completará un proyecto : esto también daría como resultado muchas horas y una mala calidad del código o plazos incumplidos o ambos.
Parece que ha probado o considerado varias opciones para mejorar la calidad de su código:
Revisiones de código : en mi asignación anterior, tuvimos problemas con la calidad del código. Al introducir la revisión del código, pudimos detectar errores antes del lanzamiento y mejorar sustancialmente la calidad del lanzamiento. Como mínimo, revise el código de alto riesgo.
Pruebas unitarias : Nos costó mucho intentar introducir las pruebas unitarias. Si ya lo ha introducido, mi sugerencia es continuarlo al menos en algunos proyectos. Algunos usuarios han reportado grandes beneficios de las pruebas unitarias. Determina por ti mismo que no está dando los beneficios antes de abandonarlo.
Probador dedicado : Sugiero encarecidamente un probador dedicado. Los desarrolladores tienen puntos ciegos. Además, los desarrolladores no tienen la paciencia para realizar tareas repetitivas, que a menudo son necesarias para realizar pruebas meticulosas.
Para mejores estimaciones, tengo tres sugerencias:
Continúe planificando el póquer : como mínimo, divide el proyecto monolítico en partes más pequeñas (epopeyas/historias). Al revisar las estimaciones con los datos reales, puede ver cuáles son las áreas en las que su equipo tiende a equivocarse. Además, hace que los miembros del equipo hablen sobre el alcance del trabajo, el enfoque de desarrollo y cualquier riesgo/suposición en una etapa temprana. Capture estos en la historia/epopeya.
Disposiciones de cronograma : haga las siguientes disposiciones al elaborar cronogramas para nuevos proyectos:
10% (un día de cada sprint de dos semanas) para trabajos de mantenimiento en proyectos existentes.
10% para vacaciones, capacitación y ayuda con la licitación de proyectos futuros.
Refine sus estimaciones y cronograma después de la retroalimentación del prototipo : cuando recibe la retroalimentación de su cliente, es cuando el alcance es más claro (para su cliente y para usted). Es hora de afinar tu estimación e indicar cualquier cambio de horario a tu cliente.
Hay muchos libros sobre su situación y libros sobre cada punto que he mencionado aquí. Sin embargo, el punto más importante que repetiré es lidiar con su situación actual. Debes estabilizar y crear una base firme antes que nada. He visto demasiadas empresas en la situación de que han "construido casas sobre arena".
Creo que puede estar haciendo la pregunta equivocada aquí. Mencionó que el problema es que no cumple con los plazos y no puede dar estimaciones precisas de cuándo se completará el trabajo. El instinto natural de la mayoría de los técnicos es buscar una solución de gestión de entregas, que es lo que ha hecho.
Sin embargo, sugeriría que lo que está experimentando es un problema de relación con el cliente. Si los clientes se quejan de plazos incumplidos y estimaciones de entrega inexactas, puede abordar esos problemas administrando mejor la relación con sus clientes.
Recomendaría que asigne a alguien, tal vez una persona diferente por cliente, como punto de contacto para cada cliente. Deben establecer una relación con ese cliente que les permita negociar los plazos y las expectativas de entrega. Esto liberará la presión que siente actualmente de trabajar muchas horas y cumplir con plazos ajustados.
También puede encontrar algunas mejoras en los procesos que lo ayuden, pero la realidad es que la mayoría de las investigaciones en esta área se relacionan con equipos más grandes y mejor estructurados. Como ha descubierto, tratar de aplicar las "mejores prácticas" para la industria tiende a ser muy problemático para los pequeños grupos de empresas emergentes.
No podría estar más en desacuerdo con la respuesta que sugería "no aceptes más trabajo". El trabajo ganador es el elemento vital de las organizaciones pequeñas y absolutamente debe inscribir a todos los clientes que pueda. Pero no caiga en la trampa del ingeniero de pensar que la única solución a un problema de percepción del cliente es mejorar la calidad de la entrega. Los clientes pueden estar más satisfechos con un mejor servicio al cliente y alguna atención personalizada.
Recomiendo encarecidamente el "Arte del desarrollo ágil" de James Shore para impulsar la migración a una cultura ágil.
Dentro de las prácticas sugeridas en el libro se encuentran conceptos como 'menos es más' junto con una buena definición de 'éxito' (intersección del éxito técnico, personal y organizacional) y cómo lograrlo.
Parece que te enfrentas a la clásica situación de "víctima de tu propio éxito". El proceso que te ha hecho exitoso, está obstaculizando tu crecimiento futuro.
Sugeriría que el primer lugar para comenzar es comprender todas las razones por las que no cumple con los plazos. Es poco probable que sea solo uno. Sugeriría usar una herramienta como un diagrama de Ishikawa, http://en.m.wikipedia.org/wiki/Ishikawa_diagram . Asegúrese de que su equipo esté involucrado para ayudar a identificar todas las razones.
En segundo lugar, priorizar los temas, cuyas razones tendrán el mayor impacto, en el menor tiempo. Este es el tema a atacar primero.
Una vez que decidas mejorar un solo problema, sé tenaz. Por ejemplo, si determina que los errores le impiden no cumplir con los plazos, implemente revisiones tempranas del código. Siga así hasta que vea una mejora y el cambio se adopte en su cultura.
Además, intente capturar datos sobre su proceso siempre que sea posible, cuántos retrasos está encontrando, qué los causó. Esto le ayudará a demostrar el valor de sus esfuerzos de mejora.
También le aconsejaría a Ty que no solucione más de un problema a la vez.
morten kirsbo
Péter Török
Bajo
Bajo