Start Początki programowania nie są łatwe. Ja, chociaż chciałem zostać programistą, od kiedy miałem 5 lat to miałem problemy ze zrozumieniem jak działają pętle i warunki logiczne w Pascalu. Tak, technicznie Pascal na studiach był moim pierwszym językiem programowania. HTML i CSS w liceum się nie liczy.
Jak więc zacząć programować? Z
tego, co widzę po ruchu na moim od czasu do czasu ten wpis na temat porady jak zacząć programować w .NET jest często wyświetlany.
Kto by nie chciał mieć instrukcji jak zacząć swoją przygodę w programowaniu. Jaką książkę kupić? Jaki kurs na Udemy kupić za 20 zł?
W jakim języku programowania się zakochać i potem szukać pracy tak, aby to cieszyło. Jakie technologię pod ten dany język trzeba poznać, aby było dobrze.
Ja zakochałem się w C#? Naturalnie jako osoba, która programuje w C# już prawie 10 lat zawodowo uwielbiam ten język programowania i go polecam. Jednakże wcale to nie znaczy, że nie ma z nim pewnych problemów. Sama platforma .NET też nie jest taka oczywista.
Ten wpis może mnie kopnąć w przyszłości, ale będę z tobą szczery C# i jak platforma .NET ma swoje krzaczki i nie jest taka beginner friendly jakby się mogło wydawać.
Problem 1 : Bariera wejścia do .NET. Ciągle się coś zmienia
Na początku początkujący programista musi jak najszybciej zrozumieć pewne zagadnienia, jak np. jaka jest różnica pomiędzy : .NET Framework, .NET CORE, .NET 5, Mono, Xamarin i jak to się łączy z C#, F# i nawet VB.NET.
Nauka tych pojęć jednak nic nie daje. Większość początkujących programistów chciałoby obejrzeć jakiś filmik na YouTube i zrobić to samo co zobaczyli na ekranie dodając swoje pomysły.
Tutaj pojawia się problem, z jakim tempem te rozwiązania się zmieniają.
Czy ASP.NET MVC i ASP.NET CORE to to samo?
Troszeczkę tak, bo filozofia Controllerów istnieje w obu, ale czytając starą książkę nie zrobisz aplikacji tak samo po nowemu.
To trochę przeraża, bo książka zakupiona dwa lata temu może już pójść do kosza.
Na tym blogu istnieje kurs ASP.NET CORE z wersji pierwszej i wiesz mi, ale wersja 2 i 3 dużo zmieniła, jeśli chodzi o samo uruchomienie serwera strony internetowej. Trzeba więc napisać nowy kurs. Bo zmiany w klasie Startup.cs i ewolucję HttpClient były ciągłe. Nie mówiąc o serializacji JSON
Jak to bywa w Microsoft lub w innej korporacji pewne technologie pojawiają się i znikają jak : Silverlight, WinAPI, XNA, Windows Phone. Nigdy nie wiesz, czy twoja ulubiona technologia nie umrze za rok.
Pewne przejściowe rozwiązania też pojawią się i znikają jak : .NET Standard, który rozwiązywał tymczasowy problem powstały w wyniku rozłamu na .NET Framework i .NET CORE.
Obecnie, jeśli piszesz w .NET 5 i wyżej to Ciebie to nie obchodzi. .NET Standard umarł
Problem 2 : Językowe spaghetti w platformie .NET
Chcesz się więc nauczyć C#. Zanim jednak nauczysz się C# musisz zrozumieć jak obecnie platforma .NET działa, bo bez niej nie uruchomisz kodu.
Teraz pytanie: Czy .NET i C# w sumie nie są to pojęcia łączne jak Bóg, który występuje w 3 osobach.
W .NET możesz napisać program także w F# i VB.NET, ale nie ma co ukrywać, że .NET jest tworzony głównie z myślą o C#.
Logika jest taka, że kod napisany w jednym języku powinien być wykonywalny w innym. Czyli np. twój kolega może napisać kod w F#, a ty byś mógł go użyć, nawet jeśli twój projekt jest w C#
Tutaj pojawia się problem. Każda nowa rzecz dodana do jednego języka, czyli zapewne C# wymusza dodanie czegoś złożonego na innym.
Poza tym nie każdy język wszystko wspiera. Czy wiedziałeś, że F# nie wspiera klas Task i Task<T>?
Problem 3 : Po co są interfejsy z domyślni implementacjami metod
Słuchaj w C# programuje od wielu lat i zobaczyłem jak on się zmienia od wersji 3.0 do wersji 9.0 i za chwilę 10.
Pewne zmiany w tym języku spowodowały jednak zamieszanie, które szczerze mówiąc zadaje mi pytanie, jak ogarnia się na rozmowach kwalifikacyjnych, ponieważ pewne proste pojęcia dla początkujących programistów nie są takie oczywiste i proste jak było to 10 lat temu.
Oto takie pytania:
- Po co jest klasa abstrakcja ?
- Po co są interfejsy ?
- Po co są interfejsy z domyślni implementacjami metod ?
- Czy w C# można zrobić wielodziedziczenie ?
Co więcej, odpowiedź na to pytanie w wielu wpisach, jak i na tym blogu mogą nie być już aktualne, a mówimy o podstawach.
Jakieś stare artykuły na temat pytań kwalifikacyjnych nie są już aktualne. Nawet samo pytania i odpowiedzi na StackOverflow nie są aktualne.
Nie da się też szybko i jedno znacznie odpowiedzieć na takie proste pytania.
Problem 4 : Czy istnieje jedna słuszna droga w C#?
Typy danych w C#
Klasy, struktury i klasy generyczne to nie wszystko, co oferuje C#. Co rodzi mnóstwo pytań, na które nie jest tak łatwo odpowiedzieć.
- Kiedy warto utworzyć strukturę i jeśli tak czy ona powinna być zmienna, czy niezmienna.
- Kiedy warto użyć klasy anonimowej, a kiedy warto stworzyć własną.
- Kiedy warto skorzystać z Tuple i named Tuples?
- Kiedy warto użyć Rekordów?
- Kiedy warto stworzyć zmienną dynamiczną : dynamic.
Na te pytania nie dostaniesz łatwych odpowiedzi i możesz też zobaczyć, że każdy programista może mieć inne zdanie na ten temat.
Nauka języka programowania nie jest łatwa, a teraz wyobraź sobie dwóch nauczycieli programowania, którzy mają sprzeczne poglądy na temat użycia pewnych typów danych albo inny funkcji danego języka programowania.
Ten problem można też pokazać też zadając inne pytania jak :
- Czy lepiej napisać swoje pętle foreach, czy lepiej jest skorzystać z LINQ
- Czy pisząc aplikację konsolową warto to zrobić po staremu, czy po nowemu i skorzystać z funkcji C# 9.0 "Top Level Statements"
- Czy lepiej napisać warunki IF, czy skorzystać z operatora ?
To wszystko nie jest takie oczywiste i często zależy od gustu.
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
Do C# ciągle jest coś dodawane. Ironia polega na tym, że często te nowe rzeczy są dodawane, aby C# był jak Python i można było w nim szybko napisać prostą aplikację "Hello World".
Mówię tutaj o "Top Level Statements", które dają możliwość pisania aplikacji konsolowy bez zbędnej ceremonii. Ten kod jest poprawny:
using System;
using System.Threading.Tasks;
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");
Ten też :
using System;
using System.Threading.Tasks;
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");
}
}
}
Dlaczego jest to Ironia? Posiadanie zbyt wiele opcji rozpoczęcia pisania kodu w C# może być przerażające. Każda nowa rzecz w C# ma swoją cenę.
Poza tym często zapominamy, że programowanie to czytanie innego kodu napisanego przez innego programistę.
Być może jest to problem nie do rozwiązania. Trzeba by było może usuwać głupie pomysły z C# permanentnie nie zależnie od tego, czy zawsze były one głupie, czy po prostu się zestarzały, ale to się nigdy nie zdarzy.
Swoją drogą na temat głupich rzeczy w C# oto jedna rzecz, która mnie zastanawia, po co ona jest :
- Słowo kluczowe "event"
Na szczęście Microsoft zauważa, że C# staje się scyzorykiem, który na jeden problem ma 10 rozwiązań, ale o ile dla mnie to nie jest problem, bo sledze te tematy przez 10 lat to dla początkującego programisty to trochę inna historia.
Problem 5 : Wersja SDK i nazewnictwo
Mam więc .NET Framework, .NET CORE i .NET 5 i wyżej. To nie jest to samo.
No tak mamy jeszcze Mono, Xamarin.
ASP.NET występuje też wielu formach jak ASP.NET Web Forms, ASP.NET MVC i ASP.NET CORE oraz ASP.NET CORE for .NET 5 (chyba)
Słuchaj ja to rozumiem, bo o tym czytam i widziałem też te zmiany na swoich oczach. Początkujący ma prawo dostać zawroty głowy.
Przynajmniej niedługo wszystko ma być po prostu .NET 5 i wyżej. Jednakże nie wiadomo kiedy znowu nie powstanie rozłam.
Z bibliotekami też są pewne nie ścisłości. .NET CORE zakłada, że aplikację będą działać wszędzie na każdym systemie operacyjnym. Tymczasem w .NET Core masz WPF, który działa tylko pod Windows.
Jeśli chodzi o samo nazewnictwo to powodzenia szukania wpisów z nazwą "ASP.NET 5" z roku 2015, a nie 2021.Jak też pisać .NET w internecie :
- .NET,
- dot net,
- DOTNET,
- dot.net,
- dot-net,
- dot-net-core
Problem 6 : Microsoft i jego produkty
Microsoft naturalnie jako firma chce reklamować swoje produkty przy okazji C# i .NET.
Serwer IIS, chmura Azure, Azure DevOps, Visual Studio, SQL Server, Microsoft Teams, Office, Edge, Bing,
Jednakże warto zwrócić uwagę, że możesz pisać aplikację w C# nie tylko w produkach Microsoftu, które gadają z innymi produktami Microsoftu.
Ostatnio dostaje dużo pozytywnych sygnałów na temat alternatyw do Visual Studio: https://www.jetbrains.com/rider/
Microsoft chciałby to ukryć.
Tutaj pojawia się kolejna ironia, bo .NET i C# bardzo zyskał na tym, że stał się językiem Open Source jednakże wciąż jest uwieziony w produktach Microsoft przy najmniej z punktu widzenia osób, które te rozwiązania reklamują.
Co ma sens, ale to sprawia, że blizna, że C# i .NET jest produktem M$ nigdy nie zniknie.
Ja zadaje pewne pytanie, które nasuwa się wielu początkującym programistom. Dlaczego Visual Studio Code, darmowy edytor tak kiepsko radzi sobie z C#, F# i technologiami .NET.
Odpowiedź jest prosta, bo do tego jest Visual Studio.
Patrząc na dokumentację Microsoftu początkujący programista też może odnieś wrażenie, że .NET i C# działa tylko w chmurze Azure. Co oczywiście nie jest prawdą.
Problem 7 : Co dalej po podstawach C#:
Istnieje też pytanie, co dalej. Załóżmy, że znasz podstawy C# i umiesz w nim napisać proste aplikacje jak np. kalkulator. Co dalej z taką wiedzą.
Ostatnio dostałem pytanie od czytelnika tego bloga na temat tego, co powinien nauczyć się, jeśli zna trochę C# i ma starą książkę na temat ASP.NET MVC i będę szczery, ale sam nie wiem co takiej osobie odpowiedzieć.
Zrobiłem więc ankietę na Twitterze i dałem następujące opcję do wyboru :
- Nauczyć się Angulara, Reacta, Vue.js, aby być FullStackDeveloperem
- Nauczyć się Blazor i tak pisać aplikację SPA w C#
- Nauczyć się więcej ASP.NET CORE
- Skoncentrować się na stronie dostępu do danych, czyli Entity Framework Core i jakaś baza SQL
Przynajmniej jak patrzę na listę ofert pracy dla programistów .NET to nie ma co ukrywać, ale 80% procent ofert dla programistów .NET to pisanie stron internetowych i jej logiki serwerowej w ASP.NET CORE.
Co zatem idzie po podstawach C# albo inwestujesz swój czas w naukę wielu technologi związanych tworzeniem stron internetowych jak : CSS, HTML, JavaScript, TypeScript, Angular, React, Vue.js albo...no właśnie.
Aplikacje na telefony Android i Apple z Xamarin w C#? Nic o tym nie wiem, bo ten temat śledziłem w 2012 roku i wiem tylko, że jest lepiej niż było.
WPF, Windows Forms, czyli aplikację pulpitowe istnieją jeszcze w jakiś firmach jako aplikację legacy, ale nie powinieneś się tego uczyć.
Z tego, co obserwuje w innych platformach to pisanie aplikacji pulpitowych zawsze było trudne więc obecnie poleca się stworzenie aplikacji pulpitowej, która jest tak naprawdę ukrytą przeglądarką, która tak naprawdę uruchamia kod napisany w JavaScript tak jakby to była strona internetowa.
Jeśli chodzi o .NET to mam nadzieje, że .NET MAUI coś zmieni, jeśli chodzi o 15-letni problem .NET związany z WPF i Windows Forms. Chciałbyś w końcu dobrze pisać aplikację na pulpit użytkownika bez względu co to za urządzenie (komputer czy telefon).
Trzymam kciuki za Blazor. Bo pisanie stron internetowych tylko w C# brzmi jak rozwiązanie Silverlight tylko akurat Web Assembly na pewno nie zniknie z dnia na dzień jak Flashowo podobne technologie.
Na razie dla mnie .NET i C# to tworzenie stron internetowych w ASP.NET.
Czy w innym platformach jest tak samo ?
Patrząc na frameworki jak Angular, React, Vue.js i biblioteki związane z JavaScript to możesz odnieść wrażenie, że pewne problemy z danym językiem programowania muszą istnieć.
Język GO, który ma już 10 lat. Pomimo wielu zmian programista w tym przypadku nie musi wnikać jak on się zmieniał przez lata. Jakbyś się zastanawiał, dlaczego ludzie chwalą język Go oto powód.
Też trochę mnie boli fakt, że jeśli chcesz być WebDeveloperem to więcej sensu ma nauczenie się języka JavaScript. A potem Node.js dla logiki serwerowej i jakiś framework SPA po stronie klienta jak Angular, React i Vue.js.
C# próbuje też wkroczyć do świata sztucznej inteligencji jak Python, ale czas pokaże jak to się rozwinie w czasie.
Początki programowania nie są łatwe. Ja tylko trzymam kciuki, aby platforma .NET nie strzeliła sobie gdzieś w kolano.
Mam także dobre wieści. Cieszy mnie fakt, że obecnie instalacja Visual Studio jest dużo łatwiejsza i mniej inwazyjna systemowo. Cieszy mnie fakt, że Visual Studio istnieje w wersji darmowej pod nazwą Community Version. Kiedyś takich rzeczy nie było.
Co też pokazuje, że Microsoft chce, abyś korzystał z C# i się go uczył.