Diabeł pewnie nie używa takich niemożliwych wideł jak na ilustracji, ale z pewnością czepia się drobiazgów w umowie kupna-sprzedaży jeśli chodzi o duszę klienta. Ale skupmy się raczej na detalach. Czasem to właśnie małe drobiazgi decydują o tym, czy coś jest genialne, czy tylko przeciętne. W wielu branżach „szczegóły” to nie kaprys perfekcjonistów - to podstawa jakości, efektywności i stylu. Ale są też takie dziedziny, gdzie można przymknąć oko i nic się nie stanie. Spójrzmy na trzy choć trochę pokrewne przykłady: montaż filmowy, programowanie i… druk wielkoformatowy.
W montażu filmowym szczegół to czasem dosłownie kwestia jednej klatki. Źle przycięta scena, nieco za długa pauza, albo cięcie w złym miejscu może zaburzyć rytm narracji, zepsuć napięcie lub wręcz wyrwać widza z historii. Przykład? Scena z emocjonalnym dialogiem - jeśli montażysta zostawi reakcję aktora sekundę za długo, dramat zamienia się w niezręczność. Oczywiście, zawsze reżyser ma ostatnie słowo, ale żaden z nich nie będzie ignorować uwag fachowca od montażu.
Ale że różnica jednej klatki? Niby na co może wpłynąć tak mała ilość czasu? Ano może. Choćby na to, że inaczej odbieramy wzrokiem a inaczej słuchem. Czasami idealnie zsynchronizowany obraz do dźwięku daje wrażenie wręcz odwrotne, ale wystarczy przesunąć obraz o klatkę wcześniej i nagle wszystko wraca do porządku. Nie jest to sztywna reguła, ale jeśli coś nie gra, to można spróbować tej sztuczki. Druga rzecz to dźwięk mowy i obraz mówcy, niby przesunięcie do dwóch-trzech klatek jest nie zauważalne, ale jeśli ktoś mówi bardzo wyraźnie i mocno akcentuje początki i końce słów, nawet różnica jednej klatki może być widoczna.
Dobry montażysta to ktoś, kto wie nie tylko co się pokazuje, ale kiedy i jak długo, i że robi to dużą różnicę. To właśnie dbałość o tempo, pauzy we właściwych miejscach i właściwej długości, rytm montażu decyduje, czy widz wsiąknie w film, czy zacznie ziewać. Oczywiście, jest to wysoce subiektywne, ale każde dzieło artystyczne jest subiektywne. Inaczej jest tylko produktem klonowania lub naśladownictwa.
Myślę, że każdy zna przykład źle zmontowanych scen z własnego życia. Porównajmy "rozmowę" poprzez komunikator lub sms-y i normalny kontakt, że tak określę, face2face. Nic się nie stanie, jeśli odpowiemy na wiadomość po paru minutach lub nawet dniach, jakoś się ta komunikacja toczy. Jednak trudno sobie wyobrazić takie zawieszenie rozmowy przy stole w restauracji, o ile nie jest spowodowane spożywaniem posiłku. Pierwszy przykład to właśnie źle zmontowany rytm, rozmowa wprawdzie istnieje, ale w sumie żadna ze stron biorących udział nie jest zaangażowana w to, by ją kontynuować. Tak samo chętnie ogląda się źle zmontowany film.
Zdarzają się przypadki, kiedy nawet geniusz nie jest w stanie poprawnie złożyć sceny. Po prostu podczas nagrywania materiału nikt nie zauważył, że postać na planie trzyma szklankę w lewej ręce, a na dokrętce już w prawej. No cóż, zdarza się. I tak naprawdę całkiem często, wystarczy uważnie oglądać filmy, by wychwycić takie małe potknięcia. Stron czy kanałów w mediach społecznościowych typu "Movie Mistakes" jest pełno, czasem pokazują naprawdę "grubaszne" błędy
A tytułowe 3 klatki? Te są zaczerpnięte z wypowiedzi Stevena Spielberga na temat montażu filmu "Szczęki". Po prostu sztuczny rekin wyglądał dobrze tylko w kilku klatkach, ale Spielberg bardzo chciał by ich było więcej, bo się bardzo napracowali by je zrobić. Na szczęście posłuchał montażystki :-)
Pisząc "klatka", mam oczywiście na myśli najmniejszą jednostkę czasu występującą w filmie. Wszelkie uwagi w tym artykule dotyczą "klasycznych" prędkości, czyli 24 lub 25 klatek na sekundę. W przypadku wyższych prędkości wszelkie uwagi na temat przesunięć można odpowiednio pomnożyć. O występowaniu czegoś takiego jak półobrazy to może kiedy indziej.
W programowaniu detale są równie ważne jak w filmie, choć nie są tak widoczne. Kod który „działa” nie zawsze znaczy „działa dobrze”. Spójrzmy na prosty przykład: ( oczywiście to tylko przykład i do tego wręcz prymitywny, ale coś trzeba pokazać...)
def contains_number(nums, target):
return target in sorted(nums)Ten kod najpierw sortuje całą listę "nums", by sprawdzić, czy "target" się w niej znajduje. Niby działa, ale niepotrzebnie obciąża system - szczególnie przy dużych listach, ponieważ sortuje całą listę przed każdym jej przeszukaniem. To jakby przed wyjęciem skarpetek z szuflady najpierw je poukładać kolorami, a potem dopiero wybrać czarne. Zakładamy również, że posortowane skarpetki za każdym razem po zamknięciu szuflady natychmiast zmieniają swoje położenie. Co akurat , w przypadku skarpetek, jest całkowicie zrozumiale. Skarpetki to takie byty, że potrafią się schować w pralce na pół roku, i pojawić się w momencie kiedy druga z pary została wyrzucona. Ale wracając do sedna, czas i energia poświęcone na każdorazowe sortowanie przed wybraniem pojedynczej pozycji jest marnotrawstwem. Zwłaszcza kiedy lista "nums" zawierała by tysiące pozycji.
Lepiej by było podstawić do funkcji już posortowaną listę.
def contains_number(nums_set, target):
return target in nums_setDrobne detale w strukturze danych, pętlach, czy cache’owaniu mogą robić kolosalną różnicę. Diabeł siedzi w tych kilku linijkach, których nikt nie chce czytać po deadline’ie. Niby drobne detale, ale w skali tysięcy zapytań to różnica między stabilnym serwerem a płonącą serwerownią. A tak tylko dla uzupełnienia całości, wcale nie trzeba sortować przed sprawdzeniem, przecież niezależnie od stopnia chaosu w położeniu skarpetek w szufladzie, od razu widać czy czarne są lub nie są obecne. Choć zaczynam wątpić w dobór właściwego przykładu, bo jednak skarpetki to jakieś takie istoty tajemne, potrafiące w dziwny sposób zmieniać nie tylko położenie, ale i stopień widoczności. O innych właściwościach nawet nie chcę wiedzieć.
Są jednak branże, gdzie szczegóły nie są aż tak ważne. Weźmy dla kontrastu druk wielkoformatowy. Plakat na billboardzie przy autostradzie? Baner wiszący na 10. piętrze budynku? Tutaj szczegóły mają zupełnie inny priorytet. Nikt nie podchodzi do nich z lupą - są projektowane z myślą o oglądaniu z kilku (albo kilkudziesięciu) metrów. Pojedyncze piksele, minimalne przekłamania kolorystyczne, czy drobne przesunięcia - nie mają praktycznego znaczenia. Z dystansu wszystko się zlewa, a liczy się kompozycja, kontrast i czytelność przekazu. W tym przypadku: mniej znaczy więcej, a szczegóły mogą spokojnie poczekać na druk w czasopiśmie czy na ulotce.
W przypadku outdooru najważniejsze jest takie dobranie układu projektu graficznego, by jak najbardziej uwypuklić najważniejsze hasła. OK, zdarzają się klienci, którzy na jednym banerze muszą koniecznie zmieścić nie tylko nazwę produktu i jego obraz, ale również listę punktów sprzedaży, ich godziny otwarcia, średnią cenę z minionych 30 lat, kilkanaście pomniejszych zdjęć swoich placówek i sam już nie wiem co jeszcze. I to z pełną świadomością, że baner będzie umieszczony przy drodze, gdzie czas na zauważenie treści to średnio kilka sekund. Po prostu siedząc przy monitorze, jest dla nich na projekcie wszystko widoczne, i nijak nie można wytłumaczyć, że rzeczywistość jednak jest zupełnie inna.
Swoją drogą raz zdarzył się kiedyś osobnik, który po banerze, wielkości 40x15 metrów rozłożonym na hali, przesuwał się na kolanach, twierdząc, że widać miejscami paski, spowodowane zapchaną dyszą drukarki. To się akurat zdarza czasem, ale naprawdę wyglądało to na dowcip. Mimo wszystko, nie. No cóż, trudno wytłumaczyć, że przy tej wielkości wydruku i odległości z jakiej będzie oglądany, nawet dziura średnicy pól metra by była ledwo zauważalna. No może przesadzam, ale wiadomo o co chodzi.
Kluczem jest świadomość kontekstu. Tam, gdzie detal wpływa na doświadczenie odbiorcy (film, aplikacja, gra), warto być skrupulatnym.
Ale tam, gdzie odbiorca i tak nie zauważy różnicy (druk wielkoformatowy, może czasem frontend MVP, choć tu warto dążyć do wysokiej funkcjonalności), lepiej dopracować kompleksowo całość niż skupiać się na nieistotnych w tym momencie detalach.
Bo choć diabeł tkwi w szczegółach - nie zawsze trzeba z nim walczyć.