Algoritmo?
Usamos algoritmos no dia-a-dia geralmente sem perceber, por exemplo em uma receita de bolo, é preciso seguir as instruções para chegar a uma conclusão.
Para que o computador consiga entender, ele precisa de uma linguagem específica, estas linguagens utilizam uma lógica para serem escritas e é aí que entram os algoritmos.
Definição: algoritmo é uma sequência lógica, finita, não ambígua e definida de instruções que devem ser seguidas para resolver um problema ou executar uma tarefa.
Uma linguagem de programação serve como meio de comunicação entre o indivíduo que deseja resolver um determinado problema e o computador.
Característica de uma Linguagem de Programação
Legibilidade: facilidade de ler e escrever programas, Simplicidade: que cada conceito seja simples de aprender e dominar, Expressividade: representação clara e simples de dados e procedimentos a serem executados pelo programa, Ortogonalidade: construções primitivas podem ser combinadas para construir as estruturas de controle de dados, Portabilidade: -multiplataforma: capacidade de um software rodar em diferentes plataformas sem a necessidade de maiores adaptações; -longevidade: possibilidade de usar o mesmo software após ema mudança de hardware. , Confiabilidade: software de acordo com as especificações
● E m resumo
– Legibilidade e facilidade de escrita melhoram
confiabilidade.
– A dificuldade em escrever ou entender o algoritmo
resulta em potenciais erros de programação
Simplicidade X Ortogonalidade
ortogonalidade é fortemente relacionada à simplicidade: quanto mais ortogonal o projeto de uma linguagem, menor é o número necessário de exceções às regras da linguagem. Menos exceções significam um maior grau de regularidade no projeto, o que torna a linguagem mais fácil de aprender, ler e entender.

Histórico ● Inicialmente, a programação de computadores se resumia a Assembly ou algo similar ● Na década de 50, diversas linguagens surgiram, as quais são as ancestrais das linguagens que usamos hoje em dia ● Fortran ● COBOL ● LISP ● Algol 60 Histórico Histórico ● Na década de 80 os projetistas de linguagens passaram a considerar requisitos de mais alto nível, como desempenho, programação em larga escala e estruturas mais inteligentes ● C++ ● Ada ● Eiffel ● Perl Histórico ● Na década de 90 entramos na era da internet, onde as linguagens passam a se importar com conexão à rede, integração com navegadores, etc (preocupações da década anterior ainda persistem) ● Python ● Java ● Haskell ● Ruby ● PHP ● C#



Paradigma? Paradigma é um modelo ou padrão de raciocínio a seguir, seria a maneira como um determinado programador resolve um certo problema, como o programador estrutura e executa este programa.
Os quatro principais paradigmas de programação são: paradigma imperativo, declarativo, funcional e orientado a objetos.

Paradigma Imperativo
“Primeiro faça isso e depois faça aquilo.”
Imperatividade dá a ideia de dar ordens
Baseado em instruções e comandos, o programador diz como e o quê exatamente um programa ou rotina deve realizar. 
Instruções como ifwhileswitch for são típicas de linguagens de programação imperativas.
O fundamento da programação imperativa é o conceito de Máquina de Turing dispositivo teórico (imaginário) conhecido como máquina universal, invenção automática capaz de manipular símbolos em uma fita de acordo com uma série de regras para guardar informação.que nada mais é que uma abstração matemática que corresponde ao conjunto de funções computáveis.
Na Segunda Guerra Mundial, a máquina ENIAC foi desenvolvida, custos de manutenção e implementação eram muito altos. John von Neumman reconheceu que um programa e suas variáveis podem residir na memória principal de um computador. O paradigma imperarivo é criado para da suporte a essa nova arquitetura. Os comandos são executados na ordem que aparecem na memória. C ADA JAVA
Atribuições, Declarações e Expressões
Atribuição: Alterar o valor de um local da memória e destruir o valor anterior.
Declaração de variável: NOME a um local de memória e TIPO a valores armazenados.
Interpretar Expressões

Recuperar valores em um determinado endereço de memória.
linguagens puramente imperativas, como Assembly

Alguns exemplos de linguagens de programação que baseiam-se no modelo imperativo:
Ex: ADA, BASIC, Fortran;Pascal;  Python;  Lua; COBOL, FORTRAN, C, PASCAL …
Máquina de Turingdispositivo teórico (imaginário) conhecido como máquina universal, invenção automática capaz de manipular símbolos em uma fita de acordo com uma série de regras para guardar informação.

https://medium.com/@phinfonet/programa%C3%A7%C3%A3o-funcional-o-que-diabos-%C3%A9-isso-da9f230b9be2

Paradigma funcional
“Subdividir o problema em outras funções e resolver cada uma separadamente, pois os resultados encontrados serão utilizados posteriormente.”
Cada bloco recebe no topo uma entrada de dados e retorna, na base, os dados de saída. A solução geral é dividida em várias funções (daí o nome funcional) que, no final, se associam para mostrar o resultado na tela. As variáveis não variam.

Ex: APL, LISP, HASKELL, F#, ErlangElixirMathematica.

Paradigma lógico

“Oferecer um arcabouço(estrutura) que permita inferir conclusões desejadas, a partir de premissas, representando o conhecimento disponível, de uma forma que seja computacionalmente viável”. 
Faz uso da lógica matemática, a abordagem do paradigma lógico é expressar programas na forma de lógica simbólica(faz uso de símbolos) e usar um processo de inferência lógica (executar uma dedução ou demonstração) para produzir resultados
 Exemplo: Prolog, Mercury;  Oz;  Frill, 

Paradigma Orientado a Objetos
“Um sistema construído usando um método orientado a objetos é aquele cujos componentes são partes encapsuladas de dados e funções, que podem herdar atributos e comportamento de outros componentes da mesma natureza, e cujos componentes comunicam-se entre si por meio de mensagens”.  
Utilizamos uma lógica bem próxima do mundo real, lidando com objetos, Nele, implementa-se um conjunto de classes que definem objetos e nessas classes os comportamentos são chamados de métodos e os estados possíveis da classe são chamados de atributos.
Ex: C#JavaPHPRubyC++Python

Crise do Software de 1970
O termo Crise do Software surgiu para descrever as dificuldades enfrentadas no desenvolvimento de software no fim da década de 60, expressava as dificuldades do desenvolvimento de software frente ao rápido crescimento da demanda por software e da complexidade dos problemas a serem resolvidos, uma vez que a engenharia de software era inexistente,  

O termo expressava as dificuldades enfrentadas no desenvolvimento de software devido ao rápido crescimento da demanda por softwares a complexidade dos problemas a serem resolvidos e a inexistência de técnicas de desenvolvimento, uma vez que a engenharia de software era inexistente.
Com tudo a maior consequência da crise foi o surgimento da engenharia de software o qual visa no desenvolvimento de tecnologias que facilitem e permitam a obtenção de softwares eficientes e baratos, sua importância o fez tornar-se um novo campo de pesquisa na computação.

começaram a falhar
constantemente nos prazos de entrega, apresentando resultados insatisfatórios e além dos orçamentos que ultrapassavam o predeterminado.

As causas da crise do software estão ligadas a complexidade do processo de software e a relativa imaturidade da engenharia de software como profissão. A crise se manifesta de várias formas:
  • Projetos estourando o orçamento;
  • Projetos estourando o prazo;
  • Software de baixa qualidade;
  • Software muitas vezes não satisfaz os requisitos;
  • Projetos ingerenciáveis e código difícil de manter.
A maior parte dos projetos continuam com estes problemas ainda na atualidade, assim pode se dizer que a crise continua vigente ainda na atualidade.[1]
As soluções para a crise de software:


Engenharia de software é uma área da computação voltada à especificação, desenvolvimento e manutenção de sistemas de software, com aplicação de tecnologias e práticas de gerência de projetos e outras disciplinas, visando organização, produtividade e qualidade. estes profissionais projetam e guiam o desenvolvimento de programas, aplicativos e sistemas, de forma que atendam aos requisitos e cumpram as funções determinadas.
Engenharia de software é uma área da computação voltada à especificação, desenvolvimento, manutenção e criação de software
http://protocoloti.blogspot.com/2012/04/paradigmas-de-programacao.html https://pt.slideshare.net/gustavolgcr/paradigmas-de-programao-imperativo-orientado-a-objetos-e-funcional
https://www.profissionaisti.com.br/2010/10/paradigmas-de-programacao/
https://www.infoescola.com/informatica/historia-da-programacao/
https://universidadedatecnologia.com.br/linguagem-de-programacao-criterios/
http://www.linhadecodigo.com.br/artigo/489/linguagem-de-programacao.aspx