Java 10 dni – Lekcja 4, Jak wykonywany jest kod naszej aplikacji? 🚂🚊🚅🚝
- Lekcja 4, Jak wykonywany jest kod naszej aplikacji? 🚂🚊🚅🚝
- Pełny materiał dostępny na:
https://www.youtube.com/watch?v=aAEJn3QcgQU
https://www.youtube.com/watch?v=aAEJn3QcgQU
https://www.youtube.com/watch?v=RnKYjTdcIaw
Odwrotna Notacja Polska (ONP) – Jest to sposób zapisu wyrażeń matematycznych, który między innymi eliminuje potrzebę nawiasów do określania kolejności operacji, co sprawia, że jest idealny do użycia w programowaniu i analizie danych. Ta metoda, choć może wydawać się nieintuicyjna na pierwszy rzut oka, oferuje szereg zalet w obliczeniach i implementacji algorytmów.
Z tego materiału dowiesz się:
Odwrotna Notacja Polska (ONP), znana także jako notacja postfiksowa, została wprowadzona przez australijskiego naukowca Charlesa Leonarda Hamblina w latach 50. XX wieku. Metoda ta jest odmianą notacji polskiej, wynalezionej przez polskiego logika Jana Łukasiewicza w 1924 roku, która używa formatu prefiksowego, gdzie operator jest umieszczany przed operandami (np. + 3 4). W przeciwieństwie do tego ONP umieszcza operator po operandach (np. 3 4 +).
Aby obliczyć wyrażenie zapisane w notacji postfiksowej, wykonujesz kroki w kolejności, używając stosu:

➡ ZOBACZ 👉: Stos (Stack)
Aby rozwiązać wyrażenie w Odwrotnej Notacji Polskiej (ONP) 2 3 * 4 5 * +, postępujemy zgodnie z regułami obliczania, używając stosu do przechowywania tymczasowych wyników. Oto kroki:
Na stosie pozostaje jedna liczba, 26, która jest wynikiem końcowym wyrażenia 2 3 * 4 5 * +.
To samo działanie zapisane w zwyczajnej notacji, jaką znamy ze szkoły (infiksowej) wygląda następująco: (2*3) + (4*5).
Oto kilka przykładów zapisu wyrażeń.
Dodawanie i odejmowanie
notacja infiksowa: 3 + 4 − 53 + 4 − 5
⇒🇵🇱 notacja postfiksowa: 3 4 − 53 + 4 − 5 +
Mnożenie i dzielenie
notacja infiksowa: 3 * 7 * 2 / 3
⇒🇵🇱 notacja postfiksowa: 3 7 * 2 * 3 /
Wyrażenie złożone
notacja infiksowa: (3 + 4) * 5(3 + 4) * 5 / 5 – 25
⇒🇵🇱 notacja postfiksowa: 3 4 + 5 * 3 4 + * 5 * 5 / 25 –
Odwrotna Notacja Polska (ONP), choć wydaje się być abstrakcyjnym pojęciem matematycznym, znajduje szerokie zastosowanie w praktyce i w biznesie, przede wszystkim dzięki swojej efektywności i prostocie implementacji w systemach komputerowych.
Wiele kalkulatorów naukowych wykorzystuje ONP, ponieważ pozwala to na szybsze przetwarzanie skomplikowanych wyrażeń matematycznych bez błędów wynikających z niewłaściwego użycia nawiasów. Przykładem może być popularny kalkulator HP-12C, używany przez inżynierów i finansistów.

ONP jest także cennym narzędziem dydaktycznym w nauczaniu algorytmiki i struktur danych, szczególnie w kontekście stosów i kolejek, które są fundamentem dla notacji postfiksowej.
Implementacja Odwrotnej Notacji Polskiej (ONP) w Javie wymaga użycia stosu do przechowywania operandów i efektywnego przetwarzania operatorów. Poniżej znajdziesz przykładowy kod, który przetwarza wyrażenie w notacji postfiksowej i oblicza jego wynik. Przykład koncentruje się na podstawowych operacjach arytmetycznych: dodawaniu, odejmowaniu, mnożeniu i dzieleniu.
class ReversePolishNotation {
public static int evaluatePostfix(String expression) {
Stack<Integer> stack = new Stack<>();
// Przetwarzanie każdego elementu w ciągu wejściowym rozdzielonego spacjami
String[] tokens = expression.split(" ");
for (String token : tokens) {
// Jeśli element jest liczbą, zapisz go na stosie
if (token.matches("\\d+")) { // Regex do sprawdzania, czy token jest liczbą
stack.push(Integer.parseInt(token));
} else { // Token jest operatorem
// Operator wymaga pobrania dwóch ostatnich liczb ze stosu
int num2 = stack.pop();
int num1 = stack.pop();
switch(token.charAt(0)) { // Zakładamy, że operator to pojedynczy znak
case '+':
stack.push(num1 + num2);
break;
case '-':
stack.push(num1 - num2);
break;
case '*':
stack.push(num1 * num2);
break;
case '/':
if (num2 != 0)
stack.push(num1 / num2);
else
throw new UnsupportedOperationException("Division by zero.");
break;
}
}
}
return stack.pop(); // Wynik końcowy znajduje się na szczycie stosu
}
public static void main(String[] args) {
String expression = "2 3 * 4 5 * +"; // operandy należy odzielić od siebie spacją aby były poprawnie odczytane przez program
int result = evaluatePostfix(expression);
System.out.println("The result of the expression is: " + result);
}
}
Stos jest idealny do tego zadania, ponieważ pozwala łatwo dodać i usunąć elementy w odpowiedniej kolejności. Przechodzimy przez każdy znak w wyrażeniu. Jeżeli znak jest cyfrą, przekształcamy go z char na int (odejmując wartość ‘0’ od kodu znaku) i umieszczamy na stosie. Jeśli napotkamy operator, zdejmujemy dwie ostatnie liczby ze stosu, wykonujemy operację i wynik wrzucamy z powrotem na stos. Obsługiwane operacje to dodawanie (+), odejmowanie (-), mnożenie (*) i dzielenie (/). Dzielenie przez zero jest tu wyraźnie obsłużone jako wyjątek.
Konwerter z Notacji Infiksowej na Postfiksową
class InfixToPostfix {
// Metoda zwracająca priorytet operatora
private static int getPriority(char operator) {
if (operator == '+' || operator == '-') {
return 1;
}
if (operator == '*' || operator == '/') {
return 2;
}
return 0;
}
// Metoda konwertująca wyrażenie infiksowe na postfiksowe
public static String convertToPostfix(String infix) {
StringBuilder postfix = new StringBuilder();
Stack<Character> stack = new Stack<>();
boolean expectOperand = true; // Dodane do sprawdzania, czy oczekujemy na operand
for (int i = 0; i < infix.length(); i++) {
char c = infix.charAt(i);
if (Character.isDigit(c)) {
postfix.append(c);
if (i + 1 < infix.length() && Character.isDigit(infix.charAt(i + 1))) {
continue;
} else {
postfix.append(' ');
}
expectOperand = false; // Po dodaniu liczby oczekujemy operatora
} else if (c == '(') {
stack.push(c);
expectOperand = true; // Po '(' oczekujemy kolejnego operandu
} else if (c == ')') {
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop());
postfix.append(' ');
}
if (stack.isEmpty()) {
throw new IllegalArgumentException("Mismatched parentheses in the expression.");
}
stack.pop();
expectOperand = false; // Po ')' oczekujemy operatora
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
if (expectOperand) {
throw new IllegalArgumentException("Missing operand before operator " + c);
}
while (!stack.isEmpty() && getPriority(c) <= getPriority(stack.peek())) {
postfix.append(stack.pop());
postfix.append(' ');
}
stack.push(c);
expectOperand = true; // Po operatorze oczekujemy kolejnego operandu
}
}
while (!stack.isEmpty()) {
if (stack.peek() == '(') {
throw new IllegalArgumentException("Mismatched parentheses in the expression.");
}
postfix.append(stack.pop());
postfix.append(' ');
}
if (expectOperand && !postfix.toString().trim().isEmpty()) {
throw new IllegalArgumentException("Missing operand at the end of expression.");
}
return postfix.toString().trim();
}
}
Metoda pomocnicza getPriority() określa priorytet operatorów matematycznych, co jest kluczowe do zarządzania kolejnością operacji podczas konwersji. Każdy znak w wyrażeniu infiksowym jest przetwarzany w pętli. Cyfry są dodawane bezpośrednio do postfix. Aby obsłużyć liczby wielocyfrowe, kod sprawdza, czy następny znak to również cyfra, zanim doda spację.
Nawiasy Otwierające ‘(’: Są umieszczane na stosie, aby wskazać początek subwyrażenia. Nawiasy Zamykające ‘)’: Powodują opróżnienie stosu z operatorów aż do napotkania nawiasu otwierającego, który jest usuwany. Operatory: Jeśli operator ma niższy lub równy priorytet do operatora na wierzchu stosu, operatory są ściągane ze stosu do wyniku. Następnie bieżący operator jest umieszczany na stosie.
Po przejściu przez wszystkie znaki, wszystkie pozostałe operatory na stosie są ściągane do wynikowego wyrażenia postfiksowego. Sprawdzanie Nawiasów: Rzuca wyjątek IllegalArgumentException, gdy nawiasy są niezbalansowane (np. brakujący ‘(’ lub ‘)’). Sprawdzanie Oczekiwanych Operandów: Rzuca wyjątek, gdy przed operatorem nie ma odpowiedniego operandu lub gdy oczekiwano na operand na końcu wyrażenia.
Konwerter z Notacji Postfiksowej na Infiksową
class PostfixToInfix {
// Klasa pomocnicza do przechowywania wyrażeń wraz z ich priorytetem operacyjnym
static class Expression {
String expr;
int precedence;
public Expression(String expr, int precedence) {
this.expr = expr;
this.precedence = precedence;
}
}
// Metoda zwracająca priorytet operatora
private static int precedenceOf(char operator) {
if (operator == '+' || operator == '-') return 1;
if (operator == '*' || operator == '/') return 2;
return -1;
}
// Metoda konwertująca wyrażenie postfiksowe na infiksowe
public static String convertToInfix(String postfix) throws IllegalArgumentException {
Stack<Expression> stack = new Stack<>();
String[] tokens = postfix.split("\\s+");
for (String token : tokens) {
if (token.matches("\\d+")) { // Sprawdza, czy token jest liczbą
stack.push(new Expression(token, 3));
} else if (token.matches("[+\\-*/]")) { // Sprawdza, czy token jest operatorem
if (stack.size() < 2) { // Sprawdza, czy na stosie są co najmniej dwa elementy
throw new IllegalArgumentException("Invalid Expression: Not enough operands for " + token);
}
Expression right = stack.pop();
Expression left = stack.pop();
int opPrecedence = precedenceOf(token.charAt(0));
String leftExpr = left.expr;
if (left.precedence < opPrecedence) {
leftExpr = "(" + left.expr + ")";
}
String rightExpr = right.expr;
if (right.precedence < opPrecedence) {
rightExpr = "(" + right.expr + ")";
}
stack.push(new Expression(leftExpr + " " + token + " " + rightExpr, opPrecedence));
}
}
if (stack.size() != 1) {
throw new IllegalArgumentException("Invalid Expression: Mismatched operands and operators");
}
return stack.pop().expr; // Zwrócenie ostatniego wyrażenia ze stosu jako wynik
}
}
Metoda convertToInfix() konwertuje wyrażenie postfiksowe na infiksowe. Wyrażenie postfiksowe jest dzielone na tokeny (liczby i operatory), które są przetwarzane jeden po drugim. Wyrażenie postfiksowe jest rozdzielane na tokeny (elementy), które są następnie przetwarzane jeden po drugim.
Dla każdego tokenu sprawdzane jest, czy jest to operand (liczba) czy operator (+, -, *, /). Gdy napotykany jest operator, zdejmowane są dwa ostatnie wyrażenia ze stosu, a następnie łączone zgodnie z priorytetem operacji. Jeśli priorytet operacji jest wyższy niż priorytet wyrażeń, dodawane są nawiasy do tych wyrażeń, aby zachować właściwą kolejność operacji matematycznych. Po przetworzeniu wszystkich tokenów, na stosie powinno zostać tylko jedno wyrażenie, które jest wynikowym wyrażeniem infiksowym.
Jeśli na stosie jest więcej lub mniej niż jedno wyrażenie, rzucony zostaje wyjątek, informujący o błędzie w podanym wyrażeniu postfiksowym.
Odwrotna Notacja Polska oferuje wyjątkową kombinację prostoty, efektywności i szerokiego zakresu zastosowań, czyniąc ją atrakcyjnym rozwiązaniem dla wielu problemów obliczeniowych zarówno w nauce, technologii, jak i biznesie. Jej zdolność do uproszczenia procesów obliczeniowych i minimalizacji potencjalnych błędów sprawia, że jest ceniona w wielu dziedzinach, od edukacji po wysokiej stawki finansowe i techniczne aplikacje.
➡ ZOBACZ 👉: Rekurencja ➿ rekursja ➿ rekurencja
Wieża Hanoi (ang. Hanoi Tower). To zadanie, choć proste w swojej idei, stanowi doskonałe pole do ćwiczenia umiejętności programistycznych i logicznego myślenia. Zapraszam do zgłębienia tajemnic tej zagadki, która od ponad wieku fascynuje zarówno matematyków, jak i programistów na całym świecie.
Z tego materiału dowiesz się:
Wieża Hanoi to łamigłówka, która najprawdopodobniej powstała w Azji. Natomiast w Europie rozpropagował ją francuski matematyk Édouard Lucas. Zadanie polega na przeniesieniu stosu różnej wielkości dysków z jednego słupka na inny, z wykorzystaniem trzeciego słupka jako pomocniczego, z zachowaniem zasady, że na mniejszym dysku nie może spoczywać dysk większy.
Główna zasada Wież Hanoi mówi, że żaden większy dysk nie może spoczywać na mniejszym dysku. Ta reguła wprowadza zależność między dyskami, ustalając hierarchię, w której mniejsze dyski zawsze muszą leżeć na większych, niezależnie od słupka, na którym są umieszczone. Taka organizacja wymaga od gracza strategicznego planowania i przewidywania, jak przeniesienie jednego dysku wpłynie na możliwości przeniesienia innych dysków w przyszłości
Rozważmy rozwiązanie problemu dla 3 dysków.
Proces rozwiązywania Wież Hanoi może być opisany następująco:




Każdy z tych kroków jest zależny od poprzedniego, tworząc złożoną sieć zależności, która musi być przestrzegana, aby osiągnąć cel.

Możemy obliczyć minimalną liczbę ruchów potrzebnych do rozwiązania zadania za pomocą wzoru 2n-1.
gdzie n to ilość dysków.
W praktyce rozwiązanie Wież Hanoi opiera się na rekurencyjnym podziale problemu na mniejsze części. Rekurencyjna natura rozwiązania wiąże się bezpośrednio z zależnościami między dyskami. Na przykład, przeniesienie największego dysku (podstawy) na celowy słupek jest możliwe tylko wtedy, gdy wszystkie mniejsze dyski są już na innym, pomocniczym słupku. To z kolei wymaga rozwiązania mniejszego problemu Wież Hanoi dla tych mniejszych dysków na pomocniczym słupku.
➡ ZOBACZ 👉: Rekurencja ➿ rekursja ➿ rekurencja
Gra w Wieże Hanoi nie tylko rozwija zdolności rekurencyjnego myślenia, ale także uczy strategii i planowania. Jest również świetnym wprowadzeniem do stosów w informatyce, ponieważ dyski można traktować jako elementy stosu, co dodatkowo ilustruje zasady LIFO (Last In, First Out).
➡ ZOBACZ 👉: Stos (Stack) – 7+ tajników implementacji LIFO
Algorytm, który rozwiązuje łamigłówkę i prezentuje każdy krok rozwiązania.
class HanoiTowers {
public static void main(String[] args) {
int numberOfDisks = 8;
solveHanoi(numberOfDisks, 'A', 'C', 'B');
}
public static void solveHanoi(int disk, char start, char end, char auxiliary) {
if (disk == 1) {
System.out.println("Przenieś dysk 1 z " + start + " na " + end);
return;
}
solveHanoi(disk - 1, start, auxiliary, end);
System.out.println("Przenieś dysk " + disk + " z " + start + " na " + end);
solveHanoi(disk - 1, auxiliary, end, start);
}
}
Funkcja solveHanoi() Jest to rekurencyjna funkcja, która rozwiązuje problem Wież Hanoi. Przyjmuje cztery parametry: liczbę dysków (disk), oraz oznaczenia słupków: startowego (start), docelowego (end) i pomocniczego (auxiliary). Jeśli jest tylko jeden dysk, funkcja po prostu przenosi dysk bezpośrednio z słupka startowego na docelowy i kończy działanie. W przeciwnym razie przenosi dyski zgodnie z wcześniej omówionymi zasadami.
Kiedy uruchomisz ten program, wyświetlą się instrukcje na konsoli, które pokazują dokładną kolejność ruchów potrzebną do rozwiązania łamigłówki Wież Hanoi dla określonej liczby dysków. Możesz łatwo zmieniać liczbę dysków, modyfikując wartość zmiennej numberOfDisks w funkcji main().

Jeśli kod powyżej jest dla Ciebie niewystarczający, to sprawdź rozwiązanie, które dodatkowo wizualizuje w konsoli położenie dysków w trakcie rozwiązywania zadania.
class VisualHanoi {
private static Stack<Integer>[] towers = new Stack[3];
public static void main(String[] args) {
int numberOfDisks = 3; // Ustaw liczbę dysków tutaj
setupTowers(numberOfDisks);
printTowers();
solveHanoi(numberOfDisks, 0, 2, 1);
}
private static void setupTowers(int disks) {
for (int i = 0; i < 3; i++) {
towers[i] = new Stack<>();
}
for (int disk = disks; disk > 0; disk--) {
towers[0].push(disk);
}
}
private static void solveHanoi(int disk, int start, int end, int auxiliary) {
if (disk == 1) {
towers[end].push(towers[start].pop());
System.out.println("Przenieś dysk 1 z " + (char) ('A' + start) + " na " + (char) ('A' + end));
printTowers();
return;
}
solveHanoi(disk - 1, start, auxiliary, end);
towers[end].push(towers[start].pop());
System.out.println("Przenieś dysk " + disk + " z " + (char) ('A' + start) + " na " + (char) ('A' + end));
printTowers();
solveHanoi(disk - 1, auxiliary, end, start);
}
private static void printTowers() {
System.out.println("A Tower: " + towers[0] + " B Tower: " + towers[1] + " C Tower: " + towers[2]);
System.out.println("-------------------");
}
}
UWAGA! Ostrożnie z ilością dysków, no chyba że masz całą wieczność. 🙃
Problem Wież Hanoi znajduje zastosowanie w nauce o algorytmach, teorii gier, a nawet w psychologii, badając sposób, w jaki ludzie i maszyny podejmują sekwencyjne decyzje. Powiązany jest również z takimi koncepcjami, jak algorytmy sortowania, przeszukiwanie przestrzeni stanów oraz algorytmy planowania.
Rozwiązanie łamigłówki staje się coraz trudniejsze wraz ze wzrostem ilości dysków. W zasadzie nie tyle trudniejsze ponieważ sekwencja ruchów się nie zmienia, co bardziej czasochłonne. Przełożenie wieży z 8 dyskami, zajmuje około 7 minut. Gdy zwiększymy ilość dysków do 30, i poświęcilibyśmy tylko jedną sekundę na przełożenie każdego dysku, zajęłoby nam to 33 lata.
Wieża Hanoi to znakomity przykład na to, jak prosty problem matematyczny może być użyty do nauczania kluczowych pojęć informatycznych i programistycznych. Przez próbę rozwiązania tej zagadki, programiści mogą nauczyć się nie tylko rekurencji i stosów, ale również sposobów optymalizacji i efektywnego rozwiązywania problemów. Uczy metody podziału problemów na mniejsze, co jest fundamentalną umiejętnością w programowaniu i inżynierii. Uczy również zarządzania zasobami i przestrzegania określonych ograniczeń, co ma zastosowanie w projektowaniu algorytmów, optymalizacji systemów i wielu innych dziedzinach technicznych.
Uczysz się programować? Piszesz kod? Tak?
Mija:
A dalej nikt poza Tobą nie widział Twojego kodu?
Jeżeli TAK? – to masz problem…
Z tego materiału dowiesz się:
Kiedy jest ten najlepszy moment, by pokazać światu Twój ukochany, wypieszczony kod?
Czas mija,
a Ty dalej uważasz,
że Twój kod nie jest jeszcze gotowy, by pokazać go innym?
Zdradzę Ci pewien sekret. 👇
To nie Twój kod nie jest gotowy – to Ty nie jesteś jeszcze na to gotów!!
Boimy się oceny – i takie podejście prowadzi do tego, że Ty na tym tracisz. Twój kod traci i później zespół też.
Wobec tego wyjaśnijmy – Dlaczego dążenie do idealnego kodu może być nierealne lub nawet niepożądane?
Rozważając definicję czystego kodu, zastanówmy się, czy w ogóle taki istnieje?
Różnice w postrzeganiu idealnego kodu wynikają z tego, że każdy inaczej go widzi, biorąc pod uwagę różne aspekty takie jak wydajność (zarówno pamięci, jak i czasu wykonania), czytelność, oraz czas dostarczenia projektu. Z uwagi na wiele różnych aspektów, dochodzimy do wniosku, że nie ma czegoś takiego jak kod idealny. Często również nie ma takiej potrzeby, a nawet tego nie chcemy.
Nie piszemy idealnego kodu głównie z powodów ograniczeń czasowych i budżetowych, klient często woli coś taniej lub szybciej. Ewolucja projektu i zmieniające się wymagania mogą wpływać na rozszerzalność kodu. Ważne są także kompromisy projektowe między czytelnością a wydajnością oraz rozwój technologiczny, który wprowadza nowe technologie. Kod ma przede wszystkim dostarczać wartość, a jego tworzenie musi być ekonomicznie uzasadnione.
Podejście emocjonalne do nauki programowania pokazuje, że początkujący często porównują się do doświadczonych programistów, co może prowadzić do frustracji, gdy własny kod nie wydaje się doskonały. Ważne jest jednak zrozumienie, że każdy projekt, Twój tekst, kod, czy dzieło, nie musi być idealny od razu. Ważniejsze jest, aby był wystarczająco dobry do wykonania swojego zadania. Z czasem, z doświadczeniem i praktyką, każdy kolejny kawałek kodu będzie lepszy.
Pokazywanie kodu innym ma duże znaczenie, ponieważ umożliwia otrzymywanie cennego feedbacku i recenzji kodu. Dzięki temu możesz szybciej wyłapać ewentualne błędy i nauczyć się nowych rzeczy. Przegląd kodu w projekcie, dzielenie się wiedzą i wspólna praca nad kodem, a także prezentacja kodu na konsultacjach pomagają w rozwijaniu umiejętności opowiadania o swoich pomysłach i prowadzeniu dyskusji, co przyczynia się do lepszego zrozumienia kodu i współpracy w zespole.
Przyjmowanie krytyki i rad z mniej emocjonalnego podejścia wymaga konstruktywnego reagowania na feedback, oceny kodu/rozwiązania, a nie osoby, i pamiętania o wspólnej pracy. Bądźmy mili, wspierajmy się, wymieniajmy przeglądami, pomagajmy sobie. Każdy zaczynał od pisania nieidealnego kodu, ważne jest, aby dążyć do poprawy, nie bojąc się publikacji własnych prac. Z czasem jakość kodu się poprawi, a inni pomogą w tym procesie.
Efekt obserwatora, który oznacza, że obecność innych wpływa na nasze zachowanie, może działać jako motywator. Świadomość, że nasza praca zostanie wkrótce upubliczniona, może skłonić nas do lepszego myślenia i pracy. To samo dotyczy innych sytuacji, jak przestrzeganie diety czy zachowanie na drodze – wiedza, że ktoś może obserwować nasze działania, sprawia, że staramy się bardziej.
Regularne udostępnianie kodu jest świetnym sposobem na aktualizowanie i budowanie portfolio, które możesz pokazać potencjalnym pracodawcom lub klientom. Decydując, co włączyć do portfolio, ważne jest wybranie projektów, które najlepiej oddają Twój zakres umiejętności i doświadczenie, unikając jednocześnie projektów nieukończonych lub nieodzwierciedlających Twojego aktualnego poziomu.
➡ ZOBACZ 👉: Git commit | git commit, amend, add, status, diff
➡ ZOBACZ 👉: Git push – git integracja ze zdalnym repozytorium, git push, ssh, remote
Dzielenie się kodem można zorganizować szybko i wygodnie, dostosowując metodę do sytuacji. Dla prostych przypadków wystarczy screen lub kopiowanie fragmentu kodu, podczas spotkań online możemy udostępnić ekran przez Google Meet czy Zoom. Dla większych projektów warto przeprowadzić profesjonalny przegląd kodu, na przykład wrzucając kod na GitHub i tworząc pull request
➡ ZOBACZ 👉: Code Review – Nie wiesz jak pisać lepszy kod? Skup się na code review (przegląd kodu)!
➡ ZOBACZ 👉: GitHub tutorial | GitHub desktop, GitHub actions
➡ ZOBACZ 👉: Git tutorial | stash, rebase, commit, merge, checkout, push i clone
Dzielenie się kodem to wartościowa praktyka w programowaniu i nauce, z której korzystasz Ty oraz inni. Jest to jedna z dobrych praktyk, która może znacząco wspomóc Twój rozwój. Im szybciej zaczniesz się nią dzielić, tym lepiej dla Ciebie i Twojej społeczności programistycznej.
➡ ZOBACZ 👉: Zobacz gotowy 10-krokowy System Który pozwoli Ci zmienić branżę i Zostać Programistą w 6-12 miesięcy!
Sudoku – to gra logiczna, która polega na wypełnieniu siatki 9×9 cyframi tak, aby każda kolumna, każdy wiersz i każdy z dziewięciu kwadratów 3×3 (które razem tworzą większą siatkę 9×9) zawierały wszystkie cyfry od 1 do 9.
Oto podstawowe reguły:
Rozpoczynamy od zdefiniowania planszy jako dwuwymiarowej tablicy liczb całkowitych, gdzie wartość 0 reprezentuje pustą komórkę:
public static void main(String[] args) {
int[][] board = {
{8, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 3, 6, 0, 0, 0, 0, 0},
{0, 7, 0, 0, 9, 0, 2, 0, 0},
{0, 5, 0, 0, 0, 7, 0, 0, 0},
{0, 0, 0, 0, 4, 5, 7, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 3, 0},
{0, 0, 1, 0, 0, 0, 0, 6, 8},
{0, 0, 8, 5, 0, 0, 0, 1, 0},
{0, 9, 0, 0, 0, 0, 4, 0, 0}
};
printBoard(board);
}
private static void printBoard(int[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.print(board[i][j] + " ");
}
System.out.print("\n");
}
System.out.println();
}

Sudoku java przykład
Kluczową częścią algorytmu jest metoda solve(), która rekurencyjnie przeszukuje możliwości wypełnienia planszy:
private boolean solve(int[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == NO_VALUE) {
for (int k = 1; k <= 9; k++) {
board[i][j] = k;
if (isValid(board, i, j) && solve(board)) {
return true;
}
board[i][j] = NO_VALUE;
}
return false;
}
}
}
return true;
}
➡ ZOBACZ 👉: Rekurencja ➿ rekursja ➿ rekurencja
Dla każdej pustej komórki (NO_VALUE), metoda próbuje wstawić każdą możliwą wartość od 1 do 9, sprawdzając za każdym razem, czy nie narusza to zasad sudoku przy użyciu metody isValid().
private boolean isValid(int[][] board, int row, int column) {
return (rowConstraint(board, row)
&& columnConstraint(board, column)
&& subsectionConstraint(board, row, column));
}
Korzystając z pomocniczych metod, algorytm weryfikuje, czy dane umieszczenie liczby nie powoduje konfliktów.
private boolean rowConstraint(int[][] board, int i) {
boolean[] constraint = new boolean[SIZE];
return IntStream.range(1, 9)
.allMatch(column -> checkConstraint(board, i, constraint, column));
}
private boolean columnConstraint(int[][] board, int j) {
boolean[] constraint = new boolean[SIZE];
return IntStream.range(1, 9)
.allMatch(row -> checkConstraint(board, row, constraint, j));
}
private boolean subsectionConstraint(int[][] board, int i, int j) {
boolean[] constraint = new boolean[SIZE];
int subsectionRowStart = (i / 3) * 3;
int subsectionRowEnd = subsectionRowStart + 3;
int subsectionColumnStart = (j / 3) * 3;
int subsectionColumnEnd = subsectionColumnStart + 3;
for (int r = subsectionRowStart; r < subsectionRowEnd; r++) {
for (int c = subsectionColumnStart; c < subsectionColumnEnd; c++) {
if (!checkConstraint(board, r, constraint, c)) return false;
}
}
return true;
}
Metody takie jak rowConstraint() i columnConstraint() używają strumieni IntStream do sprawdzania, czy każda liczba w danym wierszu lub kolumnie jest unikalna. Z kolei metoda subsectionConstraint() odpowiada za weryfikację małych kwadratów 3×3.
boolean checkConstraint(int[][] board, int i, boolean[] constraint, int j) {
if (board[i][j] != NO_VALUE) {
if (!constraint[board[i][j] - 1]) {
constraint[board[i][j] - 1] = true;
} else {
return false;
}
}
return true;
}
Metoda checkConstraint() zapewnia, że wstawiona liczba nie powtarza się już w danym kontekście (wiersz, kolumna, kwadrat 3×3).
private void printBoard(int[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.print(board[i][j]);
System.out.print(" ");
}
System.out.println();
}
System.out.println();
}
Choć algorytm zwraca wartość logiczną wskazującą, czy znaleziono rozwiązanie, dla lepszego zrozumienia procesu warto również wyświetlić końcową konfigurację planszy.
Wyżej przedstawiony algorytm, jest potężnym narzędziem, które przez systematyczne próbowanie i eliminowanie możliwości, pozwala znaleźć prawidłowe rozwiązanie łamigłówki. Tutaj istotna jest dokładna walidacja każdego ruchu zgodnie z zasadami sudoku oraz rekurencyjne szukanie rozwiązania, które spełnia wszystkie ograniczenia. Mimo że algorytm ten jest skuteczny, istnieje wiele możliwości jego optymalizacji, na przykład poprzez wprowadzenie bardziej zaawansowanych technik eliminacji i sprawdzania możliwości, co może znacząco przyspieszyć proces znajdowania rozwiązania.
➡ ZOBACZ 👉: StormIT | Oferta
Domyślam się, że skoro tu się spotykamy, to pojawiło się u Ciebie zainteresowanie,
a może już dawno zakiełkowało 🌱 pragnienie zostania programistą. 🙂
Wiem, że początki bywają trudne, bo nie za bardzo wiadomo, jak się za to zabrać, co zrobić jako pierwsze, czy się do tego w ogóle nadaje, mnóstwo pytań pojawia się w głowie i jeszcze więcej wątpliwości a może i nawet frustracji 😕?
Uważam, że niezależnie od tego czy bierzemy się za gotowanie 🧑🏻🍳, pomysł na weekend, czy też naukę programowania 👨💻 warto mieć plan, który pozwoli w sposób wymierny sprawdzać progres i który ostatecznie doprowadzi nas do upragnionego celu 🏆.
Praca z wieloma ludźmi, którzy byli dokładnie w tym samym miejscu co Ty teraz, pozwoliła mi stworzyć gotowy plan na to jak zacząć, ale i jak przejść krok po kroku👣 do pierwszej pracy jako programista.
Z tego materiału dowiesz się:
Nie odkładaj czegoś na jutro, skoro możesz to zrobić dzisiaj — To samo dotyczy nauki programowania. Pomyśl, że jak zaczniesz już dzisiaj, będziesz o jeden dzień bliżej swojej wymarzonej pracy jako programista 💪. Pieczenie bez przepisu ? Brzmi dla mnie trochę jak spora szansa, że do kawy nie zjem nic. Zaczynając naukę programowania, też przyda Ci się porządny plan działania. Dlatego pokażę Ci dziś, najskuteczniejszy i sprawdzony 10-krokowy proces transformacji od zera do komercyjnego programowania – krok po kroku do celu.
Przygotowałem kroki, którym przyjrzymy się razem po kolei:
Pamiętaj! Nie spiesz się – to nie sprint 🙂 Nie pomijaj kroków, zapoznaj się z każdym punktem i wprowadź go w życie 😉
W tym kroku – w dużym uproszczeniu – sprawdzamy, czy to jest naprawdę dla Ciebie.
TAK – programowanie nie jest dla każdego 🙂
O ile naprawdę każdy, kto ma choćby odrobinę chęci, żeby to zrobić – może nauczyć się podstaw programowania.
To zdecydowanie nie każdy odnajdzie się na dłuższą metę w tym zawodzie.
Chodzi przede wszystkim o uniknięcie sytuacji, w której podejmiesz trud nauki i zmiany branży i później zwyczajnie będzie Cię to męczyło. Dlatego lepiej zawczasu to sprawdzić. 🙂
Poświęć trochę czasu na zapoznanie się z tym co oferuje nam branża. Popatrz, jak wygląda specyfika pracy programisty, jak wygląda jego taki standardowy dzień pracy.
➡ ZOBACZ 👉: Czy warto być programistą?
Temat pracy programisty został przez Ciebie dogłębnie przeanalizowany 🕵️♂️?
Czujesz swoją determinację i wiesz, że pisanie kodu to jest to co, da Ci satysfakcję?
Jeżeli tak, to przyjrzymy się kolejnym krokom, które przybliżą Cię do tego celu!
Skoro wiemy już co nieco o Twoich preferencjach i zakładamy, że przynajmniej na tym etapie programowanie wydaje Ci się kuszące, to możemy zejść odrobinę głębiej w naszych rozważaniach.
Szczególnie że programowanie i IT – to bardzo szerokie dziedziny wiedzy.
I tutaj przynajmniej wstępnie warto zastanowić się, w którym kierunku chcemy iść dalej.
Czy będzie to np.
Możliwości jest naprawdę sporo.
Zapoznaj się z różnymi dziedzinami programowania, np. robieniem stron internetowych, aplikacjami mobilnymi, data science, AI/sztuczną inteligencją, grami itd.
Wstępnie wybierz specjalizację, która najbardziej Cię interesuje i zgadza się z Twoimi celami zawodowymi.
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – natomiast kompletny materiał dotyczący backend’u znajdziesz poniżej.
➡ ZOBACZ 👉: Backend – czy nadajesz się na backend developera?
Wybór preferowanej specjalizacji przynajmniej częściowo będzie implikował nam wybór języka programowania.
O ile większość rzeczy możemy robić w prawie że dowolnym języku, to jednak często niektóre języki lepiej się spisują w konkretnych zastosowaniach.
Nie jest to jednak jedyny aspekt, na który warto zwrócić uwagę.
Wybierając język programowania, zwróć uwagę na kilka istotnych punktów, żeby później nie zaczynać od nowa:
Pamiętaj, że nie musi to być Twój ostateczny wybór.
Na coś trzeba się zdecydować i warto zrobić to stosunkowo szybko – tak, żeby Cię to nie blokowało.
Tutaj pomaga świadomość, że większość doświadczonych developerów zna po kilka, a czasem nawet kilkanaście różnych języków programowania – a nasz pierwszy wybór zazwyczaj nie jest tym ostatnim.
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – powyżej zostały wymienione najistotniejsze punkty, na które warto zwrócić uwagę podczas wyboru języka programowania – natomiast materiał z pełną listą, która jeszcze lepiej pomoże dokonać Ci wyboru jeżeli chodzi o język programowania, znajdziesz poniżej.
➡ ZOBACZ 👉: Jak wybrać język programowania
Punkt 3 został przerobiony?
Research na temat różnych języków programowania został przez Ciebie zrobiony?
W takim razie podejmij decyzję:
Skoro wiemy już, w jakim języku 👅 programowania chcemy pisać, czas wreszcie zabrać się za naukę programowania i opanować składnię wybranego języka.
Jednak programowanie, to przecież nie tylko składnia języka programowania!
Będziemy potrzebowali jeszcze wielu innych, równie ważnych – a może i czasem ważniejszych umiejętności.
Ale tym tematem zajmiemy się ze szczegółami już w kolejnym materiale.
Na teraz warto wiedzieć, że składnia języka to punkt wyjścia, bez którego opanowania nie możemy przejść dalej.
Język wybrany – Czas na naukę 🙂
Tak bez tego zdecydowanie się nie obędzie. Dlatego naucz się dobrze podstaw wybranego przez Ciebie języka programowania:
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – natomiast jestem tutaj po to, żeby ułatwiać Ci życie jeszcze bardziej 🙂 Tak to jest możliwe 😜. Dlatego materiały do nauki podstaw Javy znajdziesz poniżej.
➡ ZOBACZ 👉: Kurs Java
Ucz się przez praktykę:
Naucz się korzystać z narzędzi programistycznych takich jak:
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – natomiast całkowity materiał dotyczący git’a znajdziesz poniżej.
➡ ZOBACZ 👉: Git
Podstawy mamy już za sobą, dlatego powoli zaczynamy patrzeć w kierunku wykorzystania naszych umiejętności do pracy zawodowej.
Szukając pierwszej pracy jako programista, będziemy mieli bardzo ważne zadanie – przekonać naszego potencjalnego pracodawcę, że mamy wystarczające umiejętności, żeby wykonywać powierzoną nam pracę.
O ile w przypadku osób z doświadczeniem komercyjnym jest to bardzo proste, bo zwyczajnie już wcześniej pracowaliśmy – tak w przypadku juniorów musimy odrobinę zmienić podejście. Ostatecznie nigdy wcześniej nie pracowaliśmy. 🙂
Wiadomo, że doświadczenie zdobywa się, pracując.
Pracodawcy natomiast wymagają doświadczenia.
Nie masz pracy, bo nie masz doświadczenia,
a nie masz doświadczenia, bo nie masz pracy.
I tak niestety krąg się zamyka…
Jak w takim razie wyjść z tego nieszczęsnego kręgu?
Skoro nie mamy doświadczenia komercyjnego, to trzeba postawić na doświadczenie niekomercyjne!
Czyli pokazać swoje umiejętności w praktyce – najlepiej przez nasze portfolio zrealizowanych projektów.
Skoro uczysz się programowania – to musisz pisać kod!
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – dlatego zachęcam Cię również do sprawdzenia całkowitego materiału dotyczącego różnych form nauk programowania, który znajdziesz poniżej.
➡ ZOBACZ 👉: Różne formy nauki programowania
Praktyka, praktyka i jeszcze raz praktyka.
Nikt, ucząc się tylko słówek i gramatyki – bez praktyki nie został native speakerem.
Dlatego koniecznie:
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – natomiast kompletny materiał dotyczący Github’a znajdziesz poniżej.
➡ ZOBACZ 👉: Github tutorial
Okrutna prawda jest taka, że CV zazwyczaj nie jest czytane, a jedynie przeglądane – skanowane wzrokiem…
Czyli w praktyce, masz tylko kilka sekund, żeby zaciekawić rekrutera swoim dokumentem.
Jeżeli już na pierwszy rzut oka Twoje CV krzyczy, że nie masz doświadczenia i nie umiesz nawet przygotować profesjonalnego dokumentu,
to rekruter musi być naprawdę zdesperowany, żeby przeczytać go uważnie…
Nawet jeżeli masz super doświadczenie i umiejętności,
a Twoje CV tego nie odzwierciedla, to masz bardzo małe szanse,
że dostaniesz zaproszenie na rozmowę kwalifikacyjną.
Bo niby skąd taki rekruter ma to wiedzieć jak nie właśnie z Twojego CV?
Nie pisz CV na kolanie, a poświęć niezbędny czas, aby je doszlifować.
CV jest Twoim, można powiedzieć biletem wejścia do dalszych etapów rekrutacji – Czyli jest bardzo bardzo ważne!
Dlatego:
W rekrutacjach bierze udział więcej osób 🙂
Pamiętaj o tym.
Czasem to Ty okażesz się najlepszym dopasowaniem do firmy a czasem, ktoś inny. Nigdy się nie zniechęcaj!
Nawet rekrutacje, które okażą się niepowodzeniem, mogą być dobrą nauką dla Ciebie.
Już mówię, o co chodzi
– W takiej sytuacji człowiek zadaje sobie pytanie dlaczego nie ja?
– Zapytaj – Proś o informację zwrotną i wdrażaj poprawki!
Na początku, kluczowe jest, aby rozbudowywać ciągle swoje doświadczenie oraz zrealizowane projekty
– uzupełniaj CV, za każdym razem, kiedy stworzysz coś wartego przedstawienia światu.
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – super uzupełnieniem, do którego Cię zachęcam, będzie materiał dotyczący CV programisty, który znajdziesz poniżej.
➡ ZOBACZ 👉: CV Programisty
Czasem dobrym wyróżnikiem jest zwyczajnie zrobienie wszystkiego, jak należy i wyróżnienie się jakością.
Czasem jednak trzeba zrobić coś więcej!
Zazwyczaj osoby ubiegające się o stanowisko Junior Developera mają BARDZO podobne umiejętności – a ich CV wyglądają jak wycięte z tego samego szablonu…
W takiej sytuacji, szczególnie gdy mamy wielu kontrkandydatów,
trzeba zrobić coś, by choć odrobinę się wyróżnić:
Wymyśl coś – coś niestandardowego.
Coś, co przyciągnie uwagę właśnie do Twojej kandydatury.
Najgorsze, co możesz zrobić to wysłać szablonowego maila z prostym CV, bez personalizacji i z niewielkim doświadczeniem.
Pojawia się oferta – Klik – Wyślij CV – Klik… – Ale chwila przecież jak wyślesz, nie będzie już odwrotu, dlatego nie zmarnuj swojej szansy, szczególnie jak oferta naprawdę przypadła Ci do gustu.
Dlatego, zanim wykonasz ten ostateczny klik:
Wiesz, że pytania na większości rozmów kwalifikacyjnych się powtarzają? 🙂
Oczywiście nie wszystkie, bo czasem ludzie starają się być oryginalni…
Jednak w zdecydowanej większości przypadków,
znaczną część pytań można przewidzieć już przed samą rozmową.
Rozmowa kwalifikacyjna to zazwyczaj dosyć stresujące wydarzenie – po co sobie jeszcze bardziej to utrudniać?
Najgorsze, co możesz zrobić, to nie przygotować się i nie znać odpowiedzi na najczęściej zadawane pytania,
a co gorsze – nie znać odpowiedzi na pytania dot. Twojego CV!
Zaproszenie na rozmowę rekrutacyjną, szczególnie jak jest to jedna z Twoim pierwszych rozmów na stanowisko programisty, wiąże się z ekscytacją, ale i sporym stresem.
Dlatego, aby zminimalizować ewentualne wpadki, przygotuj się do niej, najlepiej jak potrafisz:
W ramach tego materiału zajmujemy się przede wszystkim planem jak zostać programistą – zachęcam Cię do zapoznania się z różnymi pytaniami, z którymi możesz się spotkać na rozmowie rekrutacyjnej – listę pytań z odpowiedziami znajdziesz w materiale poniżej.
➡ ZOBACZ 👉: Java Pytania Rekrutacyjne, Java Zadania
Jeżeli nie wdrożyłeś żadnego projektu produkcyjnie, to tak naprawdę nie znasz jeszcze życia projektowego…
Dopiero doprowadzenie przynajmniej jednego projektu od początku do samego końca i zebranie opinii od prawdziwych użytkowników daje pełny i prawdziwy pogląd na temat pracy programisty.
Praktyka pokazuje, że zazwyczaj nawet nie zdajemy sobie sprawy o jak wielu rzeczach jeszcze wcześniej nie pomyśleliśmy 🙂
Brak projektu w portfolio, to tylko „sucha” wiedza teoretyczna.
Posiadasz już solidne podstawy jeżeli chodzi o język programowania. To super!
Pokaż teraz rekruterom, ale również sobie, że potrafisz tę wiedzę wykorzystać i połączyć programistyczne klocki w jedną całość.
Dlatego:
Rekruterzy często lubią pytać o zrealizowane projekty. Pomyśl, jak ułatwi Ci to rekrutację – opowiesz o tym co wiesz, bo projekt wyszedł spod Twoich rąk – pokażesz, że nie dość, że dobrze ogarniasz teorie, to jeszcze umiesz ją wykorzystać. Jak dla mnie win-win sytuacja 😉
Nie masz pomysłu na projekt? Minęły dni, a w Twojej głowie nadal nie wyklarowała się koncepcja na aplikację? Nie martw się ;). Każdy może mieć kryzys twórczy, szczególnie pod presją czasu – dlatego przygotowałem dla Ciebie listę potencjalnych pomysłów na projekt – projektowe inspiracje znajdziesz w materiale poniżej.
➡ ZOBACZ 👉: Lista 20 projektów, które dadzą Ci zatrudnienie w IT
Zastanów się 🤔, co będzie miało większą wartość dla klienta?
Pamiętaj dla klienta czas to pieniądz 💰💰 – Ale czy tylko dla niego? 🙂
Pomyśl, że podobnie jest z nauką programowania
Korzystając z pomocy innych osób i dobrych materiałów – jest zwyczajnie prościej, szybciej i przyjemniej!
Dlaczego to ważne?
Nic tak nie przyspiesza nauki, jak dobry mentor 🧙♂️ – który pomoże w trudnych chwilach i podpowie, co robić. A czemu nie mieć takich mentorów – 10, czy 100+? Tak właśnie działa społeczność. Będzie Ci łatwiej zdobywać wiedzę oraz podążać drogą osoby, która już osiągnęła sukces – po co wymyślać koło od nowa?
W tym kroku najważniejsze co musisz zrobić to:
Tak naprawdę możesz z tego wyciągnąć same pozytywy – ogrom wiedzy, udziały w fajnych i ciekawych projektach, a także grono nowych znajomości 🙂
Jeżeli nie wiesz, gdzie zacząć poszukiwania mentora lub po prostu społeczności, w której będziesz mógł się uczyć, wspólnie programować i wymieniać wiedzę – sprawdź naszą społeczność KierunekJava – gromadzi ona wiele osób, która chcę tego, co Ty – programować, zdobywać wiedzę i ciągle się rozwijać, a przy okazji żartuje i dobrze się bawi. Jeżeli chcesz dołączyć do tego grona, sprawdź poniższy program.
➡ ZOBACZ 👉: Program Edukacyjny „Kierunek Java”
Nie masz pewności, czy dasz radę?
Nie masz pewności, czy to dobry moment?
Odłóż na chwilę te wątpliwości i zwyczajnie daj sobie szansę! 🙂
Na koniec chcę podzielić się z Tobą 4 etapowym procesem, który pomoże Ci zrobić pierwszy krok – pętlą zwrotną rekrutacji.
Może nazwa brzmi tajemniczo, więc już tłumaczę, o co chodzi w tej naszej „magicznej” pętli 🙂
Pętla składa się z 4 kroków, które powtarzamy aż do skutku (zdobycia naszej upragnionej pracki :))
Zamiast zastanawiać się – czy już jestem gotów, czy sobie poradzę itp. – zwyczajnie zaufaj procesowi i przejdź kolejno przez te kroki.

Udało Ci się 🤝 🙂 Wszystkie kroki za Tobą 🙂
Czy czujesz, że jesteś w zupełnie innym miejscu z dużą większą wiedzą i umiejętnościami 💪– To prawidłowo 🙂
Cieszę się, że mogłem towarzyszyć Ci w tej podróży, ku spełnieniu Twojego marzenia.
Podziel się w komentarzach swoimi sukcesami, ale i ewentualnymi trudnościami i tym jak udało Ci się je pokonać 😉
Dzielmy się doświadczeniem i uczmy się z doświadczeń innych.
Jako uzupełnienie materiału zapraszam Cię również do wysłuchania mojej rozmowy z Krzysztofem w ramach podcastu Porozmawiajmy o IT.
Z tego materiału dowiesz się:
Pasja do programowania na pewno pomaga w zdobyciu pierwszej pracy. Natomiast nie jest czynnikiem determinującym. To wspaniała rzecz mieć pasje. Zawód programisty umożliwia realizowanie ich bez względu na to czy są związane z programowaniem, czy nie.
W zasadzie można zaryzykować stwierdzenie, że programować może każdy, ale czy programowanie jest dla każdego? NIE JEST. Jeśli jedyną motywacją, aby zostać programistą są duże zarobki to raczej nie wróżę przyszłości takiej osobie. Mimo wszystko powinno się to czuć.
Najlepiej zacząć od pytań do siebie. Spójrz na punkty powyżej☝️. Czy mam w tym pasję? Czy jest to dla mnie interesujące? Czy się w tym odnajdę? Czy mam predyspozycje?
➡ ZOBACZ 👉: Od czego zacząć naukę programowania?
Jak zawsze to zależy, czyli można powiedzieć, że tak jest to trudne i jest to łatwe. Bardzo dużo zależy od kontekstu. Tutaj na pewno warto wspomnieć o tym, że jest to nasza pierwsza praca. My uczymy się czegoś całkowicie nowego, robimy to jeszcze dodatkowo pierwszy raz, więc siłą rzeczy musi być to związane z pewnym wysiłkiem. Wiadomo, że za każdym razem jak będziemy szukali kolejnych ofert pracy, będziemy chcieli zmienić zatrudnienie, będzie nam już dużo łatwiej.
➡ ZOBACZ 👉: Jak się uczyć programowania?
Oczywiście JAVA!
Tak na poważnie to mam przygotowaną taką listę standardowych pytań. Można powiedzieć, że ta lista to jest właśnie weryfikacja Twoich preferencji, Twoich możliwości, tego, co konkretnie w Twoim wypadku najlepiej będzie się sprawdzało. Bo wiadomo, że dla mnie idealny pierwszy język to niekoniecznie będzie ten sam język to w Twoim wypadku czy w wypadku jakiejkolwiek innej osoby.
➡ ZOBACZ 👉: 10 kroków – Jak wybrać język programowania?
Programowanie to podróż, a nie cel. Klucz do sukcesu leży w ciągłej nauce, eksperymentowaniu i nieustannym rozwoju. Nie ma jednej ścieżki do zostania programistą; każdy może znaleźć swoją własną drogę. Pamiętaj, że każdy programista zaczynał od zera. Bądź cierpliwy, wytrwały i otwarty na nowe wyzwania. Programowanie to nie tylko umiejętność; to sposób na zmienianie świata, tworzenie nowych możliwości i realizowanie własnych pomysłów. Z każdą linijką kodu, jaką napiszesz, stajesz się częścią czegoś większego. Zacznij swoją podróż już dziś i odkryj, jakie drzwi otworzy przed Tobą programowanie.