Source lesen und verstehen lernen



  • u_ser-l schrieb:

    Sourcecode von besonders fähigen Programmierern zu studieren ist eine sehr gute Methode, den eigenen Codestil zu verbessern.

    Man kann auch ein gutes Buch drueber lesen und sich selbst an den Beispielen ausprobieren. Fuer die Beurteilung von Buechern geben genug Personen bei z.B. amazon.de Bewertungen ab, so dass man nicht die Katze im Sack kauft. Das halte ich fuer die bessere Alternative. Was bringt es einem, sich 1 Monat mit Quelltext zu befassen, nur um festzustellen, dass er Schrott ist. Auch kann man nicht von den Aeusserlichkeiten einer Anwendung auf deren Inneres (z.B. Gimp) schliessen.

    ... ganze Bandbreite syntaktischer Konstrukte einer Prog.Sprache nutzen ...

    Dafuer kenne ich genug Gegenbeispiele. Auch der Rest deiner Aussagen ist zu pauschal. Was ist "richtungsweisend", "uebersichtlich" und "erfassbar"? Diese Grenzen sind bei jedem anders, gerade wenn es um Anfaenger vs. Profis (jahrelange Erfahrung) geht. Ideen koennen auch auf abstrakter Ebene wesentlich besser verdeutlicht werden. Persoenlich schaue ich mir nur Code an, wo ich es muss. Sonst wird nur mit den bereitgestellten Interfaces und deren Beschreibung gearbeitet.

    Letztendlich geht es darum, wie man selbst guten Code/Architektur/Software produziert und nicht wie andere es erreichen. Es ist also ein Umweg, anderen Sourcecode zu studieren. In der iX 04/2009 war nen kleiner (netter) Artikel ueber Richtlinien drin, wie man seine eigene Codequalitaet verbessern kann.



  • ich denke ja nicht an so große Zeitspannen wie 1 Monat - diese Zeit ist natürlich besser in Studium von Büchern und eigene Programmieraufgaben investiert. Monatelang den Quellcode eines Großprojekts wie firefox zu studieren, würde ich auch nicht empfehlen, es sei denn, man will am Projekt teilnehmen.

    Aber mehrere Stunden oder Tage in hochwertigen Sourcen zu schmökern, oder immer mal wieder hineinzuschauen, schadet dem Codestil eines Anfängers bestimmt nicht. Macht doch auch Spaß, zu sehen, wie andere Leute bestimmte Funktionen implementieren, vor allem, wenn der Code wirklich gut ist.



  • u_ser-l schrieb:

    Dazu gibt es zwar keine 100% treffsichere Methode, aber Anhaltspunkte gibt es schon.
    ...

    * programme die perfekt funktionieren, performant sind und sich z.b. nicht durch unsinnigen input aus der bahn werfen lassen. leider kann man das am source code nicht sehen.

    u_ser-l schrieb:

    * Sourcen, die die ganze Bandbreite syntaktischer Konstrukte einer Prog.Sprache nutzen (und nicht nur einen Teil davon), stammen oft von fähigen Programmierern.

    hihi, das halte ich erstmal für kein gutes zeichen, sondern es sieht eher so aus, als ob des programmierers spieltrieb am wichtigsten war. so jemand hat aber gute chancen, irgendwann mal ein guter programmierer zu werden.
    🙂



  • kann sein. Betrifft ohnehin nur C++, die meisten anderen Sprachen sind ja nicht so umfangreich, daß man da viele Sprachelemente beiseite lassen könnte.



  • Was u_ser-l so gesagt hat, mag zwar nicht so uneingeschränkt zutreffen, aber vom ansatz her finde ich es schon richtig.

    Es geht mir vor allem auch darum, gerade als anfänger mir mal anzusehen, wie die Könner es so machen.

    Anderes Beispiel, beim Gitarre zocken höre ich mir auch lieber an was die Heros so spielen und können, nicht um es dann direkt nachzuahmen, könnte ich ja garnicht. Aber um zu sehen, in welche richtung es gehen kann und wohin ich selbst mal kommen möchte 😉

    Genauso in der Programmierung, ich bin eben noch eher Anfänger noch kein volles Jahr dabei und hab so viele Bücher, die mir zum teil immer wieder die Grundlagen durchkauen, is ja auch alles schön und gut, aber diejenigen, die diese Bücher schreiben sind auch sicher keine Hacker, die die Weisheit aus Eimern "saufen".

    Deswegen bekommt man meist auch nur Grundlagen, die kein besonderes können voraussetzen, es gibt zwar auch weiterführende Lektüren, die aber schon teils in spezielle gehen.

    Für mich war der nächste interesannte Schritt der, zu sehen wie es eben die Könner machen, die Software schreiben, die bereits einige Bekanntheit erlangt haben. Eben fast wie beim Gitarre spielen, da versucht man ja auch immer mal was zu spielen, was die Pros so verzapfen ^^



  • Die Erfahrung ist halt nicht zu unterschätzen. Man lernt immer wieder neue Sachen dazu. Wenn ich mir heute Code anschaue, den ich vor zehn Jahren geschrieben habe, dann kommt manchmal das blanke Entsetzen. Vermutlich wird es mir in zehn Jahren wieder so gehen.



  • Genau so siehts aus.
    Wenn ich mich an meine ersten Versuche erinnere, kommts mir auch hoch ^^



  • sri schrieb:

    Die Erfahrung ist halt nicht zu unterschätzen. Man lernt immer wieder neue Sachen dazu. Wenn ich mir heute Code anschaue, den ich vor zehn Jahren geschrieben habe, dann kommt manchmal das blanke Entsetzen. Vermutlich wird es mir in zehn Jahren wieder so gehen.

    da kann ich dich berihigen. ich habe heute keine probleme, meinen c++-code von 1998 zu lesen.



  • volkard schrieb:

    da kann ich dich beruhigen. ich habe heute keine probleme, meinen c++-code von 1998 zu lesen.

    aber vielleicht fällt's dir schwer, deinen code von 1988 zu lesen?
    🙂



  • +fricky schrieb:

    volkard schrieb:

    da kann ich dich beruhigen. ich habe heute keine probleme, meinen c++-code von 1998 zu lesen.

    aber vielleicht fällt's dir schwer, deinen code von 1988 zu lesen?
    🙂

    Ja. Weil ich damals Scheiß programmiert hatte. Den 90-er Code konnte ich bereits ein halbes Jahr später nicht mehr entziffern. Aber Nicht-Scheiß-Programme (und welche, die nicht betont experimentell sind) bleiben dauerhaft lesbar.



  • Lesbar schon. Aber nicht unbedingt sauber (gemessen an den heutigen Ansprüchen).



  • Es geht mir vor allem auch darum, gerade als anfänger mir mal anzusehen, wie die Könner es so machen.

    Anderes Beispiel, beim Gitarre zocken höre ich mir auch lieber an was die Heros so spielen und können, nicht um es dann direkt nachzuahmen, könnte ich ja garnicht. Aber um zu sehen, in welche richtung es gehen kann und wohin ich selbst mal kommen möchte

    Ich habe heute meine Tage: Bullshit. Du willst es wohl nicht kapieren. Programmieren ist nicht Gitarre spielen. Genausogut koenntest du dich als Schueler der 7. Klasse in eine Vorlesung fuer hoehere Mathematik setzen und wuerdest trotzdem nicht wissen, in welche Richtung es geht.

    Ausserdem gibt es genug Literatur fuer Fortgeschrittene:
    http://www.amazon.de/Effektiv-programmieren-Möglichkeiten-Programme-verbessern/dp/3827326907/ref=sr_1_1?ie=UTF8&s=books&qid=1247836856&sr=8-1
    http://www.amazon.de/Effektiv-C-programmieren-Scott-Meyers/dp/3827322979/ref=sr_1_3?ie=UTF8&s=books&qid=1247836856&sr=8-3
    http://www.amazon.de/Modern-Design-Applied-Generic-Patterns/dp/0201704315/ref=sr_1_14?ie=UTF8&s=books-intl-de&qid=1247836856&sr=8-14



  • knivil schrieb:

    Bullshit. Du willst es wohl nicht kapieren. Programmieren ist nicht Gitarre spielen.

    natürlich nicht. trotzdem haben programmieren, gitarre spielen, skateboard fahren usw. eins gemeinsam: man muss viel üben und lernen um gut zu werden. und dass man sich von meistern des fachs durchaus was abschauen kann, ist nicht so unwahrscheinlich.

    knivil schrieb:

    Ausserdem gibt es genug Literatur fuer Fortgeschrittene:
    http://www.amazon.de/Effektiv-programmieren-Möglichkeiten-Programme-verbessern/dp/3827326907/ref=sr_1_1?ie=UTF8&s=books&qid=1247836856&sr=8-1
    http://www.amazon.de/Effektiv-C-programmieren-Scott-Meyers/dp/3827322979/ref=sr_1_3?ie=UTF8&s=books&qid=1247836856&sr=8-3
    http://www.amazon.de/Modern-Design-Applied-Generic-Patterns/dp/0201704315/ref=sr_1_14?ie=UTF8&s=books-intl-de&qid=1247836856&sr=8-14

    bisschen einseitige buchtips. findeste nicht?
    🙂



  • bisschen einseitige buchtips. findeste nicht?

    Ich bin weder Amazon noch google, auch nicht seine Mutti. Also muss es reichen, nur den Weg zur Toilette zu weisen, anstatt ihm auch noch den Hintern (Arsch wird leider zensiert) abzuwischen.



  • knivil schrieb:

    bisschen einseitige buchtips. findeste nicht?

    Ich bin weder Amazon noch google

    Trotzdem wirkt es ein bißchen seltsam, daß Du bei drei Büchern ecp gleich zweimal nennst.

    Ansonsten ist die Buchauswahl für diesen Zweck ideal. Effektiv C++ programmieren und Modern C++ design. Wozu noch mehr?



  • Ok, das eine sollte More Effective C++ ... sein.



  • knivil : hey wie bist du denn drauf ? ^^

    musst ja wirklich schlechte laune haben manchmal oder ?
    Ich hatte dich ja auch nicht gebeten mir den ... abzuwischen.
    Die Buchtips scheinen ja ganz brauchbar, kommt dann bei Zeiten mal.

    Und dass ich es nicht kapieren will, würde ich nicht behaupten, dann würde ich mir keinen Kopf machen. Das mit der Gitarre war auch nur n beispiel, wenn du von sowas schonmal gehört hast 😉 Hör auf +fricky, der hats verstanden.

    Und mit ner Vorlesung für höhere Mathematik würde ich vielleicht wirlich meine Schwierigkeiten haben, aber Code ist Code und ich hab noch keinen gesehen, den ich nicht lesen konnte, an sich kann man das meiste gut nachvollziehen, warum also nicht mal nen Blick drauf werfen.

    Wenn du mir mal konkret sagen könntest warum das nen schlechter Ansatz sein sollte, würde ich das vielleicht noch nachvollziehen können, du sagst aber immer nur das is der falsche weg und bringt alles nichts. Das kann ich jetz auf anhieb so nicht bestätigen, mir brachte das schon ein wenig mehr einsicht.



  • Ausgerechnet unser Haustroll hat's verstanden. Da würde ich jetzt ganz vorsichtig sein, ob er Dich nicht nur veralbern wollte.



  • Viel Spass beim Raten: Was macht die Funktion scan? Um es etwas schwieriger zu machen, habe ich mal die Kommentare entfernt. Die grobe Idee als auch deren Umsetzung kann in wenigen Zeilen hingeschrieben werden. Das Lesen und Verstehen dieser Zeilen dauert etwa 5 min (etwas Erfahrung vorausgesetzt). Ich erhebe keinen Anspruch darauf, dass diese Loesung besonders elegant ist. Ich selbst finde sie dennoch schoen. Trivialitaeten habe ich mal weggelassen, falls dir noch etwas fehlt, dann sag Bescheid.

    PS: Diese Zeilen sind fuer dich persoenlich zum Testen, wie gut das mit dem Verstehen von Sourcecode klappt. Du brauchst mir nichts zu beweisen. Auch will ich niemanden hier etwas beweisen, nur dass es recht schwierig ist, dem Sourcecode zu Grunde liegende Konzepte zu verstehen.

    class Point
    {
    	public:
    		double m_x,m_y;
    		Point();
    		Point(double x, double y);
    		Point(const Point& p);
    
    		Point operator-(const Point& p) const;
    		const Point& operator=(const Point& p);
    		bool operator==(const Point& p) const;
    
    		bool leftOf(const Point& p1, const Point& p2) const;
    
    		bool collinear(const Point& p1, const Point& p2) const;
    };
    
    bool Point::leftOf(const Point& p1, const Point& p2) const
    {
    	Point r(*this - p1);
    	Point q(p2 - p1);
    	return (q.m_x*r.m_y - q.m_y*r.m_x) > 0;
    }
    
    bool Point::collinear(const Point& p1, const Point& p2) const
    {
    	Point r(*this - p1);
    	Point q(p2 - p1);
    	return (q.m_x*r.m_y - q.m_y*r.m_x) == 0;
    }
    
    class ScanPred
    {
    	private:
    		Point a;
    	public:
    		ScanPred(const Point& p);
    		bool operator()(const Point& p1, const Point& p2) const;
    };
    
    class SortPred
    {
    	public:
    		bool operator()(const Point& p1, const Point& p2) const;
    };
    
    ScanPred::ScanPred(const Point& p)
    {
    	a = p;
    }
    
    bool ScanPred::operator()(const Point& p1, const Point& p2) const
    {
    	return p1.leftOf(a,p2);
    }
    
    bool SortPred::operator()(const Point& p1, const Point& p2) const
    {
    	if( p1.y() < p2.y())
    		return true;
    
    	if ((p1.y() == p2.y()) && (p1.x() < p2.x()))
    		return true;
    
    	return false;
    }
    
    void scan(std::deque<Point>& set)
    {
    
    	std::sort(set.begin(), set.end(),SortPred());
    
    	std::deque<Point>::iterator new_end = std::unique(set.begin(),set.end());
    	set.erase(new_end,set.end());
    
    	if (set.size() < 3) return;
    
    	Point min = set.front();
    	Point max = set.back();
    	set.pop_front();
    
    	std::sort(set.begin(),set.end(),ScanPred(min));
    
    	set.push_back(min);
    	set.push_front(min);
    
    	std::stack<Point> conv_stack;
    	conv_stack.push(set.back());
    	set.pop_back();
    	conv_stack.push(set.back());
    	set.pop_back();
    
    	while(set.size() > 1)
    	{
    		Point tmpM	= conv_stack.top();
    		conv_stack.pop();
    		if (tmpM.leftOf(conv_stack.top(),set.back()))
    		{
    			// mache nichts :-)
    		}
    		else
    		{
    			conv_stack.push(tmpM);
    			conv_stack.push(set.back());
    			set.pop_back();
    		}
    	}
    
    	while (conv_stack.size() > 1)
    	{
    		Point tmpM = conv_stack.top();
    		conv_stack.pop();
    
    		if (tmpM.collinear(set.front(),conv_stack.top()))
    		{
    			// mache nichts :-)
    		}
    		else
    		{
    			set.push_front(tmpM);
    		}
    	}
    
    	if (set.size() == 1)
    	{
    		set.push_front(max);
    	}
    }
    

    Hör auf +fricky

    Da wuerde ich meine Seele der Verdammnis preisgeben. 🙂



  • knivil schrieb:

    Viel Spass beim Raten: Was macht die Funktion scan?

    kommentare raushauen ist unfair, aber grob geraten: punkte aussortieren die nicht auf einer geraden liegen.
    🙂


Anmelden zum Antworten