Skatteverkets JavaScript :D

Skatteverkets JavaScript :D

Vem har sagt att det är tråkigt att deklarera?

Ja öppnade webbläsarens utvecklarverktyg när jag höll på att granska min deklaration och såg följande i konsolen:

I run after the page is ready. DOJO parsed done and ready. fLaggTillMenyLankLyssnare done. einkPageInit done.

”I run after the page is ready.” och ”fLaggTillMenyLankLyssnare done.” fick mig att undra hur JavaScript-koden på sidan egentligen ser ut. Vilken guldgruva!

https://sso.skatteverket.se/ef/ef_webapp/skript/lokal/lokal.js

Gillar du variabelnamn och kommentarer på svenska, utkommenterad gammal debug-kod och snurrig spaghetti så kan jag varm rekommendera att titta igenom ovannämnda skript!

(Tips: Ladda ned filen först och öppna i en texteditor – direkt i webbläsaren blir åäö fel.)

Alltså, vafan sysslar dom med?

**edit **

Denna mening :

// TODO Är det någon mening att iterera över en lista här? Det är ju ändå gjort för att bara vara ett fält, "övriga upplysningar"?

Ja, du kanske ska kolla upp det?

Jag uppskattade speciellt `fIsDirty` nestlade if och flera olika return och loopande beteenden.

Det är den här koden som nybörjade behöver se, vem som helst kan uppenbarligen få jobb med begränsade kunskaper!

Svågerpolitik heter det när man låter sin svåger få utföra jobbet före andra. Men vad heter det när tjänstemän låter deras barn i 10års åldern få jobbet?

Jag förstår inte hur koden kan se ut som den gör. Alltså detta är en samhällskritisk tjänst som ska valideras till den förbannelse. Det är då en eller flera helt externa besiktningsmän på andra företag som ska godkänna jobbet och dessa får precis som kodaren mycket skit om de missar något.

Jobbar faktiskt som systemutvecklare på Skatteverket men inte direkt med skattedeklarationssystemet. Jag vill bara lyfta fram att all kod inte ser ut så här som vi arbetar med Mycket av det jag jobbar med är mycket välskriven och strukturerad. I alla fall personerna i mitt team är otroligt duktiga och passionerade över det de håller på med och vill göra sitt bästa. Det testas ordentligt och jag blir lika förvånad varje gång när jag som programmerare missar något som inte testarna gör. Men det är ganska normalt att skriva variabler och funktioner på svenska (vilket jag stör mig lite på). Kan inte tala för alla systemen. Men som hyfsad nyanställd (och junior) blev jag förvånad hur enkelt jag hade att komma in i ett utav våra system. Försöker inte skydda eller något och det finns mycket som inte är perfekt.

EDIT: Skriver som en kratta på söndagar (med andra ord lite grammatiska rättningar)

Senast redigerat 2020-03-30 17:02

haha humor

Jag gillar denna:

// Anledningar att skippa dirtycheck h?r? Ful l?sning men funkar....

Trodde alltid att man körde något script som rensade och komprimerade koden innan den skickades till webbservern. Just för bandbredd, även om det bara är text är det många användare som laddar den.

Inte programmerare men det ser inte proffsigt ut sett till kommentarerna, mycket lösa boliner som behöver fixas till. Engelska uttryck tycker jag alltid fungerar bättre när man inte ska/får använda åäö. Typ gästnät blir gastnat, och då saknar man bara dödmans kista.

Blev iaf påmind om att deklarera.

Det är mer eller mindre ett krav att svenska ska användas i programkod på statliga myndigheter. Tanken är att korrekta juridiska termer ska användas på alla nivåer, men när man väl kommer till implementation så är ju verkligheten ofta större än juridiken och då blir det lite av en soppa. "okKnapp" är ju inte direkt något som står i lagstiftningen.

Eftersom hela premissen med offentlig upphandling är att den som är billigast får göra jobbet så är det ju inte helt oväntat att resultatet ibland (för det mesta?) blir ruttet.

Skrivet av lillaankan_i_dammen:

Svågerpolitik heter det när man låter sin svåger få utföra jobbet före andra. Men vad heter det när tjänstemän låter deras barn i 10års åldern få jobbet?

Jag tror du överskattar medel-programmeraren. Med risk för att låta elitisk, (för det är jag väl) många som kallar sig programmerare har inget i fältet att göra. Dessvärre vet inte alla arbetsgivare bättre heller, och då betalar de för en undermålig tjänst, och resultaten ser vi här.

Skrivet av jocke92:

Trodde alltid att man körde något script som rensade och komprimerade koden innan den skickades till webbservern. Just för bandbredd, även om det bara är text är det många användare som laddar den.

Inte programmerare men det ser inte proffsigt ut sett till kommentarerna, mycket lösa boliner som behöver fixas till. Engelska uttryck tycker jag alltid fungerar bättre när man inte ska/får använda åäö. Typ gästnät blir gastnat, och då saknar man bara dödmans kista.

Blev iaf påmind om att deklarera.

Precis, man kör en clean/minify/bundling av sina scriptfiler. Kommenterarer ska inte finnas i produktionsmiljö.

Sanningen är att det är ganska vanligt med liknande kod även i produktion.
Men för en så stor tjänst är det inte så optimalt kan man tycka.

Minns quake 3 källkod med kommentaren i stilen
"// This code does dothing as far as i can tell, but unless it runs the following fuction call fail for some reason"

I verkligheten, jämfört med skolan, är det större prio på att sakerna fungerar än att koden är snygg.

Skrivet av Red Beaver:

I verkligheten, jämfört med skolan, är det större prio på att sakerna fungerar än att koden är snygg.

Ful kod som fungerar perfekt behöver man ju inte röra. Tills kraven ändras. Eller tills man ska uppgradera/migrera systemet till en ny lösning. Båda sakerna tenderar att hända förr eller senare.

"Fungerar" bör alltså tolkas som "gör vad den ska enligt kraven (explicita/implicita) och är lätt att förvalta". Om det är uppfyllt är ful/snygg mest en smakfråga. Jag kodar inte JS, men jag tycker inte den där koden verkar vara jättelätt att förvalta.

Skrivet av KAD:

Ful kod som fungerar perfekt behöver man ju inte röra. Tills kraven ändras. Eller tills man ska uppgradera/migrera systemet till en ny lösning. Båda sakerna tenderar att hända förr eller senare.

"Fungerar" bör alltså tolkas som "gör vad den ska enligt kraven (explicita/implicita) och är lätt att förvalta". Om det är uppfyllt är ful/snygg mest en smakfråga. Jag kodar inte JS, men jag tycker inte den där koden verkar vara jättelätt att förvalta.

Det är säkert byggt av en konsultfirma, och om all kod skulle vara perfekt hade det antagligen blivit väldigt dyrt. Det är en balansgång.

Jo det är ju standard mer eller mindre överallt.

Där jag jobbar nu är den bästa kommentaren jag hittat i stil med ”Todo: det här blir fel, men borde fungera kortsiktigt. Måste lösas asap”. Den koden har rullat dagligen i 16 år nu

Skrivet av BasseBaba:

Jo det är ju standard mer eller mindre överallt.

Där jag jobbar nu är den bästa kommentaren jag hittat i stil med ”Todo: det här blir fel, men borde fungera kortsiktigt. Måste lösas asap”. Den koden har rullat dagligen i 16 år nu

Jag har en del kommentarer i dom system jag jobbar med:

"Fixes bug XYZ, remove 2013". Koden ligger kvar, vågar inte ta bort den.

Det här var humor på hög nivå! Var exakt laddas skriptet in? Verkar väldigt skumt att dom inte kört detta i någon transpiler/checker etc för att minifiera koden och ta bort kommentarer osv.

Det är viktigt att man tänker sig för när man gör commits och hur man kommenterar dem, för det kommer synas i release om det står "Merged away from hell" och "Merged back to hell"

Globals, globals everwhere.

Man mår rätt illa. Hoppas de inte betalade för mycket av mina surt förvärvade skattekronor för det där.

Skrivet av Red Beaver:

Det är säkert byggt av en konsultfirma, och om all kod skulle vara perfekt hade det antagligen blivit väldigt dyrt. Det är en balansgång.

Myndigheter är ju kända för att snåla och ställa höga krav, eller hur var det nu...

Ja, man blir ju mörkrädd alltså. Ta bara den här funktionen, som du visade mig allra först, @lydell:

function onlyContainsNumSpace(theVal) { var whiteSpacePattern = /[\s\u00A0]/; if (theVal) { // Fint värde for (var n=0;n<theVal.length;n++) { var theCh = theVal.charAt(n); if ((theCh <= '9' && theCh >= '0') || (n == 0 && theCh == '-') || whiteSpacePattern.test(theCh)) { // Ok.... } else { return false; } } return true; } else { return false; } }

  • Hur är det möjligt att känna till regex och ändå skriva sådan kod?

  • Väldigt satsorienterad kod för ett problem jag uppfattar som uttrycksorienterat.

  • Varför är \u00A0 med i whitespacePattern? /\s/.test("\u00A0") === true. Kanske finns legacyskäl?

  • var? Legacyskäl, får man hoppas.

  • ==? Går väl inte ens att bortförklara med legacyskäl?

  • theCh <= '9' && theCh >= '0'

  • if (condition) { // Ok.... } else { return false; }

Tror att denna kod representerar samma funktion (åtminstone nära nog):

function onlyContainsNumSpaceByAlling(x) { return Boolean(x && (x.length === undefined || /^\-?[\d\s]*$/.test(x))); }

(Den märkliga kontrollen theVal.length === undefined fångar inputs som true, Infinity, -Infinity och {}. Man vet ju aldrig vilken den tänkta definitionsmängden är i JavaScript. Beroende på kravspecen/kontexten går det säkert att skriva en bättre lösning.)

Klicka för mer information

const TEST_CASES = [ null, undefined, true, false, 0, 5, NaN, Infinity, -Infinity, {}, [], "", " ", " ", "\u00a0", " \u00a0", "\u00a0 ", "-", "- ", " -", "5", "59", "5 9", "5 9 ", " 5 9 ", "-5", "-59", "-5 9 ", " -5 9 ", "\u00a06", "6\u00a0", ]; for (const t of TEST_CASES) { const expected = onlyContainsNumSpace(t); const actual = onlyContainsNumSpaceByAlling(t); if (expected !== actual) { console.error(t, "– expected:", expected, ", actual:", actual); } }

Visa mer