402 Stimmen

Was sind fünf Dinge, die Sie an Ihrer Lieblingssprache hassen?

Es gab in letzter Zeit eine Häufung von Perl-Hass auf Stack Overflow, also dachte ich, ich bringe meine " Fünf Dinge, die Sie an Ihrer Lieblingssprache hassen " Frage an Stack Overflow. Nimm deine Lieblingssprache und nenne mir fünf Dinge, die du an ihr hasst. Das können Dinge sein, die Sie einfach nur ärgern, zugegebene Designfehler, erkannte Leistungsprobleme oder jede andere Kategorie. Sie müssen sie nur hassen, und es muss Ihre Lieblingssprache sein.

Vergleichen Sie sie nicht mit einer anderen Sprache, und sprechen Sie nicht über Sprachen, die Sie bereits hassen. Sprechen Sie nicht über die Dinge, die Sie an Ihrer Lieblingssprache mögen. Ich möchte nur die Dinge hören, die du hasst, aber tolerierst, damit du all die anderen Dinge benutzen kannst, und ich möchte etwas über die Sprache hören, von der du dir wünschst, dass andere Leute sie benutzen würden.

Diese Frage stelle ich immer dann, wenn mir jemand seine Lieblingssprache aufdrängen will, und manchmal auch als Interviewfrage. Wenn jemand keine fünf Dinge findet, die er an seinem Lieblingstool hassen kann, kennt er es nicht gut genug, um es entweder zu befürworten oder das große Geld damit zu machen. Er hat es nicht in genügend verschiedenen Situationen eingesetzt, um es vollständig zu erforschen. Er befürwortet sie als Kultur oder Religion, was bedeutet, dass ich falsch liege, wenn ich nicht seine Lieblingstechnologie wähle.

Es ist mir nicht so wichtig, welche Sprache Sie verwenden. Sie wollen eine bestimmte Sprache nicht verwenden? Dann tun Sie es nicht. Sie haben sich nach bestem Wissen und Gewissen für eine Sprache entschieden und verwenden sie trotzdem nicht? Kein Problem. Manchmal lautet die richtige Antwort: "Sie haben ein starkes Programmierteam mit guten Praktiken und viel Erfahrung mit Bar. Zu Foo zu wechseln wäre dumm."


Dies ist auch eine gute Frage für Code Reviews. Leute, die eine Codebasis wirklich kennen, haben alle möglichen Vorschläge für sie, und diejenigen, die sie nicht so gut kennen, haben unspezifische Beschwerden. Ich frage Dinge wie "Wenn Sie bei diesem Projekt noch einmal von vorne anfangen könnten, was würden Sie anders machen?" In dieser Fantasiewelt können sich Benutzer und Programmierer über alles und jeden beschweren, der ihnen nicht gefällt. "Ich möchte eine bessere Schnittstelle", "Ich möchte das Modell von der Ansicht trennen", "Ich würde dieses Modul anstelle dieses anderen verwenden", "Ich würde diese Methoden umbenennen", oder was auch immer ihnen an der aktuellen Situation nicht gefällt. Auf diese Weise bekomme ich einen Eindruck davon, wie viel ein bestimmter Entwickler über die Codebasis weiß. Es ist auch ein Anhaltspunkt dafür, wie viel vom Ego des Programmierers in dem steckt, was er mir erzählt.

Hass ist nicht die einzige Dimension, um herauszufinden, wie viel Menschen wissen, aber ich habe festgestellt, dass sie eine ziemlich gute ist. Die Dinge, die sie hassen, geben mir auch einen Hinweis darauf, wie gut sie über ein Thema nachdenken.

36voto

peterchen Punkte 39679

C++

  • Streicher.
    Sie sind nicht interoperabel mit Plattform-Strings, so dass man in der Hälfte der Fälle std::vector verwenden muss. Die Kopierpolitik (Kopieren beim Schreiben oder tiefes Kopieren) ist nicht definiert, so dass für eine einfache Syntax keine Leistungsgarantie gegeben werden kann. Manchmal verlassen sie sich auf STL-Algorithmen, die nicht sehr intuitiv zu verwenden sind. Zu viele Bibliotheken entwickeln ihre eigenen, die leider viel komfortabler zu benutzen sind. Es sei denn, man muss sie kombinieren.

  • Vielfalt der String-Darstellungen
    Nun, das ist ein kleines Plattformproblem - aber ich hoffe trotzdem, dass es besser gewesen wäre, wenn eine weniger hartnäckige Standard-String-Klasse früher verfügbar gewesen wäre. Die folgenden String-Darstellungen verwende ich häufig:

    • generische LPCTSTR,
    • LPC(W)STR zugewiesen durch CoTaskMemAlloc,
    • BSTR, _bstr _t
    • (w)string,
    • CString,
    • std::vector
    • eine "Roll-my-own"-Klasse ( seufz. ), die einem (w)char *-Puffer bekannter Länge eine Bereichsprüfung und grundlegende Operationen hinzufügt
  • Modell bauen.
    Ich habe die Nase voll von all der Zeit, die ich damit verbringe, mich mit Who-Includes-What, Forward-Deklarationen, der Optimierung vorkompilierter Header und Includes herumzuschlagen, um zumindest die inkrementellen Build-Zeiten erträglich zu halten, usw. In den achtziger Jahren war das großartig, aber heute? Es gibt so viele Hürden, ein Stück Code so zu verpacken, dass es wiederverwendet werden kann, dass es sogar Mamas Hund langweilt, mir zuzuhören.

  • Schwer zu entschlüsseln
    Das macht es besonders schwer, externe Tools zu schreiben und richtig einzusetzen. Und heute fehlt es uns C++-Leuten vor allem an der Werkzeugkette. Ich liebe meine C#-Reflection und Delegates, aber ich kann auch ohne sie leben. Ohne großartiges Refactoring kann ich das nicht.

  • Einfädeln ist zu schwer
    Die Sprache erkennt es (inzwischen) nicht einmal, und die Freiheiten des Compilers - obwohl großartig - sind zu schmerzhaft.

  • Statische und bedarfsgesteuerte Initialisierung Technisch gesehen schummle ich hier: Dies ist ein weiteres Puzzlestück in der Reihe "Code zur Wiederverwendung einpacken": Es ist ein Alptraum, etwas nur dann zu initialisieren, wenn es gebraucht wird. Die beste Lösung für alle anderen Redist-Probleme ist, alles in Header zu packen, dieses Problem sagt "neeener - das geht nicht".


Zugegeben, vieles davon geht über den reinen Sprachbereich hinaus, aber IMO muss die gesamte Toolchain beurteilt werden und sich weiterentwickeln.

35voto

Daniel Cassidy Punkte 23409

JavaScript :

  • Le site Object Der Prototyp kann geändert werden. Jedes einzelne Objekt in Ihrem Programm erhält neue Eigenschaften, und wahrscheinlich geht etwas kaputt.

  • Alle Objekte sind Hash-Maps, aber es ist schwierig, sie sicher als solche zu verwenden. Insbesondere, wenn einer Ihrer Schlüssel zufällig __proto__ dann sind Sie in Schwierigkeiten.

  • Kein Objektabschluss zum Zeitpunkt der Funktionsreferenz. In der Tat, keine Objektschließung überhaupt - stattdessen, this wird immer dann gesetzt, wenn eine Funktion mit Objektnotation oder dem new Betreiber. Führt zu viel Verwirrung, insbesondere bei der Erstellung von Ereignisrückrufen, da this nicht so eingestellt ist, wie es der Programmierer erwartet.

    • Korollarisch: Aufruf einer Funktion ohne Objektnotation oder die new Operator führt zu this gleich dem globalen Objekt gesetzt wird, was zu vielen Fehlern führt.
  • Der Additionsoperator wurde überladen, um auch die String-Verkettung durchzuführen, obwohl die beiden Operationen grundsätzlich unterschiedlich sind. Dies führt zu Problemen, wenn ein Wert, den man für eine Zahl hält, in Wirklichkeit eine Zeichenkette ist.

  • == y != Operatoren führen Typenzwang durch. Vergleiche zwischen verschiedenen Typen beinhalten eine Liste von Regeln, die sich kein Sterblicher vollständig merken kann. Dies wird durch das Vorhandensein der folgenden Funktionen gemildert === y !== Betreiber.

  • Beide null y undefined existieren, mit subtil unterschiedlichen, aber redundanten Bedeutungen. Warum?

  • Seltsame Syntax für die Einrichtung von Prototypenketten.

  • parseInt(s) erwartet eine Zahl im C-Stil, behandelt also Werte mit führenden Nullen als oktal, usw. Sie können zumindest parseInt(s, 10) aber das Standardverhalten ist verwirrend.

  • Kein Blockumfang.

  • Dieselbe Variable kann mehrmals deklariert werden.

  • Sie können eine Variable verwenden, ohne sie zu deklarieren. In diesem Fall ist sie global und macht Ihr Programm wahrscheinlich kaputt.

  • with { } .

  • Wirklich mit JavaDoc-ähnlichen Werkzeugen schwer zu dokumentieren.

34voto

Greg Hewgill Punkte 882617

Python:

  • Fehlende statische Typisierung
  • Standard-Argumentbehandlung (insbesondere die Tatsache, dass Sie ändern das Standardargument für zukünftige Anrufer!)
  • Zu viele erforderliche Unterstriche (Konstruktoren müssen aufgerufen werden __init__ )
  • Fehlen richtiger privater Mitglieder und Funktionen (die Konvention besagt einfach, dass die meisten Dinge, die mit einem Unterstrich beginnen, privat sind, mit Ausnahme von Dingen wie __getattr__ das nicht ist)
  • Lustige Syntax für print in eine Datei zu schreiben (aber das wird in Python 3 korrigiert)

32voto

Jay Bazuzi Punkte 43111

C#

  • Ich wünschte, ich könnte switch() auf jeden Typ, und dass case könnte ein beliebiger Ausdruck sein.

  • Objektinitialisierungssyntax kann nicht mit 'readonly'-Feldern verwendet werden / private set Autoprops. Im Allgemeinen möchte ich Sprache Hilfe bei der Herstellung unveränderlichen Typen.

  • Verwendung von {} para Namensraum y Klasse y method y Eigenschaft/Indexer-Blöcke y Mehrfachanweisungsblöcke y Array-Initialisierer . Es ist schwer herauszufinden, wo man sich befindet, wenn sie weit voneinander entfernt sind oder nicht zusammenpassen.

  • Ich hasse das Schreiben (from x in y ... select).Z() . Ich möchte nicht auf die Syntax des Methodenaufrufs zurückgreifen müssen, weil der Abfragesyntax etwas fehlt.

  • Ich möchte eine do Klausel in der Abfragesyntax, die wie folgt lautet foreach . Aber dann ist es nicht wirklich eine Anfrage.

Ich greife hier wirklich zu weit. Ich denke, C# ist fantastisch, und es ist schwer, viel zu finden, die gebrochen ist.

25voto

MattBelanger Punkte 5160

PHP

  1. Keine Debugging-Funktionen, wenn Sie nicht die Kontrolle über den Server haben, und selbst dann sind sie irgendwie ungenügend
  2. Die extreme Menge an schlechtem PHP-Code, die im Umlauf ist, gibt allen PHP-Programmierern einen schlechten Ruf.
  3. Inkonsistente Funktionsbezeichnungen
  4. Unmöglichkeit, eine statisch typisierte Variable zu haben, wenn ich das möchte (ich bin ein großer Fan der dynamischen Typisierung in 90% der Fälle)
  5. REGISTER_GLOBALS ist der Teufel

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X