O curso "Linguagens de programação da Web" (baseado em Ruby) do MSTU. N.E. Bauman no canal Technostream



Neste artigo, falaremos sobre o curso "Linguagens de programação da Web" , ministrado no Departamento de "Sistemas e redes de computadores" (IU-6) MSTU. N.E. Bauman. Exemplos são dados no Ruby, e o próprio curso inclui 16 aulas em vídeo disponíveis gratuitamente no canal Technostream . Na Baumanka, o curso é ministrado para alunos do segundo ano que já estão familiarizados com linguagens de programação de alto nível, como Pascal, C ++ ou Java. A ênfase principal está no entendimento sistemático das tecnologias usadas na programação da Web, e não na profundidade do desenvolvimento das tecnologias Ruby. Portanto, o curso também será útil para estudantes que possuem um conhecimento superficial das tecnologias da Web em qualquer idioma.

Conteúdo


  1. Sobre o curso "Linguagens de programação da Web"

  2. Conteúdo da palestra

  3. Como criar um curso para uma universidade
  4. Por que Ruby?
  5. Por que Ruby não é popular?
  6. Sumário

Linguagens de programação da Web


Por que o curso é chamado de linguagens de programação na Web? A resposta é muito simples. Há 30 anos, quando a Internet estava surgindo, agora não há como usar uma linguagem de programação.

  • As linguagens de marcação são HTML e CSS.
  • Idiomas de configuração e troca de dados - JSON, XML, YAML.
  • Programação do navegador - Javascript (TypeScript, Coffeescript ...).
  • Programação de servidores - Ruby, PHP, Perl, Java, Javascript ...

Para entender a programação da web, mesmo em um valor mínimo, é necessário conhecer as linguagens de marcação e programação de 4-5 (embora os limites entre elas agora estejam embaçados).

Objetivo do curso


O principal objetivo do curso é compreender as tecnologias necessárias para o desenvolvimento da Web, uma vez que a maioria dos projetos modernos está de alguma forma relacionada ao desenvolvimento da Web. O curso é organizado de forma a fornecer aos alunos de forma concisa o básico que pode ser usado como uma estrutura para um estudo aprofundado.

Os alunos desenvolvem habilidades específicas de forma independente durante o treinamento, e o grau de desenvolvimento depende se você pretende mergulhar no desenvolvimento da Web no futuro.

Autor do Curso


O principal desenvolvedor do curso é candidato a ciências técnicas, professor associado da cadeira "Sistemas e Redes de Computadores" do MSTU, em homenagem a N.E. Bauman Samarev Roman Stanislavovich. Programador com mais de 20 anos de experiência (C ++, C, Java, Perl, PHP, Ruby e outros para Windows, Linux, Embedded Linux, MacOS), chefe de desenvolvimento de software, pesquisador na área de DBMS, processamento de dados e big data, trabalhou na Rússia, na Alemanha e nos EUA.

Duração e formato


O curso completo inclui 192 horas acadêmicas: 16 palestras por 2 horas, 8 seminários por 2 horas, 48 ​​horas para 12 trabalhos de laboratório. O restante do tempo é alocado para auto-estudo. Os materiais de vídeo incluem apenas a parte da palestra. Aqueles que desejam se aprofundar no tópico do curso, os materiais do trabalho de laboratório e dos seminários terão que aprender de forma independente. Todas as perguntas podem ser feitas ao professor: samarev@acm.org .

Resultados


Como parte do curso de treinamento, formamos o entendimento dos alunos sobre não apenas tecnologias específicas da Web implementadas na linguagem de programação Ruby, mas, também, uma percepção holística dos problemas que surgem ao criar aplicativos da Web e tudo o que os acompanha, usando o Ruby como uma ilustração muito boa. A própria linguagem Ruby é uma adição útil para os alunos, que pode ser amplamente usada fora do curso.

Conteúdo do curso


Palestras 1-2. 1. Introdução

  • Uma introdução à programação da Web em termos de arquitetura básica.
  • Informações mínimas sobre linguagens de marcação e folhas de estilos.
  • Introdução mínima ao Javascript.



Talvez o Javascript deva ter alocado muito mais tempo, mas como a programação da Web baseada em navegador não é o objetivo principal do curso e as tecnologias de programação do servidor em Javascript ainda não foram estabelecidas, o material disponível é suficiente para um entendimento inicial.

Palestras 3-5. Ruby

As próximas três palestras são dedicadas ao Ruby, uma vez que são as tecnologias nessa linguagem Ruby que fundamentam o curso. As palestras incluem:

  • O básico da linguagem Ruby.
  • Informações necessárias sobre estrutura de tipo e modelo de objeto.
  • Estilo funcional.




Aula 6. Princípios de construção de aplicativos da web

  • Interface de gateway comum.


Alguém dirá que esse padrão não é relevante, mas está subjacente a toda a programação web moderna. Portanto, qualquer programador da Web é simplesmente obrigado a saber o que é e deve entender que o aplicativo da Web mais simples é simplesmente colocar 'Hello World'.

Palestra 7. Rack

  • Rack é uma camada intermediária para a maioria das estruturas da web Ruby.
  • Sinatra é uma estrutura comum para criar aplicativos simples.
  • Um exemplo de criação de um aplicativo.


Aula 8. Introdução ao Rails

  • Aspectos principais de um aplicativo Rails.


Ruby on Rails é o próprio framework que tornou Ruby famoso e quase se tornou seu sinônimo. Este é um exemplo de uma estrutura profundamente desenvolvida com o conceito Model-View-Controller, que serviu como um protótipo para a criação de muitas outras estruturas da Web, incluindo Grails e Django. Observe que o conceito do Rails é gerar o máximo de código possível com geradores automáticos e escrever menos manualmente.

Palestra 9. Interação Assíncrona

A maioria dos aplicativos Web modernos usa o método assíncrono, ou seja, as solicitações do servidor desaparecem em segundo plano para o usuário. As respostas são elaboradas em algum lugar no fundo do navegador. O que você precisa saber aqui?

  • Formatos de troca - XML ​​e JSON.
  • Executando uma solicitação assíncrona do Javascript.
  • O conceito de Javascript discreto aplicado ao Rails.


Palestra 10. Teste

Quaisquer programas modernos devem ser cobertos por testes automáticos. Ruby envolve o uso de testes de unidade. E, é claro, o Rails sugere que qualquer ação seja coberta nos testes. A palestra inclui os seguintes tópicos:

  • Testando vários aspectos de aplicativos da web.
  • Introdução às linguagens de domínio (uma vez que o RSpec e o Pepino são os próprios exemplos de “humanidade” nos testes: um programa de testes deve ser compreensível não apenas para um programador “adaptado” para o idioma usado, mas também para uma pessoa normal). Observe que a abordagem usada no RSpec e no Pepino agora é amplamente replicada nas ferramentas de teste para muitas outras linguagens de programação.
  • Ferramentas como SikuliX e Selenium, que podem ser usadas para testar programas com uma interface gráfica e navegadores, respectivamente.


Palestra 11. Tecnologias XML

  • Idiomas de consulta como Xpath, Xquery.
  • XSL e XSLT.


Parece, o que tudo isso tem a ver com programação na web? Mas o XML está no centro da tecnologia da web. O fato de não estarmos usando XML como formato de troca agora não garante que, após 5 anos, não começaremos a fazê-lo novamente. Ainda não existe uma abordagem unificada para verificar dados no formato JSON. E no caso de XML, o esquema de marcação é estabelecido pela própria linguagem.

A linguagem de consulta do Xpath é, de fato, uma linguagem universal de consulta de waypoint que pode ser usada para procurar por quaisquer elementos de estruturas de dados semelhantes a árvores, que incluem JSON.

As transformações XSLT também são outra maneira de transformar documentos XML, cujo conhecimento permitirá que os alunos não reinventem a roda no futuro quando encontrarem ETL.

Aula 12. ORM (Mapeamento Objeto-Relacional)

Quase qualquer estrutura de programação da web moderna fornece meios para a transformação objeto-relacional. Os alunos precisam entender:

  • por que esse mecanismo é necessário;
  • quais são suas limitações;
  • como usá-lo na prática.

Nesse caso, tudo é considerado no contexto do Ruby on Rails.


Aula 13. Sessões, segurança e tudo relacionado a ela.

  • Um método de armazenamento de estado baseado em cookie.
  • Métodos de autenticação típicos.
  • Um exemplo de adição de autorização no Rails.
  • Considerações de segurança para aplicativos da web em si.


Palestra 14. Serviços

  • Aspectos históricos.
  • Recomendações específicas sobre o desenvolvimento e implantação de seus próprios serviços para a Web.


Palestra 15. CMS (Content Management Systems)
Na programação da Web, é importante não apenas ser capaz de escrever um aplicativo, mas também entender se você precisa escrevê-lo. Esta palestra é uma demonstração dos principais tipos de aplicativos da Web já criados que podem ser personalizados para os requisitos de um cliente específico e, se necessário, finalizados.

  • Ênfase nas ferramentas Ruby.
  • O CMS mais comum escrito em PHP.


Palestra 16. Hospedando aplicativos da Web Ruby na Internet

A ideologia geral dos serviços da web é considerada. As origens dessa arquitetura com o formato XML de troca e suas modificações adicionais na API da Web com JSON e REST ou GraphQL são explicadas.

  • Servidores da Web
  • Métodos de virtualização.
  • Maneiras de hospedar o aplicativo na Internet.


Como criar um curso para uma universidade


É difícil criar cursos de treinamento sobre tópicos relacionados à programação, onde a tecnologia muda a cada 5 a 10 anos. Ao criar um curso para uma universidade, é necessário equilibrar entre a formação de habilidades práticas em linguagens de programação específicas e a apresentação dos fundamentos teóricos necessários para entender as tecnologias como tais. Além disso, a diferença entre o ensino universitário e os cursos de treinamento está na apresentação sistemática do material, que também impõe restrições sobre quando e em que volume determinado material pode ser submetido.

Nos últimos anos, houve uma tendência de gravar palestras universitárias em vídeo e criar cursos em vídeo. O curso "Linguagens de programação na Web" é a primeira tentativa formal da nossa universidade. E com base no feedback, decidiremos como e em que formato fazer novas entradas.

Há 10 anos, era necessário atualizar radicalmente o currículo, introduzindo, entre outras coisas, programação na web. No Departamento de Sistemas e Redes de Computadores, as mesmas horas de treinamento são tradicionalmente alocadas para cursos relacionados à eletrônica e design de computadores e para programação. Além disso, os cursos de programação incluem treinamento algorítmico em linguagens de alto nível Pascal, C, C ++ / Qt, treinamento em vários montadores, bem como a teoria das linguagens de programação e compiladores. E até linguagens de programação para FPGAs e hardware específico. Ou seja, o departamento prepara especialistas universais que, no futuro, escolherão sua própria especialização.

Precisávamos identificar tecnologias da web promissoras que podem ser dominadas em um semestre, e é desejável que essas tecnologias possam ser projetadas em outras linguagens de programação.

Por que Ruby?


Por que Ruby está selecionado? A escolha de idiomas para programação na web é bastante rica. Além do Ruby, são PHP, Perl, Javascript, Java, Go e outros. Se abordarmos a partir da perspectiva de aplicativos da Web altamente carregados e enviar Benchmarks que duvidam do Web Framework , veremos na vanguarda C ++, Java, Rust, Ur, Go, etc. Ruby não é o mais popular para o desenvolvimento da Web, nem o mais rápido para soluções altamente carregadas. No entanto, Ruby tem uma série de outras virtudes que a tornam uma linguagem de programação, da qual qualquer programador instruído deve estar ciente.

Ruby comemorou recentemente seu 25º aniversário, o que significa que é uma linguagem bastante madura. Apesar do fato de que a maioria dos idiomas mencionados também ultrapassou ou está próxima dessa idade (Rust, Dart, Go ainda são "verdes" em comparação com ele)), Ruby é um dos poucos idiomas que manteve a compatibilidade com versões anteriores ao longo dos anos.

No mundo de Ruby, podemos dizer que não houve revoluções e mudanças radicais. Refere-se a linguagens inicialmente bem projetadas, cujos conceitos básicos sobreviveram até hoje inalterados. Declarações de desempenho relacionadas a versões mais antigas anteriores à 1.8.7, que foram descontinuadas há 10 anos. As versões modernas a cada ano mostram um aumento múltiplo na produtividade. As alegações de que esse idioma não é muito popular são válidas apenas para o nosso país. Infelizmente, em nosso país, grandes empresas estão realmente ignorando-o.

Por que Ruby é bom para o ensino universitário? Essa é uma linguagem pura de objetos. E, como é dinâmico, quase tudo pode ser redefinido. Não há tipos simples em seu modelo (não vamos pensar em uma implementação de sistema aqui, estamos apenas falando em um modelo). Qualquer dado é um objeto. Código é um objeto. Ou seja, Ruby facilita o aprendizado dos princípios da programação orientada a objetos. Além disso, a sintaxe da linguagem é bastante simples e quase não tem exceções. Qualquer código escrito no programa deve ser executado uma vez e não importa onde esse código está escrito - dentro da declaração da classe ou fora. O que quer que esteja escrito, será cumprido. A sintaxe do Ruby é muito flexível, o que o torna muito conveniente para escrever linguagens específicas do domínio (DSL / DSEL). Além disso, o conceito básico de Ruby - o bloco - é uma função anônima. O domínio desses princípios permite que os alunos dominem facilmente a programação funcional em linguagens de programação funcional pura.

E, antes, o mérito decorativo do Ruby - não é preciso perder tempo explicando a formatação obrigatória do código com recuo. O programa está claramente marcado de qualquer maneira. A formatação fornecerá rubocop automaticamente e os alunos aprenderão a escrever corretamente ao longo do tempo.

Por que Ruby não é popular?


Por que o Ruby, com essas vantagens, ainda não é popular e se refere a idiomas com um alto limite de entrada?

A primeira coisa a entender: Ruby não é apenas outra linguagem de programação imperativa que você pode começar a programar à noite, mas compreender completamente em uma semana. Esta é uma linguagem diferente, com uma filosofia diferente.

O primeiro princípio do Ruby: o texto do programa deve ser percebido como texto em linguagem natural. Ou seja, Ruby é uma linguagem para um programador que é uma pessoa, e não uma linguagem para a qual você precisa encontrar o programador certo. Infelizmente, a maioria das linguagens de programação modernas segue o princípio de "o programador suportará", e o recuo já é percebido com dificuldade.

Ruby é frequentemente criticado por fazer a mesma coisa de várias maneiras. Mas, na linguagem natural, temos um grande número de sinônimos, e é a escolha do sinônimo certo que enriquece nosso discurso. Assim é em Ruby. Além do fato de que as mesmas ações podem ser executadas de maneiras diferentes, há muitos sinônimos associados aos mesmos métodos associados aos métodos especiais alias e alias_method .

Um exemplo simples das limitações da maioria das outras linguagens de programação. Suponha que exista uma variedade de produtos e você queira determinar que não está vazio. Na maioria dos idiomas, escreveremos algo como if (products.size() > 0 ) .... Mas, tendo chegado à loja, não perguntamos ao vendedor: "Se você tem mais de zero desse e de tal produto?" Nós fazemos uma pergunta simples: "Você tem esse e aquele produto?". No Ruby, você precisa usar métodos que expressem o significado da ação. Sim, podemos usar a verificação "maior que zero", mas a maneira natural é perguntar if products.any . Isso é literalmente: existem produtos? Observe que Ruby funciona bem com Unicode; portanto, se necessário, com base nesse idioma, você pode criar idiomas especializados com adaptação regional. Por exemplo, se você deseja redefinir em russo todos os nomes de classes e métodos.

Um exemplo interessante, embora não totalmente direto: Bato: um porto Ruby para filipinos .

Sobre o assunto da objetividade da linguagem: Ruby distingue claramente entre variáveis ​​/ constantes e objetos. Devido à natureza dinâmica da linguagem, os dados “vivem” sua vida como objetos. Qualquer identificador é uma constante ou variável que apenas se refere a um objeto. Entender mal esse princípio leva a surpresas:

 str1 = "Test" str2 = str1 str1.sub! "Te", "La" puts str2 # => "Last" ????    str1,  ?.. 

Aqui apenas usamos o método de modificação do objeto, cujas referências foram armazenadas por duas variáveis. Percebo que essa não é uma maneira tradicional de Ruby mudar. Normalmente, os objetos são mantidos inalterados e as alterações dão origem a novos objetos. Além disso, o método sub! Usado aqui possui um sufixo - um ponto de exclamação - que é o esquema de nomenclatura aceito pelo Ruby para métodos que modificam o próprio objeto. Sem esse símbolo, o método simplesmente gera um novo objeto.

Outra característica do Ruby, que muitas vezes confunde desenvolvedores que vêm de outras linguagens de programação: o conceito de "bloco". Sintaticamente, o bloco tem a mesma aparência de outras linguagens de programação e em duas versões ao mesmo tempo: {…} e do..end (não esqueça que Ruby é criado para humanos, por isso, selecionamos colchetes se a expressão for de linha única e as palavras se houver muitas linhas). A essência de um bloco no Ruby é um código que é armazenado como um objeto e pode ser ativado chamando yield . A contraparte direta em C e C ++ são funções de retorno de chamada. Em Javascript, uma função anônima como some_func('on_element_click', function(event) {…} ).

Graças a esse conceito, Ruby é uma das linguagens de programação mais concisas e expressivas. Por exemplo, a conversão dos elementos de uma matriz de acordo com a função quadrática terá a seguinte aparência:

 (1..5).map { |x| x * x } # => 1, 4, 9, 16, 25, 

onde { |x| x * x } { |x| x * x } - um bloco com uma variável local declarada x , ou seja, uma função para converter elementos de matriz. E o método para o qual é transmitido é simplesmente chamado de mapa (ou seja, "mapa"). E você não precisa escrever a palavra return , embora isso seja possível, porque tudo já está claro (em Ruby, o resultado da última operação é sempre o valor de retorno). Além disso, o código de bloco é um código chamado autonomamente para cada elemento da matriz. É por isso que não faz sentido tentar iniciar as variáveis ​​dentro do bloco e esperar que seu valor seja preservado durante o processamento do próximo elemento. Um bloco é uma função de processamento armazenada e nada mais.

Se quisermos analisar uma string com os números inseridos no teclado, basta escrever:

 gets.chomp.split.map(&:to_i) 

Ou seja, leia a string (gets), descarte qualquer lixo como caracteres de chomp linha ( chomp ), divida-o em palavras ( split ), chame a conversão com a função to_i (a rigor, um método de objetos do tipo "string"). E nada mais. Split sabe que, na linguagem humana normal, "quebrar uma linha" significa separá-la por palavras, onde os delimitadores são espaços e sinais de pontuação. O mapa pode ser usado em um formato tão curto com o nome do método a ser retirado do objeto. Embora seja possível escrever o map { |x| x.to_i } completo do formulário map { |x| x.to_i } map { |x| x.to_i } ou mesmo { |x| return x.to_i } { |x| return x.to_i } . Mas isso não melhora a legibilidade, portanto você pode deixar apenas o map(&:to_i) .

Noto que o conceito do bloco permeia francamente Ruby. Até o código de visualização

 class HelloWorld (1..3).each { puts 'Hi from class declaration!' } def hi   puts 'Hello World!' end end HelloWorld.new.hi 

aparece na tela:

Hi from class declaration!
Hi from class declaration!
Hi from class declaration!
Hello World!


O que pode parecer inesperado aqui? O loop dentro da declaração de classe imprimiu mensagens. Em seguida, recebemos uma mensagem de um método de instância desta classe. E o segredo é muito simples. Ruby é uma linguagem com um modelo de programação regular. Uma maneira típica de chamar qualquer método com um bloco:

 method_with_block(args) do ... end 

As palavras class e def no exemplo são essencialmente os nomes dos métodos para os quais os argumentos HelloWorld , hi são passados. O argumento HelloWorld se tornará para nós o nome constante da classe e hi se tornará o nome do método. O restante da palavra end é um bloco. E o código de bloco é ativado chamando yield, após o qual tudo é executado sequencialmente. Ou seja, mesmo aqui praticamente não há diferença entre chamar um método regular e declarar métodos, classes, módulos.

Também preste atenção na construção de ativação HelloWorld.new.hi . HelloWorld - constant - aponta para um objeto do tipo Class . Este objeto tem um new método. O resultado de chamar new é um objeto criado do tipo HelloWorld , a partir do qual chamamos o método hi . E mesmo aqui a regularidade de Ruby se manifesta. Nós não escrevemos something = new HelloWorld , mas simplesmente chamamos o método de um objeto específico (a Class referenciada pelo HelloWorld ), que gera um objeto do tipo HelloWorld .

A falta de entendimento do idioma também é facilitada por longas cadeias de chamadas:



Se você conhece JavaScript ou jQuery, não vê nada de terrível aqui. Aqueles que vieram de C e C ++ podem ficar confusos sobre o número de pontos. Ruby usa transformação de objeto funcional. Ou seja, toda essa cadeia é o processo de converter uma string, que consiste em selecionar palavras, convertê-las em números, selecionar apenas as pares, esquadrar e adicionar o resultado.

Qualquer método no Ruby gera um objeto de valor. Não há exceções. Mesmo nada é um objeto. Como o Ruby é uma linguagem dinâmica com um coletor de lixo automático, não há necessidade de criar novas variáveis. Objetos intermediários serão excluídos. Ou seja, uma expressão longa pode ser facilmente analisada em uma sequência de atribuição de valores a variáveis ​​locais, que chamam sucessivamente os métodos correspondentes. Mas por que, se tudo já está claro?

Nos programas Ruby, é extremamente raro ver loops como for , while , loop . Eles são fornecidos na sintaxe, mas quase nunca são usados. Porque Sim, porque eles não carregam uma carga semântica.

Exemplo: em uma variedade de mercadorias, você precisa encontrar um "pão com sementes de papoila". Para linguagens de programação tradicionais, podemos usar aproximadamente o seguinte código Ruby:

 products…# -    — . found_product = nil for i in 0...products.size do if products[i].name == '  '   found_product = products[i]   break end end if  found_product != nil #  ,  - . end 

Nesse caso, o código Ruby normal se parece com:

 products… # -   - found_product = products.find { |product| product.name.eql? '  ' } unless found_product.nil? #  ,  - . end 

Ou seja, escrevemos literalmente em uma linha: encontre o produto pelo nome. E é isso. Porque, na realidade, estamos interessados ​​apenas na seleção de mercadorias, e nem em todos os índices de mercadorias e não em sua quantidade.

Exemplo de vida: você veio à loja e perguntou ao infeliz vendedor de duas maneiras: a primeira - “ Para todos os produtos de zero a 15143, se o nome do produto for igual a um pão com sementes de papoula, então me dê ”; o segundo - " Dê-me um pão com sementes de papoula ". Ambas as opções parecem estar sintaticamente corretas, mas a segunda é natural. Por alguma razão, a maioria dos programadores considera a primeira opção normal. E os programadores Ruby são os segundos. E o método find aqui é apenas uma das substituições de loop. Chamo a atenção para isso, antecipando comentários de que outros idiomas também têm uma pesquisa de matriz com uma função de seleção.

Portanto, embora Ruby tenha construções de sintaxe for , while e loop , quase ninguém as usa porque existem métodos específicos: each , each each_index , each each_index each_with_index , select , map , map , reduce , find , detect e muitos outros expressando um significado específico - para cada índice, para cada elemento e seu índice, selecione, transforme, oculte, encontre etc. E se precisarmos obter índices, usaremos array.each_index . E se você precisar selecionar elementos, use select . Ênfase na naturalidade. Pedimos apenas o que realmente precisa ser feito. Nenhum índice é necessário - não é necessário solicitar. Consulte a documentação do módulo Enumerable para obter mais detalhes.

Sumário


Ruby é uma linguagem sintaticamente simples, mas flexível, com um modelo de objeto desenvolvido, cuja ênfase principal é um código conciso, mas bem percebido, focado na pessoa viva. Por padrão, o Ruby está presente no pacote de qualquer sistema operacional moderno (ou pode ser instalado no Windows). Um grande número de programas foi escrito nesse idioma. Existem comunidades estáveis ​​prontas para ajudar com conselhos ou ações. Os programas Ruby são scripts básicos de administração para Linux e MacOS (OpenSuSE / SuSE e brew.io, respectivamente), isto é matemática e aprendizado de máquina , são testes (Rspec, Cucumber, Capybara ...), implantação de aplicativos (Puppet, Chef) e muito mais

Se os alunos conhecerem Ruby, isso ampliará significativamente seus horizontes e permitirá que eles tenham uma visão completamente diferente de coisas familiares. Além disso, é muito fácil aprender outras linguagens de programação de script após o Ruby, mas a questão é se você deseja usá-las.

Source: https://habr.com/ru/post/pt419765/


All Articles