Курс по Java — от съвременния език до програма, която проверява много услуги наведнъж
Езици и бекендСредно ниво
Преди този курс: Python или умение за програмиране на друг език
От Dorian Chávez, основател на Hábil и архитект на интеграции. Така обучаваме тези, които изграждат системи, които не могат да се провалят.
За кого е: за този, който вече програмира на друг език —Go, TypeScript, Python или какъвто и да е— и иска да научи днешната Java. Курсът е със средно ниво: не обяснява какво е променлива или цикъл, а обяснява какво Java прави различно и защо съществува. Всяко ново понятие се обяснява, когато се появи. Ако никога не си програмирал, започни с курса по Python или с този по Go.
Какво ще знаеш в края: да напишеш цялостна програма на Java 25, с модела на данните, изразен в типове, с тестове и конкурентност, да разбираш какво си написал и да можеш да го обясниш на някой друг. И да ти остане критерият да четеш документацията на езика сам.
Какво ти трябва, преди да започнеш: компютър с Linux Mint, да умееш да отвориш терминал и да си писал програми с функции, условия и цикли на какъвто и да е език. Урок 1 инсталира JDK от нулата, а Урок 6 — Maven.
Проектът, който ще изградиш
revisor: програма, която чете списък от услуги, пита всичките наведнъж по HTTP, измерва колко време отнема всяка, изолира повредата на всяка услуга и връща отчет винаги в един и същ ред. В края го предоставя чрез малък сървър и го пакетира в JAR. Това е същата задача като в курсовете по Go, Rust и TypeScript, решена този път на Java.
$ java -jar revisor.jar --config servicios.json
SERVICIO ESTADO TIEMPO DETALLE
catalogo ARRIBA 182ms 200
inventario LENTO 2.3s 200
pagos ARRIBA 132ms 200
reportes CAIDO — sin conexión
4 servicios · 2 arriba · 1 lento · 1 caído · promedio 883ms
(Истинско изпълнение на завършената програма срещу учебния сървър на курса на 13 октомври 2026 г.; времената се менят при всяко изпълнение.)
Изглежда малка, но не е: за да я напишеш добре, са ти нужни запечатани типове, колекции, изключения, проект с Maven и тестове, HTTP клиентът, JSON, виртуални нишки и пакет, който може да бъде предаден.
Единайсетте урока
| Урок | Какво изграждаш | Какво научаваш | |
|---|---|---|---|
| 0 | Какво е Java и какво НЕ е | засега нищо (четене) | изходен код, байткод (bytecode) и JVM; JDK и JRE; какво е LTS и защо 25; какво защитава компилаторът и какво не |
| 1 | Инсталиране на Java 25 на твоя Linux Mint | средата и първата ти програма | JDK, java --version; void main() и IO.println; java Hola.java; jshell; javac; първата грешка |
| 2 | Типове, низове и управление на потока | базовите функции на revisor |
примитиви и референции; var; == срещу equals; && срещу &; текстови блокове; switch като израз; null |
| 3 | Records, enums и запечатани типове | моделът Servicio / Estado |
record; неизменяемост; enum; sealed; изчерпателен switch с шаблони; шаблони за record |
| 4 | Колекции, генерични типове и стриймове | списъкът с услуги и отчетът | List, Map, Set; неизменяеми колекции; генерични типове; Comparator; стриймове (streams); Optional |
| 5 | Грешки и изключения | revisor, който не се срива |
проверявани и непроверявани; try-with-resources; собствени изключения; резултат срещу изключение |
| 6 | Проект с Maven | истинският проект: компилира се, пакетира се и работи | пакети и видимост; инсталиране на Maven; структура на Maven; pom.xml; жизненият цикъл; какво има в един .jar |
| 7 | Тестове с JUnit | първите 18 теста на revisor |
JUnit 6; @Test; тестове с таблица от случаи; assertThrows и @TempDir; да го видиш червен; как се чете отчетът |
| 8 | HTTP и JSON | истинска заявка и конфигурацията | HttpClient; таймаути; Jackson 3; валидиране на данни отвън; SSRF |
| 9 | Конкурентност: проверка на всичко наведнъж | конкурентният revisor |
виртуални нишки; една нишка на задача; invokeAll; Semaphore; ConcurrentHashMap; едно измерено състезание (race condition) |
| 10 | Завършената програма | пълният revisor, готов за предаване |
команден ред и код на изход; сървърът на JDK; коректно спиране; качество; изпълним JAR |
В края на всеки урок има упражнения с решенията им и раздел с източници, с препратките към онова, което е било твърдяно. А дневникът е твой: записвай в него какво ти струва усилия.
Три критерия, които минават през целия курс
Грешките се преподават по цената им. Проучванията с данни от стотици хиляди студенти по Java показват, че преподавателите грешат, когато гадаят кои грешки са трудните. Тези, които най-дълго се оправят, са объркването на == с equals, на & с && и неизползването на стойността, която връща един метод. Те се появяват, когато му е времето, и всеки урок нарочно предизвиква грешката, която ще видиш.
Тестовете и сигурността не са уроци, а навици. Тестове има от момента, в който проектът може да ги изпълнява (урок 7, веднага след като го превърнем в проект с Maven), и един тест не се брои, докато не си го видял да пропада. Сигурността се появява там, където се появява рискът за revisor: адресът, който някой пише във файл, данните отвън, които се валидират, и вградената сериализация, която не се използва с външни данни.
Преподава се само онова, което вече е окончателно в Java 25. Онова, което още е в предварителен преглед (preview), се появява в каре „какво предстои“, с флага, който изисква, и се казва да не се използва в продукция. Курс, който преподава току-що излязлото, остарява за шест месеца.
За да продължиш да четеш в блога на Hábil: кога е удачно (и кога не) да се компилира Java до нативен код, тестове, които хващат грешки и сигурност на API. И ако ти липсва основата от друг език, курсът по Python или този по TypeScript.
Как разбираш, че си приключил
Курсът не свършва, когато си прочел урок 10, а когато твоят revisor изпълнява тези шест неща:
mvn -B verifyзавършва зелено и отчетът казва колко теста са се изпълнили. Преброй ги по отчета, не по кода на изход (exit code): зелено с нула теста изглежда същото като истинско зелено.- Проверява 20 услуги наведнъж за време, близко до това на най-бавната, а не до сбора на всички. Измерваш го ти, с часовник, последователно и паралелно.
- Паднала, бавна или отговаряща с боклук услуга не сваля отчета: тя се появява в своя ред със своята грешка, а останалите излизат пълни и в същия ред както винаги.
- Никоя заявка не може да чака вечно: всички имат време за свързване и таймаут.
- Отхвърля адресите, които не са
httpилиhttps, и тези, които не са в списъка с разрешените, вместо да пита каквото му напишат във файла. - Изпълнява се с
java -jar revisor.jarот друга папка и излиза с код 0, ако всичко работи, и с 1, ако не.
Уроци
- Урок 0 — Какво е Java и какво НЕ е
- Урок 1 — Инсталиране на Java 25 на твоя Linux Mint
- Урок 2 — Типове, низове и управление на потока
- Урок 3 — Records, enums и запечатани типове
- Урок 4 — Колекции, генерични типове и стриймове
- Урок 5 — Грешки и изключения
- Урок 6 — Проект с Maven
- Урок 7 — Тестове с JUnit
- Урок 8 — HTTP и JSON
- Урок 9 — Конкурентност: проверка на всичко наведнъж
- Урок 10 — Завършената програма