【转发】 求职面试题目整理

Published on:

我们绝大部分同学之前都不是程序员,在求职过程中难免会遇到各种问题。一个人求职太孤独,不如大家一起结伴打怪。
我建了个微信群,大家可以在这个群里相互交流职位信息、简历投递技巧、面试经验,面试、笔试题目。大家相互帮助,找到合适的工作

如果扫码无效,可以加我的个人微信:185-5166-4870,注明求职交流群,我会拉你进群。

面试官并没有提前仔细看我的简历,所以先让我做自我介绍,随便讲讲,所以我就把简历上的东西口述了一遍。

1.Ruby的特点是什么?你对ruby的理解是什么?
注意:
1)问的不是rails的特点。因为我们的教材直接学的rails,所以很容易答非所问。
2)这个问题很多东西我也还没有搞懂,不过我个人认为只要能回答出一部分就可以。对Ruby的理解应该会随着学习的不断深入而不断变化。

Ruby 的特点

Ruby的特点

我为什么喜欢Ruby

1)Ruby从人、工程师的角度考虑问题,而不是从计算机的角度考虑问题。我们是主人,他们是仆人。遵循上述理念,Ruby语言非常直观,按照工程师认为它应该的方式运行。

2)完全面向对象:Ruby从一开始就是彻底的面向对象的。Ruby中一切都是对象,都拥有属性和方法。包括基本数据类型(primitive data types),比如字符串、整数 都是对象。甚至常量也会被当做对象处理,所以一个方法的接收者,可以是一个常量。
所以Ruby中所有语句都是方法调用,这样就更统一。

3)是动态语言,可以动态修改对象、类别:可以在程序中修改先前定义过的类,也可以在某个类的实例中定义该实例特有的方法,这叫做原型方法。
高度灵活性:可以自由地去改变语言的各个部分。其核心部分也可以被移除或重新定义,现有的部分也可以继续添加内容。

class DemoClass
def methodA
"general methodA"
end
end

dc = DemoClass.new
dc.methodA # "general methodA"

def dc.methodA
"special for this instance."
end

dc.methodA # "special for this instance."
4)变量无需声明,变量没有类型:不像静态语言需要事先声明变量的类型,Ruby的变量是动态类型,给变量赋予什么类型该变量就是什么类型。

5)单类继承 + 模块扩展:既保证了单类继承的简单,又能为某些类添加共同的方法。

6)有丰富的类库。
人性化:当你想要一个方法的时候,绝大多数时候它已经在那里了。

7)理解正则表达式

8)命令行交互工具irb非常方便,可以随时验证一些想法

9)多平台

10)强大的元编程:Ruby的反射功能非常强大,甚至可以自行追踪程序运作,或是取出private变量、拦截方法的调用。常常与’可以动态地修改对象’这项特色结合,实现元编程:程序运行时,可以由程序员提供的信息,自行生成、修改类别或对象,这能大大提高编程效率。

11)任何东西都有值:不管是四则运算、逻辑表达式还是一个语句,都有回传值

12)有垃圾回收机制

2.Ruby中有哪些动态方法调用?各自的优劣?

在编译阶段,编译器就会检查方法调用的对象是否有一个这样的方法,如果没有就直接报错,这种称为静态类型检查,这种语言称为静态语言。ruby是动态语言,只有真正调用这个方法的时候,找不到这个方法才会报错。

Ruby 动态方法

为何Ruby的元编程能力如此强大?因为它能够在运行时生成需要的代码,或者调用相应的方法。这给Ruby程序增加了灵活性。

不用对象.方法的方式调用,而用send方法来调用函数,这种调用方式叫做动态指派。这种方法更加清晰地说明调用方法的概念:调用一个方法实际上就是给对象发送一条消息。这里可以看成是我们给对象 send一个消息my_method以及参数3.
使用send动态调用的好处是,可以在编码中动态地决定方法调用。

ruby 元编程 读书笔记

class MyClass
def my_method(my_arg)
my_arg * 2
end
end

obj = MyClass.new
obj.my_method(3) #=> 6
obj.send(:my_method, 3) #=> 6
1)send
2)使用Object类的method方法来获取某个方法,这个方法返回一个method类的对象。再使用call方法来执行方法调用,算是延迟调用。
可以在使用对象的任何地方使用method对象,当调用call方法时,参数所指明的方法会被执行。你可以把method对象作为一个迭代器使用。
3)使用eval方法 eval方法会分析其后的字符串参数,并把这个字符串参数作为ruby代码执行。

ruby方法的动态调用

都可以调用私有方法。只有public_send才是不可以调用私有方法.
method call执行速度最快。
发送偶尔需要动态调用方法时会用到 send。但是绝少会用到eval,因为太危险了。eval评估任意表达式,不仅仅是调用方法。

3.Ruby中单引号和双引号的差别。
Ruby 字符串生成有两种方式,字符串内容加单引号或双引号。
单引号中的内容不会被转义(处理),双引号中的内容会被转义。

name = “foobar"
string = "#{name}"

=> foobar

string = '#{name}'

=> #{name}

4.一个rails 项目的架构,或者说一个rails专案的主要目录、文件有那些,各自的作用是什么?
app
assets #静态档案
images
javascripts
application.js
stylesheets
application.css
controllers #把Ruby的objects在model和view之间传来传去。每个URL都对应controller里面一个特定的method

models #数据库和你的程序的之间的桥梁
views #产生HTML来显示在浏览器
common
layouts

helpers #views中过多的逻辑判断类的东西,可以在helper中定义好,views中直接调用即可
jobs
mailers

config
deploy
environments

development.rb
production.rb
test.rb
routes.rb #路径

db
migrate
schema.rb
seeds.rb

lib

public #唯一一个放什么就会出现什么的文件夹,sever会直接回传,不会经过rails处理
test
tmp
vendor #放第三方的CSS/JS库的源码
assets
javascripts
stylesheets

.gitignore
Gemfile
Gemfile.lock
README.md

5.说说你对active record的理解?
active record是MVC中的M(model),负责对象的创建和和将数据存储到数据库中。active record库的主要作用是把Ruby对象映射到数据表中,这个功能称为对象关系映射(ORM),它结合了关系数据库(用于持久化)和面向对象编程(用于业务逻辑)的优点。
使用ORM,可以很容易地从数据库存储和检索对象的数据,不用写那些繁杂的数据库语句。
active record最重要的功能包括:
1)将model和data联系起来
2)将各个model联系起来,理清了他们的继承、层级关系
3)在model存入数据库前,对他们做有效性验证
4)用面向对象的方式对数据进行操作

2.对controller的理解
Action Controller 是MVC中的C(控制器)。控制器是模型和视图的中间人,路由决定使用哪个控制器处理请求后,控制器负责接收、解析请求,从模型中获取数据,或把数据写入模型,再通过视图生成相应的HTML。

6.执行rails s时背后发生了什么?
登录了一个叫做puma的网络服务器,它是和rails绑定的。你想通过浏览器访问你的rails应用时就可以使用rails s。
从敲下rails s命令开始,到服务器启动起来的过程:rails命令行解析,创建Rails::Server 对象,加载Rails.application,启动服务器监听用户请求。rack

port -p
environment -e
IP -b
daemon -d

rails s 启动过程分析

1.你的jdstore中有哪些model?关联关系是怎样的?

user has_many :comments has_many :orders #用户只和评论、订单有关联,和购物车并无关联
category has_many :products
product belongs_to :category has_many :comments
comment belongs_to :user belongs_to :product
cart has_many :cart_items has_many :products, through: :cart_items, source: :product
cart_item belongs_to :cart belongs_to :product
order belongs_to :user has_many :product_lists #订单和购物车也没有关系
productlist belongs_to :order
7.你的购物网站中 加入购物车如何设计?逻辑是什么?怎么能防止同一个商品重复加入购物车?
这个地方的model比较特殊:要设计一台购物车cart(Model),还要设计一个cart_item的model。因为购物车中会有多种商品,而每种商品又有各自的购买数量、价格等,设计成这种”嵌套”的model,会更直观。
rails g model cart
rails g model cart_item

db/migrate/xxx_create_cart_items.rb
class CreateCartItems < ActiveRecord::Migration[5.0]
def change
create_table :cart_items do |t|
t.integer :cart_id
t.integer :product_id
t.integer :quantity, default: 1
end
end
end
app/models/cart_item.rb
class CartItem < ApplicationRecord
belongs_to :cart
belongs_to :product
end
add_to_cart这个action要分为两部分来实现:add_product_to_cart和current_cart

app/models/cart.rb
class Cart < ApplicationRecord
has_many :cart_items
has_many :products, through: :cart_items, source: :product

def add_product_to_cart(product)
ci = cart_items.build
ci.product = product
ci.quantity = 1
ci.save
end
end
每个进店的用户,不管是否登入,都要准备一台购物车

app/controllers/applications_controller.rb
class ApplicationController < ActionController::Base

helper_method :current_cart

def current_cart
@current_cart ||= find_cart
end

private

def find_cart
cart = Cart.find_by(id: session[:cart_id])
if cart.blank?
cart = Cart.create
end
session[:cart_id] = cart.id
return cart
end
end
每个人进店时,都会有个session,上面记录了你拿了哪台购物车cart_id。所以,current_cart就是通过这样的方式存取的。万一你的车丢了if cart.blank?,会再给你一台车。

购物车中的信息存到了哪里?
存到cart和cart_items了。session中只记录了cart id。
购物车和user并没有练习在一起。所以,加入购物车时不需要强制用户登录。
当建立订单的时候order时,强制用户登录,这时@order.user = current_user,才将当前用户和购物车联系在了一起。

app/controllers/products_controller.rb
def add_to_cart
@product = Product.find(params[:id])
if !current_cart.products.include?(@product)
current_cart.add_product_to_cart(@product)
else
flash[:notice] = "购物车内已有此商品"
end
redirect_to :back
end
end
8.你的购物网站中建立订单、结账付款的设计逻辑是什么?

在购物车按下确认结账按钮后,可以显示结账明细,并且可以让消费者输入寄送地址。

rails g model order

app/controllers/carts_controller.rb
class CartsController < ApplicationController
def checkout
@order = Order.new
end
end
rails g controller orders

rails g model product_list

app/controllers/orders_controller.rb
class OrdersController < ApplicationController

def create
@order = Order.new(order_params)
@order.user = current_user
@order.total = current_cart.total_price

if @order.save

  current_cart.cart_items.each do |cart_item|
    product_list = ProductList.new
    product_list.order = @order
    product_list.product_name = cart_item.product.title
    product_list.product_price = cart_item.product.price
    product_list.quantity = cart_item.quantity
    product_list.save
  end

  redirect_to order_path(@order)
else
  render 'carts/checkout'
end

end

def show
@order = Order.find(params[:id])
@product_lists = @order.product_lists
end

private

def order_params
params.require(:order).permit(:billing_name, :billing_address, :shipping_name, :shipping_address)
end
end
rails g migration add_is_paid_to_order
rails g migration add_payment_method_to_order

db/migrate/xxx_add_is_paid_to_order.rb
def change
add_column :orders, :is_paid, :boolean, default: false
add_column :orders, :payment_method, :string
end
config/routes.rb
resources :orders do
member do
post :pay_with_alipay
post :pay_with_wechat
end
end
app/controllers/orders_controller.rb
def pay_with_alipay
@order = Order.find_by_token(params[:id])
@order.set_payment_with!("alipay")
@order.pay!

   redirect_to order_path(@order.token), notice: "使用支付宝付款成功”
end

def pay_with_wechat
    @order = Order.find_by_token(params[:id])
    @order.set_payment_with!("wechat")
    @order.pay!

    redirect_to order_path(@order.token), notice: "使用微信付款成功"
 end

app/models/order.rb
class Order < ApplicationRecord

def set_payment_with!(method)
self.update_columns(payment_method: method)
end

def pay!
self.update_columns(is_paid: true)
end

end
4.购物网站中发送邮件通知 是如何设计的?
rails g mailer OrderMailer

app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "service@jdstore.com"
layout 'mailer'
end
app/mailers/order_mailer.rb
class OrderMailer < ApplicationMailer
def notify_order_placed(order)
@order = order
@user = order.user
@product_lists = @order.product_lists

 mail(to: @user.email , subject: "[JDstore] 感谢您完成本次下单,以下是您这次购物明细 #{order.token}")
end

end

touch app/views/order_mailer/notify_order_placed.html.erb

app/controllers/orders_controller.rb
class OrdersController < ApplicationController
before_action :authenticate_user!

def create
@order = Order.new(order_params)
@order.user = current_user
@order.total = current_cart.total_price

if @order.save

  current_cart.cart_items.each do |cart_item|
    product_list = ProductList.new
    product_list.order = @order
    product_list.product_name = cart_item.product.title
    product_list.product_price = cart_item.product.price
    product_list.quantity = cart_item.quantity
    product_list.save
  end
  current_cart.clean!
  OrderMailer.notify_order_placed(@order).deliver!

  redirect_to order_path(@order.token)

 else
   render 'carts/checkout'
 end

end
5.切换订单状态
用有限状态机这个架构实作。

gem 'aasm'

rails g migration add_aasm_state_to_order

db/migrate/xxx_add_aasm_state_to_order.rb
class AddAasmStateToOrder < ActiveRecord::Migration
def change
add_column :orders, :aasm_state, :string, default: "order_placed"
add_index :orders, :aasm_state
end
end
app/models/order.rb
include AASM

aasm do
state :order_placed, initial: true
state :paid
state :shipping
state :shipped
state :order_cancelled
state :good_returned

event :make_payment, after_commit: :pay! do 
  transitions from: :order_placed, to: :paid
end

event :ship do 
  transitions from: :paid,     to: shipping
end

event :deliver do 
  transitions from: :shipping,  to: :shipped
end

event :return_good do
  transitions from: :shipped,   to: :good_returned
end

event :cancel_order do 
  transitions from: [:order_placed, :paid], to: :order_cancelled
end

end
namespace :admin do
resources :orders do
member do
post :cancel
post :ship
post :shipped
post :return
end
end
end
app/controllers/admin/orders_controller.rb
class Admin::OrdersController < ApplicationController
def ship
@order = Order.find(params[:id])
@order.ship!
redirect_to :back
end

def shipped
@order = Order.find(params[:id])
@order.deliver!
redirect_to :back
end

9.自动化测试的逻辑是什么?怎么写?
自动化测试,就是用程序去测试程序。开发过程中不需要再打开rails s 或rails c 检查结果是否正确了。
使用自动化测试框架rspec进行测试。

leap_year_spec.rb
describe " " do
it " " do
result = is_leap_year?(2016)
expect(result).to eq(true)
end

end
其中每个it包起来的就是一个测试案例,用expect方法检查结果是否如我们所预期。
执行 rspec + 测试文件名

测试其实就是调用代码中的action/method,代入各种可能的参数,然后用expect方法检查result是否正确。
测试代码比实作代码 还多行是正常的,测试代码非常易读:1.建立测试资料,2.执行程序,3.检查结果

准备测试案例是写测试的关键,也就是说,要测哪些案例才算这个程序是正确的?因此,在开始写代码前,要先列出所有可能测试的案例的清单,特别是边界的情况。列出所有需要测试的可能情况后,再删掉明显重复的案例。

要看到测试失败,才表示测试真正在起作用。所以,不一定要先写实作代码再写测试代码,而是可以先写测试代码再写实作代码。

案例和案例之间是互相独立、互不影响的,这样测试失败时,才不用怀疑是不是被别的测试影响的。因此新增加的测试案例的对象需要重新建立。

不要一开始就把全部测试案例都写出来,这样要一次通过所有测试会很辛苦。而是要新写一段测试代码让测试失败,然后改实作代码让测试通过。然后再新写下一个测试代码让测试失败,然后再改实作,如此迭代交替。TDD(test-driven development)

在测试代码中,你可以直接puts变量,跑测试的时候就会输出,这是最简单的除错方式;你也可以在任意的位置放byebug设置中断点,就会在执行那一步时停下来,可以检查变量,输入continue就会继续执行。

自动化测试分为几种不同的类型,针对单一类别的方法进行测试,叫做单元测试。

11.你对user story 用户故事如何理解?

用户故事,是加上了角色的需求、功能。只有从角色的角度出发去思考,梳理需要的功能,做出的功能才会符合角色真正的、真实的需求。如果不考虑角色,只按照所谓各类型网站的标准去开发,一是会觉得很乱、很多,理不清;二是会做的太多、太少或做歪。

某角色,需要做什么事,这件事要在哪里做?这件事由哪些要素组成?这就是最终可以实作的步骤。(全栈营的招聘网站教程第4章 是在一步步带我们达成这一点。先是随机列出所有你能想到的功能,然后从中找出这个项目的所有角色,然后以各个角色为中心来整理每个角色的需求,也就是从角色的角度来表述网站的功能。然后就是不断细化每个角色的需求或者说要具有的功能,即不仅要说明角色要做什么事,还要说明在哪里做(后台、首页、、、?)、然后是这件事、这个事物由哪些要素构成?(比如文章包括标题、内容...),一直细化、全面到能实作的地步,也就是能由此而确定需要哪些model、需要哪些页面。

拆解任务,最终要把把大问题、需求、项目拆解成可以实作、执行的小问题、步骤。
无论这个需求看上去多么小,比如电商网站中消费者可以很方便地购买商品并结账,购买商品就是加入购物车,这很简单。而生成订单并结账则需要分出好几个步骤:消费者点击结账后,首先要进入地址等信息的填写确认页面;然后是付款页面,付款后商家也需要收到订单通知;商品库存需要随之减少、、、、、、是否是可用的用户故事,就要看每个步骤是不是可以实作的,是否可以将其转化为代码。

团队成员认领的是用户故事还是任务

12.你对敏捷项目管理如何理解?

真实的项目非常复杂,有很多user story,会产生很多bug。
如果对截止时间没有清醒的认识,非要一次就做成非常牛逼的产品,把时间压到最后一刻。最终得到的只能是无法按时完成,有各种bug,只能焦头烂额地加班。又因为墨菲定律,在如此紧张的时间压迫下,你出错的概率会大大提高,于是陷入恶性循环。

项目管理的核心就是时间管理。做任何计划时都要预留额外的时间,因为永远会有意外发生。
因为时间、人力永远是有限的,所以我们的目标不是一次就做出牛逼的、完美的产品,而是做符合市场需求的、最小可行性产品。
根据这个定义排列优先级:
1.保留足够的测试时间:不论项目大小,都应该拿出1/3时间来测试,让真实用户做充分的测试,尽可能排除bug。
2.剩余2/3的时间分为三部分:
(1)必须有的基础。
(2)先做主干功能:砍掉不必要的功能,只做 must have 和should have, 先不管could have 和 nice to have。
(3)填补细节:按照剩余的时间,能做多少做多少,不要勉强。
之所以可以按照情况先砍掉相对不重要的功能,一是因为时间有限,二是因为项目是活的,做的过程中会发现很多东西跟之前想的不一样,所以可以按照实际情况调整。

一开始就要先部署,因为本地环境和远端环境不同,如果全部写完再部署会出现很多bug,先部署好之后,每做一个功能立即更新一下看是否有bug即可。

1.each 和 map 的区别?

each 将block作用于数组中的每个元素,但对原数组并无影响,return 的结果仍为原数组。常用于数组的循环操作

[1,2,3,4].each {|n| puts n*2}

Outputs:

2

4

6

8

map 和 collect一样(实际上map是collect的alias),将block应用于数组中的所有元素,并使原数组 变成一个新数组

[1,2,3,4].map {|n| n*2}

=> [2,4,6,8]

Campaign.where(finish_remark:"stop from api").each {|c| c.id} 会输出各个campaign的所有信息。因为each方法return的就是原数组。
Campaign.where(finish_remark:"stop from api").map {|c| c.id}则会只输出id,因为map会输出新数组。
Campaign.where(finish_remark:"stop from api").map {&:id}
2.ruby 中的变量不需要提前定义,那么 print 'a'会得到什么结果?

print "a"
a => nil
nil是print方法的返回值

3.users的数据库如下:

id city
1 杭州
2 杭州
3 南京
4 北京

用SQL数据库语句或ruby语句计算users的总人数,各个城市的人数?

guides.ruby-china.org
这个题目我也只是根据链接中的材料写出来的答案,不知道是否正确。敬请指正!

总人数User.count
杭州人数User.where("city = '杭州'").count

7.rails里不是有联表查询吗,如果我把联表查询分成多条独立的查询语句来查询的话,这两种方式的查询效率那个快?
你没有问我这个联表里有没有写索引。假如说没有写索引,哪个查询速度更快?
没写索引时,只能一笔笔地循序找,那独立快。有索引时,联表查询快。

假如你有一条慢查询,一般你会通过哪几个方面去优化查询?
includes——N+1 query
加索引——table scan
select-只拿需要的列
计数快取--counter_cache
find_in_batches——巨量数据

对于比较慢的联表查询,这里再给你提供两种方式:
一是如果联表查询联的表较多,可以在中间表做数据备份或减少不必要的中间表;
二是如果查询量大,且有锁表,可以考虑使用存储过程。

1.Rails的原则是什么?
rails是使用Ruby语言编写的web应用开发框架。
1)不要自我重复(DRY):代码才更容易维护,更具扩展性。
2)多约定,少配置:为大多数需求都提供了最好的解决方法,并默认使用这些约定。

3.数据验证应该放在那里?
在模型层做数据验证最具有普适性。
数据库约束和存储过程 无法兼容多种数据库,而且难以测试和维护。
客户端验证很有用,但单独使用时可靠性不高。如果使用JavaScript实现,用户在浏览器禁用JavaScript后很容易跳过验证。
控制器层验证一般都不灵活,难以测试和维护。并且我们要尽可能保证控制器的代码简洁。

4.关联有哪几种?

belongs_to
has_one
has_many

has_many :through
class Physician < ApplicationRecord
has_many :appointments
has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
belongs_to :physician
belongs_to :patient
end

class Patient < ApplicationRecord
has_many :appointments
has_many :physicians, through: :appointments
end
has_one :through
class Supplier < ApplicationRecord
has_one :account
has_one :account_history, through: :account
end

class Account < ApplicationRecord
belongs_to :supplier
has_one :account_history
end

class AccountHistory < ApplicationRecord
belongs_to :account
end
has_and_belongs_to_many

多态关联:一个模型可以属于多个模型

class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
end

class Employee < ApplicationRecord
has_many :pictures, as: :miageable
end

class Product < ApplicationRecord
has_many :pictures, as: :imageable
end
自联结:模型和自己建立关系

7.用的哪个数据库?
开发用sqlite,部署到heroku用postgresql,自学MySQL

10.团队合作过吗?还是都是自己写的?
有过合作呀,购物网站就是两人合作的成功,我做的主程,通过GitHub远程合作。

1.除了rails,你还用过或者看过其他的ruby框架吗?

什么是网站开发框架? rails实战圣经
讨论版、blog、内容管理系统(CMS)、wiki,这类系统的重点主要在资料的保存和显示,牵扯的复杂商业逻辑不多。程序只是数据库系统的糖衣接口,不需要MVC架构,不需要页面与程序逻辑分开,不需要对象导向。

随着web2.0和云端风潮带来越来越多的web应用程序的开发需求,网站、应用的规模增加,需要加入更多的商业逻辑和功能。之前的开发方式导致整个项目的结构变得十分复杂,不利于团队合作开发。要接受维护这样的网站,常常会不知道如何阅读及修改,因为所有的商业逻辑与HTML混杂在一起,不同的人开发就有不同的程序架构,缺乏程序文件是常有的事,也不容易进行测试。

框架就是制定好了一套规范和惯例,框架的功能类似于基础设施,与具体的软件应用无关。

通过MVC这一软件架构设计模式,我们可以有系统地组织代码,分离商业逻辑和使用者接口,让前端和后端开发者可以独立作业。

10 alternative Ruby web frameworks

Ruby的备选web开发框架

2.除了heroku,你还用过其他的web server吗?
linode server、阿里云

6.你开发网站是前后端分离,还是直接后端渲染?
完完全全分离,后端负责提供API, 独立前端 消费API 这样对前端和后端都是比较爽的。
但Rails开发者更多是前后端一起搞的

4.平时应该是在mac下编程吧,对linux熟悉吗?
基本的命令知道,部署capistrano时在远端也用到过一些

七、如何保存、验证用户密码?是直接存到数据库吗?
用户注册时输入的密码,在实际存储进数据库时,会先经过散列函数,变成摘要值。数据库里没有存用户的明码,而是存密码摘要后的值。下次用户登录的时候,将用户密码再摘要一次,与数据库中存的密码摘要 进行比对即可。

一、以下两个@a 是不是同一个实例变量?

class A

def self.fang
@a = 1
end

def zheng
@a = 1
end
不是

上面的是个类方法,其中的@a是个类实例变量,下面的是个实例方法,其中的@a是个实例变量。
class variable在整个class继承体系都是指同一个,而class instance variable则是各个class都不同,因此class instance variable很多时候比class variable好用,像是参数化的classes。
class variable / class instance variable / instance variable
class instance variables

遇到class、module、def,程序会进入一个新的作用域

self和作用域

二、

module A
def self.B

end
end

class C

include A

extend A
end
都会发生错误。module内用self定义的方法,是module的class method,只能用A.B调用,跟include、extend无关。

is it possible to define a class method in a module?

五、

父类
def A(a,b)

end

子类
def A(a)

end
要看A方法是否支持只有一个参数的情况,如果不支持则发生错误。

5.如果给你一台阿里云的服务器,让你把你github上的代码部署上去,你会做些什么?
新增部署用账号apps
安装ruby 环境,安装Ruby
安装RMagick
安装passenger(rails用http server)
安装Nginx并整合passenger
安装rails
安装数据库如postgresql

直接用capistrano 部署:
gem 'capistrano'
生成远端机器的key
设定Nginx
安装Capistrano-passenger

只有passenger做web server吗?Nginx也是web server吗?你有没有想过nginx也是web server,passenger也是web server,为什么要多此一举?
Nginx其实是反向代理服务器
正向代理与反向代理

8.安全方面学习了哪些?
1)XSS跨站脚本攻击:恶意用户会张贴JavaScript代码,其他用户浏览时浏览器就会执行JavaScript。
2)CSRF跨站请求伪造
3)SQL injection 攻击
4)大量赋值: 用strong parameters防御
5)破解加密:用session而不是cookie
6)DOS拒绝服务攻击:大量发送http请求,让你的服务器忙不过来。只能想办法识别攻击方的IP,然后进行封锁。

5.gem用过哪些?

gem 'bootstrap-sass'
gem 'jquery-ujs'
gem 'jquery-rails'

gem 'simple_form'
gem 'font-awesome-rails'

gem 'devise'
gem 'devise-i18n'
gem 'rucaptcha' #注册验证码

gem 'pundit'
gem 'cancancan' #权限

gem 'will_paginate'
gem 'kaminari'

gem 'carrierwave'
gem 'mini_magick'

gem 'select2-rails' #单选、多选
gem 'nested_form_fields' #嵌套表单
gem 'boostrap-datepicker-rails' #选时间日期的

gem 'jquery-ui-rails' #ajax拖拽UI,可以直接用鼠标拖拽排序

gem 'ckeditor' #富文本编辑

gem 'ransack' #模糊搜索

gem 'chart-js-rails' #制作图标

gem 'social-share-button'

gem 'ranked-model'
gem 'acts_as_list' #管理员可以在后台自定义列表的现实顺序

gem 'rails-i18n'

gem 'aasm'

gem 'letter_opener' #寄信预览
gem 'premailer-rails' #自动将CSS中转化为inline css

gem 'faker' #产生假资料

gem 'sidekiq' #使用redis数据库的异步处理
gem 'delayed_job' #使用关联式数据库的异步处理

gem 'paranoia' #软删除
gem 'paper_trail' #版本控制

gem 'seo_helper'
gem 'sitemap_generator' #提交sitemap给搜索引擎,让搜索引擎知道网站内有哪些连结,哪些连结是相对重要的。。。

gem 'rubyzip'
gem 'axlsx'
gem 'axlsx_rails' #以xlsx格式汇出Excel文件

效能提升:
gem 'bullet' #侦测效能问题的

部署:
gem 'capistrano'

API:
gem 'rest-client' #可以用Ruby发送http请求

自动化测试:
gem 'rspec-rails' #写测试的
gem 'capybara' #搭配rspec进行feature spec测试
gem 'byebug'

网站安全:
gem 'brakeman' #检测代码漏洞
gem 'bundler-audit' #检查套件有没有漏洞需要升级
gem 'rack-attack' #可以设定当特定IP地址在某一段时间内存取太多次的话,自动封锁
9.用的哪个软件来做需求分析?(问ihower有哪些软件)
任务拆分、用户故事
growthack,landingpage, onboarding
tower线上项目管理软件

13

14.全栈营课程回顾:你都学到了哪些东西?

Ruby基础知识
做了一个招聘网站、一个购物网站
ajax交互式网页
API
rails 自动化测试
数据库基础
代码重构和效能提升
rails网站完全
SEO搜索引擎优化
rails部署

网络基础知识

项目管理:核心是时间管理
growth hack 增长黑客

11.自己平时还学习了哪些编程方面的东西?都浏览哪些网站?
《Ruby基础教程》《Ruby on rails tutorial》《rails guides》
w3schools.com的HTML/CSS/JS/SQL/BOOTSTRAP/JQUERY,
简书、sitepoint上面的文章质量比较高
阮一峰的博客

Comments

comments powered by Disqus