Na minha visão você deve tanto documentar "o que" e o "por que". Claro que o "por que" é muitas vezes mais necessário, mas nem sempre o "o que" é claro de entender apenas olhando o código.

Você pode dizer também que basta limpar o código que o "o que" vai ficar mais claro, mas no mundo real isso nem sempre é viável. Tem certas coisas que se você limpar demais vai deixar menos flexíveis, mais ruins de manter etc.

Tá aqui um exemplo que estava mexendo agora pouco: ele nem diz o "por que", porque nesse contexto é meio óbvio, mas o comentário diz o "o que", porque não é algo fácil de notar instantaneamente.

// NewPeerConn stablishes a TCP connection followed by a BitTorrent handshake.
func NewPeerConn(peer Peer, myHs *Handshake) (*PeerConn, error) {
	conn, err := net.DialTimeout("tcp", peer.Address(), 3*time.Second)
	if err != nil {
		return nil, err
	}

	defer conn.SetDeadline(time.Time{})

	conn.SetDeadline(time.Now().Add(5 * time.Second))
	_, err = conn.Write(myHs.Bytes())
	if err != nil {
		return nil, err
	}

	hsBytes := make([]byte, 68)
	_, err = conn.Read(hsBytes)
	if err != nil {
		return nil, err
	}

	conn.SetDeadline(time.Now().Add(5 * time.Second))
	yourHs, err := HandshakeFrom(hsBytes)
	if err != nil {
		return nil, err
	}

	if yourHs.InfoHash != myHs.InfoHash {
		return nil, fmt.Errorf("infoHash do not match. want: %x, got: %x", myHs.InfoHash, yourHs.InfoHash)
	}

	return &PeerConn{
		buf:  make([]byte, 4096),
		peer: peer,
		conn: conn,
		busy: atomic.Bool{},
	}, nil
}