Tak jak zapowiadałem - ten wątek jest po części rozwinięciem tego wątku:
https://4programmers.net/Forum/Nietuzinkowe_tematy/367302-java_java_i_co_dalej?page=1
Niestety będzie dużo czytania, ale to efekt tego, że starałem się żeby to było zrozumiale opisane.
Chciałem opisać tutaj coś, co wydaje mi się, że nie dla wszystkich zajmujących się oprogramowaniem jest takie oczywiste.
To "coś" to pewnego rodzaju zależności i wiążące się z nimi wymagania oraz ich rezultaty.
Skupiając się może najpierw na wymaganiach odnośnie softu a już bardziej może konkretnie na aplikacjach z GUI
to te wymagania stawiane są co zrozumiałe przez usera końcowego..
Jeśli user zażyczy sobie czegoś to ta aplikacja musi mu tego dostarczyć. Teraz patrząc już z punktu widzenia programisty
to te wymagania idą od najwyższych warstw softu (GUI), poprzez pośrednie (libki), drivery i firmware (najniższa warstwa) aż do sprzętu.
Przykład: user ma telefon z androidem i klika na wybrany filmik w YT. To kliknięcie usera jest przekładane na masę requestów w kolejnych poziomach softu poniżej GUI. Finalnie pewne requesty muszą trafić do sprzętu, bo trzeba przecież jakoś pobrać dane filmiku z netu np. przez wifi, uruchomić w sprzęcie odtwarzanie dźwięku i obrazu userowi.
Upraszczając GUI odwołuje się do jakichś libek graficznych, dźwiękowych i sieciowych a te z kolei do driverów, drivery czasami do firmware a te do sprzętu.
Czyli jest tak, że te wymagania są stawiane przez GUI a wszystko co poniżej musi być podporządkowane tym wymaganiom.
I teraz popatrzmy na wymagania na kolejnych poziomach idąc od najwyższego:
- GUI musi tylko zapewnić userowi user-friendliness i fun
- warstwy poniżej GUI czyli np. biblioteki muszą zapewnić GUI łatwy dostęp do netu, obrazu i dźwięku
- drivery + ewentualnie firmware muszą zapewnić szybki, wydajny dostęp do surowych danych i funkcjonalności sprzętowych
- sprzęt ma zapewnić fizyczny dostęp do pewnych zasobów
A teraz o zależnościach (tu idziemy w drugą stronę czyli od dołu do góry):
- jeśli sprzęt będzie wolny (używanie wolniejszego wifi, wolniejszego procka, pamięci, etc) - wszystko co powyżej będzie wolne
- jeśli drivery + ewentualny firmware będą źle napisane i będzie wolno działać to libki nic na to nie będą w stanie poradzić i będą wolniej działać
- jeśli libki będą źle napisane to GUI będzie wolniejsze
- jeśli GUI będzie źle (np. nieoptymalnie) napisane user będzie niezadowolony
Wniosek nr 1:
Najwięcej zależy od sprzętu, drugie w kolejności są firmware i drivery, dalej libki a na samym końcu GUI.
Wniosek nr 2:
Co do GUI są stawiane najmniejsze wymagania, a najgorzej ma tutaj sprzęt, drivery i firmware więc im niżej (im bliżej sprzętu) tym większa presja i odpowiedzialność na osobach odpowiedzialnych za ich obsługę.
Jak to się przekłada na oczekiwania wobec programistów?
Programista GUI może, ale nie musi starać się zbytnio o wydajność i redukcję zasobożerności swojej apki i jemu tylko wystarczy wiedzieć jak używać dostarczonych mu libek.
Programiści low-level: czyli od firmware, driverów i niektórych libek:
taki programista musi wiedzieć jak gadać ze sprzętem, jak gadać z wyższą warstwą (libki) i jaki to dalej ma wpływ na wyższe warstwy softu aż do GUI. Czyli musi wiedzieć prawie wszystko o sofcie, nawet o tym co ma się dziać w GUI.
Wniosek nr 3:.
Im niżej tym więcej trzeba wiedzieć, więcej pracy poświęcić i bardziej trzeba się starać.
A teraz popatrzmy może na wpływ decyzji osób decyzyjnych. Takie osoby zwykle kierują się tylko:
- $$$ w swojej kieszeni
- numerkami w excelu
- wyglądem apki
Apka ma fajnie wyglądać, dawać userowi fun, ma być tanio i szybko napisana i wrzucona na rynek.
Wszystko pozostałe musi być temu podporządkowane.
Efekty:
Ci od GUI mają wolną rękę co do wyboru języka i środowiska programistycznego. A jeśli przyjrzymy się uważniej to konkretne rezultaty są takie:
- język + środowisko wymagające coraz więcej pamięci => potrzeba więcej RAM i SSD żeby to przechowywać => elektronika potrzebna do tego zużywa więcej prądu
- lagujące język + środowisko => potrzeba szybszego CPU (więcej gigaherców i rdzeni) => większe zużycie prądu
- dłuższy czas startu apki spowodowany koniecznością załadowania większej binarki, bibliotek, etc => większe zużycie prądu
Skoro większy pobór prądu to krócej podziała nam telefon na pojedynczym ładowaniu baterii.
Typowy użytkownik wywnioskuje tylko że trzebaby już kupić nowszego fona bo ten nowszy będzie miał pojemniejszą baterię i być może wytrzyma dłużej na niej.
Żeby sprostać wymaganiom użytkownika producent zrobi tak:
weźmy może nowszą, pojemniejszą baterię ale no nie bądźmy zacofani więc weźmy nowszy sprzęt, więc i weźmy nowszy język, nieważne że jeszcze bardziej zasobożerny niż poprzedni.
I co? I tu się chyba zapętlamy. Wygląda to na samonapędzającą się spiralę oczekiwań, zależności i konsekwencji.
Jakieś konstruktywne refleksje w związku z tym?
Niektórym się może wydawać, że ich sprawa nie dotyczy...
Niektórym programistom może wydawać się, że oni nie mają żadnego wpływu na nakręcanie tej spirali...
Niektórym może się wydawać, że jeśli oni mają komfort w pracy i nie muszą się o zbyt wiele starać jak np. o optymalizację kodu to przecież nic złego się nie stanie...
Niektórym programistom może się wydawać, że jeśli oni mają się dobrze, mają swobodę w wyborze zasobożernych rozwiązań to inni programiści nie mogą przecież przez to mieć przerąbane...
Niektórym się wydaje, że to ja jako twórca apki z GUI jestem najważniejszy bo to dzięki mnie user ma odpowiedni UX...
Niektórym może się wydawać, że tylko ja jako twórca okienkowej apki się liczę a cała reszta nie ma znaczenia...
No tak. Wydaje im się. Źle im się wydaje.
Rezultat jest taki, że to, że jednym zapewnia się komfortowe warunki pracy to w rezultacie powoduje to, że inni mają przerąbane.
A teraz jeszcze z punktu widzenia usera końcowego np. takiego smartfona.
Czy aby na pewno z wydania na wydanie kolejnych wersji telefonów te telefony trzymają się wyraźnie dłużej na baterii pomimo coraz pojemniejszych baterii?
Czy taki smartfon da radę wytrzymać np. 2 tygodnie na jednym ładowaniu?
Proponuję przemyśleć pewne rzeczy na bazie tego to co tu powyżej napisałem.
Ale jeśli to jest w jakikolwiek sposób nadal niezrozumiałe to mogę opisać to w jeszcze bardziej łopatologiczny sposób.