with respond rails practices best ruby web-services api architecture

ruby - respond - rails api controller



¿Cómo construyo algo cuando sé que me equivocaré? (7)

Construir una aplicación grande y complicada de este tipo, especialmente una con muchas interdependencias, condiciones específicas del estado y divisiones cliente-servidor que pueden requerir el uso de lenguajes incompatibles, es desalentador sin importar cómo se enfoque. Según mi experiencia con otros proyectos de este tipo, estás destinado a fallar en tu primer intento, sin importar cuán cuidadoso seas. El truco es abrazar el fracaso como un paso inevitable en el camino hacia el éxito y no preocuparse por cada pequeña cosa a medida que desarrolla la aplicación.

La primera misión debería ser "trabajar" con la menor cantidad de programación posible, simplemente obtener el efecto que está buscando, incluso si es muy aproximado, para que pueda ver cómo encaja todo. Si puede descomponer el gran problema en una serie de pequeños problemas para resolver, puede encontrar el éxito con un elemento y eso puede ser motivador para abordar problemas más grandes o diferentes.

Una estrategia útil para emplear es mantener los elementos de la aplicación ligeramente acoplados, para evitar la interdependencia, excepto donde sea estrictamente necesario, para que pueda intercambiar o realizar mejoras en partes del todo sin tener una cascada de cambios consecuentes. Por ejemplo, su código de red podría ser capaz de transmitir cambios de estado entre el cliente y el servidor sin preocuparse por la naturaleza de los estados, pero su código de administración estatal no tendría que importar cómo se transmiten los estados, solo eso será.

También es útil tener un control sobre la arquitectura general de la aplicación para que no te pierdas en las malas hierbas. Desde una perspectiva de alto nivel, es posible que desee familiarizarse con los patrones de diseño básicos que pueden ayudarle a organizar un lío de código impenetrable en algo simple, modular y fácil de construir.

En cuanto a los marcos y los lenguajes, yo diría que eviten cambiar tan a menudo. Si bien es educativo explorar un nuevo idioma para ver qué características pueden ayudar con su problema en particular, probablemente sea más productivo si se apega a uno, incluso si puede ser difícil lograr algunas cosas, porque se vuelve más efectivo con él. , mejorando su enfoque para adaptarse mejor al idioma. Mientras que Haskell podría ser un mejor ajuste para algunos problemas, incluso el antiguo PHP simple puede ser entrenado para hacer exactamente las mismas cosas con suficiente determinación.

Existe la tentación de probar cosas nuevas, ampliar el alcance del trabajo para que se "haga bien", crear nuevas funcionalidades según se te ocurra, pero para mantener el proyecto bajo control, tendrá que mantener la disciplina para evitar estas actividades costosas y que distraen que a menudo, tomadas objetivamente, son solo vuelos de fantasía o prematuros dado el estado general del proyecto.

Para responder específicamente a su pregunta, compártala en el marco con el que está más familiarizado, dónde se encuentran sus puntos fuertes y hágalo en incrementos más pequeños que produzcan resultados útiles. Tal vez ese sea el motor de visualización del cliente, o el componente de red, o las transiciones de estado de back-end, pero sea lo que sea, debe tenerlo en un estado "suficientemente bueno" para comenzar a conectarle otros componentes.

Resolver diez pequeños problemas puede ser tedioso y lento, pero es mucho más fácil que resolver uno gigantesco.

Fondo

Tengo un proyecto personal que he estado tratando de construir durante unos 5 años. En esencia, es un juego en línea: una aplicación web. No es un "generador de dinero", simplemente es algo que realmente quiero construir, por lo que es muy poco probable encontrar el financiamiento para contratar un equipo calificado.

He construido dos prototipos completamente funcionales a lo largo de los años, ambos exitosos desde una perspectiva de prueba de concepto / usuario, pero ambos fallas espectaculares desde una perspectiva arquitectónica; el código era un desastre, no se podía mantener ni desarrollar, y tuvo que descartarse.

Tomó un buen par de años adquirir las habilidades necesarias para construir el cliente, que es rico / estable y bastante complejo. Alineé mi carrera y estudios hacia este lado de la brecha del desarrollo. Finalmente, estoy en un punto en el que puedo construir un cliente sofisticado y de arquitectura digna que pueda crecer y no necesite ser expulsado 6 meses después. Hay mucho trabajo por hacer en ese frente, pero al menos sé que puedo hacerlo y hacerlo razonablemente bien. El back-end es otra historia.

Hasta ahora he reconstruido el back-end al menos 11 veces con varias combinaciones de PHP, SQL, Ruby, CouchDB, MongoDB, FriendlyORM, NodeJS, etc. No suelo llegar muy lejos antes de descubrir un gran error con mi acercarse y comenzar de nuevo: RPC a REST, relacional con el documento. Soy consciente de que la optimización prematura es la raíz de todo mal, pero la aplicación es muy dependiente de los datos dinámicos y de rápido movimiento. Diseño RESTful API, escalado, fragmentación, almacenamiento en caché, autenticación, replicación: no tengo mucha experiencia con esto, y no puedo esperar ser remotamente decente en el corto plazo. Estas cosas requieren años de estudio y experiencia.

Tiene más sentido encontrar un experto en este campo, pero sin financiación, creo que necesito implementar con éxito otro prototipo para atraer a la persona adecuada. Entonces, tendré que construirlo lo mejor que pueda.

La pregunta

Suponiendo que, sin importar cómo lo construya, la arquitectura de back-end va a estar equivocada y tendrá que ser reconstruida, ¿cuál es la mejor manera de proceder con la construcción "lo suficiente" para continuar con el desarrollo de la aplicación cliente? Incluso si es desagradable, ¿hay alguna manera de "juntar" un servicio web JSON? Ruby con Sinatra y MongoDB? Django? ¿Hay algún desarrollador de servicios web fuera de la caja? No es necesario un marco web de pila completa ya que no hay capa de presentación, solo datos. Cualquier consejo sería muy apreciado.


Encuentro que solo hay una forma de completar un proyecto personal.

Código inteligente primero, plan más adelante. Desarrolla ese prototipo, pero diseñalo para que cualquier pieza individual pueda ser removida y reemplazada por otra pieza.

Si su elección de idioma es Ruby, por ejemplo, construya sus clases para tener una interfaz bien definida que nunca romperá. Preocúpese de que cada función "haga" lo correcto, sin importarle realmente cómo funciona.

Luego, regrese a su prototipo construido modularmente y arregle una pieza a la vez.


Haga que funcione lentamente, primero, con un código limpio y modular.

Si es modular, puede reemplazar una capa o dos sin tener que desechar todo.

Si bien brindan modularidad, tenga cuidado con los servicios web, incluso REST, ya que tienden a ser lentos; hay mucha sobrecarga con cada conexión, por ejemplo.


Johnny G casi lo clavó con su comentario a su pregunta original. La situación que describes incluso le sucede a la fortuna 500, créelo o no. Debe planear a fondo qué es lo que está intentando construir / lograr con su proyecto antes de elegir y desechar las tecnologías más nuevas y más frescas cada tres meses.

Creo que este artículo de Wired, "aprender a dejar ir" sobre el fracaso de Duke Nukem para siempre para terminar siendo enviado, lo explicará mejor que yo.

http://www.wired.com/magazine/2009/12/fail_duke_nukem/

(también es una lectura bastante divertida / informativa)


Mi opinión: Demasiado énfasis en la tecnología y no lo suficiente en sentarse y hacer los diseños adecuados.

  1. Comience con un diseño de alto nivel.
  2. Identifica las diferentes piezas principales involucradas. Dedique algún tiempo de calidad para los pasos 1 y 2.
  3. Vea qué componentes listos para usar puede usar para ayudar a implementar las diferentes piezas rápidamente. Considere que más adelante puede arrancar estos componentes para otra cosa (incluida su propia solución).
  4. Revisitar # 1 y # 2
  5. Elija una o dos piezas y comience a codificar un prototipo funcional para las piezas involucradas.
  6. Después de haber hecho el trabajo preliminar, comience nuevamente desde el paso n. ° 1 y vea qué ha cambiado para que pueda compensar en consecuencia.

No es necesario crear ningún tipo de back-end web para poder continuar con el prototipado de la aplicación cliente. Simplemente haga que la aplicación del cliente llame a las funciones que devuelven datos ficticios.


Si su proyecto apesta y nadie lo usa nunca, ¿qué importancia tendrá su optimización? Obtenga una versión de extremo a extremo funcionando, estoy seguro de que descubrirá muchos otros problemas que aún no ha considerado, que probablemente sean de mayor importancia.