Wyjaśniając mojej koledze różnicę między ścisłością języków i paradygmatów, stwierdziłem, że:
Języki tolerancyjne, takie jak języki dynamiczne i interpretowane, są najlepiej stosowane w prototypach i małych projektach lub średnich aplikacjach internetowych. Przy wyborze eleganckich dynamicznych języków, takich jak Python lub JavaScript z Node.js, korzyści są następujące:
Szybki rozwój,
Zredukowany kod płyty kotła,
Możliwość przyciągnięcia młodych, kreatywnych programistów, którzy uciekają przed „językami korporacyjnymi”, takimi jak Java.
Języki o typie statycznym / kompilowane najlepiej nadają się do aplikacji wymagających większej rygorystyczności, takich jak aplikacje o znaczeniu krytycznym lub aplikacje do aplikacji średnich i dużych.
Dobrze znane paradygmaty i wzorce opracowane przez dziesięciolecia,
Łatwość kontroli statycznej,
Możliwość znalezienia wielu profesjonalnych programistów z wieloletnim doświadczeniem.
Ścisłe języki, takie jak Haskell, Ada lub techniki, takie jak kontrakty kodowe w języku C #, są lepsze dla systemów, które preferują bezpieczeństwo nad elastycznością (nawet jeśli Haskell może być wyjątkowo elastyczny), takich jak systemy i systemy krytyczne dla życia, które powinny być wyjątkowo stabilne. Korzyści to:
Możliwość wykrycia jak największej liczby błędów w czasie kompilacji,
Łatwość kontroli statycznej,
Łatwość formalnych dowodów.
Jednak patrząc na języki i technologie wykorzystywane w dużych projektach przez duże korporacje, wydaje się, że moje twierdzenie jest błędne . Na przykład Python jest z powodzeniem stosowany w dużych systemach, takich jak YouTube lub inne aplikacje Google, które wymagają dużej rygorystyczności.
Czy nadal istnieje korelacja między skalą projektu a surowością języka / paradygmatu, który należy zastosować?
Czy jest jeszcze trzeci czynnik, o którym zapomniałem wziąć pod uwagę?
Gdzie się mylę?
źródło
Odpowiedzi:
Ciekawe studium przypadku dotyczące skalowania projektów wykorzystujących dynamiczny i zinterpretowany język można znaleźć w Beginning Scala autorstwa Davida Pollaka.
Jak widać, głównym wyzwaniem dla autora w skalowaniu projektu było opracowanie testów i transfer wiedzy.
W szczególności autor omawia różnice w pisaniu testowym między językami o typie dynamicznym i statycznym w rozdziale 7. W sekcji „Poignently Killing Bunnies: Dwemthy's Stairs” autor omawia port Scali konkretnego przykładu Ruby:
Czytanie powyżej może sprawić, że w miarę powiększania się projektów pisanie testowe może stać się zbyt kłopotliwe. Takie rozumowanie byłoby błędne, o czym świadczą przykłady udanych bardzo dużych projektów wspomnianych w tym samym pytaniu („Python jest z powodzeniem wykorzystywany do ... YouTube”).
Rzecz w tym, że skalowanie projektów nie jest tak naprawdę proste. Bardzo duże, długowieczne projekty mogą „pozwolić sobie” na inny proces opracowywania testów, z zestawami testowymi jakości produkcyjnej, profesjonalnymi zespołami testerów i innymi ciężkimi materiałami.
Zestawy testów YouTube czy Kit Java Compatibility pewien żyć innym życiem niż testy w małym projekcie samouczek jak Array Dwemthy użytkownika .
źródło
Twoje twierdzenie nie jest błędne. Musisz tylko kopać trochę głębiej.
Mówiąc wprost, duże systemy używają wielu języków, a nie tylko jednego języka. Mogą istnieć części zbudowane przy użyciu „ścisłych” języków i mogą istnieć części zbudowane przy użyciu języków dynamicznych.
Jeśli chodzi o twój przykład z Google i YouTube, słyszałem, że używają Pythona przede wszystkim jako „kleju” między różnymi systemami. Tylko Google wie, z czego te systemy są zbudowane, ale założę się, że wiele krytycznych systemów Google jest zbudowanych przy użyciu ścisłych i „korporacyjnych” języków, takich jak C ++ lub Java, a może coś, co sami stworzyli, jak Go.
Nie jest tak, że nie można używać tolerancyjnych języków w systemach na dużą skalę. Wiele osób twierdzi, że Facebook używa PHP, ale zapominają wspomnieć, że Facebook musiał stworzyć wyjątkowo surowe wytyczne programowe, aby móc efektywnie z niego korzystać na taką skalę.
Tak, w przypadku dużych projektów wymagany jest pewien stopień ścisłości. Może to wynikać z rygorystyczności języka lub frameworka, albo z wytycznych programowych i konwencji kodu. Nie możesz po prostu złapać kilku absolwentów szkół wyższych, dać im Python / Ruby / JavaScript i oczekiwać, że napiszą oprogramowanie, które skaluje się wśród milionów użytkowników.
źródło
Istnieją dwa rodzaje błędów do sprawdzenia: błędy typu (konkatenacja liczby całkowitej + lista liczb zmiennoprzecinkowych) i błędy logiki biznesowej (przelew pieniędzy na konto bankowe, sprawdź, czy konto źródłowe ma pieniądze).
„Dynamiczna” część dynamicznego języka programowania to tylko miejsce, w którym odbywa się sprawdzanie typu. W „programowanym dynamicznie” języku programowania sprawdzanie typu odbywa się podczas wykonywania każdej instrukcji, natomiast w „statycznym języku” sprawdzanie typu odbywa się w czasie kompilacji. I możesz napisać interpreter dla statycznego języka programowania (jak robi to emscriptem ), a także możesz napisać statyczny kompilator dla dynamicznego języka programowania (takiego jak gcc-python lub shed-skin ).
W dynamicznym języku programowania, takim jak Python i JavaScript, musisz pisać testy jednostkowe nie tylko dla logiki biznesowej programu, ale także sprawdzać, czy Twój program nie zawiera błędów składniowych lub typowych. Na przykład, jeśli dodasz „+” liczbę całkowitą do listy liczb zmiennoprzecinkowych (co nie ma sensu i spowoduje błąd), w języku dynamicznym błąd zostanie zgłoszony w czasie wykonywania podczas próby wykonania instrukcji. W statycznym języku programowania, takim jak C ++, Haskell i Java, tego rodzaju błąd typu zostanie przechwycony przez kompilator.
Mała baza kodu w dynamicznie sprawdzanym języku programowania ułatwia wyszukiwanie błędów pisowni, ponieważ łatwiej jest uzyskać 100% pokrycie kodu źródłowego. To jest to, wykonujesz kod ręcznie kilka razy z różnymi wartościami i gotowe. Posiadanie 100% pokrycia kodu źródłowego daje uczciwą wskazówkę, że twój program może nie zawierać błędów pisowni .
Przy dużej bazie kodu w dynamicznie sprawdzanym języku programowania trudniej jest przetestować każdą instrukcję z każdą możliwą kombinacją typów, szczególnie jeśli jesteś nieostrożny i piszesz funkcję, która może zwrócić łańcuch, listę lub obiekt niestandardowy w zależności od jego argumentów.
W statycznie sprawdzonym języku programowania kompilator przechwytuje większość błędów typu w czasie kompilacji. Mówię najbardziej, ponieważ błąd dzielenia przez zero lub błąd wykreślenia poza zakresem to także błędy typu.
Najczęściej prawdziwa dyskusja nie dotyczy języków programowania, ale ludzi korzystających z tych języków. I to prawda, ponieważ na przykład język asemblera jest tak samo potężny jak każdy inny język programowania, a jednak piszemy kod w JavaScript. Dlaczego? Ponieważ jesteśmy ludźmi. Po pierwsze, wszyscy popełniamy błędy, a korzystanie z dedykowanego narzędzia specjalnego do konkretnego zadania jest łatwiejsze i mniej podatne na błędy. Po drugie, istnieje ograniczenie zasobów. Nasz czas jest ograniczony, a pisanie stron internetowych na temat montażu zajęłoby wieki.
źródło
Moje doświadczenie z dużymi systemami polega na tym, że stoją lub upadają nie na podstawie wyboru języka, ale na podstawie zagadnień związanych z projektowaniem / architekturą lub zasięgiem testów . Wolę mieć utalentowany zespół Pythona przy moim dużym projekcie korporacyjnym niż mierny Java.
To powiedziawszy, każdy język, który pozwala ci pisać znacznie mniej kodu , powinien być wart uwagi (np. Python vs Java). Być może przyszłość będzie w sprytnych, statycznie typowanych językach z zaawansowanym wnioskowaniem typu (np. W formie Scala). Lub hybrydowy, taki jak C # próbuje z
dynamic
kwalifikatorem ...?I nie zapominajmy o „innych” statycznych zaletach pisania: poprawnym uzupełnianiu kodu / inteligencji, które moim zdaniem jest istotną cechą, a nie przyjemną w użyciu.
źródło
Inną kwestią jest to, kto stoi za pisaniem aplikacji na dużą skalę. Pracowałem w wielu miejscach, które chcą używać Ruby lub Pythona w niektórych dużych projektach w stylu korporacyjnym, ale konsekwentnie są „zestrzelane” przez kierowników IT i zespoły bezpieczeństwa korporacyjnego właśnie z powodu otwartego charakteru projektów.
Powiedziano mi: „Nie możemy używać Ruby on Rails, ponieważ jest to oprogramowanie typu open source i ktoś może umieścić w nim hacki, które kradną krytyczne lub chronione informacje”. Przykro mi, ale kiedy ktoś ma taki sposób myślenia, że open source == zło, prawie niemożliwe jest jego zmiana. Ten sposób myślenia jest chorobą korporacyjną.
C # i Java to zaufane języki z zaufanymi platformami. Ruby i Python nie są zaufanymi językami.
źródło