Systematyczny wybór języka programowania [zamknięte]

24

Szukam metodologii wyboru języka. Nie pytam o opinie na temat języków. Zadanie polegało mi na porównaniu obecnego języka naszego sklepu z innymi, które są dostępne. Jesteśmy sklepem internetowym.

Nasz CEO chciałby uzyskać pełną białą księgę na temat wszystkich dostępnych języków internetowych, jakiego języka ojczystego są pochodnymi (np. Jsp pochodzi z java, który pochodzi z c / c ++). Muszę stworzyć macierz ze wszystkimi kluczowymi czynnikami danego języka, a także niedociągnięciami tego języka. Czy język jest ograniczony przez platformę, czy jest przeznaczony do programowania funkcjonalnego, proceduralnego lub OO, czy może być używany z dowolnym paradygmatem programowania?

Potrzebuję też informacji mniej technicznych, takich jak wielkość puli talentów dla danego języka i mediana wynagrodzenia w tej puli. Jak rynek oceni nasz wybór?

Zaczęliśmy szukać konsultanta, który pomógłby nam zrozumieć wszystkie te rzeczy, ale okazało się, że większość konsultantów pochodzi ze środowisk programistycznych i często wydaje się, że odpowiedź brzmi: „ xxx jest najlepszym językiem, ponieważ to ja używałam najwięcej w ciągu ostatnich n lat i nigdy mnie nie zawiódł. Możesz uzupełnić go o yyy dla interfejsu i użyć biblioteki zzz "

Czuję się przytłoczony tym zadaniem i wydaje mi się, że najlepszym sposobem, biorąc pod uwagę to, czego szuka nasz CEO, jest zajrzenie do świata akademickiego i zatrudnienie profesora bez faktycznego doświadczenia w rozwoju, aby „uczyć” nas o wszystkich możliwych językach.

Czy ktoś jeszcze musiał przejść to ćwiczenie? Jeśli tak, czy możesz podzielić się krokami i / lub metodologią zastosowaną podczas tego procesu?

Lanca
źródło
21
Czy CEO faktycznie planuje wykorzystać tę matrycę do podjęcia takich decyzji, jak: „Użyjemy $ {language} do zbudowania $ {nextBigProject}!” Aby zbudować coś, co w rzeczywistości może być przydatna dla (chociaż nie jestem pewien, że nigdy nie będzie poważnie przydatna) będzie prawdopodobnie zajmie znaczną ilość czasu i nie będzie bieżącej konserwacji na nim również.
FrustratedWithFormsDesigner
3
Myślę, że ogólnym przewodnikiem wyboru języka / środowiska dla projektu może być najpierw próba głębszego zrozumienia konkretnego problemu, który projekt próbuje rozwiązać (w sposób niezależny od języka), poszukiwanie narzędzi / bibliotek, które najlepiej pomóż rozwiązać w tym czasie , a następnie sprawdź, jakie języki musisz znać, aby pracować z tymi narzędziami / bibliotekami. To prawdopodobnie da ci krótką listę języków, a stamtąd możesz ją odświeżyć w oparciu o twoją znajomość, wsparcie dostawców, budżet itp.
FrustratedWithFormsDesigner
9
Pierwszy odpowiedzieć na to pytanie brzmi: „Czy musimy zmian w ogóle?” Jakie problemy nie są rozwiązywane przez twój obecny wybór języka?
John Bode,
4
W jaki sposób przepełnienie stosu może pomóc programistom ocenić technologie? „Dziś rano miałem przed sobą około 8 szkieletów, próbując zdecydować, który z nich użyję ...”
komik
7
W praktyce równie dobrze możesz rzucać strzałkami. Na arenie internetowej (zwłaszcza JavaScript, i in.) Dostępnych jest kilkadziesiąt (jeśli nie setki) opcji o różnych mocnych stronach, słabościach, powinowactwach i niezgodnościach. Możesz to zanalizować na śmierć lub po prostu zgadnąć, iść naprzód i w razie potrzeby dokonać korekty w połowie kursu.
Daniel R Hicks

Odpowiedzi:

53

@FrustratedWithFormsDesigner zasygnalizował to powyżej, będę bardziej bezpośredni: zostałeś obciążony kosztownym, ale bezużytecznym zadaniem.

Podejrzewam, że CEO szuka niepodważalnych, obiektywnych dowodów, które będą wspierać jego wybór języka. Problem polega na tym, że preferencje językowe są obciążone zbyt wieloma subiektywnymi i zewnętrznymi czynnikami, aby biała księga była znacząca, a tym bardziej przydatna.

Innymi słowy, gdyby istniał idealny język, wszyscy używaliby go zamiast tych „obiektywnie” wadliwych języków. Odzwierciedla także pewien stopień mikrozarządzania, który powinien być domeną inżynierów, którzy będą musieli sprawić, by działało. Erlang może być „obiektywnie najlepszy”, ale jeśli nikt tego nie wie, dodaj 6-miesięczny koszt uruchomienia inżyniera i 6-miesięczny / inżynier, aby zdobyć kompetencje.

Ponieważ nie mam twojej pracy, nie martwię się o jej utratę, chociaż możesz. Przekazałbym CEO artykuł na temat tezy o fizycznym kościele Turinga. Następnie spotkałem się ze starszymi inżynierami i otrzymałem ich nieskomplikowaną, nieobiektywną opinię na temat tego, co powinno być użyte, i powiedziałbym dyrektorowi generalnemu, czego będziesz używać. W zamian obiecujesz, że inżynierowie nie będą uczestniczyć w spotkaniach zarządu, dyrektorach finansowych, metodach rachunkowości, wyborze wiceprezesów itp. Jest powód, dla którego się specjalizujemy, a on nie ma więcej miejsca w preferencjach inżynieryjnych niż ty w jego dziedzinie.

msw
źródło
6
Ha, uwielbiam lekkomyślny entuzjazm z ostatniego akapitu. Powiedziałbym, że jest to domena CEO z powodu tych nieznośnych 6 miesięcy, o których wspominałeś, i to wszystko, czego potrzebujesz, aby powiedzieć mu / jej imho.
Nathan Cooper
1
„Fizyczna teza Kościoła Turinga” Nie idźmy tam. Bardzo niewiele języków programowania ma formalną semantykę, co jest warunkiem wstępnym ukończenia Turinga. (Bez niego nie jest to nawet model obliczeń.)
Rhymoid,
4
Po prostu wybierz Lisp i gotowe.
Eric,
1
Przez Lisp masz oczywiście na myśli ClojureScript. :-)
Brian Knoblauch,
1
+1. Twoim zadaniem jako inżyniera jest przekazanie dyrektorowi generalnemu, dlaczego nie jest to dobre podejście. Może to być trudne, ponieważ wygląda na dobre podejście, ale jest konieczne.
djechlin
25

Kilka szerokich pociągnięć pędzla do rozważenia:

Popularność języka

To naprawdę nie powinno mieć znaczenia, ponieważ popularność niekoniecznie musi się równać z produktywnością, ekspresją lub innymi cechami językowymi, które mają większe znaczenie, ale ta uwaga często przebija wszystkie inne względy, ponieważ:

  1. Łatwiej jest znaleźć programistów w popularnym języku.
  2. Łatwiej jest znaleźć narzędzia i biblioteki w popularnym języku.
  3. Decydenci nie rozumieją kompromisów językowych, więc podejmą bezpieczną decyzję („wiele firm używa tego języka, więc musi być dobry”).

Możliwość zastosowania do dziedziny problemowej

Dowolny program może być napisany w dowolnym języku programowania Turinga, ale niektóre języki są bardziej odpowiednie dla niektórych domen problemowych niż inne. Jeśli piszesz aplikacje internetowe, prawdopodobnie polubisz języki i narzędzia, które są do tego odpowiednie, a najprawdopodobniej będą to języki obiektowe.

Z drugiej strony, jeśli zamierzasz pisać oprogramowanie oparte głównie na badaniach lub matematyce, prawdopodobnie skłaniasz się ku językom, które obejmują paradygmaty funkcjonalne .

I oczywiście wszystko jest pomiędzy. Wiele języków obsługuje wiele paradygmatów, a niektóre wzorce oprogramowania istnieją wyłącznie w celu przezwyciężenia ograniczeń w tych językach, w których brakuje pewnych funkcji lub paradygmatów.

Ekspresyjność i wydajność

Niektóre języki są bardziej wyraziste niż inne. To, co można napisać w jednym języku przy użyciu tysiąca wierszy kodu, można napisać w bardziej wyrazistym języku przy użyciu stu wierszy kodu. Kompromis polega na tym, że sto linii kodu jest prawdopodobnie pisanych w mniej popularnym języku przez osoby o większej wiedzy.

Wiele wierszy kodu obecnych w językach obiektowych używanych do pisania aplikacji biznesowych to ceremonie. Ceremonia ta, choć wymaga czasu i wysiłku na rozwój, zapewnia również widoczną strukturę, która w innym przypadku nie byłaby łatwo widoczna w bardziej wyrazistym języku. Pozwala to osobom o mniejszej wiedzy specjalistycznej, niż byłoby to konieczne do pracy nad kodem przy zmniejszonym ryzyku.

Era wielu języków

Na zakończenie stwierdzę, że chęć wyboru jednego języka może być fałszywym dylematem. Aplikacje dziś są często pisane, nie w jednym, ale w wielu językach. Każdy język ma swoje mocne strony i (teoretycznie) jest specjalnie zaprojektowany do zadania, w którym jest używany. Niektóre domeny problemowe (takie jak logika przeglądarki internetowej lub dostęp do bazy danych) wymagają określonych języków.

Robert Harvey
źródło
7
Dodam do ostatniego punktu, że jeśli chcesz używać wielu języków, warto rozważyć platformę, która obsługuje łatwą współpracę między nimi (.Net CLR lub JVM).
svick,
9
@NathanCooper: Masz na myśli, że nigdy nie napisałeś aplikacji internetowej? Nawet mały? A może musiałeś przenieść aplikację mobilną na wiele platform? Lub pracował w osadzone? Lub odzyskałeś dane z bazy danych SQL?
Robert Harvey
10
@ NPSF3000: Oczywiście nie zadałeś sobie trudu ujawnienia swojej metody czarów. Nazywam shenanigans.
Robert Harvey
9
@ NPSF3000 Podczas gdy C # może być dobrym wyborem do tego, co robisz (chociaż korzystanie z Unity z pewnością trochę to rozciąga, ponieważ jest specjalnie zaprojektowane dla nich, aby wykonywać wszystkie wielojęzyczne ciężkie podnoszenie dla ciebie), twoja jedna anegdota nie obala tego. Z pewnością większość nietrywialnych projektów jest wielojęzycznych w tym sensie, że używają SQL i innej technologii, ale nawet poza tym wielu używa równolegle różnych języków programowania lub pisze swoją aplikację w jednym języku, a narzędzia w innym itd. I w ogóle nie uważaj tego twierdzenia.
Chris Hayes,
7
@ NPSF3000 Jeśli to twój problem, powiedz to . Nie zmuszaj nas, abyśmy przeszli przez ten rytuał próbowania zrozumienia, co masz na myśli. Jestem pewien, że Robert chętnie dokonałby edycji, gdybyś powiedział wprost: „Nie zgadzam się, że niektóre problematyczne domeny wymagają określonych języków”. To powiedziawszy, nie widzę tu żadnej implikacji, że praca w wielu językach jest „domyślnie korzystna”.
Chris Hayes,
5

Istnieją biznesowe powody, aby wybrać język, i istnieją techniczne powody, aby wybrać język, a twain nie zawsze się spotykają. Rzucanie z powodów akademickich może pogorszyć sytuację. Wątpię, czy profesor będzie w stanie pomóc ci tak, jak potrzebujesz.

Fakty na temat pochodzenia i cech języka są dość łatwe do znalezienia. Prawdopodobnie mógłbyś spędzić dzień na wikipedii, aby wypełnić większość z nich. Wielkość puli talentów i wynagrodzenie są trudniejsze, ponieważ większość ludzi nie uważa się za programistów w jednym języku. Firmy, które używają mniej popularnych języków, takich jak Scala, raczej oczekują zatrudnienia dobrych ogólnych programistów, którzy nie mają doświadczenia w konkretnym języku. Sądząc z niektórych prezentacji, które widziałem, wydaje się, że strategia ta dobrze się sprawdziła.

Nawet znajomość faktów wciąż pozostawia ci dość subiektywny wybór. Twój dyrektor generalny będzie chciał sprowadzić go do zgrubnej miary, na przykład dolarów na funkcję. Aby uzyskać dokładny obraz, będziesz musiał zrobić kilka prototypów, a następnie porozmawiać o tym, jak łatwo było się nauczyć, jak szybko napisano prototyp po opanowaniu podstaw, jak łatwo można utrzymać , a także, jak Twoim zdaniem ma to zastosowanie do rodzaju pracy, którą zwykle wykonujesz.

Zamiast próbować objąć wszystkie języki, starałbym się uzyskać przedstawicieli różnych paradygmatów programowania i typów ram i zaimplementować prototyp w każdym z nich.

Oto przybliżona lista kategorii zaplecza:

  • Microsoft. (Może mieć podkategorie. Nic o nich nie wiem.)
  • Ciężki OOP, jak Drupal.
  • Lekki OOP, jak butelka pytona.
  • Graj / lift / scalatra za pomocą Scali.
  • Graj / podnoś używając Java.
  • Wiosenny
  • Struts-like.
  • Szyny.
  • Na bazie Haskell.
  • Node.js

Z przodu:

  • JavaScript w stylu OOP
  • JavaScript w stylu funkcjonalnym, jak w przypadku podkreślenia
  • JavaScript w stylu reaktywnym, jak w przypadku Bacon
  • Google Web Toolkit
  • Wiąz

Spędzenie dnia lub dwóch na każdej kategorii, wdrażając prosty prototyp, zajęłoby ci kilka miesięcy, po czym miałbyś znacznie lepsze pojęcie o mocnych i słabych stronach każdej z nich. Być może mógłbyś wykluczyć niektórych szybciej w oparciu o kulturę lub doświadczenie swojej firmy.

Ponieważ jest to raport biznesowy, poświęcę trochę czasu na przeglądanie takich rzeczy, jak „Jaki język używa <firma>”, zastępując różne firmy, które podziwiasz. Wielu z nich napisało własne dokumenty na temat tego, dlaczego dokonali konkretnych wyborów językowych, co byłoby świetnym odniesieniem do uwzględnienia.

Karl Bielefeldt
źródło
4

Zidentyfikuj i oszacuj niedociągnięcia związane z istniejącym procesem programistycznym na kwotę A. Zidentyfikuj koszt przejścia na inny proces programowania jako $ B.

Jeśli $ A jest mniejsze niż $ B, przestań.

Jeśli twoje znane niedociągnięcia przeważają nad kosztem zmiany (a to jest duże, jeśli!), Przeanalizuj je szczegółowo i zacznij szukać języka / środowiska programistycznego / zmian w procesie rozwoju, które to rozwiązają, takich, które nie wprowadzą innych droższych problemów.

Szczerze mówiąc, chyba że obecnie próbujesz tworzyć aplikacje internetowe w Fortran, to jedyny wpływ, jaki będziesz mieć w używanym języku, to koszt kontrahentów, których używasz do wypełnienia luk. Główny strumień i dojrzałe języki / narzędzia / procesy programistyczne już rozwiązały większość problemów, z którymi możesz się spotkać, gdy najgorętsze, najnowsze i najseksowniejsze narzędzia pochodzą z najdroższych trenerów i wykonawców, ale najmniej dojrzałych rozwiązań. A jeśli masz niedociągnięcia, które uzasadniają taką zmianę, jest mało prawdopodobne, że Twój wybór języka w pełni je rozwiąże.

Jeśli jednak rentowność nie jest tu głównym celem, należy uwzględnić piętno bycia uważanym za staroświecki wbrew uznaniu za bycie nowatorskim. Poproś szefa o podanie wartości dolara dla tej części równania.

Paul Smith
źródło