[](https://)# 面試題集錦
###### tags: `Astro Camp`
- 面試時常常用的模式
- 直接在白板上做
- 用面試公司給的電腦操作
- 面試準備
- 公司老闆的名字,可以把公司人員關係圖畫一下
- 先用用看公司的產品,看看有沒有什麼 bug 或錯字
- 想想如果是自己遇到這些 bug 會怎麼處理
- 畫出處理問題的流程圖,到時候面試順著這個流程問面試官問題
:::warning
- 題目格式
1. 題目顏色 `<font color=#6A7></font>`
2. 回答顏色預設
- 題目使用說明
1. 看到沒在文件中的題目,丟上來
2. 開始解題時,在題目後標註姓名,再開始解
3. 同一題可重複解,做為大家參考
4. 發現有重複的題目就麻煩刪掉囉
:::
## 範例題目
1. [Single Number](https://leetcode.com/problems/single-number/)
```ruby=
# solution 1
def single_number(nums)
result = []
nums.each do |num|
if result.include? num
result.delete num
else
result << num
end
end
result[0]
end
# solution 2
def single_number(nums)
2 * nums.uniq.sum - nums.sum
end
```
3. <font color=#6A7>把所有位數相加成個位數字</font>
4. <font color=#6A7>[算出差哪個數](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/)</font>
```ruby=
[*1..nums.size] - nums
```
6. <font color=#6A7>有個農場養了很多隻羊</font>
第一年初有一對剛誕生的小羊
第二年之後 (第三年初) 他們可以生育
每年每對可生育的羊會生下一對小羊
假設羊永遠不會死亡
第n年有幾對羊 / 到n年後每一年會有幾對羊
```ruby=
# 普通人 solution
def sheep_factor(n)
arr = [1, 1]
(n-2).times {arr << arr[-2] + arr[-1]}
arr[0..n] # 到n年後每一年會有幾對羊
arr[n] # 第n年有幾對羊
end
```
5. <font color=#6A7>費氏數列</font>
- 差不多同上題,差別在`arr = [0, 1]`
| 參數 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 結果 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | ... |
- 遞迴寫法(參考)
```ruby=
def fibonacci(number)
return number if number < 2
fibonacci(number - 1) + fibonacci(number - 2)
end
```
- 迴圈寫法(參考)
```ruby=
def fibonacci(number)
return number if number < 2
front, back = 0, 1
2.upto(number) {front, back = back, front + back}
back
end
```
## 綜合問題
1. <font color=#6A7>MVC 架構的優缺點?</font>
- 每個功能層是分離的,在實際工作時,也可以比照相同的方式,將工程師、設計師的負責部分切開,較容易多人協作,開發速度更快
- 重複使用已寫好的程式碼:由於 MVC 三塊彼此獨立、各司其職,你可以使用同一套 model,針對使用場景不一樣,產出不同的 view 來呈現適合的資料,最大化程式碼的使用效率
- 須留意的地方:若負責的人搞不懂 MVC 三者間的因果關係,就可能設計不良、或是使效能變差,無法發揮這軟體架構的好處。
2. <font color=#6A7>MVC 是什麼?</font>
- MVC是一種軟體架構(也可稱為軟體設計模式),分為三大功能層 Model,View,Controller。
3. <font color=#6A7>請說明 MVC 個別的功能</font>
- Model(不等於資料庫)
- Na : 邏輯層,編寫應用程式應有之功能,資料庫管理及設計之區塊。
- 資料的管理(例如與資料庫的溝通) , 演算法邏輯(商業邏輯) , 物件結構定義。
- 例子:檢查登入帳號的類型,並依此開放不同權限。
- View
- Na : 表現層,負責管理畫面的呈現,框架中,HTML template 會有需要以動態顯示資料的情況,可再進一步利用運用樣板引擎 (template engine) 將資料帶入 template。(template engine例如erb)
- 呈現給使用者看、操作的介面 。
- Controller
- 依據傳入的資料該怎麼運作、程式流程的控制、該回傳給使用者什麼資料等
- Na : 管理使用者互動邏輯,應用程式收發 request/response 的核心,request會先發給controller,controller向model查詢,結果傳向View產生template呈現給使用者。Controller上可設計許多action來控管程式使用流程,例如是否有登入,或是否可修改資料等。
- 例子:使用者是否需要先登入 (認證) 才可以看到網頁內容?
5. <font color=#6A7>CSRF 攻擊是什麼,Rails 裡面怎麼避免這狀況?</font>
- CSRF = 跨站請求偽造,是利用使用者的瀏覽器存有的Cookie攻擊,例如在抽獎網站內有個`<a href='https://myblog.com/posts/delete?id=2'>點我抽iphone</a>`,然後你剛好有myblog的cookie點下去就直接刪掉你的部落格文章了(欺騙使用者的瀏覽器,讓其以使用者的名義執行操作。)
- Rails內只要是POST request就必須加上authenticity_token,如果沒有的話ActionController就會丟錯誤,每個layout裡面也有`<%= csrf_meta_tags %>`是給你在寫JS的時候去讀取用的
- Na: 非 GET 的操作,都加上額外的 token 驗證碼參數,檢查用戶瀏覽器當初真的是從網站上的某個表單送出的,而不是不小心觸發的 CSRF 攻擊。這個是Rails內建的功能。
6. <font color=#6A7>Webpacker 打包後可以在 app/ javascripts 下的檔案用 jQuery ,但在瀏覽器的 console 就不能用了?</font>
- ==待確認==
- webpack 打包後會有一個application.js,這個檔案是專案所有的 JS 集合體,在開發的時候可以用是因為還沒有被打包,打包之後全部都會透過 webpack 轉譯成一般的 JS,所以瀏覽器只看得懂 Vanilla JS
7. <font color=#6A7>cdn 是什麼?</font>
- CDN = Content Delivery Network 或 Content Distribution Network
- 負責內容的傳遞,當用戶跟伺服器主機距離很遠的時候,傳遞的速度可能會比較久,CDN 可以達到分流跟突破地域限制的目的,CDN 之間也可互相快取、緩存資料,用戶可以從離他最近的 CDN 去 request 所需的內容
- 簡單來說,常見的作法是把不常變動的檔案 (如圖片檔, JS, CSS 檔案等等) 會放在 CDN 上,就不會從 server 端下載檔案至 client 端,加快使用者下載檔案的速度
- 優點一:減少 server 端對外的流量及費用,因為內對外的流量要額外計費。
- 優點二:增加使用者體驗 (UX)。
- 缺點一:每次更新 CDN 的內容達一定次數時要額外費用。
- 缺點二:更新完後要等全世界的 CDN 站點同步資料需要一段時間。
- ==Na==
- 是指一組分佈在不同地理位置的伺服器,協同工作以提供網際網路內容的快速交付。允許快速傳輸載入網際網路內容所需的資源,包括 HTML 頁面、javascript 檔、樣式表、圖像和視訊。
- 在其核心,CDN 是共同連結的伺服器網路,目標是盡可能快速、便宜、可靠且安全地傳遞內容。為了改善速度和連線性,CDN 會將伺服器置於不同網路之間的交換點。
- 這些網際網路交換點 (IXPs) 是不同網際網路提供商連接的主要位置,以便彼此提供對來自其不同網路的流量的訪問。連線到這些高速且高度互連的位置後,CDN 提供者就能夠以高速資料傳遞過程來減少成本和傳輸時間。
8. <font color=#6A7>cookie 跟 session 是什麼?</font>
- ==待確認== (瀏覽器的 session storage)
- 因為HTTP是沒有狀態的,為了將狀態保留,所以有了cookie,主要是存在client端,cookie藏在header中,用來在不同的request之間識別用戶資訊。
- session 是用來彌補 cookie 的不足,cookie 的缺點在於 size 不能過大,不然每次 request 會影響到傳輸的速度,而且使用者可以修改 cookie 的內容,所以不能放太多資料也不能放有安全性疑慮的資料,只能儲存容量小、較無意義的資訊,原本放在 cookie 的資訊就改放在 server 端使用 session 的方式儲存,再產生一組 session key/id,塞給 cookie,這樣好處是可以避免 cookie 資訊過多,而且使用者無法修改資訊。
9. <font color=#6A7>cookie 的儲存位置在哪裡?</font>
- 透過加密的方式儲存在客戶端中,可以儲存的位置分別是:記憶體和硬碟。
- 記憶體 cookie 是由瀏覽器維護的,關閉瀏覽器則消失,不同瀏覽器之間的 cookie 無法相互使用。
- 硬碟 cookie 有保存期限,除非過期或手動清理,儲存時間較記憶體 cookie 長。
- 當使用者勾選下次自動登入後,發生什麼事?
- 前一次登入時,伺服器傳送包含登入憑據的 Cookie 到使用者記憶體或硬碟上,第二次登入時,只要 Cookie 尚未到期,則瀏覽器就會傳送此 Cookie 給伺服器驗證。
11. <font color=#6A7>Ajax 是什麼?</font>
- 全名為「Asynchronous JavaScript and XML」(非同步的JavaScript與XML技術),是綜合多項技術的瀏覽器端網頁開發方法。
- 使 Web 應用程式不需要重新讀取整個網頁,瀏覽器就能向伺服器發出非同步請求,即時更動介面或局部內容,讓程式快速回應客戶端的操作。
- 雖然 Ajax 裡的 X 代表 XML,但現今 JSON 是比 XML 更廣泛的被使用。
13. <font color=#6A7>什麼是同步及非同步?</font>
- 同步是一行程式碼執行完畢才會輪到下一行程式碼,此時使用者無法繼續使用網站,必須等工作完成才可以。
- 非同步則是將工作放到背景執行,工作執行完畢會再通知使用者,使用者可以在工作進行中繼續網站。
- 案例:
- JavaScript fetch or 檔案上傳。
- Rails: 轉檔、報表製作、信件寄送。
14. <font color=#6A7>請你描述透過瀏覽器連上一個網站,中間發生了什麼事情(請說明當 end user 進入網站到網站回應,這中間發生什麼事情?)</font>
- 特別注意request header與response header裡面的參數功能為何
- [參考連結](https://blog.techbridge.cc/2017/09/16/frontend-backend-mvc/)
15. <font color=#6A7>試說明在一個部落格中進入文章列表的 request/response 流程</font>
## 網路相關
1. <font color=#6A7>HTTP Method / RESTful 簡介</font>
- ==Na==
- HTTP 定義了一組能令給特定資源(URL),執行特定操作的請求方法(request methods),白話一點,例如 GET 與 POST 就是,實務上常見方法也是這兩項。
- Representational State Transfer,縮寫:REST,是一種全球資訊(www)網軟體架構風格(風格不是標準),以這種風格設計的系統,可以稱為RESTful(就像英文中beauty我們叫beautiful),這種風格設計的系統框架最為有名的就是Rails,充分地利用到上面說的HTTP Method。(相關資料還很多)
3. <font color=#6A7>GET 跟 POST 方法的差異?</font>
- ==Na==
- GET 只能單純讀取資料,不應該修改資料。而 POST 則是執行某個操作,會修改到伺服器的資料。(專案有做到後端的,應該可以很有自信的回答這句話,我絕對沒有在模仿誰....)
- ==John==
- 設計原意:GET 用來向資料來源要求取得資料,POST 用來傳遞資料給伺服器以建立或更新伺服器內的資料
- 存入書籤:GET 可以 POST 不能
- 瀏覽器快取:GET 會被瀏覽器主動存入 cache,POST 不會,除非手動設置
- 參數數據類型:GET 只能傳送 ASCII 字元,POST 不受限制
- 瀏覽紀錄:GET 參數會被完整保留在瀏覽器歷史記錄裡,POST 中的參數不會被保留。
- 參數長度:GET 在 URL 中傳送的參數依瀏覽器跟 Server 不同有長度限制,POST沒有。
- 安全:POST 只比 GET 安全一點點,GET 的參數會直接在 URL 上而且會有紀錄,POST 會放在 Request 的封包(Request-line 和 Message-body)裡面,不會被瀏覽器或伺服器的 log 記錄下來,但其實還是都看得到。
- 傳遞方式:GET 參數通過 URL 傳遞,POST 放在Request body 中。
- 重新整理或按上一頁:GET 不會有問題但 POST 會出現參數將被重新送出(re-submitted)的提示。
- 參考:[https://kknews.cc/code/pp4k3z8.html](https://kknews.cc/code/pp4k3z8.html)
- 參考:[medium](https://totoroliu.medium.com/http-post-%E5%92%8C-get-%E5%B7%AE%E7%95%B0-928829d29914)
- 參考:[W3School](https://www.w3schools.com/tags/ref_httpmethods.asp)
4. <font color=#6A7>Restful API 是什麼?這樣設計有什麼好處?</font>
- ==Tang==
- 一套透過 HTTP method 的動詞,以及 CRUD action 設計的 API 規格,避免自訂 method 與 action 產出混亂的 API。
- Na: 參考第一題,依照REST這個風格打照出來的API,因為充分運用到HTTP 協定,所以如果是一組資料要給不同平台讀取使用時,這種風格設計的API,較易讓個平台輕易讀取使用。
5. <font color=#6A7>CORS 是什麼?</font>
- Na: Cross-Origin Resource Sharing(跨“來源”資源共享),賦予網站伺服器跨網域存取控制能力,使其能安全地跨網域傳輸資料。例如:img src= ,src我們輸入網址後,就是一種CORS。
https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CORS
7. <font color=#6A7>SPA 是什麼?</font>
- 精油芳香按摩...spa...開玩笑的
https://zh.wikipedia.org/wiki/%E5%8D%95%E9%A1%B5%E5%BA%94%E7%94%A8
一個大家的在用的程式,gmail就是這樣的一種設計方式,相對設計方式就是多頁式,Multi-Page,是一種網頁設計模型。
多頁式:一個一個頁面切換,點選一個按鈕,重新載入另外一個頁面。
單頁式:所有資料都放在同一個頁面,不需要換頁,使用者可以在單一頁面裡瀏覽全部內容。
9. <font color=#6A7>http 和 https 的差異?</font>
- 有S跟沒S....
超文本傳輸協定 => HTTP HyperText Transfer Protocol。
超級文字傳輸安全協定 => HTTPS HyperText Transfer Protocol Secure(真的就差有沒有S呀),HTTPS 透過 HTTP 進行通訊,但通訊過程使用 SSL/TLS 進行加密,在 HTTP 之上定義了相對安全的資料傳輸方法。
SSL/TLS:分別查一下wiki吧(避免被問這個,跟我一樣回答一個有S一個沒有就好。)
11. <font color=#6A7>什麼是 TCP/IP ?</font>
- ==Huihsin==
- 全名為 TCP/IP Protocol Suite,或 [TCP/IP Protocols](https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F),是網際網路的通訊協議標準,由 OSI 七層協定簡化而來。
- 將複雜的網路分為四層,工作類型比較相近的歸類於一群,經過每一層傳輸時,都會在資料上加上一些資訊,好讓對方電腦能夠解讀。分別為:
- 應用層 application layer
- 傳輸層 transport layer
- 網路互連層 internet layer
- 網路存取(連結)層 Network Access layer
- [鳥哥文章](http://linux.vbird.org/linux_server/0110network_basic.php#whatisnetwork_tcpip)
13. <font color=#6A7>DNS 是什麼?</font>
- ==Tang==
- 網域名稱系統(Domain Name System)
- 將可讀取的網域名稱 (例如,www.amazon.com) 轉換為機器可讀取的 IP 地址 (例如,192.0.2.44)。
- 管理顯示主機名稱與 IP 位址關係的資料庫。
14. <font color=#6A7>proxy 跟 reverse proxy 是什麼?</font>
- proxy : 代理伺服器,假設今天學弟在家裡查資料,從自己電腦發出一個請求後,網路線開始執行這個需求,中間就會經過這個代理伺服器,代替學弟查詢資料,查到資料後,自己也備份一份在自己的記憶體裡,回傳給學弟,早期網路不夠快時,這種方式會有一種"加速"的假象,因為代理伺服器發現自己記憶體中有另一個人要查的資料跟學弟一樣時,就可以不用再向上查詢就可回傳。 由於現在網速夠快了,代理伺服器較明顯的功用是類似防火牆的功用,由於每個人自己的電腦連網路,一定會經過代理伺服器,如果網站或從代理伺服器外的位置想要攻擊你,攻擊的會是代理伺服器,而不是直接攻擊你。
- reverse proxy :反向代理, 前面是正向代理,被查資料的人不知道是誰查的,而這邊相反,讓查詢資料的人不知道真正的資料來源,避免真正的伺服器被攻擊,前面的CDN就是反向代理結合DNS的一種應用方式。
15. <font color=#6A7>Nginx 跟 Apache 是什麼?</font>
- ==Tang==總之都是 Web Server
- ==Ngnix==
- Web Server,它的功能是接受 http request 並回覆 http response , Nginx 本身和 Ruby 沒有關係,通常使用 Nginx 時還會搭配 ==Passenger 或 Puma 這一個 App Server==,它可以管理 Rails 的 process 數量,同時 App Server 符合 Rack 的規範所以可以跟符合 Rack 規範的 Web Application (例如 Rails 溝通)。
- ==Apache==
- Web Server
16. <font color=#6A7>HTTP 狀態碼 200/400/500? </font>
- ==Tang==
- 2XX Successful 成功
- 這類的狀態碼表示伺服器成功接收到用戶端的要求、理解用戶端要求、以及接受用戶端要求。
- 200
- OK - 確定。用戶端要求成功。
- 4XX Client Error 用戶端錯誤
- 這代表錯誤發生,且這錯誤的發生的原因跟「用戶端」有關。例如:用戶端可能連結到不存在的頁面、用戶端的權限不足、或可能未提供有效的驗證資訊(輸入的帳號、密碼錯誤)。
- 400
- Bad Request - 錯誤的要求。
- 5XX Server Error 伺服器錯誤
- 這代表錯誤發生,且這錯誤發生的原因跟「伺服器」有關。伺服器因為發生錯誤或例外狀況(Exception)而無法完成要求(Request)時,就會回應 5xx 的錯誤,且這就跟伺服器有關。
- 500
- Internal Server Error - 內部伺服器錯誤。
17. <font color=#6A7>GCP 和 AWS 的幾個主要服務?</font>
- ==Tang==
- ==AWS==
- 有 90 種以上服務,僅列舉本屆有使用到的服務簡單介紹
- S3
- Amazon Simple Storage Service (Amazon S3)
- 是物件檔案儲存服務(key-value,但有版本的觀念)
- 單一檔案大小上限可以從 0 Byes 到 5 TB
- 沒有容量上傳上限
- 上傳的檔案會被分配到指定的儲存槽(Bucket)中
- 檔案一律存在 bucket 中 (Bucket 裏面無法再放一個 bucket,但可以放 folder)
- 有命名空間的概念,上傳的檔案都會在對應的命名空間下。若有開放對外存取則可直接透過網路連結取得該資源。
- 當上傳成功會獲得 HTTP Status 為 200 的請求回應,表示上傳成功。
- EC2
- Amazon Elastic Compute Cloud (Amazon EC2)
- 虛擬主機服務
- 可增加硬體需求 (CPU, Memory),但須等待一段時間才會生效
- Route 53
- DNS 服務
- 輸入網域名稱可連到指定的 IP 地址
## Ruby
1. <font color=#6A7>你從其他程式語言轉到 Ruby 之後,覺得最大的差別是什麼?</font>
- 參考答案:容易閱讀、語法像口語的英文
- Ruby 像人體一樣,外表看似簡單,卻有著複雜的內裡--Matz 於 2000 年 5 月 12 日 Ruby-Talk 郵件論壇。
2. <font color=#6A7>試說明在 Ruby 裡常數 (constant) 跟變數 (variable) 的差別</font>
- 常數可以修改,因為開放類別,類別的命名是常數,所以要做成可以修改才能使用
- 常數大寫開頭、變數小寫開頭
- 常數是大寫英文字母開頭,不需要特別宣告,包括類別與方法都為常數。常數的內容可以做修改,或者整個更換(會出現警告訊息);變數同樣不需要宣告,又可分區域變數、全域變數、實體變數,其中只有實體變數與全域變數的預設值為nil,最後還有虛擬變數(nil, false, true, self)
- 如果不想常常變更的數值,請用常數來做定義,會常做更換的數值請用變數來做定義。
3. <font color=#6A7>試說明實體變數 (instance variable) 跟類別變數 (class variable) 的差別</font>
- ==Huihsin==
- 實體變數:前面加上 @ ,預設值 nil,活在每個實體裡的變數,而且每個實體之間互不影響。
- 類別變數:前面加上 @@,沒有預設值,類別變數則是同一個類別及其子類別中所有方法共用的變數,當值改變時,所有方法都會受到影響。
舉一個例子
```ruby=
class You
@@age = 20
def self.age
p "#{@@age}歲"
end
end
You.age #=>20歲
#接著
class Me << You
@@age = 40
def self.age
p "#{@@age}歲"
end
end
Me.age #=> 40歲
You.age #=> 40歲
#所以類別變數的特性: 存在class內,而且隨著class被繼承,還會傳遞到下一個class。
#重要的是,只要是同一個繼承練上,類別變數就會被互相干擾
#so寧願用實體變數,也別用類別變數
```
原因
```ruby=
class You
@age = 20
def self.age
p "#{@@age}歲"
end
end
class Me
@age = 40
def self.age
p "#{@@age}歲"
end
end
You.age #=>20歲
Me.age #=>40歲
同第一條同學提供的說明。
```
4. <font color=#6A7>試說明實體方法 (instance method) 跟類別方法 (class method) 的差別</font>
- 實體方法與類別方法的差異為作用的對象不同,實體方法是作用在實體上,而類別方法是作用在類別上。在Ruby中定義的方式也不同,定義類別方法則需要以self開頭或使用class << self裡面再包方法,而實體方法則不用。
```ruby=
#一樣舉例給大家
class UsersController < ApplicationController
def index
@users = User.all #撈出所有的user
end
end
#all 作用在User這個類別身上,所以是類別方法。
class Human
def initialize(name)
@name = name
end
def say_my_name
puts "I'm #{@name}."
end
end
John = Human.new('John')
Mary = Human.new('瑪麗')
John.say_my_name # => I'm John.
Mary.say_my_name # => I'm 瑪麗.
Human.say_my_name # => 噴錯(NoMethodError)
#say_my_name只能做用於實體上,所以為實體方法。
```
5. <font color=#6A7>什麼是 Rack ?</font>
- [Rack](https://github.com/rack/rack) 提供了一個介面,讓你的 Ruby 程式可以與 Web Server 之間進行溝通,提供一個能夠回應 call 方法的物件,並且回傳一個包含以下三個元素的陣列:
- HTTP 狀態(數字型態,例如正常回應是 200、找不到頁面是 404、伺服器錯誤是 500)。
- HTTP Header(Hash 型態)。
- Body(陣列型態,或是只要是個可以回應 each 方法的物件也可)。
- 像是 Sinatra、Rails,它們都是一種 Rack 的應用程式。
6. <font color=#6A7>請問 Rack 跟 Rails 的關係是什麼?</font>
- ==Vincent==
- Rails是一個基於Rack的加料版框架,提供豐富功能,一次滿足,缺點是比較肥,但相對的開發速度快
- Rack 應用程式是怎麼運作的,雖然對開發 Rails 網站不見得有直接的幫助,但至少可以對 Rails 的運作以及啟動流程有更清楚的..龍哥<<為自己學Ruby on Rails>>
7. <font color=#6A7>試說明在 Ruby 裡 public, protected 與 private method 的差別</font>
- Ruby裡面預設為Public方法,任何種類都能存取它
- private方法則不能明確的指出接收者是誰,只有類別內部與子類別能存取
- 三種方法都可以在class內部被呼叫
- 只有 public 方法能在外部被呼叫
- 在內部呼叫 private 方法的時候不能夠有 receiver
- protected 方法則沒有這種限制。
- 建議還是看一下這篇
- https://kaochenlong.com/2011/07/26/public-protected-and-private-method-in-ruby/
8. <font color=#6A7>試說明類別(class)跟模組(module)的差別</font>
- 模組沒辦法 new 一個新的實體出來。
- 模組沒辦法繼承別的模組。
- 模組是類別的上層類別。
- 可在irb環境中輸入`Class.instance_methods - Module.instance_methods`查看差別
-Na: 當我們要建立一個功能,如果在其他地方也用得到這個功能,請建立模組。
9. <font color=#6A7>在 Ruby 引入模組有兩種方式:include, extend,兩種方法的差別?</font>
- ==Robert==
- include 是在引入實體方法
- extend 是引入類別方法
- ==John==
- 用 include 引入後可以用實體方法的方式呼叫被引入模組中的方法
- 用 extend 引入後則用類別方法的方式呼叫被引入模組中的方法
- ==混亂邪惡==
- 如果我的類別想要一個模組來增加實體方法,我會用include
- 如果我的類別想要一個模組來增加類別方法,我會用extend
14. <font color=#6A7>Ruby 的include, extend, require,差別是什麼?</font>
- ==參考解答==
- Module 通常是很多方法的集合體
- Include: 當一個 class 使用 include 引入 Module 的時候,會將 Module 內的 method 增加為自己的 instance method。
- Extend: 將 Module 引入到 class 的 singleton class 上方。也就是說 Module 的 method 會變成 class mehtod。
- Require 方法允許你載入外部的Library,聰明的是他會防止你重複加載一樣的外部函式庫(常用在引用其他的檔案,就可以用它裡面的東西)
15. <font color=#6A7>hash[:key] 跟 hash["key"] 有什麼差別?</font>
- ==Robert==
- 在 Ruby 中只能用符號當作 key 來索取值
- 但在 Rails 中,因為 Active support 模組中提供了 "HashWithIndifferent" 這個方法,讓你不管是使用符號或是字串當作 key 都可以拿到一樣的值
16. <font color=#6A7>如果要在 1 到 100 的數字當中,任意取出 5 個不重複的亂數,你會怎麼做?</font>
- sample `[*1..100].sample(5)`
- shuffle + 取五個 `[*1..100].shuffle.first(5)`
20. <font color=#6A7>你對前端還是後端比較有興趣?為什麼?</font>
- 「小孩子才做選擇」
- 千萬不要傻傻的真的選啊,就說都喜歡,而且就以我們這種菜鳥工程師來說沒什麼好挑的
21. <font color=#6A7>以下的 message_params 是做什麼用途?為什麼需要這個東西?</font>
```ruby
# frozen_string_literal: true
class MessagesController < ApplicationController
# ...略...
private
def message_params
params.require(:message).permit(:title, :category, :email, :content)
end
end
```
- ==Tang==
- Strong Parameters
- 定義一個 method 來回傳允許通過的 params
- 將 params 裡面符合 :message 的 hash 取出來
- permit 就是設定有哪些參數可以傳入,例如上面沒有寫參數,就算你從 http request 當中傳入,也會回傳 nil 當做沒東西。
- 只允許 params 中 permit 的資料可以拿來使用及存入資料表,不在允許的資料試圖存入資料表時,會丟出例外錯誤
- 不做的話,使用者可以透過瀏覽器的 devtool 任意新增表單欄位資料,來試圖存入資料至資料表中
- [Rails 當中的 params 是什麼?](https://ithelp.ithome.com.tw/articles/10161397)
- [官方文件](https://api.rubyonrails.org/classes/ActionController/StrongParameters.html)
- permit 做白名單效果
20. <font color=#6A7>What is the direct superclass of the Class class? (Choose one)</font>
- [ ] A. Object
- [x] B. Module (可以在 irb 環境下輸入`Class.superclass`查看)
- [ ] C. BasicObject
- [ ] D. Method
![](https://i.imgur.com/mxZd2zz.png)
21.
```ruby=
class A
def foo
???
end
private
def bar
"baz"
end
end
```
- bar
- self.bar => 要看版本 (Ruby 2.7以上可以使用)
23. <font color=#6A7>Ruby 中字串用 `'...'` 與 `"..."` 差異?</font>
- 單引號會直接完整呈現
- 雙引號可處理字串安插(String Interpolation)`#{...}`
24. <font color=#6A7>Ruby 中的 self 是什麼意思?</font>
- ==Robert==
- self 永遠指向呼叫方法的對象 ( 類別就是類別本身,實體就是實體本身的物件)
- 有時候你會直接呼叫方法,是因為 Ruby 幫你在 Object 類別中做了一個 main 實體然後呼叫方法 ( main.send(:something) )
- 可以試試看在 irb 中印出 `p self #main` ; `p self.class #Object`
- ==參考答案==
- 使用 `self` 定義或呼叫類別方法
- 在類別中 `self` 指向目前的類別,所以類別方法呼叫另一個類別方法時一定要加
- ```ruby=
class Adder
def self.call(*num)
num.inject(:+)
end
end
# class method being called by class
puts Adder.call(1,2,3) # => 6
```
25. <font color=#6A7>Ruby 中 Proc & lambda 的差別?</font>
- ==Robert==
- 參數的嚴格程度 ( lambda 較為嚴格 少傳多傳都會噴錯 )
- 對於 return 的作用範圍 ( Proc 會直接結束整個 function )
- ==參考答案==
- 都是可以讓 Block 物件化的方法
- Proc 的 block 內加入 `return` ,就會立即跳出;Lambda 的 block 內加入 `return` ,會交回控制權,繼續執行方法後續的程式碼
- Lambda 會檢查代入的引數(Argument)數量,但 Proc 不會
- 使用時機:開發工具給別人用的時候比較常用到,像是使用 rspec or other gems;一般的狀況少用,通常是使用別人寫好的工具
- 參考連結
- [Ruby 探索:Blocks 深入淺出](https://5xruby.tw/posts/discover-ruby-block/)
- [Block and Scope](https://www.spreered.com/metaprogramming-ruby-3-block/)
26. <font color=#6A7>什麼是 Ruby 的 Block?</font>
- ==Huihsin==
- 不是物件也不是參數,無法單獨存在,要掛在別人身上(方法、物件),等著被呼叫,例如:`{ }`、`do...end`。
- 使用 yield 方法把控制權轉給 Block 執行(順便把值帶入),執行結束後控制權會再轉回來。
- 預設最後一行的執行結果就是回傳值,Block 內不能使用 return,會造成`LocalJumpError`錯誤。
- 舉例:`list.map { |i| i * 2 }`裡`i`是 Block 裡的區域變數,離開 Block 即失效。
28. <font color=#6A7>Ruby 中的 monkey patch 是什麼?</font>
- ==參考答案==
- ruby 中物件方法繼承自父層,但想要調整方法時可以用 monkey patch 複寫重新定義方法
- 例如 Animal 有個 def run,dog < Animal
- but dog don’t want Animal’s run
- we can rewrite def run in dog class
- super 的[概念](https://medium.com/@chenghsuan.han/ruby-%E8%A6%81%E7%94%A8super-%E9%82%84%E6%98%AFsuper-d24459f03bfb)
- 例如 rewrite devise’s def
- 指執行時期動態改變程式碼
- 先解釋 monkey patch,舉例來說:javascript 是花了短短 10 幾天生出來的,或許會有許多小缺陷,是之後使用者想去改變的,再不改變原本的程式碼條件下做優化。當引入這類工具組或框架程式庫時,就可以全面修正、擴充語言的功能,甚至改變或賦予語言新樣貌。像是Prototype、jQuery程式庫,或後來的Node.js都是具體實例。
- 而 Ruby 中 monkey patch,Ruby 作為動態語言以及擁有非常強大的 meta programming 能力,因此在使用 Monkey Patch 更是異常地簡單與常見。由於這是 Ruby 的特性之一,因此我們可以直接打開一支已存在的 class / module 去增加或修改方法。
- 但容易造成濫用,讓其他共同檔案的人難以預測程式結果、也容易造成濫用或不小心覆蓋原本的功能。
- 此時 Ruby 的另外一項利器便在此發揮作用,那就是 Module ,更容易管理也更為安全。如果不想使用這個 Monkey Patch 了,僅需把 extend 或 include 的地方註解起來即可
29. <font color=#6A7>什麼是類別 Class、物件 Object?差別是什麼</font>
- 這邊先多提一個method,method屬於“定義"出來的,屬於class的一部分。
- class比較像是一個樣板,藍圖,模具,就像蓋一棟房子,房子就屬於物件,依照class蓋出。所以class沒有實體,而物件則就是實體,就比較偏動態的,可能會有所改變,而class較不會。
- 額外:在兩台電腦互傳資料所傳輸的是“物件",而不是類別,另一台所接收到的"資料",字串,數字等都為"物件"
- 若果今天B收到A的一個資料,本身也需要有這個class存在,才能使用, 資料 反序列化 成為物件。
31. <font color=#6A7>什麼是物件導向中的繼承、封裝和多型特性?</font>
32. <font color=#6A7>物件導向中的建構式 (Constructor) 是什麼作用?在 Ruby 中怎麼寫建構式?</font>
33. <font color=#6A7>以下哪些值會被判斷成 false:`1`, ``"test"``, `nil`, `false`, `true`, `""`, `0`</font>
- ==Tang==
- false
- `nil`, `false`
- true
- `1`, `"test"`, `true`, `""`, `0`
34. <font color=#6A7>為什麼用 Symbol?他的特性是什麼?</font>
- ==Tang==
- 不可變動的
- 只會佔用一個記憶體空間,之後再使用都會指向同一個記憶體位置
- 節省記憶體空間(因為只需有一個記憶體位置)
- 處理上速度比較有效率 (直接判斷記憶體位置即可)
36. <font color=#6A7>什麼是 Exception Handling?在 Ruby 中怎麼寫例外處理?什麼情況下會用到?</font>
37.
```ruby=
module Cat
def say
'Hi!'
end
end
module Bird
def say
'Hello!'
end
end
class Dog
extend Cat
include Bird
def say
'Hey!'
end
end
```
- 請問下方結果為何:
```ruby=
puts Dog.say
puts Dog.new.say
```
- `puts Dog.say # => Hi!`
(extend 進來的方法會變成類別方法)
- `puts Dog.new.say # => Hey!`
(雖然 include 進來的方法是實體方法,但被 Dog 自己的同名實體方法蓋掉了)
35. <font color=#6A7>使用者 (User) 有很多個訂單 (order),訂單 (Order) 中有很多商品 (OrderProduct),請問資料的關聯應該如何呈現?</font>
```ruby=
class User < ApplicationRecord
has_many :orders
end
class Order < ApplicationRecord
belongs_to :user
has_many :order_products
end
class OrderProduct < ApplicationRecord
belongs_to :order
end
```
- 如何透過使用者取得該使用者的訂單?
- `current_user.order`, `user.find(id).order`
36. <font color=#6A7>承上題,請問在表單裡該如何還原下方表格?</font>
|order id|order price|product name|
|-|-|-|
```htmlembedded=
<% orders.each do |order| %>
<tr>
<td><%= order.id %></td>
<td><%= order.price %></td>
<td><%= order.order_products.name %></td>
</tr>
<% end %>
```
37. <font color=#6A7>同時執行 10 個執行緒 (Thread),並且每一個執行緒分別針對 counters 的每一個陣列累加 100000 次,請問下面程式 counters 執行結果為何?</font>
```ruby=
threads = []
counters = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
10.times do
threads << Thread.new do
100_000.times do
counters.map! { |counter| counter + 1 }
end
end
end
threads.each(&:join)
puts counters
```
38. <font color=#6A7>今天有一隻小羊 (A),小羊 (A) 一年後會變成大羊 (A),大羊 (A) 一年後會生出小羊 (B),再隔年大羊 (A) 再生出小羊 ©,原先的小羊 (B) 變成大羊 (B)。假設在羊都不會死掉的狀況下,請問 n 年後會有幾隻羊(含大小羊),請用程式遞迴的方式寫出來。</font>
39. <font color=#6A7>each 和 map 的差異?</font>
- ==Tang==
- each 是用來迭代陣列裡面元素,可以對個別元素作想要的處理。
- map 是用來將陣列的每個元素做轉換,新的陣列會根據block裡面的條件來將每個轉換完的元素丟到一個新陣列並回傳。
41. <font color=#6A7>如何實作 Ruby 的 meta programming?</font>
42. <font color=#6A7>請說明"在 Ruby 裡面幾乎所有東西都是物件"這句話</font>
- ==Tang==
- 在物件導向程式中,物件(Object)是一個類別(Class)所產生的實體(Instance),有其狀態和行為。
- 而在Ruby中,所有的類別都是Class這個類別所製造出來的實體,所以他們也都是物件。
- 少數如區塊(Block)、方法(method)等不是物件,不屬於任何一個類別。
- [Ruby on Rails面試題挑戰 Day03 - 在Ruby當中幾乎所有的東西都是物件?](https://ithelp.ithome.com.tw/articles/10235284)
43. <font color=#6A7>Ruby 是一個靜態型別(statically typed)語言還是動態型別(dynamically typed)語言?</font>
- ==Tang==
- 動態型別語言
- [Day30 - Ruby的鴨子型別Duck Type + 完賽感言!](https://ithelp.ithome.com.tw/articles/10207418)
45. <font color=#6A7>試說明 Ruby 的 getters 和 setters</font>
- ==Robert==
- attr_reader -> getter
- attr_writer -> setter
- 賦予某個屬性(物件的實體變數)變更(setter)&讀取(getter)功能
47. <font color=#6A7>Ruby 允許多重繼承(multiple inheritances)嗎?</font>
- ==John==
- Ruby 不允許多重繼承,只可以單繼承(一個類別 Class 只能繼承自另一個 Class 或 Module),但可以用 composition(include 或 extend) 建構更複雜的類別
48. <font color=#6A7>Ruby 是強型別語言還是弱型別語言(strongly or weakly typed)?</font>
49. <font color=#6A7>要如何在 Ruby 類別中宣告一個 constructor?</font>
- ==Robert==
- 看不懂,是要問初始化嗎? (initialize)
51. <font color=#6A7>yield 在 Ruby 中的用處?</font>
- ==Robert==
- 我自己覺得很像媽媽桑,當你的程式碼走到這邊的時候會帶你去找小姐(block),block 沒有媽媽桑的引領你是找不到他的
- 轉交控制權給予 block 並執行 block 內的程式碼並自動 return回來(可以帶參數過去唷~)
53. <font color=#6A7>要如何在 Ruby 中使用 singletons</font>
- ==Robert==
```ruby
class Dog; end
golf = Dog.new
def golf.bark
p 'wowowo'
end
golf.bark # 'wowowo'
bad_dog = Dog.new
bad_dog.bark # NoMethodError
golf.singleton_methods #[:bark]
bad_dog.singleton_method #[]
```
55. <font color=#6A7>試解釋何謂 Singleton Method?</font>
- ==Robert==
- 延續上面的程式碼,可以看到 golf 自己有屬於自己的方法,但是 bad_dog 沒有,我們就可以說 bark 是屬於 golf 的 singleton_method
- singelton method 看字面就是單屬於你個人的方法,單一模式,類別方法也是 singelton method 唷!
57. <font color=#6A7>試說明 Ruby 裡 Symbol 與 String 的差別?</font>
- ==Robert==
- 記憶體位置(Object_id)
- 可變性 ( String 可以加上 freeze )
- 讀取的速度( 跟記憶體位置有關係 )
- ==Tang==
- symbol 沒有提供修改內容的 method
- object_id 固定
- string 有提供修改內容的 method
- ojbect_id 不固定,但可以用 freeze 方法固定 object_id
58. <font color=#6A7>在 Ruby 的物件模型中,最上層物件是 BasicObject?</font>
59. <font color=#6A7>說明 irb 與 bundle exec irb 的差別?</font>
- ==Robert==
- 差別在於 `bundle exec irb` 會幫你自動載入本地的 Gemfile 可以直接簡單的 require
- `irb` 則需要多下一個指令把 Gemfile 拉進來在 require
- [參考資料](https://www.justinweiss.com/articles/what-are-the-differences-between-irb/)
60. <font color=#6A7>如何讓類別裡的實體方法同時也可以是類別方法?</font>
## Rails
1. <font color=#6A7>任意舉出三個你在開發 Rails 專案時常用到的 gem 並說明哪裡厲害、為何使用?</font>
- ==John==
- devise:能夠快速建立出會員系統模板,也可以根據需求客製化,把會員系統所需的 route, model, controller, view 都幫你建好,連 config 的 initailizer 都幫你把基底寫好,可隨時調整。devise 提供的功能十分完整,除了最基本的會員登入、註冊、修改資料(CRUD)之外,像是確認信、第三方登入、會員權限上鎖等功能也一併提供給使用者使用。有 devise 自動產出的東西當基礎,進而延伸,可減少專案會員系統開發的時間。
- paranoia:假刪除
- kaminari:分頁功能
3. <font color=#6A7>試說明 Rails 中模組命名,為何有 `Active xxx` 與 `Action xxx` 的差別?</font>
- [What is the naming rule behind Rails' parts?](https://stackoverflow.com/questions/23747162/what-is-the-naming-rule-behind-rails-parts/23747647#23747647)
- [Rails README](https://github.com/rails/rails)
- ==John==
- Action 開頭的模組代表 controller 層和 view 層,負責處理 HTTP requests 並提供適當的 response
- Active 開頭的模組代表為 model 層,適用於你的 model 或包裹在專案內特定商業邏輯中
4. <font color=#6A7>ActiveRecord 在關聯式資料庫的命名慣例</font>
| Model 類別名稱 | 檔案名稱 | 資料表名稱 |
| -------- | -------- | -------- |
| User | user.rb | users |
| LineItem | line_item.rb | line_items|
4. <font color=#6A7>一定要用 devise 嗎?不用現成的 gem 你會怎麼做</font>
6. <font color=#6A7>如果一個資料庫的命名習慣不符合 Rails 慣例,有辦法跟 Rails 整合嗎?怎麼做?</font>
7. <font color=#6A7>User.find_by(id: 1) 跟 User.find(1) 兩種寫法差別?</font>
- 錯誤訊息
- `find_by` 僅會回傳 `nil`
- `find` 會噴錯 `ActiveRecord::RecordNotFound`
- 可帶的參數
8. <font color=#6A7>試說明 find, find_by 跟 where 在 ActiveRecord 中的差異</font>
9. <font color=#6A7>試說明 select, map 跟 collect 的差異</font>
10. <font color=#6A7>migration file 跟 schema.rb 的差別</font>
11. <font color=#6A7>Gemfile 裡 gem 'sass-rails','~> 4.0.3' 後面的 ~> 4.0.3 代表什麼</font>
- ==Tang==
- 選用 4.0.3 以上的版本
- 4、0、3這三個數字分別是指主要版號、次要版號和修訂版號,主要版號通常無法向下相容,其他兩個通常可以。
13. <font color=#6A7>rails helper 中 login_path 跟 login_url 有什麼不同</font>
- 對外用 url,對內用 path 足已
14. <font color=#6A7>Rails Model 的 User.new, User.create, User.build 有什麼異同?</font>
- ==Tang==
- User.new
- 僅物件的建立
- User.create
- 物件的建立 + .save
- User.build
- 僅物件的建立,但多用於一對多
15. <font color=#6A7>簡述 N+1 問題,要怎麼解決?</font>
- ==Robert==
- 針對具有關聯的資料表進行額外搜索時產生的問題,N是本體的關聯資料數量造成的搜索次數,1則是本體的搜索次數
- 解決方式:在搜索本體時加入 includes(:data_table_name),在第一次搜索時就引入,讓後面會產生的 N 次搜索消失
16. <font color=#6A7>一對一關聯與一對多關聯產生的 method 異同?</font>
- ==Tang==
- 一對一 / has_one :store
* store 查詢
* store= 設定
* bulid_store 需要使用.save才會寫進資料庫
* create_store 會直接寫進資料庫裡
- 一對多 / has_many :products
* products 查詢
* products= 設定
* bulid 需要使用.save才會寫進資料庫
* create 會直接寫進資料庫裡
18. <font color=#6A7>Sidekiq 用法</font>
19. <font color=#6A7>sidekiq 跟 redis 是什麼</font>
20. <font color=#6A7>Redis 寫在哪裡? Sidekiq 跟 Redis 的關係?</font>
21. <font color=#6A7>Active Job 跟 Sidekiq 差在哪?</font>
- ==Robert==
- Active Job 會因為伺服器休眠或是關閉導致 Reset 而 Sidekiq 則是交給另一個伺服器做管理避免任務的延宕
22. <font color=#6A7>Nokogiri 用來幹嘛?</font>
- ==Robert==
- 網頁爬蟲,針對網頁中的 HTMLtag CSS 篩選出想要的資料,可以大幅減少自行查找的時間
23. <font color=#6A7>Rails 裡面的 ORM 語法 includes 是怎麼執行查詢?</font>
24. <font color=#6A7>enum 跟 AASM 相關問題</font>
25. <font color=#6A7>delete 跟 destroy 的差異?</font>
- ==Robert==
- delete 不會執行 callback function
- destroy 會執行 ( lifecycle 中的 hook )
26. <font color=#6A7>ORM 應用中什麼時候用 includes 什麼時候 joins?</font>
27. <font color=#6A7>ORM 中 includes 跟 joins 的差異?</font>
28. <font color=#6A7>用 paranoia 再使用 delete / destroy 有什麼問題嗎?</font>
- dependent: :destroy associations are deleted when performing soft-destroys 😱 requiring any dependent records to also be acts\_as\_paranoid to avoid losing data. 😬
- [discard#why-not-paranoia-or-acts_as_paranoid](https://github.com/jhawthorn/discard#why-not-paranoia-or-acts_as_paranoid)
29. <font color=#6A7>ORM 應用中什麼時候用 pluck 什麼時候 map?</font>
- ==參考答案==
- pluck:
- SQL 只會查詢指定欄位的值,並回傳一個新的該欄位資料 array
- 不經過 active record
- 在撈很多次的情況下,每次都要跟資料庫要,效率比map差
- 只需要特定欄位的陣列時,用pluck
- ```ruby=
Product.all.pluck(:id)
# => SELECT 'products'.'id' FROM 'products'
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10...]
```
- map:
- SQL會找整個資料表的資料,並回傳一個新的該欄位資料 array
- 每個欄位都抓,所以會比較花時間
- ```ruby=
Product.all.map(&:id)
# => SELECT `products`. * FROM `products`
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10....]
```
- **pluck 每次都會查詢,所以如果是已經查過的資料,使用map會比較快(從acitve record裡面找資料出來)**
- ```ruby=
require 'bebnchmark'
users = User.all #這邊已經先載入,所以map較快
Benchmark.bm 10 do |r|
r.report "pluck" do
2000.times { users.pluck(:id) }
end
r.report "map" do
2000.times { users.map(&:id) }
end
end
```
- 參考連結:[參考1](https://mgleon08.github.io/blog/2016/01/07/rails-enumerable/) | [參考2](https://qiita.com/TT-nasu/items/e6971efd1383d7f500dd) | [參考3](https://qiita.com/yu-croco/items/d7a39b34036d638c5026)
30. <font color=#6A7>要撈出條件下 model 資料除了 where 外,也可以用 scope 或是定義 model 的 class method,他們差別在哪?什麼時候用哪一個?</font>
29. <font color=#6A7>Gemfile 跟 Gemfile.lock 差別?</font>
- ==Tang==
- Gemfile是一個我們用來描述Ruby程式中gem相依賴關係的檔案。他的位置會是project的根目錄。
- Gemfile.lock檔案是實際安裝的gem版本紀錄。如此一來,當這個專案被放在別台機器上時,只要執行bundle install就會去查看Gemfile.lock來安裝同一個版本。
- [Gemfile和Gemfile.lock是什麼?](https://ithelp.ithome.com.tw/articles/10248262)
31. <font color=#6A7>什麼時候要用 bundle update XXX 這指令?</font>
32. <font color=#6A7>為什麼有時候跑 rails db:migrate 後,db/schema.rb 會更新一些不在 migration 裡的欄位?</font>
33. <font color=#6A7>什麼是 STI?</font>
34. <font color=#6A7>為什麼 Rails 要採用 MVC 架構?</font>
35. <font color=#6A7>說明 Rails server 接收到 request, 從 routes 到 controller, 從 model 取資料以及 render 的過程</font>
36. <font color=#6A7>Rails 中的 Unobtrusive JavaScript</font>
37. <font color=#6A7>Rails 中的 Turbolinks, 通常可能會遇到的問題以及處理方式</font>
38. <font color=#6A7>要怎麼列出 app 中所有的 route</font>
- 終端機輸入`rails routes`
- 也可用 `rails routes | grep <keyword>` 來篩出特定的 routes
39. <font color=#6A7>你用過哪些 rails 的設計模式?</font>
- service objects, value objects, form objects, query objects, view objects, policy objects, and decorators.
- [7 Design Patterns to Refactor MVC Components in Rails](https://www.sitepoint.com/7-design-patterns-to-refactor-mvc-components-in-rails/)
40. <font color=#6A7>請說明 count、length、size 三者有何不同?</font>
41. <font color=#6A7>要如何導入權限(authorization)系統?</font>
- 小心這邊提到的不是授權(authentication)
- 可提到 Pundit 和 CanCanCan
42. <font color=#6A7>什麼是 Callbacks?</font>
43. <font color=#6A7>你何時會使用 before_save vs. after_save callback?</font>
44. <font color=#6A7>什麼是 Initializers?</font>
- ==Huihsin==
- 可以在目錄 /config/initializers 看到所有設定。
- 通常在載入框架和所有套件後,執行的初始化配置。
- 當設定值更改的時候,需要重新啟動`Rails server`。
46. <font color=#6A7>請解釋 "Fat models, skinny controllers"</font>
47. <font color=#6A7>請解釋 "skinny controllers, skinny models"</font>
48. <font color=#6A7>你用過什麼背景工作框架?</font>
- [Delayed::Job](https://github.com/collectiveidea/delayed_job)
- [Sidekiq](https://sidekiq.org/)
- [Sucker Punch](https://github.com/brandonhilkert/sucker_punch)
49. <font color=#6A7>helper 會放進什麼樣的邏輯?</font>
50. <font color=#6A7>ActiveRecord 是什麼?</font>
- ==Huihsin==
- 就是 MVC 架構裡的 Model,專門負責商業邏輯,通過 [ORM](https://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB%E6%98%A0%E5%B0%84) 技術,可以使不同類型系統的資料做交換,不需要直接寫 SQL 語法就能新增、修改、刪除資料。
- [官方文件](https://guides.rubyonrails.org/v5.0/active_record_basics.html)
51. <font color=#6A7>content_for 用來做什麼?</font>
53. <font color=#6A7>Hash 跟 JSON 有什麼不同?</font>
54. <font color=#6A7>Active Job 是什麼?</font>
- ==Huihsin==
- 使我們可以創建背景工作,並對工作進行排程,通常使用在一些耗時較久或沒必要馬上被執行的任務上,例如寄出驗證信;由於預設是存在記憶體中,一般還會搭配其他套件( Sidekiq / Delayed::Job ),將排程工作存在其他地方,避免伺服器重新啟動而刪除排程。
- [官方文件](https://guides.rubyonrails.org/active_job_basics.html)
56. <font color=#6A7>你為何喜歡 Rails?</font>
- ==參考答案==
- 因為他可以非常快速的建立 MVP
- 特別是他很有趣,可以寫`Time.now + 5.days` 或 `obj.nil?` 很方便
- 社群活躍,很有幫助,可以輕易找到範例或有用的文章
- 慣例優於設定代表你就算接觸一個新的大專案也可以知道去哪裡找重要的東西。
57. <font color=#6A7>你不喜歡 Rails 的什麼?</font>
58. <font color=#6A7>你最喜歡的 Ruby gem 是哪一個?</font>
59. <font color=#6A7>Spring 是什麼?</font>
- ==Huihsin==
- [Spring](https://github.com/rails/spring) 是 Rails 應用程式的預加載器,保持應用程式在後台自動運行,當執行 Rails 命令時:例如,跑測試、migrate 時,不需要每次都重啟,能即時在頁面上看到修改的成果,加速開發流程。
- 當修改 configs / initializers / gem 時,建議重啟`rails server`。
61. <font color=#6A7>asset pipeline 是什麼?</font>
62. <font color=#6A7>你要怎麼管理 Rails 的授權?</font>
63. <font color=#6A7>splat operator 是做什麼的?</font>
- [double splat operator](https://medium.com/@sologoubalex/parameter-with-double-splat-operator-in-ruby-d944d234de34)
- [single splat operator](https://medium.com/@sologoubalex/parameter-with-splat-operator-in-ruby-part-1-2-a1c2176215a5)
- [single splat operator samples](https://medium.com/@sologoubalex/parameter-with-splat-operator-in-ruby-part-2-2-595784b8aeb8)
- [splat operator 文章](https://medium.com/@eggyy1224/ruby%E7%9A%84splat-operator-f2fa4f7956c7)
64. <font color=#6A7>load 跟 require 差在哪?</font>
65. <font color=#6A7>scope 是什麼?</font>
66. <font color=#6A7>如何不使用 resources 定義一個 create action 使用的 route</font>
67. <font color=#6A7>請敘述 migration 的用途</font>
68. <font color=#6A7>測試用的假資料有哪些選擇?(fixture 與 factory bot?) 這些選擇有哪些優劣?</font>
69. <font color=#6A7>rescue_from 的用途?後面接著 with 代表什麼?with 會接什麼?</font>
70. <font color=#6A7>出現一個 method 此檔案找不到在哪裡定義,你會朝哪邊找</font>
71. <font color=#6A7>請舉出 3 個你在 Rails 中使用過的 gem</font>
72. <font color=#6A7>如果有檔案中的程式碼重複使用,但不想寫那麼多次,你會用什麼方法處理?</font>
73. <font color=#6A7>解釋 render partial 如何傳入參數</font>
74. <font color=#6A7>請解釋 before_action 的用途</font>
75. <font color=#6A7>請敘述後端非同步用在哪些情況,大致上如何實現</font>
76. <font color=#6A7>後端有哪些測試套件?</font>
- Capybara、minitest、RSpec、cucumber
77. <font color=#6A7>測試的重要性是什麼?</font>
78. <font color=#6A7>你對效能調校有哪些了解,從前端到後端有哪些地方可以下手?</font>
79. route 中 namespace 及 scope 的差別?
- [參考網站](https://devblast.com/b/rails-5-routes-scope-vs-namespace)
## Git
1. <font color=#6A7>使用 Git 時要怎麼使用 tag</font>
- ==Tang==
```shell=
$ git log --oneline
db3bbec (HEAD -> master) add fish
930feb3 add pig
51d54ff add lion and tiger
如果想在`51d54ff add lion and tiger`打上一個 `big_cats` 的標籤
$ git tag big_cats 51d54ff
```
- ==Tang==
- 通常在開發軟體有完成特定的里程碑,例如軟體版號 1.0.0 或是 beta-release 之類的,這時候就很適合使用標籤做標記。
- 標籤有兩種,一種是輕量標籤(lightweight tag),一種是有附註標籤(annotated tag),但不管哪一種,都可以把它當做貼紙一樣看待,它就是貼在某個 Commit 上的東西。
2. <font color=#6A7>空的資料夾無法被加入 Git 版控,但這個資料夾如果又是很重要的資料夾,你會怎麼處理?</font>
- ==Tang==
- 可以放一個名為 “.keep” 或 “.gitkeep” 的空檔案,讓 Git 能「感應」到這個目錄的存在
5. <font color=#6A7>在 Rails 專案中,/config/database.yml 有機密檔案,在使用時要怎麼操作</font>
* 放到 .gitignore,做 rails 專案時可以用 figaro 套件做成環境變數
6. <font color=#6A7>什麼是 Git flow?</font>
- 主分支 main/master,加上 develop,發布 PR 先到develop,待功能都確定完整,再 push 到 main/master
8. <font color=#6A7>你們在 demo project 是如何透過 git 來協作</font>
9. <font color=#6A7>如果發生 conflict,該如何解決?</font>
- git pull develop分支到本地端來解
- GitHub 線上解(不推薦)
10. <font color=#6A7>請描述 7 個 Git 指令,並說明指令用途。</font>
- ==Tang==
- git init
- 初始化新版本庫,目錄中生成一個.git資料夾
- git status
- 當前分支的檔案異動狀態
- git log
- 顯示 commit 紀錄
- git blame
- 看到檔案的每一行是誰修改的
- git merge
- 合併分支
- git cherrypick
- 可以從其他 Branch 單獨挑幾個 Commit 搬到現在的 Branch 上
- git fetch
- 將 origin 有但 local 沒有的版本記錄更新到本機上
## SQL
1. <font color=#6A7>什麼是 SQL injection ?</font>
- ==Robert==
- 在 URL 中加入不當的搜索條件導致 raw SQL 語法辨認錯誤
- 示範:`https://something.com/product?query=123; DROP TABLE Products`
- 上述示範傳進 server 端會導致整個 Products table 被刪除
- 解決方式:使用 ORM,條件清洗;不得以要寫 raw SQL 時使用參數方式代入
- 優良示範:`Product.where("like_count = ?", params[:like])`
- 不良示範:`Product.where("like_count = #{params[:like]})`
3. <font color=#6A7>NoSQL 跟 RDBMS 差異?</font>
4. <font color=#6A7>NoSQL 的 commit(transaction) 階段?</font>
5. <font color=#6A7>想要在 posts 資料表中查到特定 user 的文章,用 Raw SQL 的話該怎麼下語法?</font>
- SELECT 文章 FROM Posts WHERE "user_id = ?", user_id
6. <font color=#6A7>DB 欄位中,主鍵(primary key) 外部鍵(foreign key) 是什麼?</font>
## JS
1. [JS面試題(github-lydiahallie)](https://github.com/lydiahallie/javascript-questions)
2. [JS面試題(github-sudheerj)](https://github.com/sudheerj/javascript-interview-questions)
3. [What's the difference between using “let” and “var”?](https://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var)
4. 如何解決 CORS 跨域的問題?
- 請後端設定 response header: Access-Control-Allow-Origin [參考資料](https://blog.huli.tw/2021/02/19/cors-guide-3/)
- 使用 proxy server 代理伺服器
- API URL 前面加上 https://cors-anywhere.herokuapp.com/ [參考資料](https://andy6804tw.github.io/2019/09/21/fix-cors-problem/)
> 面試過四間都有考 Cross-Origin Resource Sharing by Alex
6. Hoisting 變數提升相關問題
- var 的特性,如果在宣告變數之前呼叫,會是 undefine
8. Normalize.css 與 Reset.css 差別在哪裡
- Normalize css
- 保留原本預設 HTML 標籤的樣式,僅針對不同瀏覽器與各版本間不相容的標籤進行微調
- Reset css
- 做法是把所有瀏覽器不一致的地方強制歸 0,像 margin、padding、border、outline 全設為 0
- 優點:統整、重置了各個瀏覽器的樣式設定
- 缺點:需全部重新設定,較無彈性;開發者工具會看到一坨繼承鏈(inheritance chain)
- 什麼時候會用 reset, 什麼時候會用 normalize 呢?
- 在「大部分」的情況下會選用 reset,尤其有視覺設計師的時候,設計師針對畫面樣式的規定不一定會與瀏覽器的預設相符
- 然而有個場景是非得用 normalize 來處理的,就是那個區塊得用 rich-text editor (如 ckeditor等) 上稿的時候,如果沒有透過 normalize 來還原預設狀態,上稿人員可是會跳腳的,像是 「我的標題字級不對」、「超連結怎麼沒底線」之類的問題
10. 非同步、同步 Promise + Async/Await 的問題
- 非同步:JS 是非同步,同時可以做很多事情
- 同步:一次只做一件事
- ES6 的 Promise 就是要來解決非同步的問題
- 定義 function 前,前面加 async
![](https://i.imgur.com/eofVeCK.png)
11. this 的指向問題
12. this 的 Apply, call, and bind
- .bind() 呼叫前先綁定某物件,會有固定的 this
- .call & .apply 依照呼叫時的需要,帶入不同的物件當 function 的 this
- .call( null, arg1, arg2 ) 參數用「,」隔開
- .apply( null, [ arg1, arg2 ]) 傳入參數用陣列
14. MVC 架構是什麼,請詳細說明
- view
- controller
- model
15. var、let、const 之間的差別
- var 變數,有 hoisting 提升特性/scope 作用域是 function
- let 變數,無提升特性/scope 作用域是 { }
- const 常數,不能重新賦值,無提升特性/scope 作用域是 { }
16. AJAX 請求 GET、POST、PUT、DELETE、PATCH 相關問題
17. ajax, XMLHttpRequest, fetch api, axios
18. Cookie、LocalStorage、SessionStorage 比較
- cookie:暫存資料在瀏覽器上,關閉視窗即消失,空間很少只有 4kb
- LocalStorage:將資料存在客戶端本地瀏覽器上,空間 5mb,需手動刪除,不能跨裝置
- SessionStorage:將資料暫存在瀏覽器上,關掉視窗即消失
![](https://i.imgur.com/e5A2BeC.png)
18. 陣列的淺 / 深拷貝比較
19. 多層元件中如何互相傳值 ( Vue 就是 Vuex、React 就是 Redux )
20. 說明閉包的特性與用途
- 呼叫 function 中的 function
- 優點:
- 可避免變數汙染
- 能夠讀取函數內部的變數
- 可以在記憶體中維護一個變數
- 缺點:閉包會常駐記憶體,會增大記憶體使用量(影響效能)
21. BOM/DOM 的差別
- BOM:JS 與瀏覽器的窗口,window 物件/全域物件
- DOM:JS 用來控制網頁的節點&內容
23. prototype, prototype chain
![](https://i.imgur.com/c44qIVj.png)
25. DOM selector 有哪些?
- getElementByID
- getElementByTagName
- getElementByClassName
- querySelector
- querySelectorAll
26. JS 如何綁定 Event
- [參考資料 008 JavaScript from Kuro](https://ithelp.ithome.com.tw/articles/10191970)
- addEventListner()
- removeEventListener() 解除事件
- onclick
- onload
28. What is Event Loop?
- 捕獲與冒泡
![](https://i.imgur.com/dq5tTx1.png)
29. 怎麼在 JS 中宣告一個 class
```javascript
class Person {
constructor(name) {
this.name = name;
}
greeting(){
return 'Hello + this.name'
}
}
```
30. 什麼是 Virtual DOM
- JavaScript 物件模擬特定 DOM 結構而產生的樹狀結構
- 用途是不直接操作 DOM,改操作這些物件。能提升效能
## Linux
1. Linux 指令 `mv` `rm` `cd` `cp` `scp` `ls` `ln` `ln -s` `tail -f` `export`
2. SSH 連線需要的公鑰、私鑰是什麼
3. Process Thread 差別
4. CentOS, Red Hat, Ubuntu 的差別
## 其他問題
1. 在專案中負責什麼項目
2. 在專案中遇到什麼困難,如何解決?
3. 最近有看到什麼有趣的網頁或功能嗎?
4. Ruby 跟 Rails 有什麼不一樣?
5. 你為什麼喜歡 Ruby?
6. 你覺得 open source 的好處是什麼?壞處是什麼?
7. 學程式的過程中最喜歡的部分?(前端或後端,哪一種語言或框架)
8. 之後的學習規劃?
9. 想做什麼 Side Project?對於 Side Project 的時程規劃?
10. 說明專案中 schema, model, controller 裡的程式碼
11. 覺得自己贏過其他同學的點?
12. 為什麼想轉職?
13. 為什麼會選擇 Ruby 這個語言?
14. 會排斥前端嗎?在專案中接觸到的前端技術為何?
15. 在學習 Ruby 的過程中有沒有什麼是讓你最困擾的?
16. 如果碰到問題時,通常會花多久時間解決?(請分別描述最短和最久的時間和情境)
17. 遇到不會的問題會如何尋找解決方案?
18. 為何選擇五倍?
19. 為何選擇後端?
20. 是否考慮回到原本領域寫code,結合兩個技能?
21. 提出一個想改善的缺點?
22. 試著描述軟體工程師的工作內容如何進行
23. 對於 Scrum 的了解?是否有使用過 Scrum 開發?
24. 你認為 Ruby 這個程式語言的優點是什麼?缺點是什麼?為什麼在台灣好像用的人不多?
- 如果是素人,應該回答:
- 「Ruby 是我的第一個學習的程式語言,我沒辦法拿它跟其程式語言做比較」才是正確答案
- 如果曾經學習過其它的,或是拿 Ruby 跟我們課堂上學到的另一款程式語言 JavaScript 比較的話:
- 優點:
- 語法簡潔,容易上手
- 寫的好的話,可以像一般文章容易被理解
- 缺點:
- 背後有很多黑魔法,如果沒有適當的引導容易會以為 Ruby 就只有表面上看起來這麼單純,只能學到皮毛
- 如果硬是要比較的話,Ruby 的效能不會是最好的,只是就以大部份中小型的專案來說,Ruby 本身的效能考量都還不是太大的問題
- 為什麼在台灣好像用的人不多?
- 因為學校沒有教
- 因為台灣人喜歡一窩蜂
25. 你認為使用框架(例如 React, Vue, Ruby on Rails, Laravel… 等)的好處是什麼?缺點是什麼?
- 優點
- 開發速度快
- 因為框架通常有它的慣例(convention),所以整個團隊在開發的時候,即使是新手也大概能猜的到老手寫的程式碼放在什麼地方
- 缺點
- 框架通常會比較大包,整體而言執行速度會比原生的程式語言來得慢一些
- 因為框架通常有它的慣例(convention),所以得另外花時間學習這個慣例
- 在對原生技術不熟的情況下,跳級直接使用框架也是很危險的,但這並不是框架的「缺點」,這是開發者自已搞不清楚狀況
## 前端相關
- Promise 要很熟
- 用原生 JS 實作一些內建的功能
- 例:重作一個 Array.filter() function
## 相關連結
- [53 Ruby on Rails Interview Questions and Answers](https://medium.com/ruby-daily/53-ruby-on-rails-interview-questions-and-answers-eb99eed1aeb7)
- [面試參考題](https://github.com/rubytaiwan/AMA/issues/140)
- [Rails 面試經驗](https://medium.com/@eggyy1224/%E8%8F%9C%E9%B3%A5rails%E5%B7%A5%E4%BD%9C%E9%9D%A2%E8%A9%A6%E5%88%9D%E9%AB%94%E9%A9%97-a562cc700133)
- [Ting Ting 學姊面試題](https://ithelp.ithome.com.tw/users/20111177/ironman/1613)
- [Ruby 中的 Block、Proc、Lambda 是什麼?](https://riverye.com/2019/11/15/Ruby-%E4%B8%AD%E7%9A%84-Block%E3%80%81Proc%E3%80%81Lambda-%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F/)
- [如何理解 Ruby Block](https://medium.com/@jinghua.shih/ruby-%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3-ruby-block-2387b74f188b)
- [前端面試題](https://hackmd.io/@mingjunlu/front-end-interview-questions)
- [lol_dba](https://github.com/plentz/lol_dba)
- [SQL 練習網站 SQL Zoo](https://sqlzoo.net/)
- [資安相關分享文](https://medium.com/starbugs/%E8%BA%AB%E7%82%BA-web-%E5%B7%A5%E7%A8%8B%E5%B8%AB-%E4%BD%A0%E4%B8%80%E5%AE%9A%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84%E5%B9%BE%E5%80%8B-web-%E8%B3%87%E8%A8%8A%E5%AE%89%E5%85%A8%E8%AD%B0%E9%A1%8C-29b8a4af6e13)
- [Leetcode](https://leetcode.com/)
- 曾經考過的面試題
- [448\. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/)
- [136\. Single Number](https://leetcode.com/problems/single-number/)
- [258\. Add Digits](https://leetcode.com/problems/add-digits/)
- 解題需掌握的要點:
- 因有時間限制,先把三題題目都看過一遍,對題型有初步了解。
- 先做自己有把握的題目,查找資料的頁籤都保留起來。
- 做題目時建議使用 Terminal 開 `irb`,邊做邊測試方法的結果是否如預期。
- [仁傑學長的部署筆記](https://hackmd.io/@Tang-Tou/rJpkwKxT_)
## 補充資料
- 生命週期補充
![](https://i.imgur.com/BA4zmMI.png)
- Rails 裡有效使用 Active Record 關聯秘訣 [中文](https://rails.ruby.tw/association_basics.html#%E7%A7%98%E8%A8%A3%E3%80%81%E6%8A%80%E5%B7%A7%E8%88%87%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85) [英文](https://guides.rubyonrails.org/association_basics.html#tips-tricks-and-warnings)
## 題外話
如果問 schema 設計這種問題的話,可能是想知道下面幾點:
1. 對於資料表關聯性的熟悉度(一對一、一對多、多對多)
2. 資料表欄位的設計:一張資料表會不會包含過多的欄位數量、需不需要將關聯性較小的欄位拆分出來成為獨立的資料表...等等
3. 資料表除了原本預設的 id 欄位是primary key以外,會不會需要針對其他欄位設定為 primary key?為什麼設定primary key 會有助於加速資料查詢?