Permalänk
Citat:

Ursprungligen inskrivet av gosh
Har du rättat någon annans kod någon gång? Om din chef kommer in och säger: "du gunnar är sjuk och en kund måste ha detta klart, kan du göra färdigt det Sebastian". Eller varför inte: "gunnar har slutat och jag har bestämt att du skall ta över det han höll på med".
Om då gunnar INTE skrivit onödig hungarion notation så finns risk för att gunnar inte går säker på stan när du jobbat med koden i någon vecka.

Jag har absolut ingenting emot hungarian notation (såvida det inte handlar om systems hungarian notation [1] där man försöker baka in typinformation i variabelnamn) när det kommer till C/C++ men jag tycker att du överdriver en aning. Linux-kerneln är ett av många exempel som totalt mosar din argumentation om svårigheterna med att ta över andra personers kod i stora kodbaser där man inte använder hungarian notation.

Inte för att vara nedlåtande men har du någon erfarenhet av programmering utanför C/C++ och Win32 världen? Om det blir en träff av här i Göteborg kommer jag garanterat försöka pracka på dig Lisp/Scheme bara för att få höra din reflexmässiga sågning

[1] http://blogs.msdn.com/larryosterman/archive/2004/06/22/162629...

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Jag har absolut ingenting emot hungarian notation (såvida det inte handlar om systems hungarian notation [1] där man försöker baka in typinformation i variabelnamn) när det kommer till C/C++ men jag tycker att du överdriver en aning. Linux-kerneln är ett av många exempel som totalt mosar din argumentation om svårigheterna med att ta över andra personers kod i stora kodbaser där man inte använder hungarian notation.

Det är just det som förvånat mig så mycket, jag skall snart börja arbetet med att porta den applikation jag själv lever på så den går och köra på andra plattformar förutom Windows. Och har tittat på en del lösningar mm. När man då tittar på en del kod från linuxvärlden så fattar man inte hur de tänker.

Att linuxkerneln (har inte tittat på den) ser kör annan stil har jag förståelse för. Antagligen (gissar nu) beror det på att den började byggas för länge sedan, alla som jobbat med programmerare som hållt på ett tag vet vilka betongrumpor de kan vara. Att få en programmerare och ändra sig när den kodat på ett sätt i 10 år är i princip omöjligt. Möjligen är det också därför som koden i linuxvärlden ser ut som den gör eftersom många(?) utgår från linuxkernelns kod.

Det är lätt och testa detta annars, det är bara och göra lite en del kod och så visar man den med några buggar i och så ser man vem som hittar buggarna först.

En teori jag har är att linuxvärlden hatar microsoft världen, för microsoft brukar använda sig av hungarian notation. Hatet gör att man inte är beredd och använda sig av något som ens värsta motståndare gör.

Den absolut värsta funktionen jag sett är en funktion på lite drygt 5000 rader kod. Det var en slags selekteringshantering i C, att rätta någon bugg i den funktionen var kanske som förståeligt ett helvete. Hade funktionen varit skriven i C++ så hade det förmodligen varit omöjligt. C-kod är ju mycket enkel och läsa (som att läsa en bok och man behöver inte hoppa omkring), de hade även använt hungarian notation där för annars hade det varit omöjligt och hantera den i C med.

Vart laddar man kod från linuxkerneln?

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gosh
Om då gunnar INTE skrivit onödig hungarion notation så finns risk för att gunnar inte går säker på stan när du jobbat med koden i någon vecka.

Den uppfattning jag har fått från de flesta forum jag håller till på, exempelvis SweClockers och GameDev, är att de flesta av de som kan mycket inte gillar hungarian notation. Så din åsikt om att hungarian notation "behövs" gäller inte för alla. Det finns självfallet många som föredrar hungarian notation, men det finns även många som klarar sig lika bra eller bättre utan.

Edit:

Citat:

Ursprungligen inskrivet av gosh
Vart laddar man kod från linuxkerneln?

http://kernel.org/

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gosh

*host*
Har du rättat någon annans kod någon gång? Om din chef kommer in och säger: "du gunnar är sjuk och en kund måste ha detta klart, kan du göra färdigt det Sebastian". Eller varför inte: "gunnar har slutat och jag har bestämt att du skall ta över det han höll på med".
Om då gunnar INTE skrivit onödig hungarion notation så finns risk för att gunnar inte går säker på stan när du jobbat med koden i någon vecka.

Jag jobbade i två år som underhållsprogrammerare på ett relativt stort (>20 000 rader) projekt, kass dokumentation var det som slog mig som det största problemet. Som t.ex. att hela metoder saknades trots att de fanns dokumenterade i API-dokumentationen. Ingen mängd ungersk notation hade ändrat på det, inte ens om man hade använt den korrekta formen (apps hungarian).

"Bra variabelnamn" och "systems hungarian" skär sig som salt i saften.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av lajnold
Den uppfattning jag har fått från de flesta forum jag håller till på, exempelvis SweClockers och GameDev, är att de flesta av de som kan mycket inte gillar hungarian notation. Så din åsikt om att hungarian notation "behövs" gäller inte för alla. Det finns självfallet många som föredrar hungarian notation, men det finns även många som klarar sig lika bra eller bättre utan.

Det är inte helt ologiskt, hungarian notation är ett sätt och skriva kod anpassat efter datorns värld. Om man inte är van och tänka som datorn "tänker" så tänker man mer som vi i vår verkliga värld tänker. Har man även använt mer abstrakta språk där variabler kan vara lite vad som helst så minskar betydelsen.

Det är försvinnande få programmerare med som faktiskt suttit och utvecklat större system från början till slut, har man inte det så vet man heller inte vilka problem som dyker upp.

Det brukar även vara svårt och lyssna på personer som faktiskt varit med, man tror man kan så jävla bra bara för att man lyckats sno ihop något.

Citat:

Ursprungligen inskrivet av lajnold
Jag jobbade i två år som underhållsprogrammerare på ett relativt stort (>20 000 rader) projekt, kass dokumentation var det som slog mig som det största problemet. Som t.ex. att hela metoder saknades trots att de fanns dokumenterade i API-dokumentationen. Ingen mängd ungersk notation hade ändrat på det, inte ens om man hade använt den korrekta formen (apps hungarian).

"Bra variabelnamn" och "systems hungarian" skär sig som salt i saften.

Om man inte har disiplin i teamet så kan det säkert vara smidigt och låta bli hungarian notation för en felaktigt benämnd variabel är inte bra, och givetvis kan inte ett dåligt skrivet program räddas av hungarian notation.
Det finns ju programmerare som kanske fått kicken och döper saker som

int asshole;

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Alla exempel såhär långt är lååångt ifrån mathematica:
http://pici.se/73244/
Blir ju så mkt trevligare när man har 2 dimensioner och specialtecken att leka med

Dock är jag absolut ingen mathematica-expert, så jag kanske missat ngt som gör att man kan slippa Which-satsen som grötar ner det lite. Vet inte riktigt vad som händer med undefined heller, men i det här begränsade fallet funkar det.

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Edit: Utmaning

Skriv en modul för Needleman-Wunsch algoritmen implementerd enligt specifikationen på Wikipedia [1]. Eftersom det existerar tonvis med kod på nätet som implementerar algoritmen ligger utmaningen i skriva så självdokumenterande och läsbar kod som möjligt i valfritt programmeringsspråk.

[1] http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm

Har funderat lite på det här men inte hittat någon riktigt läslig lösning än. Slängde ihop nått i Python som tar lite mer minne men inte är lika grötig som referensen på Wikipedia:

matrix = {} matrix['A', 'A'] = 10 matrix['A', 'G'] = -1 ... def needleman_wunsch(A, B, matrix, gap): score = {} solution_A = {} solution_B = {} Al, Bl = len(A), len(B) for i in range(Al): score[i, 0] = i * gap solution_A[i, 0] = '' solution_B[i, 0] = '' for j in range(Bl): score[0, j] = j * gap solution_A[0, j] = '' solution_B[0, j] = '' for i in range(1, Al): for j in range(1, Bl): s1 = score[i-1, j-1] + matrix[A[i-1], B[j-1]] s2 = score[i-1, j] + gap s3 = score[i, j-1] + gap if max(s1, s2, s3) == s1: score[i, j] = s1 solution_A[i, j] = solution_A[i-1, j-1] + A[i-1] solution_B[i, j] = solution_B[i-1, j-1] + B[j-1] elif max(s1, s2, s3) == s2: score[i, j] = s2 solution_A[i, j] = solution_A[i-1, j] + A[i-1] solution_B[i, j] = solution_B[i-1, j] + '-' else: score[i, j] = s3 solution_A[i, j] = solution_A[i, j-1] + '-' solution_B[i, j] = solution_B[i, j-1] + B[j-1] return solution_A[Al-1, Bl-1], solution_B[Al-1, Bl-1]

Prestanda kan förbättras genom att inte använda dict, men det blir lite svårläsligare.

Obs! Koden ovan löser bara problemet delvis, se nedan

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk

Tydligt, Psionicist! En smärre bugg verkar ha smugit sig in dock. När lösningen börjar med "gaps" så försvinner dessa.

Exempelvis AACTCAAGGCATA och GGCAATATCTCGCATAA blir till: AAC-TCAAGGCAT- AATATCTC-GCATA istället för: ---AAC-TCAAGGCAT-A GGCAATATCTC-GCATAA

Jag knåpade ihop en annan Python-lösning på Needleman-Wunsch. Jag kan inte kalla den särskilt lättläst, vilket ju var poängen med utmaningen, men i och med att den är såpass annorlunda än Psionicists implementation så lägger jag upp den i alla fall.

def needleman_wunsch(s1, s2, S, gap): def _fill_best_values(i, j, mem={}): if not mem.has_key((i, j)): if not i: mem[i, j] = j * gap trail[i, j] = 'left' elif not j: mem[i, j] = i * gap trail[i, j] = 'up' else: c1 = _fill_best_values(i-1, j-1) + S[s1[i-1] + s2[j-1]] c2 = _fill_best_values(i, j-1) + gap c3 = _fill_best_values(i-1, j) + gap mem[i, j] = max(c1, c2, c3) if mem[i, j] == c1: trail[i, j] = 'diag' elif mem[i, j] == c2: trail[i, j] = 'left' else: trail[i, j] = 'up' return mem[i, j] trail = {} i = len(s1) j = len(s2) print 'Score:', _fill_best_values(i, j) res1 = '' res2 = '' while i > 0 or j > 0: direction = trail[i, j] if direction == 'diag': i -= 1 j -= 1 res1 = s1[i] + res1 res2 = s2[j] + res2 elif direction == 'left': j -= 1 res1 = '-' + res1 res2 = s2[j] + res2 else: i -= 1 res1 = s1[i] + res1 res2 = '-' + res2 print res1 print res2 S = {'AA': 10, 'AG': -1, 'AC': -3, 'AT': -4, 'GA': -1, 'GG': 7, 'GC': -5, 'GT': -3, 'CA': -3, 'CG': -5, 'CC': 9, 'CT': 0, 'TA': -4, 'TG': -3, 'TC': 0, 'TT': 8} gap = -5 s1 = 'AACTCAAGGCATA' s2 = 'GGCAATATCTCGCATAA' needleman_wunsch(s1, s2, S, gap)

Lösningen är rekursiv med memoisation, vilket på sätt och vis dödar den praktiska tillämpningen eftersom Python-interpretatorn sätter en övre gräns på rekursionsdjupet. Bah!

Permalänk
Glömsk

HerrEkberg: Min första lösning såg ut nästan precis sådär (sparade "trailen"), tills jag upptäckte att rätt textsträngar kan byggas direkt, genom att appenda rätt tecken i slutet istället för början. Då slapp man hela AlignmentA <- ""-blocket från Wikipedia.

Buggen känner jag till. Det där fixas av de sista två whilelooparna i referenskoden. Det är ju dock ohyggligt lite arbete att fixa detta, måste kolla
| length(A) - length(B) |
positioner som max så jag struntade i detta till förmån för det svårare arbetet att partionera strängarna, vilket är huvudproblemet med att förstå algoritmen, eller alla DP-problem för den delen.

Testa förresten memoized-decoratorn på _fill_best_values! Kan nog bli snyggt: http://wiki.python.org/moin/PythonDecoratorLibrary#head-11870...

Edit: Hoppsan, problemet är allvarliga än så. Missade helt

while (i > 0) { AlignmentA <- A(i-1) + AlignmentA AlignmentB <- "-" + AlignmentB i <- i - 1 } while (j > 0) { AlignmentA <- "-" + AlignmentA AlignmentB <- B(j-1) + AlignmentB j <- j - 1 }

Ska fundera på om koden kan lagas utan att spara trailen.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk

Psionicist: Memoized-dekoratorn var trevlig, jag har knappt använt mig av dekoratorer innan, men det verkar finnas anledning att börja. Koden vart mycket tydligare.

Jag hoppas att du inte misstycker, men jag jagade ut buggarna ur din kod. Det handlade om två problem:

1. solution_X[i, j] där i eller j är 0 blir inte '' utan motsvaras ju av ett antal tecken från den ena strängen och samma mängd "gaps" från den andra.

2. Eftersom solution_X[1, 1] gäller lösningen för de två första tecknen så måste lösningen för alla vara solution_X[len(A), len(B)], som det var tidigare hoppades det sista tecknet över.

def needleman_wunsch(A, B, matrix, gap): score = {} solution_A = {} solution_B = {} Al, Bl = len(A), len(B) solution_A[0, 0] = '' solution_B[0, 0] = '' score[0, 0] = 0 for i in range(1, Al+1): score[i, 0] = i * gap solution_A[i, 0] = solution_A[i-1, 0] + A[i-1] solution_B[i, 0] = '-' * i for j in range(1, Bl+1): score[0, j] = j * gap solution_A[0, j] = '-' * j solution_B[0, j] = solution_B[0, j-1] + B[j-1] for i in range(1, Al+1): for j in range(1, Bl+1): s1 = score[i-1, j-1] + matrix[A[i-1], B[j-1]] s2 = score[i-1, j] + gap s3 = score[i, j-1] + gap if max(s1, s2, s3) == s1: score[i, j] = s1 solution_A[i, j] = solution_A[i-1, j-1] + A[i-1] solution_B[i, j] = solution_B[i-1, j-1] + B[j-1] elif max(s1, s2, s3) == s2: score[i, j] = s2 solution_A[i, j] = solution_A[i-1, j] + A[i-1] solution_B[i, j] = solution_B[i-1, j] + '-' else: score[i, j] = s3 solution_A[i, j] = solution_A[i, j-1] + '-' solution_B[i, j] = solution_B[i, j-1] + B[j-1] return solution_A[Al, Bl], solution_B[Al, Bl]

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jdv
Om vi ändå är inne och diskuterar alternativa språk skulle jag vilja slå ett slag för Io (http://iolanguage.com). Ett relativt minimalt språk med en rätt ren syntax (även om det kan ta tid för folk att fatta den =).

För lite exempel på kod jag skrivit i Io, se
http://joel.devahl.com/darcs/DeMong/main.io
http://joel.devahl.com/darcs/DeMong/ImGUI.io

Trevligt språk, känns nästan som att skaparna har tänkt på mig när de gjort det

Visa signatur

Plan9 fan. In glenda we trust.

Permalänk

Grymt bra lösningar!

Måste säga att Psionicists lösning (med HerrEkbergs buggfixar) antagligen är så nära exekverbar pseudokod man kan komma.

Men en viktig del av utmaningen kvarstår, är koden självdokumenterade? Låt oss säga att algoritmen utvecklades från scratch som en del i ett projekt, hur skulle ni gå tillväga i en sådan situation? Separat dokumentation? Kommentarer? Separat pseudokod?

Psionicist kod går ju att översätta till valfritt programmeringsspråk så nu handlar det bara om att strukturera upplägget och visa vad man själv tycker är tydlig och "bra" kod.

(Notera att jag på inget sätt försöker antyda att det finns ett "rätt" sätt att koda utan det handlar om att försöka utveckla en relativt abstrakt och innehållsfattig diskussion.)