Przedmowa
Opanowanie sztuki programowania wymaga poznania rozmaitych koncepcji. Dla początkującego lub nawet bardziej doświadczonego programisty to zadanie może się wydawać przeszkodą nie do pokonania. Czy poświęcić czas na naukę metod powszechnie stosowanych w świecie obiektowym, takich jak zasady SOLID, wzorce projektowe lub programowanie sterowane testami (TDD)? A może lepiej zainteresować się technologiami, które stają coraz bardziej popularne, takimi jak programowanie funkcjonalne?
Nawet, gdy wybierzesz metody, których chcesz się nauczyć, często trudno jest ustalić, jak je ze sobą łączyć. Kiedy warto zastosować w projekcie idee programowania funkcyjnego? Kiedy pora zająć się testami? Skąd wiadomo, w którym momencie wyprowadzić lub przedefiniować te techniki? Czy trzeba przeczytać książki poświęcone każdemu z tych zagadnień z osobna, a później zapoznać się z wieloma postami lub wideo, aby wiedzieć, jak połączyć je w całość? Od czego w ogóle zacząć?
Nie martw się, ta książka przychodzi z pomocą. Reprezentuje zintegrowane podejście do nauki poprzez realizację projektów. Przedstawia podstawowe zagadnienia, które trzeba znać, aby stać się wydajnym programistą. A w dodatku pokazuje, jak zintegrować omawiane techniki w większym projekcie.
Dlaczego napisaliśmy tę książkę
Mamy wieloletnie doświadczenie w edukowaniu programistów, jak pisać kod. Jesteśmy autorami książek poświęconych Javie 8 i nowszym wersjom. Prowadziliśmy kursy szkoleniowe w zakresie profesjonalnego tworzenia programowania. Po drodze zostaliśmy uhonorowani tytułem Java Champion oraz byliśmy zapraszani do przemawiania na międzynarodowych konferencjach.
Wieloletnie doświadczenie nauczyło nas, że wielu programistów może skorzystać z wprowadzenia lub odświeżenia wiedzy na różne kluczowe tematy. Wzorce projektowe, programowanie funkcyjne, zasady SOLID i testowanie to praktyki, które są często omawiane niezależnie od siebie, ale rzadko widzimy, jak ze sobą współpracują. Co więcej, szeroki wybór dostępnych technik może na niektórych działać paraliżująco i zniechęcać do nauki. Chcemy nie tylko pomóc czytelnikom w zdobyciu kluczowych umiejętności, lecz także sprawić, że proces ten będzie przystępny i przyjemny.
Z perspektywy programisty
Ta książka umożliwia uczenie się w sposób dostosowany do potrzeb programistów. Zawiera wiele przykładów i omawiając temat, zawsze dostarcza konkretne ilustrujące go fragmenty kodu. Udostępniliśmy pełny kod projektów omawianych w tej książce, dlatego możesz podążać za tekstem, a nawet krok po kroku wykonać kod w zintegrowanym środowisku deweloperskim (Integrated Development Environment, IDE) lub uruchomić programy w celu ich wypróbowania.
Częstą wadą podręczników technicznych jest ściśle naukowy i formalny styl. Zwykli ludzie nie komunikują się w taki sposób. Ta książka jest napisana luźnym stylem, bez protekcjonalnego tonu, dzięki czemu jest bardziej wciągająca.
Co zawiera ta książka?
Każdy rozdział jest oparty na projekcie programistycznym. Po uważnej lekturze rozdziału powinieneś umieć zaimplementować ten projekt. Poziom złożoności projektów rośnie, począwszy od prostych programów wsadowych po w pełni funkcjonalne aplikacje.
Ta bazująca na projekcie struktura przynosi różne korzyści. Po pierwsze, pozwala zobaczyć, w jaki sposób różne techniki programowania współpracują ze sobą w zintegrowanym środowisku. Gdy w końcowej części książki omawiamy programowanie funkcyjne, nie odwołujemy się do abstrakcyjnych operacji przetwarzania kolekcji, lecz do metod obliczania konkretnych wyników potrzebnych w omawianym projekcie. W ten sposób rozwiązujemy problem polegający na tym, że często po zapoznaniu się z materiałem edukacyjnym przedstawiającym dobry pomysł lub technikę programiści wykorzystują je w nieodpowiedni sposób lub w oderwaniu od kontekstu.
Po drugie, podejście oparte na projekcie zapewnia, że na każdym etapie są prezentowane realistyczne przykłady. W materiałach edukacyjnych często są stosowane przykładowe klasy Foo i metody bar. Nasze przykłady odnoszą się do konkretnych projektów i pokazują, jak wykorzystywać omawiane idee do rozwiązywania rzeczywistych problemów, jakie naprawdę można napotkać w pracy.
Ten sposób nauki jest przyjemniejszy i bardziej angażujący. Każdy rozdział jest nowym projektem i okazją do nauczenia się czegoś nowego. Chcemy, abyś przeczytał go do końca i z prawdziwą przyjemnością przewracał strony. Na początku rozdziału znajduje się opis wyzwania do rozwiązania, później omówienie kolejnych etapów implementacji rozwiązania, a na końcu podsumowanie, czego się nauczyłeś i w jaki sposób rozwiązane zostało wyzwanie. Każde wyzwanie opisujemy zarówno na początku, jak i na końcu rozdziału, aby zapewnić, że dobrze rozumiesz jego cele.
Do kogo kierowana jest ta książka?
Jesteśmy przekonani, że programiści wywodzący się z różnych środowisk znajdą w tej książce coś przydatnego i interesującego. Chociaż niektórzy skorzystają najbardziej.
Książkę napisaliśmy przede wszystkim z myślą o początkujących programistach, którzy niedawno ukończyli studia lub programują dopiero od kilku lat. Przedstawiliśmy podstawowe zagadnienia, których znajomość będzie pomocna w dalszej karierze. Aby móc skorzystać z tej książki, nie trzeba mieć wyższego wykształcenia, ale trzeba znać podstawy programowania. Nie będziemy tłumaczyć, do czego służy na przykład instrukcja if czy pętla.
Dobra znajomość zasad programowania obiektowego czy funkcyjnego nie jest wymagana. W rozdziale 2 przyjęliśmy jedynie założenie, że czytelnik wie, czym jest klasa, i potrafi używać kolekcji z typami ogólnymi (np. List<String>). Zaczynamy od samych podstaw.
Inną grupą programistów, których ta książka może szczególnie zainteresować, są osoby uczące się Javy i posiadające doświadczenie w programowaniu w innym języku, takim jak C#, C++ czy Python. Ta książka pomaga w szybkim zapoznaniu się ze składnią języka, a także zasadami, praktykami i idiomami, które odgrywają ważną rolę w pisaniu dobrego kodu Java.
Bardziej doświadczeni programiści Javy mogą pominąć rozdział 2, jeśli nie chcą czytać o podstawowych zagadnieniach, które są im już znane, ale rozdział 3 i kolejne są wypełnione koncepcjami i technikami, które przyniosą korzyści wielu programistom.
Odkryliśmy, że uczenie się może być jednym z najciekawszych aspektów programowania i mamy nadzieję, że Ty również się o tym przekonasz, czytając tę książkę. Życzymy przyjemnej lektury.
Konwencje zastosowane w książce
W tej książce zastosowaliśmy następujące konwencje typograficzne:
Kursywa
Wskazuje nowe terminy, adresy URL oraz adresy e-mail, nazwy i rozszerzenia plików.
Stała szerokość
Stosowana w listingach programów, jak również wewnątrz akapitów do odwoływania się do takich elementów programu, jak nazwy zmiennych lub funkcji, bazy danych, typy danych, zmienne środowiskowe, instrukcje oraz słowa kluczowe.
Stała szerokość, pogrubienie
Wskazuje polecenia lub inny tekst, który ma zostać wpisany przez użytkownika.
Stała szerokość, kursywa
Przedstawia tekst, który należy zastąpić wartościami podanymi przez użytkownika lub wynikającymi z kontekstu.
Taki element wskazuje uwagę ogólną.
Korzystanie z przykładów kodu
Materiały pomocnicze (przykłady kodu, ćwiczenia itd.) można pobrać ze strony https://github.com/Iteratr-Learning/Real-World-Software-Development.
Jeśli masz pytanie techniczne lub problem z korzystaniem z przykładów kodu, wyślij do nas e-mail na adres: bookquestions@oreilly.com.
Ta książka ma pomóc w realizowaniu zadań. Prezentowane w niej przykłady kodu zasadniczo można wykorzystywać we własnych programach i dokumentacji. Nie trzeba kontaktować się z nami w celu uzyskania zezwolenia, o ile nie kopiuje się znacznej części kodu. Na przykład pisanie programu wykorzystującego różne fragmenty kodu z książki nie wymaga zezwolenia. Sprzedaż i dystrybucja przykładów z książek O'Reilly wymaga zezwolenia. Odpowiadanie na pytanie przez zacytowanie tej książki i umieszczonego w niej przykładu kodu nie wymaga zezwolenia, jednak umieszczanie znaczącej części przykładowego kodu z tej książki w dokumentacji własnego produktu już tak.
Będziemy wdzięczni za podanie źródła, choć tego nie wymagamy. Odwołanie do źródła zazwyczaj zawiera tytuł, autora, wydawnictwo i numer ISBN. Na przykład: Real-World Software Development by Raoul-Gabriel Urma and Richard Warburton (O'Reilly). Copyright 2020 Functor Ltd. and Monotonic Ltd., 978-1-491-96717-1.
W razie wątpliwości, czy użycie przykładów kodu wykracza poza ogólnie przyjęte zasady lub określone powyżej zezwolenia, prosimy o kontakt pod adresem: permissions@oreilly.com.
O'Reilly Online Learning
O'Reilly Media od niemal 40 lat oferuje szkolenia techniczne i biznesowe i dostarcza wiedzę, która pomaga firmom w odnoszeniu sukcesu.
Oferujemy jedyną w swoim rodzaju sieć ekspertów i innowatorów, którzy dzielą się swoją wiedzą i doświadczeniem za pośrednictwem książek, artykułów, konferencji i naszej platformy e-learningowej. Platforma e-learningowa O'Reilly zapewnia kolekcję dostępnych na żądanie warsztatów na żywo, kompleksowych ścieżek szkoleniowych, interakcyjnych środowisk programistycznych, a także ogromny zbiór tekstów i wideo z archiwów firmy O'Reilly i ponad dwustu innych wydawców. Dodatkowe informacje można znaleźć na stronie: http://oreilly.com.
Jak się z nami skontaktować
Komentarze i pytania dotyczące tej książki prosimy kierować do wydawnictwa:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (w USA lub Kanadzie)
707-829-0515 (międzynarodowy lub lokalny)
707-829-0104 (fax)
Przygotowaliśmy stronę internetową dla tej książki, na której umieszczamy erratę, przykłady i dodatkowe informacje. Jest ona dostępna pod adresem: https://oreil.ly/RealWorld_SoftwareDev.
Aby przekazać swój komentarz lub zadać pytanie techniczne dotyczące tej książki, można wysłać e-mail na adres: bookquestions@oreilly.com.
Dodatkowe informacje dotyczące naszych książek, kursów, konferencji i aktualnych wydarzeń zawiera strona internetowa: http://www.oreilly.com.
Można nas znaleźć na Facebooku: http://facebook.com/oreilly
albo na Twitterze: http://twitter.com/oreillymedia.
Mamy również kanał YouTube: http://www.youtube.com/oreillymedia.
ROZDZIAŁ 1
Rozpoczynanie podróży
W tym rozdziale przedstawimy koncepcje i reguły przyjęte w książce. Ogólne podejście można byłoby podsumować w następujący sposób: Praktyki i zasady są ważniejsze niż technologie. Istnieje wiele książek poświęconych konkretnym technologiom i nie chcemy dokładać się do tej ogromnej kolekcji. To nie znaczy, że szczegółowa wiedza dotycząca konkretnego języka, frameworka lub biblioteki nie jest przydatna. A jedynie to, że ma krótszy termin przydatności niż ogólne praktyki i zasady, które można stosować przez dłuższy czas i w różnych językach oraz frameworkach. Na tym właśnie polega przydatność tej książki.
Tematy
Aby pomóc w nauce, strukturę tej książki oparliśmy na projektach. Na początek wyjaśniamy, jakie tematy będą poruszane w kolejnych rozdziałach, w jaki sposób są one ze sobą powiązane i dlaczego je wybraliśmy. Oto cztery różne tematy, które przeplatają się w tej książce.
Funkcje języka Java
Definiowanie struktury kodu za pomocą klas i interfejsów omówimy w rozdziale 2. W rozdziale 3 przechodzimy do wyjątków i pakietów. Przedstawimy również krótkie omówienie wyrażeń lambda. Następnie w rozdziale 5 wyjaśnimy wnioskowanie typu zmiennej lokalnej i wyrażenia switch. Na zakończenie w rozdziale 7 szczegółowo omówimy wyrażenia lambda i odwołania do metod. Funkcje języka Java są istotne, ponieważ tak wiele programów jest napisanych w Javie i dlatego warto dobrze poznać ten język. Wiele z tych funkcji językowych przydaje się również w innych językach programowania, takich jak C#, C++, Ruby czy Python. Mimo że te języki różnią się od siebie, wszystkie wymagają zrozumienia sposobu używania klas oraz podstawowych zasad programowania obiektowego.
Projekt i architektura oprogramowania
W tej książce omówimy wiele wzorców projektowych, które pomagają w rozwiązywaniu typowych problemów, jakie napotykają programiści. Warto je znać, ponieważ choć z pozoru każdy projekt programistyczny jest inny i stawia nowe wyzwania, tak naprawdę wiele z nich się powtarza. Zrozumienie typowych problemów i rozwiązań stosowanych przez innych programistów zapobiega ponownemu odkrywaniu Ameryki w nowych projektach programistycznych i pozwala na szybsze dostarczanie niezawodnych programów.
Wysokopoziomowe koncepcje, takie jak zależność i spójność, wprowadzimy już na początku książki w rozdziale 2. Wzorzec Powiadomienie wprowadzimy w rozdziale 3. W rozdziale 5 wyjaśnimy, jak projektować przyjazny dla użytkowników Fluent API oraz wprowadzimy wzorzec Budowniczy. Ogólne omówienie architektury sterowanej zdarzeniami i sześciokątną architekturę można znaleźć w rozdziale 6, natomiast wzorzec Repozytorium w rozdziale 7. Na zakończenie, w rozdziale 7, wprowadzimy programowanie funkcyjne.
Zasady SOLID
Poszczególne zasady SOLID są omówione w różnych rozdziałach. Ten zestaw zasad został zaprojektowany po to, aby ułatwić utrzymywanie oprogramowania. Choć pisanie kodu to dla wielu programistów ulubiona część pracy, to jeśli napisany program okaże się sukcesem, trzeba będzie go dostosowywać, rozwijać i utrzymywać. Gdy oprogramowanie jest proste w utrzymaniu, ułatwia wprowadzanie zmian i dodatkowych funkcji w przyszłości. Zasady SOLID zostały omówione w następujących rozdziałach:
zasada pojedynczej odpowiedzialności (SRP) - rozdział 2, zasada otwarte-zamknięte (OCP) - rozdział 3, zasada podstawienia Liskov (LSP) - rozdział 4, zasada segregacji interfejsów (ISP) - rozdział 5, zasada odwrócenia zależności (DIP) - rozdział 7.
Testowanie
Pisanie solidnego kodu, który można łatwo rozwijać, ma ogromne znaczenie. Testy automatyczne są kluczowe do osiągnięcia tego celu. Gdy napisane oprogramowanie jest skalowane, coraz trudniej jest własnoręcznie przetestować różne możliwe scenariusze. Trzeba zautomatyzować proces testowania, aby własnoręczne przeprowadzanie testów nie zabierało cennego czasu.
Podstawy pisania testów zostały omówione w rozdziałach 2 oraz 4. W rozdziale 5 rozszerzyliśmy to omówienie o programowanie sterowane testami (TDD). W rozdziale 6 opisaliśmy stosowanie test doubles, takich jak atrapy i stubs.
Podsumowanie rozdziałów
Oto zarys rozdziałów.
Rozdział 2. Analizator wyciągów bankowych
Napiszemy program do analizowania wyciągów bankowych, który będzie pomagał użytkownikom w lepszym zrozumieniu ich sytuacji finansowej. W ten sposób będzie można poznać podstawowe techniki projektowania obiektowego, takie jak zasada pojedynczej odpowiedzialności (SRP), spójność i zależność.
Rozdział 3. Rozszerzanie analizatora wyciągów bankowych
W tym rozdziale rozszerzymy kod z rozdziału 2, dodając funkcje z wykorzystaniem podstawowych wzorców projektowych, zasady otwarte-zamknięte i sposobów modelowania niepowodzeń przy użyciu wyjątków.
Rozdział 4. System zarządzania dokumentami
W tym rozdziale pomożemy renomowanej dentystce w lepszym zarządzaniu kartotekami pacjentów. Wprowadzimy takie koncepcje, jak dziedziczenie w projekcie oprogramowania, zasada podstawienia Liskov oraz wady i zalety kompozycji i dziedziczenia. Pokażemy również, jak pisać bardziej niezawodne programy przy użyciu testów automatycznych.
Rozdział 5. Silnik reguł biznesowych
Omówimy budowanie podstawowego silnika reguł biznesowych - sposobu definiowania logiki biznesowej, która jest elastyczna i łatwa w utrzymaniu. W tym rozdziale wprowadzimy takie tematy, jak programowanie sterowane testami, rozwijanie Fluent API oraz zasada segregacji interfejsów.
Rozdział 6. Twootr
Twootr to platforma komunikacyjna, która umożliwia użytkownikom przesyłanie krótkich wiadomości do innych, obserwujących ich użytkowników. W tym rozdziale zbudujemy trzon prostego systemu Twootr. Pokażemy, jak stosować podejście Outside-In - przechodząc od wymagań do trzonu aplikacji. Wyjaśnimy również, jak używać atrap do izolowania i testowania interakcji z różnymi komponentami w bazie kodu.
Rozdział 7. Rozszerzanie Twootra
W ostatnim rozdziale książki bazującym na projekcie rozszerzymy implementację Twootr napisaną w poprzednim rozdziale. Wyjaśnimy zasadę odwrócenia zależności i wprowadzimy szerszy obraz wyborów architektonicznych, takich jak architektura sterowana zdarzeniami i architektura sześciokątna. Ten rozdział może pomóc w rozszerzeniu wiedzy o testowaniu automatycznym. Zawarliśmy w nim omówienie test doubles, takich jak stubs i atrapy oraz funkcji programowania funkcyjnego.
Rozdział 8. Podsumowanie
W ostatnim, podsumowującym rozdziale przypomnimy najważniejsze tematy i idee omówione w książce, a także przedstawimy dodatkowe materiały, które mogą pomóc w rozwijaniu kariery programisty.
Utrwalenie wiedzy
Programiści często podchodzą do projektów w sposób iteracyjny. To znaczy wybierają najważniejsze zadania, których realizacja zajmie tydzień lub dwa, implementują je, a następnie wykorzystują zebrane opinie do zadecydowania, czym zająć się w następnej kolejności. Odkryliśmy, że ta strategia pomaga także w rozwijaniu umiejętności.
Na końcu każdego rozdziału umieściliśmy krótki podrozdział Utrwalenie wiedzy z kilkoma sugestiami, jak we własnym zakresie można rozszerzyć wiedzę zdobytą w rozdziale.
Skoro już wiesz, czego spodziewać się po tej książce, przystąpmy do pracy!