Nun, oder fang an, es richtig zu machen.
Wenn ich gebeten würde, auf ein bestimmtes Problem hinzuweisen, das die meisten Softwareprodukte getötet hat, würde ich definitiv das Verlangen nach Entwicklern auffordern, die ferne Zukunft vorauszusehen. Dies kann auf viele Arten ausgedrückt werden, aber das allgemeine Schema ist ungefähr wie folgt:
"Wir müssen die Lösung {X} implementieren, obwohl es für uns eine viel einfachere und geeignetere Lösung gibt {Y}, denn wenn {Z} in der Zukunft passiert, funktioniert {X} viel besser als {Y}." .Darüber hinaus gibt es keine und kann keine genaue Information über die Wahrscheinlichkeit des Auftretens des Ereignisses {Z} geben.
Hier einige Beispiele:
- Wir müssen Kubernetes und Docker verwenden! Ja, ein einzelner Server bewältigt die aktuelle Last und ist einfach zu konfigurieren und zu warten. Wenn wir jedoch ein Dutzend Server benötigen, ist es einfacher, sie mit Kubernetes und Docker bereitzustellen.
- Wir brauchen eine verteilte Datenverarbeitungsarchitektur! Ja, bis jetzt kümmert sich ein durchschnittlicher PC um alles, aber wenn wir eine Lösung in Industriequalität haben und Kunden eine Verfügbarkeit von fünf Neunen in SLA fordern, sind wir darauf vorbereitet.
- Wir müssen ein Entwicklungsteam einstellen und eine Website von Grund auf neu erstellen, obwohl es viel schneller wäre, etwas basierend auf WordPress bereitzustellen, denn wenn wir 100-mal mehr Kunden als jetzt haben, ist WordPress nicht so praktisch.
- Wir müssen Vererbung anstelle von Komposition verwenden, da nach 5 Jahren die Codebasis wächst, so dass es ohne sie keine Möglichkeit gibt.
- Wir müssen diesen Code in C ++ schreiben, obwohl er in Python um ein Vielfaches schneller sein wird, da er nach Jahren Terabyte an Daten verarbeitet und Python hier möglicherweise nicht damit umgehen kann.
Kürzlich schrieb ich
einen Artikel über imaginäre Probleme - diejenigen, mit deren Lösung sich die Leute unterhalten, weil ihre Lösung interessanter ist als echte. Dies schließt auch diese Versuche ein, die Zukunft vorauszusehen. Sie können sogar noch mehr sagen - dies ist das bevorzugte imaginäre Problem der meisten kleinen Start-up-Unternehmen.
Aber lassen Sie uns nicht alles zusammenbringen: Der Versuch, auf die Zukunft vorbereitet zu sein, kann nützlich sein, wenn Sie dies mit Bedacht angehen. Aber nur wenige Menschen kommen mit Bedacht auf sie zu - Menschen haben Fantasien, Ängste, Emotionen und andere menschliche Gefühle.
Erfolg zu haben ist schwieriger als mit bereits erreichtem Erfolg zu leben
Jeder träumte manchmal davon, wie alles wäre, wenn er jemand anderes wäre. Jemand reich, berühmt, stark, mit Macht ausgestattet. Darüber nachzudenken ist ziemlich interessant, und es passiert irgendwie von selbst, unfreiwillig. Sie haben also ein Foto auf dem Cover des Magazins gesehen - und Sie dachten, was würde ich anstelle dieser Berühmtheit tun? Oh, also würde ich das Geld dafür ausgeben, und wenn ich das dann tun würde. Und auch das. Und wenn du noch fliegen und Superkräfte besitzen könntest! Ja, das wäre toll!
Softwareentwickler sind auch Menschen, und sie sind auch Fantasien zugänglich. Das bedeutet also, dass Facebook seine Plattform auf solchen und solchen Technologien aufgebaut hat und auf eine Milliarde Nutzer skaliert ... Nun, wir sind nicht schlechter und die Technologien sind verfügbar. Machen wir auch alles gut, mit einem Rückstand von einer Milliarde Nutzern (obwohl es bisher hundert davon gibt). Facebook-Magie lag jedoch nicht in der Technologie der Skalierung auf eine Milliarde Nutzer. Sie konnte den Menschen das richtige Produkt zur richtigen Zeit und am richtigen Ort geben. Software, die bis zu einer Milliarde Benutzer skalieren kann, war ein sekundärer und weniger wichtiger Teil des Unternehmens. Es wurde nur erstellt, wenn es gebraucht wurde und nur so, wie es gebraucht wurde.
Die Medaille hat zwei Seiten:
a) Wachstum zu erzielen ist schwieriger als die Aufrechterhaltung der Skalierbarkeit.
b) Die meisten außergewöhnlich qualifizierten und talentierten Programmierer arbeiten an Produkten, die eine gute Skalierbarkeit erfordern.
Punkt
"a" ist leicht zu erkennen. Denken Sie selbst - von allen Softwareunternehmen, die jemals gegründet wurden, erreichten wahrscheinlich nur etwa 0,05% das Niveau von Millionen von Benutzern und Milliarden von Gewinnen. Der Rest stürzte früher ab oder erhielt weniger.
Die meisten Fantasien über die Funktionen, die in Zukunft für Software benötigt werden, beruhen normalerweise darauf, die Probleme dieser 0,05% der Unternehmen zu lösen. "Hier haben wir ein Team von 1000 Entwicklern, 10 Millionen Benutzern und einem Dutzend großer Unternehmenskunden mit ihren komplexen Anforderungen, und dann brauchen wir ..." Nein, das brauchst du nicht. Mit einer Wahrscheinlichkeit von 99,95%.
Aber zu solchen verlockenden Ideen NEIN zu sagen, ist schwierig - weil es das Vertrauen in genau diese Bruchteile von einem Prozent der Erfolgswahrscheinlichkeit zerstört. Wir müssen aufhören, uns als Besitzer des neuen Amazonas vorzustellen, und zu den heutigen Problemen zurückkehren. Und heute haben Sie 50 Benutzer, von denen 30 Familienmitglieder und Freunde sind. Ja, das Bewusstsein für den aktuellen Stand der Dinge kann demotivieren.
Punkt
"b" hilft auch nicht, mit Besessenheit umzugehen. Es ist klar, dass die besten Programmierer in Top-Unternehmen arbeiten. Entweder weil sie dank ihres Talents geschaffen wurden oder weil Top-Unternehmen die besten Programmierer einstellen können. Das Pareto-Prinzip wirkt hier gegen uns: Es ist besser für Programmierer, Bücher zu schreiben, Präsentationen zu halten und bessere Systeme zu entwerfen. Jeder von uns hörte von ihnen diese faszinierenden Geschichten über fehlertolerante Cluster, die auf Tausende von Knoten verteilt sind und Petabyte an Daten mit einer Software verarbeiten, die auf einige unglaubliche Leistungsdaten optimiert ist. Die meisten von uns müssen jedoch nicht darüber nachdenken, wie sie hier und jetzt einen solchen Cluster in ihrem Unternehmen aufbauen können. Er wird einfach nicht gebraucht.
Es ist also groß, die Augen zu schließen und Ihr Unternehmen in 5 Jahren zu vertreten - hilft das nicht? Ist es wirklich notwendig, nicht mehr an die Zukunft zu denken?
Natürlich nicht. Über die Zukunft nachzudenken ist gut. Das Entwerfen von Software mit einer Grundlage für die Zukunft ist ebenfalls nützlich, aber Sie müssen es richtig machen.
Flexibel gestalten, unvollständig umsetzen
Besser weniger tun, aber gut. Nur sehr wenige Produkte erfüllen tatsächlich die Bedürfnisse ihrer Kunden. Damit Sie
A gemacht haben und 90% Ihrer Benutzer genau
A brauchten - wird es nie sein. 90% Ihrer potenziellen Benutzer benötigen eine Art
B , und Ihr
A ist nur die nächstgelegene Alternative zu
B , und niemand tut oder verkauft
B selbst, sodass einige Käufer mit einer Meise in der Hand zufrieden sind.
Was ist in diesem Szenario gut? Sobald Sie die Käufer gefunden haben, können Sie immer noch versuchen, zu verstehen, was sie wirklich brauchten, und dies schließlich realisieren. Na ja, oder eine etwas bessere Alternative dazu. Die Benutzerbasis hilft Ihnen, den Markt zu studieren, Nischen zu finden und diese zu füllen. Sobald Sie nach dieser Nische suchen, beginnen Sie darin zu arbeiten - hier beginnt Ihr Wachstum.
Und dieser Ansatz ist wirklich produktiv. Sie implementieren etwas Kleines, aber es funktioniert gut, geben es den Benutzern - und hören dann auf ihre Gedanken zu Ihrem Produkt. Sie raten nicht mehr, lösen keine imaginären Probleme, fügen keine unnötige Komplexität hinzu. Sie passen sich an, fügen etwas hinzu, entfernen etwas. Und das schafft Ihr einzigartiges Produkt.
Und auf diese Weise - je kleiner Ihre Codebasis ursprünglich war, desto einfacher ist es, sie an etwas Neues anzupassen.
„Ich hasse Code und würde gerne so wenig davon in unserem Produkt sehen“ - Jack Diederich
Wenn Sie dafür gesorgt haben, dass etwas perfekt funktioniert, haben Sie es falsch gemacht. Sie mussten auf dem Weg zu große Opfer bringen. Vielleicht war es Zeit- oder Geldverschwendung, vielleicht haben Sie die Flexibilität aufgegeben, vielleicht etwas anderes. Das Ideal wird nicht kostenlos erreicht.
Nicht ideale Software ist praktikabler. Es ist möglich, es in einer angemessenen Zeit und zu einem angemessenen Preis zu erstellen. Es macht oft genug alles oder fast alles Notwendige. Da es unvollkommen ist, lässt es per Definition Raum für seine Entwicklung und Handlungsfreiheit.
Optimistisches Design der Softwarearchitektur - die Zukunft kann angenehm erwachen
Es ist wichtig, sich daran zu erinnern, dass die Welt um Sie herum nicht statisch ist. Die Probleme, die nach einigen Jahren vor Ihnen auftreten, können mit Hilfe der nach einigen Jahren verfügbaren Technologien leicht gelöst werden. Viele Menschen entwerfen etwas, ohne zukünftige Chancen nicht zu berücksichtigen, sondern verlassen sich im Allgemeinen nur auf Werkzeuge, die bereits Jahrzehnte alt sind. Sie beschränken sich nicht einmal heute, sondern gestern.
Lassen Sie mich über ein konkretes Beispiel sprechen: das Entwerfen verteilter Systeme mit der Erwartung, für jedes Wachstum bereit zu sein. Eine der häufigsten Befürchtungen, die zur Schaffung solcher Systeme führen, ist die Befürchtung, dass Ihr Server irgendwann nicht mehr alle Benutzer bedienen kann. Und es passiert wirklich. Manchmal. Aber nicht in kleinen Unternehmen, nicht in Startups. Darüber hinaus sind sich die meisten Leute, die 2018 Software schreiben, aus irgendeinem Grund sicher, dass sie auf 2005 erstellten Servern funktioniert. Computer werden jedes Jahr besser und gute Server können nicht so teuer gemietet werden.
Lassen Sie mich einen solchen anfänglichen "echten" Server beschreiben:
- Zwei Xeons E5-2680v4 (28Cores & 56 Threads, Cloking bei 2,4 GHz bis 3,3 GHz)
- 512 Gigabyte DDR4-2400 RAM
- 2 NVMe-SSDs mit jeweils 1,2 TB (~ 3 GB / s lesen und ~ 1,5 GB / s schreiben).
Ja, ich wette, dass die Hälfte der verteilten Systeme der Welt vollständig auf diesem Server mit all seinen Komponenten und Abhängigkeiten ausgeführt wird und wie gewohnt die gesamte vorhandene Benutzerbasis bedient. Und das ist alles andere als der bisher coolste Server. Dies kann für einen Preis von 800 bis 1300 Dollar pro Monat genommen werden (je nachdem, wo man es bekommt). Sie können ein Dutzend davon für das Gehalt eines qualifizierten Ingenieurs in London mieten.
Was an diesem Server noch gut ist, ist, dass der Mietpreis in 2 Jahren um das Zweifache sinken wird.
Computer entwickeln sich, entwickeln sich sehr linear und vorhersehbar und werden sich wie vorhergesagt bis Ende der 2020er Jahre weiterentwickeln. Es ist schwer weiter zu erraten, aber es ist unwahrscheinlich, dass sich die Menschheit etwas Neues einfallen lässt. Und die Menschen erinnern sich noch an das Eisen vom Anfang des Jahrhunderts und befürchten, dass es nicht ausreichen wird, ein paar tausend Anfragen pro Tag zu bearbeiten.
Aber wir reden über Eisen. Und denken Sie an die gesamte Software, die angezeigt und entwickelt wird. Nur wenige Menschen haben vor 20 Jahren ernsthaft über Sprachsteuerung nachgedacht. Und schauen Sie sich die heutige Welt an - "OK Google", "Hallo Alexa", "Wie ist das Wetter jetzt, Siri?" Jeder, der im 2016. Jahr angefangen hat, ein Voice-Frontend zu schreiben - hat es gerade bis 2018 geschafft.
Was soll ich 2018 anfangen zu schreiben? Ah, wenn ich es wüsste :) Dies ist etwas, das bereits am Horizont aufgetaucht ist, aber noch nicht so groß geworden ist, dass es die Sonne überschattet. Schauen Sie sich um, vielleicht bemerken Sie so etwas?
Der Fortschritt in der Software ist unglaublich. Völlig unbemerkt sind Browser mit dem Aufkommen von WASM zu universellen virtuellen Maschinen geworden. Nach zwei Jahren können Sie eine vielseitige, komplexe und leistungsstarke Anwendung erstellen, indem Sie sie für genau eine Plattform kompilieren: Web Assembly. Und es wird überall beginnen.
Aber 2012 leben die Leute immer noch irgendwo. Sie verwenden Babel, obwohl 99% der Benutzer mindestens einen Browser mit ES6-Unterstützung haben.
Es erscheinen ständig neue Programmiersprachen. Und einige von ihnen sind ziemlich gut. Erst in den letzten 8 Jahren haben wir Go, Rust, Scale und D bekommen - alle haben ihre Nische gefunden. In den nächsten 2 Jahren erwarte ich, wie Julia zur wissenschaftlichen Programmierung beitragen wird. Und genau das macht mir persönlich Sorgen und ich folge ihnen. Die Gesamtmenge an Technologie und Wissen ist unglaublich.
Aber ich schweife ab ...
Die Zukunft zu inspirieren ist relativ einfach. Aber ehrlich gesagt ist es neben dem linearen Fortschritt des Produktivitätswachstums schwer vorstellbar, was in zwei oder fünf Jahren passieren wird. Einige Ideen schweben in der Luft, Teams arbeiten an verschiedenen Software- und Hardwareprojekten, aber was wird daraus "schießen"?
Wenn Sie Ihre Software jedoch auf die Zukunft vorbereiten möchten, müssen Sie zuerst die Gegenwart verstehen. Was in der Gegenwart gut ist, ist, dass es bereits existiert, beobachtbar und messbar ist. Und es hält noch eine Weile durch. Es ist eine gute Idee, Ihre Software heute zumindest relevant zu machen. Mit den Ansätzen von 2000 sind Sie nicht bereit für die Realität von 2020. Software, die mit für 2018 relevanten Ansätzen geschrieben wurde, kann jedoch 2020 für sich selbst recht gut funktionieren.
Verweigern Sie sich also nicht das Vergnügen, Software mit einer Grundlage für die Zukunft zu entwickeln. Mach es einfach korrekter. Berücksichtigen Sie nicht nur die Entwicklung Ihres zukünftigen Produkts, sondern auch die Entwicklung des umgebenden Ökosystems. Alles, was flexibel gestaltet werden kann, muss flexibel gestaltet werden. Dies gibt Ihnen die Möglichkeit, in dem Moment zu manövrieren, in dem Sie herausfinden, auf welche Weise dieses Manöver abgeschlossen werden soll. Und das erspart Ihnen Zeit, sich auf etwas vorzubereiten, das niemals passieren wird.