Czy zdarzyło Ci się kiedyś spędzić wiele godzin na rozwiązywaniu problemu programistycznego tylko po to, by odkryć, że ktoś inny już go wcześniej rozwiązał? Wielu początkujących (i nie tylko) programistów połyka tę przynętę i wymyśla koło od nowa.
W efekcie traci się cenny czas i energię na tworzenie czegoś, co już istnieje w formie gotowej biblioteki, narzędzia lub wzorca projektowego. W tym artykule wyjaśnię, dlaczego nie warto ponownie wymyślać rzeczy już opracowanych i jak skorzystać z gotowych, archetypowych rozwiązań, które potrafią rozwiązać 80% Twoich codziennych problemów programistycznych.
Dlaczego nie warto wymyślać koła od nowa?
Początkujący programiści często popełniają błąd polegający na tworzeniu wszystkiego od zera. Kuszące jest napisanie własnego kodu - daje to poczucie sprawczości i kreatywności. Niestety, w praktyce często prowadzi to do marnowania czasu i powielania błędów, których można było uniknąć. Pamiętaj, że kod napisany od podstaw nie jest od razu doskonały - musi przejść przez wiele testów i poprawek.
Z kolei istniejące rozwiązania były tworzone przez zespoły ekspertów i sprawdzone w boju przez setki użytkowników. Sięgając po nie, oszczędzasz godziny (a czasem dni) pracy i zyskujesz pewność, że Twoje rozwiązanie jest solidne.
Co więcej, firmy programistyczne cenią efektywność. Nie chodzi o to, byś popisywał się napisaniem od podstaw własnego kontenera IoC czy systemu logowania - przeciwnie, bardziej wartościowa jest umiejętność dobrania istniejącego, sprawdzonego narzędzia i zaimplementowania go szybko w projekcie. Twoim celem jako programisty jest rozwiązywanie problemów biznesowych, a nie pisanie każdego elementu infrastruktury samemu od zera.
80% problemów ma już gotowe rozwiązania
Jest takie powiedzenie: "80% efektów pochodzi z 20% przyczyn" - to słynna zasada Pareto (80/20). W programowaniu można tę mądrość przełożyć na następującą radę: około 80% problemów, z którymi się spotkasz, zostało już kiedyś rozwiązanych przez kogoś innego. Innymi słowy, istnieje duża szansa, że Twój aktualny problem pasuje do znanego schematu i ma już gotowe rozwiązanie.
Zamiast zaczynać od pustego edytora i pisać wszystko samodzielnie, rozejrzyj się. Być może .NET oferuje już odpowiedni mechanizm w swojej bibliotece standardowej, albo ktoś stworzył popularny pakiet NuGet, który rozwiązuje dokładnie taki problem jak Twój. Zanim napiszesz choćby jedną linię kodu, warto zrobić krótki research: czy dane zadanie było już rozwiązywane? Szanse są spore, że tak. Tym sposobem niewielkim nakładem (powiedzmy 20% wysiłku) możesz otrzymać gotowe rozwiązanie pokrywające lwią część (80%) Twoich potrzeb.
Przykłady gotowych rozwiązań (Twoje 80%)
Istnieje wiele typowych rozwiązań - od bibliotek po wzorce projektowe - które możesz wykorzystać zamiast pisać własne od podstaw. Oto kilka przykładów, gdzie zdecydowanie warto postawić na istniejące "koła" zamiast tworzyć je samemu:
• Standardowa biblioteka .NET i wbudowane funkcje - .NET oferuje ogrom możliwości od ręki. Potrzebujesz sparsować datę lub sformatować tekst? Skorzystaj z klas DateTime czy String i ich gotowych metod. Operacje na kolekcjach? Wykorzystaj generics (List<T>, Dictionary<TKey,TValue>) oraz bogate możliwości LINQ zamiast pisać własne algorytmy sortowania czy filtrowania. Szansa jest duża, że wszystko, co podstawowe, już tam jest.
• Popularne biblioteki i pakiety NuGet - Na niemal każde typowe zadanie znajdzie się biblioteka. Przykłady: obsługa formatu JSON (pakiet Newtonsoft.Json lub wbudowany System.Text.Json), logowanie (np. Serilog, NLog), komunikacja HTTP (wbudowany HttpClient lub dedykowane biblioteki REST), dostęp do bazy danych (ORM-y jak Entity Framework Core czy Dapper). Zamiast wyważać otwarte drzwi, możesz w kilka minut zainstalować gotowy pakiet i skupić się na logice biznesowej.
/* Zamiast pisać własny parser JSON, użyj gotowej biblioteki: */
var person = JsonSerializer.Deserialize<Person>(jsonString);• Frameworki i platformy - Framework to zestaw gotowych komponentów i konwencji, który przyspiesza tworzenie aplikacji. Właśnie w myśl zasady "nie wymyślaj koła od nowa" powstały np. ASP.NET (do budowy aplikacji webowych w C#), który zapewnia całą infrastrukturę aplikacji web (architekturę MVC, routing, uwierzytelnianie użytkowników, dostęp do bazy itp.). Podobnie Angular/React dla frontendu czy Unity dla gier - wszystkie one dostarczają mnóstwo narzędzi rozwiązujących powtarzalne problemy (jak logowanie, obsługa konta, renderowanie grafiki), pozwalając Ci skupić się na tym, co unikalne w Twojej aplikacji.
• Wzorce projektowe - Wyzwania projektowe to nie tylko biblioteki, ale też odpowiednia struktura kodu. Tutaj z pomocą przychodzą wzorce projektowe (design patterns). Masz mnóstwo obiektów do tworzenia w różnych konfiguracjach? Zastosuj wzorzec Fabryka (Factory) zamiast duplikować kod tworzenia obiektów. Chcesz rozdzielić logikę biznesową od interfejsu użytkownika? Wykorzystaj architekturę MVC lub MVVM, zamiast wymyślać własne ramy od zera. Wzorców jest wiele (Singleton, Observer, Strategy, Repository i inne) i warto je znać - stanowią one sprawdzone, archetypowe sposoby rozwiązywania typowych problemów projektowych.
Kiedy tworzyć własne rozwiązanie?
Czy zawsze należy unikać pisania własnych implementacji? Niekoniecznie. Są sytuacje, gdy budowanie czegoś od podstaw ma sens. Jeśli Twoje wymagania są bardzo nietypowe lub żadne istniejące narzędzie ich nie spełnia, wówczas stworzenie własnego rozwiązania może być uzasadnione. Czasami też dla własnej nauki warto spróbować napisać coś samemu, by zrozumieć jak to działa "od kuchni".
Jednak nawet wtedy pamiętaj, by ocenić, czy koszt czasowy i wysiłek utrzymania takiego ręcznego rozwiązania nie przewyższą korzyści. W praktyce profesjonalnej najlepiej kierować się zasadą: najpierw sprawdź istniejące opcje, a pisz samemu tylko, jeśli to naprawdę konieczne.
Podsumowanie
Większość problemów programistycznych, z którymi będziesz się mierzyć, ma już gotowe rozwiązania lub co najmniej ustalone dobre praktyki. Wykorzystując istniejące biblioteki, narzędzia, frameworki i wzorce projektowe oszczędzasz czas, unikasz wielu błędów i przyspieszasz swój rozwój jako programisty. Zamiast tracić energię na powtarzanie cudzej pracy, możesz skupić się na tworzeniu funkcjonalności, które naprawdę wyróżnią Twój projekt.
A jeśli chcesz poznać więcej takich praktycznych wskazówek i nauczyć się efektywnie tworzyć aplikacje w C#/.NET, rozważ dołączenie do mojego szkolenia online "Zostań Programistą .NET" (droga od zera do pracy jako młodszy programista C#/.NET w 3 miesiące). W kursie tym omawiam m.in. jak korzystać ze sprawdzonych rozwiązań i bibliotek, byś mógł szybciej i pewniej wkroczyć do branży IT. Powodzenia w programistycznej przygodzie.