Czy zwiększone użycie coraz wyższych języków programowania może prowadzić do deficytu programistów ze znajomością architektury komputerowej?

15

Cytat z Wikipedii artykułu „Język programowania wysokiego poziomu”:

Język programowania wysokiego poziomu jest językiem programowania o silnym oderwaniu od szczegółów komputera. W porównaniu z językami programowania niskiego poziomu może używać elementów języka naturalnego, być łatwiejszy w użyciu lub bardziej przenośny na różnych platformach. Takie języki ukrywają szczegóły operacji procesora, takie jak modele dostępu do pamięci i zarządzanie zakresem.

To znaczy, gdy poziom języka programowania rośnie, tym bardziej programista odchodzi od sprzętu, na którym działa program.

Teraz nie znam statystyk użycia języków na różnych poziomach, ale podejrzewam, że języki wyższego poziomu coraz częściej zastępują języki niższego poziomu. Jeśli tak, to czy może to prowadzić do deficytu programistów ze znajomością architektury komputera? Czy byłby to problem dla branży?

gablin
źródło

Odpowiedzi:

16

Może , ale prawdopodobnie nie spowoduje problemu.

To tylko ekonomia. Jeśli ogromna większość ludzi straci zdolność zrozumienia podstawowej architektury, a nadal istnieje ogromna POTRZEBA zrozumienia podstawowej architektury, wówczas ci, którzy to zrobią, będą mieli pracę i otrzymają więcej, podczas gdy ci, którzy nie będą mieli miejsc pracy, w których nie jest to potrzebne (i nadal mogą otrzymywać więcej ... kto wie?).

Czy warto wiedzieć? Absolutnie. Prawdopodobnie będziesz lepszy. Czy w większości przypadków jest to konieczne? Nie. Właśnie dlatego abstrakcja jest tak wielka, że ​​stoimy na barkach gigantów bez konieczności bycia gigantami (ale wokół zawsze będą giganci).

Ryan Hayes
źródło
4
Ale wszystkie abstrakcje są nieszczelne. Znajomość podstawowej architektury jest niezbędna, jeśli chcesz być pomocnikiem w rozwiązywaniu nieszczelnych abstrakcji.
dsimcha
5
@dsimcha, Zgadzam się, ale aby być zwykłym facetem, potrzebujesz „innych”, aby do ciebie przyszli ;-) Jeśli wszyscy muszą wiedzieć wszystko, abstrakcja zawiodła.
Preets
1
@Preets I dlatego wiele abstrakcje nie zdało egzaminu. Nawet mieć miejsce dla zwykłego gościa, to dowód, że abstrakcja już się nie udała.
Pacerier
@ Ryan, Doprowadzi to do problemu, w którym w przyszłości świat zostanie zalany aplikacjami pełnymi subtelnych błędów z powodu warstw na warstwach nieszczelnych abstrakcji. To niesamowite, że firmy takie jak Google z nieskończonymi zasobami mogą nadal mieć błędy w swoich podstawowych aplikacjach.
Pacerier
3
@Pacerier google ma daleki od nieskończonych zasobów i sprawia, że ​​aplikacje złożone z kilku rzędów wielkości są bardziej złożone i składają się z kilku rzędów wielkości więcej linii kodu niż większość innych. twierdzenie, że wszyscy powinni znać sprzęt komputerowy niskiego poziomu, ponieważ wszystkie abstrakcje mogą przeciekać, jest jak mówienie, że każdy powinien wiedzieć, jak zbudować dom od zera bez użycia narzędzi, ponieważ może nadejść burza i zburzyć ich dom. po prostu niewykonalne (lub inteligentne) wydawanie takich zasobów.
sara,
9

Chyba tak. Martwi mnie to trend. Żadna abstrakcja nie jest idealna ; gdyby istniał idealny sposób na uproszczenie złożonego problemu, bardzo szybko zastąpiłby oryginał. (To zdarzało się w przeszłości, czasami z komputerami, i znacznie częściej w innych dziedzinach, które nie martwią się tak bardzo o kompatybilność wsteczną jak my, takie jak fizyka.)

Oznacza to, że za każdym razem, gdy używasz abstrakcji, kryje się przed tobą jakiś ważny element o zasadniczej złożoności. Jeśli nie wiesz, co to jest, dlaczego tam jest i co robi, przypadkowo piszesz duże wraki pociągów i nie wiesz, jak je naprawić, ponieważ nie wiesz, co się naprawdę dzieje.

Każdy, kto próbuje ci powiedzieć inaczej, albo sprzedaje olej z węża, albo po prostu nie ma dużego doświadczenia z poważnym oprogramowaniem. W pracy pracuję nad programem, który uruchamia dobry procent wszystkich stacji telewizyjnych i radiowych w USA. W miarę jak stacje i sieci stają się coraz większe i bardziej złożone, szybkie i brudne techniki, które dobrze działały przy projektowaniu produktu dla jednej małej stacji, ostatecznie uderzają w duże techniczne ściany, gdy są wdrażane dla sieci z 50 stacjami i 200 kanałami! Bez głębokiego zrozumienia, jak działa język (i przede wszystkim wydajnego języka) i głębokiego zrozumienia, jak działa baza danych, nasi koderzy nigdy nie byliby w stanie skutecznie skalować produktu.

To też nie jest odosobniona historia. Oprogramowanie staje się coraz bardziej złożone, a nie prostsze, i obawiam się, że ten poziom wiedzy technicznej stanie się czymś zagubionym, a jutrzejsze programy będą gorsze niż dzisiejsze, a nie lepsze.

Mason Wheeler
źródło
5
Słyszałem, że wyrażono to jako „musisz znać abstrakcję jedną warstwę w dół od miejsca, w którym pracujesz”. Cóż, było bardziej zwięzłe; moja pamięć jest wadliwa. Więc jeśli pracujesz w C lub Delphi, powinieneś wiedzieć, jak działa montaż. Jeśli pracujesz w Smalltalk lub Java, powinieneś wiedzieć, jak działa twoja maszyna wirtualna. (Prawdopodobnie zawsze powinieneś wiedzieć coś o asemblerze!) Jeśli pracujesz z TCP, powinieneś wiedzieć, jak działa IP. I tak dalej.
Frank Shearar
1
Mam na myśli, że możesz posunąć się jeszcze dalej: dlaczego wystarczy mieć znajomość montażu? to tylko trzymająca w ręce abstrakcja wysokiego poziomu nad instrukcjami binarnego procesora. ale poczekaj! kod maszynowy? to tylko abstrakcja! musisz nauczyć się, jak budowany jest procesor, używając tranzystorów do budowania bramek logicznych! oraz autobus i rejestry. ale poczekaj! tranzystory? to tylko abstrakcja dla pewnej konfiguracji atomów. a atomy są jedynie abstrakcją ponad fluktuacjami w polach kwantowych. ostatecznie javascript:alert("Hello world")wymaga to doktoratu z teorii strun.
sara,
1
@ kai Jesteś trochę śmieszny . Zgadzam się z tobą, że zwykle nie jest tak, że musisz zrozumieć kilka warstw w dół dla większości aplikacji. Ale mówimy o skrzynkach, a nie na co dzień. Jasne, nie musisz wiedzieć, jak działa hydraulika, aby zmywać naczynia. Ale jeśli brudna woda zacznie napełniać zlew, powinieneś prawdopodobnie dowiedzieć się o niej trochę, zanim spróbujesz ją naprawić. Lub możesz po prostu wbić kawałek pręta zbrojeniowego do odpływu, aż znów zacznie działać, i kogo to obchodzi, gdzie płynie woda. (ciąg dalszy ...)
DrewJordan
1
@DrewJordan, moja uwaga jest taka: jeśli nie jesteś profesjonalistą, który musi wiedzieć i naprawić pewną klasę problemów (lub po prostu ma żywy interes prywatny), to całkiem szczerze absurdalne jest twierdzenie, że musisz znać wewnętrzne funkcjonowanie i dziwne subtelności każdego narzędzia, którego używasz. Po prostu zwróciłem uwagę na jego logiczny wniosek. pewnie, wiedza o tym, jak zbudowany jest kabel Ethernet, pozwoliłaby zbudować nowy, biorąc pod uwagę odpowiednie narzędzia w przypadku awarii połączenia internetowego, ale marnowanie czasu i pieniędzy na zdobywanie wiedzy, gdy pracujesz 20 warstw powyżej, jest po prostu marnotrawstwem.
sara,
1
@DrewJordan oczywiście Ktoś musi wiedzieć wszystkie te rzeczy, aby ktoś mógł to naprawić, gdy abstrakcja się zepsuje, ale cała PUNKT abstrakcji polega na ograniczeniu do minimum liczby osób, które muszą znać szczegóły, aby zdecydowana większość mogła się skupić na załatwianie spraw. gdzie arbitralnie wyznaczasz linię, w której rzeczy stają się „zbyt niski poziom”, zależy tylko od tego, z czym osobiście zdarzyło ci się pracować, co ilustruje mój argumentum ad absurdium (co nie jest błędem, muszę cię wiedzieć!)
sara,
5

Tak, myślę, że ludzie będą mniej rozumieli sprzęt w miarę postępu języków (i podobnie, jak instrukcje ustawiają postęp). Ale jak zauważono w wielu innych miejscach, głównym ograniczeniem w większości programów teraz dni nie jest czas procesora lub wydajność, ale czas programisty. Jeśli ludzie, którzy projektują języki, nadal wykonują swoją pracę, aby sprawić, by abstrakcja była skuteczna, i jeśli ludzie nadal używają tych abstrakcji właściwie, zrozumienie architektury komputera nie jest całkowicie konieczne; przynajmniej pełna wiedza nie jest obecnie fundamentem dobrego bycia programistą.

David Hollman
źródło
2
Teoretycznie tak, ale to kilka całkiem dużych, jeśli .
Mason Wheeler
1

Nie, nie doprowadzi to do deficytu programistów ze znajomością architektury komputera. Języki służą do rozwiązywania problemów w określonej domenie. Jeśli chcesz rozwiązać konkretny problem, użyj odpowiedniego języka lub wystarczająco dobrego, biorąc pod uwagę posiadane zasoby.

W rzeczywistości, jakie domeny faktycznie potrzebują wiedzy o architekturze komputera? To musi być związane z konkretną architekturą sprzętową? System operacyjny? Sterowniki urządzeń? Jasne, ale nawet wtedy tylko części takiego kodu wymagają specyficznej wiedzy architektonicznej.

Poprawa wydajności? Tak, możesz zastosować wiedzę na temat architektury komputera, aby poprawić wydajność algorytmów. Ale dwa inne czynniki mają większy wpływ na wydajność: zastosowanie lepszych algorytmów i znajomość środowiska wykonawczego języka.

Zasadniczo bardziej abstrakcyjne języki programowania rozwiązują problemy, dla których szczegóły architektury komputera nie są konieczne. Pozwalają rozwiązać więcej problemów. Ludzie, którzy ich używają, nie używają ich do rozwiązywania problemów zależnych od maszyny. Ludzie, którzy muszą rozwiązać problemy zależne od maszyny, będą nadal używać języków obsługiwanych przez maszynę. To nie jest kwestia sumy zerowej.

Huperniketes
źródło