Czy to dlatego, że wszystkie zostały napisane w zarządzanych, odśmiecanych językach zamiast w natywnym kodzie?
Nie. Powolny kod niezależnie od tego będzie działał słabo. Oczywiście, określony język może wprowadzać pewne klasy problemów podczas rozwiązywania innych. Ale dobrzy programiści są w stanie znaleźć obejścia, mając wystarczająco dużo czasu.
Czy to programiści napisali oprogramowanie dla tych urządzeń?
Częściowo. W wielu przypadkach jest to prawdopodobnie co najmniej jeden czynnik. Jest to niefortunny efekt uboczny branży, w której dobrzy programiści są bardzo poszukiwani i mają małą podaż. Również przepaść między różnymi poziomami umiejętności technicznych może być dość duża. Jest więc oczywiste, że czasami programiści, którym powierzono zadanie wdrożenia określonego oprogramowania, mogą pogratulować tylko za jego uruchomienie (w pewnym sensie).
We wszystkich tych przypadkach twórcy aplikacji wiedzieli dokładnie, na którą platformę sprzętową są kierowani i jakie są jej możliwości; czy nie wzięli tego pod uwagę?
Częściowo. Po pierwsze, dokładna platforma sprzętowa prawdopodobnie nie jest znana, ponieważ często jest ona negocjowana równolegle z różnymi producentami podczas opracowywania oprogramowania. W rzeczywistości mogą wystąpić nawet niewielkie (ale niekoniecznie nieznaczne) zmiany w sprzęcie bazowym po początkowej wersji. Zgadzam się jednak, że ogólne możliwości będą znane.
Część problemu polega na tym, że oprogramowanie prawdopodobnie nie jest opracowywane na sprzęcie, odbywa się to w emulatorach. Utrudnia to rozliczenie prawdziwej wydajności urządzenia, nawet jeśli emulatory są w 100% dokładne - a tak nie jest.
Oczywiście nie usprawiedliwia to niewystarczającego testowania odpowiedniego prototypowego sprzętu przed wydaniem. Ta wina prawdopodobnie leży poza kontrolą dev / qa.
Czy to ten facet, który krąży w kółko powtarzając: „optymalizacja jest źródłem wszelkiego zła”, czy sprowadził ich na manowce?
Nie. Jestem pewien, że i tak go nie słuchają; w przeciwnym razie nie byłby tak często cytowany (to powinna być „ przedwczesna optymalizacja ...”). :-RE
Bardziej prawdopodobne jest, że zbyt wielu programistów przyjmuje jedną z 2 skrajności w zakresie optymalizacji.
- Albo zignorują to całkowicie.
- Lub mają obsesję na punkcie drobiazgów, które nie mają nic wspólnego z rzeczywistymi wymaganiami wydajności. W efekcie budżet się kończy, a kod jest zbyt zaciemniony, aby bezpiecznie zoptymalizować rzeczywiste problemy z wydajnością.
Czy to mentalność „och, to tylko dodatkowe 100 ms” za każdym razem, aż wszystkie milisekundy sumują się w minutach?
Możliwie. Oczywiście, jeśli Sleep(100)
został użyty jako odpowiednik bibuły stosowanej do spowolnienia krwawienia zerwanej kończyny - należy się spodziewać problemów. Podejrzewam jednak, że problem jest bardziej subtelny.
Chodzi o to, że nowoczesny sprzęt komputerowy (w tym urządzenia wbudowane) jest znacznie szybszy, niż ludzie się im przypisują. Większość ludzi, nawet „doświadczonych” programistów, nie docenia szybkości komputerów. 100ms to długi czas - bardzo długi czas . I tak się składa, że ten „bardzo długi czas” tnie na dwa sposoby:
- Po pierwsze, programiści niepotrzebnie martwią się tym, co komputer robi wyjątkowo szybko. (Zdarza się, że właśnie taka troska o „ zwiększenie wartości 300 razy na sekundę ” doprowadziła mnie tutaj.)
- Drugim jest to, że czasami nie okazują należytej troski, gdy rzeczy zajmują bardzo dużo czasu (w skali czasowej obliczeń). Więc:
- jeśli zignorują skutki opóźnienia podczas komunikacji przez sieć lub urządzenie pamięci masowej;
- jeśli zignorują wpływ wątku zablokowanego i czekają na inny wątek;
- jeśli zapomną o tym, ponieważ komputery działają tak szybko, bardzo często są w stanie powtarzać zadania znacznie częściej niż powinny, bez wiedzy dewelopera o problemie
- ... jeśli wystąpi jakakolwiek kombinacja takich niedopatrzeń, procedura niespodziewanie zadziała bardzo wolno (w skali czasowej obliczeń). Kilka powtórzeń i będzie to nawet zauważalne przez ludzi - ale może być trudne do ustalenia, ponieważ setki powiązanych ze sobą rzeczy szybko działają same.
Czy to moja wina, że kupili te produkty w pierwszej kolejności?
Tak, zdecydowanie. Cóż, nie ty osobiście, ale ogólnie konsumenci. Produkty są sprzedawane (i kupowane ) według list kontrolnych funkcji. Zbyt niewielu konsumentów wymaga lepszej wydajności.
Aby zilustrować mój punkt widzenia: kiedy ostatni raz chciałem kupić telefon komórkowy, sklep nie mógł nawet zaoferować modelu demonstracyjnego do zabawy w sklepie. Wszystko, co mieli, to plastikowe skorupy z naklejkami pokazujące, jak będzie wyglądał ekran. Nie możesz nawet poczuć takiej wagi - nie mówiąc już o wydajności lub użyteczności. Chodzi mi o to, że jeśli wystarczająca liczba osób sprzeciwi się temu modelowi biznesowemu i zagłosuje swoimi portfelami, aby wyrazić swój sprzeciw, stanowimy jeden mały krok we właściwym kierunku.
Ale oni nie, więc nie jesteśmy; i co roku nowe telefony komórkowe działają wolniej na szybszym sprzęcie.
(Pytania nie zadawane.)
- Czy winni są ludzie marketingu? Częściowo. Potrzebują dat wydania. A kiedy pojawia się wspomniana data, wybór między „uruchom ją” a „przyspiesz” nie jest żadnym problemem.
- Czy winni są sprzedawcy? Częściowo. Chcą więcej funkcji na liście kontrolnej. Przeszukują listy funkcji i ignorują wydajność. Niekiedy składają nierealne obietnice.
- Czy winni są menedżerowie? Częściowo. Niedoświadczeni menedżerowie mogą popełniać wiele błędów, ale nawet bardzo doświadczeni menedżerowie mogą (całkiem słusznie) poświęcić czas na rozwiązanie problemów z wydajnością na rzecz innych problemów.
- Czy winni są specyfikacje? Częściowo. Jeśli coś pozostanie poza specyfikacją, o wiele łatwiej o tym później „zapomnieć”. A jeśli nie jest to wyraźnie określone, jaki jest cel? (Chociaż osobiście uważam, że jeśli zespół jest dumny ze swojej pracy, mimo wszystko martwią się wydajnością).
- Czy winą jest edukacja? Może. Edukacja prawdopodobnie zawsze będzie się opierać. Z pewnością nie podoba mi się „edukacja”, która szybko wypuszcza początkujących z powierzchownym zrozumieniem tworzenia oprogramowania. Jednak edukacja poparta teorią i wpajająca kulturę uczenia się nie może być zła.
- Czy aktualizacje są winne? Częściowo. Nowe oprogramowanie, stary sprzęt naprawdę kusi los. Nawet przed wydaniem wersji X planuje się X + 1. Nowe oprogramowanie jest kompatybilne, ale czy stary sprzęt jest wystarczająco szybki? Czy zostało przetestowane? Szczególna poprawka wydajności może zostać wprowadzona do nowego oprogramowania - zachęcając do niewłaściwej aktualizacji oprogramowania.
Zasadniczo uważam, że istnieje wiele czynników. Więc niestety nie ma srebrnej kuli, aby to naprawić. Ale to nie znaczy, że jest to los i mrok. Istnieją sposoby na poprawę sytuacji.
Więc w którym momencie coś poszło nie tak z tymi produktami?
IMHO tak naprawdę nie możemy zidentyfikować żadnego pojedynczego punktu. Istnieje wiele czynników, które ewoluowały w czasie.
- Liczniki fasoli: redukcja kosztów, czas na rynku. Ale czy znowu dokonalibyśmy postępów, które osiągnęliśmy bez presji?
- Wysoki popyt i niska podaż wykwalifikowanych pracowników w branży. Nie tylko programiści, ale także menedżerowie, testerzy, a nawet sprzedawcy. Brak umiejętności i doświadczenia prowadzi do błędów. Ale znowu prowadzi to również do nauki.
- Najnowocześniejsza technologia. Dopóki technologia nie dojrzeje, będzie regularnie gryźć w nieoczekiwany sposób. Ale z drugiej strony często zapewniało to szereg korzyści.
- Złożona komplikacja. Z biegiem czasu branża ewoluowała: dodając więcej narzędzi, technologii, warstw, technik, abstrakcji, sprzętu, języków, odmian, opcji. To w pewien sposób uniemożliwia „pełne” zrozumienie nowoczesnych systemów. Jednak w rezultacie jesteśmy w stanie zrobić znacznie więcej w znacznie krótszym czasie.
Co my, programiści, możemy zrobić, aby uniknąć zadawania bólu naszym klientom?
Mam kilka sugestii (zarówno technicznych, jak i nietechnicznych), które mogą pomóc:
- W najprostszy możliwy sposób - użyj własnego produktu. Nie ma to jak doświadczenie z pierwszej ręki, które ujawnia rzeczy, które są niezręczne, wolne lub niewygodne. Będziesz jednak musiał świadomie unikać omijania braków z powodu „wiedzy poufnej”. Np. Jeśli nie masz problemów z synchronizacją kontaktów, ponieważ robisz to ze backdoorowym skryptem Python - nie używasz „produktu”. Co powoduje kolejny punkt ...
- Słuchaj swoich użytkowników (najlepiej z pierwszej ręki, ale przynajmniej z drugiej ręki poprzez wsparcie). Wiem, że programiści (ogólnie) wolą pozostać w ukryciu i unikać interakcji międzyludzkich; ale to nie pomaga odkryć problemów, z jakimi spotykają się inni ludzie podczas korzystania z Twojego produktu. Np. Możesz nie zauważyć, że opcje menu są wolne, ponieważ znasz wszystkie skróty i używasz ich wyłącznie. Nawet jeśli instrukcja w pełni dokumentuje wszystkie skróty, niektóre osoby nadal będą preferować menu - mimo że są zbyt wolne.
- Staraj się stale doskonalić umiejętności i wiedzę techniczną. Rozwijaj umiejętność krytycznej analizy wszystkiego, czego się nauczysz. Regularnie ponownie ocenia swoją wiedzę. W niektórych przypadkach przygotuj się na zapomnienie tego, co myślałeś, że wiesz. Co powoduje ...
- Niektóre technologie / techniki mogą być bardzo trudne, co prowadzi do subtelnych nieporozumień i nieprawidłowych implementacji. Inne w wyniku ewolucji powszechnej wiedzy lub dostępnych narzędzi mogą popaść w nie lub nie (np. Singletony). Niektóre tematy są tak podstępne, że rodzą masę „hokus-pokusów”, które rozprzestrzeniają ogromną ilość dezinformacji. Moim szczególnym błędem jest dezinformacja dotycząca wielowątkowości. Dobra wielowątkowa implementacja może znacznie poprawić wrażenia użytkownika. Niestety, wiele źle poinformowanych podejść do wielowątkowości znacznie obniży wydajność, zwiększy liczbę błędnych błędów, zwiększy ryzyko martwej blokady, skomplikuje debugowanie itp. Pamiętaj więc: tylko dlatego, że powiedział to „ekspert”, nie jest prawdą.
- Przejąć na własność. (Nie, serio, nie gram w bingo w sali konferencyjnej.) Negocjuj z menedżerami, właścicielami produktów, sprzedawcami, aby uzyskać informacje o funkcjach wydajności, które mają pierwszeństwo przed niektórymi elementami listy kontrolnej. Wymagaj lepszych specyfikacji. Nie dziecinnie, ale zadając pytania, które skłaniają ludzi do myślenia o wydajności.
- Bądź wymagającym konsumentem. Wybierz telefon, który ma mniej funkcji, ale jest szybszy. (Nie szybszy procesor, szybszy interfejs użytkownika.) Więc chwal się tym ! Im więcej konsumentów zacznie wymagać wydajności, tym więcej liczników fasoli rozpocznie budżetowanie.