Ajuda, quais melhores práticas para desenvolver um determinado software?

Bom dia pessoal,

Estou com um projeto para desenvolver um software para uma Administradora de Cartão Convênio, e gostaria de ter mais ou menos noção de como começar o desenvolvimento, melhores tecnologias para este tipo de software, e para os que tem mais experiência, gostaria de saber se é uma boa eu meter as caras nisso sozinho ou é melhor terceirizar algumas funções do sistema.
Para facilitar as respostas vou falar um pouco do meu conhecimento, e do que vou desenvolver.

Minhas habilidades com Java são intermediárias, tenho certa noção com JSF, Hibernate, Log4J, JSP, RichFaces/PrimeFaces e aquele basicão de Java.
Desenvolvi em Java apenas projetos bem pequenos utilizando algumas dessas tecnologias que comentei, só que nunca me preocupei com segurança, gravar logs, velocidade, disponibilidade e etc…

E uma breve explicação da regra de negócio:

A modalidade de cartão convênio é basicamente um adiantamento de salário aos funcionários em forma de cartão, onde o funcionário recebe um cartão da sua própria empresa, e este tem um limite para compras, compras essas que são efetuadas apenas na rede credenciada ( a rede credenciada é da Administradora de Cartão ) como postos de gasolina, farmácias, mercadinhos etc… E assim o funcionário faz compras durante o mês e ao fim de cada mês ele tem esse valor descontado em folha de pagamento.

Então é isso pessoal, espero não ter sido muito confuso, e conto com a ajuda de vocês.

Grato.

Cara, se esse pergunta pudesse ser respondida com base em apenas um post de fórum, pode ter certeza que não haveria tanta polêmica em torno da engenharia de software …

Da pouca experiência que tenho, a lição mais importante que eu aprendi é que não podemos fazer afirmações ao vento. Veja só, porque você escolheu Java antes de mais nada ? Porque não .NET , Delphi ou qualquer outra coisa ? Enfim, você precisa de critérios objetivos para escolher uma determinada tecnologia (inclusive nível de conhecimento).

O segundo ponto é desenvolver conforme a necessidade. Uma modelagem inicial para entender o processo de negócio, e estabelecer os limites do sistema podem ser úteis. A partir daí você pode montar o ambiente um testes/homologação e ir entregando as funcionalidades aos poucos, de forma que o seu cliente possa guiar o processo. Uma vez que a funcionalidade esteja de acordo com as regras de negócio, você pode montar testes automatizados para medir os requisitos não-funcionais como desempenho, segurança, etc. Por último, coloque as funcionalidades em produção o quanto antes.

Concordo com o rmendes08.

Vc, antes de tudo, deve ter um panorama real daquilo do problema e o que será desenvolvido Para isso faça uso de técnicas de de EngSW, como Requisitos Funcionais e Não Funcionais, Diagramas, Casos de Uso, etc… Escolha também uma metodologia de desenvolvimento, para que vc não perca tempo a toa.

Feito isso, escolha a tecnologia: linguagem, sgbd, frameworks, etc. Vou dizer algo que talvez, mtos não entendam e critiquem: o mundo não é java. Tem mta coisa simples e complexas que se faz com outras linguagens, como .NET, Delphi, e até mesmo Clipper e Cobol. Ainda conheço pessoas que trabalham com essas linguagens mais antigas, e tão ganhando bem. Contudo, se vc está confortável com Java, e o projeto acolhê-la bem, faça com ela.

Conhecido o problema, escolhida a tecnologia, o negócio é sentar e programar.
Uma dica: faça do seu cliente o seu melhor amigo, para que vc não perca tempo desenvolvendo coisas que ele não quer. E defina, antes de tudo, o que o cliente quer, e desenvolva as coisas para ele. Não vá inventar firulas que o cliente não pediu, pq quem vai sair perdendo (em alguns casos) é vc.

Abraços. Boa sorte. Bos estudos. Bons códigos.

Bom fico muito agradecido pelas respostas, mas vou tentar clarear um pouco mais o que eu quero.
Na verdade essa aplicação será minha, no caso sou eu o cliente, por estes motivos eu tentei apenas modelar um diagrama de caso de uso, assim identifiquei os agentes e os casos de uso em si. Estou tentando pular as etapas de documentação do software para agilizar no desenvolvimento.
Respondendo ao amigo Berg.pb, eu sou um desses que programam tecnologias antigas, trabalho com COBOL, Natural/Adabas, DB2 e etc, mas não tenho como desenvolver esse software online em COBOL, por isso o Java, pois já tenho noção de como trabalhar com ele.
Sendo assim, eu nem estou tentando discutir muito quanto a que tipo de linguagem utilizar, e sim quais melhores práticas dentro do java para desenvolver esse software, tipo o que é melhor utilizar para garantir a segurança do software, o que utilizo para persistência de dados, logs do sistema e por aí vai.

patrickbrgs,
Se você é o próprio cliente, então não há problema em ser amigo do cliente! rs.
Talvez nesse caso seja uma boa ideia contratar um analista/programador experiente, que possa ajudar a guiar este projeto. Acho que seria útil para trocar ideias com você, e acho que você além de tudo iria aprender bastante.
Quanto às tecnologias a utilizar, acho que será difícil para qualquer um te indicar sem conhecer bastante a necessidade. Não há uma receita pronta, precisa avaliar vantagens e desvantagens para cada caso.
Espero ter ajudado.

Bom, uma das vantagens do ecossistema Java é que você tem 1 zilhão de frameworks para as mais diversas finalidades e que podem ser combinados em outro zilhão de maneiras diferentes. Sinceramente, eu começaria da maneira mais simples possível, e incluiria um framework somente se absolutamente necessário. Minhas sugestões:

View/Controller:

Como você quer fazer um sistema Web então não há como fugir de algum framework Web, já que fazer na mão com Servlets e JSP é muito improdutivo, se você não tem muito traquejo com HTML + CSS +JS eu sugiro algum framework orientado a componentes, como JSF (Java Server Faces) ou GWT (Google Web Toolkit).

Logs:

Bom, eu penso que o mecanismo de log padrão do Java é uma boa opção para começar, já que ele é simples e bem documentado. Uma segunda opção é usar o slf4j (Simple Logging Facade For Java) que fornece interfaces para fazer logs, assim você pode mudar a implementação do seu mecanismo de log sem precisar alterar as chamadas de log. Enfim, tudo depende da robustez que você pretende.

Segurança:

Bom, segurança é um termo bem amplo. Se por segurança você quer dizer autenticação/autorização, eu te digo que você consegue fazer na mão com Filters.

Persistência:

Bom, aqui você também tem um certo leque de opções. O mais comum é usar algum banco relacional com JPA + Hibernate, você pode usar também JDBC puro, mas é um pouco sofrido. Além disso, vale a pena ler alguma coisa sobre NoSQL para saber se não é o seu caso.

Enfim, como eu disse, para cada um desses problemas existem diversas opções de soluções prontas. Mas nesse mundo nem tudo é de graça, ao mesmo tempo que você economiza no código, você adiciona complexidade na hora de configurar e integrar esssas soluções. Assim, tente manter as coisas o mais simples possível, resolva os problemas quando eles aparecerem. Adicione um framework se realmente for necessário. Infelizmente, essa avaliação só você vai poder fazer.

[quote=patrickbrgs]Bom fico muito agradecido pelas respostas, mas vou tentar clarear um pouco mais o que eu quero.
Na verdade essa aplicação será minha, no caso sou eu o cliente, por estes motivos eu tentei apenas modelar um diagrama de caso de uso, assim identifiquei os agentes e os casos de uso em si. Estou tentando pular as etapas de documentação do software para agilizar no desenvolvimento.
Respondendo ao amigo Berg.pb, eu sou um desses que programam tecnologias antigas, trabalho com COBOL, Natural/Adabas, DB2 e etc, mas não tenho como desenvolver esse software online em COBOL, por isso o Java, pois já tenho noção de como trabalhar com ele.
Sendo assim, eu nem estou tentando discutir muito quanto a que tipo de linguagem utilizar, e sim quais melhores práticas dentro do java para desenvolver esse software, tipo o que é melhor utilizar para garantir a segurança do software, o que utilizo para persistência de dados, logs do sistema e por aí vai.

[/quote]

A primeira coisa é definir a sua arquitetura. Pelos visto já escolheu web. Então comece dai.
A arquitetura web é formada por dois nodos o cliente e o servidor. O cliente é o browser e o servidor é seu.
Poranto já de cara vc precisa sabser como escrever seu cliente e seu servidor.
Se vc usar JSF ou coisa assim , o cliente sai “automaticamente” porque é gerado pelo servidor. Ok, um problema a menos.
Dentro do servidor existem 4 camadas básicas. Apresentação, Dominio, Integração e Recursos.

A apresentação é o codigo que vc escreve com o JSF e companhia.
O Dominio são as entidades, os serviços , os valdiadores, e os repositorios.
A integração é o acesso a arquivos, o acesso a banco de dados e o acesso a outros sistema.
Os recursos são o banco de dados em si, os arquivos em si, e os outros sistema em si.

Então a primeira boa prática que vimos aqui é : Separação Em Camadas.

Depois que vc tem a separação em camadas e consegue identificar onde cada responsabilidade recai, fica mais simples.
Apresentação : gera a UI e prover o fluxo de navegação
Dominio, prover as entidades, suas relações, serviços que se aplicam a elas e repositorios onde as procurar.
Integração . prover acesso aos recursos.

Agora vc escolhe as tecnologias. normalmente vc vai encontrar tecnologia para a apresentação (JSF) para a dominio normalmente usará EJB 3.1 + JPA/HIbernate para a integração, se vc usa JEE nem precisa se preocupar muito.
O banco e os arquivos são o que são. Se vc conectar com outros sistemas, a camada de integração via precisar de serviços que se comuniquem com esses sistemas. isso vc terá que criar vc mesmo.
Toda a “cola” para juntar isto também vc vai ter que fazer sozinho.

Existem padrões de projeto que podem ajudar em cada camada, mas antes de chegar ai vc precisa enxergar o fluxo dos seus dados entre as camadas. normalmente a apresentação requisita um processamento de um serviço ou uma pesquisa em um repositorio, eles executam isso e respondem. Os serviços podem usar outros serviços e repsoitorios. Os repositorios chama a camada de integração para obter os dados do banco ou de arquivos. E básicamente é isto.

A separação em camadas e os design patterns comuns em cada camada lhe dá um design base. O resto vc ter que saber exactamene o que vai fazer. à medida que vc vai para o concreto fica mais fácil de escolher opções. Mas em geral é isto aqui.

Sérgio e Rmendes, muito obrigado pelas respostas, realmente me ajudaram bastante, pelo menos agora tenho um “norte” que posso tentar seguir, e ver no que vai dar.