java vs .NET (ernsthaft) ;-)
-
Hoffe den Thread liest jemand trotz des Titels.
Ich bin in unserer Firma in einem kleinen Team, das untersuchen soll, in welche Richtung unsere Entwicklung zukünftig gehen soll. Hauptsächlich ist die Wahl zwischen einer Java und eine .NET-Architektur.
Hab mir mal ein paar Infos zusammengesucht und versucht die mal ein bisschen geordnet aufzuschreiben.
Bitte korrigiert mich, wo ich falsch liege, ergänzt mich etc.
Entscheidungsgrundlage:
Wir haben ein Standard-System bestehend aus verschiedensten Komponenten. Für jeden Kunden sind aber verschiedenen Anpassungen/Erweiterungen/Neuentwicklungen des Standard-Systems nötig. D.h. wir haben niemals bei zwei Kunden dasselbe System laufen, ein Teil der Kernfunktionalität ist immer gleich. Die Anpassungsaufwände liegen immer im Bereich mehrerer Mann-Monate
Wir entwickeln z.Z. ausschließlich unter Windows. GUIs werden mit Delphi gemacht, Dienste etc. mit C++. Außerdem haben wir ein paar Web-Anwendungen mit Java/Tomcat.
Prinzipiell gehen wir davon aus, dass wir unseren Kunden (öffentliche Hand) auch zukünftig Windows-Anwendungen bieten können, es kann aber sein dass 'Plattformunabhängigkeit' bei Ausschreibungen ein weicher Vorteil, weil modernes Buz-word, ist. Trotzdem ist es auch nicht auszuschließen, dass irgendwann irgendjemand zumindest auf teilweise Linux-Lösungen besteht. Andere Plattformen als Windows und Linux können wir völlig ignorieren.
Wir sind technologisch eher konservativ. D.h. es dauert relativ lange, bis wir neue Technologien einsetzen. Das machen wir erst dann, wenn sie sich als gut und stabil erwiesen haben (und es unsere Projektleiter mitkriegen).
Wir möchten bestehende Komponenten nicht grundlos auf die neue Platform portieren. D.h. die bestehenden Programme bleiben, wie sie jetzt sind. Neue werden jedoch mit der entsprechenden neuen Technologie entwickelt. Bei größeren Weiterentwicklungen muss jeweils entschieden werden, ob portiert werden soll.
Java vs .NET
I. Architektur
Prinzipiell handelt es sich bei beiden um gute Architekturen. Persönlich tu ich mich schwer da irgendwelche Entscheidungen zu treffen, weil ich weder mal ein ernsthaftes .NET-Projekt noch ein richtiges J2EE-Projekt gemacht habe (was über einen Tomcat hinaus geht).I. Portabilität Java und .NET
Nur Java ermöglicht es portabel zu sein. .NET beschränkt sich auf MS-Plattformen.
Zu versuchen .NET mittels MONO portabel zu machen scheitert, weil:
- zwar ist .NET ein offener Standard, mitgebrachte Bibliotheken des .NET-Frameworks sind aber nicht (alle) standardisiert. D.h. man müsste auf dieser Verzichten(was dasselbe ist, wie wenn man C++ ohne STL oder Java ohne Standard-Bibliothek nutzen möchte).
- Wenn MONO, dann seh ich nur ne Chance, wenn man von Anfang an, d.h. schon unter Windows mit MONO statt .NET entwickelt.II. Portabilität bestehende Komponenten
C++
Die bestehenden Komponenten könnten mit mehr oder weniger Aufwand durch neukompilieren auf anderen Plattformen lauffähig gemacht werden.
Prinzipiell dürfte es schöner sein, c++-Komponenten in eine .NET-Umgebung einzubinden, als in eine Java-Umgebung. Mittels C++/CLI können alte C++-Programme dann sowieso nahtlos nach .NET gebracht werden.Delphi
Die Delphi-Komponenten auf ein anderes Betriebssystem zu kriegen ist relativ unmöglich (wenn man davon ausgeht, dass Kylix nicht weiterentwickelt wird).
Die Delphi-Komponenten in die .NET-Umgebung zu portieren ist machbar, dank VCL.NET. Der MONO-Weg ist hier aber völlig ungangbar, weil VCL.NET ganz eigene Bibliotheken mit sich bringt.III. Systeme
Java ist eine stabile erprobte Plattform. .NET hat andrerseits den Vorteil, dass es hier mehr als eine Sprache gibt, weshalb man je nach Bedarf die bessere wählen kann (das macht es auch für den Programmierer interessanter).IV. Oberflächen
Java-Oberflächen sind immer noch spürbar träger als andere (hat sich da mit Java 1.5 was getan)?
In .NET gibts mit VBasic.NET ausgereiftere RAD-Tools zum zusammenklicken der Oberflächen (was gibts in Java außer J-Builder?).
Der Trend geht aber sowieso zu Web-Oberflächen, wo das nicht ins Gewicht fällt.V.
Wir arbeiten meist mit (verschiedenen, meist kleineren) externen Partnern zusammen (die können wir uns auch nicht raussuchen). Da wir nie wissen, mit welchen Technologien die arbeiten, brauchen wir in unserer Firma (ca 30 Mitarbeiter) sowieso Erfahrung in beiden Welten. Eine ausschließliche Entscheidung halte ich daher für kontraproduktiv.
-
kartoffelsack schrieb:
III. Systeme
.NET hat andrerseits den Vorteil, dass es hier mehr als eine Sprache gibt, weshalb man je nach Bedarf die bessere wählen kann (das macht es auch für den Programmierer interessanter).Das ist nicht so ganz richtig. Auch Java hat hier einiges zubieten, es wird aber nicht in dem Maße beworben, wie dies bei .NET geschieht. Siehe da:
http://www.robert-tolksdorf.de/vmlanguages.htmlkartoffelsack schrieb:
IV. Oberflächen
Java-Oberflächen sind immer noch spürbar träger als andere (hat sich da mit Java 1.5 was getan)?
In .NET gibts mit VBasic.NET ausgereiftere RAD-Tools zum zusammenklicken der Oberflächen (was gibts in Java außer J-Builder?).1. Da tut sich immer etwas. Das ist ein bekannter Schwachpunkt, an dem natürlich gearbeitet wird. Swing wird mit jeder Javaversion schneller. Wenn einem Swing zu langsam ist, könnte man natürlich auch das SWT nehmen, welches zumindest auf Windows deutlich schneller sein soll.
2. Der GUI-Designer von Netbeans soll angeblich sehr gut sein. Wenn ihr aber eine kommerzielle .NET-Entwicklungsumgebung mit einer entsprechenden Entwicklungsumgebung für Java vergleichen möchtet, dann solltet ihr auf Javaseite IntelliJ IDEA angucken.
-
III. Systeme
Java ist eine stabile erprobte Plattform. .NET hat andrerseits den Vorteil, dass es hier mehr als eine Sprache gibt, weshalb man je nach Bedarf die bessere wählen kann (das macht es auch für den Programmierer interessanter).Im Endeffekt ist das sicher nicht so ein Killer Feature. Da man ja jedesmal eine Menge KnowHow wegwirft oder die Wartbarkeit der Projekte sänkt, wenn man mehrere Programmiersprachen benutzt. Aber das Sprachfeature hat bei euch sicher den Vorteil, dass man ggf. vorhandene C++ Komponenten auf C++/CLI umsetzen kann und nicht alles neu schreiben muss, bzw. erstmal mit JNI tricksen muss.
Andererseits schreibst du ja, dass schon Java KnowHow vorhanden ist.
-
kingruedi schrieb:
Im Endeffekt ist das sicher nicht so ein Killer Feature.
Ich sehe den Vorteil darin, dass man einen größeren Technologiekreis unterstützt. Denn mit .NET macht man bald mal etwas. und sei es nur die Delphi Anwendung nach Delphi.NET zu portieren - und schwupps schon hat man zugang zu dieser Technologie.
Das ist denke ich bei der Migration nach .NET auf jedenfall sehr sehr wertvoll.
Allerdings denke ich, wenn Plattformunabhängigkeit einmal wichtig werden könnte, ist Java klar im Vorteil. Die Frage ist halt: wie wichtig ist die Windows integration zB per COM? Denn da hat .NET logischerweise die Nase sehr weit vorne.
MONO muss sich IMHO auch erstmal beweisen, momentan ist es nur eine spielerei - aber vielleicht wird ja etwas daraus. meinen business plan würde ich darauf aber nicht aufbauen
Die Frage die sich stellt ist also IMHO:
Was ist wichtiger? Windows Integration oder potentielle Plattformunabhängigkeit?Der Know-How Vorteil in Java ist eher gering, weil C# ja nun wirklich nicht viel anders als Java ist. Auf ASP.NET würde ich aber eher nicht umsteigen.
-
Der Know-How Vorteil in Java ist eher gering, weil C# ja nun wirklich nicht viel anders als Java ist. Auf ASP.NET würde ich aber eher nicht umsteigen.
was ist das Problem mit ASP.NET? Bzw. heißt dass dass Du .NET für Web-Technologie ablehnst? Warum?
@jkbjkbjkb Dass es auch andere Sprachen für die jvm gibt, ist schon klar. Nur: welche davon sind so ausgereift, dass man wirklich im professionellen Umfeld einsetzen kann.
-
kartoffelsack schrieb:
was ist das Problem mit ASP.NET? Bzw. heißt dass dass Du .NET für Web-Technologie ablehnst? Warum?
Naja, man bindet sich an windows server
aber ich denke eher so: ihr habt schon viel mit Java gemacht - welchen vorteil hätte hier der Umstieg auf .NET? da man sowieso kaum direkt zwischen web und standalone anwendung kommuniziert (da man ja meistens über ein protokoll, HTTP, SAOP, etc kommuniziert) sehe ich hier keinen großen vorteil.
Subjektiv: Java im Web und für Intranet Lösungen wirkt auf mich eine Macht, da muss ASP.NET erstmal zeigen was es wirklich kann. da man stark eingeschränkt ist mit der verfügbarkeit von windows servern sehe ich nicht so den markt. (im vergleich zu java)
-
Shade Of Mine schrieb:
Ich sehe den Vorteil darin, dass man einen größeren Technologiekreis unterstützt. Denn mit .NET macht man bald mal etwas. und sei es nur die Delphi Anwendung nach Delphi.NET zu portieren - und schwupps schon hat man zugang zu dieser Technologie.
Das ist denke ich bei der Migration nach .NET auf jedenfall sehr sehr wertvoll.
Ich sehe das mit gemischten Gefühlen. Es sind durchaus einige Einschränkungen vorhanden, die in den einzelnen Sprachen/Sprachmitteln gemacht wurden, damit sie alle auf .Net laufen.
Beispielsweise gibt es keine Referenzen der Form List<? extends Foo>, wahrscheinlich, weil man das einem Visual Basic Programmierer einfach nicht zumuten kann.
Dann darfst du (auch in C# und C++ nicht) zwei Methodenvoid foo(); void Foo();
haben, denn das ist nicht mehr CLS-Compliant. Natürlich kannst es machen, aber dann ist die Sprachunabhängigkeit hin.
Dann musst du für IEnumerable<T> auch IEnumerable implementieren, damit auch Programmiersprachen ohne Generics die Elemente deiner Collection aufzählen können. Du musst:
IEnumerable<T> : IEnumerable
Das sieht dann, wenn dich die anderen Sprachen nicht scheren, hässlich aus:
/// <summary> /// Erlaubt das sequentielle durchiterieren durch die Liste. /// </summary> public IEnumerator<NavNode> GetEnumerator() { return list.GetEnumerator(); } // TODO: Microsoft sollte das fixen! System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {return null;}
Damit könnte ich endlos weitermachen. Ich war anfangs begeistert von der Idee, aber inzwischen sehe ich in der Sprachunabhängigkeit zuviele Nachteile.
btw. finde ich schon, dass C# ziemlich anders ist als Java. Die Ähnlichkeiten springen jemanden natürlich ins Auge, wenn man von C++ kommt, aber wenn man mit beiden Sprachen mehr gearbeitet hat, entwickelt man für beide irgendwie schon ne eigene Vorgehensweise. Zumindest für mich kann ich mal sprechen.
-
Optimizer schrieb:
void foo(); void Foo();
haben, denn das ist nicht mehr CLS-Compliant. Natürlich kannst es machen, aber dann ist die Sprachunabhängigkeit hin.
Gibt doch Mittel und Wege sicher zu stellen, dass
die Assembly in keiner einzigen Sprache Probleme
macht.[assembly: CLSCompliant(true)] // ... // 1 Fehler: // Identifier 'Xxx.foo()' differing only in case is not CLS-compliant
Beziehungsweise solange Foo nicht public ist,
ist es sowieso egal.Optimizer schrieb:
Das sieht dann, wenn dich die anderen Sprachen nicht scheren, hässlich aus:
/// <summary> /// Erlaubt das sequentielle durchiterieren durch die Liste. /// </summary> public IEnumerator<NavNode> GetEnumerator() { return list.GetEnumerator(); } // TODO: Microsoft sollte das fixen! System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {return null;}
- Kann man die explizite Implementierung von IEnumerable weglassen,
IEnumerable<T> implementiert ja IEnumerable .. - Sind dann bei deinem Beispiel sowieso wieder die Leute angeschmiert, die
eine Dreckssprache verwenden. Warum willst es denn nicht über IEnumerable
zugänglich machen ?
- Kann man die explizite Implementierung von IEnumerable weglassen,
-
kartoffelsack schrieb:
@jkbjkbjkb Dass es auch andere Sprachen für die jvm gibt, ist schon klar. Nur: welche davon sind so ausgereift, dass man wirklich im professionellen Umfeld einsetzen kann.
Sicherlich sind da viele Sprachen dabei, die man als Experimente werten kann. Aber es sind auch diverse ernstzunehmende und ausgereifte Sprechen dabei. Schau dir zum Beispiel Groovy an. Das ist eine Sprache, die von Sun kommt, um einen bestimmten Zweck für die Java Plattform zu erfüllen. Diese Sprache hat sicherlich einen Nutzen. Ansonsten habe ich zugegebenermaßen keine Erfahrung mit den dort aufgelisteten Sprachen, aber man sollte zumindest, wenn man mal ein anderes Programmierparadigma benötigt, die entsprechenden Implementationen von meinetwegen Lisp oder Prolog für die Java Plattform evaluieren, bevor man die Plattform grundsätzlich ablehnt.
-
C#-Fan schrieb:
Gibt doch Mittel und Wege sicher zu stellen, dass
die Assembly in keiner einzigen Sprache Probleme
macht.Das ist nicht falsch, war aber auch überhaupt nicht der Punkt. Es ist ne Einschränkung, die man mit Standard C++ nicht hat. Oder C#. Oder Java. Oder J#. Und sie kommt mit der angestrebten Sprachunabhängigkeit. Das war der Punkt.
Kann man die explizite Implementierung von IEnumerable weglassen,
IEnumerable<T> implementiert ja IEnumerable ..Nein, kannst du nicht. IEnumerable<T> kann auch schlecht was implementieren, es ist ja selber nur ein Interface. Du musst beide Methoden und Enumeratoren, generisch und nicht-generisch implementieren. Und weil die Methoden sich auch nur anhand des Rückgabetyps unterscheiden, musst du auch noch den Namen mit dem Interface voll qualifizieren. Ich glaub, schöner als oben kann man es nicht machen.
Sind dann bei deinem Beispiel sowieso wieder die Leute angeschmiert, die
eine Dreckssprache verwenden. Warum willst es denn nicht über IEnumerable
zugänglich machen ?Weiß nicht was für dich jetzt ne "Dreckssprache" ist. Wenn du nicht grad wie ich return null machst sondern eben nen gescheiten Enumerator, funktioniert das in jeder Sprache. Warum ich nicht IEnumerable verwende? Weil ich mit den Generics arbeiten will natürlich... und werd von dem CLS-Müll dazu gezwungen, es auch nicht-generisch aufzählbar zu machen, selbst wenn es mir egal wäre, ob man das Teil in VB nutzen kann.
-
@kartoffelsack: Wollt ihr später auch Anwendugen im Browser laufen lassen, oder über RMI/WebServices verfügbar machen? Wenn ja, dann ganz klar Java.
Möchtest ihr Eure Anwendungen nur unter Windows Clients laufen lassen, dann seit wahrscheinlich mit C# besser bedient.
Wollt ihr plattformunabhängiger sein, dann müsst ihr sowieso große Teile neu schreiben. Dann bietet sich natürlich Java an. Ich würde heute nicht mehr einfach nur die Augen zu drücken. Mac ist wieder stark im kommen.
kartoffelsack schrieb:
Wir möchten bestehende Komponenten nicht grundlos auf die neue Platform portieren. D.h. die bestehenden Programme bleiben, wie sie jetzt sind. Neue werden jedoch mit der entsprechenden neuen Technologie entwickelt. Bei größeren Weiterentwicklungen muss jeweils entschieden werden, ob portiert werden soll.
Was spricht eigentlich gegen C++ mit Qt, wx, GTK?
-
Optimizer schrieb:
Nein, kannst du nicht. IEnumerable<T> kann auch schlecht was implementieren, es ist ja selber nur ein Interface. Du musst beide Methoden und Enumeratoren, generisch und nicht-generisch implementieren. Und weil die Methoden sich auch nur anhand des Rückgabetyps unterscheiden, musst du auch noch den Namen mit dem Interface voll qualifizieren. Ich glaub, schöner als oben kann man es nicht machen.
Gut, also ich sag mal rein "technisch", hast du recht. Hab mich im
vorigen Posting geirrt. Allerdings hab ich auch grad gesehen, dass
IEnumerable<T> nicht auch IEnumerable erweitert (zumindestens laut
MSDN-Doku). Du kannst also die nicht generische Scheiße auch gerne
ignorieren ..Optimizer schrieb:
Weiß nicht was für dich jetzt ne "Dreckssprache" ist.
Naja, ich wusste nicht welche Sprache jetzt konkret Generics nicht anbietet,
darum hab ich jetzt einfach den Oberbegriff "Dreckssprache" eingeführt, die
ein Element der Menge nicht generischer Sprachen darstellen sollOptimizer schrieb:
Wenn du nicht grad wie ich return null machst sondern eben nen gescheiten Enumerator, funktioniert das in jeder Sprache. Warum ich nicht IEnumerable verwende? Weil ich mit den Generics arbeiten will natürlich... und werd von dem CLS-Müll dazu gezwungen, es auch nicht-generisch aufzählbar zu machen, selbst wenn es mir egal wäre, ob man das Teil in VB nutzen kann.
Warum du nicht IEnumerable verwendest ist klar, ich meinte eh, die Leute
die IEnumerable verwenden müssen (weil sie ne Dreckssprache benutzen)
beissen sich ziemlich in den Hintern, da sie nicht über deine Collection
iterieren können.Aber is eh egal, das artet sonst noch zu OT aus, im
Zweifelsfall hast halt du gewonnen, egal ob du überhaupt
gewinnen willst :p
-
C#-Fan schrieb:
Allerdings hab ich auch grad gesehen, dass
IEnumerable<T> nicht auch IEnumerable erweitert (zumindestens laut
MSDN-Doku). Du kannst also die nicht generische Scheiße auch gerne
ignorieren ..Das wurde geändert, die Doku ist wohl nicht aktuell. Ich hab ne Version vom Februar und es ist seit Oktober leider so.
Weiß nicht was für dich jetzt ne "Dreckssprache" ist.Naja, ich wusste nicht welche Sprache jetzt konkret Generics nicht anbietet,
darum hab ich jetzt einfach den Oberbegriff "Dreckssprache" eingeführt, die
ein Element der Menge nicht generischer Sprachen darstellen sollrofl.
Optimizer schrieb:
Warum du nicht IEnumerable verwendest ist klar, ich meinte eh, die Leute
die IEnumerable verwenden müssen (weil sie ne Dreckssprache benutzen)
beissen sich ziemlich in den Hintern, da sie nicht über deine Collection
iterieren können.Aber is eh egal, das artet sonst noch zu OT aus, im
Zweifelsfall hast halt du gewonnen, egal ob du überhaupt
gewinnen willst :pNaja durch die Vererbung ist eben das Problem gegeben, dass ich nicht einfach sagen kann "mich interessiert nur der generische Teil". Das wär ok. Aber du hast es ja gerade erst anders (veraltet) gelesen, deshalb ist das jetzt wahrscheinlich schon klar.
Ob's was zum Gewinnen gibt, weiß ich nicht.
-
Nun ja, schließlich wollte Microsoft mit .NET (und vor allem C#) Java Konkurrenz machen. Ich denke, beide Technologien haben ihre Vor- und Nachteile. Java ist gut um GUIs zu programmieren, die auf jedem System laufen - mit .NET habe ich nicht wirklich Erfahrung ;), aber da die Technologie immer stärker in Windows implementiert wird, ist sie wohl besser dafür.
Ich denke Microsoft will Java mit .NET stärker aus Windows verdrängen.
-
BloodLord schrieb:
Java ist gut um GUIs zu programmieren,
Java ist vor allem für Enterprise Anwendungen ideal.
-
Shade Of Mine schrieb:
kartoffelsack schrieb:
was ist das Problem mit ASP.NET? Bzw. heißt dass dass Du .NET für Web-Technologie ablehnst? Warum?
Naja, man bindet sich an windows server
Soweit ich weiß funktioniert ASP.NET aber auch mit einem Apache Server
und mod_mono. Ausprobiert hab ichs selbst aber nicht.Zur Zeit ist die Verwendung des .NET Frameworks für mich eher ne Glaubensfrage.
Ich glaube dran, dass Bill Gates mal den richtigen Fingerschnipp macht und
.NET so richtig aus dem Zaun lässt. Sprich alles standardisiert, und somit
der Plattformunabhängigkeit den Weg geebnet. Für mich persönlich wäre dann die
Entscheidung klar, was aber eher ne subjektive Meinung wär.[offtopic]
Ich fänds sowieso am besten, wenn ich mit C# programmieren könnte, als
Framework hätte ich ne Art J2EE zur Verfügung. Nur mit dem Unterschied,
dass mal alle veraltete Klassen rausgeworfen werden, im Prinzip halt
simple Aufräumarbeiten, etc ..
[/offtopic]
-
Optimizer schrieb:
IEnumerable<T> : IEnumerable
Wofür steht da eigentlich das I? Soll das anzeigen, dass es sich um ein Interface handelt? Geht das also schon wieder in Richtung ungarische Notation oder zumindest in Richtung CMyClass?
-
C#-Fan schrieb:
Ich glaube dran, dass Bill Gates mal den richtigen Fingerschnipp macht und
.NET so richtig aus dem Zaun lässt. Sprich alles standardisiert, und somit
der Plattformunabhängigkeit den Weg geebnet.Wow. Durch was wurde dieser Glaube denn verursacht? Mir erscheint das (sachlich ausgedrückt) erstmal unrealistisch. Darf man da von einer starken ideologischen Prägung deinerseits ausgehen?
-
C#-Fan schrieb:
... Nur mit dem Unterschied,
dass mal alle veraltete Klassen rausgeworfen werden...Und alle paar Monate fragst du dich, wieso deine alten Programme nicht mehr laufen?
P.S. ein Vorteil von Java ist die Rückwärtskompatibilität, zumindest haben die Sun-Leute das jetzt jahrelang durchgezogen, die Chancen, dass sich das plötzlich ändert sind klein (im Gegensatz zu .NET und C#, die von eine [Glaubenskrieg]Standard-boikitierenden Firma[/Glaubenskrieg] kommt.
)
-
JBeni schrieb:
P.S. ein Vorteil von Java ist die Rückwärtskompatibilität
Ist aber gleichzeitig eine große schwäche.
-
ICh finde zwar, das Optimizer einige sinnlose Punkte aufzählt (wie oft hat man bitte 'Foo' und 'foo' in der öffentlichen Schnittstelle?), aber .Net hat auf jeden Fall seine schwächen. Die Generics hätten von Anfang an da sein müssen. Jetzt wird versucht die irgendwie da reinzuwurschteln, was aber nicht immer gelingt. Vor allem gibt es dadurch jetzt vieles unnötigerweise doppelt.