A melhor maneira de aprender Rails. A melhor maneira de aprender Rails A linguagem de programação ruby \u200b\u200bpara iniciantes

Ruby é uma linguagem de programação poderosa e popular. Além de sua popularidade, uma estrutura bem conhecida é baseada nele, que permite criar sites interessantes e dinâmicos sobre vários tópicos. Se você olhar o ranking do TIOBE, o idioma está entre os vinte idiomas mais populares do mundo.

A linguagem surgiu em 1995 e é considerada uma linguagem jovem em comparação com C ou C ++, que apareceu em 1972 e 1983, respectivamente. A linguagem tem uma série de vantagens e recursos específicos que são implementados exclusivamente nela, se compararmos outras linguagens de programação populares.

Plano de curso

Neste curso em vídeo, você aprenderá a linguagem Ruby sem usar estruturas adicionais. Cursos adicionais em Rubi você pode encontrar em.

Durante o curso estudaremos como instalar e trabalhar com a linguagem, estudaremos a sintaxe Rubi (variáveis, loops, operadores condicionais), bem como coisas mais complexas: OOP, trabalhando com arquivos, exceções, métodos e vamos tocar em muitos outros tópicos.


Instalando Ruby no Windows

Para instalar Ruby no Windows, use RubyInstaller, que pode ser baixado do site oficial neste link. Baixar última versão e instale-o como um programa normal. Após a conclusão da instalação, você verá uma janela semelhante:

Nesta janela, certifique-se de que a caixa de seleção esteja marcada, então outro aplicativo para instalação será aberto em seguida Rubi no sistema.

Na janela que se abre, digite 1 por vez e pressione Enter, após aguardar o final da instalação, pressione 2 e Enter e ao final execute o terceiro comando pressionando 3 e Enter.

Instalando Ruby em um Mac

No Mac, Ruby é instalado por padrão, então você não precisa fazer mais nada. Você pode verificar a versão do idioma no terminal com o seguinte comando:

Se a versão estiver desatualizada, você pode baixar a nova. Primeiro você precisa baixar o gerenciador de versões Ruby. Isso é feito por meio do terminal usando o comando:

Curl -L https://get.rvm.io | bash -s stable

Depois de instalar o gerenciador, você precisa reiniciar o terminal. Execute o seguinte comando:

Lista Rvm conhecida

Após reiniciar, você pode instalar a versão desejada. No nosso caso, a versão 2.4.2 foi instalada:

Rvm install ruby-2.4.2

No final, você pode verificar a versão novamente e se ainda for antiga, basta instalar a nova versão por padrão.

Há muito tempo queria aprender Ruby on Rails em algum nível básico. Sem um objetivo específico. Em vez disso, apenas para mim, a fim de entender melhor o que há de tão especial nele (em contraste com 100.500 outras tecnologias e estruturas), que permite que você crie e dimensione rapidamente projetos de Internet bastante carregados. O motivo secundário foi o desejo de experimentar novas abordagens de aprendizagem. Quando eu estava estudando para ser programador, só tínhamos livros e fóruns onde você poderia pedir conselhos. Agora existem tutoriais interativos e escolas online para programadores, um grande número de screencasts (quase um sonho: assistir como os gurus programam), bases de conhecimento como stackoverflow.com e toneladas de códigos-fonte no GitHub, onde você pode passar horas estudando o código-fonte de profissionais reais. Nas noites seguintes (e não há tempo durante o dia), decidi separar-me para experimentar novas formas de aprendizagem em ação.

Primeira noite

Começar a aprender Ruby on Rails sem ao menos um conhecimento mínimo do próprio Ruby seria estranho. Já peguei o guia interativo ruby-lang.org. Mas ao passar por ela, ele imediatamente esqueceu tudo. Seus criadores prometem que levará quinze minutos para percorrer e dominar a sintaxe Ruby. Levei trinta. No entanto, com distração constante no Twitter. O processo é mais ou menos assim. Eles dizem a você: “Os arrays em Ruby são declarados assim, e os dados dos arrays são recuperados assim. Agora vamos tentar fazer um array e extrair N elementos dele. E vamos verificar. " Você leu como tudo funciona e você experimenta imediatamente. Você certamente não aprenderá Ruby assim. Melhor pensar nisso como um curso superexpresso que funciona.

Mesmo assim, o próprio Ruby está muito longe do framework Ruby on Rails. Eu queria dominar os trilhos. Do nosso artigo sobre educação online, definitivamente me lembrei do sensacional curso Zombie for Rails railsforzombies.org. É como Experimente o Ruby, um tutorial interativo que o ajuda a começar logo de cara para ensiná-lo a preparar aplicações ferroviárias. Primeiro, eles lêem uma mini-palestra (em inglês, mas tudo é muito claro - ligue as legendas) sobre a estrutura de arquivos de uma aplicação ferroviária, a abordagem CRUD para trabalhar com dados, explicam como o modelo MVC é implementado em trilhos , e assim por diante. Após cada vídeo, você é solicitado a concluir as tarefas para consolidar o material. Tudo parece simples e direto, o curso passa despercebido em uma ou duas horas (é pequeno). Mas! Após o curso, achei que poderia escrever um aplicativo ferroviário? Infelizmente não!

Segunda noite

Uma das razões pelas quais alguns conhecimentos básicos surgem após Rails for Zombies, mas não há confiança, é o ambiente virtual em que o treinamento ocorre. Por um lado, reduz o limiar de entrada ao limite: você não precisa se preocupar com o meio ambiente. Por outro lado, você não cria nada real ao longo do caminho - nenhum “Hello World” no final. E o mais importante, de que lado abordar sua criação não está claro. A partir daquele momento, quis experimentar o Ruby on Rails em ação, realmente instalando-o no sistema (antes disso, você não podia nem tentar), e criar um aplicativo simples do zero.

Não me lembro como, mas por acaso descobri um curso de screencast de muito sucesso em russo rails.hasbrains.org. Agradecemos ao autor pela apresentação competente: ele explica metodicamente os princípios da aplicação ferroviária em detalhes, mergulhando você em todas as sutilezas necessárias ao longo do caminho. Em suma, na segunda noite do experimento, assisti à primeira metade dos mais de trinta episódios desses screencasts.

Uma imagem de como o aplicativo é gerado, como trabalhar com o console ferroviário, como criar modelos e migrações, como atualizar modelos e como validar dados neles, controladores RESTful e assim por diante, foi finalmente fixada na minha cabeça. Assistindo cada um dos episódios, eu imediatamente tentei tudo em ação, construindo um aplicativo ferroviário totalmente funcional. Ficou claro como os trilhos estão dispostos em princípio.

Terceira noite

Na terceira noite, ficaram os últimos episódios dos screencasts, que consegui assistir de uma só vez: trabalhar com trilhos não parecia mais tão selvagem. Nesse ponto, alguém me disse que o curso Rails for Zombies tem uma continuação sensível e muito mais profunda. No entanto, o curso já é pago e hospedado na Code School www.codeschool.com. Não foi uma pena dar 25 dólares para ter acesso a todos os cursos da escola. Este é um custo mensal, então se você não gostar, não se esqueça de cancelar sua assinatura.

O curso Rails for Zombies 2 realmente acabou sendo um grande sucesso. É verdade que muito se tornou uma repetição do que vi nos screencasts - mas foi até um pouco agradável. Cinco níveis e cinco blocos de exercícios que você faz direito no console interativo. Nesse ponto, os trilhos já pareciam lógicos, compreensíveis e utilizáveis.

Na Code School, você pode programar diretamente no navegador, completando as tarefas do curso

Qual é o próximo?

Aprendi a fazer projetos complexos? Não. Mas eu definitivamente percebi as abordagens usadas em trilhos e entendi sua conveniência. Aprendi a criar aplicativos simples rapidamente e em um tempo super curto aumentar sua funcionalidade com a ajuda de joias escritas pela comunidade. Tomei coragem e continuo estudando com prazer as melhores práticas nos programas Code School (agora estou assistindo a um curso de testes unitários). E estou muito feliz que a tecnologia se tornou tão fácil de aprender.

"Oi! O que você está fazendo?" - "Sim, então programo uma peça para cortar." - "É contagioso:-)"
Esse é o tipo de diálogo que tive com um amigo hoje. Por que rubi?

Por que aprender Ruby

Esta questão diz respeito àqueles que programam com sucesso em PHP há muito tempo. Você domina um idioma, é ótimo, mas não precisa parar por aí. Muitos podem argumentar que conhecem a língua, são guiados por ela e já aprenderam todos os truques com ela. Vou te dar várias razões para aprender Ruby.

  1. Curiosidade... Por exemplo, foi muito interessante para mim trabalhar com turmas abertas. É assim que você pega e injeta seu método na classe do sistema - na minha opinião, é ótimo. Haverá confusão? E como fazer isso? Em geral, tudo que é novo é interessante.
  2. ... Porque Eu tenho programado em PHP por um longo tempo, estou me perguntando o que Ruby pode se orgulhar de PHP /
  3. Velocidade Ruby... O Twitter é baseado em Ruby (embora tenha sido abandonado recentemente). Eu gostaria de testar seu desempenho na realidade.
  4. Classe de tarefas a serem resolvidas... Ruby é bom para aplicativos da web. É assim mesmo?
  5. Metaprogramação. Talvez o motivo mais importante.

Como aprender Ruby. Plano acadêmico.

Aqui, meu primeiro erro foi começar a aprender o framework sem saber o idioma. Agora percebi que isso não é necessário. Esquecendo de Ruby on Rails por um tempo, comecei a estudar Ruby sozinho, pois uma tarefa do sistema travava no sistema de tickets por muito tempo, que era difícil de resolver em php. Eu realmente não queria dar a ele direitos de root Então, o plano é este.

  1. Funções, classes, classes públicas. Atributos (acessores e modificadores).
  2. Trabalhando com strings, com arrays. Encontre e substitua substrings, etc. Conversão de tipo.
  3. Trabalhando com arquivos.
  4. Trabalhando com o ambiente do sistema.
  5. Projeto de aplicação, trabalho com gemas (módulos).
  6. Trabalhando com o banco de dados.
  7. Instalando Ruby on Rails ,.

Neste post irei publicar meu primeiro aplicativo Ruby e convidar a todos para discutir. Aponte erros, sugira melhores práticas, faça perguntas.

Vamos aprender Ruby juntos!

Lição 1. Primeiro aplicativo Ruby.

A tarefa é a seguinte. Há um servidor DNS na hospedagem, e quando você chama o utilitário de console no ruby, você precisa adicionar uma zona para o domínio, bem como uma entrada de zona para a lista de zonas (domains.list) e alterar um registro no banco de dados , onde este domínio deve ser registrado. As configurações de acesso ao banco de dados são armazenadas no aplicativo php, especificamente em seu arquivo INI. Após todas as etapas, é necessário reiniciar o servidor DNS (bind).

Espaço de trabalho para Ruby

Vou usar RubyMine da JetBrains como IDE. Eu realmente gostei deles. Embora fosse sobre phpStorm, a qualidade é visível imediatamente. Colocamos Ruby por meio de RVM primeiro para todos os usuários, depois configuramos para o root e para nosso usuário.

Estendendo aulas públicas de Ruby

Para trabalhar com arquivos INI em Ruby, usamos a gem inifile. Mas há um pequeno problema com isso. No arquivo ZF INI, você pode usar constantes com segurança, e as linhas ficarão assim:

IncludePaths \u003d APPLICATION_PATH "/../vendors/Doctrine/"

Isso é do APPLICATION_INI que destrói o analisador de gemas. Especificamente, esta linha não corresponde a nenhum padrão:

@rgxp_comment \u003d% r / \\ A \\ s * \\ z | \\ A \\ s * [# (@ comentário)] / @rgxp_section \u003d% r / \\ A \\ s * \\ [([^ \\]] +) \\] / o @rgxp_param \u003d% r / \\ A ([^ # (@ param)] +) # (@ param) \\ s * "? ([^"] *) "? \\ z /

Esta é a situação de usar classes públicas. Vamos substituir a função IniFile :: parse pela nossa. Vou adicionar todas as adições ao arquivo fucntion.rb

Class IniFile private # # call-seq # parse # # Analisa o conteúdo do arquivo ini. # def analisa o retorno, a menos que File.file? (@ fn) section \u003d nil tmp_value \u003d "" tmp_param \u003d "" fd \u003d (RUBY_VERSION\u003e \u003d "1.9" && @encoding)? File.open (@fn, "r" ,: encoding \u003d\u003e @encoding): File.open (@fn, "r") enquanto line \u003d fd.gets line \u003d line.chomp # mutline start # cria variáveis \u200b\u200btmp para indicar que um multine foi iniciado # e as próximas linhas do arquivo ini serão comparadas # com o outro mutline rgxps. if line \u003d ~ @rgxp_multiline_start then tmp_param \u003d $ 1.strip tmp_value \u003d $ 2 + "\\ n" # o delimitador final mutline foi encontrado # apague o vars tmp e adicione o par param / valor à seção elsif linha \u003d ~ @ rgxp_multiline_end && tmp_param! \u003d "" then section \u003d tmp_value + $ 1 tmp_value, tmp_param \u003d "", "" # qualquer outra coisa entre início e fim de multilinha elsif line \u003d ~ @rgxp_multiline_value && tmp_param! \u003d "" then $ tmp_value + 1 "\\ n" # ignore as linhas em branco e as linhas de comentário elsif line \u003d ~ @rgxp_comment then next # esta é uma declaração de seção elsif line \u003d ~ @rgxp_section then section \u003d @ini [$ 1.strip] # caso contrário, temos uma linha elsif de parâmetro \u003d ~ @rgxp_param, em seguida, começar a seção [$ 1.strip] \u003d $ 2.strip rescue NoMethodError raise Error, "parâmetro encontrado antes da primeira seção" end elsif line \u003d ~% r / APPLICATION_ / then next else aumentar Error, "não foi possível analisar linha "# (linha)" end end # enquanto garante fd.close se definido? fd e fd end end

Também estenderei a classe String para que os domínios possam ser validados.

Classe String def valid_domain_name? domain_name \u003d self.split (".") name \u003d /(?:+)+/.match(domain_name).nil? tld \u003d / (? :( 2) | aero | ag | asia | at | be | biz | ca | cc | cn | com | de | edu | eu | fm | gov | gs | jobs | jp | in | info | me | mil | mobi | museu | ms | nome | net | nu | nz | org | tc | tw | tv | uk | us | vg | ws) /. match (domain_name) .nil? (nome_do_domínio.contagem\u003e 1 e nome! \u003d falso e tld! \u003d falso) fim fim

Códigos-fonte

Bem, agora vou mostrar o código-fonte real.
index.rb

#coding: utf-8 require "mysql2" require "socket" require "inifile" require "./functions.rb" # Hash de endereços da máquina servidor hosts \u003d (: production \u003d\u003e "83.168.22.1" ,: test \u003d\u003e " 84.22 .11.1 ") util \u003d Util.new (hosts) util.releative_config_path \u003d" / site.com/application/config/application.ini "# Verificar os parâmetros sair se (ARGV.count! \u003d 2) domínio \u003d ARGV hostname \u003d ARGV . split (".") quit ("Nome de domínio inválido") if (não domain.valid_domain_name?) # Procurar uma empresa no banco de dados result \u003d Mysql2 :: Client.new (util.get_db_settings) .query ("SELECT id FROM` sites` WHERE `hostname` \u003d" # (hostname) "") quit ("Company not found") if result.count! \u003d 1 # Atualizando hostname rows \u003d Array.new result.each (| linha | linhas<< row} company_id = rows["id"] result = Mysql2::Client.new(util.get_db_settings).query("UPDATE `dbname`.`sites` SET `domain` = "#{domain}" WHERE `dao_companies`.`id` =#{company_id};") # Добавление зоны bind_config_path = "/etc/bind" default_zone_file = bind_config_path + "/zones/DEFALT" new_zone_file = bind_config_path + "/zones/#{domain}.zone" zones_list_file = bind_config_path + "/domains.lst" quit("File with default zone does not exists") unless File.exist?(default_zone_file) quit("File with zones list does not exists") unless File.exist?(zones_list_file) zone = IO.read(default_zone_file).gsub("SERIAL",Time.now.strftime("%Y%m%d%S")).gsub("DOMAIN", domain) if not File.exist?(new_zone_file) then File.open(new_zone_file, "w") {|f| f.puts(zone) } else quit("Domain "+domain+" zone already exists!") end # Добавление зоны в список zone = "zone \"#{domain}\" { type master; file \"/etc/bind/zones/#{domain}.zone\"; };" if not IO.read(zones_list_file).include?(domain) then File.open(zones_list_file, "a") {|f| f.puts(zone) } end # Перезапуск сервисов (bind9) system("service bind9 restart") puts "Completed"

Gemfile
Este arquivo descreve as dependências do projeto.

Fonte: rubygems gem "mysql2", "0.2.6" gem "inifile"

Bem, funções realmente incluídas.
functions.rb

#coding: utf-8 class String def valid_domain_name? domain_name \u003d self.split (".") name \u003d /(?:+)+/.match(domain_name).nil? tld \u003d / (? :( 2) | aero | ag | asia | at | be | biz | ca | cc | cn | com | de | edu | eu | fm | gov | gs | jobs | jp | in | info | me | mil | mobi | museu | ms | nome | net | nu | nz | org | tc | tw | tv | uk | us | vg | ws) /. match (domain_name) .nil? (domain_name.count\u003e 1 e name! \u003d false e tld! \u003d false) end end class IniFile privado # # call-seq # parse # # Analisa o conteúdo do arquivo ini. # def analisa o retorno, a menos que File.file? (@ fn) section \u003d nil tmp_value \u003d "" tmp_param \u003d "" fd \u003d (RUBY_VERSION\u003e \u003d "1.9" && @encoding)? File.open (@fn, "r" ,: encoding \u003d\u003e @encoding): File.open (@fn, "r") enquanto line \u003d fd.gets line \u003d line.chomp # mutline start # cria variáveis \u200b\u200btmp para indicar que um multine foi iniciado # e as próximas linhas do arquivo ini serão comparadas # com o outro mutline rgxps. if line \u003d ~ @rgxp_multiline_start then tmp_param \u003d $ 1.strip tmp_value \u003d $ 2 + "\\ n" # o delimitador final mutline foi encontrado # apague o vars tmp e adicione o par param / valor à seção elsif line \u003d ~ @rgxp_multiline_end && tmp_param! \u003d "" then section \u003d tmp_value + $ 1 tmp_value, tmp_param \u003d "", "" # qualquer outra coisa entre início e fim de multilinha elsif line \u003d ~ @rgxp_multiline_value && tmp_param! \u003d "" then tmp_value + \u003d $ 1 + "\\ n" # ignore as linhas em branco e as linhas de comentário elsif line \u003d ~ @rgxp_comment then next # esta é uma declaração de seção linha elsif \u003d ~ @rgxp_section then section \u003d @ini [$ 1.strip] # caso contrário, temos um parâmetro elsif line \u003d ~ @rgxp_param then iniciar seção [$ 1.strip] \u003d $ 2.strip rescue NoMethodError raise Error, "parâmetro encontrado antes da primeira seção" end elsif line \u003d ~% r / APPLICATION_ / then next else raise Error, "não foi possível analisar a linha" # (linha) " end end # enquanto assegura fd.close se definido? fd e fd end end def quit (mensagem \u003d nil) banner \u003d "\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d | Ferramenta de adição de DNS | \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Uso: ruby \u200b\u200b./index.rb domain.com olddomain.site.com "se não message.nil ? then banner \u003d message end puts banner exit end class Util attr_accessor: hosts ,: releative_config_path ,: environment def initialize (hosts \u003d Array.new) self.hosts \u003d hosts end # Obter endereço IP local def local_ip orig, Socket.do_not_reverse_lookup \u003d Socket.do_not_reverse_lookup, true # desligue a resolução DNS reversa temporariamente UDPSocket.open do | s | s.connect "64.233.187.99", 1 s.addr.last end garantir Socket.do_not_reverse_lookup \u003d orig end # Obtenha o ambiente de get_environment if @ environment.nil? then hosts \u003d self.hosts.invert if (hosts.include? (self.local_ip)) then @environment \u003d hosts else @environment \u003d "development" end else @ environment.to_s end end def get_config_path local_username \u003d get_local_username "/ home /" + local_username + "/ sandbox" + self.releative_config_path end # Retorna o nome de usuário se o utilitário foi executado via rvmsudo ou diretamente def get_local_username se ENV ["SUDO_USER"]. nil? quit ("Util deve ser executado em rmvsudo, \\ r \\ nexemplo: rvmsudo ruby \u200b\u200b./index.rb domain.ru some.subdomain.ru") else ENV ["SUDO_USER"] end end def get_db_settings config \u003d IniFile :: load ( self.get_config_path) section_name \u003d self.get_environment.to_s + ": bootstrap" quit ("Nenhuma seção adequada no arquivo de configuração") a menos que config.has_section? (section_name) dsn \u003d config.to_h ["resources.doctrinedata.connections.default. dsn "] # Parse dsn dsn.sub! (" mysql: // "," ") arr \u003d dsn.split (" @ ") dbconfig \u003d (: username \u003d\u003e arr.split (": ") ,: password \u003d \u003e arr.split (":") ,: host \u003d\u003e arr.split ("/") ,: banco de dados \u003d\u003e arr.split ("/")) fim fim

E quanto ao PHP?

Este post não é sobre sair do PHP e aprender Ruby. PHP é a linguagem de programação web mais popular, milhares de coisas interessantes e algoritmos são implementados nela, incl. até mesmo redes neurais. E eu o amo) Com o passar dos anos, podemos dizer que me tornei parecido com ele, apesar de todas as suas deficiências. Mas isso não significa que você não precise aprender algo novo por si mesmo.

Recentemente, fui questionado sobre quais livros aprender Ruby. Estou lendo este agora.

Este livro é o guia oficial da linguagem de programação dinâmica Ruby. A equipe de redação é realmente estelar: David Flanagan é um renomado especialista em programação, autor de vários livros best-sellers de JavaScript e Java; Yukihiro "Matz" Matsumoto é o criador e desenvolvedor líder do Ruby.
O livro fornece uma descrição detalhada de todos os aspectos da linguagem: a estrutura lexical e sintática do Ruby, variedades de dados e expressões elementares, definições de métodos, classes e módulos. Além disso, o livro contém informações sobre as funções API da plataforma Ruby.

A publicação será interessante para programadores experientes que estão se familiarizando com a nova linguagem Ruby por conta própria, bem como para aqueles que já estão programando em Ruby e desejam alcançar um nível superior de compreensão e domínio do trabalho. Você pode encontrar um livro sobre Ozônio ou Biblio-Globe.

Aguardo seus comentários sobre o código e quaisquer ideias interessantes!)

Obrigado!

Se este artigo ajudou você, ou você deseja apoiar minha pesquisa e blog, esta é a melhor maneira de fazer isso:

Caras atiram, atiram, todos atiram !!! Partindo do básico e passando para coisas mais complexas, o curso oferece uma base teórica e muita prática. O objetivo do curso é garantir que o aluno construa o pensamento correto em sua cabeça, do ponto de vista de um programador. Gostei muito deste curso, aconselho a todos, tanto iniciantes quanto aqueles que já estão familiarizados com o básico de programação. Obrigado a vocês por seu valioso trabalho e experiência!

Um curso muito bom - os caras são ótimos. Gradualmente, eles colocam todo o mínimo necessário para a vida de um programador no cérebro e jogam pãezinhos mais avançados.

A apresentação do material é só fogo, foi tão interessante assistir todos os vídeos e depois fazer o dever de casa, só uma coisa reconhecimento pkhpshnik o que vale a pena e é tudo isso.

Uma abordagem individual para o recebimento de DZ (não em uma base formal) - dependendo do seu desempenho acadêmico, os professores podem complicar sua tarefa ou solicitar que você o faça usando tecnologias mais avançadas.

O que é realmente legal - suporte 24 horas em uma folga!

Webinars incríveis onde acontecem debriefing e não só - assisti a alguns deles várias vezes, porque é um material muito importante e está muito bem explicado.

Mas o mais significativo para mim é que os cursos me colocam em um estado completamente diferente - um estado de compreensão constante de algo novo, um desejo de conhecimento - e isso é o mais importante de tudo - é como um motor que foi ligado em mim e agora me movo graças a ele. Muito obrigado aos professores por me darem uma vida nova, cheia de desejo de conhecimento, de desgosto que não dá certo e de alegria que eu consertei.

O curso é simplesmente maravilhoso! Uma explicação clara do material, independentemente de sua complexidade. Muito obrigado aos professores! Responda rapidamente a perguntas e forneça feedback fundamentado e concreto sobre as tarefas realizadas. O resultado fala por si: 5 meses e passei com sucesso na entrevista. Ótimo curso! Vale a pena!

Desenvolvedor Ruby on Rails, Taganrog, github

Curso incrível. Saturado, não chato, direto ao ponto. Ótimos professores. Eu não encontrei nenhuma desvantagem. Eles são tratados com humanidade. Eu vim como um iniciante completo. Agora sou um super novato! Eu escrevi um programa em ruby \u200b\u200b(mais de um), escrevi um aplicativo em rails (mais de um), configurei um servidor, implantei o aplicativo, baguncei várias funcionalidades do aplicativo, descobri domínios, certificados SSL, dns , autorizações e muito mais. Corro para a batalha, empreendo um projeto independente. Em geral, muito obrigado, bons programadores!

Desenvolvedor Ruby on Rails, Moscou, github

A princípio eu não iria fazer cursos, porém, a forma como esses caras apresentam o material causa uma grande vontade de trabalhar com eles, aprender e apenas comunicar.

A principal vantagem do curso é o fato de a galera gostar muito e querer ensinar as pessoas. O curso NÃO está no formato "Bem, nós demos a você o material lá, e então descubra você mesmo", as pessoas colocam seus corações e se preocupam sobre como você percebeu o material. Após concluir este curso, você pode trabalhar com segurança como desenvolvedor Rails.

Desenvolvedor Ruby on Rails, Krasnodar, github

Os principais pontos utilizados no desenvolvimento de uma aplicação web são facilmente explicados. As joias mais populares em trilhos também são consideradas.

Eles verificam bem a lição de casa e fornecem comentários detalhados. Agradeço o fato de os caras não martelarem em você após o término do curso e manterem contato, ajudarem em palavras e ações)) O site não é muito conveniente em termos de busca de informações, principalmente quando você termina todas as 71 lições, mas acho que a galera vai terminar o resto, não tem do que reclamar.

Líder de equipe no AirBnB, San Francisco

Eu tenho uma experiência significativa em aprendizagem online - isso é o melhor curso online daqueles que já conheci. Tudo foi resolvido - material bem escolhido, excelente apresentação. E o mais importante, após o curso você pode realmente se tornar um programador!

Eu moro no Vale do Silício, vou a vários encontros e workshops, me encontro com graduados de bootcamps locais alardeados (que custam, aliás, de $ 12.000 por 4 meses) e eu entendo que meu conhecimento após o curso é muitas vezes superior a muitos graduados destes famosos bootcamps Silicon Valleys, apesar de ter começado do zero e até "Bom programador" nunca abri o terminal))

Vou esperar por uma autorização de trabalho e com certeza vou conseguir um emprego. Depois do curso sinto força para fazê-lo, sei que é possível! Obrigada pessoal!

Na minha opinião, os caras criaram um ótimo curso que é adequado tanto para programadores novatos quanto para aqueles que já têm experiência em trabalhar com outras linguagens e bibliotecas.

Excelente material e apresentação, atitude em geral e a atmosfera nos webinars. Os caras trabalham duro para ajudar cada aluno, mastigando nos mínimos detalhes se necessário. Depois dos cursos, você se sente confiante nas suas habilidades, entende que é bem possível conseguir um emprego no setor de TI, haveria um desejo.

O básico para um entendimento básico de programação é fornecido de forma excelente. São apresentados problemas interessantes e reais, cuja solução o ajudará e será útil no futuro.

Deixe-me resumir. eu acho que este curso um dos melhores, e definitivamente recomendo a todos que decidiram dedicar suas vidas ao campo da programação. Neste momento, numa procura ativa de emprego, a procura é bastante elevada, portanto, tudo está nas suas mãos! Expresso minha gratidão à galera e desejo muito sucesso no futuro!

Desenvolvedor Ruby on Rails

O curso ajudou, aprendi a programar em Ruby e on rails, não sou um programador super-bacana, mas sei que posso escrever qualquer coisa, talvez precise ler algo a mais.

O desafio era "aprender a programar e encontrar emprego". A tarefa foi 100% cumprida, aprendi a programar, fui contratada.