Buchempfehlungen - Verständnis von System und -programmierung

Delacroix

Cadet 4th Year
Registriert
Mai 2012
Beiträge
71
Hallo CBler,

wie vielleicht schon einige gelesen haben bin ich derzeit im 2. Ausbildungsjahr (ab September 3. Ausbildungsjahr).

Ich hab auch mittlerweile ganz gute Kenntnisse in C# und auch mit VS2010 komm ich ohne Probleme klar. Habe auch einige Anwendungen bereits programmiert und mit objektorientierung hab ich nun auch keine Probleme...


Jedoch... was mich ehrlich gesagt sehr stört und teilweise auch am Entwickeln, ich sage mal, guter Anwendungen hindert, sind die noch mangelnden Kenntnisse über Betriebssystem!!

Ich würde nämlich gerne viel mehr Hintergründe über das OS wissen und seine Funktionsweise etc. Funktionsweise von Diensten, was ich beachten muss und und und...


Deswegen wende ich mich an euch mit der Hoffnung, dass ihr mir vielleicht einige gute Bücher empfehlen könnt mit denen ich das mangelnde Wissen mir noch aneignen kann... um dann anständige Anwendungen entwickeln zu können und eventuell nicht bei jeder Kleinigkeit im Forum nachfragen muss sondern eher selber Hilfe geben könnte ;) :D :D


Von den Betriebssystemen spezialisiere ich mich jetzt eigentlich auf Windows, deswegen sollte das Buch auch nur Windows (kein Linux/Unix/Mac) behandeln und wenn es speziell über die Programmierung geht, dann wäre C# super, aber kann natürlich auch Java oder C++ sein (C# wäre halt bevorzugt ;) :) )

Hoffe ihr habt da paar gute Bücher zu empfehlen oder Tutorials, Seiten, etc. :p

Ich bedanke mich schon mal im Vorraus.
 
Mark Russinovich - Windows Internals Part 1 ISBN 0-7356-2530-1
 
Ich wüsste jetzt nicht, warum man Windows Internals gelesen haben muss, um anständige Programme für Windows entwickeln zu können... bei der Fahrschule wird auch nicht erst die Arbeitsweise eines Verbrennungsmotors erklärt, bevor man mal ins Auto steigt... zumal es mir als Fahrer auch egal ist, wie mein Motor arbeitet funktioniert, so lange ich weiß, was er macht, wenn ich aufs Gaspedal drücke...

Was heißt denn für dich "guter Anwendungen"?

Und die Entwicklung guter Anwendungen scheitert meist eher an konzeptionellen Schwächen im Software-Design... ich würde mich eher mit Büchern beschäftigen, die die Qualität des eigenen Quellcodes thematisieren (z.B. Clean Code, Effective Java, ...) und vielleicht mit Entwurfsmustern beschäftigen. Mit irgendwelchen System-Interna kann man sich beschäftigen bei Bedarf...
 
Zuletzt bearbeitet:
Der Bedarf besteht ja auch... ich musste jetzt schon ein paar mal Anwendungen entwickeln die auf Windows laufen sollten und Zugriff auf die WinAPI etc. gebraucht haben, aber ich hatte nicht den geringsten Plan wo ich anfangen sollte...

Ich wusste nicht welche Funktionen (WinAPI) in welcher DLL waren, ich wusste nicht wofür die einzelnen DLLs überhaupt sind, etc.

Außerdem hab ich hier im Forum z.B. vor kurzem irgendwo einen Post gelesen, da wollte jemand einen Windows Service programmieren der Screenshots erstellt. Daraufhin war eine Antwort da die ich sehr interessant fand, weil ich sowas z.B. auch nicht wusste (aber wissen muss für solche Fälle) und zwar, dass der Service gar nicht auf dem Desktop ausgeführt wird sondern einen eigenen Desktop hat so zu sagen.

So in der Art war halt die Aussage... woher soll ich sowas den wissen? Da hätte z.B. erstmal blöd geschaut wenn ich einen ähnlichen Service programmieren müsste.. ;)


Zu deinem Autobeispiel... Um das Auto fahren zu können muss ich vielleicht nicht wissen wie der Verbrennungsmotor funktioniert, aber verkehrt wärs nicht (auch z.B. was es mit der Kupplung auf sich hat)... wieso? ... ganz einfach jemand der die Interna kennt/weiß wie das abläuft fährt auch noch nach 150K KM mit der selben Kupplung, jemand der es nicht weis muss die Kupplung eventuell schon nach 80-90K KM wechseln ;) :D
 
1668mib spricht wahre Worte.

Deine Themen lauten eher
-> Softwareentwicklung (Stichwort "Design Patterns")
-> Qualitätssicherung (Stichwort "Usability" und "Qualitätsmanagement")
-> Projektmanagement (Stichwort Anforderungsanalyse, Planung, Ressourcenmanagement)

Wenn dein Eifer von Dauer ist, empfehle ich ein Informatikstudium mit dem Schwerpunkt Embedded Systems. Zusätzlich dazu belegst du Kurse über die oben genannten Punkte und eignest dir über Bücher das von dir erfragte Wissen über die Windows API an. Da Windows keinen offenen Code anbietet, wirst du auch nirgends ein Buch darüber finden, dass dir den Code zerpflückt und Zeile für Zeile erläutert, daher wirst du dich wohl auf Services und APIs beschränken müssen.

Bücher zu dem Thema fallen mir spontan keine ein ^^
 
Zuletzt bearbeitet:
Also Studium erwähne ich durchaus, aber erstmal Ausbildung, dann BOS und danach entscheiden welches Info-Studium ;) :D

Naja ich brauche ja nicht den Code, sondern will mehr die Funktionsweise wissen. :p

Hab jetzt ein Buch gesehen, scheint sehr in meine Richtung zu gehen.... "Das C# 2010 Codebook". Aus den Rezensionen bei Amazon + dem Überblick über die Themen im Buch sieht es sehr nach dem aus was ich gesucht habe.

Aber der Preis ist doch ziemlich Stolz (90 € - ist ja fast 1/3 von meiner Ausbildungsvergütung :D )... hat jemand bereits Erfahrungen mit dem Buch? ^^
 
@Delacroix: Im .NET-Umfeld kann die das ganze DLL-Zeugs doch eh so gut wie wurscht sein.

Und was das .NET-Framework kann ist eigentlich in der MSDN-Library gut beschrieben... das von dir angesprochene Buch mag nicht schlecht sein was den Inhalt angeht, geht aber eigentlich an deiner ursprünglichen Frage komplett vorbei. Denn eigentlich willst du nicht wissen, wie Windows irgendwie intern arbeitet, sondern du willst die Möglichkeiten dokumentiert haben, die dir das API liefert... und wie gesagt, eine API-Dokumentation gibt's in der MSDN, nur musst du da halt wissen, was du genau haben willst (und das fehlt oft vorher, klar, man weiß ja oft nicht, was alles so geht...). Aber mit "Funktionsweise von Diensten" hat das halt nichts zu tun...
 
Zuletzt bearbeitet:
Hmm... Möglichkeiten klingt gut. :)

Ja das mit den Diensten war halt nur ein Beispiel... fand es gerade passend wegen dem Post hier im Forum :p
Hätte es ja nun wirklich nicht gewusst dass Services ihren eigenen Desktop verwenden und nicht den richtigen, wenn ich nicht zufällig drüber gelesen hätte :D

Naja ich werde mich wohl viel in der MSDN einlesen müssen :D :D
Aber dennoch wenn jemand gute Bücher kennt die auch mal bissl ins Detail gehen oder so, dann wäre ich dankbar dafür...

Ich mein ich will ja nach der Ausbildung kein Fachidiot sein sondern auch was können ;)
 
Eines der nützlichsten und lehrreichsten Bücher über Betriebssysteme dürfte wohl "Moderne Betriebssysteme" von Andrew S. Tanenbaum sein... auch wenn es nicht mehr ganz "modern" ist (Erstauflage von 2002 oder so). Da lernt man wenigstens, was es mit der Speicherverwaltung etc. so auf sich hat... und es ist vor allem LESBAR.
 
Den Tanenbaum wollte ich auch gerade vorschlagen. Hier sind Grundlagen zu Prozessen, Threads, Interprozess-Kommunikation usw. erklärt, was absolutes Pflichtwissen meines Erachtens ist. Was Software-Engineering anbelangt, wurden zuvor ja schon einige Vorschläge gemacht...

edit: die deutsche Auflage des Tanenbaum wurde 2009 aktualisiert, ist also ziemlich modern. Wobei die meisten Grundlagen schon seit Jahrzehnten Bestand haben und dies auch weiterhin so sein wird.
 
Zuletzt bearbeitet:
Vielen Dank für den Super Tipp.
Hab mir gerade das Inhaltsverzeichnis und die Kundenrezensionen angeguckt, scheint tatsächlich ein super Buch zu sein ;-)
 
Zuletzt bearbeitet:
Und was bringt ihm der Tannenbaum? Er weiß wie die Speichertrennung von Prozessen usw. funktioniert, es hilft ihm aber kein Dtück beim Entwickeln. Es ist zwar gut das zu wissen, aber die Themenbereiche von frakgoescb bringen ihm wenigstens auch in der Praxis etwas.
 
Das ist ja mal absolut nicht richtig. Speicherverwaltung im Detail bringt ihm vielleicht nicht viel, aber Kenntnisse über Prozesse, Threads und insbesondere Interprozesskommunikation sind absolut notwendig und auch in der Praxis hilfreich. Natürlich braucht er auch Kenntnisse in Software-Engineering und Software-Architektur. Gehört halt einiges mehr dazu, wenn man ein guter Entwickler werden will.
 
Zuletzt bearbeitet:
Natürlich ist es sinnvoll, im Detail zu Wissen wie es funktioniert (ich weiß es auch), aber es wird ihn eben kein Stück weiter bringen. Dann lernt er eben wie das Betriebssystem die Speicherbereiche von Prozessen isoliert, wie der virtuelle Arbeitsspeicher zusammen mit dem TLB funktioniert, es bringt ihn aber kein Stück weiter. Weil es in der Praxis keine Relevanz hat, die Prozesse sind strikt getrennt und das reicht im Prinzip.
Er kann auch aus dem Buch lernen, wie Threads arbeiten, dann kann man aber genauso gut argumentieren, dass er auch das Buch über Rechnerarchitektur von Patterson und Hennesy lesen muss um zu verstehen wie der Prozessor die Befehle ausführt, und wie Threading auf einem Prozessor überhaupt funktioniert und warum mehr Threads als Cores kontraproduktiv sind (Cache-Misses), aber auch da bringt es ihn wieder kein Stück weiter.
Liest er aber ein spezialisiertes Buch für C#, welches sich damit beschäftigt, hat er mehr davon. Denn C# läuft auf einer VM, und die VM entscheidet wiederum welche Memory Visibility Garantien ein Thread auf Daten hat, Details die nicht im Tannenbaum stehen, weil sie zu speziell sind. Aber gerade darauf kommt es an, du kannst Threads verstehen, solange du aber nicht weisst, wie das Memory Model in C# funktioniert, hast du wiederum nichts gewonnen. In Java gibts sogar Bücher, die sich alleine damit oder nur mit Concurrency beschäftigen, weil es im Detail wirklich kompliziert, aus 10km Höhe von einem Tannenbaum ist es natürlich simpel.

Bücher über Softwarearchitektur, Usability, Projektmanagement und ein wirklich tief gehendes C#-Buch (nicht dieses Anfänger-Zeug) halte ich deshalb für ihn aktuell für deutlich sinnvoller. Die Grundlagen eines Tannenbaum kann er sich bei Bedarf immernoch aneignen.
 
Zuletzt bearbeitet:
Also ich würde ihm den Tannenbaum empfehlen, in der C# Entwicklung hift ihm das nix, aber man sollte einfach Leuten die verstehen wollen nicht die Sicht von "Memory Management" von VMs nahe legen. Es gibt schon genug Entwickler die glauben das man sich um Speicherverwaltung nicht kümmern muss.
 
Da gebe ich dir vollkommen Recht, aber der Tannenbaum beschreibt auch wieder nur ein Konzept wie das OS es machen kann, und in der Praxis hat es wieder keine Bedeutung.
Du sprichst manuelles Speichermanagement an, also malloc() und free() und hier zeigt sich doch wunderbar, wie wenig Relevanz in der Praxis wieder der Tannenbaum hat, denn es kommt auf die Implementierung der beiden Funktionen an. In einigen glibc-Versionen sind die so schlecht, dass erst Projekte wie tcmalloc und jemalloc entstanden. Und diese Implementierungen haben komplett verschiedene Konzepte, und wie das OS nachher den Speicher verwaltet ist auch egal, denn aus Softwaresicht ist wieder nur relevant welche Eigenschaften tcmalloc hat und wie ich mit dem Speicher umgehen sollte, nicht dass das OS für jeden Prozess zig Gigabyte virtuellen Ram hat, die dann durch den TLB auf echten Ram gemappt werden, die Relevanz davon für echte Entwicklungen ist eben null.


Versteht mich nicht falsch, ich sage nicht, dass eure Meinungen falsch sind ;)
Früher oder später kann es nicht schaden, sich damit mal zu beschäftigen (wobei die Relevanz da imho noch gering ist, sofern man nicht für Randfälle wie harte Echtzeit entwickelt) aber er ist eben erstmal deutlich besser beraten, wenn er an seiner Praxis feilt. Was bringt es ihm zu wissen, wie das Betriebssystem einen Thread schedult, wenn er dadurch keine bessere Software schreiben, weil er nicht genau das UI-Framework versteht und dessen Interaktion mit Threads versteht. Oder das angesprochene Memory Model.
Softwareentwicklungen findet heute zum Großteil komplett losgelöst von OS internas statt, da wird dann eben auf eine VM gesetzt oder Software wie Boost womit auch Platformunabhängigkeit möglich ist. Das reale Verhalten oder die Implementierung im OS wird immer "unwichtiger".

Ich meine habt ihr denn 5 handfeste Beispiele, die ihn als Entwickler für die angesprochenen Tätigkeiten nach dem Lesen des Tannenbaum besser machen, als wenn er ein C#-Buch darüber liest? Grundverständnis ist immer gut, aber er hat ja vor allem aktuell praktische Probleme, vor allem mit Softwarearchitektur.
Ich weiß, dass er gesagt hat, dass er mehr über Windows lernen will, aber wie so oft, bin ich der Meinung, dass es wie mit den Politikern ist, die über das Internet sprechen, sie haben keine Ahnung davon. Er hat keine Ahnung davon, denkt aber, dass es ihn weiterbringt, wenn er es weiß - was jedoch imho nicht der Fall sein wird.
 
Zuletzt bearbeitet:
@ice-breaker: So ist es.
Mein Vergleich mit dem Automotor finde ich ganz gut.
Es spielt gar keine Rolle zu wissen, wie der Motor genau arbeitet, mit dem Auto fahren kann man dennoch. Ob es ein Benziner ein Diesel-, ein Gas- oder ein Elektro-Fahrzeug ist, spielt an sich keine große Rolle... d.h. wie das Auto konkret implementiert ist, ist egal und gar nicht wichtig zu wissen.

Man nutzt ja Bibliotheken und Frameworks genau darum, dass man sich in der Regel nicht mit den Interna beschäftigen muss. Das heißt allerdings nicht, dass es in speziellen Situationen wieder ganz anders aussieht. Aber wenn eine solche Situation gekommen ist, dann weiß man das in der Regel auch...

Und mir ist es lieber, Programmierer schrieben lesbaren, verständlichen und wartbaren Code, dann passieren auch weniger Fehler in der Speicherverwaltung ohne dass man ein Experte darin sein muss...
 
Ich danke euch vielmals für die ganzen Ratschläge und werd sie beherzigen.

Aber ich hab nach wie vor trotzdem nichts dagegen, wenn jemand einige Erfahrungen/Empfehlungen von bestimmten Büchern postet :) ;) :D
 
@ice-breaker: Du hast völlig recht.
Der Tannenbaum wäre ja nur der Anfang.
Wenn man dann nicht abgeschreckt ist als nächstes (wenn man unter Windows unterwegs ist):
http://kipirvine.com/asm/ Das unterfüttert die Theorie mit realitätsrelevantem Stoff (Aber von der Praxis weit weg)
Übungen hierzu:
- Sich mit MenuetOS rumspielen
- Oder in einer VM DOS installieren und dort ein TSR-Programm schreiben (Gerade in üblen Umgebungen lehrnt man viel)

Ich halte diese Art des Verständnisses für wichtig. Sicher ist es korrekt das diese Kenntnisse für Entwicklung unter Java oder .Net weniger wichtig sind, aber sobald man diese Welt verlässt wird es zum Problem. Auch viele Perfomance und Stabilitätsproblem in Java oder .Net Software würden weniger entstehen wenn grundsätzliches Verständnis vorhanden wäre, aber ich habe hier wohl einfach zu viele leidvolle Erfahrung gemacht ...

Hat sich eigentlich noch niemand gefragt wo die Horde der VB-Entwickler heute ist? Okay das war jetzt böse ...
 
Also ich hab den Tannenbaum selbst gelesen.
Empfehlen kann ich ihn für Programmierer nicht, da diese Themen nichts mit der Programmierung an sich zu tun haben und du als Programmierer auf dieses Gebiet sowieso kein Einfluss hast, solange du im Bereich von C# bleibst und nicht anfängst, Maschinencode zu produzieren.

Interessant ist es allemal, aber das sind Themen wie Geschichte , Psychologie und Medienwissenschaften sicherlich auch, aber den Nutzen für die Programmierung hast du dadurch nicht gewonnen ;)
 
Zurück
Oben