Hallo liebe myCSharp-Community!
Mit dem heutigen Tag haben wir nach insgesamt rund drei Jahren, nach dem wir die ersten Zeile Code geschrieben haben, auf unsere neue .NET basierte Plattform migriert.
Was war.
Das PHP-Forum wurde viele Jahre von Jack30lena auf einer kleinen virtuellen Linux-Maschine - sowohl die Web-Instanz wie auch die Datenbank - betrieben, bevor ich das Forum entsprechend 2018 im Gesamten übernommen habe. Ich persönlich habe fast keine wirkliche operative Erfahrung mit dem Umgang von und mit Servern; sondern bin einfach seit fast 15 Jahren vor allem als Architekt und eben Entwickler unterwegs. Daher war für mich klar, dass ich die betriebliche Verantwortung eines Servers weder stemmen kann noch Zeit für das Erlernen und anschließende Betreiben aufbringen will. Da kann ich meine Zeit einfach besser investieren.
Anfang 2019 wurde dann das Forum auf die Azure-Cloud in West-Europa migriert; in Form eines Managed MySQL Services, sowie einem App Service mit PHP-Unterstützung. Da in Azure App Services keine inhaltlichen Dateien geschrieben werden *sollen* und daher der Ordner, in dem sich die Web-Applikation befindet, aus Sicherheitsgründen read-only ist, gab es in diesem Zuge bereits eine Anpassung des PHP-Codes, dass wir auch den Azure Storage Service nutzen konnten, auf dem nun die ganzen Anhänge aus dem Forenbereich, sowie Benutzerbilder und ein paar andere statische Inhalte liegen.
Dies war zumindest mal der erste Schritt, der uns etwas Luft verschafft hat, dass wir Zeit in eine Neuentwicklung stecken konnten.
Make or Buy ist eine typische Entscheidung in der Entwicklung und natürlich will man immer alles selbst bauen. Aber da dies ein Freizeit-Projekt ist wollten wir eigentlich so wenig wie möglich selbst machen. Über die Jahre hinweg sind jedoch so viele manuelle Anpassungen im PHP-Code erfolgt, dass so eine einfache Migration gar nicht möglich war.
Hinzu kam, dass das Forum so viele Jahre hinweg nicht aktualisiert wurde, dass wir "einfach so" gar nicht auf eine aktuelle Forensoftware migrieren könnten.
Wir müssten über die jeweiligen Versionen zwischen unserer und der neuesten Version migrieren und womöglich zwischen jeder Migration manuell Dinge anpassen: no way.
Daher blieb uns nichts anderes übrig alles selbst neu zu machen - so oder so.
Das schöne: wenn wir das Forum selbst umsetzen, dann können wir uns die Plattform vollständig aussuchen.
Wie es begann.
Der erste .NET Code der nun vorhanden Basis ist prinzipiell schon vor der Migration auf Azure entstanden: Coffeebean und ich wurden die letzten Jahre immer im Frühjahr von Microsoft an deren Hauptsitz nach Redmond (bei Seattle in den USA) eingeladen, um circa 10 Tage lang über neue Dinge informiert zu werden, mit den verschiedenen Microsoft Teams (.NET, Azure, SQL, Office...) näher in Kontakt zu kommen und sich mit anderen Experten aus den verschiedenen Ecken der Erde auszutauschen. Im März 2018 haben wir uns dort im Rahmen eines Hackathons, welcher das Ziel hatte Community- und/oder Open-Source-Ideen zu schaffen, zusammen an den Laptop gesetzt und die ersten Zeilen Code - damals noch mit .NET Core 2 - geschrieben, die nun unsere Basis bilden.
Berufsbedingt gab es aber auch bei diesem Anlauf keinen wirklichen Fortschritt; echte Ergebnisse gab es dann erst im Winter 2018/2019. Leider gab es durchaus aber auch einige Rückschläge, die in den meisten Fällen mit der Roadmap von .NET Core zu tun hatten, wodurch die Entwicklung immer wieder ins Stocken kam.
Vor allem die Breaking Changes in Entity Framework haben uns sehr viel Zeit (und Nerven) gekostet, weshalb wir einige Paradigmen verworfen und an einigen Stellen neu beginnen mussten.
Oft hat das einem die Lust genommen, weshalb das Forum dann liegen blieb - aber wir wussten, dass es weiter gehen muss.
Während der fortschreitenden Entwicklung kamen immer mehr Features hinzu; vieles zunächst nach dem Motto: Hauptsache funktional mal drin.
Bedingt durch entsprechende Kundenprojekte meinerseits wusste ich aber, dass wir eigentlich wirklich erst Releasen können mit dem Release von .NET 5. Hinzu kam, dass wir aber zwingend bis Februar 2021 wechseln müssen, da Azure die Unterstützung für unsere Uralt-MySQL-Version, die das PHP-Forum zwingend benötigt, abgekündigt hat.
Der Zeitraum, in dem wir wechseln *müssen* war also gegeben: November 2020 bis Februar 2021.
Wie es ist.
Wir haben uns sehr früh dazu entschieden, dass wir auf einige Dinge verzichten, die das PHP-Forum hatte aber wir eigentlich nicht mehr brauchen; allen voran die MiniCity, die unsere Datenbank extrem belastet hat und keinerlei Mehrwert hatte. Allein die MiniCity hat den zehnfachen Speicherplatz und CPU-Ressourcen benötigt als des gesamte Forum.
Das stand in keinerlei Verhältnis und flog daher raus.
Besonders wichtig ist uns entsprechend die Sicherheit, worauf wir großen Wert gelegt haben.
Prinzipiell ist alles neu am Forum; außer die UI. Die UI werden wir in einem zweiten Schritt auf moderne Beine stellen. Zunächst war uns hier die Technik wichtig, denn ohne dies können wir nichts anderes tun.
Besonders hervorzuheben ist jedoch, dass das Login System völlig neu ist. Es basiert auf ASP.NET Identity und erfüllt die modernsten Standards (inkl. Multi Faktor Authentifizierung über OTPT) - und inkl. den Eigenheiten der GDPR. In Zukunft wird es auch möglich sein sich mit externen Anbietern (Google, Twitter, Microsoft, GitHub) anzumelden.
Endlich kann man sich auf mehreren Geräten gleichzeitig anmelden - und über die Konto-Einstellungen könnt ihr eure aktiven Logins verwalten.
Die Vorgaben der GDPR haben insgesamt sehr viel Einfluss genommen. So hat das Forum bislang ungefragt Cookies gesetzt, die das Forum jedoch benötigt hatte, um beispielsweise den letzten Besuch anzuzeigen und so Beiträge zu markieren, die neu waren. Dies haben wir so umgestellt, dass wir dafür keine Cookies mehr benötigen, sondern in der Datenbank am Benutzer gespeichert wird, sodass dies auch den Nebeneffekt hat, dass dies Geräteübergreifend funktioniert.
Der Nachteil ist, dass Leser, die nicht angemeldet sind, aktuell keine visuelle Darstellung erhalten können, was neu ist und was nicht. Hier suchen wir noch nach einer Lösung.
myCSharp hat bislang keinerlei Tracking von Lesern durchgeführt und wir werden das auch in Zukunft nicht tun. Alle Angaben sind und bleiben freiwillig und wir setzen nur systemrelevante Cookies.
Das Forum bietet aktuell im Grunde die gleiche Funktionalität an, wobei der Editor etwas überarbeitet wurde.
Neu ist, dass mehrere Anhänge an einen Forenpost gehängt werden können, was das Datenbank-Design der PHP-Variante nicht ermöglicht hatte: es war eine 1-1 Beziehung zwischen Beitrag und Anhang. Mir nicht klar, warum das damals so gewählt wurde.
Ebenfalls anders ist, dass Beiträge in Zukunft nur noch innerhalb eines gewissen Zeitraums editieren werden können, der derzeit 30 Minuten beträgt. Der Zeitraum ist nicht fix; wir müssen auch lernen, welcher Zeitraum hier sinnvoll ist.
Der Grund ist, dass in der Vergangenheit zu oft der Kontext selbst nach Wochen editiert wurde, sodass der Verlauf eines Themas nur noch schwer nachvollzogen werden konnte. Auch kam es leider ab und zu vor, dass Themenstarter alle Beiträge mit "xxxx" gefüllt haben. Wir können zwar die Beiträge jederzeit wiederherstellen; aber das muss einfach nicht sein.
Das macht ein Forum kaputt und können wir nicht dulden.
Syntax-Highlighting wird in Zukunft mit dem Projekt PrismJS visualisiert, das nicht nur C# Code, sondern sehr viel mehr Sprachen unterstützt. Die wichtigsten Sprachen in diesem Forum (C#, XAML, SQL, XML, Json..) könnt ihr in Zukunft direkt im Editor auswählen. Für alle anderen Sprachen steht weiterhin der "Code"-Button zur Verfügung.
Die Farben des Highlightings sind noch nicht final.
Was wird.
Wir sehen myCSharp nicht mehr nur als Forum, sondern als allgemeine Plattform für C#. Das Forum ist und bleibt der Kern, aber wir werden auch neue Elemente bringen.
Daher sprechen wir auch intern vom myCSharp Portal. Die neue Plattform ist sehr sehr viel performanter und modularer, ermöglicht uns in Zukunft viele neue Ideen und Wünsche umzusetzen. Wir können mit der neuen .NET Plattform bei identischen Ressourcen mehr als vierzig mal mehr Requests pro Sekunde beantworten, wobei die Antwortenzeiten mehr als halbiert wurden.
Wir wollen selbst, dass besonders die UI moderner wird; mir selbst fehlt hier jedoch einfach die Kenntnis und insgesamt dem Team aktuell etwas die Zeit.
Eine neue Oberfläche wird kommen. Angefangen haben wir damit, dass wir erste Dinge barrierefrei gestaltet haben und Bilder und Icons durch Unicode-Darstellungen ersetzt haben, sodass der Browser hier keine unnötigen Inhalte extra jedes Mal laden muss und so das Ladeverhalten der Webseite insgesamt viel besser sein wird.
Bedingt durch den Mix sieht das ein oder andere aktuell etwas komisch aus...
Für den Forenbereich planen wir vor allem Verbesserungen rund um den Editor, sowie die Möglichkeiten Beiträge zu bewerten und inhaltlich als Lösung zu markieren.
Dies ist nicht nur besser für die Leser und für die Beiträge; die Suchmaschinen drängen uns auch in die Richtung, da bei Foren die Bewertung von Inhalten mit in die SEO-Bewertung fließt.
Die Forensuche soll ebenfalls vereinfacht und verbessert werden.
Inhaltlich wollen wir auch das Thema .NET/C# "Lernen" zentralisieren; eventuell durch einen eigenen Learning/Tutorial-Bereich und auch den Artikeln eine bessere Gewichtung geben. Wie genau das aussehen wird, das wissen wir noch nicht.
Das Thema Community und Möglichkeiten der Vernetzung wollen wir ebenfalls intensivieren; auch hier die Umsetzung eher unbekannt.
Der Wunsch nach Snippets kommt jeden Tag erneut, spätestens wenn jemand im Forum nach einem Beispiel fragt.
Auch diesen Bereich planen wir derzeit.
Die gemeinsame Zukunft.
myCSharp ist ein Community-Projekt, daher nehmen wir aber auch sehr gerne eure Wünsche und Ideen entgegen, um diese in die Weiterentwicklung fließen zu lassen. Bei einigen Dingen erhoffen wir auch, dass die Community hier aktiv mitmacht und Inhalte mit gestaltet.
Wir werden daher ein paar Ideen vorstellen, wie es leichter sein könnte, Inhalte von euch für die Community zu erstellen; vielleicht ein Blog, der entsprechend durch die Reichweite gelesen werden kann, vielleicht Artikel. Wir werden es sehen und wollen mit euch und für euch Inhalte gestalten.
Bugs aka Work in Progress
Ja. Diese Bugs.
Wir müssen unsere Software im produktiven Betrieb auch erst mal kennenlernen. Wir haben so viel wie möglich getestet, aber wir werden sicherlich nicht alle Bugs gefunden haben. Die Azure Plattform bietet, getrieben durch automatische Analysen und Performance-Wizards in den Produkten Application Insights und der Datenbank uns sehr viele Möglichkeiten, wie wir unsere Software überwachen und effizienter gestalten können.
Wenn euch jedoch ein Bug auffällt, dann meldet euch bitte direkt bei einem Team-Mitglied, sodass wir die Bugs zentral sammeln und beheben können.
Bekannte Bugs und offene Punkte siehe
Sammelthema Wünsche und Bugreports myCSharp
Wir haben nun die Möglichkeit einzelne Bereiche von myCSharp gezielt mit Hilfe von Feature Flags zu aktivieren/deaktivieren.
Wenn mal etwas deaktiviert ist, dann haben wir wahrscheinlich einen Bug gefunden, der dann so schnell wie möglich behoben wird.
Bitte hier um Verständnis :-)
---------------------------------------------------------------
Mein persönlicher, besonderer Dank...
Zunächst mal wollen wir nicht vergessen, dass Jack das Forum jahrelang betrieben hat; daher entsprechend einen Dank an ihn. Auch einen großen Dank an herbivore, der Jahrelang das Herz des Forums war und mit seinen über 40.000 Beiträgen(!) maßgeblich zum Inhalt des Forums beigetragen hat. Auch ein Dank an alle Mods, Experten und Mitglieder sowie Leser, die die letzten 18 Jahre das Forum zu dem gemacht haben, das es heute ist.
Aus meiner Sicht während der Entwicklung des neuen Forums geht ein
besonders großer Dank an gfoidl, der sich sehr flexibel die Zeit genommen hat tausende Zeilen an Code von mir in über 200 Pull Requests, die teilweise viel viel zu umfangreich waren, zu überprüfen und Fehler zu finden, die noch so versteckjt waren.
gfoidl hat jedoch nicht nur Pull Requests überprüft, sondern mit seinem extrem extrem tiefen Verständnis von .NET, Runtime-Executions und Co zu enormen Performance-Fortschritten und Verbesserungen beigetragen. Viele Verbesserungen und Umsetzungen waren mir selbst nach über 19 Jahren .NET neu oder unklar. Ich habe oft nachfragen müssen, was sein Code eigentlich macht und warum er besser ist. Er hat hier Spezial-Wissen mit in die Entwicklung gebracht, das wirklich nur <0.01% der .NET Experten mitbringen.
Die Zusammenarbeit mit Gü während der Forenentwicklung hat mir viel Spaß gemacht, ich konnte viel von ihm lernen!
Danke Gü!
Danke an Fabian aka
Coffeebean, der mir vor allem privat bei vielen Dingen geholfen hat! Danke an
Papst, der das Image-Resize Feature der Avatare umgesetzt und ebenfalls zu einigen Code-Reviews beigetragen hat sowie an
MrSparkle, der auch fleissig getestet und Feedback gegeben hat!
Ein weiterer Dank geht an
William Durkin, der hier vermutlich eher unbekannt ist; den ich die letzten Jahre durch die Microsoft Community kennenlernen durfte.
William gehört zu den besten SQL Beratern, ist ein sehr bekannter SQL Buch-Autor sowie Community-Speaker und hat uns in seiner privaten Zeit dabei geholfen die Datenbank zu gestalten und die Performance zu optimieren.
---------------------------------------------------------------
Daher vielen Dank an alle, vielen Dank an alle, die mitgeholfen haben und myCSharp mit Leben füllen!
Viel Spaß auf der neuen Plattform!