@chrizel Du hast doch sicher Erfahrungen damit. Was denkst du, wählt man Angular, Backbone, Ember, oder geht in die Richtung von React.js? Hast du irgendwelche Präferenzen?
Größere Anwendungen: Webanwendungen, die einen Projektaufwand von eins bis vier Mannjahren haben. Viel Businesslogik, Schnittstellen zu verschiedenen Modulen.
Frontend:
- Backbone.js: Einfaches MVC-Framework, Event-System
- Underscore.js: Utilities, HTML-Templating
- Require.js: Modulsystem, fuer komplexere Anwendungen nicht wegzudenken, dynamisches Nachladen von Code
- jQuery: in Kombination mit Backbone-Views relevant
- Jasmine: Specs / Unit Testing / Integration Testing: Anwendungen dieser Groesse koennen ohne intensive automatisierte Tests nicht funktionieren
- Less: Vanilla CSS sucks, ohne Less geht nix mehr
Backend:
- PHP -- allerdings mehr aus historischen Gruenden, und weil ich darin am meisten Erfahrung bisher hatte... wie schonmal erwaehnt plane ich, dass wir mittelfristig von PHP weg gehen und auf Node.js setzen, allerdings nicht fuer dieses Projekt.
Continous integration wird mit Jenkins gemacht. Versionskontrolle ist bei uns seit Jahren git.
Fuer grosse komplexe Anwendungen kann ich dir vielleicht ein paar Tipps geben: Meiner Meinung nach spielt das Javascript-Framework das man verwendet nicht so eine riesige Rolle. Ich denke man kann in Backbone, Angular oder Ember gute Apps bauen, es ist mehr eine Stilfrage. Backbone ist halt verglichen mit Angular sehr klein und sehr flexibel an die eigenen Beduerfnisse anpassbar... Backbone zwingt einem nicht dazu einen bestimmten Programmierstil zu uebernehmen... im Grunde besteht Backbone ja nur aus fuenf Klassen, das wars.
Angular ist da natuerlich deutlich groesser und erwartet von einem, dass man auch den Angular-Stil uebernimmt. Das kann gut oder schlecht sein... ganz verkehrt finde ich die Idee mit dem $scope in Bezug auf Unit Testing jetzt auch nicht... von den custom HTML-Attributen bin ich allerdings kein grosser Freund, weil mein Stil eher weg von HTML-Templates geht, und viel viel mehr in JavaScript-Views selber macht. Angular ist also wahrscheinlich besser fuer Leute die mehr Webdesign mit ein wenig Business-Logik machen, aber weniger fuer grosse komplexe Sachen?
Mein Eindruck ist auch, dass der Angular-Hype inzwischen eher vorbei ist, d.h. auf ycombinator liest man in letzter Zeit ja eher negative Sachen... ein Arbeitskollege hat mal ein kleines Nebenprojekt mit Angular gemacht, nachdem ich anfangs begeistert davon gesprochen habe, hat dann allerdings ziemlich negativ darueber berichtet und hat das Projekt dann auf Backbone umgeschrieben, weil es einfacher ist... ich persoenlich hab wie gesagt nicht so viel Erfahrung mit Angular, und moechte es desshalb jetzt auch nicht schlecht reden.
Backbone dagegen hat sich als sehr gute Entscheidung herausgestellt. Der einzige Punkt bei dem ich etwas Probleme hatte, waren Memory-Leaks, denn das Event-System von Backbone verleitet dazu, dass man Memory-Leaks erzeugt... ganz speziell bei komplexeren Views die ggf. Subviews einfuehren und dann Beziehungen zu Models herstellen... hier kann es dir passieren, dass Views dann im Speicher bleiben, solange die Models noch verwendet werden, eben weil das Event-System so aufgebaut ist, dass sich Views bei den Models registrieren, und sich nicht automatisch deregistrieren wenn diese von der DOM verschwinden... mit etwas eigenem Code und einigen einfachen Regeln in Bezug auf Subview-Handling, bekommt man allerdings auch das gebacken, oder man setzt auf ein Nebenprojekt wie Marionette.
Ich habe mich vor einigen Jahren tatsaechlich gefragt, wie man grosse komplexe Anwendungen schreibt. Ich dachte lange Zeit, es funktioniert eigentlich nicht, weil irgendwann ist Ende im Gelaende und man durchblickt eigentlich nichts mehr... dann habe ich Kent Becks Buch "Test Driven Development" gelesen, und bin seitdem ueberzeugt, dass Testing essentiell ist, fuer jede Art von komplexerer Software.
TDD kann Test Driven Development bedeuten, aber auch Test Driven Design. Das Testing kann dein Softwaredesign vorantreiben, und fuehrt in den meisten Faellen automatisch zu einem sehr modularen System. Ich bin ziemlicher Fan davon, habe extrem gute Erfahrungen gemacht und in der Praxis inzwischen sehr intensiv eingesetzt.
Speziell JavaScript-Frontend-Code laesst sich von allen Systemen am besten testen, denn in der HTML-Welt kannst du sogar Views testen, denn am Ende muessen die Tests nur den DOM-Tree analysieren etc... das ist ein Vorteil, den man in keiner anderen Platform so einfach machen kann, und desshalb glaube ich, dass der Web-Frontend-Stack ideal fuer groessere komplexe Anwendungen ist.
Desweiteren halte ich ein Modulsystem fuer sehr wichtig. Require.js wirkt am Anfang sehr komplex, und vielleicht sogar unnoetig, aber nach einiger Zeit merkt man, dass AMD ziemlich genial ist. Require.js erlaubt dir nicht nur die Abhaengigkeiten von einzelnen JavaScript-Modulen zu definieren, du kannst durch Plugins sogar HTML-Templates und CSS einbinden, direkt an der Stelle wo es gebraucht wird. Das Require.js-Tool r.js optimiert dann alles hoch in eine einzige JavaScript-Datei... und das ganze ist so maechtig, dass du einzelne Seiten oder Funktionen deiner App zusammenfassen kannst, und dann im JavaScript-Code dynamisch JavaScript-Code nachladen kannst, der dann ausgefuehrt wird... das sind essentielle Dinge fuer Single-Page-Applications, weil du willst ja nicht den ganzen Code der ganzen App von Anfang an in den Speicher laden. Desshalb ist ein Modulsystem sehr wichtig.
Als inzwischen wirklich erfahrener Entwickler glaube ich, dass Prozesse wichtiger sind wie Sprachen oder Frameworks... der Erfolg einer Software haengt vielmehr von den Leuten ab, die den Code schreiben, und wie diese Leute den Code schreiben, und die Sprache und Libs sind einfach nur Werkzeuge um das Ziel zu erreichen... "the best tool for the job" wird mir inzwischen bewusster als noch vor 10 Jahren, wo ich noch auf der Suche nach "der perfekten Programmiersprache" war... inzwischen bin ich schlau genug, dass es das eigentlich nicht gibt, und ich glaube bei Frameworks und Libraries verhaellt es sich aehnlich.