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ą.)
Odpowiedzi:
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.
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.
źródło
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. Jednak
its importance
znaczenie 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.
źródło
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 ++:Może być NIESAMOWICIE trudny do wykrycia, chyba że znasz język.
źródło
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 .
źródło