[Dúvida] Convenções de codificação Português / Inglês em Instituição Pública Governamental

Olá pessoal, meu primeiro post aqui! o/ Sou dev C#.NET (já fui de Java tb).

Problema: Programar em português ou inglês ? Ou ambos?

Esse assunto é velho, eu sei, eu sei. Mas o que a comunidade TabNews pensa a respeito?

Eu fiz uma pesquisa prévia, e vi um post de 11 meses atras apenas recomendando 100% uso de inglês (o que eu discordo em partes pelo motivo que explicarei abaixo): 8 motivos para programar em ingles.

O post do colega acima afirma que devemos usar inglês pra tudo no código. Mas há exceções, talvez mais do que se imagine. Se você mora no Brasil e trabalha com um domínio de problema especializado/focado demais para o Brasil, você não vai querer programar 100% em inglês.

Discutindo o problema

Eu creio que não dá pra seguir 100% português, nem 100% inglês nesses casos. Na internet há a galera que fala que 50% do código é PT-BR, e 50% é inglês rsrs. Farei algumas considerações abaixo e gostaria de saber a opinião da comunidade:

Alguns pontos que eu acho positivo nomes de classes em Português:

  • Só de bater o olho você saberá que é uma classe feita em casa, e que não pertence a algum framework;
  • Transmite com mais fidelidade a Linguagem Ubiqua do negócio (a menos que seu cliente use realmente em inglês);
  • Seus colegas são brasileiros, e a língua nativa é o Português, facilita o entendimento (sim, o inglês é necessário/obrigatório, mas ainda é a segunda língua, fora que talvez nem todos da equipe tenham o mesmo nível de inglês);

Desvantagens (casos em que misturamos portugues e inglês INEVITAVELMENTE):

  • Termos e padrões técnicos na TI são em inglês. Eu particularmente gosto de MANTER o original. Ex: AlgumaCoisaRepository (padrão Repository), AlgumaClasseDto (Data Transfer Object), AlgumaClasseStream (implementa um Stream), AlgumaClasseService, AlgumaClasseConverter, AlgumaClasseException... etc.
  • Muitos frameworks adotam convenções de nomes. Ex: AlgumaCoisaController (MVC). É mais fácil seguir a convenção do que tentar customizar o framework.

Qual sua opinião ?

Dito isso, e considerando por exemplo, que eu trabalho numa Instituição do Poder Judiciário Brasileiro, pergunto:

  1. Vocês acham confuso ter essa mistura de inglês e português em nomes de classes principalmente (métodos eu costumo escrever em português) ?
  2. No caso de desenvolvimento de biblioteca de classes internas (uma das minhas responsabilidades), o que seria mais fácil absorver/entender para um programador: tudo em inglês, ou misturado pt + eng ?

Exemplos reais para ilustrar o problema

Estou tentando manter alguma consistência na nossa lib interna. Listarei alguns exemplos na versão PT e outra PT+EN:

Exceptions

  • DomainException vs DominioException / BusinessRuleException vs RegraNegocioException
  • ForbiddenAccessException vs AcessoNegadoException

Classes base herdáveis

  • BaseEntity vs EntidadeBase
  • BaseEvent vs EventoBase

Interfaces / abstrações

  • IIdentityService vs IIdentidadeAcessoService (interface para operações com usuários da aplicação) - para galera do .NET, basicamente estou abstraindo o AspNet Identity em métodos, como: ObterPerfisUsuarioAsync(idUsuario) ou Autenticar(login, senha)
  • ILdapAuthenticator vs IAutenticadorLdap

Classes / Implementações padrão para reutilização

  • PaginatedList vs ListaPaginada
  • ValidationBehavior vs ValidacaoBehavior (pipeline behavior do MediatR)
  • AuthorizationBehavior vs AutorizacaoBehavior (pipeline behavior do MediatR)
  • PagingSpecification vs PaginacaoSpecification (padrão Specification)

Olá,

Tendo em vista os exemplos que você deu, eu acredito que todos eles deveriam estar em inglês. Não vejo absolutamente nenhuma razão para usar os nomes em português. Por exemplo:

BaseEntity vs EntidadeBase. Não há vantagem alguma em optar pela versão em português.

PagingSpecification vs PaginacaoSpecification. Neste caso, é ainda pior, porque está misturando dois idiomas em um único nome. Qual é o benefício disso?

Você mencionou no post que uma das vantagens é que o português "Transmite com mais fidelidade a Linguagem Ubíqua do negócio". Concordo plenamente. Por exemplo, se hipoteticamente você tiver uma entidade que represente "processo" no sentido usado no tribunal, este é um exemplo onde faz total sentido usar o nome em português, porque é uma terminologia específica e altamente relevante para o contexto de negócio.

Dos argumentos que você apresentou, o único que vejo como válido é este. Os demais, vejo como desculpas para não abraçar completamente o inglês, que é a língua universal da programação.

Abraços!

Olá, obrigado pela sua contribuição! Entendi, então a única exceção no seu ponto de vista seria a linguagem ubiqua. Como vc nomeia os métodos? Digamos que vc precisa arquivar um processo. Como vc nomeará? ? E os atributos de classe? Segue a linguagem ubiqua né? Digamos, valor da causa processual. Mais uma vez obrigado !

Acho que vai da empresa que tu está. E do time. Eu antes usava Português em todos, até nos cursos, mas sempre achava estranho ver coisas em português com termos em inglês, até eu entrar em uma empresa que o dev é na Índia logo tudo em Inglês, então a 10 anos tudo éinglês até nós meus scripts e projetos pessoais... Nada contra mas acho estranho ver português com inglês em códigos...

Obrigado pela sua resposta. Mas quando o dominio do problema está em inglês não fica estranho criar classes 100% em inglês. Agora, você criaria uma classe, por exemplo, trabalhando num sistema de Tribunal de Justiça **brasileiro**: - LawyerRepository ou AdvogadoRepository ou AdvogadoRepositorio ? Eu costumo usar AdvogadoRepository. Acho complicado traduzir tudo pro inglês quando o domínio é 100% em português. Creio que não existe bala de prata pra nada, nem mesmo pra dizer que devemos programar 100% em inglês em todos os projetos. Isso dependerá exatamente de cada projeto. Talvez para classes de infra ou classes mais genericas, não vejo problema algum 100% ingles, como aquelas últimas que citei no post principal (PaginatedList, PagingSpecification...).

Boa noite Leandro. Geralmente código técnico ou de infraestrutura (componentes GUI de propósito geral, classes e métodos de manipulação de tipos ou que realizam IO...enfim código que não é de regra de negócios, uso inglês sempre. Código de domínio do negócio uso português, mas observando os idiomas e convenções da linguagem (Async, Exception...). Logo nesses pontos acabam o ocorrendo algumas "idiossincrasias" onde português e inglês se encontram, como por exemplo ObterNotasAsync e UsuarioExistenteException. O objetivo de manter a padronização da linguagem acima do uso do português facilita a identificação e uso por outros programadores. Mas acredito que no final acaba valendo o que for definido dentro do time. Não é cada um fazer o seu, mas o time conversar sobre essas convenções e chegar a um acordo. Acredito que um código onde um escreve UsuarioRepository e outro RepositorioDeProdutos seja mais complexo de navegar do que um onde seja convencionado o uso do sufixo Repository mesmo que o termo a que o repositório se refira esteja em português.

No final é sempre sobre otimizar o trabalho da equipe.

Boa noite Adoniram, obrigado pela sua contribuição. Então, no final do dia teremos inevitavelmente parte do código em inglês (classes de infra ou genéricas como vc falou) e parte em português misturado com inglês (para as classes do domínio do negócio). Eu acho q isso faz mt sentido. Valeu !

Português é muito verboso. Trabalhei numa situação parecida e o que eu sempre sugeri é que no código só usar o português trechos referenciar elementos do domínio. Mas acho deselegante um site do governo nacional usar inglês em, por exemplo, nome de rotas e outros elementos que o usuário pode ver. Algo +- assim:

back(estilo javinha da massa) UsuarioDto.setNome() UsuarioRepository.findByNome() UsuarioService /api/usuarios

front /administracao/usuarios

50% 50% é 100% sucesso

Excelente alvis! Obrigado! Isso é exatamente o que eu costumo fazer. Com exceção do seu exemplo em Java, get e findBy (entendo que isso são tradeoffs decorrentes do framework utilizado e reúso de código). Mas eu costumo, quando posso, usar ObterPorNome (em vez de findByNome) e AlterarNome (em vez de setNome). Valeu!!