Forum » Programiranje » V kakšnem stilu pišete vašo kodo?
V kakšnem stilu pišete vašo kodo?
korenje3 ::
No senior profesionalci, je smiselno drobit kodo na posamezne funkcije in s tem pumpati stack, al ne?
Pri malih zdevščinah včasih premišljujem, če ne bi bilo bolje uporabljati "inline" kot pa riniti na sklad.
V x86/x64 se že lahko delate junake.
Največji problem predstavljajo loopi. In potem če delaš nevede loope znotraj loopov da pridobiš neko vrednost, kar bi lahko naredil že prej ipd.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
darkolord ::
techfreak :) je izjavil:
Zakaj bi vsak commit moral biti smiselno poimenovan? Saj preden zadevo spravis code review korak, lahko brez problema squashnes vse skupaj. Pa se potem lahko squash merge naredis, in bos imel clean history.Saj menda se govori o tem, kaj potem konča na main repotu, ne kaj imaš ti lokalno.
Žal videvam veliko repotov, kjer main repo izgleda kot kakšni špageti in ima cel kup "neki neki Asdf" commitov.
Jaz raje porabim na koncu pol ure več, da zadevo rebase-am, včasih tudi razstavim in ponovno sestavim v logične commite. Stranke to seveda z veseljem plačajo, ker je:
a) reviewanje code precej lažje in hitrejše, če ni vse random pomešano
b) iskanje sprememb (history/blame) neprimerno bolj učinkovito, ker ni treba ugotavljati, kaj kam paše
Če se le da, ima vsak commit še ID ticketa noter in se potem to lepo poveže v Jiri, Confluence, ... Pa changelog za vsako verzijo je že avtomatski.
Zgodovina sprememb…
- spremenilo: darkolord ()
kuall ::
Tako je, to je dober primer nepravilne uporabe komentarjev.
V resnici bi se to bolje imenovalo segmentiranje/kategoriziranje kode. Če vsakemu segmentu daš še naslov (komentar) je koda še toliko bolj berljiva. Saj ste videli, da je bil komentar samo 1 beseda. Če bi bili namesto 1 besede dolgi stavki potem bi bilo že malo mimo, s tem se strinjam.
Če že ne komentirate vsaj upam, da kodo segmentirate, ne pa namečete vse skupaj?
Človeški možgani lažje razumejo stvari, ki so kategorizirane in ki so majhne. Jaz kodo kategoriziram v majhne segmente. Par vrstic oziroma kolikor je logično možno. Programirat moraš tako, da bo čimlažje razumet kodo, tudi če izpadeš kot začenik, ne pa da boš izpadel kul, kako si pameten, ker noben ne razume tvojih špagetov.
BigWhale ::
napsy ::
Ah BigWhale, naiveni BigWhale :) taksni kot so nekateri posamezniki tu v temi zares obstajajo. Mislim da ne trollajo, pac so na junior nivoju. Sicer brez veze obsojat, vsak se je moral se nekoc naucit.
"If you die, you die. But when you live you live. There is no time to waste."
kuall ::
Mene bolj zanima kako vi pišete dokumentacijo za sisteme, module, razrede? Npr kakšne informacije točno se zahteva da dokumentirate v podjetjih ki delate?
Včasih se piše dolge specifikacije, ki jih potem noben ne bere, ker so predolge in suhoparne.
Veliko bolj uporabno kot neke specifikacije bi bila navodila za uporabo programa za telebane. Ampak tudi te imajo veliko nevarnost, da jih ne bo noben bral, ker bodo neuporabna in zanič napisana, v nobeno pomoč.
Zato jaz raje napišem po točkah, kako se program stestira. Točno kaj moraš vnesti, kaj klikniti in kakšne rezultate moraš pričakovati. Tisto je pa uporabno kot hudič. Obenem so tudi izvrstna navodila, kako se program uporablja in kaj je njegov namen. To naredim za vse bolj kompleksne programe, ker vem, da bo huda kriza čez 1 leto, ko bom že vse pozabil. Za majhne pa ni potrebno seveda. Po občutku.
Zgodovina sprememb…
- spremenilo: kuall ()
techfreak :) ::
BigWhale ::
blay44 ::
Irbis ::
Bom dodal še eno vprašanje v zvezi s stilom: ali kaj uporabljate assert?
Jaz jih imam vse polno v kodi, preverjam vhodne parametre, preverjam strukturo rezultata, vsaka razvejitev, za katero mislim, da je nemogoča, dobi svoj assert(0) pred kodo, ki poskrbi za zasilni izhod (tudi vsak default v switchu). Tudi za vmesne domneve, kaj bo sledilo, običajno hitro vržem notri assert, da me opozori, če sem kje pozabil kakšno možnosti.
Produkcijska verzija se potem izvaja brez tega, da je hitrejša (v C-ju se ti hitro zgodi, da ti preverjanja požrejo pol časa), vsa testiranja pa jih izvajajo - kar najde marsikaterega hrošča, sploh če kaj spreminjaš v strukturi rezultatov.
Jaz jih imam vse polno v kodi, preverjam vhodne parametre, preverjam strukturo rezultata, vsaka razvejitev, za katero mislim, da je nemogoča, dobi svoj assert(0) pred kodo, ki poskrbi za zasilni izhod (tudi vsak default v switchu). Tudi za vmesne domneve, kaj bo sledilo, običajno hitro vržem notri assert, da me opozori, če sem kje pozabil kakšno možnosti.
Produkcijska verzija se potem izvaja brez tega, da je hitrejša (v C-ju se ti hitro zgodi, da ti preverjanja požrejo pol časa), vsa testiranja pa jih izvajajo - kar najde marsikaterega hrošča, sploh če kaj spreminjaš v strukturi rezultatov.
Utk ::
Točno kaj moraš vnesti, kaj klikniti in kakšne rezultate moraš pričakovati.
Če vneseš točno tisto kar bi "moral" in klikneš tisto kar bi "moral", skoraj vsak program dela prav. Problemi so ko se vnese in klikne kaj kar naj ne bi "moral".
napsy ::
... ali kaj uporabljate assert?
Samo pri unit testih. Vcasih so bili tudi v produkcijski kodi, pa sem se hitro naucil, da je potrebno pri high-availability biti zelo pazljiv, kar se tice mantre "fail quick and fail early". V praksi pomeni, da je na primer panic() statement pri jeziku Go bolj ali manj useless zame.
"If you die, you die. But when you live you live. There is no time to waste."
Zgodovina sprememb…
- spremenil: napsy ()
Invictus ::
Mene bolj zanima kako vi pišete dokumentacijo za sisteme, module, razrede? Npr kakšne informacije točno se zahteva da dokumentirate v podjetjih ki delate?
Včasih se piše dolge specifikacije, ki jih potem noben ne bere, ker so predolge in suhoparne.
Veliko bolj uporabno kot neke specifikacije bi bila navodila za uporabo programa za telebane. Ampak tudi te imajo veliko nevarnost, da jih ne bo noben bral, ker bodo neuporabna in zanič napisana, v nobeno pomoč.
Zato jaz raje napišem po točkah, kako se program stestira. Točno kaj moraš vnesti, kaj klikniti in kakšne rezultate moraš pričakovati. Tisto je pa uporabno kot hudič. Obenem so tudi izvrstna navodila, kako se program uporablja in kaj je njegov namen. To naredim za vse bolj kompleksne programe, ker vem, da bo huda kriza čez 1 leto, ko bom že vse pozabil. Za majhne pa ni potrebno seveda. Po občutku.
Čakaj, mešaš 3 povsem različne zadeve...
1. Specifikacije, oz. nek design mora biti. Če project manager in arhitekt tega ne znata razbiti na taske, naj zamenjata službo.
2. Navodila za telebane so spet nekaj drugega-. Pa naj bo to končni uporabnik ali tester.
3. Ja, to je del test scenarija. Navodila, kako se testira... Ne sme biti pa to edini papir...
Na koncu moraš pač napisati vse, samo programerjem se ne da napisati nič. Videno velikokrat in če ni trde roke, na koncu tudi ni nič napisano. Saj se folk hitro navadi napisati nekaj besed...
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
Irbis ::
... ali kaj uporabljate assert?
Samo pri unit testih. Vcasih so bili tudi v produkcijski kodi, pa sem se hitro naucil, da je potrebno pri high-availability biti zelo pazljiv, kar se tice mantre "fail quick and fail early". V praksi pomeni, da je na primer panic() statement pri jeziku Go bolj ali manj useless zame.
Ja, ravno to mi je všeč pri assertih, v C/C++ jih release prevajanje že privzeto izloči, tako da jih v produkciji ni. Ker v večini primerov program brez težav nadaljuje, tako da ni nobene potrebe tečnariti uporabniku s tem.
Za testiranje in pri svoji uporabi jih pa imam vključene, da me opozorijo na morebitne težave.
kuall ::
Asserti so čist kul razen tega, da pogršajo kodo. Nikoli jih ne more bit preveč.
Zgleda da GO sploh nima debug in release verzije.
Zgleda da GO sploh nima debug in release verzije.
krho ::
Go ima "debug" in "release" verziji... Prevaja se zmeraj debug.. Lahko pa stripneš ven debug info s -ldflags="-s -w".. Pa dlv za dober debug hoče program preveden z -ldflags="all=-N -l"
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
krho ::
Drugače pa lahko sam narediš debug verzijo...
Narediš package is...
Pol pa debug kodo prevedeš s tagom debug. V kodi poljubno pišeš is.Debug... in če bo is.Debug false bo prevajalnik ven zmetal celoten is.Debug if blok
Narediš package is...
// +build debug
package is
// Debug mode
const Debug = true
// +build !debug
package is
// Debug mode
const Debug = false
Pol pa debug kodo prevedeš s tagom debug. V kodi poljubno pišeš is.Debug... in če bo is.Debug false bo prevajalnik ven zmetal celoten is.Debug if blok
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Irbis ::
Zgleda da GO sploh nima debug in release verzije.
Saj po eni strani to je smiselno, ker včasih se ti res lahko zgodi, da ti stvar v debugu dela, v releasu pa potem ne (sploh C ima par grdih idej o tem, da se debug drugače obnaša pri privzeti inicializaciji spremenljivk - v zdajšnjih časih sicer običajno dobiš warning, da uporabljaš neinicializirano spremenljivko, včasih pa tega ni bilo).
Še presledke sem se naučil striktno pisati, ko mi je en prevajalnik za C (na Vaxu) nekoč prevedel i=-10; v i -= 10; namesto pričakovanega i = -10; ko sem nekaj prenašal s PC na VAX. Originalni KR C je bil pač malce drugačen kot Ansi C :-)
Jirzy ::
assert - ja, za vsako stanje, ki je 'nemogoce'. Itak pisem C++, tako, da jih obcutim samo jaz.
Sicer pa - razdeliti funkcijo na vec manjsih funkcij se mi zdi zelo smiselno. Vsaka naj ima najvec 3 parametre. Ce ne gre drugace, naredis strukturo, ki jo nato uporabis za argument.
Ciljam na to, da vse funkcije pridejo na en ekran - cca 40 vrstic. Izjema so kaksne funkcije za prenos parametrov.
Sicer pa - razdeliti funkcijo na vec manjsih funkcij se mi zdi zelo smiselno. Vsaka naj ima najvec 3 parametre. Ce ne gre drugace, naredis strukturo, ki jo nato uporabis za argument.
Ciljam na to, da vse funkcije pridejo na en ekran - cca 40 vrstic. Izjema so kaksne funkcije za prenos parametrov.
Invictus ::
Saj po eni strani to je smiselno, ker včasih se ti res lahko zgodi, da ti stvar v debugu dela, v releasu pa potem ne (sploh C ima par grdih idej o tem, da se debug drugače obnaša pri privzeti inicializaciji spremenljivk - v zdajšnjih časih sicer običajno dobiš warning, da uporabljaš neinicializirano spremenljivko, včasih pa tega ni bilo).
Na Cju uporabiš -Wall opcijo pri prevajanju .
Zraven pa še Werror..
Meni gre na bruhanje, ko folk ne spuca warningov iz programa... Najbrž so tam z razlogom...
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
Zgodovina sprememb…
- spremenil: Invictus ()
shadeX ::
Zato jaz raje napišem po točkah, kako se program stestira. Točno kaj moraš vnesti, kaj klikniti in kakšne rezultate moraš pričakovati. Tisto je pa uporabno kot hudič. Obenem so tudi izvrstna navodila, kako se program uporablja in kaj je njegov namen. To naredim za vse bolj kompleksne programe, ker vem, da bo huda kriza čez 1 leto, ko bom že vse pozabil. Za majhne pa ni potrebno seveda. Po občutku.
Tnx za odgovor, neki je pomagal.
Na koncu moraš pač napisati vse, samo programerjem se ne da napisati nič. Videno velikokrat in če ni trde roke, na koncu tudi ni nič napisano. Saj se folk hitro navadi napisati nekaj besed...
I can relate. Kot 100% samouk (brez mentorja, šole ali kakšne druge strokovne podlage), sem po dolgem času ugotovil da je dokumentacija nujno zlo, ki hočeš nočeš mora obstajat. Ugotovil sem namreč da sem napisal že kar nekaj manjših sistemov, ki interaktajo med seboj, nakar ugotovil čez čas da nimam pojma:
1. Kaj VSE zadeva dela
2. Kaj je avtomatizirano
3. Kako uporabim to zadevo v naslednjem projektu (glej še enkrat točko 2)
Naivno sem mislil da ker je moja koda bom že vedel ampak daleč od resnice.
Problem, ki ga imam/imel pri pisanju dokumentacije je ta, ker preprosto ne vem kaj vse moram vključiti v njo - kaj bo prineslo večjo vrednost in obenem da dokumentacija ne bo kot roman, ker ne bo noben bral.
Zato sem ustvaril nek "template", po katerem delam in napišem tiste vredne informacije, ampak se poskušam držati načela da mora biti dovolj jasna da vsak razume kako sistem dela in kaj mora uporabiti tudi če ni programer (ni tako enostavno, ker lahko hitro napišeš "preveč").
Kakorkoli, če ti teh stvari noben ne pove je zadeva lahko izjemno time consuming, ker se pač učiš iz napak.
Zgodovina sprememb…
- spremenil: shadeX ()
Utk ::
Ne sekiraj se, tega se v nobeni šoli ne bi naučil. Lahko ti bi kdo svetoval, ampak še zmeraj bi te parkrat skurcal preden bi ti uspelo "prav", tako se pa skurcaš sam, ko vidiš da bi tam lahko nekaj napisal, pa nisi.
Zgodovina sprememb…
- spremenil: Utk ()
napsy ::
...Pol pa debug kodo prevedeš s tagom debug. V kodi poljubno pišeš is.Debug... in če bo is.Debug false bo prevajalnik ven zmetal celoten is.Debug if blok
Gre se za lovljenje bugov v produkciji in panic() povzroci, da se program usuje, ce tega nisi prej ujel nekje. Pri Go so sli celo tako dalec, da so zagovarjal "crash early", kar je no-go pri HA.
"If you die, you die. But when you live you live. There is no time to waste."
krho ::
Mnja.. ne ga panic ne usuje (no terminira).. ker imam recover handler/interceptor vsaj tam, kjer se servirajo zahtevki...
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
bbbbbb2015 ::
bbbbbb2015 je izjavil:
Kakor rečeno, mi imamo tri ekrane, eni dva. Imamo pa enega razvijalca, ki vztraja na enem 14'' laptopu. Ampak ta bolj potem rihta neke sistemske zadeve in bi ga jaz bolj označil kot sistemca, ne razvijalca.
To je neumnost. Ce ti berljivost kode pogojuje hardware, potem je tvoja koda fucked up. Vse kar je vec kot 120 znakov v vrstici je neberljiva klobasa, pa je popolnoma vseen a imas 21" 24" al pa 32" monitor.
Glede na to, da sem začel razvijati na enem VT terminalu, bi rekel, da sem dal marsikaj skozi. Jasno je, če imaš veliko površino ekrana, je delo učinkovito, če lahko kodo čim bolj jasno in precizno predstaviš na ekranu.
Koda, ki je omejena na 80 znakov, je na enem 27" ekranu videti smešna. 3/4 ekrana je praznega. V prejšnjem timu smo se vsi strinjali, da je omejitev na 80 znakov za leto 2015 nekoliko majhna, ter smo takrat soglasno kodo preformatirali na 130 znakov.
Pa ne samo to. Vsi uporabljamo isti font za razvoj - Deja Vu:
https://dejavu-fonts.github.io/
ravno z namenom, da je koda berljiva (ničle, oji, enice, lji).
No v letu 2020 imam tri ekrane. Ni to nek hud kunšt, sploh 24" HD ekrani so dokaj poceni. Malo me sicer moti, da sta stranska 24" ekrana z drugo toploto barv, kot 27", ni pa hudo.
Na enem razvijam, na enem imam razne zadeve, dokumentacijo, specifikacije, na tretjem pa imam run-time, brskalnik, oz. bug reporting (JIRA). Vsaj pri nas v timu se je to pokazalo kot časovno učinkovito, da ne preklapljam med ekrani oz. okni.
Zimonem ::
Java je sitna z tistim objektnimi pristopom in potem vse skupaj rata dolgo za popizdit. Sam imam monitorje kjer je koda v portrait modu.
BigWhale ::
bbbbbb2015 je izjavil:
Koda, ki je omejena na 80 znakov, je na enem 27" ekranu videti smešna. 3/4 ekrana je praznega. V prejšnjem timu smo se vsi strinjali, da je omejitev na 80 znakov za leto 2015 nekoliko majhna, ter smo takrat soglasno kodo preformatirali na 130 znakov.
Vse kar je vec kot 120 znakov je resnicno veliko. Jaz imam nastiman soft limit na 80 znakov in hard limit na 120 znakov. Seveda je pri jezikih, kjer so imena funkcij in spremenljivk dolga, vcasih tezko priti pod 120 znakov, sploh ce se uporablja se inline HTML. Ampak pri nekem backend delu, kjer nimas teh reci, je pa 120 znakov vrh glave in ce rabis vec, potem mors resno razmislit o tem zakaj rabis vec.
Ce imas toliko nivojev gnezdenja, da ti je 120 znakov komaj dovolj, potem je cas za refactoring, ce imas tako dolga imena potem se je treba tudi vprasat a je to smiselno. Ce imas tako dolge pogoje v zankah in pogojnih stavkih, potem se splaca razmislit ali ni bolje treh && napisat v vecih vrsticah, ker jih tako lazje preberes in ugotovis kaj pocne tisti pogoj.
bbbbbb2015 je izjavil:
Pa ne samo to. Vsi uporabljamo isti font za razvoj - Deja Vu:
https://dejavu-fonts.github.io/
Splaca se sprobat Jetbrains Mono font z ligaturami za razlicne operaterje.
https://www.jetbrains.com/lp/mono/
Zimonem ::
bbbbbb2015 je izjavil:
Koda, ki je omejena na 80 znakov, je na enem 27" ekranu videti smešna. 3/4 ekrana je praznega. V prejšnjem timu smo se vsi strinjali, da je omejitev na 80 znakov za leto 2015 nekoliko majhna, ter smo takrat soglasno kodo preformatirali na 130 znakov.
Vse kar je vec kot 120 znakov je resnicno veliko. Jaz imam nastiman soft limit na 80 znakov in hard limit na 120 znakov. Seveda je pri jezikih, kjer so imena funkcij in spremenljivk dolga, vcasih tezko priti pod 120 znakov, sploh ce se uporablja se inline HTML. Ampak pri nekem backend delu, kjer nimas teh reci, je pa 120 znakov vrh glave in ce rabis vec, potem mors resno razmislit o tem zakaj rabis vec.
Ce imas toliko nivojev gnezdenja, da ti je 120 znakov komaj dovolj, potem je cas za refactoring, ce imas tako dolga imena potem se je treba tudi vprasat a je to smiselno. Ce imas tako dolge pogoje v zankah in pogojnih stavkih, potem se splaca razmislit ali ni bolje treh && napisat v vecih vrsticah, ker jih tako lazje preberes in ugotovis kaj pocne tisti pogoj.
bbbbbb2015 je izjavil:
Pa ne samo to. Vsi uporabljamo isti font za razvoj - Deja Vu:
https://dejavu-fonts.github.io/
Splaca se sprobat Jetbrains Mono font z ligaturami za razlicne operaterje.
https://www.jetbrains.com/lp/mono/
Pa daj ne bluzi poštar o stvareh ki jih nisi počel. Imena so definirana v frameworku. Že imena razredov so dolga, dodaj še metode pa si na 60 znakih dok ne rečeš keks. Kdor bi mi šel pa refaktorirat kodo zaradi gnezdenja, ga pa lastnoročno odnesem od mašine.
Bebcem dat v roke refactoring orodja je greh.
kuall ::
Refraktoriranje? To sem včasih delal, ko sem bil nov. Zdaj napišem 1x in pustim tako kot je prvič ratalo. Prej raje malo bolj premislim, da ne bom imel dela s spreminjanjem. Refraktoriranje je zguba časa in vnaša nove buge.
Posebej mim so taki programerji, ki prevzamejo nek nov projekt in ga na veliko spreminjajo.
Posebej mim so taki programerji, ki prevzamejo nek nov projekt in ga na veliko spreminjajo.
kuall ::
Teste se pise zato, da so ti v pomoc pri refaktoriranju in pri spremembah v kodi.
Ti tako kot vsi nobi preveč refraktoriraš kodo, to je tvoj problem. Zato pa rabiš milijon unit testov. Itak da ti refraktoriranje vse podre, saj to je znano. Mindset nooba, ki se ga marsikdo ne znebi nikoli je takle: bom že kasneje popravil.
napsy ::
kuall, predlagam da si preberes kaj o technical debt. Ker je vec kot ocitno, da mogoce se nimas izkusnje z vodenjem projektov. Skozi cas bos ugotovil, da je refactoring neizogiben, ce zelis da je projekt manageable skozi cas. Plus kot programer se obicajno vedno kaj novega ucis tekom let in bos videl mozne popravke v kodi, ki bodo omogocale uporabo novih tehnologij in konceptov, ki jih prej se nisi poznal.
"If you die, you die. But when you live you live. There is no time to waste."
kuall ::
Že že, pri ogromnih projektih je refractoring neizogiben, pa še tam je bolje cel modul na novo napisat, če že pride do tega.
Ni pa potreben pri stvareh, ki jih BigWhale dela. Javascript skripte in podobna jajca.
Ni pa potreben pri stvareh, ki jih BigWhale dela. Javascript skripte in podobna jajca.
kuall ::
Hehe sem si pogledal technical debt. Nastavite si neumne roke, spacate na hitro (bom že kasneje popravil, ko bo čas), potem pa delate refractoring.
HotBurek ::
BigWhale je n00b. Dober dđouk.
Evo moj sample "refaktoring-a". Prvotna funkcija:
Kasneje sem odkril funkcijo zfill in zadeve popravil:
In od prej imam notri dtstart, kar bom enkrat tudi popravil na dtnow. Mogoče kr zdele. Pa tudi _date v dstring.
Evo moj sample "refaktoring-a". Prvotna funkcija:
def getdate(): dtstart = datetime.datetime.now(); day = dtstart.day; if len(str(day)) == 1: day = "0" + str(day); month = str(dtstart.month); if len(str(month)) == 1: month = "0" + str(month); _date = str(dtstart.year) + "-" + str(month) + "-" + str(day); return _date;
Kasneje sem odkril funkcijo zfill in zadeve popravil:
def getdate(): dtstart = datetime.datetime.now(); day = str(dtstart.day).zfill(2); month = str(dtstart.month).zfill(2); _date = str(dtstart.year) + "-" + str(month) + "-" + str(day); return _date;
In od prej imam notri dtstart, kar bom enkrat tudi popravil na dtnow. Mogoče kr zdele. Pa tudi _date v dstring.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
kuall ::
Če je prvotna funkcija delal ok si jo šel brezveze spreminjat. A nimaš bolj pametnega dela kot podirat že delujočo kodo?
HotBurek ::
Spreminjat je nisem šel za brezveze; ko sem funkcijo pisal, nisem pozan zfill, katerega sem potem napisal "na roke". Kasneje, ko sem to funkcijo odkril, sem tisto "na roke" popravil in zamenjal z za to namenjeno (že razvito) funkcijo.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
kuall ::
saj obstaja več načinov, kako nekaj sprogramirat. oba sta pravilna. ker si prvega že stestiral si samo delaš muke, ker si šel spreminjat kodo, ki dela brezhibno. očitna začetniška napaka, večkrat videl.
kuall ::
BigWhale govori o nekem clusterfuck programiranju. Pol pa grem gledat njegovo github kodo in programira točno tako, kot jaz svetujem. Kodo je razdelil v bloke, vsakemu bloku je dal komentar. WTF. Kako se to razlikuje od tistega mojega originalnega komentarja? Ali se kregamo samo zato, da se kregamo?
Edino zadnji blok bi jaz stlačil skupaj in mu dal naslov
// Print results.
za večjo preglednost.
Edino zadnji blok bi jaz stlačil skupaj in mu dal naslov
// Print results.
za večjo preglednost.
void setup() { Serial.begin(115200); while(!Serial) {} // Wait // Pin setup pinMode(LED_BUILTIN, OUTPUT); // Set default LED states digitalWrite(LED_BUILTIN, HIGH); // Builtin LED needs to be set to LOW to turn it off for (int i = 0; i < 5; i++) { digitalWrite(leds[i], LOW); pinMode(leds[i], OUTPUT); } // Initialize relays for (int i = 0; i < 4; i++) { digitalWrite(relay[i], HIGH); pinMode(relay[i], OUTPUT); } flash_leds(); // Set WIFI mode WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(200); // Connect to WiFi while ( status != WL_CONNECTED) { digitalWrite(LED_AMBER, HIGH); digitalWrite(LED_RED, LOW); status = WiFi.begin(ssid, pass); delay(10000); } digitalWrite(LED_AMBER, LOW); // Star Wire protocol Wire.begin(); while(!airSensor.begin(BME_ADDRESS)) { Serial.println("Could not find BME280I2C sensor!"); delay(1000); } waterSensor.begin(); Serial.print("Found "); Serial.print(waterSensor.getDeviceCount(), DEC); Serial.println(" sensor devices."); if (!waterSensor.getAddress(waterSensorAddress, 0)) { Serial.println("Unable to find address for water sensor."); } }
blay44 ::
Pa vi to v arduinotu?
Kle sploh ne rabiš komentarjev.
Jaz sem mislil, da ste pravi PC Cjaši.
Kle sploh ne rabiš komentarjev.
Jaz sem mislil, da ste pravi PC Cjaši.
BigWhale ::
Pa daj ne bluzi poštar o stvareh ki jih nisi počel. Imena so definirana v frameworku. Že imena razredov so dolga, dodaj še metode pa si na 60 znakih dok ne rečeš keks. Kdor bi mi šel pa refaktorirat kodo zaradi gnezdenja, ga pa lastnoročno odnesem od mašine.
Bebcem dat v roke refactoring orodja je greh.
A se potegujes za kak nov naziv al sam tko mal na pamet zalis, ker ne ves vec kaj bi povedal?
Refraktoriranje? To sem včasih delal, ko sem bil nov. Zdaj napišem 1x in pustim tako kot je prvič ratalo. Prej raje malo bolj premislim, da ne bom imel dela s spreminjanjem. Refraktoriranje je zguba časa in vnaša nove buge.
Posebej mim so taki programerji, ki prevzamejo nek nov projekt in ga na veliko spreminjajo.
Po tem kar pises, se mi zdi, da verjetno se nimas izkusenj s kaksnimi bolj resnim razvojem, na projektu, ki je ziv vec let in na katerem dela vec ljudi v skupini. Do sedaj je vecina tega kar si povedal skregana z vsemi dobrimi praksami v razvoju.
No ampak, kot sem ze rekel, ce je vsa tvoja koda turing-complete, potem obstaja verjetnost, da vse napises dobro v prvo. Si pa edini na svetu, ki to pocne. Cestitke.
Zgodovina sprememb…
- spremenil: BigWhale ()
BigWhale ::
Hehe sem si pogledal technical debt. Nastavite si neumne roke, spacate na hitro (bom že kasneje popravil, ko bo čas), potem pa delate refractoring.
Ti si si zdaj sel pogledat kaj pomeni izraz technical debt? Ok, sam tolk, da vemo. :) Tudi to, kar si potem napisal nima neke veze s tech debtom. Se mi zdi, da tudi tega izraza ne razumes kaj pomeni, ceprav si morda zdaj googlal.
Mindset nooba, ki se ga marsikdo ne znebi nikoli je takle: bom že kasneje popravil.
A na tak osebni nivo zaljenja preklopis zaradi projekcij? Al se boljs pocitis, ce druge zalis al kako? Al je to samo slaba vzgoja? Dej, razlozi nam to?
Zgodovina sprememb…
- spremenil: BigWhale ()
BigWhale ::
BigWhale govori o nekem clusterfuck programiranju. Pol pa grem gledat njegovo github kodo in programira točno tako, kot jaz svetujem. Kodo je razdelil v bloke, vsakemu bloku je dal komentar. WTF. Kako se to razlikuje od tistega mojega originalnega komentarja? Ali se kregamo samo zato, da se kregamo?
Joj, googlat si sel mojo kodo, jo dejansko odprl in zdej jo sem pastas? Lahk bi vsaj link do celega Github projekta dal. :> Cestitke za uporabo Googla! Nasel si moj hobi projekt, ki je napisan primarno za Arduino community z nekim tihim upanjem, da se bo iz njega se kdo cesa naucil. :) Saj vem, projekt itak sucks, ker ima zraven celo navodila za namestitev in opis delovanja. Dobri programi tega ne potrebujejo.
Evo, dobis vrecko Haribo bombonov, ce v urednistvu pustis naslov in svoje podatke.
Zgodovina sprememb…
- spremenil: BigWhale ()
strawman ::
Hehe sem si pogledal technical debt. Nastavite si neumne roke, spacate na hitro (bom že kasneje popravil, ko bo čas), potem pa delate refractoring.
Ti si si zdaj sel pogledat kaj pomeni izraz technical debt? Ok, sam tolk, da vemo. :) Tudi to, kar si potem napisal nima neke veze s tech debtom. Se mi zdi, da tudi tega izraza ne razumes kaj pomeni, ceprav si morda zdaj googlal.
Dokler ni prijavil da še ni slišal za tehnični dolg, sem še mislil da je troll. Zdaj pa vidim da je le sveža ribica ki egotripa.
mr_chai ::
Kakšne pa delate opise commitov?
Evo, primer opisa commitov...
commit f73554c7794f2956cee6f9e9141b74353c6951fb
Date: Tue Dec 22 21:59:25 2020 +0100
Popravil bug
commit 0c47e5964b38fadc00e058a67d37cc29cffdbd3a
Date: Tue Dec 22 21:59:07 2020 +0100
Neki neki Asdf
commit 8138670e746a39be745d422291b4c0adb06f88f6
Date: Tue Dec 22 21:58:41 2020 +0100
Dodal ene par stvari
commit c6eb63f918f0a909bbb8fcef32fcb66e562eaab1
Date: Tue Dec 22 21:20:36 2020 +0100
Removed some stuff
ti opisi so katastrofa, to je joke ?
Unit testi pa so tudi za iskanje napak in ne samo za odkrivanje regresij, ker pod unit test spadajo tudi generativni testi, ti pa ponavadi kar dobro najdejo napake, dosti bolje kot ročni testi.
Zgodovina sprememb…
- spremenilo: mr_chai ()
WizzardOfOZ ::
Ni neke alternative. Bi bil pa vesel, če bi se kje postavil tak forum, pa malo postavili kake dobre standarde, kako se programira in kako se potem testira. (tudi regresija, ...).
Vidim vsak dan kup programerjev, vsak od njih pa na nek svoj način programira. Za enimi je prav težko brat njihovo špageti kodo, za drugimi je treba pa stalno popravljat, ker delajo samo da bo narejeno, problemi so pa potem s performancami, z tretjimi moraš pa stalno stat ob strani, ker za vsak if vprašajo če je prav napisan in nimajo nič samostojnosti. Vidim pa tudi par dobrih programerjev, ampak so bolj ko ne svetle izjeme.
Recimo moja koda je vedno taka, da imam za vse zraven summary in težim, da vsakdo, ki kaj popravlja, v summary to tudi napiše in kdaj je porpavil in zakaj je popravil.
Vidim vsak dan kup programerjev, vsak od njih pa na nek svoj način programira. Za enimi je prav težko brat njihovo špageti kodo, za drugimi je treba pa stalno popravljat, ker delajo samo da bo narejeno, problemi so pa potem s performancami, z tretjimi moraš pa stalno stat ob strani, ker za vsak if vprašajo če je prav napisan in nimajo nič samostojnosti. Vidim pa tudi par dobrih programerjev, ampak so bolj ko ne svetle izjeme.
Recimo moja koda je vedno taka, da imam za vse zraven summary in težim, da vsakdo, ki kaj popravlja, v summary to tudi napiše in kdaj je porpavil in zakaj je popravil.
/// <summary> /// nabor podatkov iz tabele /// osnovni zahtevek: 1234, osnovni nabor podatkov za validacijo, dne: 12.12.2020, kdo: nebivedu /// popravek po zahtevku: 1235, spremenjeni parametri za nabor podatkov, dne: 15:12:2020, kdo: mr_chai /// popravek po zahtevku: 1345, dodan parameter xxx zaradi validacije, dne: 17:12:2020, kdo: nebivedu /// </summary> public class SomeClass { // pripravim parametre int i = ... // grem iskat podatke v tabelo TableRead(... // validacija Validate(... }
Milčinski je napisal butalce kot prispodobo in ne kot priročnik!!!
Svuda u svijetu ima budala ali je izgleda kod nas centrala!!!
Svuda u svijetu ima budala ali je izgleda kod nas centrala!!!
Smurf ::
Razlike je v tem, da se je BigWhale hecal s tistimi commit messagi, kuall pa je dejansko resen s svojimi posti :>.
@WizzardOfOZ
Tudi zgornji komentarje niso ravno primeri. Podvajas informacijo, ki jo dobis ze z zgodovino commitov.
Imas slack Slovenian Tech Community, kjer je kar nekaj ljudi, ki obvladajo stvari. V resnici jih najdes tudi na tem forumu, samo znati moras lociti zrno od plevela.
@WizzardOfOZ
Tudi zgornji komentarje niso ravno primeri. Podvajas informacijo, ki jo dobis ze z zgodovino commitov.
WizzardOfOZ je izjavil:
Ni neke alternative. Bi bil pa vesel, če bi se kje postavil tak forum, pa malo postavili kake dobre standarde, kako se programira in kako se potem testira. (tudi regresija, ...).
Imas slack Slovenian Tech Community, kjer je kar nekaj ljudi, ki obvladajo stvari. V resnici jih najdes tudi na tem forumu, samo znati moras lociti zrno od plevela.
Zgodovina sprememb…
- spremenil: Smurf ()
napsy ::
Moje mnenje je, da vsak prispeva svoj delez. Tudi manj izkuseni recimo mi dajo vpogled v nacin razmisljanja in na primer ta fiasko z refactoring mi je zanimiv vpogled v programiranje. In celotna debata, kako nekoga prepricat, da moras bit pameten pri komentiranju in kako je vseeno pametno razmislit o rewrite posameznih modulov in pisanju unit testov je le odobrila sadove.
Odprla se je debata, so se javili manj izkuseni, so se javili bolj izkuseni. Kot si rekel, Smurf, treba je "locit zrno od plevela", vendar to lahko naredi sam posameznik.
Mislim pa, da je recimo tu dost razviden ego trip nekaterih, ki v resnici nimajo nekih podkrepljenih argumentov.
Kar se tice foruma, bi mogoce bil zanimiv ekspreiment uvest nek tockovnik (kot npr. stackoverflow), kjer bi laho downvotal le, ce bi prispeval v sami debati.
Odprla se je debata, so se javili manj izkuseni, so se javili bolj izkuseni. Kot si rekel, Smurf, treba je "locit zrno od plevela", vendar to lahko naredi sam posameznik.
Mislim pa, da je recimo tu dost razviden ego trip nekaterih, ki v resnici nimajo nekih podkrepljenih argumentov.
Kar se tice foruma, bi mogoce bil zanimiv ekspreiment uvest nek tockovnik (kot npr. stackoverflow), kjer bi laho downvotal le, ce bi prispeval v sami debati.
"If you die, you die. But when you live you live. There is no time to waste."
FTad ::
BigWhale je n00b. Dober dđouk.
Evo moj sample "refaktoring-a". Prvotna funkcija:
def getdate():
dtstart = datetime.datetime.now();
day = dtstart.day;
if len(str(day)) == 1:
day = "0" + str(day);
month = str(dtstart.month);
if len(str(month)) == 1:
month = "0" + str(month);
_date = str(dtstart.year) + "-" + str(month) + "-" + str(day);
return _date;
Kasneje sem odkril funkcijo zfill in zadeve popravil:
def getdate():
dtstart = datetime.datetime.now();
day = str(dtstart.day).zfill(2);
month = str(dtstart.month).zfill(2);
_date = str(dtstart.year) + "-" + str(month) + "-" + str(day);
return _date;
In od prej imam notri dtstart, kar bom enkrat tudi popravil na dtnow. Mogoče kr zdele. Pa tudi _date v dstring.
Povsem tehnicno vprasanje. Cemu nisi spremenljivke raje poimenoval date_start, ali pa datetime_start? Res da je funkcija kratka, ampak bi imo še za malenkost pohitrila razumevanje le te.
showsover ::
public class SomeClass { // pripravim parametre ---- ??? int i = ... // grem iskat podatke v tabelo ---- ??? TableRead(... // validacija ---- ??? Validate(... }
Hehe, močno upam, da tile "---- ???" so samo primer nekega splošnega, ker so te stvari self-evident, če so variable/funkcije/metode/... smiselno poimenovani. Verjetno pa ne pričakujemo, da bo za nami kodo bral nekdo, ki mu te stvari niso kristalno jasne iz aviona. Ali??
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Python najbolj vroč programski jezik (strani: 1 2 3 )Oddelek: Novice / Ostala programska oprema | 29135 (23489) | BigWhale |
» | Unit testing - se poslužujete?Oddelek: Programiranje | 5178 (3328) | krneki0001 |
» | Applov nov programski jezik Swift (strani: 1 2 )Oddelek: Novice / Apple iPhone/iPad/iPod | 34344 (28905) | Kocka |
» | Incident Knight Capital in slaba programska oprema, ki poganja svetOddelek: Novice / Znanost in tehnologija | 15447 (12354) | Poldi112 |
» | Odkrit resen hrošč v PHP 5.3.7 (strani: 1 2 )Oddelek: Novice / Varnost | 16996 (14763) | Spura |