Badania nad tym, jak dobrze programista rozumie kod w nieznanych językach? [Zamknięte]

15

Czy istnieją jakieś poważne badania dotyczące tego, jak dobrze doświadczony programista, który zna język X, może zrozumieć kod napisany przez kompetentnego programistę używającego języka Y, dla szerokiego zakresu powszechnie używanych języków, takich jak X i Y?

Oczywiście prawdziwy świat nie jest tak prosty, ponieważ programiści znają tylko jeden język. Chcielibyśmy wiedzieć: jeśli wykonamy nasz projekt w, powiedzmy, C #, a pewnego dnia spojrzą na to niektórzy starzy fizycy, którzy znają tylko Fortran i Algol, to w jakim stopniu miałoby to dla nich sens? Matematyczne części mogą się im dobrze odczytać, jeśli zignorują to, co dla nich to jakieś losowe znaki interpunkcyjne. Czy ekspert w Pythonie byłby w stanie znaleźć błędy w moim sprytnym skrypcie Ruby?

Mogą występować problemy, od poziomu powierzchownej składni do poziomu wielkich pojęć, takich jak obiekty, metaprogramowanie szablonów, funkcjonalne i tak dalej. Nie oczekuję, że jeden programista w pełni zrozumie każdy szczegół składni kodu w „języku obcym” lub będzie podążał za religią jakiejś wielkiej koncepcji, ale zastanawiam się, w jakim stopniu uzyskają główny przepływ kontroli, znajdź miejsce gdzie coś jest rysowane na ekranie i co determinuje jego kolor lub rozmiar, sprawdź, czy robot zaprogramowany do kierowania samochodem wyłączy silnik, gdy to zrobione, tego rodzaju rzeczy.

Dobrej jakości badanie obejmowałoby opublikowane badania naukowe, oficjalny raport z jakiejś grupy branżowej lub dużej firmy programistycznej, chociaż będę systematycznie bezstronnie obserwował doświadczonych liderów warsztatów i klas lub innych źródeł. Nie interesują mnie krótkie blogi, przykłady pojedynczych przypadków ani anegdoty. (Cóż, może kilka anegdot, jeśli są dobrą lekturą.)

DarenW
źródło
1
Nie wiem, czy są jakieś badania, ale z własnego doświadczenia mówię: tak, udało mi się zrozumieć program, nie znając języka.
superM
2
Zależy to od pary języków: wybierz C # vs. Java - a otrzymasz niemal natychmiastową znajomość; wybierz Algol vs. C - a zapoznasz się z jednostronicową ściągą. Powodzenia w wybieraniu C vs. Prolog lub Whitespace vs. Ada - to będzie frustrujące. Nawiasem mówiąc, język nie jest jedyną rzeczą, która odgrywa rolę w zrozumieniu programu: ekspert C specjalizujący się w projektach osadzonych, próbujący zrozumieć kod MFC napisany w C, jest raczej żałosnym widokiem (jest to doświadczenie z pierwszej ręki).
dasblinkenlight
Jak łatwo jest komuś, kto rozumie algebrę, aby podniósł trygonometrię, w porównaniu z kimś, kto rozumie rachunek różniczkowy i całkowy? To zależy od języka i paradygmatu. Wykrywanie i izolowanie różnic między językami jest wystarczająco trudne, zwłaszcza że języki ciągle się rozwijają. Poważnie wątpię, aby ktokolwiek mógł ocenić zrozumienie z dowolną rozsądną dokładnością.
Evan Plaice,

Odpowiedzi:

9

Zależy to oczywiście od stopnia, w jakim języki są ze sobą powiązane. Na przykład, jeśli masz doświadczenie w C lub C ++ i albo programowałeś w języku C # lub Java, powinno być łatwe czytanie i rozumienie drugiego z tych dwóch języków (Java lub C #). Jeśli dobrze znasz Lisp, Scheme nie powinien stanowić większego problemu. Kiedyś debugowałem program PHP bez żadnej wiedzy o PHP, tylko dzięki mojej wiedzy z C, C ++ i Perl. Jestem pewien, że kiedy ten program zostałby napisany w Haskell lub Smalltalk, byłoby to dla mnie o wiele trudniejsze, a nawet niemożliwe.

W rzeczywistości nie sądzę, aby badania naukowe na ten temat miały jakikolwiek sens (przynajmniej nie poważny). Nie ma czegoś takiego jak „standardowy doświadczony programista, który zna język X”, więc w żadnym badaniu nie byłoby zapewnionych podstawowych danych. Ludzie mają różną wiedzę, a nawet jeśli przeszli przez te same szkoły, są inaczej utalentowani i zmotywowani.

ale zastanawiając się, w jakim stopniu uzyskają główny przepływ kontroli, znajdź miejsce, w którym coś rysuje się na ekranie

Może to być trudne, nawet jeśli znasz język, ponieważ albo jakość kodu jest tak niska, albo używany framework jest tak złożony, albo baza kodu jest bardzo duża.

Doktor Brown
źródło
6

Nie jestem pewien, czy odniesienie do badań przeprowadzonych przez akademika, ale dobrze zrozumiałe nazewnictwo metod, klas i funkcji w językach C # / C ++ / Java / Python itp. Powinno zapewnić łatwość zrozumienia podstawy kodu oraz przepływu procesów biznesowych.

Konwencja nazewnictwa w ramach projektu i ogólnie w rozwoju oprogramowania jest bardzo ważnym aspektem. Jednakits importanceznaczenie oprogramowania do tworzenia wysokiej jakości budynków jest często pomijane lub ignorowane.

Wytyczne dotyczące nazewnictwa stosowane w .NET Framework i ogólne konwencje nazewnictwa stosowane w .NET są również dobrym źródłem informacji.

Jusubow
źródło
Dobry projekt interfejsu API i konwencje nazewnictwa pomagają, ale nawet konwencje nazewnictwa oparte na języku są często „opiniowane” w sposób, który dotyczy tylko tego języka. Oprócz C # / Java (które są prawie identyczne) większość języków działa na różnych zasadach, które mają unikalne przepływy pracy i implementacje specyficzne dla tego języka. Na przykład w językach, które nie są zgodne z mega-monolitycznym modelem szkieletowym, zwykle można znaleźć ogromny ekosystem pakietów, które łączą się za pomocą wspólnego menedżera pakietów.
Evan Plaice,
3

Zależy to ogromnie od indywidualnego programisty i od tego, jak internalizują języki. Nie mam absolutnie żadnych problemów z pracą w kilkunastu językach, podczas gdy mam przyjaciela, który zna tylko C ++. Nie jest gorszy w programowaniu niż ja, po prostu nauczył się innej drogi.

Osobiście uważam, że pokrewne pytanie jest bardziej interesujące: gdy w kodzie jest błąd (tj. Programista X myślał, że napisał, someFunction(x, y)ale tak naprawdę napisał coś innego), jak trudno jest drugiemu deweloperowi zidentyfikować błąd. Dobry programista X sprawiłby, że niezmiernie oczywiste było, co CHCĘ zrobić komputer, i byłoby to łatwe do odczytania. Jeśli jednak popełni błąd, może to być poważna sprawa. Takie rzeczy jak następujący błąd C ++:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

Może być NIESAMOWICIE trudny do wykrycia, chyba że znasz język.

Cort Ammon
źródło
1

Zależy to nie tylko od programisty, jak powiedzieli inni ludzie, ale także od podobieństw między językami, zarówno pod względem składni, filozofii, jak i implementacji.

Wiele różnych języków używa składni pochodnej C, więc śledzenie przepływu sterowania będzie łatwiejsze, jeśli znasz ten typ składni. To samo dotyczy języków silnie typowanych i luźno typowanych, języków z obsługą funkcji wyższego rzędu, poziomu abstrakcji i filozofii programistycznych. To nie tylko zależy od umiejętności czytania składni, ale także od znajomości pojęć i filozofii języków.

Jeśli na przykład nauczyłeś się języka C, myślę, że uzasadnione byłoby oczekiwanie, że będziesz w stanie czerpać kontrolę z C #, Java lub C ++ itp. Trudniej byłoby rozszyfrować VB ze względu na różnicę w składni lub JavaScript z powodu zamknięć, słabego pisania i funkcji wyższego rzędu (wiem, że możesz to zrobić w C, ale to trochę dziwne). Nie spodziewałbym się jednak, że będziesz w stanie debugować zestawienie Lisp, F #, R lub, na Boga, montaż, ponieważ używają one zupełnie innego paradygmatu programowania.

TL; DR Nie tylko ważna jest umiejętność rozpoznawania składni, ale przede wszystkim odszyfrowanie deklaracji lub wywołania metody, ale zrozumienie przyczyny, dla której program jest napisany w określony sposób, jest podstawą zrozumienia i odczytu kodu .

Nimnam1
źródło