Frustracja przez (nie)optymalny kod

Frustracja przez (nie)optymalny kod
RO
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 3 lata
  • Postów:4
0

Witajcie,

chciałbym spytać Was o jedną kwestię. Mianowicie jak to jest z tym pisaniem optymalnego kodu w pracy?
Studiuję informatykę - wiadomo: często są jakieś programy do napisania. Jeśli chodzi o samo rozwiązywanie problemów, to raczej problemów z tym nie ma - program zazwyczaj robi co ma robić. Natomiast niezmiernie się irytuję i wkurzam, jeśli okaże się, że inni studenci napiszą ten sam program, ale w sposób bardziej zwięzły, optymalny, krótszy, szybszy, mniej pętli, funkcji, zmiennych itp. (na siebie oczywiście - że nie potrafiłem zrobić tego w lepszy sposób i że kiepski ze mnie programista). Prowadzący zajęcia oczywiście cieszą się, że są różne kody, nie zwracają w ogóle uwagi na to, aby kod był optymalny, a jedynie na to, aby program robił co ma robić, więc rzadko kiedy dostaje się jakiś feedback.
Jak wygląda ta kwestia w programowaniu komercyjnym? Jak duże znaczenie ma optymalizacja, jak dużą wagę się do tego przykłada? Chociażby w takim Web Devie.
Komuś też towarzyszy/towarzyszyła taka frustracja w podobnych sytuacjach? Pytałem znajomych ze studiów, to mówili, że nawet nie wiedzą o co mi chodzi

RE
  • Rejestracja:prawie 5 lat
  • Ostatnio:10 minut
  • Postów:105
16

@Rozbisurmaniony: widać, żeś młody
jest na to taki kawał

Idzie młody nauczyciel i dźwiga w torbie wszystkie papiery. Mija starszego stażem nauczyciela i pyta:
– Proszę pana, pan to pewnie to wszystko ma w głowie?
– Nie proszę pana, ja to wszystko mam w d**ie – odpowiada sędziwy nauczyciel.

Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:21 minut
  • Postów:1002
3

Twój PM nigdy nie popatrzy w kod, a nawet jakby popatrzył, to by nie zrozumiał, czy jest ładny, ale będzie się krzywił, że robiłeś taska godzinę dłużej niż mu wyszło z kalkulacji w Excelu.

BR
  • Rejestracja:około 6 lat
  • Ostatnio:2 dni
  • Postów:79
4

Wygląda to różnie.

Na projektach komercyjnych często nikt nie zwróci uwagi o ile kod nie jest napisany z rażącym zaniedbaniem wydajności.
Zazwyczaj względy czytelności kodu są ważniejsze kosztem wydajności jednak do pewnej granicy i nie we wszystkoch przypadkach.

serek
  • Rejestracja:około 11 lat
  • Ostatnio:3 minuty
  • Postów:1470
2

Ważne, żeby działał zgodnie z ustaleniami i nie walił błędami. Co do optymalizacji - oczywiście warto pisać jak najlepiej kod, jeśli są takie możliwości, ale też nie przesadzajmy. Są systemy gdzie to, czy coś ładuje się trochę dłużej nie robi różnicy, bo prędkość działania nie jest najważniejsza. Ale są też takie, gdzie to będzie mieć znaczenie.

CF
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 14 godzin
  • Postów:4
2

Polecam zamienić frustrację w motywację do poprawy swojego kodu. Polecam chociażby zacząć od ebooków dotyczących refactoringu szczególnie w języku którego używasz na codzień.

ZN
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 2 lata
  • Postów:49
1

Nie przejmuj się jeżeli twój kod nie jest najlepszy w grupie, moim zdaniem czytelniejszy kod jest zawsze lepszy, pamiętaj że programowanie to praca zespołowa, im łatwiej komuś zrozumieć twój kod, tym lepiej

krótszy kod =/= lepszy/szybszy

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
6
Rozbisurmaniony napisał(a):

Mianowicie jak to jest z tym pisaniem optymalnego kodu w pracy?

Ale co to znaczy optymalny?

  • Optymalny czasowo (najmniej czasu trwa zadanie, request itd)
  • Optymalny pamięciowo (najmniej ramu zjada podczas uruchomienia)
  • Optymalny jeśli chodzi o czas dostarczenia (musiało zostać dostarczone na asap bo to bugfix na proda)
  • Optymalny jeśli chodzi o czytanie (bo kod częściej się czyta)
  • Optymalny jeśli chodzi o rozszerzanie (Tu mamy wzorzec Strategia bo dziś mamy tylko dwie Strategie i można by to zrobić na ifie, ale za miesiąc będzie 50 różnych Strategii)

itd itp

Zwykle za jedną optymalność płaci się utratą innej optymalności (prostota vs szybkość, zwięzłość vs możliwość rozbudowy)
itd itp

Co do mnie to uwielbiam programowanie funkcyjne i kod jest dla mnie maksymalnie czytelny jak jest tam minimalna ilość zmiennego stanu i tak staram się pisać, o ile nie ma innych wytycznych, i to uważam że standardowy sposób pisania standardowego optymalnego kodu. Ale wielokrotnie słyszałem że dziwne rzeczy piszę. (Głownie na początku przed Javą 8)


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 3x, ostatnio: KamilAdam
RO
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 3 lata
  • Postów:4
0

Dzięki Wszystkim za odpowiedzi. Może rzeczywiście za bardzo się tym przejmuję, niepotrzebnie. Pewnie za rok już całkiem inaczej będę na to patrzył i na pewno umiejętności będą inne, większe. Po prostu gdzieś z tyłu głowy miałem takie przeświadczenie (w sumie nie wiem skąd), że żeby coś było dobre, to musi być najlepsze ;) i rzeczywiście jak przedmówca napisał optymalizacja może być różna, zależnie od tego co chcemy osiągnąć

katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
0
ZabawnyNick napisał(a):

Nie przejmuj się jeżeli twój kod nie jest najlepszy w grupie, moim zdaniem czytelniejszy kod jest zawsze lepszy, pamiętaj że programowanie to praca zespołowa, im łatwiej komuś zrozumieć twój kod, tym lepiej

krótszy kod =/= lepszy/szybszy

Czytelniejszy kod zawsze lepszy? Ty tak na poważnie?
Rozumiem, że jak ktoś Ci zarżnie bazę danych czytelnym kodem działającym nieoptymalnie to jest spoko ale gdy optymalny kod mniej czytelny działa przez 10 lat niezauważony to jest źle?


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
ZN
Nie chodzi mi o złożoność obliczeniową czy inne przypadki typu n+1, a cytując: bardziej zwięzły, krótszy, mniej funkcji, zmiennych, średnio chce mi się znowu debugować program bo jakiś geniusz kiedyś napisał projekt w której każda klasa ma jedną główną 1 funckję po 400 lini z 5 blokami try catch jeden w drugim
katakrowa
Ok ale w tym przypadku to raczej rzecz oczywista.
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
5

Zasada Pareta. 20% kodu odpowiada za 80% czasu wykonania. A w praktyce to pewnie nawet mniej niz 5% (edit: w sensie ze 5% kodu). Najbardziej oplaca sie optymalizowac waskie gardla.

Poza tym pisanie dobrego kodu wymaga najpierw obycia w pisaniu dzialajacego kodu. Jesli Ci zalezy to i tak przyjdzie z czasem.


λλλ
edytowany 2x, ostatnio: stivens
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
4

Dużo się nie pomylę jeśli napiszę, że wielu z nas czasem ma "doła" i myśli o sobie źle porównując się do innych. Ale nic straconego. Pewnych rzeczy można się nauczyć. Co można zrobić w przypadku wątpliwości we własne umiejętności? Przypomnieć sobie o pewnych rzeczach

  1. Każdy ma prawo czegoś nie umieć, szczególnie jeśli jest studentem. Ja mając za sobą niejedną batalię z kodem też czegoś nie wiem. Wtedy szukam w internecie albo pytam innych i nie patrzę czy są młodsi czy starsi. Nie sztuką jest przechwalać się wiedzą, ale przyznać do niewiedzy i wyciągnąć wnioski. A jeśli się przyznam, że nie wiem i ktoś mnie skrytykuje? To znaczy, że ta osoba dokonała osądu i krytyki. Osąd i krytyka nic nie wnoszą do tematu nauki. Kompletnie nic!
  2. Już posiadana wiedza też coś wnosi, nawet jeśli są to podstawy. Wielu próbowało z podstawami i nie dali rady. Jeden krok zrobiony, robimy kolejne

Są trzy grupy ludzi:

  • ci, co nie wiedzą czego nie wiedzą,
  • ci, co wiedzą czego nie wiedzą i się tego uczą;
  • ci, co już coś wiedzą,

Przechodząc z pierwszej grupy do drugiej już robimy postęp. Teraz pozostaje się uczyć i ćwiczyć, żeby wyrobić nawyki. Przypomnę tu przykład nauki pisania: dla szkrabów w podstawówce to nie lada wyzwanie. Dla wielu dorosłych z resztą też. Niech świadczy o tym mizerna liczba poczytnych pisarzy. W każdym razie raz nauczeni rzemiosła mamy je w nawyku i nie musimy myśleć jak się ono dzieje. Wniosek? Ćwiczyć i wyciągać wnioski!
Zapomniałbym dopisać: panika kiedy się nie wie a zrobić trzeba. My ani nasze problemy nie jesteśmy wyjątkowi. Tak samo ma dużo osób, tylko w innym wydaniu i nie każdy się przyznaje. Czasem można też coś skopać i nic się nie stanie. Zbugowany kod na prodzie? Zdarza się najlepszym. Oczywiście należy tego unikać. Chodzi o to, że nie ma co rozpaczać tylko robić swoje. Gdybyśmy tak wszystko rozpamiętywali, moglibyśmy pamiętać każdą wypełnioną przez siebie pieluchę i się za to winić.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 2x, ostatnio: PerlMonk
RO
Dzięki za ten komentarz ;) Aż zrobię screena i zapiszę gdzieś
ZP
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 miesiące
  • Postów:70
2

Swego czasu był taki kolega. Kontakt się urwał, ale jak jeszcze był to pracował w dość dużej firmie, międzynarodowej. Narzekał że w pracy nie pisze się obiektowo. Wojny o to toczył.
Jego wizja obiektowości była ta właściwą.
Nie chciał zluzować gumy.
Nie powiem, technicznie chłopak ok, nie można się przyczepić, ale jak ktoś tu wspomniał najważniejsza umiejętność to umiejętność współpracy. Słabo u niego było bo albo wg niego albo wojna.
Inny kolega był po drugiej stronie barykady. Trafił na kogoś kto wie lepiej kiedy czego używać. Ztobilł słicza, a że opcji było więcej niż 3 ten ktoś na review kazał mu zrobić mapę.
Po wyrażeniu wątpliwości w odpowiedzi dostał, nie [CIACH!], rób jak mówię.
Uważaj tylko żeby te frustracje nie przeszły z kodu na jego twórców. Nie mówię żeby na review puszczać wszystko, ale żeby wiedzieć gdzie zluzować.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
5
  1. Poza pewnymi wyjątkami czytelność i rozszerzalność kodu jest dużo ważniejsza od zaoszczędzenia kilku cykli procesora. A i te wyjątkowe hotspoty optymalizuje się raczej później niż wcześniej. Nie mówie tu oczywiście o jakichś sytuacjach ekstremalnych, że ktoś robi O(2^n) zamiast O(n), albo generuje milion zapytań do bazy ;)
  2. W pracy przykłada się wagę do tego zeby kod był zwięzły i czytelny, ale od tego są np. code review, gdzie więcej osób popatrzy na kod i zasugeruje co można poprawić. Programowanie to jest zajęcie "zespołowe".

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Podpinam się pod pytanie.
Z uwagi na to że właśnie mam w pracy na tapecie raport który odpala (by design) jedno zapytanie na jeden wiersz (Mongo) to się zastanawiam, gdzie się podziały te wszystkie profilery, dibieje, testy wydajnościowe i programiści liczący bity.
Przecież 640 kB RAM powinno wystarczyć każdemu...

Shalom
Optymalizuje się kiedy jest problem z wydajnością. Więc pytanie brzmi: czy macie taki problem? Czy raport sie nie generuje? Czy generacja kosztuje za dużo? Nie? To czemu chcesz tracic środki (czas programistów) na poprawianie? ;)
vpiotr
Akurat mam problem niewydajnościowy a raport ma 20 wierszy, ale w życiu bym nie pomyślał że tak można zrobić.
SH
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:82
0

Poczytaj o złożoności obliczeniowej. Np. dlaczego(jeśli elementy tablicy są rosnące) lepiej użyć wyszukiwania binarnego niż liniowego.
Dlaczego używa się struktur drzewiastych(drzewa bst, czerwono-czarne) do układania danych w pamięci.
O co chodzi w O-notacji O(1) O(logn) O(n) (nlogn) O(n^2) O(n!)

https://www.geeksforgeeks.org/analysis-of-algorithms-set-3asymptotic-notations/
https://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
https://www.geeksforgeeks.org/analysis-algorithm-set-5-amortized-analysis-introduction/
https://www.geeksforgeeks.org/g-fact-86/

Komercyjnie zależy co programujesz w front-endzie raczej nie przejmują się złożonościa w embedded dużo częściej.
Ale jak coś działa a ma złożoność np. n^2 a ewidentnie można to zrobić w złożoności liniowej n to nawet na review każą Ci to przepisać.
Powinieneś mieć to na algorytmach i strukturach danych.

edytowany 1x, ostatnio: shitlord
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3536
2
PerlMonk napisał(a):

Są trzy grupy ludzi:

  • ci, co nie wiedzą czego nie wiedzą,
  • ci, co wiedzą czego nie wiedzą i się tego uczą;
  • ci, co już coś wiedzą,

Ja bym powiedział, że są:

  • ci co nie wiedzą, że nie wiedzą
  • ci co wiedzą, że nie wiedzą ale nie wiedzą ile
  • ci co wiedzą, że nie wiedzą i wiedzą ile

Zawsze jest jakieś pole do poprawy - zwłaszcza przy kodzie. Niejednokrotnie miałem taką sytuację:

  • napisałem kod z implementacją A
  • dochodzę do wniosku, że jakbym przerobił to na B to by wyglądało lepiej
  • B nie wygląda perfekcyjnie, więc zaczynam przerabiać
  • kończy się na powrocie do A

Kiedyś mój kumpel powiedział, że aby zająć dwóch lub więcej seniorów na długie godziny to wystarczy im dać do rozwiązania prosty problem z prośbą, żeby było idealnie.

Shalom
Kiedyś mój kumpel powiedział, że aby zająć dwóch lub więcej seniorów na długie godziny to wystarczy im dać do rozwiązania prosty problem z prośbą, żeby było idealnie. coś w tym pewnie jest :p Im więcej mam doświadczenia tym mniej pewny jestem rozwiązań które stosuje, bo w każdym widze jakieś plusy i minusy. Jak byłem młodszy to klepałem jak umiałem :D
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)