Comandos predefinidos ou lógica?

Boa madrugada, pessoal. Eu tenho uma dúvida sobre programação no geral: Vejam bem, eu estou iniciando meus estudos em JS (focado em front end), e recentemente, eu vi um professor falar que aprender JS, ou qualquer outra linguagem é fácil, pois JS possue uma certa quantidade de palavras (acho que algo abaixo de 100), mas que o que importa mesmo é a lógica afiada. A minha dúvida é: Se uma pessoa dominar bem a lógica, já tiver um bom tempo de estudo (aprendeu todas as palavras da linguagem e tals…), essa pessoa conseguiria criar uma aplicação qualquer, do zero, sem olhar nenhum outro exemplo de código (de como se faz tal coisa)? Isso porque, eu vi alguns exemplos de pessoas reproduzindo supermario world, e me veio essa dúvida; Eles estão recriando o jogo do zero, apenas utilizando o que eles já sabem da linguagem ou, simplesmente, eles estão replicando o código de outra pessoa?

Ex: Se eu quiser fazer com que o personagem ande até certo ponto e se o jogador não pular em tal lugar, ele caia numa armadilha oculta… Para criar isso já existe algo predefinido na linguagem, ou vai depender da forma como eu utilizo seus recursos, utilizando a lógica?
Deu pra entender minha dúvida?

2 curtidas

Em tese, sim. Mas, dificilmente vai ser eficiente fazer algo assim, isso porquê não tem necessidade de reinventar a roda. Se eu quiser implementar um código para o personagem se mover até certo ponto, dependendo da linguagem e do seu conhecimento você vai fazer implementações diferentes, se você pedir para duas pessoas desenvolverem um programa para cumprir um objetivo específico, sem especificar como esse programa deve ser feito desde que cumpra o objetivo, duas pessoas farão códigos bem diferentes um do outro.

Apesar de programação ser lógico, existe muita abstração envolvida, e cada ser humano vai interpretar aquela abstração de forma diferente dado o conhecimento de mundo e compreensão de realidade que a pessoa tem.

Provavelmente ambos, não necessariamente replicando o código, mas analisando como outras pessoas resolveram aquele mesmo problema para criar uma solução melhor ou simplesmente implementando essa solução para o código. Programação não é só quebrar a cabeça testando um milhão de possibilidades, a menos que seja para aprendizado e você realmente queira criar uma solução nova para um problema já documentado. Você pode, mas em ambiente de produção acho que ninguém fica resolvendo problemas que já foram resolvidos, a menos que tenha alguma necessidade de criar uma ideia nova para solucionar algo específico dentro desse ambiente. Limitações de hardware por exemplo.

Depende da linguagem, se você tá usando uma engine comercial ou criou uma… Tudo depende do que você tá usando. Recomendo ver esse vídeo que o cara fez um clone de Minecraft usando somente C: https://www.youtube.com/watch?v=4O0_-1NaWnY&t=1s

Nesse caso o trabalho dele com certeza teria sido mais fácil, se ele tivesse usado uma engine de jogos que já tem muita coisa pronta pra usar e adaptar. Ele literalmente não tinha NADA pronto.

É o tipo de coisa que você faz para aprender, por hobby ou até como um estilo de arte para desenvolver programas.

A lógica tá ali pra te auxiliar com as abstrações e saber onde aplicar as ferramentas que a linguagem te oferece. Claro, nem sempre você vai ter tudo que precisa e vai recorrer a bibliotecas, plug-ins, mas não é tudo preto no branco como acho que deu pra entender na minha explicação haha

2 curtidas

Não, primeiro, é preciso entender que o que o seu professor lhe disse tem origem em uma teoria matemática que dentro da Teoria da Computação é conhecida como completude de Turing. Na prática, qualquer linguagem que cumpra as regras dessa teoria é considerada uma linguagem turing-completa. Uma linguagem turing-completa por fim é capaz de resolver qualquer problema computacional que resolvemos em computadores tradicionais.

O problema, como em qualquer teoria, esbarra na praticidade. Eu pessoalmente não acho essas analogias uteis, não dão uma visão completa e realista do assunto, uma noção mais pé no chão.

Seria o mesmo que um professor de física sair dizendo que você pode sair por ai montando mesas cadeiras e computadores, basta ter um balde de átomos.

Ou que você pode esquecer física, química, matemática, filosofia, história, afinal basta saber inglês que você tem acesso a todo o conhecimento do mundo.

Quanto a sua dúvida com relação a jogos

É um bom exemplo. Vamos pensar… Sem bibliotecas e afins, só as “~100 palavrinhas chave”… Não, não dá.

Para começar você não tem acesso a quase nada assim, nada de canvas nem OpenGL nem nenhuma GPU estão ao seu alcance sem bibliotecas e coisas externas, no máximo você pode criar imagens (listas de bytes) e “simular” o jogo rodando na memória, mas como visualizar? Sem mais coisas do lado de algum navegador ou outro programa que possa mostrar pixels na tela, não dá.

Vamos afrouxar um pouco isso, precisamos ao menos apresentar pixels em algum lugar, vamos permitir pelo menos acesso a API do HTMLCanvasElement.

Já é um começo…

Agora você vai ter que escrever sua própria API gráfica do zero, nesse caso é bom ir estudando a fundo, no mínimo, Geometria analítica, Álgebra Linear, estatísticafísica e matemática em geral, pois você vai precisar saber calcular transformações em planos cartesianos, intersecção entre planos, retas, cálculo vetorial, funções de distribuição de probabilidade, etc… Pois é assim que jogos funcionam por baixo de toneladas de abstração. E assim vai…

Por exemplo, seu personagem, é um conjunto de vértices (pontos localizados em um plano cartesiano xyz) conectados entre si (retas) que formam um polígono, 3 vértices bastam para formar uma superfície plano, cor e luz em superfícies são calculados através da análise de ângulos entre vetores imaginários que representam a luz e o angulo da superfície, onde assim podemos calcular uma distribuição de probabilidade para distribuir os valores RBGA na superficie.

através de matrizes você pode fazer cálculos para rotacionar, escalonar transladar, aplicar transformações de perspectiva no personagem e em todo o ambiente do jogo, mover a câmera, etc… Com cálculos de intersecção você pode descobrir se o seu personagem está prestes a atravessar outro objeto, se um tiro atingiu um outro personagem, e assim vai.

No fim com ajuda de projeção cartesiana, convertemos esse mundo 3D em um plano 2D e apresentamos no canvas…

Claro que existe muito mais coisa envolvida, nem toquei em texturas, simulações físicas, IA, caminhos ideais em grafos, etc… mas basicamente essas são algumas das coisas que acontecem quando seu jogo está rodando.

6 curtidas

Entendi. Então o negócio é meter a cara mesmo. É pq eu fico pensando assim: Se um dia eu chegar a “dominar” a linguagem, e tiver que fazer uma aplicação qualquer, sei lá, pode ser qualquer coisa, por mais simples que seja, “será que vou ser capaz de fazê-la sem recorrer a nenhum exemplo?”, uma vez que, terei total conhecimento da linguagem, sabe? É uma coisa louca, eu sei que eu tou começando agora, mas eu fico ansioso pra caramba pensando se daqui a um tempo vou ser capaz de desenvolver algo, fico imaginando, e, ás vezes, até me atrapalha, pois eu perco muito tempo pensando nisso. Mas obrigado pela ajuda. Vou indo devagarzinho.

1 curtida

Saquei. Essa parte da matemática eu sei que é necessário, mas só citei o jogo como um exemplo. Meu foco mesmo é front end com imersão em designer gráfico, amo criar coisas, estilos etc…

Isso, vá no seu ritmo e não tente se tornar um “especialista” em apenas um só assunto, desenvolve um software completo é meio que uma coisa multidisciplinar na computação.

Como você pode ver, o ponto é que os problemas em si a serem resolvidos via programação, por sí só são uma ciência a parte muitas vezes, como você pode observar na minha descrição desses aspectos de computação gráfica.

Por exemplo na sua parte de frontend você vai naturalmente “subir” para coisas como typescript provavelmente, frameworks para frontend (react, Vue, Angular, etc) vai precisar fazer testes automatizados com o tempo, mais frameworks especializados (karma, Jasmine, etc)… conhecer o funcionamento dos navegadores, conhecer tecnologias para produzir software hibrido para mobile se um dia te interessar, saber conversar com várias formas de backend, ter uma boa noção de eventos e operações assincronas (redux, RXJS, promise, observable), bibliotecas HTTP(S), REST, tecnologias de segurança, via bibliotecas para tal que tratam de coisas como oauth, sha1, criptografia, tokens… Vai ser útil saber automatização de ambientes e ai pode entrar terraform, docker, um pouco de bash/python, etc, e afins, para botar testes automatizados no ar, também não exlcui de você aprender coisas como GIT e afins…

Acho que você meio que pegou onde eu quero chegar…

3 curtidas

Seu professor tá certo mas seu raciocínio não, você aprender uma linguagem de programação é diferente de você saber fazer uma aplicação, isso porque uma aplicação qualquer pode ser dividida em duas partes, você tem a camada de apresentação e a camada de lógica, salvo raríssimas exceções a camada de lógica não necessariamente segue padrões, por exemplo:

QPushButton *btn = new QPushButton;
btn->setText("Exemplo");

E

Gtk::Button* btn = new Gtk::Button("Test")
btn->set_label("Exemplo");

Note que a nível linguagem é exatamente a mesma coisa, ou seja, a camada de lógica é exatamente a mesma o que muda é a camada de apresentação, isso vc vai ter que aprender mesmo sendo um mestre da linguagem

Sim,sim. Recentemente eu terminei um curso de TI, com foco redes de computadores, numa empresa aqui da minha cidade, que me ensinou muito sobre esse lance de HTTPS, chaves SSH etc. Até consegui entrar para trabalhar na empresa, mas abdiquei do cargo devido a uns problemas pessoais (e não curto muito redes :grimacing:), mas tenho muito vontade de aprender sobre, adoro criar coisas, e o front-end me encanta muito, gosto muito de desenhar, então… Muito obrigado pelas dicas. Vou seguir nessa batalha pelo conhecimento! :triumph:

1 curtida

Isso ai, esse é o meu ponto, nessa profissão não se pode parar de estudar, é como se exercitar, se você não exagerar, só vai te trazer benefícios. :slight_smile: