Kategorie
Uncategorized

Testowanie oprogramowania: Wprowadzenie dla osób bez doświadczenia

Cześć!

Testowanie oprogramowania wg. definicji to proces związany z wytwarzaniem oprogramowania. Testowanie ma na celu weryfikację i walidację oprogramowania. No dobra, ale co to oznacza? Każdy może przecież przeczytać regułkę z Wikipedii i nic nie zrozumieć w praktyce. Krótko mówiąc: to działania mające na celu przetestowanie, czy wszystko w aplikacji jest poprawne lub inaczej prawidłowe. Na przykład czy buttony są klikalne, czy wszystkie requesty przechodzą poprawnie itp. To proces, który od A do Z sprawdza wszystko, co się dzieje w aplikacji. Nierzadko możemy dzięki testom sprawdzić działanie kodu, ale też funkcjonalność oraz użytkowanie aplikacji.



Wszyscy jako użytkownicy mamy pewne wymagania odnośnie aplikacji: wszędzie mamy jakieś cele, specyfikacje czy jakieś punkty, które aplikacja ma spełnić. Właśnie po to potrzebny jest nam proces testowania. Co prawda są to dodatkowe koszty, ale zapewnia poprawność aplikacji i zaufanie do niej. Po prostu musi ona spełniać pewne kryteria jak np. szybkość, wydajność, bezpieczeństwo itp. Testowanie pomaga też w wykryciu błędów i sprawia, że nasza aplikacja staje się dla użytkownika bardziej atrakcyjna, przez co przychody twórców wzrastają.

Jakie istnieją rodzaje testów? W uproszczeniu możemy je podzielić na:
testy jednostkowe — czyli takie, które sprawdzają jakieś jednostki. Na przykład? Klasy, moduły, komponenty. Czyli coś, co jest jednostką w aplikacji, jakąś częścią składową.
testy integracyjne — sprawdzają komunikację pomiędzy komponentami i pozostałym elementami.
testy e2e (end to end) nazywane również systemowymi — to testy, które sprawdzają całą aplikację od początku do końca, symulując rzeczywiste reakcje osoby, która obsługuje aplikację. Uwzględnia się w nich wszystkie elementy systemu, również komponenty i klasy.
testy akceptacyjne — sprawdzają, czy aplikacja spełnia wymagania klienta (użytkownika końcowego)

Testy też dzielą się również na:
testy frontendowe — czyli testy, które sprawdzają widoczną część aplikacji dla użytkownika (np. poszczególne elementy html i css oraz sprawdzają komponenty)
testy backendowe (testy API) – czyli takie, które testują zapytania do bazy danych, endpointy i różne rzeczy związane z zapleczem (backendem) inaczej logiką aplikacji nie koniecznie widoczną bezpośrednio dla użytkownika.

Wiem.. na początku można się pogubić 😉, Ale bez obaw. Najpierw polecam nabyć podstawową wiedzę z zakresu testowania oprogramowania.

No dobrze.
Ale jak dokładnie się robi testy?
Testy można zarówno pisać, jak i wykonywać manualnie. W przypadku testowania manualnego potrzebny jest nam scenariusz. A w przypadku testowania za pomocą kodu to właśnie nasz kod jest takim scenariuszem, który się wykonuje. Możesz zostać testerem manualnym, jak i pisać takie testy.

Ale jak je pisać?
Jest mnóstwo narzędzi, które to ułatwią. Możesz skorzystać z:
Cypress.js –  to framework (biblioteka) do testowania zarówno frontendu, layoutu jak i API.
Selenium webdriver – do automatyzacji interfejsów
JUnit – do testowania jednostkowego w język Java
Postman – do testowania API.

Wybór właściwego frameworka do testowania to sztuka, ale na sam początek proponuję Playwright/Cypress lub Selenium. Są to przejrzyste, fajne frameworki, z którymi poradzicie sobie bez problemu na początku swojej przygody z testami oprogramowania. Testowanie nie jest takie straszne, ale wymaga dobrej znajomości aplikacji, nad którą pracujecie.

Kategorie
Uncategorized

Tworzenie interfejsów użytkownika: Wprowadzenie do UI/UX designu

Cześć!

Tworzenie interfejsów użytkownika (UI) oraz projektowanie doświadczenia użytkownika (UX) stanowią kluczowe aspekty tworzenia aplikacji internetowych, które odgrywają niezwykle ważną rolę. Dążymy przecież do tego, aby nasze aplikacje były przede wszystkim intuicyjne. Chcemy także, aby korzystanie z nich było dla użytkowników łatwe i przyjemne, a prezentowane treści oraz interakcje z aplikacją były satysfakcjonujące. Istnieje wiele znakomitych aplikacji, które, mimo swojej użyteczności, dysponują niedostatecznym UI. Więc czym właściwie są UX i UI, i jakie są między nimi różnice?

Czym są UX Design i UI Design?
UX, czyli User Experience, odnosi się do projektowania doświadczeń użytkownika, natomiast UI, czyli User Interface, skupia się na projektowaniu interfejsów. Choć te dwa obszary są ze sobą ściśle powiązane i wydają się podobne, to jednak nie są tożsame. UX koncentruje się na interakcjach użytkownika z aplikacją, podczas gdy UI zajmuje się interfejsami graficznymi. Tym samym, projekty stron, które widzisz, to nic innego jak efekt pracy nad UI 🙂

✔ Badanie Użytkowników jest istotnym elementem całego procesu. Należy dowiedzieć się, kim są użytkownicy i w jakim przedziale wiekowym się znajdują, jakie cele przyświecają ich wizytom na naszej stronie, czego oczekują, i jakie są ich preferencje… Zrozumienie odpowiedzi na te i wiele innych pytań jest kluczowe podczas projektowania strony.

✔ Projektowanie Informacji i Struktury obejmuje planowanie infrastruktury, treści i układu w interfejsie aplikacji. Informacje prezentowane na stronie powinny być dostosowane do potrzeb użytkowników, a jednocześnie prezentowane w sposób czytelny i dobrze zorganizowany. W tym celu warto zastosować profesjonalny copywriting, odpowiednie wylistowanie informacji oraz dobranie właściwej czcionki.

✔ Tworzenie Prototypów – Prototypowanie ma na celu stworzenie modelu graficznego lub interaktywnego naszej strony. W tym celu można wykorzystać technologie takie jak HTML i CSS, a także programy takie jak Figma czy AdobeXD. Dlaczego to ważne? Dzięki prototypowaniu możemy ocenić, czy nasza aplikacja spełnia wszystkie oczekiwania.

✔ Etap testowania obejmuje weryfikację funkcjonalności aplikacji oraz ogólne działanie platformy. Pozwala to zidentyfikować potencjalne problemy, takie jak niefortunne umiejscowienie przycisków, brak interakcji między elementami, czy zbyt mała czcionka dla osób ze słabszym wzrokiem.

✔ Wdrażanie i Dalsza Optymalizacja – Kiedy nasza aplikacja zostanie zaprojektowana, przetestowana i wdrożona, moglibyśmy uznać projekt za zakończony. Ale zaczekaj! Nawet mistrzowie malarstwa pracowali nad swoimi dziełami przez lata, więc również my powinniśmy w jakimś stopniu kontynuować prace nad naszym projektem… 🙂

Na tę chwilę to wystarczająco informacji na temat UX/UI. Mieliście okazję zapoznać się z podstawami procesu tworzenia UX. Obszar UX/UI obejmuje takie elementy jak ankiety, badania środowiskowe, testy interfejsów i wiele więcej. Znajdują się tu także elementy psychologii, co czyni ten temat znacznie bardziej rozbudowanym i fascynującym, niż mogłoby się wydawać…😉

Kategorie
Uncategorized

Jak pisać czytelny i efektywny kod: Dobre praktyki programistyczne

Cześć!

Dzisiaj chciałbym podzielić się z wami praktykami, które na pewno zaowocują w przyszłości, jeśli chodzi o wydajność i czytelność waszego kodu. To na pewno zaowocuje podczas rozmów rekrutacyjnych 😉, ale nie tylko. Wierzę, że jeżeli już się za coś trzeba brać, to trzeba zrobić to porządnie. Tak samo jest z programowaniem.

Oto kilka prostych technik:

1. Zachowaj czytelność: Używaj takich nazw zmiennych, stałych i nazw funkcji, aby od razu wiadomo było, co ten kod robi (im prościej, tym lepiej). Unikaj nazw zmiennych typu abc, i, dupa itd. Używaj wcięć gdzie to konieczne i pilnuj, by kod był ładnie sformatowany.

2. Dziel kod na mniejsze funkcje: To coś, o czym pisaliśmy w poprzednich artykułach. Funkcja to takie pudło, w którym przechowujesz fragmenty kodu tak, by były bardziej poukładane. Konkretne rzeczy, które ma wykonać kod zrób w funkcji, której nazwa to dokładnie opisuje.

3. Unikaj duplikacji kodu: jeżeli masz do zrobienia fragment kodu, który się powtarza, np. ciągle literuje się po jednej konkretnej pętli, dlaczego by nie zrobić tego w osobnej funkcji, do której będziesz się odwoływał/odwoływała?

4. Używaj właściwych struktur danych: Jeśli wiesz, że będziesz miał/miała konkretne operacje do zrobienia na konkretnych danych, warto przemyśleć, jakiego typu danych będziesz używać, czy nie lepiej będzie utworzyć do tego interfejsu lub klasy.

5. Testuj i debuguj regularnie: To bardzo ważny element każdego dobrze działającego kodu. Nawet jeśli teoretycznie wszystko powinno działać, warto skorzystać z debuggera lub testów.

6. Używaj bibliotek i frameworków: To nie tylko sposób na ułatwienie czytania kodu dla innych programistów, ale też sposób na ułatwienie sobie pracy za pomocą sprawdzonych narzędzi oraz często dobrze udokumentowanych.

Kategorie
Uncategorized

Najbardziej przyszłościowe języki programowania

Cześć!

Zastanawiałeś się kiedyś, jakiego języka programowania warto się nauczyć, mając na uwadze perspektywy przyszłościowe? Jak wybrać język programowania, który obecnie prezentuje największy potencjał na przyszłość?

Często zdarza się, że zaczynamy uczyć się języka programowania na chybił trafił, kierując się osobistymi upodobaniami, co nie zawsze jest najskuteczniejszą strategią. Z jednej strony powinniśmy wybrać język, który nas interesuje, a z drugiej — taki, który w przyszłości może okazać się jednym z najbardziej popularnych i poszukiwanych na rynku pracy.

Przedstawię Ci kilka propozycji, które mogą pomóc w podjęciu tej ważnej decyzji:

  1. Python: Python to obecnie jeden z najbardziej popularnych języków programowania na świecie. Charakteryzuje się prostą i czytelną składnią, co ułatwia naukę, szczególnie dla początkujących. Jest znany z zastosowania w dziedzinie sztucznej inteligencji i matematyki, ale świetnie sprawdza się również w tworzeniu stron internetowych i backendu.
  2. JavaScript: JavaScript jest niezbędny w tworzeniu interaktywnych stron i aplikacji internetowych. Jego bardziej zorientowaną na typowanie wersją jest TypeScript, który także zyskuje na popularności. JavaScript oferuje prostotę i wszechstronność, a także możliwość tworzenia backendu za pomocą Node.js.
  3. Java: Java to jeden z najbardziej rozpoznawalnych języków do tworzenia backendu, szczególnie w kontekście aplikacji internetowych. Mimo swoich korzeni sięgających lat 90., wciąż pozostaje na czołowych pozycjach w rankingu popularności.
  4. PHP: PHP to bardzo dobre narzędzie do obsługi stron internetowych. Język ten również powstał w latach 90., ale nadal zyskuje na popularności, szczególnie dzięki możliwościom w zakresie sztucznej inteligencji.
  5. SQL: SQL to język bazodanowy, niezbędny do efektywnego zarządzania danymi. Jego znajomość będzie przydatna niezależnie od tego, czy zainteresują Cię technologie front-endowe, czy back-endowe.
  6. C#: C# to młodszy krewny C++, który zyskał popularność dzięki swoim możliwościom w obsłudze technologii .NET. Jeśli planujesz pracować w środowiskach Microsoft, C# będzie świetnym wyborem.

Warto zaznaczyć, że w wyborze języka programowania liczy się elastyczność, Twoje zainteresowania oraz predyspozycje. Nauka jednego języka to jedno, ale trendy na rynku pracy będą się zmieniać, więc ważna jest zdolność do szybkiego przyswajania nowych języków i technologii. Zastanów się, w jakich technologiach chcesz pracować, czy interesują Cię bazy danych, a może backend? Twoje osobiste zainteresowania oraz cele zawodowe powinny przeważyć przy wyborze języka programowania, który będziesz chciał opanować. 🧑‍💻

Kategorie
Uncategorized

Zasady w programowaniu obiektowym (na przykładzie Pythona)


Cześć!

Programowanie obiektowe (OOP z ang. Object Oriented Programming) to koncepcja, która ściśle oddziałuje z rzeczywistością, umożliwiając tworzenie skomplikowanych programów w bardziej zorganizowany i zrozumiały sposób. Python, z języków programowania o wysokim poziomie abstrakcji, z łatwością wplata idee programowania obiektowego w swoją strukturę. W tym artykule zanurzymy się w głębiny podstawowych zasad OOP w kontekście Pythona, które są niezwykle ważne dla każdego aspirującego lub doświadczonego programisty.

Zasada 1: Abstrakcja to proces ukrywania szczegółów złożoności, pozwalając programistom skupić się na interakcjach na wyższym poziomie. W Pythonie abstrakcja może być zaimplementowana za pomocą klas abstrakcyjnych i metod abstrakcyjnych.

Przykład:

from abc import ABC, abstractmethod

class Samochod(ABC):
    @abstractmethod
    def jazda(self):
        pass

class Mercedes(Samochod):
    def jazda(self):
        print("Jadę Mercedesem!")

moj_mercedes = Mercedes()
moj_mercedes.jazda()  # Output: Jadę Mercedesem!

Zasada 2: Hermetyzacja (Enkapsulacja) – znana również jako enkapsulacja, polega na ukrywaniu wewnętrznych danych obiektu i wymuszaniu interakcji z obiektem tylko za pośrednictwem metod. Pomaga to utrzymać integralność danych.

class KontoBankowe:
    def __init__(self):
        self.__bilans = 0  # atrybut prywatny
    
    def wpłata(self, kwota):
        self.__bilans += kwota
        return self.__bilans

konto = KontoBankowe()
print(konto.wpłata(500))  # Output: 500

Zasada 3: Dziedziczenie – umożliwia tworzenie nowych klas na podstawie istniejących klas, co ułatwia ponowne użycie oraz wspomaga organizację kodu.

class Zwierze:
    def mów(self):
        pass

class Pies(Zwierze):
    def mów(self):
        print("Hau, hau!")

azorek = Pies()
azorek.mów()  # Output: Hau, hau!

Zasada 4: Polimorfizm – pozwala obiektom różnych klas na bycie traktowanym jako obiekty wspólnej klasy, co prowadzi do prostszej implementacji i niższego sprzężenia kodu.

class Kot(Zwierze):
    def mów(self):
        print("Miau, miau!")

def opisz_zwierzę(zwierze):
    zwierze.mów()

opisz_zwierzę(azorek)  # Output: Hau, hau!
opisz_zwierzę(Kot())  # Output: Miau, miau!

Zrozumienie i zastosowanie zasad programowania obiektowego w Pythonie otwiera drzwi do pisania czystego, modularyzowanego i łatwo utrzymywalnego kodu. Nauczenie się tej koncepcji jest jak budowanie mostu między prostymi skryptami a pełnoprawnymi aplikacjami, które skutecznie odwzorowują złożoność rzeczywistości.

Kategorie
Uncategorized

Tworzenie aplikacji mobilnych: Wprowadzenie do Android i iOS developmentu


Cześć!

Rozwój aplikacji mobilnych stanowi niesamowitą przyjemność, ale także poważne zadanie. Aplikacje mobilne otaczają nas na każdym kroku, stanowiąc nieodłączny element naszych smartfonów. Nawiasem mówiąc, nawet podstawowa funkcja telefonu, jaką jest dzwonienie, została przekształcona w aplikację. Nie wspominając o wysyłaniu wiadomości tekstowych czy korzystaniu z komunikatorów — wszystko to realizowane jest poprzez różnorodne aplikacje. Ale jak zabrać się za ich tworzenie? Zajmiemy się tym zagadnieniem w dzisiejszym wpisie.


Rozwój Aplikacji na Androida

Android, będący systemem operacyjnym dla smartfonów stworzonym przez Google, zdominował rynek mobilny od czasu zaniku systemu Symbian, używanego mniej więcej 12 lat temu. Od tego momentu, Android nieprzerwanie prowadzi na arenie mobilnej, a nie wydaje się, aby miało to ulec zmianie w najbliższym czasie.

Tworzenie aplikacji na Androida najczęściej odbywa się przy użyciu języków Java lub Kotlin, z tym że Kotlin cieszy się większą popularnością ze względu na swoją nowoczesność, wygodę użytkowania oraz funkcjonalność.

Kluczowym elementem procesu programowania jest wybór odpowiedniego środowiska deweloperskiego. Tutaj na ratunek przychodzi Android Studio, dedykowane narzędzie ułatwiające programowanie aplikacji mobilnych. W znacznym stopniu opiera się na IDE (Środowisko Deweloperskie zintegrowane) dla Javy, oferując szereg potężnych narzędzi, na przykład do debugowania kodu.

Android SDK (Software Development Kit) stanowi kolejne istotne narzędzie, umożliwiając testowanie API aplikacji oraz wysyłanych przez nią zapytań. SDK zawiera także różnorodne biblioteki, co czyni go nieocenionym wsparciem dla programistów.

Nie można także pominąć kwestii projektowania interfejsów użytkownika, które również realizowane są w Android Studio, za pomocą języka XML.

Rozwój Aplikacji na iOS

Kto z nas nie słyszał o iOS, systemie operacyjnym zaprojektowanym na iPady, iPhone’y i iPody Touch? Rozwój aplikacji na platformę iOS najczęściej odbywa się przy użyciu języków Swift lub Objective-C, z wykorzystaniem narzędzi takich jak Xcode.

Swift, stworzony przez firmę Apple, jest zdecydowanie preferowany, dzięki swojej zgodności i doskonałej integracji z platformą iOS, wspieranej przez bogaty zestaw bibliotek i narzędzi debugowania.

Środowisko deweloperskie Xcode to kompletne narzędzie, umożliwiające testowanie, debugowanie oraz podgląd tworzonych aplikacji, wspierające zarówno język Swift, jak i Objective-C.

Podobnie jak w przypadku Androida, iOS SDK (Software Development Kit) zawiera kompletną dokumentację, narzędzia oraz biblioteki, które są niezbędne podczas procesu deweloperskiego, ułatwiając pracę nad API oraz innymi aspektami aplikacji.

Tworzenie aplikacji mobilnych może być wyzwaniem, ale jest także wyjątkowo satysfakcjonujące i opłacalne. Sektor ten oferuje ogromne możliwości, szczególnie dla programistów Androida, chociaż nie można zapominać, że rozwój i testowanie aplikacji mobilnych często bywa niedoceniane w branży IT. Znalezienie swojej niszy w tej dynamicznie rozwijającej się dziedzinie może okazać się doskonałą inwestycją w przyszłość. 😉

Kategorie
Uncategorized

Bezpieczeństwo aplikacji webowych: Najważniejsze aspekty i techniki

Cześć!

Chyba nie trzeba wspominać, jak ważne jest bezpieczeństwo użytkowników w internecie. Takie dane poufne jak imię i nazwisko razem z naszymi numerami kart kredytowych czy hasłami do banków jeśli wpadną w niepowołane ręce, mogą spowodować wiele problemów czy też nieprzyjemności. Ale jak i z czym to się je ’cyber security’?


Przyjrzyjmy się najważniejszym aspektom w bezpieczeństwie aplikacji:

  1. Autentykacja i zarządzanie tożsamością
    Autentykacja użytkowników może opierać się na wielu elementach, które będą niezbędne w uwierzytelnianiu: logowanie za pomocą haseł złożonych, logowanie za pomocą tokenów, dwuetapowa autentyfikacja — to wszystko ma nam pozwolić na to, żebyśmy bezpiecznie mogli zalogować się na swoje konta w bankach czy socjalach.
  2. Ochrona przed atakami XSS
    Ataki XSS to takie ataki, w których złośliwy kod js jest wstrzykiwany na stronie, przez co może wywołać wiele szkód. Ważnym elementem takiego zapobiegania tej podatności jest, aby strona, która przeglądamy, korzystała z CSP, czyli Content Security Policy i dobrze filtrowała dane wejściowe i wyjściowe.
  3. CSRF — ataki i jak się przed nimi bronić
    Te ataki polegają na tym, że za pomocą konta użytkownika w jego imieniu publikujemy za jego „zgodą” niechciane treści. Takimi atakami są na przykład włamywanie się na skrzynkę na Facebooku i wysyłanie automatycznych wiadomości do znajomych z prośbą o blika (płatność) 😉 
  4. Bezpieczeństwo bazy danych
    To jest to, co najbardziej kojarzy nam się z zabezpieczaniem danych, czyli zabezpieczenie danych, które są w naszych bazach. Ileż to się słyszy o wycieku danych klientów znanych korporacji… To właśnie na skutek nieodpowiedniej ochrony właśnie takich danych. 
  5. Aktualizacje i łatki (patche)
    Dobrym aspektem zabezpieczenia się przed niechcianymi atakami jest po prostu…aktualizacja wersji oprogramowania na stronach czy w aplikacjach. Jest to bardzo ważne, poniewaz kiedy korzystamy z jakiegoś oprogramowania, ono wciąż jest uaktualniane o nowe funkcjonalności pod względem bezpieczeństwa np. w przypadku, gdy pojawią się coraz to nowsze sposoby na kradzież danych.
  6. Audyt bezpieczeństwa
    Ważne jest regularne przeprowadzanie audytu bezpieczeństwa aplikacji tak samo jak jej testowanie czy też samo projektowanie aplikacji.

    Czasami gdy czytamy o sposobach, na jakie można pozyskać nasze dane czy jakie sposoby mają hakerzy, może nas rozboleć głowa… Ale spokojnie! ’Cyber Security’ to branża, która rozwija się bardzo intensywnie, a my sami musimy być po prostu ostrożni w internecie 🙂
Kategorie
Uncategorized

Działania na pętli 'for’ – przykłady w JavaScript


Pętle w dowolnym języku programowania to rzecz, bez której ani rusz. Można powiedzieć, że programista bez pętli jest jak żołnierz bez karabinu… albo uczeń bez jedynki.

W dzisiejszym poradniku chcielibyśmy pokazać wam podstawy działań na pętli. Ale nie będą to przykłady typu:  

for (let i = 0; i < 5; i++) {
  console.log(i);
}

…Nauka programowania jest trochę jak nauka matematyki: widzi i rozwiązuje się przy tablicy proste przykłady, a potem nagle dostajemy od życia na głowę jakieś skomplikowane działania, przez które nie możemy przebrnąć.

Przejdźmy więc do pierwszego przykładu:

const obj = { miasto: 'Poznań', city: 'Województwo wielkopolskie' };
for (let key in obj) {
  console.log(key + ': ' + obj[key]);
}

Mamy tu zwykłą pętlę for. Iteruje się ona po każdym z elementów wypisując tylko console. log. Nic nam nie zwraca.

A jakbyśmy ją trochę „upiększyli”? Co może nam w ogóle robić taka pętla, do czego może nam służyć?
Np. do tego:

const wojewodztwa = [
'Województwo dolnośląskie',
    'Województwo kujawsko-pomorskie',
    'Województwo lubelskie',
    'Województwo lubuskie',
    'Województwo łódzkie',
    'Województwo małopolskie',
    'Województwo mazowieckie',
    'Województwo opolskie',
    'Województwo podkarpackie',
    'Województwo podlaskie',
    'Województwo pomorskie',
    'Województwo śląskie',
    'Województwo świętokrzyskie',
    'Województwo warmińsko-mazurskie',
    'Województwo wielkopolskie',
    'Województwo zachodniopomorskie'
];
miasta = [
    {miasto: 'Bydgoszcz', wojewodztwo: 'Województwo kujawsko-pomorskie'},
    {miasto: 'Poznań', wojewodztwo: 'Województwo wielkopolskie'},
    {miasto: 'Warszawa', wojewodztwo: 'Województwo mazowieckie'}
];

function stworzSpisMiastWWojewodztwach() {
const spis = []
    for (let wojewodztwo of wojewodztwa) {
      const object = {
        wojewodztwo: wojewodztwo,
        miasta: []
      }
      for (let miasto of miasta) {
        if (miasto.wojewodztwo === wojewodztwo) {
          console.log('pasuje', miasto.miasto)
          object.miasta.push(miasto)
        }
      }
      spis.push(object)
    }
    console.log('spis', spis)
}

Ok, a tak właściwie co tu się dzieje? Krótko mówiąc, mamy tu pętlę w pętli. Najpierw patrzymy po kolei na wszystkie województwa i każdemu z nich się przyglądamy, a potem na warsztat bierzemy po kolei każde miasto w odniesieniu do województwa. Czy dane miasto leży w danym województwie? Jeśli tak — wepchniemy to miasto do specjalnego obiektu, który reprezentuje nam w spisie jedno województwo. Tak jak widzicie, mamy w tym obiekcie napisaną nazwę województwa i tablicę ze wszystkimi miastami.
Na koniec wszystkie takie województwa wypychamy, do jednej tablicy otrzymując pełny, ładny spis.
Uf.
Nie musicie tego ogarniać już teraz. Ale zauważcie, że w przypadku pętli for mamy jedno znaczące słówko, bez którego by się to nie odbyło:


Dokładnie. of pomaga nam się literować po konkretnej treści tego obiektu, a nie indeksie. Gdybyśmy napisali coś takiego:

 for (let wojewodztwo in wojewodztwa) {
      console.log(wojewodztwo);
    }

Otrzymalibyśmy wypisanie w konsoli numerów od 0 do 15, czyli wypisałoby nam indeksy poszczególnych elementów w tablicy.

A jeśli wypiszemy taki kod, jak jest powyżej otrzymamy wynik:


To, co właśnie zrobiliśmy, to pętla zagnieżdżona 🙂

Kategorie
Uncategorized

Rozwiązywanie problemów programistycznych: Strategie i podejście

Cześć!

Zajmiemy się dzisiaj rozwiązywaniem problemów, czyli odwieczną bolączką programistów. Nie jest tajemnicą, że ponad 50% pracy programisty to rozwiązywanie problemów 😉 Zwłaszcza takich, które stworzył ktoś inny, ale zdarza się też, że debugujemy własny kod… Niestety, rozwiązywanie problemów programistycznych to odwieczny problem. Na szczęście, istnieje wiele technik, dzięki którym ułatwisz sobie pracę nad dowolnym problemem 🙂


1. Rozbicie problemu na pierwsze części
Często zadania, jakie przed Tobą stoją, mogą być trudne do rozwiązania jako całość. Najlepiej przyjrzeć się wtedy problemowi i popatrzeć na niego jak na jednostkę -> rozbić na części pierwsze. Możesz zidentyfikować kluczowe kroki, funkcje lub moduły, aby ogarnąć, gdzie leży problem.

2. Debugowanie za pomocą kaczuszki
Sposób stary jak IT: wytłumaczenie komuś, co właściwie dzieje się z kodem, jak on działa i co próbujemy zrobić. Inna zasada takiego debugowania jest określenie 3 kroków:
a) co próbujemy zdziałać?
b) co dokładnie nie działa, w czym jest problem?
c) jakie są możliwe rozwiązania tego problemu?

Dzięki temu łatwiej nam będzie zrozumieć, co dokładnie ma robić ten kod.

3. Rozbicie kodu na części „po kolei”
Czyli zakomentowanie całego kodu i odkomentowanie po kawałeczku, by sprawdzić, w którym fragmencie kodu problem występuje. Nauczyłem się tego sposobu w swojej pierwszej pracy jako programista. To dość słuszna metoda pozwalająca nam określić, w którym kawałku kodu coś ewidentnie „nie zatrybiło” 😉

4. Kreatywne myślenie i eksperymentowanie
Gdy mamy przed sobą jakiś problem, często jesteśmy 'zafiksowani’ na punkcie jednego rozwiązania, które ewidentnie nie działa. Może warto spróbować podejść problem od innej strony, może nie to o czym myślimy jest problemem? Wbrew pozorom programowanie to bardzo kreatywna dziedzina 😉

5. Optymalizacja i planowanie
Ta część bardziej odnosi się do tego, jak zapobiegać takim problemom. Ważne jest to, by nie iść na żywioł i zaplanować dokładnie, jak ten kod ma wyglądać. Ważna jest też optymalizacja kodu pod względem jego czystości: Odpowiednio napisany kod, który jest czytelny i przejrzysty, zapobiega takim błędom.

Ważne jest nie tylko samo rozwiązywanie problemów, ale debugowanie i zapobieganie im, o czym pisałem w jednym z poprzednich artykułów. Debugowanie kodu może być trudne, ale ’problem solving’ zaowocuje nie tylko w postaci bycia dobrym programistą, ale i byciem osobą, która na co dzień nie ma problemu z decyzyjnością i rozwiązywaniem problemów dnia codziennego 🙂

Kategorie
Uncategorized

Bazy danych i SQL: Podstawy zarządzania danymi

Cześć!

Dzisiaj zrobimy sobie krótkie wprowadzenie do bazy danych i języka SQL, bowiem często bywa tak, że bez nich ani rusz 🙂 Więc czym są te tajemnicze bazy danych i w ogóle to wszystko, co się z tym wiąże?

Bazy danych to inaczej środowiska, w których dane są przechowywane. Najczęściej pod postacią tabel lub list. Bazy służą też do zarządzania tymi danymi, zmieniania ich, więc nie tylko do przechowywania. Ale jak się organizować z tymi danymi? I tu przychodzi nam z pomocą język SQL.
SQL (Structured Query Language) to prosty język zapytań do bazy danych, którym możemy dowolnie manipulować danymi. Jest używany do komunikacji z bazami danych. Ale zanim przejdziemy do podstaw SQL, przyjrzyjmy się podstawowym pojęciom związanym z bazami danych.

1. Baza danych
Wg. Definicji Baza danych to zbiór powiązanych informacji przechowywanych w uporządkowany sposób. Może zawierać tabele, relacje, indeksy i inne struktury danych. Mogą być one zorganizowane na różne sposoby, na przykład hierarchicznie lub listowo. 

2. Tabela

Tabela to struktura danych, która przechowuje dane za pomocą kolumn i wierszy. Tabela zawiera kolumny, które definiują, jakie dane znajdują się w tabelce i jakiego typu, a wiersze — rekordy tabeli, czyli dane, które ona przechowuje. 


3. Klucz główny

Klucz główny, inaczej: primary key to osobny identyfikator dla każdego rekordu. Po tym właśnie indeksujemy i rozpoznajemy rekordy. Zazwyczaj takim primary key jest id, ale możemy go zdefiniować inaczej, w zależności od potrzeb. 


4. Relacje

To związki między tabelkami w bazie danych, inaczej relacje między nimi. Często jest tak, że tabele są ze sobą powiązane konkretnymi rekordami, i konkretnymi kluczami. Mamy primary key, który definiuje rekord w wybranej, basickowej tabeli, ale mamy również klucz obcy odwołujący się do innej tabeli. W ten sposób mamy cały schemat wszystkich tabel gotowy w bazie.


5. Zapytania SQL

Zapytania SQL to komendy, którymi wysyłamy konkretne polecenia do bazy danych, aby na przykład: pokazała nam wszystkie rekordy z danej tablicy, aby nam usunęła, dodała rekordy, aby zmieniła poszczególne komórki gdzie np. id=1 lub wartości boolean dla jakiejś kolumny wynoszą w rekordach true… i tak dalej. Podstawowe komendy to SELECT, INSERT, UPDATE I DELETE.  Często piszemy komendy dużymi literami dla czytelności.

Na razie tyle wam wystarczy, abyście mieli podstawowe pojęcie, czym są bazy danych. A ta wiedza jest niezbędna nawet dla frontendowca 🙂

Jeżeli chcesz dobrze opanować SQL zapraszam do kursu: https://www.udemy.com/course/jezyk-sql-w-praktyce/?referralCode=8EC14158D9085568DAA8