Slide 1

Slide 1 text

R u b y J u n i o r ⼯ 程 師 的 存 活 術 我 要活下來!

Slide 2

Slide 2 text

洪立璿 Fred www.spreered.com medium.com/@spreered [email protected]

Slide 3

Slide 3 text

為 什麼 要 講 這 個 主題 ?

Slide 4

Slide 4 text

⿊歷史

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

資深助教

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

J u nio r ⼯ 程師的煩惱

Slide 10

Slide 10 text

第⼀次收到 issue 被 嚇 到

Slide 11

Slide 11 text

看著需求不知如何下⼿ 不會估時間 客⼾看著成果說感覺不對 需求變來變去

Slide 12

Slide 12 text

第 ⼀次打 開 公司的專案被嚇到

Slide 13

Slide 13 text

專案跟學習時有落差 不知道如何追程式碼

Slide 14

Slide 14 text

沒有 senior 理你 或 者 沒有 senior 理 你

Slide 15

Slide 15 text

錄取 新 ⼯ 作, 只 是個 挑戰開始

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

所以我今天 會講 什 麼

Slide 18

Slide 18 text

今天我想來點 ... • 需求溝通不求⼈ • 菜雞們在 Ruby on Rails 的救命招式 • 資料庫是你的好朋友 • 早點下班的秘訣 • 資訊焦慮

Slide 19

Slide 19 text

完 全不會深 入 探討 各項 議題

Slide 20

Slide 20 text

全部 都是抄 襲參 考資 料 (還 有⼀些⼼ 得)

Slide 21

Slide 21 text

不 ⼀ 定 能 救 你 但 希 望 可 以 給 你 ⼀根救命的繩索

Slide 22

Slide 22 text

需求溝通 不求人

Slide 23

Slide 23 text

案例 ⼀ 公務員 ⽇常

Slide 24

Slide 24 text

「 資訊 室,我辦公 室 的 網 路 斷 了 」 事實 上是他 的電腦 桌 ⾯ 不⼩ ⼼被他⾃⼰ 改 成 ⿊ ⾊

Slide 25

Slide 25 text

案例 ⼆ 「⼯程 師, 為什 麼 你講 的 話
 別⼈總是 聽不 懂 」

Slide 26

Slide 26 text

104 廣告 《⼯程師如何和他⼈有效溝通?DFS前⼯程副總黃世岱⽤35年經驗跟你分享》 以上⾔論不代表本⼈立場

Slide 27

Slide 27 text

⼯程 師不 該被貼上
 「 你就是不 會 溝通」的標籤

Slide 28

Slide 28 text

先 講 ⼀下 有關「溝通 」的 思考 架構

Slide 29

Slide 29 text

Jo har i W ind o w

Slide 30

Slide 30 text

公開象限 盲⽬象限 隱私象限 未知象限 我知道的 我不知道的 別⼈知道的 別⼈不知道的 先確定溝通時的 context 在公開象限 (⽇常溝通、提問、交辦事情、討論都可使⽤)

Slide 31

Slide 31 text

何謂有效 溝 通

Slide 32

Slide 32 text

「我的網路斷了」 電腦桌⾯變成⿊⾊ User 給錯誤的需求 真正要解決的問題

Slide 33

Slide 33 text

溝通誤 區: 「 先說答 案 」

Slide 34

Slide 34 text

傳達者 確認問題 給答案 確認期望反應 • 理解 • 回饋意⾒、建議、判斷 • 立即⾏動 對⽅ icon made by photo3idea_studio

Slide 35

Slide 35 text

提出說服⼈ 的 答案 ( 吵架 常 常 吵 輸 請看這 邊 )

Slide 36

Slide 36 text

表達邏輯的訓練 問題 答案 根據或⽅法 so what ? why so ? MECE 不重複 不遺漏

Slide 37

Slide 37 text

以上參考⾃「邏輯思考的技術」

Slide 38

Slide 38 text

問對問 題很 重要 問問題的重要性 提問的技巧

Slide 39

Slide 39 text

Youtube 影片 《 91APP 電商技術⼤解密 (2020 線上分享系列):DevOps 的⾦字塔原理與技術 》 五星推薦 ⭐⭐⭐⭐⭐

Slide 40

Slide 40 text

需 求 確認 ⼯ 具 U s e r S t o r y

Slide 41

Slide 41 text

• 最早是由 Kent Beck 在 XP 裡⾯提出 • 需求⽅可以⽤它來跟開發部⾨溝通 • 開發部⾨可以⽤來拆解成可執⾏的任務 • 這個是⽤來溝通⽤的!不是規格書! User Story

Slide 42

Slide 42 text

作為⼀個 (⾓⾊),我可以 (做某件事情),因此可以 (達成某個⽬的)
 
 As a (role of user), I want (some feature) so that (some business value) User Story 的範本

Slide 43

Slide 43 text

• 使⽤者可以將喜歡的商品加入購物⾞ • 登入使⽤者可以在影片下⽅留⾔ • 訪客可以在⾸⾴搜尋⽂章標題 User Story 範例

Slide 44

Slide 44 text

• 將顆粒度適中的 user story 與客⼾確認 • ⼀條 user story 可能會包含很多任務,所以不會 直接將⼀個 user story 來開 ticket • break down to task 可能需要⼀點經驗,可以請 主管或 senior 核對 task 是否合理 將 User Story 拆成任務

Slide 45

Slide 45 text

《什麼是 User Story》 by ihower

Slide 46

Slide 46 text

《使⽤者故事 User Story》 by Ruddy

Slide 47

Slide 47 text

當⼀ 個 issue 開 出 來, 通常 我會麼處理?

Slide 48

Slide 48 text

1 .先 搞 清 楚 業 務 邏 輯 和 系統架構

Slide 49

Slide 49 text

• Who 誰在使⽤這個系統 • What 為了什麼⽬的使⽤ • How 怎麼操作 • 找到很熟系統操作的使⽤者 • 試著盡量弄清楚⼀些 domain knowhow / 專有名詞 弄清楚業務邏輯

Slide 50

Slide 50 text

• 務必熟悉資料的關聯 • 專案程式架構(等等會講) 了解系統架構

Slide 51

Slide 51 text

2 .確 認 問題

Slide 52

Slide 52 text

• 「客⼾通常不會知道他們想要的正確規格」 • 「客⼾第⼀次給的答案通常是錯的答案」 • 為什麼要做這張票、操作的⼈事時地 • 問到真正想解決的問題 確認問題

Slide 53

Slide 53 text

3 .規 劃 作法

Slide 54

Slide 54 text

• 考量全局(避免不必要的需求變更) • 依據問題提出解決⽅案 • 與 senior 討論⽅向 • 最終產出 user story 規劃作法

Slide 55

Slide 55 text

4 .確 認 需求

Slide 56

Slide 56 text

• 使⽤ user story 與客⼾核對需求 • 將 user story 拆解成需要執⾏的任務 • 依據可執⾏的任務來估算時間 確認需求

Slide 57

Slide 57 text

如果想要加速開發的時間 ,則前提是把需求弄好, 擁有好的需求品質...⽅向對了返⼯(re wo rk)的次 數⾃然變少,減少了在返 ⼯時所浪費的時間,減少 了浪費的時間開發作業也 就⾃然地變快起來了。 — 《敏捷開發為何會比較快》 by Ruddy 解決需求變化太過頻繁的最好⽅法,就是提升需求的品 質。 — 《需求變化太過頻繁》 by Ruddy

Slide 58

Slide 58 text

菜雞們在 Ruby on Rails 的救命招式

Slide 59

Slide 59 text

R a i l s 專案初 次⾒ ⾯

Slide 60

Slide 60 text

從哪裡著手認識一個專案? ‧ Readme ‧ Gemfile ‧ routes ( $ rails routes ) ‧ models ‧ db/schema ‧ Assets ‧ 第三方服務 ‧ git log ‧ 測試案例 Everyday Rails - Getting started with a legacy Rails application

Slide 61

Slide 61 text

但是 專案很 複雜 ?看攏無?

Slide 62

Slide 62 text

先 弄清楚 Rub y O b j e ct M o d e l

Slide 63

Slide 63 text

class Dog def initialize(name) @name = name end end bingo = Dog.new("Bingo") 宣告⼀個 Dog 的實例物件 名叫 Bingo Ruby Object model

Slide 64

Slide 64 text

屬性在實例的物件⾝上, ⽅法在類別⾝上。 class Dog def initialize(name) @name = name end def bark puts "woof" end end bingo = Dog.new("Bingo") bingo.bark Ruby Object model

Slide 65

Slide 65 text

雖然我們沒有特別寫,但是所有我們的宣告的 Dog 預設繼承⾃ Object Ruby Object model

Slide 66

Slide 66 text

def bingo.say puts "hi, This is #{@name}" end bingo.say # hi, This is bingo 我們可以為個別物件
 定義專屬的⽅法 它會放在⼀個隱藏的 singleton class 裡⾯ Ruby Object model

Slide 67

Slide 67 text

class 本⾝也有 singleton class Ruby Object model

Slide 68

Slide 68 text

include module extend module

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

影片《The Ruby Object Model》by Dave Thomas @ Scotland on Rails conference, 2009 五星推薦 ⭐⭐⭐⭐⭐

Slide 71

Slide 71 text

《Ruby 的繼承鍊 (1) - 如何實踐物件導向 》 《Ruby 的繼承鍊 (2) - Module 的 include、prepend 和 extend》

Slide 72

Slide 72 text

追 code ⼩撇步

Slide 73

Slide 73 text

methods 列出所有⽅法

Slide 74

Slide 74 text

可以扣掉⽗層的⽅法

Slide 75

Slide 75 text

source_location 查看⽅法在哪個檔案

Slide 76

Slide 76 text

source 印出原始碼

Slide 77

Slide 77 text

super_method 找到繼承下下來的⽅法

Slide 78

Slide 78 text

bundle open 打開專案內某個 gem

Slide 79

Slide 79 text

影片《teach yourself how Rails works》by Jordan Raine @ RailsConf 2019

Slide 80

Slide 80 text

Debug Tool

Slide 81

Slide 81 text

byebug pry

Slide 82

Slide 82 text

RailsPanel https://github.com/dejan/rails_panel Browser Extension 
 在開發環境下可以讓你快速 找到每個⾏為的 route / controller / view / model

Slide 83

Slide 83 text

Rails console ⼩技巧! 《原來 Rails Console 可以這樣⽤》 by 韓政璇 @ 5xRuby

Slide 84

Slide 84 text

M et ap rog r am mi ng

Slide 85

Slide 85 text

— https://zh.wikipedia.org/wiki/元編程 元程式設計(Metaprogramming),⼜譯超程式設計,是 指某類電腦程式的編寫,這類電腦程式編寫或者操縱其它 程式(或者⾃⾝)作為它們的資料,或者在執⾏時完成部 分本應在編譯時完成的⼯作。多數情況下,與⼿⼯編寫全 部代碼相比,程式設計師可以獲得更⾼的⼯作效率,或者 給與程式更⼤的靈活度去處理新的情形⽽無需重新編譯。

Slide 86

Slide 86 text

— Metaprogramming Ruby Metaprogramming is writing code that manipulates language constructs at runtime.

Slide 87

Slide 87 text

誰⽤了 metaprogramming • ActiveRecord • Rails routes • Rspec • Devise gem

Slide 88

Slide 88 text

怎麼做到的 • method_missing • define_method • class_eval / instance_eval • 在 run time 的時後才去產⽣些程式

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

因為 程 式碼是 程式產⽣的 有 時候你會 找不到

Slide 91

Slide 91 text

建議:打 造⼯ 具時 才 使⽤本 招 式

Slide 92

Slide 92 text

菜雞不 會 寫 metaprogramming 
 也要能 看 懂 metaprogramming

Slide 93

Slide 93 text

舉例:Devise 的 current_user devise/lib/devise/controllers/helpers.rb

Slide 94

Slide 94 text

M e t a p ro g ra m m i n g Ru b y 2

Slide 95

Slide 95 text

五星推薦 ⭐⭐⭐⭐⭐

Slide 96

Slide 96 text

還 不 懂 沒 關 係 等 等 蒼 時 會 表 演 給 大 家 看 ! 突如其來的業配!

Slide 97

Slide 97 text

資料庫是你 的好朋友

Slide 98

Slide 98 text

某天看到 我 的同事 寫 出 了 ⼀ 段 程 式 碼

Slide 99

Slide 99 text

No content

Slide 100

Slide 100 text

於是我 ⿎(脅 )勵 ( 迫) 她弄 ⼀個 SQ L的 讀 書 會

Slide 101

Slide 101 text

https://sqlzoo.net/ SQL 基礎語法刷題

Slide 102

Slide 102 text

資料庫概論相關 U N I O N (聯 集 ) ∪ INTERSECTION ( 交 集) ∩ SE T D I F F ER EN C E ( 差 集 ) C A RT E S I A N P R O D U C T (卡 ⽒ 積 ) ×
 SE LE CT ( 選 擇 ) σ R O J E C T (投 射 ) π JOI N (合 併 ) ⋈ D I V I S I O N (除 法 ) ÷ 關聯式代數 資料庫正規化 Transaction

Slide 103

Slide 103 text

Active Record 原理 《 R a i l s 探 索: A c t i v e R e c o r d 篇 》 — Johnson fr om 5 xRuby • 實 作⼀ 個簡 單的 A c t i v e R e c o r d • 了 解 Relation Object 原 理 • 幫 助理 解在 Rails 中使 ⽤ A c t i v e R e c o r d 中 的 ⼀些效 能 問題

Slide 104

Slide 104 text

Active Record 原理 《 如何 在 Rails 中使 ⽤ A r e l S QL》 — Lance f rom 5xRub y A ct iv eR e cor d 會 使⽤ A r e l 來建 立 SQL 的 語 法樹

Slide 105

Slide 105 text

基礎 到 不 行 但還 是 常看到 的 n + 1 問 題

Slide 106

Slide 106 text

善⽤ preload / eager_load / inlcudes

Slide 107

Slide 107 text

Sc ope

Slide 108

Slide 108 text

scope

Slide 109

Slide 109 text

scope

Slide 110

Slide 110 text

scope 的新⼿誤區 請記得⼀定要回傳 relation object

Slide 111

Slide 111 text

scope 同事踩過的雷 scope 如果是 nil 的話,會回傳 all

Slide 112

Slide 112 text

教學《Advanced ActiveRecord Querying》by UpCase (Thoughtbot) 五星推薦 ⭐⭐⭐⭐⭐ A cti ve Re co rd 教 學 由簡 入深 有提 供範例 練習 ActiveRecord 課程

Slide 113

Slide 113 text

早點下班的秘 訣

Slide 114

Slide 114 text

說個 ⿁ 故 事

Slide 115

Slide 115 text

我 還 很 菜的 時候 接 ⼿ 的 第 ⼆個 專案

Slide 116

Slide 116 text

沒有 rubocop

Slide 117

Slide 117 text

沒 unittest

Slide 118

Slide 118 text

H a p p y

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

沒有 Rubocop • 隨便⼀個 method 都是 3 40 ⾏起跳 • 隨便⼀個 class 都是百⾏起跳 • ⼀個 object 會處理很多事情 義⼤利麵 style • Nested condition:四到五層是家常便飯 • 要修改程式前,需要花很長得時間先把原本 的邏輯看懂。

Slide 121

Slide 121 text

沒有 unittest • 只有 feature test,每次跑完需要兩個⼩時 • 不知道每個 method / class 的實際使⽤⽅式 • 每次修改完還要花很多時間驗證 • 因為沒有單元測試,所以許多物件有嚴重的 相依。

Slide 122

Slide 122 text

有⼀天客⼾要我修改⼀個 700 ⾏的 Class

Slide 123

Slide 123 text

.. . 雖 然 (很 臭 的 ) 程 式 碼 可 以 執 ⾏ , 但 我 們 需 要 重 構 它 只 是 美 感 問 題嗎? 雖 然 編 譯 器 是 無 法 辨 識 程 式 碼的 美醜 , 但 需 要 修 改 系 統 的 時 候 卻需要 「 ⼈ 」 的 參 與 , 所 以「 ⼈ 」必 須要 容易 看 懂 這 些 程 式 碼。 不 好的程 式 碼 是 難 以 修 改 的 , 甚 ⾄ 是 醜到 讓我 們 不 知 道 要 從 何 著 ⼿ 。 任何⽩ 痴都可 以寫 電 腦懂 的程 式碼 強者 會寫⼈ 類 看得 懂 的 程 式 碼 在《 重 構 R e f ac t ori n g》⼀書提到 ...

Slide 124

Slide 124 text

早 點下班 的 秘 訣就 是 寫 出好維 護 的 程式 碼

Slide 125

Slide 125 text

第⼀ 式 :辨識 Code smell

Slide 126

Slide 126 text

程 式碼發 臭 了, 你 知 道 嗎

Slide 127

Slide 127 text

《Refacoring Ruby Edition》 Duplicated Code Long Method Large Class Long Parameter List Divergent Change Shotgun Surgery Feature Envy Data Clump Primitive Obsession Case Statement Parallel Inheritance Hierarchies Lazy Class Speculative Generality Temporary Field Message Chains Middle Man Inappropriate Intimacy Alternative Classes with Different Interface Incomplete Library Class Data Class Refused Bequest Comment Meta Programming Madness Disjointed API Repetitive Boilerplate 聞聞看 Code smell ㄉ味道

Slide 128

Slide 128 text

《談談壞味道》系列⽂章 by Teddy Chen

Slide 129

Slide 129 text

h t t p s : / / r u b y s t y l e . g u i d e / 開了 RuboCop 後也許比較不那麼臭

Slide 130

Slide 130 text

為 了短⽽ 短 ?

Slide 131

Slide 131 text

滿⾜ lint 好像 也 不 ⾒ 得 好 維 護 ?

Slide 132

Slide 132 text

第⼆ 式 :寫好 單 元測 試

Slide 133

Slide 133 text

為什麼需要寫測試?

Slide 134

Slide 134 text

要驗證結果正確 要⾃動化執⾏

Slide 135

Slide 135 text

. . . 「編輯 並 祈 禱 」 這 種 ⽅ 式 似 乎 意味 著「 ⼩⼼ 著 ⼿ 」. . . . . . ⽽ 「覆 蓋 並 修 改 」 則 是 另 外 ⼀ 種 ⽅式 。它 背 後 理 念 在 於 , 在 我 們 修改軟 體 的 時 候 撐 開 ⼀ 張 安 全 網 . .. 像 是⽃ 篷 ⼀ 樣 蓋 在 我 們 進 ⾏ 修 改的程 式 碼 上 ⾯. . . 覆蓋 軟 體 即 意 味著 ⽤測 試 來 覆 蓋 它 。當 對 ⼀ 段 程式碼 有 ⼀ 組 良 好 的 測 試 時 , 我們 就可 以放 ⼼ 地 對 它 進 ⾏ 修 改 。 — 「帶著回饋⼯作」 書《Working Effectively with Legacy Code》 保護傘

Slide 136

Slide 136 text

為什麼需單元測試?

Slide 137

Slide 137 text

單元測試 整合測試 驗收測試 顆粒 ⼩ ⼤ 誰測 RD QA 速度 快 慢 種類 ⽩箱 ⿊箱 模組功能 滿⾜需求

Slide 138

Slide 138 text

因為很快,可以⾺上驗證我們修改的結果

Slide 139

Slide 139 text

當程式越來越複雜,測試就是你的安全堡壘

Slide 140

Slide 140 text

測試也可以讓我們設計比較好⽤的介⾯ (當我們發現測試很難寫的時候,很有可能的原因是物件的設計不太好)

Slide 141

Slide 141 text

RSpec 測試案例 matcher

Slide 142

Slide 142 text

Matcher 在這裡查 matcher ⽤來比對 程式產⽣的值 與 期望得答案 https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers

Slide 143

Slide 143 text

R S p e c 會 搭 配 到 的 ⼯ 具

Slide 144

Slide 144 text

Database Cleaner https://github.com/DatabaseCleaner/database_cleaner

Slide 145

Slide 145 text

FactoryBot https://github.com/thoughtbot/factory_bot

Slide 146

Slide 146 text

VCR https://github.com/vcr/vcr

Slide 147

Slide 147 text

Timecop https://github.com/travisjeffery/timecop

Slide 148

Slide 148 text

SimpleCov https://github.com/colszowka/simplecov

Slide 149

Slide 149 text

《Testing With RSpec》by Aaron Sumner 在 Rails 設定測試環境 使⽤ FactoryBot 取代 fixture 製造測試資料 基本的測試招式 Feature testing with Capybara Mock / Stub 在 Rails 寫 RSpec 可以先看這本書

Slide 150

Slide 150 text

RSpec 讓你愛上寫測試 https://www.slideshare.net/ihower/rspec-7394497/ 五星推薦 ⭐⭐⭐⭐⭐

Slide 151

Slide 151 text

《 單元測試的藝術》 by Roy Osherove

Slide 152

Slide 152 text

第三 式 :好懂 的 程式 碼

Slide 153

Slide 153 text

遊戲書 … 到達了約定的地點,但是過了⼗ 五分鐘他遲遲沒有出現。 你決定回家,請翻⾄第四⾴。 若你決定繼續等著,就翻到第五⾴。 如果試著從第⼀⾴翻到最後⼀⾴,你讀得懂嗎?

Slide 154

Slide 154 text

def keys_of_null(hsh, check_only) if check_only.nil? result = [] hsh.each do |k, v| result << k if v.nil? end if result.empty? "all good" else result end else result = [] hsh.each do |k, v| result << k if check_only.include(k) && v.nil? end if result.empty? "all good" else result end end end

Slide 155

Slide 155 text

def keys_of_null(hsh, check_only) if check_only.nil? result = [] hsh.each do |k, v| result << k if v.nil? end if result.empty? "all good" else result end else result = [] hsh.each do |k, v| result << k if check_only.include(k) && v.nil? end if result.empty? "all good" else result end end end 把功能相似的標註出來

Slide 156

Slide 156 text

def keys_of_null(hsh, check_only) check_only = check_only.nil? ? hsh.keys : check_only result = [] hsh.each do |k, v| result << k if check+only.include(k) && v.nil? end result.empty? ? "all good" : result end 整理在⼀起

Slide 157

Slide 157 text

Collecting Input 處理輸入 Performing work 處理主要邏輯 Delivering output 處理輸出 Handling failures 錯誤處理 Method 的四個部分

Slide 158

Slide 158 text

《Confident Ruby》 by Avdi Grimm 五星推薦 ⭐⭐⭐⭐⭐ 「好讀的程式碼跟好讀的⽂章⼀樣」 怎麼⽤ Ruby 隱藏的招式 寫出優雅的程式碼

Slide 159

Slide 159 text

寫出好懂的程式碼,跟寫出好懂的⽂章⼀樣

Slide 160

Slide 160 text

不會⼀次到位,⽽且會不斷的重構

Slide 161

Slide 161 text

影片 《Refactoring from Good to Great》 by Ben Orenstein, Aloha Ruby Conf 2012 五星推薦 ⭐⭐⭐⭐⭐ • 好的 method 不⽤太長,只要能描 述到它能做的事情即可 「不⽤描述他不需要關⼼的細節」 • 重構前⼀定要寫測試

Slide 162

Slide 162 text

⼀個 method 不需要太多細節 影片 《Refactoring from Good to Great》 by Ben Orenstein, Aloha Ruby Conf 2012

Slide 163

Slide 163 text

Method naming:想不到好名字就不要拆 method Comment:不是說不能寫註解,⽽是通常註解都會 拿來作為除臭劑。好的 method name 就可以取代那 些不必要的註解。 — 《 Refactoring 》

Slide 164

Slide 164 text

Tell, Don’t Ask 影片 《Refactoring from Good to Great》 by Ben Orenstein, Aloha Ruby Conf 2012 不要拿物件內的 attribute 來判斷 ⽽是直接對物件 send message 釐清責任是屬於哪個物件

Slide 165

Slide 165 text

第四式 :物件 導向 與 它的 ⼩夥 伴們

Slide 166

Slide 166 text

No content

Slide 167

Slide 167 text

影片《All the Little Things》 by Sandi Metz, RailsConf 2014 精彩的表演! 五星推薦 ⭐⭐⭐⭐⭐

Slide 168

Slide 168 text

影片《All the Little Things》 by Sandi Metz, RailsConf 2014

Slide 169

Slide 169 text

影片《All the Little Things》 by Sandi Metz, RailsConf 2014

Slide 170

Slide 170 text

《Practical Object-Oriented Design in Ruby: An Agile Primer》 by Sandi Metz 先從了解物件導向設計開始! 五星推薦 ⭐⭐⭐⭐⭐

Slide 171

Slide 171 text

物件導向基礎到 Design Pattern https://refactoring.guru/design-patterns 清楚⼜簡單描述物件導向概念 GoF Design Patten

Slide 172

Slide 172 text

還 不 懂 沒 關 係 
 C i n d y會 表 演 給 ⼤ 家 看 ! 突如其來的業配!

Slide 173

Slide 173 text

R a i l s 中 常⾒ 的 Pattern

Slide 174

Slide 174 text

Model, View, Controller

Slide 175

Slide 175 text

Fat Model, Skinny Controller? 商業邏輯要集中在 Model 上

Slide 176

Slide 176 text

專案越複雜,東⻄越不知道要放哪裡

Slide 177

Slide 177 text

• Service Objects • Value Objects • From Objects • Query Objects • View Objects ( Serializer / Presenter ) • Policy Objects • Decorators 我們需要更多的 pattern in Rails ! https://www.sitepoint.com/7-design-patterns-to-refactor-mvc-components-in-rails/

Slide 178

Slide 178 text

還 不 懂 沒 關 係 
 澤 清 哥 會 表 演 給 ⼤ 家 看 ! 突如其來的業配!

Slide 179

Slide 179 text

所以 那 個⼀千 ⾏ 的 class 呢

Slide 180

Slide 180 text

(先看完了上⾯那堆書)

Slide 181

Slide 181 text

幫 1000 ⾏的 class 補上單元測試 找出程式碼內的單⼀職責 拆解出物件 再補上單元測試

Slide 182

Slide 182 text

700 ⾏ 124 ⾏ + 5 個新的 class

Slide 183

Slide 183 text

程式複雜度⼤幅降低

Slide 184

Slide 184 text

資訊焦慮

Slide 185

Slide 185 text

更 多的 書

Slide 186

Slide 186 text

《 Programming Ruby》 by David Thomas , Andrew Hunt, Chad Fowler 想要更深入了解 Ruby 就看它

Slide 187

Slide 187 text

《 Rebuilding Rails 》 by Noah Gibbs 從零開始⾃幹⼀個偽 Rails

Slide 188

Slide 188 text

《 Crafting Rails 4 Applications 》 by José Valim 從建造⼀個 Rails Plugin 開始 開始瞭解 Rails 原始碼 Elixir 的作者

Slide 189

Slide 189 text

《 Docker for Rails Developers》 by Rob Isenberg 以 Rails 為基底的 超基礎⼿把⼿ Docker 教材!

Slide 190

Slide 190 text

《 The Pragmatic Programmer》 by David Thomas , Andrew Hunt Programmer 必看 程式開發的觀念⼼法都在裡⾯ 五星推薦 ⭐⭐⭐⭐⭐

Slide 191

Slide 191 text

國外技 術 書商感 恩 節 都 有 特 價 !

Slide 192

Slide 192 text

Blog《 復活節特價 Ruby 書敗家指南》 by 泰安 更多書籍推薦 我都買完但還沒看完!

Slide 193

Slide 193 text

免費 仔 學習 資 源

Slide 194

Slide 194 text

https://guides.rubyonrails.org/ 很多⼈都忘了它的存在

Slide 195

Slide 195 text

https://www.driftingruby.com/

Slide 196

Slide 196 text

http://railscasts.com/ 已經沒在更新了 但還是很有參考 價值

Slide 197

Slide 197 text

https://gorails.com/

Slide 198

Slide 198 text

https://thoughtbot.com/upcase Take “junior” out of your title

Slide 199

Slide 199 text

RSS 訂起來! http://www.rubyflow.com/ https://www.ruby-lang.org/zh_tw/ https://ruby-china.org/ https://thoughtbot.com/blog https://weblog.rubyonrails.org/

Slide 200

Slide 200 text

Podcast 聽起來! Ruby on Rails Podcast Ruby Rogues Remote Ruby Rails with Jason

Slide 201

Slide 201 text

以上!

Slide 202

Slide 202 text

給 想 要 活下來的 Ruby 菜 ⿃ ⼯ 程 師 還 有 懶 得 慢 慢 教 ⼈ 的 資 深 ⼯ 程 師

Slide 203

Slide 203 text

No content

Slide 204

Slide 204 text

Special Thanks ! 泰安老師哥、蒼時、昱陞、⻄瓜 卡米、阿瓊師 Cindy、聖甲蟲戰隊⼩夥伴 還有幫我活下來的各位⼤⼤