Skip to content

Z bloga

Notatki o inżynierii oprogramowania, AI i tworzeniu produktów.

7 min czytania

Budowanie niezawodnych narzędzi dla LLM

Function calling, agenci i MCP wszystkie opierają się na tym samym: narzędziach, które LLM może wywołać. Ale narzędzie zbudowane dla niedeterministycznego, omylnego wołającego potrzebuje innego projektu niż zbudowane dla kodu. Deep-dive o tym, co czyni narzędzie niezawodnym dla LLM — nazewnictwo, zakres, walidacja, komunikaty błędów, z których może się odzyskać, i bezpieczeństwo, które nie może żyć w modelu.

7 min czytania

AI-native Rails stack w 2026

Poskładaj to razem — Solid Stack bez Redisa, Kamal, pgvector i wypracowane w praktyce zasady budowania z LLM — a wyłania się spójny obraz: Rails to znakomite środowisko dla aplikacji AI-native, właśnie dlatego, że pozwala małemu zespołowi budować i uruchamiać zarówno aplikację, jak i jej funkcje AI. Synteza tego, w którym miejscu ten stos się dziś znajduje.

5 min czytania

Systemy wieloagentowe: wzorce orkiestracji

Gdy pojedyncze agenty działają, kusi, by spiąć kilka razem — badacza, pisarza, krytyka — i pozwolić im współpracować. Czasem to potężne; często to złożoność, której nie potrzebowałeś. Deep-dive o wzorcach orkiestracji dla systemów wieloagentowych, kiedy zarabiają na swoje utrzymanie i o trybach awarii, które mnożą się, gdy agenty się mnożą.

6 min czytania

Rozwój sterowany specyfikacją z agentami AI

Gdy agent AI robi implementację, specyfikacja staje się artefaktem o najwyższej dźwigni w projekcie — jasna specyfikacja produkuje dobry kod, mglista produkuje pewny siebie bałagan. Deep-dive o tym, dlaczego rozwój sterowany specyfikacją odżył w erze agentów, jak wygląda dobra specyfikacja dla agenta i jak faktycznie zmienia się przepływ pracy.

5 min czytania

Ruby 3.5 i stan YJIT oraz ZJIT

Historia JIT Ruby po cichu stała się jedną z najciekawszych rzeczy w języku. Z Ruby 3.5 YJIT jest dojrzały i rozsądnym domyślnym — a nowy JIT oparty na metodach, ZJIT, wyłania się obok niego. Spojrzenie na koniec roku na to, gdzie stoi praca wydajnościowa Ruby i dlaczego posiadanie dwóch podejść JIT to zdrowy znak.

6 min czytania

Projektowanie przepływów z człowiekiem w pętli

Najbardziej niezawodne systemy AI działające produkcyjnie nie są w pełni autonomiczne — utrzymują człowieka przy decyzjach, które mają znaczenie. Ale „człowieka w pętli” łatwo zaprojektować źle: bezmyślne zatwierdzenia, zmęczenie alertami, obwinianie ludzi za błędy modelu. Dogłębna analiza tego, jak podzielić pracę między człowieka a AI, żeby każde robiło to, w czym jest naprawdę dobre.

6 min czytania

pgvector na produkcji: wnioski z praktyki

Nieraz stawałem po stronie pgvectora jako sensownego wyboru domyślnego do wyszukiwania wektorowego. Po jakimś czasie utrzymywania go na produkcji zebrałem to, o czym wprowadzające poradniki milczą: wybór indeksu i jego kompromisy, dostrajanie relacji recall–szybkość, utrzymywanie embeddingów w zgodzie ze źródłem i pułapki operacyjne, które ujawniają się dopiero przy skali.

5 min czytania

AI local-first: uruchamianie modeli na brzegu

Małe modele stały się dość dobre, a urządzenia dość potężne, że uruchamianie AI na własnym sprzęcie użytkownika — telefonie, laptopie, przeglądarce — jest teraz realną opcją. Wpis trendowy o tym, co kupuje AI local-first, co kosztuje i o hybrydowej rzeczywistości, gdzie uczciwą odpowiedzią jest „trochę obu”.

6 min czytania

Bariery i evale dla agentów produkcyjnych

Postawienie agenta na produkcji jest trudniejsze niż pojedyncze wywołanie LLM, bo agent to pętla z pomnożoną powierzchnią awarii — i musisz zarazem ograniczyć go w czasie wykonania i mierzyć go w czasie. Deep-dive o dwóch dyscyplinach, które czynią agentów produkcyjnych godnymi zaufania: barierach ograniczających, co agent może zrobić, i evalach testujących całą trajektorię, nie pojedyncze wyjście.

5 min czytania

Fine-tuning kontra RAG kontra prompting: wybór w 2025

Są trzy sposoby, by skłonić LLM, by robił to, czego twoja aplikacja potrzebuje — prompting, pobieranie i fine-tuning — a zespoły rutynowo sięgają po niewłaściwy. Rozwiązują różne problemy, a koszty różnią się ogromnie. Wpis trendowy o tym, do czego każdy faktycznie służy, i kolejność decyzji, która ratuje cię przed przeinżynierowaniem.

6 min czytania

Ruby 3.4 i długa droga do zamrożonych literałów łańcuchowych

Ruby 3.4 robi ostrożny krok ku zmianie tworzonej od dekady: uczynieniu literałów łańcuchowych zamrożonymi domyślnie. Mechanizm przejścia — „schłodzone” łańcuchy, które ostrzegają zamiast łamać — to mała lekcja mistrzowska ewolucji języka bez łamania świata. Spojrzenie na to, dlaczego zamrożone łańcuchy i jak Ruby dochodzi tam łagodnie.

7 min czytania

Wyszukiwanie wektorowe na dużą skalę: pgvector kontra dedykowane bazy wektorowe

Gdy wyszukiwanie semantyczne przerośnie testowy zbiór danych, pojawia się pytanie: zostać przy pgvector w Postgresie, czy przejść na dedykowaną bazę wektorową, taką jak Pinecone, Qdrant czy Weaviate? Szczegółowo o tym, co naprawdę zmienia się w dużej skali, z czego rezygnujesz, opuszczając Postgres, i jak podjąć decyzję bez przeinżynierowania.

6 min czytania

Self-hosting otwartych LLM: Llama i przyjaciele

Modele o otwartych wagach, takie jak Llama 2 i Mistral, sprawiają, że sprawnego LLM można dziś uruchomić na własnej infrastrukturze zamiast korzystać z czyjegoś API. Spojrzenie na to, po co w ogóle to robić — prywatność, koszt, kontrola — jaki jest realny koszt operacyjny i uczciwe pytanie, czy w ogóle warto.

5 min czytania

Ruby 3.3: YJIT przyspiesza, a Prism przepisuje parser

Nagłówkiem Ruby 3.3 jest szybszy, dojrzalszy YJIT — ale cichszą, bardziej brzemienną zmianą jest Prism, nowy parser tolerujący błędy, który staje się standardem. Spojrzenie na to, co jest w tegorocznym świątecznym wydaniu, co dostajesz za darmo i dlaczego nowy parser ma większe znaczenie, niż brzmi.

6 min czytania

Function calling: pozwól modelowi używać twoich narzędzi

Function calling pozwala LLM-owi poprosić twój kod o uruchomienie funkcji i skorzystanie z wyniku — model, który umiał tylko mówić, zaczyna wyszukiwać dane i działać. Szczegółowo o tym, jak to naprawdę działa, dlaczego to po prostu ustrukturyzowany output z pętlą dookoła i dlaczego to ty w pełni kontrolujesz, co się faktycznie uruchamia.

6 min czytania

Ewaluacja wyjścia LLM: testy dla niedeterministycznego kodu

Nie możesz asertować dokładnej równości na wyjściu, które za każdym razem jest inne — więc jak w ogóle testować funkcję LLM? Deep-dive o evalach: budowaniu reprezentatywnego zbioru testowego, ocenianiu właściwości zamiast łańcuchów, łapaniu regresji i traktowaniu ewaluacji jako siatki bezpieczeństwa, która pozwala zmieniać prompty z pewnością.

6 min czytania

Strumieniowanie odpowiedzi LLM z Turbo Streams

Wywołanie LLM trwa sekundy, a użytkownik gapiący się na spinner czuje każdą z nich. Strumieniowanie tokenów w miarę ich generowania zamienia martwe oczekiwanie w żywy tekst — a Turbo Streams to dokładnie ten prymityw Railsów, który wypycha ten tekst na stronę. Deep-dive o podłączeniu wolnego wyjścia modelu do responsywnego UI.

4 min czytania

Ruby 3.1: YJIT ląduje i nowy debugger

Ruby 3.1 przybywa w Boże Narodzenie z YJIT — nowym JIT od Shopify, który wreszcie przyspiesza realne obciążenia Rails, nie tylko benchmarki — plus nowoczesny debugger, lepsze komunikaty błędów i wygodną składnię. Praktyczny przegląd.

5 min czytania

Zasady SOLID w systemie tradingowym

SOLID może brzmieć jak zbiór pustych akronimów, dopóki system nie urośnie na tyle, żeby ukarać cię za ich ignorowanie. Opowieść z praktyki o zastosowaniu tych pięciu zasad w systemie tradingowym — gdzie każda z nich naprawdę się sprawdziła, a dogmatyczne trzymanie się ich tylko by zaszkodziło.

5 min czytania

Pipeline'y CI/CD, które nie flakują

Pipeline CI jest użyteczny tylko, jeśli mu ufasz — a flakujący jest gorszy niż żaden, bo uczy zespół ignorować czerwone. Przewodnik po budowie pipeline'ów, które są szybkie, deterministyczne i godne zaufania, aż do deployu.

5 min czytania

TypeScript dla rubistów

Programiści Ruby kochają typowanie dynamiczne — więc dlaczego TypeScript jest wart uwagi? Deep-dive o stopniowym typowaniu statycznym dla JavaScriptu, co łapie, gdzie pomaga najbardziej i jak rubista powinien myśleć o typach na froncie.

4 min czytania

Ruby 2.6: podgląd JIT i nieskończone zakresy

Ruby 2.6.0 ukazuje się w Boże Narodzenie z pierwszym krokiem ku kompilatorowi JIT — dużą sprawą dla przyszłości Ruby — plus nieskończone zakresy, then jako alias dla yield_self i Bundler w bibliotece standardowej. Praktyczny przegląd.

5 min czytania

GraphQL w Ruby: API od schematu

GraphQL pozwala klientowi poprosić dokładnie o dane, których potrzebuje, rozwiązując over- i under-fetching REST. Deep-dive o graphql-ruby — typy, zapytania, mutacje, resolvery — pułapka N+1, którą tworzy, i uczciwe spojrzenie na GraphQL vs REST.

5 min czytania

Wydajność Postgresa: indeksy, których ci brakuje

Większość wolnych zapytań jest o jeden brakujący indeks od szybkości. Deep-dive o poprawnym indeksowaniu Postgresa — co indeksować, kolejność kolumn w indeksie złożonym, indeksy częściowe i pokrywające, czytanie EXPLAIN i znajdowanie indeksów, których nie masz (oraz usuwanie tych, których nie używasz).

4 min czytania

Wgrywanie plików z ActiveStorage

Rails 5.2 wreszcie umieszcza wgrywanie plików we frameworku z ActiveStorage. Przegląd tego, jak działa — bloby, załączniki, backendy usług, warianty i bezpośrednie uploady — oraz uczciwe porównanie z CarrierWave i Paperclip.

4 min czytania

Ruby 2.5: rescue w blokach i szybszy boot

Ruby 2.5.0 ląduje w Boże Narodzenie z garścią praktycznej ergonomii — rescue/ensure wprost w blokach do/end, yield_self, Hash#slice — plus szybszy start i przekazywanie bloków. Praktyczny przegląd.

5 min czytania

Projektowanie checkoutu, który konwertuje

Checkout to miejsce, gdzie sklep zyskuje lub traci sprzedaż, a większość koszyków jest tam porzucana. Deep-dive o inżynierii i UX wysoko konwertującego checkoutu — mniej kroków, checkout gościa, uczciwa walidacja i tarcie, które po cichu kosztuje cię zamówienia.

5 min czytania

ES6 dla programistów Rails

Jeśli twoja wiedza o JavaScripcie zatrzymała się na jQuery, nowoczesny JavaScript (ES6) wyda się zaskakująco bliski Ruby. Przegląd funkcji, które mają znaczenie — let/const, funkcje strzałkowe, destrukturyzacja, klasy, moduły i promise'y — oczami rubisty.

4 min czytania

Ruby 2.4: ujednolicony Integer i szybsze hashe

Ruby 2.4.0 przybywa w Boże Narodzenie z dawno spóźnionym porządkiem — Fixnum i Bignum scalone w jeden Integer — plus szybszy Hash, Enumerable#sum, Regexp#match? i binding.irb. Praktyczny przegląd.

5 min czytania

Refaktoryzacja ku heksagonalnym Railsom

Rails to świetny mechanizm dostarczania i kiepskie miejsce na logikę biznesową. Deep-dive o architekturze heksagonalnej w Railsach — porty i adaptery, izolacja domeny od frameworka i jak daleko to ciągnąć, zanim stanie się przeinżynierowaniem.

5 min czytania

Architektura SASS: od spaghetti do design systemu

SASS daje ci moc; architektura jest tym, co powstrzymuje cię przed jej nadużywaniem. Deep-dive o strukturyzowaniu arkuszy stylów tak, by się skalowały — tokeny projektowe, wzorzec 7-1, BEM, zarządzanie specyficznością i myślenie komponentami zamiast stronami.

4 min czytania

Deploye Capistrano bez łez

Capistrano automatyzuje wdrożenie po SSH z atomowymi releasami i rollbackiem na jedną komendę. Praktyczny przewodnik po modelu releases/current, plikach współdzielonych, łańcuchu zadań Rails, konfiguracji multistage i pułapkach wartych poznania.

5 min czytania

Zadania w tle z Sidekiq i Redis

Sidekiq przetwarza zadania w tle wątkami i Redisem, i jest szybki — ale szybkość przychodzi z regułami. Deep-dive o tym, jak działa, dlaczego twoje zadania muszą być małe i idempotentne i jak przeżyć ponawiania oraz współbieżność.

4 min czytania

Ruby 2.2: inkrementalny GC i GC symboli

Ruby 2.2.0 przybywa w Boże Narodzenie z dwoma usprawnieniami garbage collectora ważnymi dla realnych aplikacji — inkrementalnym GC skracającym pauzy i GC symboli, który wreszcie zamyka długotrwały wyciek pamięci i wektor ataku DoS.

4 min czytania

Blog programisty z Jekyllem i GitHub Pages

Dlaczego strona statyczna to właściwe narzędzie na blog programisty i jak zbudować go z Jekyllem oraz hostować za darmo na GitHub Pages — front matter, layouty Liquid, posty w Markdownie i pisanie w tym samym workflow, którego już używasz do kodu.

5 min czytania

Dowodzenie flotą EC2 z konsoli

Klikanie po konsoli AWS nie skaluje się poza garstkę serwerów. Jak sterujemy flotą EC2 z Ruby — deklarując instancje jako dane, uzgadniając stan pożądany z faktycznym i tagując się ku zdrowiu psychicznemu.

7 min czytania

Własny, szyfrowany pęk kluczy do haseł w Ruby

Weekendowy projekt: maleńki sejf na hasła z linii poleceń oparty na Ruby i OpenSSL. Rzetelny przegląd wyprowadzania kluczy, IV, szyfrowania z uwierzytelnieniem, porównania w czasie stałym — i każdego sposobu, w jaki da się kryptografię po cichu i z pewnością siebie zepsuć.