[AJUDA] Qual seria a melhor linguagem?
Olá, pessoal! Bom, eu e meu amigo (ambos sem muita experiência no ramo da programação) fomos desafiados por um dono de uma empresa de turismo para a criação de um software em que suportasse todas essa exigências abaixo:
Criação de um software para a gerência de uma empresa de turismo. Aonde o funcionário possa cadastrar o cliente, para ter no sistema dados como serviços receptivos, translado de chegada e de saída, transferência de hotel, passeios turísticos, datas, voos, hotel em que a pessoa está hospedado, tipo de serviço (regular ou privativo), precisa gerar ordem de serviço de chegada/saída, gerar uma planilha de serviço do dia pra escalar o carro que vai ser usado...
Gostaria de conselhos para a execução desse serviço, como por exemplo: qual linguagem mais viável para usar no desenvolvimento desse software, dado que é uma empresa de médio porte.
Obs: Eu comecei a estudar python, e esse meu amigo começou a ver Java, porém um conhecido nos deu uma dica para estudarmos C# para o desenvolvimento desse software. Obs²: Temos até final de 2023 para entregar o projeto. Obs³: Navegador/Aplicativo para desktop
A escolha das tecnologias que serão utilizadas vai depender muito dos requisitos e restrições do negócio.
Faça o levantamento de requisitos e separe os requisitos funcionais e os não funcionais.
Estes requisitos funcionais, são os requisitos de negócio.
Os requisitos não funcionais, são os requisitos técnicos.
Com base nos requisitos técnicos, você consegue tomar a decisão de quais tecnologias utilizar.
Mas entenda que a escolha de linguagem de programação é uma escolha baseada em conhecimento da mesma, não adianta eu indicar para vocês utilizarem Python, se o time só conhece Rust... é necessário ter bom entendimento do tema.
Também pode ser utilizado como pontos de decisão a performance, segurança, tempo de desenvolvimento, legibilidade... enfim, assuntos que precisam ser respondidos antes e aí você terá a melhor decisão para o momento.
Lembre-se também, que independente da linguagem de programação escolhida, você terá que lidar com atualizações ao longo dos anos e também lidará com as dívidas técnicas que podem se formar.
Nenhuma tecnologia é imune a desgates decorrentes do tempo.
Escolha também qual será seu foco inicial: Se for web, talvez criar uma página web não seja o suficiente para as necessidades que você terá, logo seria interessante também trabalhar com Web Apps ou algum PaaS ou SaaS para atender a todas as demandas que acontecerão.
Tem que ser linguagem de programação mesmo? Não poderia ser soluções No Code/Low Code? Existem diversas soluções nessa linha que poderiam acelerar a entrega de vocês nesses quesitos que especifiquei acima.
Quem serão os responsáveis pelos vários ends? Front-end, Back-end, Cloud-end, Data-end, etc? Fique ligado nisso também, para não sobrecarregar a equipe transformando cada membro em EUquipe e obrigando-os a serem fullstacks (não que seja ruim, mas será muito ruim se o retorno financeiro não acompanhar e o retorno em qualidade também!).
Qual será a metodologia utilizada? Waterfall, Ágil, etc? Essa escolha afeta diretamente nas entregas, nas estimativas, nos custos, nas decisões a serem tomadas.
Já ouviu falar do conceito Mobile-First? É a ideia de começar um projeto pensando primeiro no Mobile, entregando as funcionalidades para ele e resolvendo todos os requisitos e restrições para o mobile e já que seu projeto é mobile, pensa nisso direitinho.
Detalhe importante sobre as linguagens de programação:
- JS está atingindo um nível de omnipresença absurdamente alto. Está presente no Browser (React, VueJS, Angular2), Desktop (Electron), Mobile Android e IOS (Reactive Native) e Back-end (NodeJS, DenoJS).
- Dart também tem esse nível alto, mas ainda está amadurecendo em algumas pontas. Dart está no Browser, Mobile (Android, IOS) e Desktop com o Flutter e Back-end com o Dart.
- Python está nesse nível de forma robusta no Browser (Django, Flask), evoluindo em estágio avançado já no Mobile Android e IOS e Desktop (Kivy, BeWare, PyQT) e é uma linguagem muito poderosa para o Back-end, que está se tornando cada vez mais performatica (as últimas atualizações trouxeram ganhos) e segura. Tem a vantagem também de ser uma ferramenta muito utilizada por cientistas de dados e para Machine Learning. Enfim, Python tem suas vantagens e desvantagens.
- C# e .NET tem todas essas vantagens e é uma linguagem muito utilizada para criação de jogos também. Então é possível utilizar no Browser, Mobile, Desktop, Back-end, IoT, enfim, é uma linguagem bem versátil.
- Java é a linguagem mais comum e muitos serviços e sistemas que conheçemos hoje no mundo. Java está no Mobile (Android), Browser, Desktop, Back-end, IoT, enfim, java está em tudo!
Escolher java ou C# para seu projeto, é uma escolha segura de que lidará com linguagens que já atuaram em diversas áreas e visões e não falharam ou as suas falhas já são conhecidas e controladas (algumas nem tanto rsrs).
Mas, escolher JS, Python ou Dart é uma escolha mais "moderna" pelo fato de existirem tantos frameworks que alavancam o uso da linguagem e essas linguagens trazerem o que há de melhor das linguagens mais utilizadas. Não seria má escolha ter Javascript no core do projeto hoje em dia.
Porém, ainda existem diversas outras linguagens como Lua, Elixir, Perl, Ruby, Rust, PHP, Golang, Zig, V, C++, C só para citar alguns exemplos de que podem ser perfeitamente melhores em determinada situação ou em todas as situações e que realmente pode combinar com seu propósito e projeto.
Deixo aqui uma imagem não para escolher uma linguagem para projeto, mas escolher uma linguagem para aprender.
Obs.: Não estou sendo generalista, pois não conheço profundamente cada linguagem, mas com base na minha experiência na escolha de tecnologias, sei que sempre existirão características em cada uma delas que será fator decisivo de escolha e uso da tecnologia.
Obs 2.: Não existe tomar a melhor decisão definitiva para uma tecnologia, pois sempre irá nascer uma tecnologia melhor logo logo, mas existe tomar a melhor decisão pautada em fundamentos e os fundamentos dificilmente mudam, vá por eles que é sucessinho puro!
Qual for a linguagem que decidirem aprender se preocupem em aprender também sobre testes unitários. Testes unitários irão fazer com que vocês comecem a utilizar boas práticas de programação, como por exemplo uma função/método/classe ter apenas uma única responsabilidade. Aprender a utilizar testes irá fazer com que tenham menos bugs nos seus códigos, principalmente se decidirem ir em um caminho utilizando uma linguagem dinâmica.
E só reforçando um ponto que já apareceu em uma resposta anterior: Tentem realmente trabalhar com entregas funcionais pequenas, dessa forma o cliente já irá utilizar a solução encontrar problemas e sugerir melhorias.
Tenham bons estudos e bom trabalho!
Conselho: Não comece um projeto pensando na linguagem de programação
A linguagem não importa agora
A linguagem em si não faz muita diferença, todas as linguagens modernas podem atender esses requisitos tranquilamente: JS/TS (com node), PHP, Ruby, Python, Java, C#, Rust... escolha que estiver melhor familiarizado e siga em frente.
Dessa forma o problema não é a linguagem, mas sim outras coisas que você precisa se preocupar antes mesmo de escrever a primeira linha de código:
- Escopo do projeto
- Regras de negócio
- Arquitetura
Como você é iniciante, vou dar uma resumida nos pontos, mas é importante que você procure mais informações a respeito
Escopo do projeto
Junto ao solicitante, vocês precisam definir algumas coisas:
- O que é esperado, por exemplo: o que vai ter na área de cliente, na área de administração, se vai haver envios de mensagens (e-mail, SMS, whatsapp, ...). Isto tem que estar o mais claro possível
- O que NÃO é esperado, por exemplo: que o sistema irá fazer a reserva sozinho no site da booking.com, este tipo de coisa é importante para que o cliente não crie expectativas além do que foi combinado. Isso é mais importante do que o item anterior.
- Datas, em um sistema grande como esse é importante definir as data aproximadas das entregas, ou seja, até que dia para os usuários conseguirem cadastrar clientes, até que dia para cadastrar os passeios... Isso é importante para não entregar tudo de uma só vez e o cliente dizer que não é aquilo que espera, com entregas pequenas e frequentes vocês vão aproveitando o feedback e corrigindo o curso do desenvolvimento quando necessário
Regras de negócio
Com base no escopo, é necessário ter clareza das regras de negócio, por exemplo:
- No cadastro do cliente é necessário validar o CPF?
- A quantidade de datas disponíveis no agendamento será configurável?
- Quem tem acesso as configurações do sistema? Essa etapa costuma ser bem chatinha, é uma coisa que será revista constantemente, é normal em cada entrega você descobrir novas regras de negócio que seu cliente não te apresentou antes.
Arquitetura
Em relação ao programa propriamente dito, essa é a parte mais complexa de todo o sistema.
- Como serão as camadas da aplicação
- Se serão utilizadas técnicas como Clean Architecture, Ports and Adapters, CQRS, o bom e velho MVC, tudo isso junto...
- O banco de dados que será utilizado
- Qual estratégia de filas
- Autenticação e autorização
- Caching
- Onde esse projeto será hospedado
Tudo isso que eu disse independe de linguagem de programação, na verdade você pode dividir a aplicação e partes dela serem escritas em diversas linguagens.
De uma olhada na plataforma do Bubble.io link abaixo https://bubble.io/home
tem varios tutoriais no YouTube
[POSTERTOP]
Salvei por que aqui é de qualidade
A linguagem, tem que ser a que você domina e com a qual conseguirá colocar em produção. Veja qual dos dois tem maior domínio sobre a stack que domina e toque o projeto. Sendo que também, se adotar a utilização de micro serviços, cada um pode codar partes da aplicação utilizando a linguagem que domina.
Vocês pretendem fazer este software sobe demanda especificamente para ele?
No lugar de vocês faria um SAAS (foi o que fiz, mas o meu é para delivery de comida).
Faria esse software (multi tenancy) baseado no modelo de negócio dele e depois começaria a oferecer o acesso para outras empresas do segmento.
Para cada cliente que fechar, você cobra uma assinatura mensal.
Bem... você ta focando em python e seu amigo em java, você pode usar python para criar o back-end da aplicação e seu amigo pode usar o java para desenvolver o aplicativo ( caso for especificamente para android, se não recomendo flutter ou react-native ).
Ou seja minha recomendação foque no que você e seu amigo já está focando, pois com isso já da para criar essa aplicação para android.
Cara muita coisa vai variar, onde pretende aplicar o software? no proprio navegador para os funcionarios acessarem de qualquer computador/celular, pois baseado no que informou acredito que seria o intuito ou apenas um aplicativo para celular?
Cara, a linguagem em si não é importante quando se esta definindo um projeto, a arquitetura sim, porém, quando você escolhe uma linguagem o "ecossistema" dela vem junto, ou seja, escolher uma linguagem que tenha bons frameworks/libs impacta diretamente a sua arquitetura.
Pelo que entendi você é iniciante, e além disso tem um time de 2 para fazer o projeto, então você precisa definir uma arquitetura que foque em eficiência, e ao meu ver só tem uma linguagem que cumpre isso de forma exímia, o TypeScript, isso por que você tem excelentes frameworks tanto para o front-end quanto para o back-end.
Sugestão: VueJS + Electron para o front-end, AdonisJS para o back-end e PostgreSQL como BD. Essa stack vai ter permitir fazer um MVP muito rápido e é super escalável, então se o projeto começar a crescer você não vai precisar refazer nada.
Se você quiser utilizar uma arquitetura "mais ampla", que já prevê coisas como aplicativos nativos para mobile, WebSockets e um painel de controle visual super poderoso, tenho uma segunda sugestão que é mais complexa, mas também leva a eficiência de desenvolvimento como fator principal.
Segunda sugestão: Flutter para o front-end, Hasura + Serverless Framework para o back-end e PostgreSQL como BD.
E um ponto super importante, precisa que seu software faça "coisa x" e já existe um serviço que ofereça isso? UTILIZE! Envio de e-mails e autenticação são ótimos exemplos, não gaste tempo fazendo coisas que já estão prontas para uso, a maioria dos serviços tem planos gratuitos generesos, e mesmo se você precisar pagar depois, ainda assim é barato.
Back-end
Já que seu amigo está estudando Java, recomendo utilizar o Spring para a criação da sua api back-end. Se quiser persistir no Python, vá de Django.
Front-end
Para o front recomendo utilizar ReactJS, você deve estudar Javascript puro, CSS e HTML para ter uma noção básica. Porém, utilizando uma biblioteca que já tenha um design system pronto, como ant-design, bootstrap, semantic-ui, material-ui, o CSS/HTML se torna 90% desnecessário implementar do zero.
Mobile
Para a aplicação mobile você poderia ir de ReactNative, já que está na sua stack de estudos, porém recomendo Flutter por ser uma delícia.
Eu recomendaria aprender JS/TS, usando React no Front, Backend com Node.js e mobile com React Native.
Vocês estudarão uma linguagem e vai resolver os três problemas. Alem disso os dois conseguiriam ajudar um ao outro nas tarefas, e não vai ficar boiando no que o colega tá fazendo.
Além disso tem uma comunidade enorme, com muito conteúdo e tutoriais que vão salvar vocês no dia a dia...
E primeiramente focar naquilo que o user1 comentou, sobre o levantamento de requisitos