Hur vet man att man skriver bra kod som professionell?

Permalänk

Hur vet man att man skriver bra kod som professionell?

Jag har skrivit kod under många år. Framförallt C kod och Java kod och även MATLAB. Just nu kör jag C++ för jag behöver ett ISO-klassat språk som kan göra GUI. Viktigt det där med ISO.

Punkt 1:
När jag skriver kod så börjar jag alltid göra ett projekt och jag skriver lite kod mer och mer. Tillslut börjar jag få en struktur. Men denna struktur ändrar jag hela tiden.

Ibland har jag olika mappar som heter UI, Tools, Communication, USB. Eller så blandar jag in dom så UI är egen mapp medan Tools innehåller Communication och Communication innehåller USB. Då känner jag att jag har fått en struktur.

Punkt 2:
Sedan när jag programmerar så tänker jag mycket på lager. Till exempelvis:

Huvud vy -> Tab -> Loggnings Data -> Databas hanterare

Jag försöker använda enkapsulering så mycket som det går för att undvika det där med globala funktioner. Jag är noga med att inget lager kan "hoppa" över lager t.ex. Huvud Vy:n kan ej tala med Loggnings Data igenom en genväg. Sådant gillar jag inte. Grafiskt gränssnitt får aldrig ha genvägar. Jag är strikt på sådant.

Punkt 3:
Jag brukar skriva kod som knappt har några for-loopar, while-loopar och istället skriver jag kod som bara ser ut som rader. Exempelvis:

void Database_handling::create_new_calibration_model_table_for_tableView(){ if(calibration_model != nullptr) delete calibration_model; calibration_model = new QSqlTableModel; calibration_model->setTable(CALIBRATION_TABLE_NAME); calibration_model->setEditStrategy(QSqlTableModel::OnManualSubmit); calibration_model->sort(0, Qt::SortOrder::DescendingOrder); calibration_model->sort(1, Qt::SortOrder::DescendingOrder); calibration_model->sort(2, Qt::SortOrder::DescendingOrder); calibration_model->sort(3, Qt::SortOrder::DescendingOrder); calibration_model->setHeaderData(0, Qt::Horizontal, tr("ID")); calibration_model->setHeaderData(1, Qt::Horizontal, tr("Calibration ID")); calibration_model->setHeaderData(2, Qt::Horizontal, tr("Calibration comment")); calibration_model->setHeaderData(3, Qt::Horizontal, tr("Calibration date time")); }

Jag använder mycket setters och getters i C++. I detta fall så finns det bara setters och inte getters.
Ibland använder jag for-loopar, men i QT ramverkhet så har jag ej haft behov av många for-loopar och bara 1 while loop. Jag använder dessa vid behov och försöker använda ramverkets funktioner så mycket som det går. Jag skulle ALDRIG falla mig in att använda 3:e parts mjukvara i ett C++ program. Orsaken har med att C++ saknar ett pakethanterarsystem, typ som Python och Java har.

Punkt 4:
En annan sak jag brukar göra är att jag gör små funktioner som utför bara 1 sak. T.ex.
- Skapa lista
- Anslut databas
- Radera rad
- Skicka meddelande
- Läs meddelande
- Läs en rad

Koden ovan gör 1 sak. Den fixar en tabell åt mig. Inget mer.

Punkt 5:
Jag använder minimal OOP och nästan aldrig använder jag:
- Arv
- Interface
- Polyformism

Arv kan vara bra om man har en bas-klass och interface kan vara bra om man har en stor abstrakt klass som innehåller allt. Men jag stöter sällan på problem som kan endast lösa med OOP. Faktiskt så har jag aldrig stött på ett problem där jag måste lösa det med ett interface. Spring Boot är dock ett undantag.

Det enda jag använder OOP är när jag ska begränsa användarens rätt att hoppa mellan lager och jag vill få en fin struktur på projektet. Mer än så är det inte. Jag kan lika gärna använda struct och funktioner om jag kör C. Det blir något svårt att ha privata fält i en struct, vilket inte går.

Punkt 6:
Jag försöker undvika boilerplate-kod t.ex. kod som upprepas hela tiden. Då samlar jag allt i funktioner, eventuellt statiska funktioner. Exempelvis:

UI_static_functions::UI_static_functions(){ } int UI_static_functions::get_selected_row_from_table_view(QTableView* tableView){ QItemSelectionModel* selectionModel = tableView->selectionModel(); if(selectionModel == nullptr){ return -1; /* If we haven't add a selection model to our tableView */ } QList<QModelIndex> qModelIndexList = selectionModel->selectedRows(); if(qModelIndexList.size() == 0){ return -1; /* If we havne't select a row in our tableView */ } return qModelIndexList.at(0).row(); }

Då anropar jag funktionen med

int selected_row = UI_static_functions::get_selected_row_from_table_view(minTabell);

Punkt 7:
Jag försöker göra koden så läsbar som möjligt igenom att använda långa namn t.ex. open_this_webbrowser_and_check_for_error().

Punkt 8:
Jag skriver aldrig GUI för hand. Jag använder alltid utvecklingsverktyg. Alltid utvecklingsverktyg. Nu tror jag att många använder detta också, men det finns som är där och pillar i fxml(JavaFX), xml, html, xhml, jsp för hand. Jag är en riktig "Drag N Drop"-programmerare. Gillar sådant. Varför? Det blir mindre kod. Minimal kod älskar jag. Desto mindre kod, desto bättre kod blir det.

Punkt 9:
Jag använder kommentarer vid behov. När man inte kan förklara varför denna variabel kan vara -1 eller 0.
Jag använder aldrig långa kommentarer ovanför funktionens namn som beskriver exakt hur funktionen fungerar. Jag förstår ändå inte för jag tycker många skriver kod som är svår att titta på, vad dom har gjort. Till exempelvis så kan det vara en metod inom Java som ska utföra en kort procedur.
Jaha? Men argumenten ser inte ut som vanliga int, float, array[] argument. Det är mycket generics och jag ogillar sådant när det är generics på generics. Jag kan förstå om det handlar om en klass man ska bygga som ska hantera olika datatyper.

Här är en kod som får mig att se ???
https://github.com/optimatika/ojAlgo/blob/develop/src/main/ja...

Alltså kolla denna rad

public class NetworkInvoker extends WrappedANN implements BasicFunction.PlainUnary<Access1D<Double>, MatrixStore<Double>> {

Så den använder arv och interface samt interfacet har en statisk basfunktion med dubbla genericsargument, med dubbla generics. Sådant blir man lite rädd för.

Samma sak här. Jag förstår inte koden.
https://github.com/eclipse/deeplearning4j/blob/master/deeplea...

Troligtvis så är detta riktiga professionella kodare och det är säkert bara den som skrev denna kod, som förstår koden.

Punkt 10:
Jag skriver kod, simulerar och testar. Blir det fel, ändrar jag, simulerar och testar. Hela tiden. Koda, testa, koda, testa.
Tills jag har hittat att möjliga fel, då går jag vidare.

--------------------------------------------------------------------------------
Då är frågan. Hur vet jag att jag programmerar bra?
För jag tror inte programmering handlar om att hitta den mest avancerade lösningen som resulterar minimal och effektiv kod. Jag tror snarare att det handlar om att skriva den pedagogiska koden, oavsett om koden blir rätt bred med många filer. Vad tror ni?

Permalänk
Medlem
Skrivet av heretic16:

Då är frågan. Hur vet jag att jag programmerar bra?
För jag tror inte programmering handlar om att hitta den mest avancerade lösningen som resulterar minimal och effektiv kod. Jag tror snarare att det handlar om att skriva den pedagogiska koden, oavsett om koden blir rätt bred med många filer. Vad tror ni?

Om du kommer tillbaka till koden fem år efter att du senast tittade på den och skall lägga till någon ny funktionalitet - hur svårt är det att göra det?
Om det är enkelt att sätta sig in i koden på nytt och modifiera den så var det antagligen bra skrivet från början. Om det är krångligt så var det nog inte så bra från början.

Alternativt, om du inte har lust att vänta fem år, så låt någon annan jobba med koden och lägga till ny funktionalitet, och ta därefter reda på hur svårt det var.

Bra kod enligt mig är:
Kod som löser det problem den är avsedd att lösa. (Vilket i någon mening borde vara självklart.)
Lätt att läsa och förstå.
Lätt att modifiera.
Lätt att debugga.
Vara tillräckligt effektiv för sitt syfte.

Permalänk
Skrivet av Erik_T:

Om du kommer tillbaka till koden fem år efter att du senast tittade på den och skall lägga till någon ny funktionalitet - hur svårt är det att göra det?

Mycket enkelt. Väldigt enkelt.

Citat:

Alternativt, om du inte har lust att vänta fem år, så låt någon annan jobba med koden och lägga till ny funktionalitet, och ta därefter reda på hur svårt det var.

Nu har jag ett väldigt bra minne, men jag tänkte för en annan som inte har varit med projektet. Hur ska den kunna förstå min kod?

Tror du det är bra att göra något flödeschema? Finns det program som kan göra det åt mig i C++?

Citat:

Bra kod enligt mig är:
Kod som löser det problem den är avsedd att lösa. (Vilket i någon mening borde vara självklart.)
Lätt att läsa och förstå.
Lätt att modifiera.
Lätt att debugga.
Vara tillräckligt effektiv för sitt syfte.

Hur menar du med debugga?
Det är alltid enkelt att sätta in lite printf funktioner eller köra debuggern hos IDE:n.

Permalänk
Inaktiv

Beror helt på syftet. Är det konsultarbete för en kund? Isåfall är en stabil produkt som är enkelt att förvalta, skapad på så kort tid (budget) som möjligt, oftast prioriteringen,

Är det ett högkvalitativt opensource API som man gör på sin fritid? Då är nästan bara teknisk kodkvalitet viktigt. Dessa projekt har ofta _mycket_ högre kodkvalitet än konsultarbeten brukar producera, men det betyder inte att det ena är bättre än det andra, det går inte riktigt jämföra utan att jämföra syftet.

Sen hur man kvantifierar teknisk kodkvalitet är nog en diskussion som är bra mycket större än vad som rimligen kan diskuteras generellt i en forumtråd. Det är i princip en hel vetenskap.

Permalänk
Medlem
Skrivet av heretic16:

Nu har jag ett väldigt bra minne, men jag tänkte för en annan som inte har varit med projektet. Hur ska den kunna förstå min kod?

Genom att läsa koden och dina kommentarer/dokumentation.

Permalänk
Skrivet av anon334363:

Beror helt på syftet. Är det konsultarbete för en kund? Isåfall är en stabil produkt som är enkelt att förvalta, skapad på så kort tid (budget) som möjligt, oftast prioriteringen,

Ja. Men även på fritid.

Citat:

Är det ett högkvalitativt opensource API som man gör på sin fritid? Då är nästan bara teknisk kodkvalitet viktigt. Dessa projekt har ofta _mycket_ högre kodkvalitet än konsultarbeten brukar producera, men det betyder inte att det ena är bättre än det andra, det går inte riktigt jämföra utan att jämföra syftet.

Men är det inte lika bra att skriva hög kod kvalité oavsett projekt?

Permalänk
Skrivet av CymbalCrasher:

Genom att läsa koden och dina kommentarer/dokumentation.

Normalt brukar jag göra flödescheman med kodexempel.
Jag söker fortfarande något verktyg som kan göra en mer detaljerad grafisk struktur av mitt arbete. Typ ett program där man pekar på sin projektmapp och vipps så kommer det fram grafer, tabeller osv som beskriver vad som händer.

Jag har använt mig av Power Point ofta. Men det är vid små projekt.

Permalänk
Medlem
Skrivet av heretic16:

Men är det inte lika bra att skriva hög kod kvalité oavsett projekt?

Naturligtvis - om du kan göra det inom budget och bli klar på utsatt tid.

Permalänk
Skrivet av Erik_T:

Naturligtvis - om du kan göra det inom budget och bli klar på utsatt tid.

Det blir svårt.
När jag skriver egen kod så har jag mycket fokus på pedagogik.
När jag skriver kod till företag så löser jag problemet så snabbt som möjligt, när jag var ny. Idag så lägger jag lite mer fokus på koden. Men det kommer aldrig få lika fin struktur som riktig professionell C kod med korrekt inkluderande headers

Permalänk

Kan anlita en banankastande apa att förstå och justera koden är den perfekt

Visa signatur

ASUS B550-f-Gaming, R9 5800X3D, HyperX 3200Mhz cl16 128Gb ram, rtx 3070ti.
[Lista] De bästa gratisprogrammen för Windows
[Diskussion] De bästa gratisprogrammen för Windows

Permalänk
Medlem

Hur vet jag att jag programmerar bra?
Ett sätt man får bra känsla för det, och desstuom utvecklar sig själv är att jobba i projekt där man reviewar varandras kod. Tycker själv jag har utvecklats mycket av det.

Sen kan ju bra kod betyda olika för olika personer som du är inne på. En aspekt är säkerhet. Kör din kod genom CppCheck och Flawfinder och få en hum kring säkerheten.

Permalänk
Medlem

Har jobbat många år med programmering och skulle säga att jag är en hyfsad programmerare.

Ofta får jag gå in i kod som nån annan har skrivit.

1. Läsbar kod, inga magic numbers. Helst kod så bra skriven att den inte behöver kommentarer, kommentarer för sånt som inte är trivialt.
2. Smart strukturerad kod, med olika lager
3. Kod som inte repeterar sig själv.
Jobbar just nu åt en kund där någon gjort "ifs" med 4 likadana funktioner istället för att göra 4 funktionsanrop från en t.ex. en switch/case = >1000 rader kod. Nu handlar min uppgift inte om att städa koden och detta var i en relaterad fil med det jag jobbar med, men det sticker i ögonen.

Visa signatur

Ryzen 9 5950X, 32GB 3600MHz CL16, SN850 500GB SN750 2TB, B550 ROG, 3090 24 GB
Har haft dessa GPUer: Tseng ET6000, Matrox M3D, 3DFX Voodoo 1-3, nVidia Riva 128, TNT, TNT2, Geforce 256 SDR+DDR, Geforce 2mx, 3, GT 8600m, GTX460 SLI, GTX580, GTX670 SLI, 1080 ti, 2080 ti, 3090 AMD Radeon 9200, 4850 CF, 6950@70, 6870 CF, 7850 CF, R9 390, R9 Nano, Vega 64, RX 6800 XT
Lista beg. priser GPUer ESD for dummies

Permalänk
Medlem

När det funkar och är enkelt för andra att förstå och underhålla.

Permalänk
Medlem

Tydliga namn på variabler, metoder och klasser. Skriv hellre lite för mycket än att döpa en variabel till p.

Metoder är korta, behöver jag scrollar gör den redan för mycket. Det samma gäller om du har flera if satser i en metod.

Detta finns det olika synpunkter på. Men jag föredrar att metoder har en entry och en exit point. Dvs inte return på flera olika ställen i metoden.

Inga super klasser som gör flera olika saker, en klass ska bara göra en sak. Det brukar märkas snabbt om en klass har mer än 100 rader kod.

Koden har tester. Detta fungerar även som dokumentation för nya utvecklare.

Inga direkta beroenden. Vill jag byta ut eller ändra en feature ska inte hela applikationen gå sönder.

Logik är inte kopierad på flera ställen.

Inga hårdkodade namn eller konfigurarionsvärden i klasser. Dessa ska ligga i en settingsfil och kunna styras utifrån.

Flödet i koden ska vara så enkel att förstå att det är som att läsa en bok. Ibland är koden komplex för det är oundvikligt, då ska den vara uppdelad i metoder med tydliga namn om vad som händer.
En publik metod kan ha enklare namn, anropar en publik metod inrernt en privat ska den privata ha ett längre namn. Anropar en privat metod en annan privat metod ska den ha ännu längre namn. För då är man och jobbar på väldigt specifika detaljer i en klass.

Permalänk
Medlem
Skrivet av Erik_T:

Naturligtvis - om du kan göra det inom budget och bli klar på utsatt tid.

Du blir inte klar. Det är någon annan stackare som får den i knät och ska lägga till fler features. Bättre att förhandla om krav än sänka kvalité. Du ber inte en hantverkare skippa isolering för de ska bygga väggen snabbare.

Om du måste ta genvägar för en leverans så se till att du får tid att refaktorera koden innan du går vidare till nästa feature.

Permalänk
Skrivet av zaibuf:

Du blir inte klar. Det är någon annan stackare som får den i knät och ska lägga till fler features. Bättre att förhandla om krav än sänka kvalité. Du ber inte en hantverkare skippa isolering för de ska bygga väggen snabbare.

Om du måste ta genvägar för en leverans så se till att du får tid att refaktorera koden innan du går vidare till nästa feature.

Bra sagt.
Jag har varit med om detta att man får skynda sig att få saker att fungera. Bara för att det är billigare på den korta tiden. I slutändan så slutar det med mycket kletig kod som endast programmeraren själv förstår.

Jag tror det är en oerfarenhet från högre makter.

Permalänk
Medlem

Här är en väldigt bra serie med en känd programmerare.
https://www.youtube.com/watch?v=7EmboKQH8lM

Fick mig (som universitetsstudent i Datavetenskap) att helt ändra hur jag skriver kod.
Mitt tidigare sätt var inte särskilt bra kan jag ju säga.

Handlar mycket om både TDD (Test Driven Development), ALLT skall vara testat, och att hålla metoder korta.
Helst bara några rader - om det går. Allt ska brytas ned så långt det bara går - och programmet skall vara så "decoupled" det bara går. Du skall kunna byta/lägga till funktionalitet senare utan att det påverkar det övriga programmet.

Tydliga namn på både variabler och metoder - typ private boolean addUserToDatabase() {...};
Ganska tydligt vad metoden gör. Nu behöver denna inte en kommentar längre. Kommentarer är saker som behöver underhållas, i många fall glöms dessa bort och blir lögner som gör det svårare för nästa programmerare att förstå vad metoden faktiskt gör.

Mycket av detta verkar du redan ha listat ut på egen hand dock.

edit: The Pragmatic Programmer är även en ganska bra bok!

Visa signatur

10700K | NVIDIA RTX 3080

Permalänk

Läs andras kod på github från erkänt skickliga programmerare eller framgångsrika projekt med bra kod.

För golang t.ex. så är all kod från Hashicorp allmänt känd som bra:
https://github.com/hashicorp

För C# så är det aldrig fel att kolla på Scott Hanselman
https://github.com/shanselman?tab=repositories

Inom JavaScript så gör Matteo Collina bra grejer:
https://github.com/mcollina?tab=repositories