Jag kan ärligt säga att jag inte läst igenom allt här, men tänkte ändå lägga in min åsikt.
Min åsikt i det hela är enkelt: Det beror på vilket språk och sammanhang.
När jag arbetar i high level som Java, C#, VB, Javascript, PHP, Python, Pearl m.f,
så brukar som som regel inte skriva kommentarer.
Undantaget är om jag t.ex gör ett förarbete
eller liknande (API implementationer, algoritmer eller annan lite mer specificerad kod) åt någon annan som är mindre kunnig inom programmering. Dock gäller kommentarerna bara t.ex dom olika stegen i en algoritm eller förklaring på token-generering för API nycklarna (typ: "//Token = AES(tid i ms, api nyckel)" ) m.m.
Är det bara jag som ska arbeta på den, så blir där inga kommentarer (fast //TODO i Java är rätt trevlig under tidiga utvecklingsstadier )
När det kommer till low level så som Assembler och C\C++ så beror på det på storleken på projektet.
Då jag jobbar mycket med AVR och ARM, så blir det, framförallt på ARM processorer, ofta mycket kod och oftast flera personer involverade.
Skriver jag en drivrutin för en extern IC, så kan det vara bra om jag kommenterar vad olika register gör, vilka registerbitar jag sätter vid initieringen och vad dom gör/varför.
Håller på att avsluta ett projekt nu där det varit 5 olika personer inne i skrivit koden innan jag började på företaget i Maj 2017. Det var något av den värsta spagettikoden jag någonsin sett, massor av konstiga klåparhack på felaktigt initierad SPI. Massor av okontrollerade while-loopar (till och med while-loopar i while-loopar) i stil med "while(!txReady)" och när jag frågar var den sätts så får jag svaret "Den sätt av ett avbrott om TXE-flaggan är satt". Detta helt utan hänsyn till CRS.
Skrev till USB bufferten utan att ens kolla i fall där var en öppen anslutning och massor av annat som får en att undra hur det någonsin kunnat fungera.
Och givetvis så hade inget lämnat några kommentarer. Ända som var kommenterat vad massor av gammal test-kod som dom inte förmådde att rensa bort när dom var klar med den.
Givetvis ska man inte kommenterar var varannan rad.
Men en fin fingervisning i stil med: if (USART2->SR & USART2_SR_TC) { //If TC is set (Transmitt complete)
är inte dumt när det kommer till register och liknande (usart är kanske ett dåligt exempel då det är något man kan utantill).
Vissa förespråkar kommentarer i långa if-satser och dylikt, men om du har en så lång if-sats så har du skrivit koden fel. Den bör då ha delats upp i funktioner istället vars namn förklarar vad den gör.
Detsamma gäller långa funktioner, dela upp i mindre.
Vad sen gäller dokumentation så har vi ju arbetssätt vi utgår från.
Så som flödesdiagram/funktionsdiagram för all kod, all mjukvara ligger på SVN på företagets server
och alla ändringar ska beskrivas när man gör en commit. Riskanalyser och andra tråkiga dokument.
Även manualer för hård och mjukvara ska valideras och uppdateras varje vecka om ändringar gjorts, detta går
ju dock snabbt när man vet vad man själv ändrat och var i manualen detta finns.
Ber om ursäkt för det långa inlägget.