W wolnym czasie buduję grę na Androida. Korzysta z biblioteki libgdx, więc trochę ciężkiego podnoszenia jest dla mnie zrobione.
Podczas opracowywania niedbale wybrałem typy danych dla niektórych procedur. Użyłem hashtable, ponieważ chciałem czegoś zbliżonego do tablicy asocjacyjnej. Kluczowe wartości czytelne dla człowieka. W innych miejscach, aby osiągnąć podobne rzeczy, używam wektora. Wiem, że libgdx ma klasy vector2 i vector3, ale nigdy ich nie użyłem.
Kiedy napotykam dziwne problemy i szukam pomocy w przepełnieniu stosu, widzę, że wiele osób po prostu rozmyśla o pytaniach, które wykorzystują określony typ danych, gdy inny jest technicznie „właściwy”. Jak użycie ArrayList, ponieważ nie wymaga zdefiniowanych granic w porównaniu z ponownym zdefiniowaniem int [] z nowymi znanymi granicami. Lub nawet coś tak trywialnego:
for(int i = 0; i < items.length; i ++)
{
// do something
}
Wiem, że ocenia item.length na każdej iteracji. Jednak wiem też, że przedmioty nigdy nie będą miały więcej niż 15 do 20 przedmiotów. Czy powinno mnie to obchodzić, jeśli oceniam item.length przy każdej iteracji?
Przeprowadziłem kilka testów, aby zobaczyć, jak działa aplikacja przy użyciu metody, którą właśnie opisałem, w porównaniu z właściwą, postępuj zgodnie z samouczkiem i używaj dokładnych typów danych sugerowanych przez społeczność. Rezultaty: To samo. Średnio 45 fps. Otworzyłem każdą aplikację na karcie telefonu i galaktyki. Bez różnicy.
Sądzę więc, że moje pytanie brzmi: czy istnieje próg, kiedy nie ma już znaczenia, aby być poprawnym? Czy można powiedzieć, że „dopóki wykona zadanie, to mnie to nie obchodzi?”
źródło
Odpowiedzi:
Piszesz program, aby rozwiązać problem. Problemowi temu towarzyszy określony zestaw wymagań do jego rozwiązania. Jeśli te wymagania zostaną spełnione, problem zostanie rozwiązany i cel zostanie osiągnięty.
Otóż to.
Powodem, dla którego przestrzegane są najlepsze praktyki, jest to, że niektóre wymagania dotyczą konserwacji, testowalności, gwarancji wydajności i tak dalej. W rezultacie masz tych nieznośnych ludzi, jak ja, którzy wymagają takich rzeczy, jak odpowiedni styl kodowania. Nie wymaga to dużo więcej wysiłku, aby przekroczyć swoje T i kropić twoje I, i jest to gest szacunku dla tych, którzy muszą przeczytać twój kod później i dowiedzieć się, co on robi.
W przypadku dużych systemów ten rodzaj ograniczenia i dyscypliny jest niezbędny, ponieważ musisz dobrze bawić się z innymi, aby wszystko działało, i musisz zminimalizować dług techniczny, aby projekt nie upadł pod własnym ciężarem.
Na przeciwległym końcu spektrum znajdują się te jednorazowe narzędzia, które piszesz, aby rozwiązać konkretny problem w tej chwili, narzędzia, których już nigdy nie użyjesz. W takich przypadkach styl i najlepsze praktyki są całkowicie nieistotne; zhakujesz coś razem, uruchom go i zacznij następną rzecz.
Tak więc, podobnie jak w przypadku wielu rzeczy w rozwoju oprogramowania, to zależy.
źródło
Jest stary mądry cytat: „Nie podążaj śladami dawnych mędrców. Szukaj tego, czego szukali”. Istnieją powody dla wszystkich zasad „właściwego” kodowania. Wiedza, dlaczego te reguły istnieją, jest ważniejsza niż wiedza o tych regułach.
Istnieje reguła, że nie należy umieszczać testu, który można wielokrotnie obliczać w takiej pętli for. W przypadkach, w których reguła została wymyślona w celu naprawy (gdzie wydajność byłaby naprawdę inna), ma to sens. W takim przypadku jest tylko jedna prawidłowa odpowiedź. W twoim przykładzie wiadomo, że nie ma różnicy w wydajności i że nie może być więcej niż kilkadziesiąt iteracji. W tym przypadku istnieją dwie poprawne odpowiedzi, albo zastosować regułę i tak, ponieważ jest to proste i nic nie zaszkodzi i może pomóc w kształtowaniu dobrych nawyków, lub zignorować regułę, ponieważ nie ma się o co martwić różnicą wydajności.
Wolę pierwszą właściwą odpowiedź, a ty wydaje się, że wolisz drugą. Nie mylisz się co do tego. Myślę, że mylisz się co do tego, na czym polega „właściwe” programowanie. Nie chodzi o przestrzeganie losowo wybranego zestawu reguł, które ci nie pomagają i nie mają żadnego celu. Nie naprawienie pętli for w tym przykładzie jest zgodne z bardzo dobrą regułą przed przedwczesną optymalizacją.
Prawdziwe prawidłowe programowanie polega na przestrzeganiu dobrych zasad, które mają sens w inteligentny sposób.
źródło
Właściwym sposobem na to jest zmniejszenie zysków: porównanie dodatkowej korzyści z rozwoju programu z kosztami dodatkowego rozwoju.
Zmniejszające się zwroty pojawiają się, gdy krańcowa korzyść jest mniejsza niż krańcowy czas / wysiłek.
Czy potrafisz uzasadnić sprawę
items.length
wyjścia zfor
pętli? Z ekonomicznego punktu widzenia, czy ta zmiana może nawet usprawiedliwić czas poświęcony na jej uzasadnienie? Ponieważ nie ma różnicy w doświadczeniu użytkownika, nigdy nie dostaniesz niczego nawet za czas poświęcony na mierzenie (oprócz przydatnej lekcji do zapamiętania). Użytkownikom nie spodoba się program bardziej niż oni, a więcej kopii nie zostanie sprzedanych w wyniku tej zmiany.Nie zawsze jest to łatwe do oszacowania, ponieważ przypadki biznesowe są pełne niewiadomych i zagrożeń, a zatem są podatne na padanie ofiarą nieuwzględnionych czynników, które staną się oczywiste dopiero z perspektywy czasu. Proponowane zmiany mogą być całkowicie nietrywialne, tak że robią dużą różnicę.
Myślenie polegające na zmniejszaniu zysków może oznaczać poszukiwanie wymówek, aby nie podejmować pewnych działań i unikać ryzyka, które z perspektywy czasu może okazać się ciągiem straconych okazji.
Ale czasem jest oczywiste, kiedy czegoś nie robić. Jeśli jakaś część rozwoju wydaje się wymagać cudu ekonomicznego, który miałby nastąpić tylko po to, by pokryć koszty rozwoju (próg rentowności), to prawdopodobnie zły pomysł.
źródło
Kiedy nie powinieneś dbać o to, by kod był „właściwy”
Kiedy pisać właściwy kod?
źródło
Czy wydajność jest Twoim głównym zmartwieniem? Czy to właśnie próbujesz zmaksymalizować?
Jeśli tak, musisz nauczyć się fundamentalnej lekcji, a jeśli to zrobisz, będziesz jednym z niewielu.
Nie próbuj „myśleć”, co powinieneś zrobić, aby przyspieszyć - to zgadywanie. Jeśli pytasz „Czy powinienem użyć tej klasy pojemnika czy tej?” Lub „Czy powinienem wprowadzić
length
warunek pętli?”, Jesteś jak lekarz, który widzi pacjenta i próbuje zdecydować, jakie leczenie zastosować bez przesłuchanie lub badanie pacjenta.To zgadywanie. Wszyscy to robią, ale to nie działa.
Zamiast tego pozwól programowi powiedzieć ci, na czym polega jego problem. Oto szczegółowy przykład.
Czy widzisz różnicę?
źródło
Twoje pytanie brzmi: „tak długo, jak wykona pracę, nie obchodzi mnie to?”
Moja odpowiedź brzmi: „nigdy nie wiesz, co stanie się z twoim kodem”. Brałem udział w wielu projektach, które rozpoczęły się jako „hej, pozwól mi napisać tę szybką rzecz, aby zająć się problemem użytkownika”. Napisz, umieść tam, nigdy więcej o tym nie myśl.
Pewnego razu ta rzecz, którą napisałem, przekształciła się w „och, teraz cały dział użytkownika chce użyć tego kodu”, który zanim mogłem się odwrócić, stał się „cała firma używa tego kodu i teraz muszę udowodnić, że przetrwa audyt na jutro zaplanowano 20-osobowy przegląd kodu, a jakiś wiceprezes sprzedał go już naszym klientom ”.
Zdaję sobie sprawę, że „piszesz grę na Androida w wolnym czasie”, ale nigdy nie wiesz, czy ta gra wystartuje i stanie się przepustką do sławy i fortuny. Co gorsza, ta gra może stać się przepustką do zniesławienia, ponieważ powoduje awarię telefonów użytkowników. Czy chcesz być osobą, która dostaje ofertę pracy, ponieważ czyjeś dzieci nie mogą przestać grać w gry na swoich telefonach, czy też chcesz być osobą, która jest oczerniana na forach dyskusyjnych takich jak ten?
źródło
Odpowiedź jest taka, że to nigdy nie ma znaczenia i zawsze ma znaczenie ...
To nigdy nie ma znaczenia, ponieważ programowanie, właściwe czy nie, jest sposobem na osiągnięcie celu, a nie celem samym w sobie. Jeśli ten cel zostanie osiągnięty bez „właściwego” programowania, co jest w porządku (z perspektywy biznesowej często najlepiej jest, jeśli cel można osiągnąć bez programowania).
Zawsze ma to znaczenie, ponieważ prawidłowe programowanie jest narzędziem, które pomoże ci osiągnąć swoje cele. Właściwy sposób robienia rzeczy to po prostu uznanie, że zrobienie tego w inny sposób powoduje więcej bólu na dłuższą metę niż oszczędza.
Który odpowiada na pytanie, kiedy możesz go zignorować - kiedy masz pewność, że w dłuższej perspektywie łatwiej będzie w inny sposób (być może dlatego, że nie będzie długiej).
Jednorazowe narzędzia są zwykle wykonywane tak szybko i brudnie, jak to tylko możliwe, bez sprawdzania błędów lub sprawdzania poprawności, bez rejestrowania wyjątków, wycinania i wklejania kodu z niewielkimi zmianami lub nawet bez zmian zamiast funkcji ogólnych i tak dalej .
Tylko uważaj: czasami te szybkie i brudne aplikacje nabierają życia, co oznacza, że wszystkie skróty gryzą cię w ...
źródło
W rzeczywistości w końcowym kodzie item.length nie będzie obliczany w każdej iteracji, ponieważ kompilator go optymalizuje. I nawet gdyby tak nie było, długość jest polem publicznym w obiekcie tablicy; dostęp do niego nie kosztuje.
To naprawdę zależy od tego, czego oczekujesz od produktu końcowego; różnica między przeciętnym produktem a doskonałym produktem zależy od szczegółów. Samochód taki jak Tata Nano i samochód taki jak Mercedes S „wykonuje robotę” - zabiera cię z jednego miejsca do drugiego. Różnica polega na szczegółach: mocy silnika, komforcie, bezpieczeństwie i innych. Tak samo jest z każdym istniejącym produktem, w tym z oprogramowaniem; na przykład dlaczego ktokolwiek miałby płacić Oracle, IBM lub Microsoft za bazy danych Oracle, DB2 lub MS SQL Server, skoro MySQL i Postgre są bezpłatne?
Jeśli chcesz zwrócić uwagę na szczegóły i uzyskać produkt wysokiej jakości, powinieneś dbać o te rzeczy (i oczywiście o inne rzeczy).
źródło
Jeśli programujesz w domu dla siebie, być może możesz skrócić kilka rogów; a kiedy eksperymentujesz i wypróbowujesz różne rzeczy, jest to całkowicie uzasadnione.
Uważaj jednak. W podanym przykładzie tak naprawdę nie ma potrzeby wycinania tego rogu i musisz być ostrożny. To może rozpocząć trend, a złe nawyki, które robisz w domu, mogą wkradać się do twojego kodu w pracy. O wiele lepiej ćwiczyć i doskonalić dobre nawyki w domu i pozwolić im wniknąć do twojego kodu w pracy. Pomoże ci i pomoże innym.
Każde programowanie i myślenie na temat programowania jest ćwiczeniem. Spraw, by było warto, w przeciwnym razie wróci i cię ugryzie.
Spójrz jednak na dobrą stronę. Zapytałeś o to, więc może już wiesz, o co mi chodzi.
źródło
Jeśli producent mebli przygotowuje mebel do użytku tam, gdzie jakość nie ma większego znaczenia lub gdzie jakość może pozostać niezauważona, czy nadal powinien starać się wyprostować swoje cięcia i wykonać dobrą robotę łącząc te elementy?
Wiele osób uważa oprogramowanie za kunszt. To, co budujemy, powinno nie tylko pełnić funkcję, ale musi być niezawodne, łatwe w utrzymaniu, niezawodne. Tworzenie takiego oprogramowania wymaga umiejętności, a umiejętność ta pochodzi z praktyki.
Tak więc, nawet jeśli wybór pętlowej konstrukcji dla tego, nad czym dzisiaj pracujesz, może nie mieć znaczenia, fakt, że starasz się używać odpowiednich konstrukcji przez cały czas, z czasem uczyni cię lepszym programistą.
źródło