Myślę, że trudno jest osiągnąć wszystkie trzy. Dwa, jak sądzę, mogą być wykonalne. Na przykład myślę, że w niektórych przypadkach możliwe jest osiągnięcie wydajności i czytelności, ale łatwość konserwacji może być trudna w przypadku mikrodostrojenia kodu. Najbardziej wydajnemu kodowi na tej planecie na ogół brakuje zarówno łatwości konserwacji, jak i czytelności, co prawdopodobnie jest oczywiste dla większości, chyba że jesteś osobą, która rozumie ręcznie wektoryzowany SoA, wielowątkowy kod SIMD, który Intel zapisuje z wbudowanym złożeniem lub najbardziej wycinany algorytmy krawędziowe stosowane w branży z 40-stronicowymi artykułami matematycznymi opublikowanymi zaledwie 2 miesiące temu i kodem o wartości 12 bibliotek dla jednej niezwykle złożonej struktury danych.
Mikroefektywność
Sugeruję, że może być sprzeczne z popularną opinią, że najmądrzejszy kod algorytmiczny jest często trudniejszy w utrzymaniu niż najbardziej precyzyjny algorytm. Pomysł, że ulepszenia skalowalności przynoszą większe zyski w porównaniu z mikrodostrojonym kodem (np. Wzorce dostępu przyjazne dla pamięci podręcznej, wielowątkowość, SIMD itp.) Jest czymś, co rzuciłbym wyzwanie, przynajmniej pracując w branży wypełnionej niezwykle złożonym struktury danych i algorytmy (branża efektów wizualnych), szczególnie w obszarach takich jak przetwarzanie siatki, ponieważ huk może być duży, ale złotówka jest niezwykle droga, gdy wprowadzasz nowe algorytmy i struktury danych, o których nikt wcześniej nie słyszał, ponieważ są marką Nowy. Ponadto ja
Pomysł, że optymalizacje algorytmiczne zawsze przebijają, powiedzmy, optymalizacje związane z wzorcami dostępu do pamięci, jest zawsze czymś, z czym się nie zgadzam. Oczywiście, jeśli używasz sortowania bąbelkowego, żadna ilość mikrooptymalizacji nie może ci w tym pomóc ... ale z uzasadnionego powodu nie sądzę, że zawsze jest to tak jednoznaczne. Prawdopodobnie optymalizacje algorytmiczne są trudniejsze do utrzymania niż mikrooptymalizacje. Łatwiej byłoby mi powiedzieć, powiedzmy, Embree Intela, który pobiera klasyczny i prosty algorytm BVH i po prostu mikro-tuninguje bzdury z niego niż kod OpenVDB Dreamwork dla najnowszych metod algorytmicznego przyspieszania symulacji płynów. Przynajmniej w mojej branży chciałbym zobaczyć więcej osób zaznajomionych z mikrooptymalizacją architektury komputerów, tak jak Intel, gdy wkroczyli na scenę, w przeciwieństwie do wymyślania tysięcy nowych algorytmów i struktur danych. Dzięki skutecznym mikrooptymalizacjom ludzie mogą znaleźć coraz mniej powodów do wymyślania nowych algorytmów.
Pracowałem wcześniej w bazie kodu, gdzie prawie każda operacja użytkownika miała swoją unikalną strukturę danych i algorytm (dodając setki egzotycznych struktur danych). I większość z nich miała bardzo wypaczoną charakterystykę działania, ponieważ ma bardzo wąskie zastosowanie. Byłoby o wiele łatwiej, gdyby system mógł obracać się wokół kilkudziesięciu bardziej rozpowszechnionych struktur danych, i myślę, że mogłoby tak być, gdyby były one znacznie lepiej zoptymalizowane pod kątem mikro. Wspominam o tym przypadku, ponieważ mikrooptymalizacja może potencjalnie znacznie poprawić łatwość konserwacji w takim przypadku, jeśli oznacza to różnicę między setkami mikropesymizowanych struktur danych, których nie można nawet bezpiecznie używać do celów ścisłego odczytu, które wiążą się z brakami pamięci podręcznej i prawda vs.
Języki funkcjonalne
Tymczasem niektóre z najbardziej konserwowalnych kodów, jakie kiedykolwiek spotkałem, były dość wydajne, ale bardzo trudne do odczytania, ponieważ zostały napisane w językach funkcjonalnych. Ogólnie, moim zdaniem, czytelność i łatwość konserwacji są sprzecznymi pomysłami.
Naprawdę trudno jest uczynić kod czytelnym, łatwym w utrzymaniu i wydajnym jednocześnie. Zazwyczaj trzeba trochę pójść na kompromis w jednym z tych trzech, jeśli nie w dwóch, na przykład pogarszając czytelność pod kątem łatwości konserwacji lub podważając łatwość konserwacji pod względem wydajności. Zazwyczaj jest to łatwość utrzymania, gdy szukasz wielu pozostałych dwóch.
Czytelność a łatwość konserwacji
Jak już powiedziano, uważam, że czytelność i łatwość konserwacji nie są harmonijnymi koncepcjami. W końcu najbardziej czytelny kod dla większości z nas śmiertelników bardzo intuicyjnie odwzorowuje ludzkie wzorce myślowe, a wzorce ludzkich myśli są z natury podatne na błędy: „ Jeśli tak się stanie, zrób to. Jeśli tak się stanie, zrób to. W przeciwnym razie zrób to. Ups , Zapomniałem czegoś! Jeśli te systemy współdziałają ze sobą, powinno to się zdarzyć, aby ten system mógł to zrobić ... och, czekaj, co z tym systemem, gdy to zdarzenie zostanie wywołane?„Zapomniałem dokładnego cytatu, ale ktoś kiedyś powiedział, że gdyby Rzym zbudowano jak oprogramowanie, wystarczyłoby ptaka lądującego na ścianie, aby go przewrócić. Tak jest w przypadku większości programów. Jest to bardziej delikatne, niż nam się często wydaje Pomyśl o tym. Kilka wierszy pozornie nieszkodliwego kodu tu i tam może zatrzymać go do tego stopnia, że zmusimy nas do ponownego przemyślenia całego projektu, a języki wysokiego poziomu, które mają być jak najbardziej czytelne, nie są wyjątkiem od takich błędów w projektowaniu przez ludzi .
Czyste języki funkcjonalne są prawie tak niewrażliwe na to, jak to tylko możliwe (nawet bliskie niewrażliwości, ale stosunkowo dużo bliżej niż większość). A częściowo dlatego, że nie odwzorowują intuicyjnie ludzkich myśli. Nie są czytelne. Wymuszają na nas wzorce myślenia, które powodują, że musimy rozwiązywać problemy w jak najmniejszej liczbie przypadków szczególnych, wykorzystując minimalną możliwą wiedzę i nie powodując żadnych skutków ubocznych. Są niezwykle ortogonalne, pozwalają często zmieniać i zmieniać kod bez niespodzianek tak epickich, że musimy przemyśleć projekt na desce kreślarskiej, nawet do tego stopnia, że zmieniamy zdanie na temat ogólnego projektu, bez przepisywania wszystkiego. Wydaje się, że nie jest łatwiejsze do utrzymania niż to ... ale kod jest nadal bardzo trudny do odczytania,