A melhor maneira ainda continua sendo a prática, entre em alguns sites de desafios, implemente suas soluções, e tente entende as soluções de outras pessoas, se ver algo que vc nunca vio na sua lang, estudo sobre, e sempre que emplementar algo pense no desempenho, depois na estética do códico. Exemplos

const validName = function(name) {
    if (name.length <= 0 ) {
       return "nome vazio"
    }else if (name.length > 30{
       return "nome longo"
    }else {
       return "nome válido"
    }
}

códico refatorado

const validName = function(name) {
    let name_len = name.length;
    let status = ["nome vazio","nome longo","nome valido"]
    
    return ( name_len == 0 ) ? status[0] : ( name_len >= 30 ) ? status[1] : status[2]
}

Eu tenho pouca experiência com programação, mas uma coisa que vejo em códicos que estudo no github, nas soluções do stackoverflow, é que saber manipular strings, vetores e objetos, é algo muito importante. Então, estude mais sobre essas funções também.

Ótimas dicas, porém no último trecho do código, pode ser que a legibilidade se afete por conta da uso de dois operadores ternários, algo mais legível, creio eu que seria assim:

const validName = function(name) {
    let name_len = name.length;
    let status = ["nome vazio","nome longo","nome valido"]
    
    if (name_len === 0) {
        return status[0];
    }
    
    if (name_len >= 30) {
        return status[1];
    }
    
    return status[2];
}

O código fica mais longo, porém fica mais fácil de entender e até refatorar.