Der Programmier-Thread

PSN-Name: chrizeliq
@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?
Ich habe mir natuerlich schonmal Angular und auch React.js angeschaut und rumgespielt. Verfolge das ganze wahrscheinlich genauso wie du, am meisten Erfahrung habe ich allerdings mit Backbone.

Größere Anwendungen: Webanwendungen, die einen Projektaufwand von eins bis vier Mannjahren haben. Viel Businesslogik, Schnittstellen zu verschiedenen Modulen.
Genau so eine Anwendung habe ich in den letzten drei Jahren (wie schon oefters erwaehnt) mit einigen Kollegen fuer Adidas entwickelt. Der Stack sieht so aus:

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.
 
Danke für deine ausführliche Antwort, ich schätze deine Meinung, als erfahrener Entwickler, sehr :okay:

Ich lese seit letztem Jahr ab und zu in Ivan Marsics Software Engineering Buch -> http://www.ece.rutgers.edu/~marsic/books/SE/

TDD und Tests auch in der Anforderungserstellung und dem Design halte ich auch für sehr wichtig.

Jedoch haben wir hier keine existierenden Prozesse in dieser Richtung. Unser Produkt ist auf einem PHP MVC Framework zusammengestümpert und schlecht wartbar. Keinerlei Dokumentation zur Entscheidungsfindung existiert.

Darum forciere ich einen Rewrite, aber richtig. Ich will die Anforderungen korrekt ermitteln lassen, als auch das Design basierend auf diese richtig anzugehen, so dass bevor Code geschrieben ist, klar ist, was zu tun ist. Aber in einem Mittelständler mit wenig Erfahrung in dieser Richtung ist es schwer.

Zurück zu den Frameworks. Ich stimme dir zu, dass Werkzeuge nicht der Fokus sind, sondern eben die Prozesse darum herum, jedoch definieren deine Werkzeuge auch die Kultur deines Teams und sie sichern dir mittelfristig die Möglichkeit neue Leute für dein Unternehmen zu begeistern. Ich würde gerne weg von PHP, weil ich es einfach nicht mag, wenn es bleibt, soll es aber auf alle Fälle ein besseres Framework sein, als das aktuelle. Vielleicht Laravel als Back-End.

Node.js wird sehr stark unterstützt und ich sehe für die nächsten 5 Jahre hier die besten Chancen. Wir könnten uns dann hier darauf konzentrieren alle verstärkt in JavaScript weiterzubilden, was dann für den ganzen Stack genutzt werden kann.

Front-End seitig ist alles schon viel weiter entwickelt, da sind ja alle Frameworks sehr gut dokumentiert. ember hatte bis vor einiger Zeit den Ruf hier stark unterentwickelt zu sein. Aber dieses Gefühl aufs falsche Pferd zu setzen (aber dann wenigstens nur das Front-End anzupassen) schwebt mir immer im Kopf herum.

Von Require habe ich auch schon gehört, es aber noch nicht angesehen. Es fühlt sich gut an, dass sich hier so viel tut.
 
PSN-Name: RaddiPS
Hi
ich hoffe einer von euch kann mir helfen

ich habe mal als übung nen Binärbaum programmiert in C.
Erstellen, Werte einfügen, löschen funktioniert
Tiefensuche nun auch.

Ich möchte nun eine Funktion schreiben die den Baum in Pre,post und inorder durchläuft (an sich kein Problem die Tiefensuche läuft ja) aber dazu möchte ich noch ein Array füllen in das der jeweilige Wert des besuchten Knotens eingefügt wird.

hier mal die preorder tiefensuche
Code:
bool bintree_dsearch(bintree *tree, int value)
	{
		if (value == tree->value)
		{return true;}
		if (tree->value == NULL)
		{return false;}
		if (tree->left != NULL)
		{return bintree_dsearch(tree->left, value);}
		if (tree->right != NULL)
		{return bintree_dsearch(tree->right, value);}
	}
ich möchte also das ein array bei jedem rekursiven durchlauf mit dem jeweiligen wert des besuchten Knotens gefüllt wird, so lange bis der durchlauf beendet wird.

Ich hoffe jemand kann mir helfen :)

Signatur der zu implementierenden Funktion sieht wie folgt aus

Code:
int *bintree_prefix(bintree *tree);
EDIT:
mein Bisheriger Ansatz
Code:
int i = 0;
int *bintree_prefix(bintree *tree)
	{
		uint64_t *prefixArray = malloc(inputArrayLength_helper*sizeof(uint64_t));

		//		while (i < inputArrayLength_helper)
		prefixArray[i]=tree->value;
		i++;
//		return (bintree_prefix(tree->left));
//		return (bintree_prefix(tree->right));

	}
die letzten beiden zeilen sind gewusst auskommentiert, da diese das programm killen
inputArrayLenght_helper ist 17 ints groß, so groß wie das inputArray im Testprogramm, das alle implementierten Funktionen testet

EDIT:
Problem gelöst,

für die interessierten
Code:
int *bintree_prefix(bintree *tree)
	{
	int *prefixArray = malloc(17*sizeof(uint64_t));
	return (bintree_prefix_visited(tree, prefixArray));
	}
int bintree_prefix_visited(bintree *tree, int *prefixArray)
	{
	if (tree!=NULL)
		{
		prefixArray[a]=tree->value;
		a++;
		bintree_prefix_visited(tree->left, prefixArray);
		bintree_prefix_visited(tree->right, prefixArray);
		}
	return prefixArray;
	}
 
Zuletzt editiert:
PSN-Name: chrizeliq
So aehnlich wuerd die perfekte Loesung wohl ausschauen, etwas unschoen ist die globale Variable "a"... besser waere, du uebergibst a als dritten Parameter von bintree_prefix_visited als Pointer. Und die Laenge des Arrays (17) ist auch hartkodiert, das waere besser dynamisch zu ermitteln, evtl. mit einer extra Funktion, welche die Groesse des Bin-Trees ermittelt. "return prefixArray;" macht auch keinen Sinn (bzw. du hast da Typ-Mismatching zwischen int und int* drin), die Funktion sollte wohl besser einfach void zurueckgeben. bintree_prefix koennte das Array direkt zurueckgeben.
 
Wenn ich ehrlich bin, verstehe ich hier größtenteils nur Bahnhof! Habe jetzt interessiert den Threadverlauf gelesen und ein paar Dinge sind mir schon bekannt, aber was das Thema Programmierung C betrifft, kapituliere ich. Wie habt ihr euch das angeeignet? Habt ihr einen Kurs besucht oder in Eigenregie gelernt? Ich bin so interessiert an der Programmierung und habe im letzten Jahr HTML vertieft und ich würde behaupten, dass ich dies mittlerweile recht gut beherrsche. Mein Ziel ist es, bald mal eine eigene Seite zu entwerfen und ggf. sogar eine Hamburg Domain hier zu registrieren. Da habe ich im Netz schon Einiges zu gelesen und das Thema Domainhosting wird zunehmend verständlicher. Dennoch wären ein paar Tipps recht hilfreich und so erhoffe ich mir hier vielleicht ein paar Lektürempfehlungen o. Ä. Wäre dankbar, wenn ihr mir da ein wenig Input geben könntet!
 
Zuletzt editiert:
PSN-Name: RaddiPS
Also ich werde jetzt sozusagen in C reingeworfen.
Das Programm meiner Masterthesis im der Informatik soll in C entstehen.
Also vieles neu aneignen. Aber ich muss sagen ich habe auch nen coolen Betreuer der mir dabei hilft und vieles erklärt. Zumal mein Ausgangscode nicht der einfachste ist
 

crack-king

Administrator
Team-Mitglied
systems, systems, systems, systems, systems, systems
LinkedList ist ganz einfach

Jedes Element in der Liste hat nicht nur seinen Wert, sondern auch das Nachfolger-Element in der Liste



Damit ist halt relativ einfach das Einfügen und Löschen von Elementen in Listen machbar, weil man nur das Nachfolge-Element verändern muss.

Weitere Infos: http://de.wikipedia.org/wiki/Liste_(Datenstruktur)

HashMaps sind auch nicht so schwer. Die Idee dahinter ist das eine Funktion die Position eines Elements definiert, wodurch das lästige Durchsuchen langer Listen etc. entfällt und man nahezu konstante Einfüge- und Suchzeiten erhält. In Java hat eine HashMap klassischerweise zwei Werte. Einmal den Key und dann den Value.

Damit lassen sich zum Beispiel relativ einfach Duplikate aus einer Liste oder so entfernen. Dazu nimmt man die Duplikate als key und irgendeinen passenden Value den man braucht und falls der Key schon vorhanden war, wird er nicht mehr hinzugefügt. Wenns fragen gibt, schieß los.
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
Wenn ich ehrlich bin, verstehe ich hier größtenteils nur Bahnhof! Habe jetzt interessiert den Threadverlauf gelesen und ein paar Dinge sind mir schon bekannt, aber was das Thema Programmierung C betrifft, kapituliere ich. Wie habt ihr euch das angeeignet? Habt ihr einen Kurs besucht oder in Eigenregie gelernt? Ich bin so interessiert an der Programmierung und habe im letzten Jahr HTML vertieft und ich würde behaupten, dass ich dies mittlerweile recht gut beherrsche. Mein Ziel ist es, bald mal eine eigene Seite zu entwerfen und ggf. sogar eine Hamburg Domain hier zu registrieren. Da habe ich im Netz schon Einiges zu gelesen und das Thema Domainhosting wird zunehmend verständlicher. Dennoch wären ein paar Tipps recht hilfreich und so erhoffe ich mir hier vielleicht ein paar Lektürempfehlungen o. Ä. Wäre dankbar, wenn ihr mir da ein wenig Input geben könntet!
selbst ist der mann :) und der sprung von html (keine programmiersprache! kein programmieren. eher textveravreitung in tag-form!!!) zu c dürfte etwas knüppelig werden. schau dir lieber erstmal php/perl/python/javascript (bzw. chrizel links durchklicken!) an :D

das hilft dir auch eher beim webseiten bauen als c. generell verstehe ich den drang zu c im 21 jhd nicht.
 

Planet

50% water, 50% air, the glass is always full!
PSN-Name: PlanetJumble
Lieber etwas strukturiertes lernen wie Java. Bei JavaScript kann man ein unglaubliches Chaos fabrizieren der trotzdem halbwegs funktioniert, und man weiß nicht wieso. Bei Java lernt man erst mal Objektorientierung, Datentypen und Strukturen. Das hilft später bei JavaScript auch.
 
Dem würde ich abraten. Java ist overkill für Anfänger. Python oder Ruby sollte hier die erste Wahl sein.

Wer ernsthaft in Webentwicklung einsteigen will kommt um JavaScript auf jeden Fall nicht herum, was mir mittlerweile nebenbei prinzipiell besser gefällt als Java. Und Java hilft nicht viel. JS nutzt ganz andere Konzepte, denn JS ist zB objektbasiert, sowie stark funktional orientiert. Dazu die Event Loop, Closures, Callback Funktionen etc.

Der schnellste Einstieg geht mit den Einsteigerkursen von http://codecademy.com/

Zur Vertiefung und dem näher bringen von JS Konzepten http://javascriptissexy.com, dazu JS Pattern von Stoyan Stefanov.
 
Zuletzt editiert:
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
just teasing around some hot shit@32bit:
prepare yourself! some heavy shit awaits you! smashing some* tos-compatible platforms around you, soon**! true qvga resulion! more colors! more fun***! more exclamation marks****!
jump in your raindrop camouflage pattern pants and start waiting!


* means: not all!
** can be some date between now() and the eternity!!
*** depending on your conception of fun!!!
**** not confirmed yet!!!!

/edit: chichichi
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
muahaha ich habe gerade gelernt das man nicht zu sehr basic denken sollte. wenn man c programmiert :D

so ganz verstanden warum, das hier funktioniert habe ich noch nicht ABER ich hab endlich eine sprite animation in pureC für atari tos hinbekommen.

[ame]http://www.youtube.com/watch?v=UtIE-fD7uKc[/ame]

=> voll gut und läuft normalerweise flüssig!

/edit: so das ganze dann auch gleich mal etwas zielstrebiger eingesetzt:
zwar immernoch low-res dafür aber animiert und mit 48x48px sprite!
renault ft17 in 8 farben und 3 animationsstufen (inkl. logo und introscreen)

[ame]http://www.youtube.com/watch?v=ntyCZ4NsVbQ[/ame]
 
Zuletzt editiert:
PSN-Name: chrizeliq
Hab am Wochenende mein erstes Ludum Dare Spiel gemacht... Ludum Dare ist eine Spiele-Entwicklungs-Competition bei der man an einem Wochenende ein Spiel von Grund auf entwickeln muss. Es gibt immer ein bestimmtes Thema, welches vorher gevoted wird. Das diesmalige Thema war "Connected Worlds"...

Mein Spiel heisst "Spike Quest" und ist an ein paar Dungeons von Zelda angelehnt, mit einfachen Schalterraetsel etc... fuer Musik und Sound hatte ich leider keine Zeit mehr.

http://www.ludumdare.com/compo/ludum-dare-30/?action=preview&uid=39613





Technologisch wollte ich mal was neues probieren:

- Programmiersprache: Java
- Library: libgdx, artemis-odb
- Grafik/Map/Animationen: Photoshop, Pickle, Glyph Designer

Sourcecode: https://github.com/chrizel/ld30

Interessant fuer mich war Artemis-ODB... es handelt sich um eine Library mit der man nach dem System des "entity based programming" programmieren kann... das ist eine Art und Weise wie man Spiele programmiert, die ich erst vor kurzem entdeckt habe: http://en.wikipedia.org/wiki/Entity_component_system
 
Ich habe diese Tage im Urlaub meine Backbone Anwendung, die ich zum Lernen erstelle, umgebaut. Vorher hatte ich eine Login, SignUp, Index und Profilseite. Nur in der Profilseite ist die Backboneapp, die anderen dienen zur Anmeldung. Jede Seite wurde vom Server geladen und dargestellt.

Ich habe das nun in eine Single-Page Anwendung transformiert. d.h. eine Seite vom Server laden, mit allen Scripts und dann nur noch kleine Kommunikation zum Server, zum Datenabgleich. Aber anstatt Backbone View nutze ich React.js. Beibehalten tue ich Backbone als Router, die Models und Collection.

So weit funktioniert es auch, nur finde ich es schwierig die Authentifizierung richtig zu managen. Ich kann mich anmelden und einloggen, aber ich muss die Pfade noch absichern. Zum Beispiel läd die Profilseite, ist aber leer, ich will aber nur, dass die Profilseite gezeigt wird, wenn man eingeloggt ist.

Hat das jemand schon mal für Single-Page Apps gemacht? Kann man das im Router einstellen?
 
Entscheidend ist, dass du dem nicht eingeloggten User keine Moeglichkeit gibst auf die Seiten zu navigieren, die nur fuer eingeloggte User gedacht sind. Dann ist das schonmal geloest. Desweiteren musst du darauf reagieren was passiert, wenn denn der User versucht per URL auf so eine Seite zu gehen, obwohl er nicht eingeloggt ist. Dazu brauchst du eine Moeglichkeit festzustellen, ob der User beim Seitenaufruf eingeloggt ist. Ich mache das nach folgendem System: Beim aller ersten Aufruf meiner App werden als erster Ajax-Request globale Einstellungen zum aktuellen User geladen (ich nenne es "env", aka Environment) -- darin speichere ich Dinge wie aktuelle UserID, Spracheinstellungen, und eben auch Login-Status... dieser Ajax-Request wird nicht asynchron durchgefuehrt, sondern tatsaechlich so, dass der User eine Warte-Animation beim Laden der Seite am Anfang sieht (geschieht nur beim aller ersten Aufruf, nicht zwischen den Seitenwechsel innerhalb der Single-Page-App)... und nun wird beim Seitenwechsel innerhalb der Single-Page-App dieser Login-Status gecheckt... und wenn der nicht passt, wird er auf die Login-Seite zurueck redirected... dieses System deckt alle moeglichen Faelle ab.

React.js ist bestimmt eine gute Wahl. In den letzten Monaten spriessen eine Menge Libs aus dem Boden, die eine virtual-dom abbilden... wir werden leider erst in 1-2 Jahren sehen, was sich wirklich durchsetzt.
 
Da bin ich auch gespannt. Aber React.js überzeugt mich jetzt mit seiner Art und Weise wie man die Seite modularisiert. Es ist schön anzusehen, wie die Komponenten niedergeschrieben werden, Methoden hinzufügen, weitergeben von Daten an Kinderelemente. Bis auf einen Fall, wo ich über mehrere Komponenten hinweg einen Delete durchreichen muss. Das sieht unschön aus.

Es gibt noch den Flux Ansatz. Damit beschreiben die Erfinder von React einen Ansatz um den gesamten Front-End Code zu organisieren. Hier probiere ich auch noch aus, ob es sich lohnt damit vll. noch Backbone zu ersetzen.

Schöne Sache auf jeden Fall. Soll Polymer auch mal in die Richtung gehen? Es verwendet den Komponentenansatz, aber keinen Schatten DOM, sonst wäre sicher die Performance nicht so mies.

Danke für deinen Hinweis, ich werde es so angehen.
 
Top