EDYCJA: To pytanie na początku wydaje się bić Java, i chyba w tym momencie jest trochę. Jednak większą uwagę staram się wyjaśnić, dlaczego jeden język jest wybrany jako jeden koniec, wszystkie rozwiązania wszystkich problemów. Zdarza się, że Java jest tą, która została użyta, więc musiałem ją tutaj pokonać, ale nie zamierzam zgrywać Java nowej :)
Nie lubię Java w większości ustawień akademickich. Nie twierdzę, że sam język jest zły - ma kilka bardzo pożądanych aspektów, a przede wszystkim możliwość uruchamiania bez ponownej kompilacji na większości platform. Nie ma nic złego w używaniu języka dla Twojej następnej aplikacji ^ TM. (Nie jest to coś, co osobiście bym zrobił, ale to więcej, ponieważ mam mniej doświadczenia z tym, niż z powodu złego projektu)
Myślę, że marnotrawstwem jest nauczanie kursów CS na wysokim poziomie przy użyciu języka Java jako języka. Zbyt wielu moich studentów nie jest w stanie uczyć się nic, bo nie wiedzą, jak pracować w świecie, w którym nie ma śmieci. Nie rozumieją zasadniczo maszyn, dla których programują. Kiedy ktoś może pracować poza światem śmieci, może pracować wewnątrz jednego, ale nie odwrotnie. GC jest narzędziem, a nie kulą. Ale sposób, w jaki jest on używany do nauczania studentów informatyki, jest kulą.
Informatyka nie powinna uczyć całego zestawu kursów dostosowanych do jednego języka. Uczniowie odchodzą z myślą, że każdy dobry projekt jest idiomatycznym projektem Java i że projekt obiektowy jest JEDNYM PRAWDZIWYM SPOSOBEM, JAKIM JEST JEDYNY SPOSÓB, JAKIE MOŻNA ZROBIĆ. W nauczaniu należy stosować inne języki, z których przynajmniej jeden nie jest językiem zbierania śmieci, aby umożliwić absolwentowi lepsze zrozumienie maszyn.
To zawstydzenie, że ktoś z doktoratem w CS z szanowanej instytucji nie może zaprogramować wyjścia z papierowej torby.
Co gorsza, kiedy rozmawiam z tymi profesorami CS, którzy faktycznie rozumieją, jak rzeczy działają, dzielą się takimi odczuciami, że wyrządzamy krzywdę naszym studentom, robiąc wszystko w Javie. (Zauważ, że powyższe byłoby takie samo, gdybym zastąpił go innym językiem, problem polega zazwyczaj na użyciu jednego języka, a nie na samej Javie)
W sumie wydaje mi się, że nie mogę już dłużej szanować żadnego stopnia - kiedy nie widzę ludzi wokół siebie, którzy potrafią zaprogramować wyjście z problemów z fizzbuzz.
Dlaczego / jak to się stało?
źródło
Odpowiedzi:
To nie jest problem Java, to problem nauczania. Nie wiedząc, jak programować, nie jest to wina języków, to wina uczniów. To samo dotyczy wszystkich twoich problemów, GC, podstawowej wiedzy o maszynie, jak to działa „pod maską”, że tak powiem.
Wasza główna wada związana z odśmiecaniem śmieci rzuca mnie lekko. Chyba że robisz C lub C ++ odśmiecanie jest zwykle bardzo dobre i nie stanowi problemu. Czy wolelibyście wszyscy uczyć się montażu? Surowe języki wyższego poziomu są bardzo przydatne do nauczania. Zapewnia elastyczność bibliotek, pakietów i innych drobiazgów, gdy są potrzebne, bez mylącego języka „cukier” występującego w większości innych języków wyższego poziomu (PHP, Ruby, Python, Perl).
źródło
Czy uniwersytety naprawdę to robią? Czy jest to tylko postrzeganie, jakie ludzie dostają, gdy dostają złego kandydata do rozmowy kwalifikacyjnej?
Otrzymałem dyplom CS 4 lata temu i chociaż Java była używana w klasach wprowadzających, nie było to potem szczególnie podkreślane. Zasadniczo wymagane kursy podstawowe wymagały nauki Java, C, C ++, SML (funkcjonalny język programowania), asemblera, matlaba i CAST (język opisu obwodu). Nie bierze to pod uwagę wszystkich kursów matematycznych i teoretycznych CS oraz, oczywiście, pół tuzina fakultatywnych kursów CS, które wystawiłyby cię na wiele innych. Od rozmowy z przyjaciółmi na wielu różnych uniwersytetach nie brzmiało to tak, jakby to, co robili, było zupełnie inne.
Jeśli istnieją uniwersytety zajmujące się wyłącznie Javą, to rzeczywiście jest to tragedia. Nie dlatego, że Java jest zła, ale dlatego, że jest tylko jednym z wielu narzędzi, które powinny być dostępne dla programisty. Deweloper, który zna tylko Javę, jest odpowiednikiem stolarza, który wie tylko, jak używać młotka. Mam jednak problem z przekonaniem, że tak jest naprawdę, przynajmniej w przypadku poważanych uniwersytetów. Podejrzewam, że jest to tylko postrzeganie złych kandydatów i obwinianie szkoły za niekompetencję kandydatów, a nie własny brak motywacji / motywacji / ciekawości / profesjonalizmu itp.
źródło
Jestem naprawdę zaskoczony, że taka jest sytuacja wielu szkół. Kiedy uzyskałem dyplom CS, miałem serię kursów językowych, które obejmowały wszystkie popularne języki dnia (to było prawie 40 lat temu): asembler (Univac 1108 i MIX), FORTRAN IV, SNOBOL4, COBOL, Lisp i Algol 68. Nie wyobrażam sobie, aby uczyłem się tylko jednego języka. Lub jak mogłem docenić, co musiały zrobić kompilatory bez napisania programów asemblera.
W przypadku większości kursów danych i algorytmów korzystaliśmy z Algolu i FORTRAN. Chciałbym spędzić więcej czasu z Lispem - zamiast tego mieliśmy tylko wstęp i teraz próbuję ponownie nauczyć się niektórych pojęć. Użyliśmy SNOBOL4 do pisania parserów - a jego dopasowanie do wzorca z cofaniem zbudowało dobry fundament dla późniejszej pracy bibliotek regex zawartych w wielu współczesnych językach.
To wprowadzenie do pół tuzina języków wywołało we mnie zainteresowanie, które trwa do dziś.
źródło
Aby uzyskać prawdziwy powód, musisz zapytać ludzi, którzy zarządzają tymi instytucjami (a nawet wtedy mogą ci nie powiedzieć).
Kilka możliwych powodów (i nie bronię ani nie oskarżam nikogo tutaj, zgaduję):
Możesz robić rzeczy w Javie
Java to język ogólnego przeznaczenia i jako taki może być używany do rozwiązywania wielu problemów.
Wielu nauczycieli rozumie Javę
Trudno jest nauczyć języka, którego nie rozumiesz
Java jest popularna
Co oznacza, że istnieje wiele zasobów Java - książek, aktywnej społeczności, bibliotek kodów itp.
Java jest łatwa
Nie musisz rozumieć wielu rzeczy lub teorii niskiego poziomu, aby robić Java. Możesz nie robić tego dobrze , ale przynajmniej możesz załatwić sprawę.
Java jest wszechobecna
Możesz uruchomić go mniej więcej na czymkolwiek.
Są zadania dla programistów Java
Istnieje wiele miejsc pracy, które wymagają Java - nauczyciele powinni przygotowywać uczniów do prawdziwego świata.
Jest ograniczony czas
Na wielu kursach nie ma czasu na nauczanie wielu języków, teorii, koncepcji niskiego poziomu itp.
Tego chcą studenci
Wielu studentów już słyszało o Javie (a nawet korzystało z niej). Lubią, bo jest znajomy.
źródło
O to prosił przemysł. Brakowało programistów Java, więc szkoły zaczęły je tworzyć. Firmy mają programistów, którzy mogą rozpocząć pracę, gdy tylko przejdą przez drzwi.
W każdym razie język nie ma znaczenia. Mogliby uczyć języka innego niż GC i nadal produkować złych programistów. Korzystanie ze szkół językowych stanowi szczegół implementacji. Szkoły powinny uczyć pojęć. Jeśli tak nie jest, problem stanowi szkoła, a nie język, w którym się uczą. To, że ktoś nie wie, czym jest wskaźnik, nie oznacza, że nie może być skutecznym programistą.
GC i tak jest drogą przyszłości.
źródło
Lenistwo i motyw zysku. Java pomaga większości ludzi w 80% przy 20% wysiłku. Jednak często powoduje to koderów voodoo typu „małpa patrz małpa”, którzy nie mają głębokiego zrozumienia tego, co się dzieje, i nie są w stanie kopać głębiej niż narzędzia wysokiego poziomu.
Nauczenie C / C ++ poprawnie jest trudne. Nawet jeśli zrobione dobrze, wielu nie w pełni zrozumie koncepcje niskiego poziomu, takie jak wskaźniki (istnieją badania na ten temat). Co więcej, wydaje się, że nie ma to natychmiastowego znaczenia na rynku pracy.
źródło
W większości się zgadzam, ale do pewnego stopnia.
Jeśli chcesz uczyć CS, zwróć uwagę na struktury danych lub algorytmy. Dobrze jest usunąć większość niepotrzebnych rzeczy. Nie chcesz, aby uczniowie radzili sobie z problemami niskiego poziomu podczas uczenia się koncepcji wysokiego poziomu.
Z drugiej strony należy także uczyć rzeczy na niskim poziomie. Właśnie dlatego mamy więcej wszechstronnych programistów.
źródło
Jak zawsze chodzi o to, czego chcesz uczyć i ile czasu masz na to.
Robienie rzeczy w Javie oznacza, że nie musisz radzić sobie ze zbłąkanymi wskaźnikami i free / malloc. Oznacza to znacznie mniej trudnych do znalezienia błędów.
Nie oznacza to, że nie powinieneś uczyć się o podstawowej maszynie - którą musisz być dobry w branży - ale być może powinieneś wybrać odpowiednie narzędzie do pracy. Algorytmy wysokiego poziomu nie są chyba najlepszym tematem na kurs asemblera.
źródło
Czy to zbyt wiele, aby poprosić ich o nauczenie się, jak naprawdę działają komputery ? Nie ma dla mnie sensu, aby jakikolwiek zarys kursu CS nie zawierałby czegoś z systemów operacyjnych i komputerowej wykładu. Nie twierdzę, że powinieneś być w stanie zaprojektować komputer na odwrocie koperty, ale ogólny przegląd przedstawia wszystkie języki w odpowiednim świetle. Mam na myśli, że Java działa na maszynie wirtualnej!
źródło
Szczerze mówiąc, nie sądzę, że powinieneś tracić szacunek dla wszystkich stopni naukowych, a zwłaszcza CS, ponieważ jedynym nauczanym językiem jest Java.
Każdy przyzwoity komp. Student sci rozumie, że jego stopień CS to nic więcej niż kartka papieru i że prawdziwa wiedza będzie pochodzić z osobistych projektów i osobistych studiów. Chciałbym pomyśleć, że dobrzy studenci wiedzą, że muszą znać C i nauczyć się, jak załatwiać sprawy w Linux / Unix i nauczyć się, jak NIE trzymać ręki za pomocą nowoczesnych języków.
źródło
Nie widzę problemu z używaniem Javy. Największym problemem (jak wspomniałeś) jest to, kiedy uniwersytety uczą programowania imperatywnego jako najlepszego i jedynego sposobu rozwiązania wszystkich twoich problemów. To jest bardzo dalekie od prawdy. Na przykład zamiast używać trzech imperatywnych języków (lub nawet najgorszego tego samego języka) dla trzech różnych kursów, powinni stosować trzy różne paradygmaty programowania. Przykładem jest Java (tryb rozkazujący), Prolog (deklaratywny) i Haskell (funkcjonalny).
Jeśli chodzi o to, dlaczego tak się dzieje, myślę, że jest to połączenie (1) polityki - przewodniczący nie są otwarci ani nie mają osobistych korzyści / sponsorów oraz (2) lenistwa - profesorowie byli kiedyś studentami i uczą tego, co wiedzą lub lubią.
źródło
Calvin college w Grand Rapids Mi. Kiedy przeszli z Javy na Python na wstępne zajęcia z programowania, profesor z niedowierzaniem wspomniał o grupie pod koniec semestru: „Wielu z nich potrafi programować, to niesamowite”. Jego zdumienie kontrastowało z wcześniejszymi doświadczeniami z Javą. To nie sprawia, że Java jest złym językiem, po prostu trudnym do opanowania od zera. Twierdziłbym to samo o C, C ++ lub dowolnym języku wymagającym dogłębnej znajomości schematów lub typów alokacji pamięci.
źródło
Uzyskałem dyplom inżynierii systemów komputerowych, więc studiowałem montaż, mikroprocesory, VHDL, jakie są bramki logiczne i jak z nich stworzyć flip-flop, studiowałem obwody elektryczne, wzmacniacze operacyjne, filtry dolnoprzepustowe, amplitudę modulacja, zbudował obwód w laboratorium, który brzmiałby jak klawiatura telefonu, pomieszany z analizatorem logicznym, wziął kilka zajęć z fizyki. Po stronie Linuksa - skompilowałem wcześniej jądro, napisałem mały sterownik urządzenia i system plików zadań domowych.
Ale potem zdałem sobie sprawę, że bardziej lubię więcej rzeczy na wysokim poziomie. Wolę Python od C. Lubię C # i uwielbiam śmietnik. Lubię matematykę, algorytmy i struktury danych, ale nie jestem szczególnym fanem wskaźników - mogę z nimi zadzierać; Po prostu nie chcę.
Uważasz więc, że uniwersytet powinien uczyć więcej C, mniej Java. Ktoś inny uważa, że powinien uczyć wszystkiego w systemie. Spolsky weźmie oba.
Tak, prawdą jest, że dyplom uniwersytecki to tylko kartka papieru, ale „nie pozwól, aby edukacja przeszkadzała w edukacji”. Zawsze istnieje Wikipedia, Stack Overflow, Coursera.org itp. Wygląda na to, że tradycyjne uniwersytety staną się mniej ważne.
Gdybym mógł zrobić licencjat, to poszedłbym do innej szkoły, nie studiowałbym żadnych elektrotechniki, a raczej matematykę, CS + moll z fizyki i francuskiego. Scratch French; Powinienem był uczyć się za granicą w Szwajcarii i uczyć się w tym czasie 5 języków naturalnych. Chciałbym też wrócić i znaleźć osobę, która mnie przekonała, że absolutnie muszę wziąć udział w zajęciach ekonomicznych na studiach, aby przetrwać w prawdziwym świecie i uderzyć go w głowę moją kolekcją książek Miltona Friedmana (tylko kilka książki na temat ekonomii, które czytam, które nie są do kitu). Nie zapłaciłbym także za książkę Freakonomics 1 lub książkę o języku Perl.
Z perspektywy czasu zrobiłbym wiele rzeczy inaczej. Wszystko, co mogę teraz zrobić i polecam to, to wybrać własną przygodę: http://www.codinghorror.com/blog/2008/03/choosing-your-own-adventure.html
Z perspektywy czasu zarobiłbym do tej pory 100 miliardów dolarów na giełdzie i zainwestowałbym to w badania nad rakiem, zatrudniłbym naukowców, aby pozbyli się świata plastikowych odpadów; Przekazałbym wystarczającą ilość pieniędzy na kampanię Rona Paula, aby wojna na Bliskim Wschodzie miała miejsce ponad 3 lata temu.
Rozpoznaj teraz, że nigdy nie odzyskasz swojego czasu, więc staraj się go mądrze wykorzystywać.
źródło
Kilka lat temu czytałem gdzieś, że w Wielkiej Brytanii podjęto decyzję o Javie, aby zachęcić więcej studentów do programowania. Najwyraźniej było to łatwiejsze dla mózgu z powodu braku nieprzyjemnych wskazówek i zarządzania pamięcią itp. Domyślam się, że właśnie dlatego Python jest szybko adoptowany jako nowe „narzędzie do nauki”. Byłbym zdania, że twój typowy kurs uni nie uczyni cię programistą. Wystarczy uzbroić cię w pewną wiedzę i przygotować do programowania. Dzień, w którym można się nazywać programistą, zwykle przychodzi dość długo po uni, a kiedy nadchodzi, wskaźniki, zbieranie śmieci i paradygmaty programowania inne niż OOP nie powinny stanowić problemu.
źródło
Dlaczego używana jest Java?
Trzy powody:
Java używa składni w stylu C. Wielu programistów zna go, więc zmniejsza to krzywą uczenia się.
Pieniądze wydano na promocję Javy jako fajnej i nowoczesnej. Ale w porównaniu do seplenia java żyje w epoce kamienia łupanego.
JVM. JVM to jedna fajna rzecz w Javie, która jest legalna, nie tylko marketingowy szum. Chociaż JVM należy chwalić jako platformę do uruchamiania programów, sam w sobie nie zasługuje na istnienie języka Java. Możesz teoretycznie i praktycznie skompilować wiele różnych języków dla JVM.
źródło
Twoje pytanie potwierdza ustalenia innej osoby, która napisała artykuł stwierdzający, że Java jest tak fajna, ale niewystarczająco ciężka do naukowego przetwarzania. Myślę, że powinien po prostu używać Big Decimal ze wszystkimi jego dokładnymi dokładnościami, sieciami NAN itp. I zaczynać.
Chcę żyć tylko w świecie automatycznych śmieci. Jest zdrowszy, czystszy, schludniejszy, estetyczny, zapobiega marnowaniu pieniędzy na wydatki zdrowotne, jest bardziej pożądany - nie trzeba oznaczać czegoś jako niechcianego - po prostu usuwając z niego odniesienie lub ustawiając go na zero lub gdy wychodzę poza zakres, przedmiot dostaje się automatycznie oznaczono do śmieci.
Ok, teraz mówię tylko o Javie, ale byłoby to najbardziej pomocne, gdyby działało to również w prawdziwym scenariuszu śmieci. Java jest pisana raz uruchamiana w dowolnym miejscu, co jest dla mnie wystarczająco dobre, aby używać jej jako języka w szkołach. Brak wycieków pamięci i bycie lubianym przez szczęśliwych programistów, którzy nie chcą tracić czasu na oznaczanie każdego obiektu, którego używają i przestają się używać, jest dobrą logiką w imieniu Java.
Java ma wskaźniki - no to nazywamy je referencjami. String s1 = "Hello"; String s2 = "Hello"; String s3 = new String („Hello”);
s1 i s2 będą wskazywać na ten sam obiekt String - który jest przez odniesienie s1 == s2, s1.equals (s3), ale s1 == s3 jest fałszem, ponieważ s3 jest nowym obiektem odniesienia - jest to arytmetyka java odwołań, a ja rozumiem to wszystko bardzo przepraszam, nie chcę być oznaczony jako ktoś, kto nie rozumie ukrytych zawiłości arytmetyki wskaźników z C lub C ++.
źródło