Liegt es daran, dass diese alle in verwalteten, müllsammelbaren Sprachen und nicht in nativem Code geschrieben wurden?
Langsamer Code funktioniert trotzdem schlecht. Sicher, eine bestimmte Sprache kann bestimmte Problemklassen hervorrufen, während andere gelöst werden. Gute Programmierer sind jedoch durchaus in der Lage, Problemumgehungen zu finden, wenn genügend Zeit zur Verfügung steht.
Haben die einzelnen Programmierer die Software für diese Geräte geschrieben?
Teilweise. In vielen Fällen ist es sehr wahrscheinlich, dass zumindest ein Faktor dazu beiträgt. Dies ist ein bedauerlicher Nebeneffekt einer Branche, in der gute Programmierer stark nachgefragt werden und das Angebot knapp ist. Auch die Kluft zwischen verschiedenen technischen Fähigkeiten kann recht groß sein. Es liegt also auf der Hand, dass manchmal die Programmierer, die mit der Implementierung bestimmter Software beauftragt wurden, nur dazu beglückwünscht werden konnten, dass sie zum Laufen gebracht wurden.
In all diesen Fällen wussten die App-Entwickler genau, auf welche Hardwareplattform sie abzielen und welche Funktionen sie hatten. Haben sie das nicht berücksichtigt?
Teilweise. Zunächst einmal ist die genaue Hardwareplattform wahrscheinlich nicht bekannt, da diese bei der Softwareentwicklung häufig mit verschiedenen Herstellern parallel ausgehandelt wird. Tatsächlich kann es nach der Erstveröffentlichung sogar zu geringfügigen (aber nicht unbedingt unbedeutenden) Änderungen an der zugrunde liegenden Hardware kommen. Ich stimme jedoch zu, dass die allgemeinen Fähigkeiten bekannt sein werden.
Ein Teil des Problems ist, dass Software wahrscheinlich nicht auf der Hardware entwickelt wird, sondern in Emulatoren. Dies macht es schwierig, die tatsächliche Geräteleistung zu berücksichtigen, selbst wenn die Emulatoren zu 100% genau sind - was nicht der Fall ist.
Dies rechtfertigt natürlich nicht wirklich unzureichende Tests auf der entsprechenden Prototyp-Hardware vor der Veröffentlichung. Diese Schuld liegt wahrscheinlich außerhalb der Kontrolle von dev / qa.
Ist es der Typ, der wiederholt: "Optimierung ist die Wurzel allen Übels", hat er sie in die Irre geführt?
Nein, ich bin mir ziemlich sicher, dass sie ihm sowieso nicht zuhören. sonst würde er nicht so oft falsch zitiert (das soll " vorzeitige Optimierung ..." sein). :-D
Es ist wahrscheinlicher, dass zu viele Programmierer hinsichtlich der Optimierung eines von zwei Extremen annehmen.
- Entweder ignorieren sie es komplett.
- Oder sie sind von Kleinigkeiten besessen, die nichts mit den tatsächlichen Leistungsanforderungen zu tun haben. Der Nettoeffekt ist, dass das Budget knapp wird und der Code zu verschleiert ist, um die tatsächlichen Leistungsprobleme sicher zu optimieren .
War es eine Mentalität von "Oh, es sind jedes Mal nur zusätzliche 100 ms", bis sich all diese Millisekunden auf Minuten summieren?
Möglicherweise. Wenn Sleep(100)
als Äquivalent Tissue-Papier verwendet wurde, um das Ausbluten einer abgetrennten Extremität zu verlangsamen, sind natürlich Probleme zu erwarten. Ich vermute jedoch, dass das Problem subtiler ist.
Die Sache ist, dass moderne Computerhardware (einschließlich eingebetteter Geräte) viel schneller ist, als man ihnen zuschreibt. Die meisten Leute, selbst "erfahrene" Programmierer, wissen nicht, wie schnell Computer sind. 100 ms sind eine lange Zeit - eine sehr lange Zeit . Und wie es passiert, schneidet diese "sehr lange Zeit" zwei Wege:
- Zum einen sorgen sich Programmierer unnötig um die Dinge, die ein Computer extrem schnell erledigt. (Es ist so, dass es nur eine Sorge war, " 300-mal pro Sekunde einen Wert zu erhöhen ", die mich hierher geführt hat.)
- Der zweite Grund ist, dass sie manchmal keine angemessene Besorgnis zeigen, wenn die Dinge sehr lange dauern (auf der Rechenzeitskala). So:
- wenn sie die Auswirkungen der Latenz bei der Kommunikation über ein Netzwerk oder mit einem Speichergerät ignorieren;
- wenn sie die Auswirkungen eines blockierten Threads ignorieren und auf einen anderen Thread warten;
- Wenn sie das vergessen, weil Computer so schnell arbeiten, ist es sehr gut in der Lage, eine Aufgabe viel häufiger zu wiederholen, als es sollte, ohne dass sich der Entwickler eines Problems bewusst ist
- ... wenn eine Kombination solcher Versehen auftritt, wird eine Routine unerwartet sehr langsam ausgeführt (auf der Rechenzeitskala). Ein paar Wiederholungen und es wird sogar von Menschen bemerkt werden - aber es kann schwierig sein, es festzunageln, weil Hunderte von miteinander verbundenen Dingen von selbst schnell laufen.
Ist es meine Schuld, dass ich diese Produkte überhaupt gekauft habe?
Ja definitiv. Nun, nicht Sie persönlich, sondern die Verbraucher im Allgemeinen. Produkte werden über Feature-Checklisten verkauft (und gekauft ). Zu wenige Verbraucher fordern eine bessere Leistung.
Um meinen Standpunkt zu verdeutlichen: Als ich das letzte Mal ein Handy kaufen wollte, konnte der Laden nicht einmal ein Demomodell zum Spielen im Laden anbieten. Alles, was sie hatten, waren Plastikhüllen mit Aufklebern, die zeigten, wie der Bildschirm aussehen würde. Sie können nicht einmal ein Gefühl für das Gewicht bekommen - geschweige denn Leistung oder Benutzerfreundlichkeit. Mein Standpunkt ist, dass wir nur einen kleinen Schritt in die richtige Richtung gehen würden , wenn genügend Menschen Einwände gegen dieses Geschäftsmodell erheben und mit ihren Geldbörsen abstimmen würden, um ihren Einwand zu äußern .
Aber sie tun es nicht, also sind wir es nicht. und jedes Jahr laufen neue Handys auf schnellerer Hardware langsamer.
(Die Fragen nicht gestellt.)
- Sind Marketing-Leute schuld? Teilweise. Sie benötigen Veröffentlichungstermine. Und wenn das besagte Datum bevorsteht, ist die Wahl zwischen "Lass es funktionieren" und "Mach es schneller" ein Kinderspiel.
- Sind Verkäufer schuld? Teilweise. Sie wollen mehr Funktionen in der Checkliste. Sie übertreiben Feature-Listen und ignorieren die Leistung. Sie machen (manchmal) unrealistische Versprechungen.
- Sind Manager schuld? Teilweise. Unerfahrene Manager können viele Fehler machen, aber selbst sehr erfahrene Manager können (zu Recht) Zeit opfern, um Leistungsprobleme zugunsten anderer Bedenken zu lösen.
- Sind Spezifikationen schuld? Teilweise. Wenn etwas außerhalb der Spezifikation liegt, ist es viel einfacher, es später zu "vergessen". Und wenn es nicht ausdrücklich angegeben ist, was ist das Ziel? (Obwohl ich persönlich der Meinung bin, dass ein Team, das stolz auf seine Arbeit ist, sich trotzdem um die Leistung sorgen würde.)
- Ist Bildung schuld? Vielleicht. Bildung wird wahrscheinlich immer im Rückstand sein. Ich missbillige mit Sicherheit "Bildung", die Anfänger mit einem oberflächlichen Verständnis für Softwareentwicklung schnell aus dem Konzept bringt. Eine Ausbildung, die mit Theorie untermauert ist und eine Lernkultur vermittelt, kann jedoch nicht schlecht sein.
- Sind Upgrades schuld? Teilweise. Neue Software, alte Hardware ist wirklich verlockend. Noch vor der Veröffentlichung von Version X ist X + 1 in Planung. Die neue Software ist kompatibel, aber ist die alte Hardware schnell genug? Wurde es getestet? In der neuen Software ist möglicherweise eine bestimmte Leistungsverbesserung enthalten, die zu einem unsachgemäßen Software-Upgrade führt.
Grundsätzlich glaube ich, dass es viele Faktoren gibt, die dazu beitragen. Leider gibt es keine Silberkugel, um das Problem zu beheben. Das heißt aber nicht, dass es düster und düster ist. Es gibt Möglichkeiten, zur Verbesserung der Dinge beizutragen.
Wann ist also bei diesen Produkten ein Fehler aufgetreten?
IMHO können wir keinen einzelnen Punkt wirklich identifizieren. Es gibt viele Faktoren, die sich im Laufe der Zeit entwickelt haben.
- Bohnenzähler: Kostensenkung, Market Timing. Aber hätten wir die erzielten Fortschritte auch ohne Druck gemacht?
- Hohe Nachfrage und geringes Angebot an Fachkräften in der Branche. Nicht nur Programmierer, sondern auch Manager, Tester und sogar Verkäufer. Mangel an Fähigkeiten und Erfahrung führt zu Fehlern. Andererseits führt es auch zum Lernen.
- Spitzentechnologie. Bis eine Technologie ausgereift ist, wird sie regelmäßig auf unerwartete Weise beißen. Andererseits bot es in erster Linie häufig eine Reihe von Vorteilen.
- Komplizierte Komplikation. Im Laufe der Zeit hat sich die Branche weiterentwickelt: Hinzufügen weiterer Tools, Technologien, Ebenen, Techniken, Abstraktionen, Hardware, Sprachen, Variationen und Optionen. Dies macht es etwas unmöglich, ein "vollständiges" Verständnis für moderne Systeme zu haben. Dadurch sind wir aber auch in der Lage, in viel kürzerer Zeit viel mehr zu leisten.
Was können wir als Programmierer tun, um diesen Schmerz nicht unseren eigenen Kunden zuzufügen?
Ich habe einige Vorschläge (sowohl technische als auch nichttechnische), die helfen können:
- Soweit möglich - verwenden Sie Ihr eigenes Produkt. Es gibt nichts Besseres als die Erfahrung aus erster Hand, um Dinge aufzudecken, die umständlich, langsam oder unbequem sind. Sie müssen jedoch bewusst vermeiden, dass Mängel aufgrund von "Insiderwissen" umgangen werden. Wenn Sie beispielsweise keine Probleme beim Synchronisieren von Kontakten haben, weil Sie dies mit einem Backdoor-Python-Skript tun, verwenden Sie "das Produkt" nicht. Welches bringt den nächsten Punkt auf ...
- Hören Sie Ihren Benutzern zu (vorzugsweise aus erster Hand, aber mindestens aus zweiter Hand über den Support). Ich weiß, dass Programmierer (im Allgemeinen) es vorziehen, versteckt zu bleiben und menschliche Interaktionen zu vermeiden. Dies hilft Ihnen jedoch nicht dabei, die Probleme zu erkennen, die andere Personen bei der Verwendung Ihres Produkts haben. Sie bemerken möglicherweise nicht, dass die Menüoptionen langsam sind, da Sie alle Verknüpfungen kennen und diese ausschließlich verwenden. Auch wenn das Handbuch alle Verknüpfungen vollständig dokumentiert, bevorzugen einige Benutzer die Menüs - obwohl sie unerträglich langsam sind.
- Bemühen Sie sich, Ihre technischen Fähigkeiten und Kenntnisse kontinuierlich zu verbessern. Entwickeln Sie die Fähigkeit, alles, was Sie lernen, kritisch zu analysieren. Überprüfen Sie Ihr Wissen regelmäßig. In einigen Fällen sollten Sie vergessen, was Sie zu wissen glaubten. Welches bringt auf ...
- Einige Technologien / Techniken können sehr knifflig sein und zu subtilen Missverständnissen und falschen Implementierungen führen. Andere, die durch die Weiterentwicklung des Allgemeinwissens oder der verfügbaren Tools entstanden sind, können sich als günstig oder ungünstig erweisen (z. B. Singletons). Einige Themen sind so knifflig, dass sie eine Reihe von "Hokuspokus-Experten" hervorbringen, die eine Vielzahl von Fehlinformationen verbreiten. Ein besonderer Bugbear von mir ist die Fehlinformation rund um Multithreading. Eine gute Multithread-Implementierung kann das Benutzererlebnis erheblich verbessern. Leider werden viele falsch informierte Ansätze zum Multithreading die Leistung erheblich reduzieren, fehlerhafte Bugs verstärken, Deadlock-Risiken erhöhen, das Debuggen erschweren usw. Denken Sie also daran: Nur weil ein "Experte" es gesagt hat, ist es nicht wahr.
- In Besitz nehmen. (Nein, im Ernst, ich spiele kein Boardroom-Bingo.) Verhandeln Sie mit Managern, Produktbesitzern und Verkäufern über Leistungsmerkmale, die Vorrang vor einigen Checklistenelementen haben. Fordern Sie bessere Spezifikationen. Nicht kindisch, sondern durch Fragen, die zum Nachdenken über Leistung anregen.
- Seien Sie ein anspruchsvoller Verbraucher. Wählen Sie das Telefon mit weniger Funktionen, das jedoch schneller ist. (Nicht schneller CPU, schneller UI.) Dann prahlen Sie damit ! Je mehr Verbraucher anfangen, nach Leistung zu verlangen, desto mehr Bohnenkostenzähler planen dies ein.