Kolumne: Stropek as a Service

Tipps und Tricks rund um .NET und Visual Studio
Keine Kommentare

Die Designer der .NET-Plattform legen einen großen Fokus darauf, einfache Dinge einfach zu machen und erleichtern damit den Einstieg für .NET-Anfängerinnen und -Anfänger. Ich möchte diese Kolumne der Frage widmen, warum das für eine Programmiersprache heutzutage besonders wichtig ist.

Diese Kolumne ist zwar dem Thema SaaS gewidmet, diesmal lege ich jedoch den Schwerpunkt auf C# und . NET. Das hat mehrere Gründe: Erstens ist kürzlich die neue .NET-Version 5 erschienen und sie soll wichtige Maßnahmen enthalten, .NET im Kontext von Cloud-Computing noch besser zu machen. Zweitens entwickle ich viele meiner Cloud-Services mit C# und .NET. Der dritte und wichtigste Grund ist, dass ich finde, dass die Designer der Plattform in Sachen Sprach- und Framework-Design im Moment vieles richtig machen: Sie legen einen großen Fokus darauf, einfache Dinge einfach zu machen und erleichtern damit den Einstieg für .NET-Anfängerinnen und -Anfänger. Ich möchte diese Kolumne der Frage widmen, warum das für eine Programmiersprache heutzutage besonders wichtig ist.

Der erste Eindruck

Ich halte die Art und Weise, wie die Umsetzung einfacher Anwendungsbeispiele von „Hello World“ in einer Programmiersprache aussieht, für wesentlich. Profis mögen kein großes Interesse an solchen Codebeispielen haben, da sie ihr Geld mit dem Lösen komplexer Herausforderungen verdienen. Ganz anders verhält es sich aber bei Personen, die ein- oder umsteigen. Versetzen Sie sich in die Lage von Studentinnen und Studenten, die für ihre ersten Web-API-Übungen eine Plattform auswählen müssen. Vergleichen Sie einmal die Beispiele zu „Hello World“ von Express.js (JavaScript oder TypeScript) [1], Go [2] und ASP.NET [3]. Sie werden feststellen, dass die ersten beiden sehr einfach sind, während bei ASP.NET schon im ersten Tutorial Dinge wie Dependency Injection, Entity Framework oder Authentifizierung angesprochen werden. Generiert man mit dem .NET CLI sein erstes Web-API für ASP.NET (dotnet new webapi), erhält man vier C#-Dateien, deren Zusammenspiel man erst erkunden muss, bevor man loslegen kann. Macht man das Gleiche mit Node.js oder Go, ist alles in einer übersichtlichen Datei beisammen. Dort braucht man keinen Namespace und keine Klasse mit Main-Methode. Dadurch wirkt C# auf den ersten Blick kompliziert.

Alle Entwicklerinnen und Entwickler mit viel Erfahrung wissen, dass der Schein trügt. Komplexe Web-APIs sehen nicht aus wie ein Beispiel von „Hello World“, aber: Der erste Eindruck ist wichtig! Wenn C# hier den Nachwuchs abschreckt und er deshalb andere, scheinbar elegantere, schlankere Plattformen auswählen, hat das auf lange Sicht katastrophale Auswirkungen auf C# und .NET. Die Plattform würde verwaisen, sie würde irgendwann als Legacy abgestempelt und als nicht mehr tauglich für die moderne Welt von Cloud-Computing, Microservices, SaaS und Co. angesehen werden.

Beispiele

Ich finde es beruhigend, dass Mitglieder des .NET-Teams öffentlich darüber nachdenken, wie sich die Entwicklung einfacher, auf .NET 5 aufbauender Web-APIs anfühlen könnte. Ein Beispiel dafür ist das Feather-HTTP-Projekt [4]. Es ist nur ein Experiment und weit davon entfernt, für Produktionszwecke einsatzfähig zu sein. Trotzdem zeigt es exemplarisch, wie in Zukunft der erste Eindruck von C# und .NET in Sachen Web-APIs für Anfängerinnen und Anfänger aussehen könnte. Ich habe für diese Kolumne in Listing 1 ein Beispiel erstellt, das auf Feather HTTP aufbaut. Dieser Code ist komplett. Es braucht nur diese paar Zeilen C# in einer einzigen Datei, mehr nicht.


using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
 
ConcurrentBag heroes = new()
{
  new(1, "Homelander", "DC", true),
  new(2, "Groot", "Marvel", false),
};
 
var app = WebApplication.Create(args);
app.MapGet("/heroes", GetAllHeroes);
app.MapPost("/heroes", AddHero);
app.MapGet("/heroes/{id}", GetHero);
await app.RunAsync();
 
async Task GetAllHeroes(HttpContext ctx) =>;
  await ctx.Response.WriteAsJsonAsync(heroes);
 
async Task GetHero(HttpContext ctx) =>;
  await ctx.Response.WriteAsJsonAsync(
    heroes.First(h => h.id == int.Parse(ctx.Request.RouteValues["id"].ToString())));
 
async Task AddHero(HttpContext ctx)
{
  heroes.Add(await ctx.Request.ReadFromJsonAsync());
  ctx.Response.StatusCode = StatusCodes.Status201Created;
}
 
record HeroDto(int id, string name, string universe, bool canFly);

Dort wird eine C#-9-Funktion genutzt, die ein weiteres gutes Beispiel für Vereinfachung ist: Top-Level-Statements. Das Entfernen von Main ist für die meisten C#-Profis keine große Sache. Es scheint lächerlich, die paar Zeilen Code in Program.cs einsparen zu wollen. Das ist es aber nicht. So ziemlich alle modernen und „hippen“ Sprachen brauchen kein Main.

Mein drittes Beispiel ist die gRPC-Umsetzung in .NET 5 und C# 9. Ich finde, dass sowohl die Einbindung von ProtoBuf-Dateien (.proto) in das Visual Studio Tooling als auch das Programmiermodell hervorragend gelungen sind. Der Einstieg in gRPC und auch in gRPC-Web ist für Personen, die die ersten Schritte in ASP.NET geschafft haben, sehr einfach.

Einstieg ohne Geschichtslektionen

Das regelmäßige Hinterfragen von historisch gewachsenem Ballast ist wesentlich. Ich kenne ich die Historie der Plattform und weiß, was hinter .NET Framework, .NET Standard, Portable Class Libraries, Mono, .NET Core etc. steckt und wodurch sich diese Dinge entwickelt haben. Wem es so wie mir geht, dem empfehle ich einmal, .NET und C# absoluten Anfängerinnen und Anfängern zu erklären. Schon auf der zweiten Seite des Wizards zum Anlegen eines .NET-Projekts in Visual Studio muss man Geschichtslektionen erteilen, um zu rechtfertigen, warum es .NET Framework, .NET Core und .NET Standard gibt und wo der Unterschied zu dem Zeug ist, das einfach nur „.NET“ heißt. Das sollte nicht notwendig sein.

Ich finde es gut, dass Microsoft mit .NET 5 Zusätze wie Core und Standard wieder streicht. Das macht es leichter, Neulingen .NET näherzubringen. Man kann den Rest vor .NET 5 augenzwinkernd als „your grandfather’s .NET“ abhaken und hat damit eine große Einstiegshürde vom Tisch. Wer sich professionell mit .NET und C# auseinandersetzt, wird sich schnell genug mit der Historie der Plattform auseinandersetzen müssen – spätestens wenn die ersten, alten Komponenten Wartung brauchen.

Wermutstropfen sind in dieser Hinsicht (noch) die Inkonsistenzen bei ASP.NET Core und Entity Framework Core. Warum ist hier noch das „Core“ im Namen? Alten .NET-Hasen ist das klar, Neulinge verwirrt es.

Begrenzte Auswahl ist eine Stärke

Aus Sicht von Anfängerinnen und Anfängern hat das C#-Ökosystem eine große Stärke: Bei vielen Themen bietet das Framework eine so gute Option, dass man sich selten im Open-Source-Dschungel umsehen und sich zwischen unzähligen Alternativen entscheiden muss. Beispiele dafür sind ASP.NET Dependency Injection, Object Relational Mapping mit Entity Framework Core oder Routing in ASP.NET. Das macht den Einstieg in die Welt von .NET viel einfacher als bei Plattformen wie Node, Go oder Rust.

Geht man über „Hello World“ hinaus und will sein erstes, richtiges Web-API entwickeln, muss man unzählige Entscheidungen treffen und bereut diese womöglich nachträglich. In ASP.NET wird man hier wesentlich stärker geführt. Das ist, wie gesagt, ein großer Vorteil beim Einstieg und steigert die Produktivität bei den ersten Schritten enorm. Es ist aber auch ein Risiko. Damit .NET relevant bleibt, muss Microsoft die Plattform aktuell und konkurrenzfähig halten. Meiner Ansicht nach macht Microsoft diesbezüglich momentan einen sehr guten Job. .NET 5 und C# 9 zeigen das in beeindruckender Weise.

Verschiedene Sichtweisen sind wichtig

Wahrscheinlich geht es vielen Leserinnen und Lesern ähnlich wie mir: Ich habe in der Vergangenheit schon oft den Kopf geschüttelt, wenn bei Events Mitglieder des .NET-Teams API-Beispiele zu „Hello World“ gezeigt haben und stolz darauf waren, dass in einer neuen .NET-Version ein paar Zeilen Code weniger notwendig sind.

Meine Arbeit als Lehrer an einer HTL (Höhere Technische Lehranstalt) für Informatik und als Mentor im CoderDojo (Programmierclub für Kinder) haben mir aber gezeigt, dass es für den langfristigen Erfolg von Programmiersprachen und Plattformen wichtig ist, einen guten ersten Eindruck zu vermitteln und einfache Dinge einfach zu halten. Komplexe Szenarien müssen möglich sein. Sie sind aber nicht das einzige, was die Qualität einer Plattform ausmacht. .NET und C# müssen dem Nachwuchs etwas bieten, damit diese Plattform relevant bleibt und damit auch unsere Investitionen in C#-Code langfristig gesichert sind.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
X
- Gib Deinen Standort ein -
- or -