Długotrwałe, niepoprawne założenia programistyczne [zamknięte]


281

Robię badania nad typowymi błędami i złymi założeniami poczynionymi przez młodszych (i być może starszych) inżynierów oprogramowania.

Jakie było twoje najdłużej utrzymywane założenie, które ostatecznie zostało skorygowane?

Na przykład, źle zrozumiałem, że rozmiar liczby całkowitej nie jest standardem, a zamiast tego zależy od języka i celu. Trochę zawstydzające, ale tak jest.

Bądź szczery; jakie masz głębokie przekonanie i z grubsza jak długo utrzymałeś to założenie? Może dotyczyć algorytmu, języka, koncepcji programowania, testowania lub czegokolwiek innego na temat programowania, języków programowania lub informatyki.


Odpowiedzi:


545

Przez długi czas zakładałem, że wszyscy inni opanowali wszystkie koncepcje programowania (wzorce projektowe, najnowszy nowy język, złożoność obliczeniowa, wyrażenia lambda, nazywacie to).

Czytanie blogów, Stack Overflow i książek o programowaniu zawsze sprawiało, że czułem, że jestem w tyle za tym, co wszyscy programiści muszą po prostu wiedzieć intuicyjnie.

Z biegiem czasu zdałem sobie sprawę, że skutecznie porównuję swoją wiedzę do wiedzy zbiorowej wielu osób, a nie jednej osoby, i to jest całkiem wysoki poziom dla każdego. Większość programistów w prawdziwym świecie dysponuje pamięcią podręczną wymaganą do wykonywania swoich zadań i ma więcej niż kilka obszarów, o których są słabi lub zupełnie nieświadomi.


68
Tak prawdziwe! To jest problem tego wieku. Informacje również zniechęcają. Miałem to objawienie kilka tygodni temu, kiedy czułem się kompletnym przegranym we wszystkim, co zrobiłem (nie pierwszy raz) w zakresie badań. Faceci, którzy publikują swoje artykuły w IEEE Transactions, niekoniecznie mają takie same umiejętności jak faceci, którzy pracują w Google, mogą pochwalić się StackOverflow, doskonałymi profesorami lub pisać świetne blogi programistyczne. Oczywiście najlepsi faceci są wykładniczo fajniejsi od nas, ale nie wiedzą wszystkiego, co wiesz, czego nie wiesz. Więc bądź spokojny.
jbasko

40
Pomaga także zrozumieć, że ci blogerzy też nie piszą wszystkiego z góry. Dobrzy blogerzy badają swoje tematy i uczą się nowych rzeczy podczas pisania postów.
JohnFx

47
Codziennie mam obsesję na punkcie rzeczy, o których nie mam czasu czytać i uczyć się. Czasami mnie przeraża poczucie winy.
Brad

9
@Zilupe: Amen do tego. Opublikowałem kilka artykułów z konferencji międzynarodowych i czasopism. W oczach niektórych osób brzmiało to fajnie. Dopóki nie zdasz sobie sprawy, że opublikowanie artykułu nie wymaga wielkiego wysiłku. Nie jesteśmy geniuszem. Jesteśmy tacy jak wszyscy inni. Popełnialiśmy błędy i publikujemy bzdury. Cóż, z wyjątkiem pewnej mniejszościowej grupy prawdziwych geniuszy ...
Hao Wooi Lim

4
+1 Dobrze, że to czytam. Myślałem, że jestem jedynym.
Randell,

308

Że ludzie wiedzieli, czego chcą.

Najdłużej myślałem, że będę rozmawiał z ludźmi, oni opisywaliby problem lub przepływ pracy, umieszczałem go w kodzie i automatyzowałem. Okazuje się, że za każdym razem, kiedy to się dzieje, to, co myśleli, że chcieli, nie było tym, czego chcieli.

Edycja: Zgadzam się z większością komentarzy. To nie jest odpowiedź techniczna i może nie być tym, czego szukał pytający. Nie dotyczy to tylko programowania. Jestem pewien, że to nie jest moje najdłużej utrzymywane założenie, ale była to najbardziej uderzająca rzecz, której nauczyłem się w ciągu 10 krótkich lat, kiedy to robiłem. Jestem pewien, że z mojej strony było to naiwne, ale sposób, w jaki mój mózg jest / był podłączony do sieci, a nauczanie i doświadczenia, które miałem przed wejściem do świata biznesu, skłoniły mnie do przekonania, że ​​zrobię to, na co odpowiem; że będę w stanie używać kodu i komputerów do rozwiązywania problemów ludzi.

Myślę, że ta odpowiedź jest podobna do odpowiedzi Robina na temat nie-programistów rozumiejących / dbających o to, o czym mówię. Chodzi o naukę biznesu jako zwinny, iteracyjny, interaktywny proces. Chodzi o poznanie różnicy między byciem małpą kodującą programistą a byciem programistą. Chodzi o uświadomienie sobie, że między nimi jest różnica i że naprawdę jest w tej dziedzinie dobra, nie chodzi tylko o składnię i szybkość pisania.

Edycja: Ta odpowiedź jest teraz wiki-społeczności, aby uspokoić ludzi zdenerwowanych tą odpowiedzią, dając mi przedstawiciela.


9
Lub zmień to, czego chcą po obejrzeniu tego, czego wcześniej chcieli. Ludzie lubią zmieniać zdanie. Wiem, bo jestem ludem.
J. Polfer,

13
Dałeś im to, o co prosili, a nie to, czego chcieli.
Brent Baisley

47
Dlaczego tak nudne, niekontrowersyjne odpowiedzi bez odpowiedzi są tak głośne ?!
nes1983

39
Łał. Wygląda na to, że ktoś potrzebuje przytulenia.
bzlm

24
Mój boże @ ludzie narzekają, że repozytorium stackoverflow nie jest konkurencją. Głosuj za odpowiedzią, jeśli nie podoba ci się odpowiedź, nie głosuj za nią, ponieważ jesteś zazdrosny, że nie opublikowałeś jej jako pierwszej.
Dmitri Farkov

292

Że wiem, gdzie jest problem z wydajnością bez profilowania


10
Myślę, że właśnie dlatego przedwczesna optymalizacja jest tak powszechnym miejscem.
Hao Wooi Lim

10
+1 Wow, ktoś zamieścił odpowiedź, która nie była trywialna ani nie na temat.
Mark Rogers

3
Mam tabletki, które powinny pomóc w przedwczesnej optymalizacji ...
AndyM

232

Że powinienem mieć tylko jeden punkt wyjścia z funkcji / metody.


91
Doskonała realizacja; wychodzić tak często, jak to konieczne. Należy zwolnić się z funkcji, gdy tylko nie ma sensu dalej się w nią poruszać. Może to zmniejszyć złożoność i zwiększyć czytelność, na przykład unikając głęboko zagnieżdżonych instrukcji warunkowych, gdy są one warunkiem koniecznym do poprawnego działania metody. We współczesnych językach z zarządzaniem pamięcią i konstrukcjami zasobów, takimi jak używanie / wreszcie, kontynuowanie aż do końca metody dogmatycznie nie ma sensu.
Triynko

24
A tak przy okazji, kto to wymyślił? To jak programistyczna miejska legenda.
Brad

49
Ludzie, którzy muszą debugować kod innych osób, wymyślili to.
gatorfax

23
Myślę, że ten powszechnie przyjęty, ale zły pomysł opiera się na nieporozumieniu. Po wyjściu z funkcji zawsze powróć do tego samego punktu. To była ważna zasada w językach takich jak BASIC, która jej nie egzekwowała: reguła oznaczała na przykład, że należy używać GOSUB zamiast GOTO. W językach takich jak C # lub Java, które wywołują metody, jest to automatyczne. Ale ponieważ jest automatyczny, myślę, że zmienił się z logicznego „tylko jednego punktu powrotu” w nonsensowny „tylko jeden punkt wyjścia”.
Ryan Lundy

35
Z języków takich jak C, w których musisz ręcznie zwolnić zasoby. Wiele punktów wyjścia było dobrą szansą na wyciek zasobów. IMO nie ma sensu w językach z wyjątkami, ponieważ często nie znasz już punktów wyjścia lub są one w środku zdania. - W tych językach pozostaje tylko „struktura czytelności”.
peterchen

228

Że nieprogramiści rozumieją o czym mówię.


243
zrozumieć / dbać ..
nickf

8
Nadal mam ten
moment

3
Och kochanie, obawiam się, że jeszcze się tego nie nauczę!
thatismatt

3
tak, czasami zapominam o mojej publiczności i kończę z grupą ludzi, którzy patrzą na mnie pustymi spojrzeniami na twarzy, miło jest, gdy ludzie wykazują zainteresowanie
Petey B

3
To moja największa frustracja z powodu tego zawodu.
Andres Jaan Tack

219

To wolne od błędów oprogramowanie było możliwe.


35
+1, chociaż NASA prawie to
zrobiła

55
Tak, ale „prawie” kosztowało kilka milionów dolarów :)
Jem

15
@Triynko twoje „możliwe” i „możliwe” @ JaredPara nie są takie same. Teoria i praktyka mogą być takie same w teorii, ale są bardzo różne w praktyce.
wilhelmtell

13
@Joseph, część problemu polega na tym, że ludzie myślą, że programy Hello World są wolne od błędów. Oni nie są. Większość nie sprawdza na przykład błędów w printf ani kont dla innych nieudanych prób We / Wy.
JaredPar

9
@ RussellH, no. Nie udało się określić wartości zwracanej, a wynikowy proces zwróci losową pamięć śmieci.
JaredPar

199

Te prywatne zmienne składowe były prywatne dla instancji, a nie dla klasy.


192
Trzymałem się tego założenia do ... aż do teraz.
TheMissingLINQ

9
@ebrown Zwykle przydaje mi się tylko przy pisaniu metody equals ()
Dave Webb

12
Są w Ruby.
Mike Kucera,

17
Jest to dla mnie tak normalne, że ta odpowiedź nie miała sensu za pierwszym razem, gdy ją czytałem. Teraz chcę nauczyć się Ruby, żeby mnie zdezorientować. :)
jmucchiello

16
@Kiewic Jeśli w klasie znajduje się prywatna zmienna członkowska o nazwie myVar, możesz odwoływać się do other.myVar bezpośrednio w kodzie, jeśli inna jest instancją tej klasy. Zakładałem, że ponieważ był „prywatny”, musiałeś użyć other.getMyVar () nawet wewnątrz klasy.
Dave Webb

166

Myślałem, że pisanie na klawiaturze było nieruchome.


53
Szczere czy nie, rozśmieszyło mnie to pod koniec długiego dnia pracy. : P
Olivier Tremblay

5
++ dla dobrego śmiechu. brzmi jak coś, co wymyśli mój (nietechniczny) mąż.
jess

11
+1! Myślałem, że pisanie kaczek również wymaga pisania. Lub kaczki. Lub oba.
SqlACID

162

Że możesz w pełni zrozumieć problem, zanim zaczniesz się rozwijać.


32
To, mój przyjacielu, powinno być: „Że możesz w pełni zrozumieć problem”. Ale to prawda. I pozornie trudna koncepcja do zrozumienia, a nawet zaakceptowania.
KarlP

4
Nie możesz zrozumieć problemu „w pełni”, ale na pewno MUSISZ zrozumieć problem (w pewnym stopniu), zanim zaczniesz się rozwijać. bit.ly/kLXgL
OscarRyz

Czasami musisz zacząć się rozwijać, aby zrozumieć problem. I / lub problem zmienia się wraz z rozwojem.
Evan Plaice

158

Mądrzy ludzie są zawsze mądrzejsi ode mnie.

Naprawdę potrafię się pobić, kiedy popełniam błędy, i często zostaję przeklęty za to, że się deprecjonuję. Kiedyś patrzyłem z podziwem na wielu programistów i często zakładałem, że skoro znali więcej niż ja na X , wiedzieli więcej niż ja.

Ponieważ nadal zdobywam doświadczenie i spotykam więcej ludzi, zacząłem zdawać sobie sprawę, że często, choć wiedzą więcej niż ja w danym temacie, niekoniecznie są mądrzejsi ode mnie.

Morał tej historii: nigdy nie lekceważ tego, co możesz przynieść na stół.


Dobry! Obecnie współpracuję z kolegą, który naprawdę dużo wie o rozwoju .NET. Zajęło mi trochę czasu, aby zrozumieć, że lepiej rozumiem, czego potrzebują klienci.
Treb

58
Z drugiej strony, że znam więcej niż inni ludzie. Okazuje się, że po prostu znają różne rzeczy. Drugi morał: nigdy nie lekceważ tego, co ktoś może przynieść do stołu.
Czwartek,

1
Oto ta stara rzecz „rób innym”. Wykreślam nowe zdanie: bulwersacja technologiczna ~ Stan poczucia wyższości, ponieważ znasz pewne rzeczy, i popełniam błąd, dając znać innym. @seealso: smartass.
corlettk

1
Doskonała obserwacja - moja wersja jest bardziej negatywna „Wszyscy robią się głupi od czasu do czasu”. Nieco związane z „nie odwracaj bozo”.
peterchen

2
Musisz się martwić tylko wtedy, gdy głupi ludzie są mądrzejsi od ciebie.
Brad Gilbert

131

Przez najdłuższy czas myślałem, że złe programowanie stało się na marginesie ... że robienie rzeczy było normą. W dzisiejszych czasach nie jestem taki naiwny.


30
Kiedyś myślałem, że Złe Programowanie jest wykonywane tylko przez innych programistów, dopóki nie zostałem zlikwidowany przez jeden z moich Złych Programów. Teraz robię rzeczy poprawnie! (Tym razem mi wierzysz, prawda?)
Jared Updike

2
Całkowicie. Przeszedłem z „To nigdy się nie zdarza” na „To się nigdy nie zdarza, z wyjątkiem tej pracy” na „Każde miejsce ma zły kod”.
Ryan Lundy

1
Hakowanie jest normą. Inżynieria należy do kompetencji naprawdę kompetentnych. Jeśli kiedykolwiek spotkasz inżyniera oprogramowania, dam ci znać.
corlettk

3
@corlettk: Masz na myśli, że kodowanie małp jest normą, nie? Hakowanie to sztuka, o której myślisz na wysokim poziomie, że daleko mi do osiągnięcia.
hasen

2
@Hasen: Nie, hackowanie jest analogią do nieumiejętnego zabrania siekiery do drzewa, dłutowania małych kawałków w szalonej panice bez prawdziwego planu i tworzenia cholernego wielkiego bałaganu, dopóki drzewo w końcu nie spadnie na głowę. „Hack” to „ten, który produkuje banalne i mierne prace w nadziei na odniesienie sukcesu komercyjnego”. Dlaczego tak się stało, że pole komputerowe zmieniło „hack” na „wykwalifikowany”, nigdy się nie dowiem.
Lawrence Dol

113

Pomyślałem, że powinienem przejść do abstrakcji w jak największym stopniu. Uderzyło mnie to z powodu zbyt dużej ilości powiązanych funkcji.

Teraz staram się, aby rzeczy były jak najprostsze i jak najbardziej rozdzielone. Refaktoryzacja w celu stworzenia czegoś abstrakcyjnego jest znacznie łatwiejsza niż przewidywanie, w jaki sposób muszę coś abstrakować.

W ten sposób przeszedłem od opracowania frameworka, który nimi rządzi, do fragmentów funkcjonalności, które wykonają zadanie. Nigdy nie oglądałem się za siebie, chyba że myślę o czasie, który naiwnie myślałem, że to ja będę rozwijał następną wielką rzecz.


26
Oddzielone = prawdziwa abstrakcja. Abstrakt sam w sobie jest ... przedwczesną optymalizacją.
Jared Updike

1
Jest to zgodne z tym, co znalazłem podczas strojenia wydajności. Może istnieć piękny program z wieloma warstwami abstrakcji. Potem obciążenie staje się ciężkie i zgadnij, co kosztuje cały czas ... wszystkie abstrakty. Komputery wykonują instrukcje, a nie abstrakcje.
Mike Dunlavey

5
Abstrakcja i uogólnienie to potężne narzędzia, niestety używane do uogólnienia abstrakcyjnego przypadku użycia za pomocą jednej implementacji. Zabawne jest to, że ilekroć zachodzi potrzeba zmiany implementacji, abstrakcje i uogólnienia również muszą się zmienić ...
KarlP

Całkowicie zgadzam się z Jaredem ... jeśli udało ci się przejść do „prostej i oddzielonej”, osiągnąłeś prawdziwą abstrakcję. Jak można oddzielić rzeczy, jeśli nie wyodrębniono ich na interfejsy i fabryki itp.? Jak to może być proste, jeśli nie usuniesz całego „if type = this, to zrób to, lub jeśli typ jest, to zrób coś innego”.
Richard Anthony Hein

To samo tutaj. Myślę, że nauczyłem się o abstrakcji przed zrobieniem całego kodu spaghetti. Powinni byli nauczyć, jak załatwić sprawę, nawet jeśli kod to spaghetti, a następnie nauczyć nas OO i abstrakcji.
hasen

103

Kobiety uważają programistów komputerowych za seksowne ...


70
Poczekaj sekundę???
Tağdaş Tekin

4
he he he on .. okej, szukałem czegoś, co pozwoliłoby mi się uśmiechać przez resztę dnia. Myślę, że to znalazłem !!! :)
OscarRyz

17
„Och, kochanie! Tak, powiedz„ jeśli ”- rzuć mi wyjątki .. Tak, wiesz, jak tego chcę”: P
cwap

5
Co? Programiści są bogaci? Kiedy to się stało?
Filip Navara,

3
Niektóre kobiety (odpowiedni rodzaj) pociągają wnikliwych inteligentnych facetów. Które, pomijając prototypową brodę i jelito, są dość powszechnymi cechami programistów. Odrobinę troski o własny wizerunek / higienę i okazjonalne emocje / emocje związane ze sportami ekstremalnymi i jesteś na dobrej drodze.
Evan Plaice

100

Że jakość oprogramowania doprowadzi do większej sprzedaży. Czasami tak jest, ale nie zawsze.


37
Sprzedajesz oprogramowanie? Tak jest w 1999 r.
bzlm

Wiele witryn opartych na subskrypcjach jest teraz reklamowanych ...
cgp

11
Microsoft na pewno to zabija.
Bill Martin

muszę to pokochać, to prawda.
dr. zło

18
Chciałbym, aby poprawa jakości / wydajności naszego oprogramowania liczyła się jako funkcja
Tom Leys

82

Że wszystkie języki są (w większości) równe.

Przez długi czas doszedłem do wniosku, że wybrany język nie ma większego wpływu na trudność procesu rozwoju i potencjał sukcesu projektu. To zdecydowanie nie jest prawda.

Wybór odpowiedniego języka dla zadania jest równie ważny / krytyczny jak każda inna decyzja dotycząca pojedynczego projektu.


13
Uważam, że wybór odpowiednich bibliotek jest najważniejszy. Tak się składa, że ​​często istnieje korespondencja między językami a bibliotekami 1 do 1 ...
Kevin Montrose

7
Ale jeśli oba języki programowania są kompletne w Turinga, jaka jest różnica? Możesz napisać dowolny program w dowolnym języku! ;)
Bill the Lizard

8
Nie zgadzam się, decyzja, jakiego języka użyć, jest o wiele mniej ważna niż to, kto faktycznie będzie realizował projekt. Jako tylko jeden przykład wielu innych ważniejszych decyzji.
Boris Terzic

13
BrainFu ** jest tak kompletny, jak Python.
hasen

9
To, że kompletne języki Turinga mają jednakowe zastosowanie, jest powszechnym nieporozumieniem. Kompletny język Turinga może obliczyć wszystko, co może zrobić maszyna Turinga (i często sugeruje również na odwrót). Nie ma absolutnie żadnego wpływu na wydajność. Operacja, która wymaga czasu liniowego w jednym języku, równie dobrze może zająć czas wykładniczy w innym języku, a oba mogą być zakończone. Istnieje ogromna różnica między tym, co jest teoretycznie obliczalne, a tym, co jest wykonalne w praktyce.
TrayMan

81

To, że duży stosunek komentarz / kod jest dobrą rzeczą.

Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że kod powinien być samodokumentujący. Jasne, komentarz tutaj i tam jest pomocny, jeśli kod nie może być wyjaśniony lub jeśli istnieje ważny powód, dla którego coś się robi. Ale ogólnie lepiej poświęcić temu czasowi na zmianę nazw zmiennych. Jest czystszy, wyraźniejszy, a komentarze nie są „niezsynchronizowane” z kodem.


1
Zgadzam się w rzeczywisty kod ... wyłączeniem komentarzy javadoc (lub równoważny).
corlettk

11
+1, nawet nie zaczynaj od traktatów, które pisałem dla 10 funkcji liniowych
wds

Aby dodać do tego, instrukcja assert () jest lepsza niż dokumentowanie warunku wstępnego / końcowego. Kontrakty z kodem .NET 4 można również automatycznie przekształcić w dokumentację!
Robert Fraser

66

To programowanie jest niemożliwe.

Nie żartowałem, zawsze myślałem, że programowanie jest czymś niemożliwym do nauczenia się i zawsze trzymałem się od tego z daleka. A kiedy zbliżyłem się do kodu, nigdy go nie zrozumiałem.

Pewnego dnia po prostu usiadłem i przeczytałem kilka podstawowych samouczków dla początkujących i zacząłem stamtąd. A dzisiaj pracuję jako programista i uwielbiam każdą minutę.

Dodając, nie sądzę, aby programowanie było łatwe, jest wyzwaniem i uwielbiam uczyć się więcej i nie ma nic przyjemniejszego niż rozwiązywanie problemów programistycznych.


7
Amen! Ale, hej, nie ogłaszaj tego widoku z dachów. Nie chcemy, żeby wszyscy wiedzieli, że programowanie jest fajne, prawda? ;); P
Peter Perháč

9
MasterPeter: Dałoby nam to więcej paszy, abyśmy mogli zwiększyć liczbę przedstawicieli, kiedy przychodzą tutaj i zadają pytania.
TheTXI

4
Powiedziałbym, że programowanie jest trudne do zrobienia . Jest to jednak możliwe, co wydaje się twoim celem.
Steve S,

4
@Olafur: Dlaczego chcesz, aby pytanie było wiki, a nie twoją odpowiedzią?
gnovice

2
To dokładnie odzwierciedla moje doświadczenie. Chciałbym zacząć wcześniej: P
Skilldrick

65

„On Error Resume Next” było pewnego rodzaju obsługą błędów


6
Czuję cię ... ale w vbscript (szczególnie asp), była to TYLKO dostępna opcja „obsługi błędów” w połączeniu z rozsądnym sprawdzaniem, czy rzeczywiście wystąpił błąd, i sporą ilością modlitwy.
flatline

2
Tak ... to jakiś rodzaj ... tylko taki, z którego cieszymy się, że
uciekamy

6
Dobrze?! ale to jest. Zaczynasz swój blok obsługi błędów za pomocą opcji On Error Resume Next, spróbuj czegoś, a następnie Jeśli (err.number <> 0), to
jpinto3912

Czy to nie jedyny vbscript równoważny z try catch?
James

-1: Jest to rodzaj obsługi błędów. To po prostu nie jest tak eleganckie.
JohnFx

64

To oprogramowanie do programowania wymaga silnych podstaw w wyższej matematyce.

Przez lata zanim zacząłem kodować, zawsze mówiono mi, że aby być dobrym programistą, musisz być dobry w zaawansowanej algebrze, geometrii, rachunku różniczkowym, trygonie itp.

Dziesięć lat później i tylko raz musiałem zrobić wszystko, czego nie mógł zrobić ósmy równiarka.


5
Bardzo prawdziwe. W większości przypadków nie musisz być ekspertem od matematyki. Jedynym czasem, kiedy naprawdę potrzebowałem poznać zaawansowaną matematykę, było to, że jako hobby zajmowałem się programowaniem 3D. W rzeczywistości to programowanie 3D podczas liceum zainspirowało mnie do zwrócenia większej uwagi na trygonie i na zajęciach przedszkolnych. Poza tym jednak bardzo podstawowa matematyka jest zwykle wszystkim, czego potrzebujesz.
Steve Wortham

29
Myślę, że zostałeś źle poinformowany. Oczywiście, aby być dobrym programistą , tak naprawdę nie musisz używać matematyki na wyższym poziomie, ale aby naprawdę zrozumieć i zastosować pewne koncepcje informatyczne, potrzebujesz więcej niż matematyki ósmej klasy.
hbw

12
Myślę, że nacisk na matematykę polega na uczeniu umiejętności krytycznego myślenia i rozwiązywania problemów nie jako czegoś, co można by wykorzystać w codziennym programowaniu komputerowym.
Zack

14
Rodzaj abstrakcji, którego potrzebujesz, aby zrozumieć zaawansowaną matematykę, jest bardzo podobny do abstrakcji, której potrzebujesz do tworzenia oprogramowania.
OscarRyz

6
Myślę, że koncepcje programowania funkcjonalnego są znacznie łatwiejsze do zrozumienia, jeśli masz silniejsze podstawy matematyczne, po prostu dlatego, że nie boisz się tak bardzo składni. Wygląda znajomo. Popełniłem błąd, używając prostych funkcji matematycznych do zademonstrowania nowych koncepcji programowania funkcjonalnego w języku C #. Niektóre osoby natychmiast deklarowały, że jest to zbyt skomplikowane.
Richard Anthony Hein

63

Optymalizacja == przepisywanie w asemblerze.

Kiedy po raz pierwszy naprawdę zrozumiałem asembler (pochodzący z BASIC), wydawało się, że jedynym sposobem na przyspieszenie działania kodu jest przepisanie go w asemblerze. Zajęło mi to kilka lat, aby zrozumieć, że kompilatory mogą być bardzo dobre w optymalizacji, a zwłaszcza w przypadku procesorów z prognozowaniem gałęzi itp. Prawdopodobnie mogą wykonać lepszą robotę niż człowiek w rozsądnym czasie. Również spędzanie czasu na optymalizacji algorytmu może dać lepszą wygraną niż spędzanie czasu na konwersji z języka wysokiego na niski. Również ta przedwczesna optymalizacja jest źródłem wszelkiego zła ...


8
Peek i Poke są twoimi przyjaciółmi :)
Matthew Whited

4
Zboczeniec! Powiedz to sędziemu!
Shalom Craimer

1
Tu pojawia się teoria złożoności. Montaż jest na ogół mikrooptymalizacją. Zmniejszenie złożoności czasowej algorytmów to miejsce, w którym uzyskuje się prędkość.
PeteT,

@scraimer: Fancy widząc cię tutaj, nigdy bym się tego nie spodziewał ;-)
Robert S. Barnes

@ Matthew - „Peek i Poke są twoimi przyjaciółmi :)”: ** BARDZO zazdrosny, że nie napisałem tego pierwszy.
FastAl

63
  • Kierownictwo firmy dba o jakość kodu.
  • Im mniej linii, tym lepiej.

2
nie dbają o to, ale musisz połączyć umiejętności artystów z umiejętnościami pracowników. Każdy element algorytmu też nie może być dziełem sztuki. Niektóre z nich będą coraz bardziej widoczne, więc ponownie użyj „rzadziej używanego”. Pamiętaj o starej zasadzie 80/20. 80% programu jest wykorzystywane przez 20% czasu. Skup więc 80% na 20% kodu i stwórz PRAWDZIWĄ SZTUKĘ SZTUKI! : OP
BerggreenDK

71
mniej linii jest lepszych! Jednym z powodów, dla których nie lubię języka Java jako języka, jest to, że robienie czegokolwiek zajmuje tak wiele linii kodu. mniej linii kodu oznacza, że ​​łatwiej jest zmienić kod.
Claudiu

7
To zależy od tego, co usuwasz, aby uzyskać mniej linii. Jeśli kod jest nadal czytelny z mniejszą liczbą wierszy, to jest dobry. Istnieje jednak wiele sposobów zmniejszenia liczby wierszy kodu, które powodują pogorszenie kodu.
Herms,

2
Z wyjątkiem sytuacji, gdy ludzie sięgają daleko w stronę mentalności „im mniej linii, tym lepiej” za pomocą łańcuchowych wywołań metody 7 głęboko, tak że gdy jedna z nich rzuci wskaźnik zerowy, nie masz pojęcia, która to była. Lub łączą tyle akcji w jedną linię, że ma ona 150 znaków i wykonuje 4 operacje. To sprawia, że ​​zarówno trudniejszy do odczytania, jak i trudniejszy do debugowania, ale nie jest szybszy ani nie zużywa mniej pamięci podczas wykonywania.
Trampas Kirk

17
Jeśli twoja linia kończy się na))))) i nie piszesz Lisp, masz za mało linii.

58

Powiedziałbym, że przechowywanie elementu roku daty jako 2 cyfr było założeniem, które dotknęło całe pokolenie programistów. Pieniądze przelane na Y2K były dość przerażające.


1
To jedyna odpowiedź, którą głosuję, choć jest to CW, więc to nie ma znaczenia ...
Dan Rosenstark

4
IIRC niektóre systemy z lat 60., a może 70. używały tylko jednej cyfry, ponieważ zużywały mniej pamięci. Widziałem nawet formularze papierowe, na których wydrukowano „196_” i „197_”.
jakieś

3
Nadal widzę formularze z liczbą 200_ i prawdopodobnie są już niektóre z wydrukowanym numerem 201_.
Macha,

5
Smutne jest to, że ... Unix będzie miał drugą rundę w tym roku w 2038 r.
Evan Plaice,

4
@Billy Tylko dlatego, że zmienia się architektura maszyny, nie oznacza, że ​​zmieni się format danych. Przechowywanie 2 cyfr rozdzielczości w formacie int stworzyłoby bajtowy (8-bitowy) format daty, a jednak wpłynęło to na ton 32-bitowych maszyn architektury sprzętowej w 2k. To tylko kolejny przykład, dlaczego nie pozwalasz osobom z niskim poziomem sprzętu określić formaty danych. Grosz szczypta, wiedząc, że w odległej przyszłości planowane jest SNAFU.
Evan Plaice,

57

Że wszystko inne niż rodzaj wstawiania / bąbelków było po prostu czarną magią.


Haha, podoba mi się ten, ponieważ uderza blisko domu. Sortuj szybciej niż czas n-kwadrat? Niemożliwe!
Ross

To zadziwiające, jak proste i oczywiste wydaje się większość algorytmów sortowania, gdy masz silne wyczucie rekurencji, dzielenia i podbijania. Do tego czasu większość z nich czuje się jak czarna magia.
Brian

74
Jestem badaczem algorytmów sortowania! I Wciąż czują się jak mroczna magia.
SPWorley,

14
Kiedyś miałem w swoim programie wiersz kodu, który był długi i skomplikowany i nie miałem ochoty go rozbijać ani wyjaśniać (była to skomplikowana formuła oświetlenia), więc umieściłem to wszystko w jednym wierszu i #define ' d to być DARK_MAGICK, a jedynym komentarzem było ostrzeżenie przed próbą wyjaśnienia tajemnic mrocznej magii
Alex

2
Bogosort jest najbardziej tajemniczym z nich wszystkich.
Alex Beardsley,

50

Ten XML byłby naprawdę interoperacyjnym i czytelnym dla człowieka formatem danych.


7
XML nie jest panaceum, ale nie chciałbym wracać do czasów, w których regularnie widziałem aplikacje próbujące wycisnąć relacyjne dane do pojedynczych plików csv.
Tony Edgecombe

4
jest to składnia interoperacyjna, co do tego nie ma wątpliwości. Po prostu ta składnia jest często najmniej ważnym aspektem każdego rozwiązania.
Simon Gibbs

2
+1, możesz również dodać małą i szybką do listy życzeń.
MarkJ

1
To prawda, ale poprawa w stosunku do csv i stałej długości, w której bez dokumentacji jesteś przykręcony.
PeteT,

7
Uwielbiam XML za standaryzację formatów danych i poprawną obsługę kodowania znaków. Nienawidzę jednak tego, co czasem się robi przy użyciu XML.
Joachim Sauer

48

To C ++ było w jakiś sposób wewnętrznie lepsze niż wszystkie inne języki.

Otrzymałem to od kolegi kilka lat przede mną na studiach. Trzymałem to przy sobie przez bardzo zawstydzająco długi czas (zarumieniam się teraz). Dopiero po 2 latach pracy z nim mogłem zobaczyć pęknięcia takimi, jakie były.

Nikt - i nic - nie jest doskonały, zawsze jest miejsce na poprawę.


5
„lepiej” przyniesie Ci mnóstwo niezbyt nienawistnych komentarzy. Powiedziałbym jednak, że jest to jeden z najszybciej wykonywanych, elastycznych i wolnych od przeszkód. Jest to również taka, która zabiera młodość do właściwego uczenia się, tylko po to, aby odkryć, że możesz zrobić mniej więcej tę samą aplikację. (choć wymaga dodatkowej tony lub dwóch węgli wytwarzających energię elektryczną) z java lub C #.
jpinto3912

@JP: Jestem zadowolony z doboru słów :)
Binary Worrier

Wydajność ma większe znaczenie w świecie aplikacji biznesowych. Oczywiście istnieją pewne nisze, w których wymagane jest c ++ i jest to jedyna opcja.
Shaw

7
Zawsze zakładałem, że C ++ jest gorszy niż zwykły ANSI C, po prostu dlatego, że rodzaj problemów, w które widziałem, w które popadają programiści C ++, jest o wiele bardziej skomplikowany niż rodzaj problemów, w które wpadłem.
Nosredna

1
W rzeczywistości lepszym językiem niż wszystkie inne jest Common Lisp. C ++ nie jest jednak zły.
David Thornley,

47

Wierzyłem, że tworzenie programów będzie dokładnie takie, jak to, czego nauczano na zajęciach ... usiądziesz z grupą ludzi, rozwiążesz problem, wymyślisz rozwiązanie itp. Itd. Zamiast tego prawdziwy świat brzmi „Oto mój problem, muszę go rozwiązać, idź ”, a dziesięć minut później dostajesz inny, nie pozostawiając Ci czasu na skuteczne zaplanowanie rozwiązania.


24
Myślę, że to się nazywa życie.
Robin Day

9
hmmm ... nadszedł czas, abyś wykupił tę firmę. ..
jpinto3912

8
@ jpinto3912: Nie. Ponieważ kolejna firma również będzie częścią życia (patrz poprzedni komentarz).
Treb

42

Myślałem, że wzorce głównego nurtu były niesamowite, kiedy zostały wprowadzone w klasie CS. Wcześniej przez 8 lat programowałem jako hobby i tak naprawdę nie rozumiałem, jak tworzyć dobre abstrakcje.

Wzory projektowe przypominały magię; możesz robić naprawdę fajne rzeczy. Później odkryłem programowanie funkcjonalne (przez Mozart / Oz, OCaml, później Scala, Haskell i Clojure), a potem zrozumiałem, że wiele wzorców było po prostu płytkami lub dodatkową złożonością, ponieważ język nie był wystarczająco wyrazisty.

Oczywiście prawie zawsze istnieją jakieś wzorce, ale są one na wyższym poziomie w ekspresyjnych językach. Teraz zajmuję się profesjonalnym kodowaniem w Javie i naprawdę odczuwam ból, gdy muszę zastosować konwencję, taką jak wzorzec gościa lub polecenia, zamiast dopasowywania wzorca i funkcji wyższego rzędu.


„wiele wzorów było po prostu bojlerami lub dodatkową złożonością, ponieważ język nie był wystarczająco wyrazisty”. Ekspresyjność jest po prostu kodem źródłowym wbudowanym w język.
Nieznany

4
Nie jest prawdą, jak to jest mieć pierwszorzędne rzeczy, zamiast ograniczać możliwości programisty, jak w przypadku funkcji wyższego rzędu. Lisps są pięknym tego przykładem.
egaga

38

Przez pierwsze kilka lat programowania nie złapałem, że 1 Kbyte to technicznie 1024 bajty, a nie 1000. Zawsze byłem trochę zakłopotany faktem, że rozmiary moich plików danych wydawały się nieco odbiegać od tego, czego się spodziewałem być.


114
Producenci dysków twardych wciąż nie złapali ...
Michael Myers

10
@mmyers Myślę, że masz na myśli sprzedawców dysków twardych, prawda? Czy dyski są tak zbudowane?
Instantsoup

16
Hej, przestań nienawidzić kibi. MeBi i KiBi są przynajmniej unbambiguobus.
bzlm

21
Kilo oznacza 1000, Mega oznacza 1000000, Giga oznacza 1000000000. To producenci pamięci RAM i systemów operacyjnych źle to zrobili, a nie producenci napędów.
Mark Ransom,

39
Nikt tego nie zrobi? Poważnie? Dobra, zrobię to ... xkcd.com/394
Erik Forbes

36

Ten warunek sprawdza:

if (condition1 && condition2 && condition3)

są wykonywane w nieokreślonej kolejności ...


15
W jakim języku? Języki takie jak C / C ++, Java i Python gwarantują, że warunki są oceniane od lewej do prawej i że ocena zatrzymuje się przy pierwszym warunku, który zwraca false. Jest to część specyfikacji językowej. Zakładam, że większość innych języków daje taką samą gwarancję.
Clint Miller

44
@Clint: Tak, stąd „okazało się to niepoprawne”.
bzlm

tak, ten jest fajny. ułatwia zapisywanie rzeczy takich jak if (myList! = null && myList.Count> = 0) {do stuff ();} o wiele łatwiej
Zack

4
tak naprawdę ten zależy od języka i & oceni wszystkie warunki (nie skrót). I widziałem wiele osób używających And (&) w VB zamiast AndAlso (&&)
Lucas

2
. . . Właściwie to się zawiesi również w VB.net, chyba że użyjesz komentarza AndAlso ponownie Lucasa
Binary Worrier

35

Że moje programowanie byłoby szybsze i lepsze, gdybym to wykonał sam.


Ale nie może stać się tak brzydka jak programowanie parami :-), może z wyjątkiem twojego kodu
Egg

33
Wszystko zależy od drugiej osoby. =)
JohnFx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.