Latem miałem szczęście dostać się do Google Summer of Code. Wiele się nauczyłem (prawdopodobnie więcej, niż nauczyłem się w sumie wszystkich zajęć na uniwersytecie). Naprawdę zastanawiam się, dlaczego nie uczą kilku rzeczy, których nauczyłem się wcześniej w szkole. Aby wymienić tylko kilka:
- testów jednostkowych
- kontrola wersji
- zwinny rozwój
Wydaje mi się, że spędzają dużo czasu ucząc z góry innych rzeczy, takich jak struktury danych i algorytmy. Chociaż nadal uważam, że bardzo ważne jest, aby się ich uczyć wcześnie, dlaczego nie nauczą więcej z tych trzech wcześniej? A może to tylko moja szkoła nie uczy wiele z tych rzeczy?
Nie zrozum mnie źle, nie sądzę, by uczelnie zawsze nauczały najmodniejszych modów programowania, ale czy moi profesorowie nie powinni uczyć mnie czegoś innego niż „narysuj diagram, zanim zaczniesz programować”?
źródło
Odpowiedzi:
Najprostszą odpowiedzią na twoje pytanie jest to, że dziedziny informatyki i tworzenia oprogramowania są bardzo nowe i niezbyt dobrze rozumiane. Chociaż w dzisiejszych czasach wszystkie dyscypliny naukowe i inżynieryjne rozwijają się szybciej, inne dziedziny mają dużo większe doświadczenie, z którego można czerpać i istnieje dużo szersze wspólne rozumienie ich działania.
Na przykład, pomimo ostatnich postępów w materiałoznawstwie, inżynierowie od około 2000 lat wiedzą, jak zbudować łuk, który się nie przewróci, a jest to coś, czego można się nauczać i czego można się nauczyć na uniwersytecie przy stosunkowo niewielkich kontrowersjach. Chociaż całkowicie zgadzam się z Tobą co do technik, których twórcy oprogramowania powinni się nauczyć, niniejsza umowa jest oparta na osobistych doświadczeniach i nieformalnym uzasadnieniu. Aby być społecznie akceptowaną „najlepszą praktyką”, potrzebujemy danych ilościowych, których zebranie może być bardzo kosztowne: na ile pomaga kontrola wersji? Jak to pomaga? Testów jednostkowych? Możemy wnioskować o skuteczności różnych technik, ale faktycznie udowadniając, że skuteczność byłaby ostatecznie bardzo kosztowna. Musielibyśmy przeprowadzić kompletny, realistyczny projekt oprogramowania od początku do końca, wiele razy, z grupami programistów, którzy mają równoważną wiedzę i używają różnych technik. Przynajmniej potrzebowalibyśmy wielu danych o istniejących projektach, których te projekty nie chciałyby opublikować.
Inżynierowie budowlani mają do obejrzenia tysiące lat mostów i mają mnóstwo informacji. Z drugiej strony programiści mają tylko kilkadziesiąt lat informacji, z których większość jest utrzymywana w tajemnicy, ponieważ organizacje mają niewielką motywację do gromadzenia i publikowania informacji o skuteczności ich twórców, nawet jeśli je zbierają (a większość z nich nie ma 't).
Istnieje również zamieszanie pól. Tworzenie oprogramowania, czyli „inżynieria oprogramowania”, to naprawdę coś innego niż informatyka. Twórcy oprogramowania potrzebują praktycznej wiedzy z zakresu informatyki, ale praca na granicy złożoności algorytmicznej lub rozumowanie równoległości nie jest czymś, co pracujący programista będzie robił każdego dnia; podobnie, prawdziwy „informatyk” napisze tony wyrzuconego kodu, który po prostu nie działa lub nie robi nic interesującego i nie skorzysta tak bardzo z rygoru, jak w przypadku rzeczywistego oprogramowania.
Pojawienie się internetu i społeczności open source może dostarczyć wystarczających danych, aby zacząć odpowiadać na te pytania w sposób rozstrzygający, ale nawet gdyby odpowiedzi były dostępne jutro, prawdopodobnie zajmie im 100 lat, zanim przenikną one międzynarodowe społeczeństwo do punktu, w którym wszyscy zgodzą się co do tego, co powinno się uczyć w szkołach.
Wreszcie są pewne względy ekonomiczne. Minęło stosunkowo niewiele czasu, odkąd prawie wszyscy zaangażowani w tworzenie oprogramowania mieli tani i łatwy dostęp do dedykowanych maszyn do uruchamiania dowolnych narzędzi programistycznych. Kilkadziesiąt lat temu poświęcenie maszyny wyłącznie do wykonywania testów lub nawet przechowywanie nieskończonej historii kodu źródłowego wielu osobom wydawałoby się niepoważnie kosztowne.
źródło
Ponieważ nasi nauczyciele:
Uczniowie powinni wziąć sprawy w swoje ręce. Zrobiliśmy to i wyszło dobrze, prawda?
źródło
Leonardo da Vinci napisał:
Dobre szkoły uczą zarówno teorii (struktury danych, algorytmy itp.), Jak i praktyki (testy jednostkowe, kontrola wersji itp.). Wymaga to odpowiedniego połączenia zdolności, aby można było odpowiednio uczyć obie strony tej monety. Wydział złożony wyłącznie z typów teoretycznych bez prawdziwego doświadczenia nie wystarczy. Podobnie, wydział złożony wyłącznie z praktyków nie będzie tego robić. Potrzebujesz mieszanki, a dobre szkoły to mają.
źródło
Informatyka zawsze była w pewnym stopniu sprzeczna; Część dotycząca komputerów nie jest nauką, a część dotycząca nauki nie dotyczy komputerów.
Uniwersytety zwykle opierają się bardziej na „nauce” (algorytmy, struktury danych, kompilatory itp.), Ponieważ te rzeczy są znacznie bardziej „ponadczasowe” niż obecne najlepsze praktyki branżowe, które ewoluują i zmieniają się z roku na rok. Na przykład Kontrola wersji przeszła niesamowite zmiany w ciągu ostatnich 5 lub 10 lat, ale duże-O nadal jest duże-O, a haszowanie, btrees i rekurencja są nadal tak samo przydatne, jak 40 lat temu. Ich pomysł polega na tym, aby dać ci wystarczające podstawy, abyś mógł wybrać narzędzia takie jak git i zrozumieć, co to znaczy, gdy powiedziano ci, że podstawowa struktura danych jest acyklicznym ukierunkowanym wykresem skrótów SHA-1 i że programiści ciężko pracowali aby zoptymalizować liczbę wywołań systemowych, tak aby była ona związana z operacjami io.
Teraz zastanów się, skąd nauczyłeś się wszystkich rzeczy, które musiałeś wiedzieć, aby zrozumieć ostatnie zdanie - jeśli odpowiedź brzmi „uniwersytet”, to wykonują dobrą robotę.
źródło
Wszystko to przemijająca moda. Nauczysz się więcej na pierwszym roku studiów niż przez wszystkie lata na uczelni. Informatyka nie ma nic wspólnego z komputerami.
College zapewnia zestaw narzędzi pełen narzędzi. To jest śrubokręt, czyli klucz półksiężycowy. MOŻESZ użyć każdego narzędzia raz na studiach. Kiedy wchodzisz do prawdziwego świata, naprawdę dowiadujesz się, co masz. Od reszty odkładasz te przydatne, które na wszelki wypadek chcesz zostawić w domu na stole warsztatowym, a które na co dzień trzymasz w kieszeni.
Tqm, Iso, Cmm, Agile, itp. To wszystko mody, które nadejdą i odejdą, żadna z udanych nie jest czymś więcej niż tylko zdrowym rozsądkiem. Wszyscy odnoszący sukcesy inżynierowie i firmy używają pewnego posmaku zdrowego rozsądku, to właśnie sprawiło, że odnieśli sukces, niewielu potrzebowało na to nazwy. Problem w tym, że nie można sprzedawać zdrowego rozsądku, menedżer nie może udowodnić swojej wartości firmie, szkoląc się i kupując zdrowy rozsądek bez chwytliwej nazwy. Umieść na nim nazwisko, które ich przełożeni przeczytali w jakimś artykule prasowym lub czasopiśmie, a kierownik zachowa swoją pracę, a ty swoją. Bardzo niewiele firm, które twierdzą, że stosują się do tych praktyk, faktycznie to robi. Większość wypisuje czek do konsultanta i otrzymuje roczny lub dożywotni certyfikat do jakiegoś klubu, aby mógł umieścić grafikę na swojej stronie internetowej lub etykietę na pudełku, w którym znajduje się ich produkt. Wielu będzie argumentować, że to rzadkie ... Byłem tam, widziałem, zdarza się. To wszystko jest częścią biznesu, czasami trzeba iść na skróty, aby pozostać dochodowym i mieć otwarte drzwi i włączone światła. Zagorzali zwolennicy wszystkich tych praktyk wszyscy argumentowali, że ostatnia była modą, a ta nie, ostatnia była naprawdę zbyt droga, aby ją naśladować, ta nie jest. Ostatni był fałszywy, że właśnie zatrudniłeś konsultanta, ten jest prawdziwy. Podobnie jak języki programowania, one również będą ewoluować. Ostatni był fałszywy, że właśnie zatrudniłeś konsultanta, ten jest prawdziwy. Podobnie jak języki programowania, one również będą ewoluować. Ostatni był fałszywy, że właśnie zatrudniłeś konsultanta, ten jest prawdziwy. Podobnie jak języki programowania, one również będą ewoluować.
Twoja umiejętność zrozumienia realiów biznesu, systemu uniwersyteckiego i twojej w nim roli jest kluczowa. Jak wszystko w życiu, wybierz swoje bitwy. To nie jest uniwersytet, biznes, rząd ani praca kogokolwiek innego, aby uczyć, czego potrzebujesz lub chcesz wiedzieć. Twoim zadaniem jest szukać numeru jeden. Podobnie nie możesz winić nikogo innego za zapewnienie Ci czasu na to, musisz to zrobić. Spadniesz z konia, nie jesteś ofiarą, wstaniesz i wrócisz, żadnych wymówek, życie nie jest sprawiedliwe. Korzystaj z ulotek, nie udawaj niezależności. I na pewno spłacaj swoje długi, nie wysysaj z kompanii jałmużny, nie dając im w zamian czegoś (najlepszego w tamtym czasie?).
Dlaczego ludzie uważają, że cmm lub agile lub którykolwiek z pozostałych jest modą? Dlaczego myślą, że tak nie jest? Dlaczego profesor uczył cię w ten sposób programowania? Aby uniknąć gotos, uniknąć stałych lub uniknąć tego i tamtego? Czy to dlatego, że tworzy bardziej niezawodny kod? Lepiej działający kod? Zmniejsza błąd ludzki? A może dlatego, że łatwiej jest ocenić prace / programy, dając im więcej czasu na zbadanie sprawy? Czy to dlatego, że nie wiedzą, jak programować, a po prostu śledzą czyjąś książkę na ten temat? Czy nauczyli Cię, że nie możesz mieć łatwego w utrzymaniu, niezawodnego i wydajnego kodu? Nie możesz nawet „wybrać dowolnych dwóch”, które można konserwować, koliduje z niezawodnością i wysoką wydajnością? Czasami poświęcasz niezawodność dla wydajności. Czasami nie zależy Ci na niezawodności ani wydajności, po prostu chcesz pobrać wersję 117.34. 2 innego programu księgowego w wersji 118.0.0. Twój model biznesowy opiera się na sprzedaży aktualizacji wersji i pomocy technicznej, a jeśli chodzi o twórców oprogramowania, każdy stary robot może napisać ten sam kod w ten sam sposób. Wymień wypalony na nowy i sprzedawaj ulepszenia.
Nie ma uniwersalnych odpowiedzi na te pytania, musisz dowiedzieć się, jakie jest Twoje zdanie, żyć z nim i go bronić. Zmień zdanie, żyj z tym i broń go.
Kwestionuj wszystko ... czy naprawdę się spalę, jeśli dotknę gorącego garnka na kuchence? Czy psychologiczne skutki lęku spowodują więcej szkód niż zwykłe poparzenie? Czy istnieje bezpieczny sposób na sprawdzenie odpowiedzi bez zranienia?
Kiedy mogłem sobie na to pozwolić, kupowałem i ostatecznie topiłem tranzystory, kapsle, rezystory itp. W moim pokoju w akademiku, z których wszystkie mają charakterystyczny nieprzyjemny zapach. Zakup wzmacniacza do zestawu stereo jest znacznie tańszy i łatwiejszy niż próba zbudowania go dzień po pierwszej klasie tranzystorów. Linus jest wyjątkiem, oczywiście, że łatwiej jest po prostu kupić system operacyjny niż go napisać ... Możesz zrobić więcej, chociaż to, czego się wtedy nauczyłeś, jest inne niż to, czego nauczył się Linus.
Świat wewnątrz i na zewnątrz uniwersytetu przyjmie te formuły (cmm, agile, itp.) Do rozwiązywania problemów, a gdy pojawi się następny, porzuci je równie szybko. Nie musisz używać kontroli wersji, aby odnieść sukces, jest tyle samo sukcesów z i bez (właściwie ze względu na wiek branży jest o wiele więcej sukcesów bez kontroli wersji). Podobnie możesz odnieść sukces przy minimalnym testowaniu (spójrz na naprawdę wielkie nazwiska w branży komputerowej jako przykłady). Możesz odnieść sukces, testując swój własny kod, jak również odnieść sukces, przestrzegając zasady, że nigdy nie powinieneś testować własnego kodu. Możesz odnieść sukces używając emacsa i możesz odnieść sukces używając vi. Musisz zdecydować, która mieszanka Ci odpowiada i jeśli masz szczęście, znajdź miejsce do pracy, które Ci odpowiada.
Kiedy wychodzisz z college'u i wchodzisz do prawdziwego świata, słuchaj, pracuj i dyskutuj z „starymi zegarami”. Mają od dziesięcioleci do stuleci połączonego doświadczenia, pułapki, w które wpadli, których możesz uniknąć lub przetestować samodzielnie (być może zdajesz sobie sprawę, że nie musisz dotykać gorącego garnka, aby dowiedzieć się, że cię poparzy). Większość z nich widziała co najmniej jedną lub dwie z tych mód, które przychodziły i odchodziły, a zwłaszcza jak bardzo zostały spalone i co zrobili, aby po nich wyjść. Znają wiele różnych sposobów testowania rzeczy, a także nazwy stylów testowania, które pojawiły się i zniknęły. Co działa, a co nie. Gdzie jest ryzyko i jak uniknąć marnowania czasu na styczną. Gdy dojrzejesz i staniesz się starym timerem, przekaż to dalej. Płać za to, czego się nauczyłeś, próbując uczyć tych, którzy za tobą podążają. Pamiętaj, aby nauczyć ich JAK łowić, nie dawaj im po prostu ryby. Czasami trzeba pozwolić im ponieść porażkę, zanim odniosą sukces, nie dopuścić do zbytniego poparzenia.
To, co naprawdę chciałem tutaj powiedzieć, to to, że w tej chwili jesteśmy w rzadkiej sytuacji, w której możemy być świadkami ewolucji równoległego wszechświata (i być może wpływać na to). Tak, informatyka to młoda nauka w porównaniu do fizyki. Ale jednocześnie ewoluował wiele razy. W zależności od tego, gdzie pracujesz iz kim pracujesz, możesz obserwować inżynierów sprzętu. Języki programowania w świecie sprzętu z pewnością nie są nowe, ale nie ewoluowały tak szybko, jak świat oprogramowania. Oprogramowanie miało kilka dekad przewagi. Sprzęt zawsze uważał inżynierów oprogramowania za obywateli drugiej kategorii. Nasza praca jest łatwa, ich praca jest ciężka. (Uwaga: jestem inżynierem sprzętu i oprogramowania). Co ciekawe, w tej chwili nadal mają do czynienia z problemami, które moglibyśmy uznać za elementarne lub infantylne. Dlaczego miałbym używać kontroli wersji, tylko ja pracuję nad tym chipem. Twoje doświadczenia z gcc lub innymi tanimi kompilatorami lub darmowymi IDE nie mogą się równać z drogimi narzędziami, których używam, gdyby firma uważała, że jesteś wystarczająco godny, aby go użyć lub nawet wiedziała, jak go używać, kupiłaby ci kopię. I długą listę innych wymówek. Miałem przyjemność nauczyć się zarówno vhdl, jak i verilog i stać się produktywnym w obu w ciągu tygodnia od tego, co było prawie wyzwaniem od takiego inżyniera sprzętu (pomimo mojego dyplomu informującego, że jestem inżynierem elektrykiem, jestem inżynierem oprogramowania). Chciałem się uczyć tych języków, kiedy narzędzia były dla mnie dostępne, siedziałem w biurze do nocy i uczyłem się. Od tego momentu ten inżynier w szczególności zdał sobie sprawę, że to, co mówiłem, było prawdą, języki to tylko składnia, podstawy programowania są takie same, wszystkie narzędzia robią to samo. To jabłka i jabłka, a nie jabłka i pomarańcze.
Ogólnie rzecz biorąc, nadal trudno jest przekazać wiadomość, że jedna z tych dwóch równoległych branż ma o wiele większe doświadczenie w językach, nawykach programowania, kontroli źródła, testowaniu, narzędziach, środowiskach programistycznych itp. Niż druga. Problem, który próbuję rozwiązać, polega na braniu projektów sprzętu w miarę ich opracowywania, tworzeniu niedrogich symulatorów funkcjonalnych, które możemy powiązać z symulacją (maszyną wirtualną) procesora, abyśmy mogli rozpocząć testowanie sprzętu i opracowywanie testu oraz dostarczane oprogramowanie na długo przed przejściem do krzemu. Nie, nie ma w tym nic „nowego”, ale nie mamy mechanizmu pobierania najnowszego kodu, śledzenia zmian w kodzie, aby zobaczyć, na czym musimy skoncentrować nasz czas. Brak mechanizmu śledzenia dokumentacji definiującej interfejs użytkownika (programistyczny) do sprzętu. Jedna złota kopia znajduje się w czyjejś skrzynce odbiorczej e-mail w formie binarnej i zmienia się tylko wtedy, gdy, cóż, nie musisz czytać Verilog, aby dowiedzieć się, co się dzieje. Czekaj, ten Verilog ma ile lat? Ten błąd, który spędziłem nad tobą cały tydzień, odkryłem trzy tygodnie temu i naprawiłem? Czy po prostu lecimy do jakiegoś wakacyjnego miejsca i bawimy się przez sześć miesięcy, czekając, aż ludzie zajmujący się sprzętem zakończą swoje zadanie i rzucą nam je przez ścianę, czy też wykorzystamy tę okazję, aby spróbować być cierpliwym i optymistycznym i nauczyć ich, że oni istnieją zdroworozsądkowe metody, które nie są tak nachalne, które pozwalają im zarówno wykonywać swoją pracę, tworzyć kopie zapasowe swojej pracy, jak i udostępniać swoje rzeczy do recenzji ... ten Verilog ma ile lat? Ten błąd, który spędziłem nad tobą cały tydzień, odkryłem trzy tygodnie temu i naprawiłem? Czy po prostu lecimy do jakiegoś wakacyjnego miejsca i bawimy się przez sześć miesięcy, czekając, aż ludzie zajmujący się sprzętem zakończą swoje zadanie i rzucą nam je przez ścianę, czy też wykorzystamy tę okazję, aby spróbować być cierpliwym i optymistycznym i nauczyć ich, że oni istnieją zdroworozsądkowe metody, które nie są tak nachalne, które pozwalają im zarówno wykonywać swoją pracę, tworzyć kopie zapasowe swojej pracy, jak i udostępniać swoje rzeczy do recenzji ... ten Verilog ma ile lat? Ten błąd, który spędziłem nad tobą cały tydzień, odkryłem trzy tygodnie temu i naprawiłem? Czy więc po prostu lecimy do jakiegoś wakacyjnego miejsca i bawimy się przez sześć miesięcy, czekając, aż ludzie od sprzętu zakończą swoje zadanie i rzucą nam je przez ścianę, czy też wykorzystamy tę okazję, aby spróbować być cierpliwym i optymistycznym i nauczyć ich, że oni istnieją zdroworozsądkowe metody, które nie są tak nachalne, które pozwalają im zarówno wykonywać swoją pracę, tworzyć kopie zapasowe swojej pracy, jak i udostępniać swoje rzeczy do recenzji ...
Pamiętaj, że inżynierowie sprzętu porzucili college z pudełkiem nowych, błyszczących narzędzi, tak jak Ty. Nauczyłeś się 17 różnych języków programowania, z których możesz używać tylko jednego, reszta języków, którymi będziesz się zajmować, zostanie wymyślona po ukończeniu studiów. Po ukończeniu college'u mogą powiedzieć ci, co wiedzą o rachunku różniczkowym i teorii względności, ile elektronów znajduje się w każdym z pierwiastków i obliczyć ładunek wokół powierzchni Gaussa. Ale większość ich kariery to jeden, zero i, albo i nie (hej, mamy je wspólne, wszystko, co naprawdę musisz wiedzieć o komputerach, jeden, zero i, lub, a nie inżynier sprzętu lub oprogramowania). Znając podstawowe prawa fizyki, rachunek różniczkowy, elektrony nie zmienią się tak szybko jak języki programowania. Ale podstawy programowania są takie same we wszystkich językach i będą obowiązywać w przyszłości. Czy skończyłeś college, wiedząc o tym, czy też odszedłeś, myśląc, że java jest inna i lepsza niż C ++, ponieważ to i tamto i tamto?
Jak każdy inny biznes, zadaniem uniwersytetów jest utrzymanie rentowności. Muszą zatrudniać odpowiednich pracowników akademickich, aby zapewnić zarówno odpowiednich studentów, jak i odpowiednie pieniądze na badania oraz odpowiednie rodzaje badań, aby uczynić uniwersytet opłacalnym. Muszą oferować odpowiednie zajęcia, aby przyciągnąć właściwych studentów i wytworzyć odpowiednich absolwentów, tak aby w miarę upływu dziesięcioleci pracodawcy zarówno w pobliżu uniwersytetu, jak i miejmy nadzieję, że daleko rozpoznali, że ta uczelnia wytwarza produktywnych i dochodowych pracowników. (tak, czasami trzeba przyciągnąć odpowiednich sportowców do odpowiedniego sportu, aby uzyskać odpowiednią ilość czasu telewizyjnego oraz odpowiednią ilość rozpoznawalności nazwiska i przychodów ze sportu). Niektóre uniwersytety będą uczyć C ++ i Javy, inne nigdy nie będą. Niektórzy wymyślą CMM, inni nauczą Agile, inni nie. Jeśli uniwersytet ma jakąkolwiek wartość, jest coś, czego możesz się nauczyć. Nie nauczą cię wszystkiego, czego możesz się nauczyć, ale będą mieli coś pożytecznego. Dowiedz się tego, gdy tam jesteś, zbierz rozsądną liczbę różnych form narzędzi w swojej skrzynce narzędziowej. Opuść uniwersytet i znajdź pracę. Jeśli Twój zestaw narzędzi jest do niczego, może znajdź inny uniwersytet i nigdy nie wspominaj o pierwszym. Jeśli skrzynka narzędziowa jest w porządku, użyj tych narzędzi i zbuduj nowe w swoim czasie. Jeśli to całkiem niezły zestaw narzędzi, powiedz dobre rzeczy o tym uniwersytecie i dobrych naukowcach, od których się tego i owego się nauczyłeś, i zapłać szkole za to, co ci dali. Nawet jeśli nie dostałeś każdego możliwego narzędzia w uniwersalnym katalogu narzędzi uniwersyteckich, odejdziesz z pewnym podzbiorem. Nawet jeśli nie ukończysz studiów ...
źródło
Uczyłem tych rzeczy, kiedy byłem adiunktem w Oregon Institute of Technology. Są nauczani, tylko rzadko.
źródło
Najprostsza odpowiedź jest taka, że studiujesz informatykę, a rzeczy, które wymieniłeś, nie są tak naprawdę związane z akademicką dziedziną informatyki. Tworzenie oprogramowania może być czymś, co robisz z informatyką, czymś, co opiera się na blokach tego, czego się nauczyłeś ... ale informatyka i tworzenie oprogramowania to nie to samo.
Klasy, które nauczył cię kontroli wersji, czyli jak napisać skuteczne testy jednostkowe ... że byłoby nauczanie wam handel , a mianowicie (dobrze) rozwoju oprogramowania.
źródło
o Boże, nie zaczynaj mnie
Kiedyś dziekan cs na renomowanym uniwersytecie powiedział mi, że programowanie obiektowe to tylko `` fanaberia '', więc nie oferowali żadnych zajęć z przechodzenia fantazji, takich jak C ++
dlaczego nie uczą tych rzeczy, cóż, szkoła jest po to, aby nauczyć Cię podstaw tej dyscypliny, niekoniecznie najlepszych praktyk w branży
źródło
Cóż, z uniwersytetami jest to, że muszą uczyć rzeczy, które są naprawdę uniwersalne. Coś w rodzaju zwinnego rozwoju jest wciąż całkiem nowe i pomimo tego, jak wiele się o nim mówi w Internecie, nie jest używane wszędzie, więc nauczenie go całej klasy uczniów mogłoby przynieść korzyści tylko kilku osobom, które trafiły do zwinnych sklepów.
Jednak kontrola wersji jest obecnie czymś niewybaczalnym. To jest coś, co każdy musi zrozumieć, że jest to narzędzie prawie tak samo przydatne jak kompilator, a CVS istnieje już od ponad 20 lat. Pojęcia te muszą być zrozumiane przynajmniej przez każdego programistę opuszczającego uniwersytet. Na szczęście, jeśli wykonujesz jakąkolwiek pracę grupową na uniwersytecie, możesz mieć szczęście, że wylądujesz z kimś, kto już wie o kontroli wersji i przekonuje twoją grupę do jej użycia. Wiem, że cieszę się, że ta osoba była w mojej grupie.
Testowanie jednostkowe jest równie niewybaczalne. Jedyne, co powiedziałbym, to to, że książka wciąż jest w fazie rozwoju opartego na testach i dążenie do 100% pokrycia kodu zawsze może być większym kłopotem niż jest tego warte. Ale testowanie jednostkowe jest niezwykle cenne i powinno być omówione na kursie inżynierii oprogramowania. Wyobrażam sobie, że niektóre z tych rzeczy trafiają na niektóre uniwersytety, ale po prostu nie dotarły jeszcze do wszystkich.
źródło
Dlaczego nie, rzeczywiście? Moje doświadczenie z uzyskaniem stopnia informatyka było prawie takie samo. Powodem jest to, że ludzie, którzy uczą programowania, nie programują, o ile wiem. Nie jest wymagane nauczanie tych rzeczy do akredytacji, nauczyciele nie są z tym zaznajomieni, a uczniowie nigdy nie opracowują projektów o jakimkolwiek znaczeniu w ramach swoich zajęć. Nie ma motywacji, aby faktycznie uczyć programowania, w przeciwieństwie do nauczania teorii CS lub składni Javy.
źródło
Informatycy uważają, że są matematykami, a nie inżynierami, dlatego wolą uczyć części matematyczne niż inżynierskie. Testowanie, kontrola wersji i dokumentacja nie przechodzą przez modę bardziej niż w jakiejkolwiek innej dyscyplinie inżynierskiej.
źródło
To zależy od uczelni. Ukończyłem studia w 2003 roku na australijskim uniwersytecie. W tym czasie nauczyliśmy się UML, testów jednostkowych, XP (i innych metodologii Agile), a także wszystkich formalnych rzeczy, takich jak Z, algorytmy i struktury danych, systemy operacyjne itp.
Nie omawiali jednak zbyt szczegółowo testów jednostkowych, bardziej po prostu zapłacili za zaliczenie jednego wykładu. Byłoby wspaniale, gdybyśmy nauczyli się pisać efektywne testy jednostkowe, a nie tylko „Co to jest test jednostkowy”.
Jeśli chodzi o kontrolę wersji, używaliśmy go (CVS) w naszych projektach programistycznych od drugiego roku.
Zgadzam się również z tym, co powiedział Glyph. CS to tak niedojrzała dziedzina, tak naprawdę dopiero w ciągu ostatnich 50 lat, że nie wiemy, czego powinniśmy się uczyć, a co jest tylko przemijającą modą. Daj mu 150 lat, a wtedy sytuacja może się bardziej uspokoić. Liczba nieudanych projektów w świecie rzeczywistym pokazuje, że jest to niedojrzała branża. Wyobraź sobie, że 80% projektów budowlanych nie powiodło się!
źródło
Wszystko to można łatwo (płytko) omówić w jednej klasie dotyczącej praktyk tworzenia oprogramowania. Nie jest to część większości programów nauczania CS, ponieważ nie o to chodzi w CS, chociaż myślę, że niektóre informacje na ten temat są przydatne. Moja szkoła miała taką klasę; nie obejmował kontroli wersji, ale obejmował UML, zbieranie wymagań, metodologie rozwoju (różne zwinne i kaskadowe), testy jednostkowe, testy integracyjne itp. i wymagał od nas pracy w zespołach 4-5 osobowych w celu opracowania projektu (raczej proste oszustwo Clue w Javie). Jeśli poczułeś potrzebę dalszych zajęć z inżynierii oprogramowania, były one dostępne jako fakultatywne.
Pomimo tego, że nigdy nie wspomniano o kontroli wersji na żadnych zajęciach, w których brałem udział, większość moich znajomych używała jej do osobistych projektów, zadań klasowych i tak dalej, więc nie jest tak, jakbyśmy nie byli na to narażeni. Osoby, które nie podniosły go samodzielnie, zostały zmuszone do jego użycia przez kolegę z klasy w trakcie zadania zespołowego.
Uniwersytet ma uczyć pojęć i teorii, ponieważ są to rzeczy, które są trudne do samodzielnego przyswojenia. Kontrola wersji to narzędzie, które jest dość łatwe do opanowania. Użyj go trochę, przeczytaj kilka samouczków w Internecie i gotowe. Jeśli potrzebujesz wykładów i zadań domowych, aby dowiedzieć się, jak sprawdzić coś z SVN, będziesz miał wiele problemów z rzeczami, które w rzeczywistości SĄ trudne.
Pamiętaj, że istnieje wiele sposobów uczenia się rzeczy na studiach poza zajęciami; skorzystaj z tego. Dużo płacisz za udział w zajęciach i korzystanie z udogodnień, więc dojesz wszystko, co warto i chodź na spotkania LUG i ACM, uczestnicz w zespołach projektowych (zawsze jest kilku ME budujących robota, który potrzebuje programisty) lub zdobądź praca zarządzająca serwerem działu humanistycznego. Wybierz komputer ze stacji ładującej budynku inżynierii materiałowej, pobierz plik ISO systemu Linux z szybkim połączeniem internetowym w akademiku i pobaw się.
źródło
Myślę, że problem polega na tym, że uniwersytety nie czują, że muszą uczyć Cię profesjonalizmu, ale zamiast tego skupiają się na akademickiej stronie programowania. Pomyślałbym, że powinno być przynajmniej odniesienie do najnowszych metod i technik stosowanych w przemyśle, ponieważ te rzeczy są również przedmiotem zainteresowania akademickiego.
Na naszym kursie uczono nas procesu tworzenia oprogramowania osobistego, który obejmował takie rzeczy, jak nagrywanie czasu poświęconego na projekty, dobre komentarze itp., Ale nie wspominano o profesjonalnych podstawach, takich jak kontrola wersji.
źródło
Podałeś 3, z których niektóre nie są moim zdaniem tak ważne dla zrozumienia systemów komputerowych (np. Kontrola wersji). Te rzeczy są częścią pracy i możesz zostać dobrym programistą / informatykiem, nie wiedząc o tym.
podobnie w przypadku testów jednostkowych - po co wybierać testy jednostkowe? Z pewnością ważniejsze są testy użyteczności, testy systemu, testy akceptacji użytkownika i testy akceptacji fabrycznej? Cóż, są, chyba że uznasz, że twoja praca jest zakończona, gdy kod zostanie wysłany do działu konserwacji :)
Pomyśl o innych koncepcjach, których używam na co dzień, a które byłyby mało przydatne dla ucznia, który radziłby sobie z podstawami oprogramowania i systemów komputerowych:
Powyższe to wszystkie „umiejętności miękkie”, których nie trzeba pisać dobrego kodu.
Jeśli jednak brakuje Ci „twardych” umiejętności, takich jak struktury danych i algorytmy, szansa na napisanie dobrego kodu jest prawie niemożliwa.
źródło
Tego wszystkiego nauczyłem się na uniwersytecie. Być może zależy to od wybranych przez Ciebie kursów? Moje kursy były bardzo zróżnicowane (projektowanie oprogramowania, projektowanie interfejsu użytkownika, eCommerce, sztuczna inteligencja, programowanie funkcjonalne itp.). Projektowanie oprogramowania miało kontakt z wzorcami projektowymi i testami jednostkowymi (jeden duży projekt, który obejmował różne rzeczy). UI Design ... byliśmy trzyosobową grupą pracującą nad projektem. Nie mogliśmy nic zrobić bez kontroli wersji, więc mamy to. A zwinny rozwój był czymś, o czym nasi profesorowie ciągle nam mówili, ale pozostawili to każdej grupie, aby z niego korzystała.
Zauważyłem, że wielu studentów uniwersytetu brało udział w „łatwych” kursach lub kursach, które dawałyby im wysoki GPA. Inni koncentrują się na tym, czego chcą się nauczyć i w dużej mierze badają, jaka dziedzina ich zainteresuje. Są też tacy, którzy dokładnie wiedzą, czym się interesują ... co jest dobre, z wyjątkiem tego, że nie urozmaicają swoich kursów.
źródło
Aby odpowiedzieć, dlaczego te rzeczy nie są pierwszą rzeczą, której się uczy: programy licencjackie zazwyczaj przygotowują Cię do uzyskania tytułu magistra. Dopiero gdy zaczniesz wybierać własne kursy (co zwykle ma miejsce w późniejszych latach), możesz zdecydować się uczyć o rzeczach używanych poza środowiskiem akademickim. Dlatego skupiają się na algorytmach, strukturach danych, przedstawianiu nierozwiązanych problemów itp.
Osobiście uważam, że to dobrze, że to robią. Programowanie nie jest tak łatwe, jak wielu z nas się wydaje; wiele osób boryka się z tym. Wolałbym, żeby ci ludzie najpierw zrozumieli, jak działa pętla for, zanim zorientują się, jakim potworem jest Perforce.
źródło
Nie uczą takich tematów, ponieważ większość szkół ma charakter akademicki, a nie branżowy. Oznacza to, że mają na celu nauczanie pomysłów i teorii, a nie szkolenie zawodowe. Cała koncepcja QA nie ma nic wspólnego z informatyką poza przekazaniem dowodu matematycznego. Poza tym praktyki zapewniania jakości i przepływy pracy rozwojowej różnią się znacznie w zależności od domu programistycznego, więc nauczanie ich w szkole jest stratą czasu i pieniędzy.
źródło
Nauczyłem się tego wszystkiego na pierwszym roku, z wyjątkiem zwinnego rozwoju.
Chodzi o wybór odpowiedniej szkoły, IMHO. Jeśli znajdziesz się w pierwszej dziesiątce, szybko się tego wszystkiego nauczysz.
Jeśli chodzi o ogólną edukację CS, w zasadzie prosimy profesorów, aby nauczali tak dużo (języków każdego rodzaju, struktur danych, wydajności czasu wykonywania, jak rzeczy faktycznie działają na poziomie bitowym). Chciałbym zadać pytanie, dlaczego dzieci nie wezmą na siebie, aby dowiedzieć się więcej o inżynierii oprogramowania?
źródło
Podobnie jak studenci, każda uczelnia jest inna. Niektóre uczelnie, a dokładniej, niektórzy profesorowie są oporni na zmiany lub są leniwi. Na szczęście większość nie. Teorie, koncepcje, historia itp. Są ważne i kluczowe dla każdego programu nauczania CS. Ale tak samo jest z przygotowaniem ucznia do pracy. Nic dziwnego, że uczelnie lokalne w mojej okolicy oferują bardzo aktualne i odpowiednie kursy CS. Nie tak bardzo z dużą, renomowaną i prestiżową uczelnią.
źródło
Dzieje się tak po prostu dlatego, że struktury danych i algorytmy stanowią rdzeń obliczeń, a tym samym są znacznie ważniejsze. Testowanie jednostkowe, kontrola wersji i zwinna metodologia to tylko narzędzia handlu (i jeśli to konieczne, oczekuje się, że można je wykorzystać w pracy).
źródło
Myślę, że dobre programy CS powinny uczyć podstaw, które posłużą za podstawę całej przyszłej edukacji programistycznej. Metodologie programistyczne, takie jak Agile, i narzędzia do kontroli wersji są jak mody; przychodzą i odchodzą. Ponadto są one zwykle używane w środowiskach branżowych, a nie akademickich, więc myślę, że uniwersytety rzadko zajmują się takimi rzeczami, jak te, których prawdopodobnie nauczysz się w pracy. Nie mówię, że to prawda, ale taka jest prawdopodobnie mentalność akademicka.
źródło
Zgadzam się z tym, co mówisz. Niedawno zacząłem pracować w świecie tworzenia oprogramowania i już zacząłem uczyć się o zwinnym programowaniu, czymś, czego nigdy nie uczono mnie na uniwersytecie.
Faktem może być, że profesorowie uniwersytetów nie nadążają za nowszymi technikami rozwoju tak bardzo, jak powinni. Mogą też czuć, że w ich programie nauczania są inne, ważniejsze rzeczy.
źródło
Wykładowcy uniwersyteccy nie wiedzą, jak pisać oprogramowanie, po prostu je badają, uczą i od czasu do czasu rozbijają kod, który musi działać tylko do momentu publikacji artykułu.
Tylko dzięki ludziom takim jak Titus mamy naukowców, którzy naprawdę grokują programowanie - przeczytaj jego komentarze na ten temat tutaj
Kiedy byłem studentem, czytałem w bibliotece książki o programowaniu ekstremalnym i omawialiśmy je krótko na zajęciach - tych samych zajęciach, które wymagały dostosowania się do „modelu wodospadu” tworzenia oprogramowania, gdzie „kompilacja” jest krokiem jego posiadać.
Życzę wszystkiego najlepszego w Twojej karierze, mam nadzieję, że ukończyłeś studia, fajnie jest mieć litery po nazwisku. :)
źródło
Wszystkie trzy rzeczy, o których wspomniałeś (testowanie jednostkowe, kontrola wersji, programowanie zwinne) są w pewnym stopniu nauczane w programie informatyki na Uniwersytecie w Groningen. Czy to dobra rzecz, zostawię otwarte pytanie; ale nie jest prawdą, że żaden uniwersytet nie uczy cię „praktycznych rzeczy”.
źródło
Są one oparte na moich ograniczonych doświadczeniach w programie CS, zanim zmieniłem kierunek, oraz na moim doświadczeniu jako stażysta w dużej firmie programistycznej. Testowanie jednostkowe nie jest nauczane, ponieważ większość programów, które musisz stworzyć, nie jest wystarczająco duża, aby wymagać automatycznego testowania, gwarantujesz określony zestaw danych wejściowych, więc możesz przetestować wszystko ręcznie. Nauczenie cię, jak zautomatyzować testowanie, może również przeszkadzać w ocenie twojego projektu, ponieważ większość projektów jest oceniana za pomocą skryptów, które uruchamiają testy automatyczne, z szybkim spojrzeniem na kod, aby upewnić się, że nie masz int foo1; int foo2; i stosujesz odpowiednie wcięcia.
Nie wiem, dlaczego kontrola wersji nie byłaby nauczana, ale część tego jest prawdopodobnie związana z wielkością projektów. Nigdy nie miałem projektu, który byłby wystarczająco duży do kontroli wersji, a ogólnie mam na myśli ponad 1000 linii kodu, a napisanie zajęło cały semestr. Sądzę, że pomyślą, że jeśli będziesz tego potrzebować, nauczysz się tego. Wszelkie projekty grupowe, które miałem, miały być projektami programistycznymi w parach i po co używać kontroli wersji, skoro oba są na tym samym komputerze?
Nie wiem, dlaczego programowanie zwinne nie byłoby nauczane, ale prawdopodobnie wraca do tego samego z rozmiarem programu. Chociaż programowanie adgile jest powszechne w przypadku nowego oprogramowania, które działa na komputerach osobistych i małych serwerach, nie jest ono generalnie używane w systemach takich jak komputery mainframe IBM lub w problematycznych domenach, takich jak bankowość lub medycyna, gdzie dokumentacja jest najważniejsza. Prawdopodobnie ma to również związek z faktem, że rozwój adgile nie był około 20 lat temu, kiedy przeszkolono wielu profesorów.
źródło
Głównym powodem jest to, że wiele (większość?) Uniwersytetów uważa, że ma inny cel niż szkoła zawodowa. W związku z tym chcą uczyć studentów, jak się uczyć i podstawowych zasad tej dyscypliny. Ponadto algorytmy i struktury danych będą miały zastosowanie do każdego języka programowania i nie są zależne od konkretnych narzędzi (które mogą, ale nie muszą być nadal używane do ukończenia studiów).
W informatyce oznacza to algorytmy, struktury danych, teorię komputerów, teorię kompilatorów itp. To, co wymieniasz, nie dotyczy zrozumienia, jak programować, jak rozwiązywać problemy itp. Chodzi o praktykę programowania (która, nawiasem mówiąc, to niesamowita książka dla każdego studenta, który chce pracować jako programista). Teraz wiele z tego nie będzie używanych w pozycji małpy kodu poziomu początkowego, co prowadzi niektórych ludzi do myślenia, że nie jest to przydatne. Nie zgadzam się. Myślę, że może to być niezwykle przydatne. Nie oznacza to jednak, że po uzyskaniu tytułu informatyka wiesz wszystko, czego będziesz potrzebować do pracy jako programista.
Co również nie oznacza, że rzeczy, o których wspominasz, nie są przydatne. Oni są. Będziesz miał problemy z pracą jako programista, jeśli ich nie nauczysz, i myślę, że powinno się ich uczyć na studiach, przynajmniej do pewnego stopnia. Spojrzałbym na nauczanie kontroli wersji, testów jednostkowych itp. W taki sam sposób, jak spojrzałbym na programowanie na poziomie licencjackim w sztuce oraz nauczanie, czym są pędzle malarskie i które powinny być używane w różnych przypadkach.
źródło
Myślę, że zależy to od rodzaju programu informatycznego, w którym się znajdujesz. Są takie, które są skierowane w stronę badań i nauki, a są takie, które kierują się w stronę strony wdrażania. W szczególności sprzeciwiłem się niektórym szkołom, które miały tylko profesorów pozostających w świecie akademickim. Jeśli nie masz profesorów, którzy „nie używali” tego, czego nauczają, to wszystko jest w ich głowie, dosłownie.
Wtyczka: Po ukończeniu BS w Comp Sci i MS in Soft Eng na Uniwersytecie DePaul uczyłem się głównie przez instruktorów / profesorów, którzy nauczali w niepełnym wymiarze godzin, co było w porządku, ponieważ wolałbym, aby przyszli z anegdotą z poprzedniego dnia i odnieś to do klasy. Ponieważ jest to szkoła głównie dojeżdżająca do pracy / w niepełnym wymiarze godzin, większość uczniów ma pracę polegającą na wykorzystywaniu tego, czego się uczą.
Proces uczenia się wciąż zaczyna się od całej teorii, ale potem zwykle jesteśmy pytani „ilu z was faktycznie używa tego w swojej pracy?” a typowa odpowiedź brzmi: „używamy go, ale w uproszczony lub prostszy sposób”, a następnie przechodzimy do praktycznych scenariuszy z rzeczywistego świata.
Podczas mojej nauki testy jednostkowe były zawsze obecne. Mimo że rozpoczęli cię w Javie, zmusili nas do używania ANT i JUnit we wszystkich projektach. Co było dobrym początkiem konfiguracji kompilacji i testów jednostkowych.
A programowanie ekstremalne było zawarte w około 3 lub 4 zajęciach, w których brałem udział. Pamiętam, że wszyscy zaczynali od 12 różnych aspektów, od programowania w parach po testy jednostkowe (patrz wyżej). A teraz wydaje się, że nacisk kładziony jest na Agile.
Szybka odpowiedź brzmi: tak, są szkoły, które mają bardziej pragmatyczne podejście niż inne.
źródło
Testowanie jednostkowe i kontrola wersji były przedmiotem zajęć na drugim roku informatyki, na których studiowałem. Testy jednostkowe należały do tej części testów, która obejmowała również różnice między białą i czarną skrzynką, a spora część ocen z zadań programistycznych na trzecim roku wymagała dobrej obsługi błędów, które mogą łatwo pochodzić z testów jednostkowych.
Myślę, że rozwój zwinny może być trudny do nauczenia w środowisku akademickim. Chociaż teoretycznie nauczyłem się metody Waterfall, nie zobaczyłem jej w terenie, dopóki nie ukończyłem studiów i nie przeniosłem się do prawdziwego świata, który może być zupełnie inny niż w środowisku akademickim, np. Na trzecim roku popełniam wszystkie dziwne błędy przypadków i prawie zdałem zadanie, w którym nigdy nie dotknąłem sedna tego, czego zadanie próbowało nauczyć mnie o Semaforach.
Ponadto, jak długo istnieje agile i jaką formę zwinności masz na myśli? Jest wiele różnych implementacji tego, co widziałem.
źródło
Nie sądzę, aby zwinne programowanie było modą, ale jednocześnie trudno byłoby mi wymyślić sposób, w jaki nauczyciel mógłby dać Ci projekty, które pozwolą Ci się go nauczyć. Chyba że dali Ci projekt A build a, projekt B rozwiń na. Problemem jest czas i zakres. W 4-miesięcznym kursie byłoby to trudne.
Kontrola wersji i metody testowania jednostkowego ciągle się zmieniają i zależą od języka lub osoby, która je definiuje.
Struktury danych i algo to coś, nad czym można pracować w środowisku klasowym. Szczerze mówiąc, zrozumienie testów jednostkowych i wersjonowania wymaga nieco więcej wysiłku. Postaraj się pamiętać, że część uniwersytetu polega na nauce samouczenia się. Kolaż nie ma tego samego zadania. A przynajmniej nie w tym samym stopniu. MOIM ZDANIEM.
źródło