Odpowiedzi:
To zależy od tego, co robisz.
Jeśli jesteś programistą osadzonym (i piszesz bardzo blisko metalu na bardzo małym urządzeniu), musisz znać każdy element systemu.
Jeśli jesteś programistą systemów (i piszesz systemy operacyjne lub sterowniki urządzeń, a może nawet bazy danych), musisz wiedzieć o wszystkim, co należy wiedzieć o interfejsach sprzętowych niskiego poziomu.
Jeśli jesteś programistą gier i spóźniasz się ze swoim projektem (gdzie optymalizujesz rzeczy), musisz poznać tajniki pamięci podręcznej procesora i architektur graficznych, których będziesz używać.
Jeśli jesteś programistą aplikacji, nie musisz nic o tym wiedzieć, z wyjątkiem utrzymywania zużycia pamięci na rozsądnym poziomie.
Jeśli jesteś programistą, dobrze jest znać protokoły internetowe, ale żadne z tych innych rzeczy nie jest konieczne, oprócz tego, jak radzić sobie z problemami z pamięcią.
Nie, nie musisz , ale myślę, że to doskonały pomysł. Nauka ogólnego przeglądu tego, jak rzeczy działają na poziomie logicznym, naprawdę pomogła mi w rozwoju.
Myślę, że komentarze na temat twórców aplikacji i twórców stron są błędne.
Na przykład, jeśli ktoś opracowuje aplikację internetową, która wymaga wielu zabezpieczeń, takich jak ssh lub jakiś inny algorytm szyfrowania, bardzo ważne jest, aby wiedział, na jakim typie sprzętu działa, aby mógł ustalić, czy maszyna rzeczywiście może obsłużyć nakład pracy. Innym przykładem może być serwer, na którym znajdują się pobrane treści. Lepiej znasz możliwości napędu dyskowego i dowolnego rodzaju interfejsu magistrali, do którego jest on podłączony, jeśli oczekujesz stosunkowo dużej liczby żądań.
Z punktu widzenia aplikacji, jeśli tworzysz jakiś program CAD lub coś, co wykonuje renderowanie 3d, możesz oczekiwać, że te aplikacje będą intensywnie obliczać zarówno algorytmicznie, jak i graficznie. Rozsądnie byłoby zrozumieć sprzęt, aby upewnić się, że aplikacja jest responsywna i użyteczna.
Nie twierdzę, że musisz posunąć się do zrozumienia tajników czegoś takiego jak protokół PCI, ale lepiej rozumiesz, do czego zdolny jest interfejs i sprzęt.
Ostatecznie jest to ważne bez względu na to, jaki rodzaj rozwoju robisz. Poziom szczegółowości niezbędny do zrozumienia jest dyskusyjny.
Dla profesjonalnego programisty traktuję to jako całościowe podejście do zrozumienia całego systemu , a nie tylko znajomość składni danego języka programowania du Jour . Uważam, że pomaga to programistom (i analitykom) podejmować trafne decyzje projektowe oraz dokonywać bardziej świadomych wyborów algorytmów i struktury danych.
Z własnego doświadczenia wynika, że najlepsi programiści w różnym stopniu wiedzą o wewnętrznym działaniu, niezależnie od tego, czy rozumie natywny zestaw instrukcji montażu dla platformy docelowej, wprowadzający kurs organizacji komputera w szkole, podstawową elektronikę cyfrową, czy potrafi zrozumieć szczegółowo opisy rdzeni CPU i GPU w najnowszych modelach, najlepsze mają bardziej kompletną wiedzę niż ich mniej gwiezdni koledzy.
Nie jestem pewien, czy to pomaga, ale czuję się bardziej komfortowo, gdy wiem więcej o systemie, nad którym pracuję, niż naprawdę muszę. Kiedy byłem młodszy, nie lubiłem nie znać języka asemblera systemu, nad którym pracowałem; albo się zmieniłem, albo nauczyłem się wystarczająco wielu, że jeden jeszcze nie zwiększy mojego odczucia w stosunku do systemu. Nigdy nie byłem facetem od sprzętu, ale mogę rozłożyć komputer na części i wymienić różne podsystemy oraz sposób ich interakcji.
Czego niewiele wiem nauczyłem się na zajęciach z architektury komputerowej prawie 25 lat temu, a także o architekturze nierealnej.
Zajmuję się głównie programowaniem aplikacji na różnych platformach. Był okres, w którym rozwijałem kod do działania nie tylko na zwykłym sprzęcie x86, ale także na Sparc, PA-RISC i innych architekturach serwerów. Wiedza na tym poziomie po prostu nie jest wymagana do mojej pracy.
Uczę programowania Java jako klasy liceum AP. Przekonałem się, że gdy uczniowie wiedzą coś o wewnętrznym działaniu komputera, pomaga im to zrozumieć pojęcia programowania.
Nie przesadzam - tylko proste pojęcia, takie jak sposób przechowywania rzeczy w pamięci, wydają się pomagać uczniom.
Odpowiem na to pytanie w tytule:
Tak, programista powinien znać wewnętrzne działanie sprzętu. Ile zależy od rodzaju programisty i jego celów, dostępnego czasu i osobistych zainteresowań. Priorytetem powinny być oczywiście bezpośrednie narzędzia, techniki itp., Które stosują w swojej dziedzinie. Ta opinia jest dobrze zaokrąglona. Im więcej wiesz o rzeczach poza swoim rzemiosłem, bez poświęcania swojego rzemiosła, tym lepiej.
To nie znaczy, że musisz zwariować z Cheese Whiz. Miej dobry wgląd w sprzęt, sposób interakcji elementów i sposób ich wykorzystania przez systemy operacyjne. W związku z tym sugeruję przeczytanie podręcznika pojęć systemów operacyjnych dla wszystkich programistów.
Czy ja to wszystko wiem? Heck no. Zapomniałem tak wiele bezużytecznych informacji o SCSI, że nawet nie jest to śmieszne. Jednak poznanie tego było nieocenionym doświadczeniem. Zapomniałem również wiele innych szczegółów związanych ze sprzętem, ale przypominam sobie ważne pojęcia, których nauczyłem się z tej wiedzy.
Z pewnością sugeruję zapoznanie się ze sprzętem. Rób to w rozsądnym tempie, w zależności od potrzeb. Poznaj jak najwięcej szczegółów, ale skup się na pojęciach.
Każdy programista powinien znać podstawowe pojęcia związane z inżynierią komputerową: arytmetyka binarna, konwersja bazy, algebra boolowska, bramki logiczne, skład procesora (i tego, co robią komponenty), pamięć podręczna, pamięć wirtualna, kompresja, wykrywanie błędów i korekta ...
Zakres, w jakim powinny one być znane, zależy od pracy programisty. Jak inni powiedzieli, twórca systemów wbudowanych musiałby być bardziej obeznany z możliwościami sprzętowymi i tym, jak pisać oprogramowanie, które najlepiej wykorzystuje sprzęt niż, powiedzmy, twórca stron internetowych.