Pytanie: Czy nauka i sztuka CS są martwe? Rozumiem przez to, że rzeczywiste wymagania dotyczące myślenia, planowania i skutecznego rozwiązywania problemów wydają się obecnie odchodzić od CS. Wydaje się, że dziedzina ta obniża barierę wejścia, aby więcej osób mogło „programować” bez konieczności uczenia się, jak naprawdę programować.
Tło: Jestem absolwentem studiów licencjackich z informatyki. Pracuję na pozycji wyjściowej w przyzwoitej firmie w dziale IT. W swojej pracy głównie używam .NET i innych technologii Microsoft, ale wcześniej robiłem rzeczy związane z Javą poprzez staże i tym podobne. Osobiście jestem programistą C ++ dla moich własnych projektów dla zabawy.
W głębi: Dzięki pracy, którą wykonuję, wydaje mi się, że intensywne dyscypliny prawdziwej nauki nie istnieją już w CS. W przeszłości programiści musieli efektywnie rozwiązywać problemy, aby systemy były niezawodne i szybkie. Ale teraz, dzięki dominującym technologiom, takim jak .NET, Java i języki skryptowe, wydaje się, że wydajność i niezawodność zostały wymienione na łatwość rozwoju.
Większość współpracowników, z którymi pracuję, nie ma nawet dyplomu z informatyki. Większość ukończyła studia z inżynierii elektrycznej, kilka z inżynierii oprogramowania, nawet niektórzy ze szkół technicznych bez czteroletniego programu. Jednak radzą sobie dobrze bez wiedzy technicznej o CS, bez studiowania teorii i algorytmów, bez względu na tworzenie eleganckiego rozwiązania (po prostu wybierają najłatwiejsze, najtańsze rozwiązanie).
Firma namawia nas do korzystania z technologii Microsoft, które usuwają całą prawdziwą myśl i zastępują ją bibliotekami i narzędziami, które mogą automatycznie budować projekt za Ciebie o połowę krócej. Nie nienawidzę języków, rozumiem, że służą one celowi i robią to dobrze, ale kiedy Twoi pracownicy nie wiedzą, jak działa tablica skrótów, używają niewłaściwych metod sortowania lub uruchamiają polecenia SQL, które są okropnie nieefektywne (ale wykonują pracę w odpowiednim czasie), wydaje się, że wkłada się więcej wysiłku w opracowywanie technologii, które kodują nowych „programistów”, a nie uczą ludzi, jak robić dobrze.
Interesuje mnie tworzenie wydajnych i, moim zdaniem, pięknych programów. Jeśli jest na to lepszy sposób, wolę wrócić i przebudować go, niż pozwolić, by się ześlizgnął. Ale w świecie korporacyjnym zmuszają mnie do szybkiego wykonywania zadań, a nie do elegancji. I to mnie naprawdę wkurza.
Czy nie mogę się doczekać reszty mojego życia? Czy są jeszcze miejsca dla ludzi, którzy lubią naukę i sztukę CS, a nie tylko wynagrodzenie?
I z tej samej notatki, oto dobra lektura, jeśli nie widziałeś jej przed The Perils Of Java Schools
źródło
Odpowiedzi:
Tak i nie
Dobre pytanie, ale złe założenie.
Wydaje się, że brakuje części naukowej w edukacji, ale założenie, że nauka była tam tylko po to, aby programy były wydajne, jest błędne.
Nauka była konieczna, aby nauczyć ludzi, jak definiować i rozwiązywać problemy.
Niestety, ta część niektórych programów nauczania „CS” (programów nauczania?) Wydaje się całkowicie pominięta, zastąpiona zabawkowymi problemami z trywialnymi lub znanymi rozwiązaniami i ma na celu jedynie nauczenie znajomości narzędzi
Niezadowalający; wielu absolwentów szkół Java zostało zmienionych, nigdy nie uczyło, jak rozłożyć problem, zaprojektować algorytm, określić test, a nawet skutecznie debugować.
źródło
Szczerze mówiąc, moje dwa centy: nie znajdziesz „informatyki” pracującej w dziale IT w przyzwoitej firmie, ponieważ jest to dział IT, a nie dział CS. Spróbuj wrócić do szkoły na doktorat lub pracować w działach inżynierii firmy, która koncentruje się na informatyce (np. Przetwarzanie obrazu, sieci o wysokiej wydajności, systemy algebry komputerowej, lotnictwo itp.). To tutaj znajdziesz trudne, interesujące problemy, w których niechlujny projekt [ogólnie] nie będzie tolerowany.
Tak, absolutnie, ale prawdopodobnie nie w działach IT średnich firm.
źródło
Jeśli jesteś programistą, nie uważaj się za „informatyka”; informatycy tworzą te następną generację komputerów, z których niektóre wciąż są science fiction, dopóki nie powstanie właściwa mieszanka materiałów, miniatura i teoria obliczeń. To tylko początek rurociągu. Ludzie, którzy tworzą oprogramowanie tu i teraz, są „inżynierami oprogramowania”; biorą teorie i narzędzia, czasami nakładając na siebie praktyczną teorię i narzędzia w świecie rzeczywistym, aby wykorzystać moc w potencjale tego złożonego elementu elektroinicznego czarownictwa i sprawić, że robi to, co chcemy. To z kolei jedna specjalizacja w dziedzinie „inżynierii komputerowej”, która bierze teorie informatyków i stosuje je, sprzęt i oprogramowanie, do rzeczywistych rozwiązań elektronicznych użytkowników końcowych.
W IMO biznes spotyka się z teorią. W tego typu przypadkach stare powiedzenie „wróg lepszy jest wystarczająco dobry” można łatwo odwrócić, aby przeczytać „wróg wystarczająco dobry jest lepszy”. Uznanie siebie za „inżyniera” zamiast „naukowca” i zestawienie tego, co robisz z innymi dyscyplinami inżynierii, przynosi ulgę.
Powiedzmy, że klient przychodzi do ciebie, inżynier budowlany / inżynier, i prosi cię o zbudowanie mostu. Most musi rozciągać się na 20 stóp, sam się utrzymać i jedną tonę ładunku, powinien on trwać 10 lat przy rutynowej konserwacji i chcą go za miesiąc za 20 000 USD. To są twoje ograniczenia; spełniają minimalne wartości, nie przekraczając maksymalnych. Takie postępowanie jest „wystarczająco dobre” i zapewnia wypłatę. Zbudowanie mostu Golden Gate byłoby kiepską inżynierią, znacznie przekraczającą specyfikację projektu i budżet o kilka rzędów wielkości. Zwykle zjadasz przekroczenie kosztów i płacisz kary za przekroczenie czasu. Niewłaściwe byłoby też zbudowanie mostu linowego o masie 5 dorosłych mężczyzn, mimo że kosztował czas i materiały tylko 1000 USD; nie dostajesz dobrych opinii klientów i referencji,
Wracając do oprogramowania, powiedzmy, że masz klienta, który potrzebuje systemu przetwarzania plików zbudowanego do trawienia przychodzących plików i umieszczania informacji w systemie. Chcą, aby zrobiono to w ciągu tygodnia i musi obsłużyć pięć plików dziennie, około 10 MB danych, ponieważ to cały ruch, jaki obecnie otrzymują. Wasze cenne teorie w dużej mierze wychodzą z okna; Twoim zadaniem jest zbudowanie produktu, który będzie spełniał te specyfikacje w ciągu tygodnia, ponieważ robiąc to, dotrzymasz również budżetu kosztowego klienta (ponieważ materiały są na ogół kroplą w koszyku na umowę o oprogramowanie tego rozmiaru). Spędzenie dwóch tygodni, nawet dziesięciokrotnie więcej, nie jest opcją, ale najprawdopodobniej nie jest też programem zbudowanym w ciągu dnia, który może obsłużyć tylko połowę przepustowości, z instrukcją uruchomienia dwóch kopii.
Jeśli uważasz, że to przypadek marginesowy, to się mylisz; jest to codzienne środowisko większości mieszkańców. Powodem jest ROI; ten początkowy program nie kosztuje dużo i dlatego bardzo szybko się zwróci. KIEDY użytkownicy końcowi potrzebują tego, aby zrobić więcej lub przyspieszyć, kod może zostać refaktoryzowany i skalowany.
To główny powód obecnego stanu programowania; założeniem, potwierdzonym przez całą historię komputerów, jest to, że program NIGDY nie jest statyczny. Zawsze będzie wymagało uaktualnienia i ostatecznie zostanie zastąpione. Równolegle ciągłe doskonalenie komputerów, na których działają oba programy, pozwala na zmniejszenie uwagi na wydajność teoretyczną oraz zwiększenie uwagi na skalowalność i równoległość (algorytm działający w czasie N-kwadratowym, ale który można zrównoleglać, aby działał na rdzeniach N wydają się liniowe, a często koszt większej ilości sprzętu jest tańszy niż w przypadku deweloperów w celu opracowania bardziej wydajnego rozwiązania).
Ponadto istnieje bardzo prosta zasada, że każda linia kodu programisty jest czymś innym, co może pójść nie tak. Im mniej programista pisze, tym mniej prawdopodobne jest, że to, co pisze, ma problem. To nie jest krytyka czyichś „błędów”; to proste stwierdzenie faktu. Być może wiesz, jak napisać MergeSort do tyłu i do przodu w 5 językach, ale jeśli wybierzesz tylko jeden identyfikator w jednym wierszu kodu, całe Sortowanie nie będzie działać, a jeśli kompilator go nie złapie, może to zająć godziny debugowania. Porównaj to z List.Sort (); jest tam, jest skuteczny w ogólnym przypadku, a najlepsze jest to, że już działa.
W związku z tym zbudowano wiele funkcji współczesnych platform oraz założenia nowoczesnych metod projektowania:
źródło
Wydaje mi się, że zajmujesz się IT, a nie CS, co nie powinno oznaczać, że CS nie żyje. CS nie jest martwy, po prostu większość zadań związanych jest z tworzeniem oprogramowania. Ponieważ większość studentów CS uczy się programować, zwykle zatrudniają się jako programiści, a nie jako informatyk. Praca w informatyce jest niewielka w porównaniu do pracy programistycznej. Być może robisz nawet skomplikowaną aplikację z wykorzystaniem technik informatycznych, ale moim zdaniem (i nie lubię opinii, ponieważ są one subiektywne), która mieści się w obozie inżynieryjnym niż obozie naukowym.
Również piękny i elegancki kod jest w oku patrzącego , ale dla większości firm / menedżerów, mających dobry-dość-design na czas jest o wiele ważniejsze niż piękny kodu, ale nigdy nie kończąc na czas.
Wreszcie istnieje prawdziwy świat i lala-land. Niestety otrzymujemy wypłatę z tego pierwszego i właśnie wtedy pojawia się „nauka / sztuka” tworzenia oprogramowania, jak wytwarzać wysoką jakość oprogramowania przy ograniczeniach czasowych / budżetowych. Czułem ten sam rodzaj uczuć, co na początku mojej kariery. Zawsze chciałem stworzyć „najlepszy”, ale wkrótce zdaję sobie sprawę, że „najlepszy” nie jest najbardziej wydajnym ani eleganckim, ale najbardziej opłacalnym projektem.
źródło
Po pierwsze, źle to zrozumiałeś. „myśl, planuj i skutecznie rozwiązuj problemy” to nie nauka, to inżynieria. Nauka polega na odkrywaniu nowych dziedzin. W rzeczywistości w świecie akademickim ludzie mniej dbają o efektywność kodu niż w przemyśle. W środowisku akademickim chodzi bardziej o weryfikację koncepcji itp.
Nie, opisujesz, że do opracowania oprogramowania wymagana jest mniej dogłębna wiedza. Co może być prawdą, jeśli wymagania byłyby takie same. Ale obecnie oczekuje się, że inżynier oprogramowania będzie wiedział, jak radzić sobie z wielowątkowością, przetwarzaniem rozproszonym, skalowaniem itp. Oczekuje się, że będzie wiedział, jak skutecznie prowadzić projekt. Większość tego nie było wcale w programach nauczania kilkadziesiąt lat temu.
źródło
Nie sądzę, że to, co pan powiedział, jest dokładnie tak, ale trzeba coś z punktu tak. Myślę, że z biegiem czasu informatyka i inżynieria oprogramowania rozeszły się.
Inżynieria oprogramowania (podobnie jak inna inżynieria) polega na zastosowaniu nauki do tworzenia produktów, rozwiązywaniu problemów itp. Informatyka to przede wszystkim badania nad algorytmami i (choć ta część jest często nieco zapomniana) jak zaimplementować te algorytmy (przynajmniej w pewnym sensie teoretycznym - np. traktując wszystkie maszyny PRAM jako równoważne).
Pamiętając o tym, myślę, że przyczyna rozwidlenia staje się oczywista: większość problemów algorytmicznych związanych z czymś takim jak typowa strona internetowa została już rozwiązana - większość z nich już dawno temu. Być może, co ważniejsze, większość z nich została rozwiązana na tyle dobrze, że dla przeciętnego programisty problem zniknął prawie całkowicie. Na przykład robienie aktualizacji atomowych rozproszonych baz danych jest z pewnością nietrywialnym zadaniem - ale typowy programista pisze po prostu trochę kodu SQL i nie ma pojęcia (ani dbałości) o to, ile badań zajęło ustalenie sposobu wykonania pracy niezawodnie.
W pewnym momencie oddzielenie informatyki od inżynierii oprogramowania było zasadniczo niemożliwe. Tak mało problemów zostało rozwiązanych, że napisanie nawet stosunkowo trywialnego programu wymagało zbadania podstaw. Jeśli chcesz zrobić coś tak prostego, jak sortowanie wiązki danych pod koniec lat 50. lub wczesnych 60., szanse były całkiem spore, że będziesz musiał po prostu przeprowadzić analizę danych i spróbować zaprojektować algorytm, który najlepiej pasuje do tego, co zajęłoby sortowanie tych konkretnych danych - jak dotąd nie było tak wielu algorytmów sortowania, a nawet znane algorytmy nie były tak dobrze znane, jak dzisiaj .
50 lat badań i rozwoju się opłaciło - najbardziej typowy rozwój może wykorzystywać nie tylko znane algorytmy, ale także wstępnie napisane implementacje. Najbardziej typowe problemy można rozwiązać dość rozsądnie w oparciu o istniejącą wiedzę (a nawet istniejące implementacje) algorytmów.
Nie oznacza to jednak, że informatyka nie żyje - jest jeszcze więcej algorytmów do badań, a ludzie je badają. Oznacza to jednak, że większość badań jest bardziej wyspecjalizowana i prawdopodobnie dotyczyć będzie raczej wyspecjalizowanych dziedzin. Prawdopodobnie istnieje także większa „luka” między zdobywaniem a stosowaniem wiedzy. Pewnego razu wymyśliłeś lepszy sposób sortowania podczas pisania programu sortującego i prawie natychmiast został on zapisany w prawdziwym kodzie. Teraz wiele informatyki jest poświęcone takim rzeczom, jak używanie zasadniczo nieskończonej liczby procesorów - co prawdopodobnie kiedyś będzie przydatne, ale nawet prymitywne plemiona nie policzyłyby podwójnych rdzeni w moim komputerze jako „wielu” ... :-)
źródło
Rozwój oprogramowania i informatyka to nie to samo, i stwierdziłem, że większość moich kolegów z klasy ma tytuł licencjata. Program Comp Sci był tym sfrustrowany.
Uważam oprogramowanie za produkt informatyki ... podobnie jak obrazy są dziełem sztuki wizualnej.
Myślę, że większość osób z dyplomem CS zostaje zatrudniona do pracy w celu opracowania oprogramowania, szczególnie na początkowych etapach kariery. Myślę, że wiele osób w tej roli zostaje tam i nie idzie dalej.
Myślę, że różnica zaczyna się pojawiać, gdy pojawiają się nowe problemy lub paradygmaty lub gdy „splatanie się” nie jest wystarczająco dobre. Kto buduje nowe frameworki lub języki? Kto siada i objaśnia szczegóły nowego silnika fizyki? Kto wykorzystuje teorię graficzną / transformacje grafowe, aby wypisać kilka cykli na iterację wydajności z algorytmu?
Skończę tam, gdzie zacząłem, zgadzając się, że jest wielu informatyków na stanowiskach programistycznych / inżynieryjnych, być może nie do końca wykorzystujących swój potencjał.
źródło
Wygląda na to, że mylisz informatykę z programowaniem i tworzeniem oprogramowania w ogóle. Obie nie są takie same, nawet nie są blisko. Niezależnie od tego, co powiedzą nasze stopnie naukowe, zdecydowana większość z nas to programiści, a nie informatycy. O ile nie jesteś aktywnie zaangażowany w środowisko akademickie na wysokim poziomie, postawiłbym się, że tak naprawdę nie masz pojęcia, co się dzieje w informatyce.
źródło
Mogę powiedzieć, że informatyka żyje i ma się dobrze. Muszę codziennie rozwiązywać problemy i wymyślić skuteczne i eleganckie rozwiązanie tych problemów. Muszę codziennie wykorzystywać swoje umiejętności jako inżynier i wykorzystywać wiedzę siebie i moich kolegów, aby rozwiązać te problemy dla naszego klienta.
To brzmi jak problem z pracownikiem i na pewno nie jest prawdą dla każdego programisty.
To, że istnieją narzędzia ułatwiające naszą pracę, nie oznacza, że nie powinniśmy rozumieć podkreślonej technologii, jeśli nie, nie pomagamy nikomu i na pewno nie wykonujemy naszych zadań w rozwiązywaniu problemów we właściwy sposób.
źródło
Po prostu nie zrozumiałeś problemu. Problemem nie jest uzyskanie maksymalnej wydajności - zapewnia ona wystarczającą wydajność, aby Twoja aplikacja była wystarczająco responsywna i wystarczająco szybka. Nauka programowania polega na rozwiązywaniu problemu za najmniejszą kwotę.
Nienawidzę tego tak wyrażać, ale każde wrażenie, że jesteś pod wrażeniem śmierci CS, jest tylko twoimi własnymi wyobrażeniami o tym, co powinien zrobić „prawdziwy” programista.
źródło
Cóż, martwy czy nie jest dyskusyjny!
Faktem jest, że w dzisiejszej erze technologicznej większość firm zatrudnia ludzi do rozwiązywania rzeczywistych zadań typu workflow poprzez automatyzację oprogramowania. Nie są zainteresowani tym, jak elegancki lub szybszy program można napisać, o ile pozwala to firmie na szybsze działanie przy wyższej wydajności.
Stres jest na wyjściu więcej w krótszym czasie. (Pomyśl o komercjalizacji upraw / żywności; szybszy i większy wzrost przy niższych kosztach). To samo dzieje się w świecie technologii (kolejny nowy pomysł).
Pamiętaj, że w dzisiejszych czasach rzeczy poruszają się szybciej niż kiedykolwiek wcześniej ze względu na ilość i dostęp do wiedzy niż w przeszłości. W tamtych czasach produkcja była niewielka i lepsza, zyski większe. Teraz gra całkowicie się zmieniła. Wystarczy spojrzeć na takie rzeczy, jak jakość obsługi klienta i ogólnie rzecz biorąc, rzeczy nie trwają dłużej.
Elegancja i wydajność mają znaczenie dla firm technologicznych takich jak Google itp., Podczas gdy nawet te miejsca nie są idealne, ale możesz zbliżyć się do nich, pracując w jednej z tych firm w nadchodzących latach.
W życiu zawsze występuje kompromis. Możesz znaleźć pracę, która płaci mniej, gdzie masz cały czas i uwagę. Lub zdecydujesz się popływać z resztą z nas, aby lepiej płacić i ignorować rzeczy, które nie są idealne. Im szybciej ta realizacja zapada w tobie, możesz przygotować się do prawdziwego świata. Nie mówię, że powinieneś ignorować jakość i elegancję, ale znać dynamikę. Będziesz szczęśliwy :)
źródło
Moim zdaniem niektóre z najciekawszych rzeczy, które mogą przynieść przyszłość, z pewnością będą oparte na naukowej części informatyki, w szczególności na ulepszonym widzeniu komputerowym / uczeniu maszynowym i innych algorytmach sematyzujących. Prawdopodobnie zostaną one popchnięte do przodu w przemyśle (np. Microsoft Kinect), ale są tak niezwykle trudnymi problemami, że z pewnością będą oparte na ogromnych badaniach i postępach w nauce (ponownie weź Microsoft Kinect).
źródło
Myślę, że standardowe codzienne programowanie to tyle samo sztuki co nauki, ale z pewnością istnieją obszary, które są głęboko zainteresowane naukowymi aspektami informatyki. Na przykład naukowcy z firm i uniwersytetów. Jeśli naprawdę chcesz być zawodowo zaangażowany w naukę, powinieneś szukać doktora. Uważam jednak, że naukowe części mojej edukacji są ciągle cenne, mimo że w rzeczywistości muszę polegać na mojej bardziej kreatywnej stronie!
Ludzie, którzy nie wiedzą, co robią, mogą zhakować niektóre z narzędzi, o których wspomniałeś, ale zwykle zatrudniają prawdziwych ludzi CS, aby tworzyć narzędzia, po prostu musisz uzyskać bardziej abstrakcyjny charakter, aby naprawdę się zmusić.
źródło