[閱讀筆記] 穀倉效應

第七章 取下鏡片: 醫生如何避免經濟專家的錯誤

克里夫蘭臨床醫學中心的歷史

1880 AD
草創時期隨克里夫蘭城市發展落成。

一次大戰後,參考自軍醫的「小組合作模式」,
改變醫院的運作模式。
—不同的背景人才組成的醫療小組—
固定薪資,分享紅利

二次大戰後,克里夫蘭城市開始走下坡,
但靠著創意和明星醫師成功擴張醫院。

二十世紀末,員工成長至 4 萬人,穀倉與官僚問題漸增,

透過空橋/電子系統/地道系統/機器人等設施…,
致力追求無縫連接。

隱憂: 技術與組織變得愈來愈複雜,反而是一種穀倉:

醫生的故事

寇斯巴洛夫有閱讀障礙,所以成績不好;

用圖像式記憶法才完成學業;

但是在實務層面卻大放異彩;
當上了克里夫蘭臨床醫學中心執行長。

越戰後的反思,為什麼醫界不是採取團隊工作?

所以加入了克里夫蘭臨床醫學中心。

結合縫紉發展改良了心臟手術。
創新就是要挑戰既有界線

改革

  1. 拿掉醫師與護士的界線

    (Front-Backend?DevOps?Sales/BD/PD/RD?)

    以患者與疾病為核心;
    不以醫界既有科別區分,成立新部門

    比如說,脊椎病症:
    神經內科/心理科/生醫影像科/整型外科 more …
    → 大馬: rd1/rd2/.../Rd5/app/f2e/ait/PD

    特殊規劃小組,制定改革時間表
    One Team ? SRG ?

  2. 外部體系(保險公司/醫療協會)仍是專門分科

    所以又成立影子部門

  3. 改善空間,不只是功能性,鼓勵逗留與聊天

結果

  1. 醫療浪費減少,成本更低,「把照顧病患而非官僚體制放第一」
  2. 每位醫生診斷時會想到不一只種界定分類方式
  3. 改善空間帶來的互動不亞於會議
  4. 急救中心轉診速度提昇

原本的優勢

  • 固定薪資制,醫生不會為了績效多作治療
  • 原本就有的團隊合作文化

小結與反思

  1. 反思現有的分類,甚至加以顛覆
  2. 專業分工是組織變得複雜的龐大後的必然結果
  3. 創新就是要挑戰既有界線
  4. 以患者與疾病為核心 ?
    → 我們以○○為核心?股東、客戶、產品、品質、速度、員工
  5. 我們作的不對,我們必須改變
  6. 改革會一直遇到問題,我們有解決問題的機制嗎 ?
  7. 克里夫蘭臨床醫學中心是從上到下的改革,我們的組織是嗎 ?

(fin)

[實作筆記] 在 Windows 環境編輯 Compass

敗破警告

這篇文章提及的內容過於老舊,不建議浪費你寶貴生命閱讀

原文

  1. 安裝 Windows 套件管理工具 Chocolatey

  2. 安裝 Node.js®

    1
    choco install nodejs -y
  3. 註冊公司內部 NPM Server

    1
    npm set registry http://company.npm.server
  4. 安裝 RUBY

    1
    choco install ruby -y
  5. 下載 RubyGems

  6. 安裝 compass

    1
    gem install compass
  7. 檢查 PATH

  8. 重啟 CMD 與 Visual Studio 2017

  9. 執行 compass

    • 使用 Command Line

      1
      gulp compass
    • 使用工作執行器總管

      工作執行器總管

(fin)

[實作筆記] 重灌開發環境

1.Typescript 踩雷

問題

visual studio 預設會安裝 typescript 2.6
專案使用 typescript 2.3 , 因為暫時無法升級到 2.6 以上的版本
會導致專案無法編譯成功

解決步驟

  1. 在專案目錄執行 npm i 重新安裝相關 module
  2. compile 後發現 node_modules/@types 中有檔案無法成功編譯
  3. 移除 node_modules/@types 整個資料夾
  4. 重新 compile 後仍會無法成功
  5. 移除 C:\Program Files (x86)\Microsoft SDKs\TypeScript\2.6 (非必要,好像要看 vs 預設載入的版本為何?)

2.多語系 dll 衝突

  1. 清空bin資料夾
  2. 清空 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\資料夾
  3. 重建前台專案

3.Chocolatey

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
choco install googlechrome -y
choco install dropbox -y
choco install evernote -y

choco install git -y
choco install nodejs -y
choco install putty -y
choco install visualstudiocode -y

choco install winmerge -y
choco install slack -y
choco install linqpad -y
choco install 7zip -y

choco install gitkraken -y
#choco install sourcetree -y

(fin)

[翻譯] 為什麼IBM/Google/Microsoft都要在今年增加對台投資?

原文

重點節錄

  1. Google 宣布要在台灣顧用 300 名員工並訓練 5000 名學生在人工智能領域
  2. 微軟也表明未來要在台灣發展 AI 業務,5 年內投資 3400 萬鎂並招聘 200 人
  3. IBM 也表示將在台灣擴展 AI/區塊鏈/雲計算等相關的研發中心,並增聘 100 人以上

美國的投資與台灣的人材

台灣的優點

  1. 人材容易訓練適應 AI 等新產業的工作
    • 通常大學畢業生都有基礎工程知識
    • 台灣的擁有製造業供應鏈(跨軟韌硬體)的人材
    • 便宜(Orz)
  2. 地理優勢(東北亞\東南亞\中國)
  3. 台灣目前政策
    • IoT(物聯網)與智能機器
    • 正在進行產業轉型(硬轉軟)
  4. 其它
    • 穩定且便宜的電力與其它基礎建設
    • 合理的成本結構

中國的競爭

  1. 人材更便宜
  2. 美中貿易戰的擔心
    • 資訊安全
    • 智慧財產

其它

(fin)

[學習筆記] Linux 語法學習筆記 二

上一篇我們學會一些基本 linux command,
接下來我們將介紹更多的命令並組合它們到 shell script.
讓 script 幫助我們完成一些事, 就像魔法一般, 開始囉.

補充指令

vim

開啟 vim 編輯器

echo

印出文字

$ echo “text”
text

印出變數 echo $*

印出 PID (Process ID) echo $$

set

設定變數

$ set good morning marsen

補充:使用 echo 印出變數,從 1 開始
$* 指所有變數

$ echo $1
good
$ echo $2
morning
$ echo $3
marsen
$ echo $*
good morning marsen

進階使用 backticks 執行 cat Command

$ cat > testfile
hello world
sh-4.4$ set cat testfile
sh-4.4$ echo $*
hello world

範例

Hello World

  1. 建立檔案

$ cat > helloworld.sh

  1. 編輯檔案

$ vim helloworld.sh

1
2
#say hello
echo "hello world"
  1. 執行檔案

$ sh helloworld.sh
hello world

變數 variable

  1. 大小寫有分
  2. 使用 read 讀取 input 到變數中
  3. 使用 $+變數名呼叫變數

sample:

1
2
3
4
# this is a shell sample
echo "who are you?"
read name
echo "Hi, $name nice to see you."

executed:

$ sh whoareyou.sh
who are you?
Mark
Hi, Mark nice to see you.

互動式重新命名檔案

sample:

1
2
3
4
5
# this is a shell sample
echo "keyin a filename"
read name
mv $1 $name
echo $name"

$ sh rename.sh file1
keyin a filename
newfile
newfile

其它

  1. 額外的 vim 問題排解 E348: No string under cursor 表示未輸入 i 進入 Insert mode

    • ESC + : , 輸入 w filename (以 filename 保存)
    • ESC + : , 輸入 wq (存儲並離開 vim)
    • ESC + : , 輸入 q! (不存儲並離開 vim)
  2. 「**`**」 Backquote 或 backticks

參考

  1. Unix Terminal Online
  2. 離開 Vim 的100 種方法
  3. 鳥哥的 Linux 私房菜—認識與學習 BASH

(fin)

[學習筆記] 允許 IAM User 存取 AWS Billing Console

前情提要

設定了 IAM User Account 也給予了 Administrator 的權限,
不過仍然看不到 Billing 的頁面資訊 .

Billing

這帶來了很大的不方便, 因為如果要看 Billing 的資訊就要切換到 Root Account
而建立 Administrator IAM Account 的用意本來就是要儘可能不使用 Root Account 作登入.
檢查了權限,明明就有設定 Read Billing 但是仍然看不到.

解決方法

實際上要進入 Billing Console 其實要有兩個步驟

  1. 權限要設定,更多細節可以參考這篇文章(2014)
  2. 要透過 Root Account 在 Account Settings 頁面設定, 允許 IAM user 存取 Billing Console

Root Account

參考

(fin)

[學習筆記] Linux 語法學習筆記 一

參考

學習筆記

Clear

清除目前 terminal 畫面

Cal

產生當下的月曆

$ cal

March 2018
Su Mo Tu We Th Fr Sa

         1  2  3

4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

$ cal 2 1985

February 1985
Su Mo Tu We Th Fr Sa

            1  2

3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28

Date

顯示日期與時間

$ date

Sat Mar 10 19:01:37 UTC 2018

$ date  ‘+ %y-%m-%d %n %H:%M:%S:%N’

18-03-10
 19:06:24:126172657

pwd

目前所在的檔案路徑

Touch

建立檔案

mkdir

建立資料夾

cat

寫檔案 cat > filename

ctrl + d 可以離開編輯

讀檔案 cat < filename

合併檔案 cat file1 file2 > merged_file

$ cat > file1
this is file1
$ cat file1
this is file1
$ cat > file2
this is file2
$ cat file2
this is file2
$ cat file1 file2 > merged_file
$ cat merged_file
this is file1
this is file2

mv

重新命名檔案

mv origin_name new_name

rm

刪除檔案或資料夾

$ rm file_name

$ rm -r folder_name/

rmdir

刪除資料夾

$ rmdir folder_name/

cp

複製檔案

$ cp oldfile other_folder/newfile

ln

$ touch one
$ cat < one
$ ln one two
$ ls
one two
$ cat > one
this is one
$ cat < one
this is one
$ cat < two
this is one

hard link 會產生實體檔案,soft link 只是指標的轉向.
如果使用 soft link,當刪除原始檔案時,link 檔案將無法開啟.

檔案權限概觀

三種權限

  • read / 讀 / 100 => 4
  • write / 寫 / 010 => 2
  • execute / 執行 / 001 => 1

每個權限都有一個代號,
read 表示可讀權限, 意味著可以開啟檔案與看見內容,
代號為 4,二進位表示為 100
write 表示可以複寫其內容,
代號為 2,二進位表示為 010,
execute 代表可執行,適用可執行檔或 shell script,
代號為 1,二進位表示為 001.
三種權限都有的話,權限為(111=>7)

三種身份

  • owner 開啟的帳號
  • owner group 開啟的帳號所屬的群組
  • other group 其它的群組

新增一個檔案的時候,
預設只有讀寫,沒有執行的權限 (100|010=110=>6)

指令 umask 的設定值以三個八進位的數字“nnn”代表。
第一個設定數字給使用者自己(owner user),
第二個則是設定給用使用者所屬的群體(group),
第三個給不屬於同群體的其它使用者(other)。
每一位數字的設定值都是三項不同權限的數值加總,
read 權限數值為 4;write 權限數值為 2;execute 權限數值為 1。
結合了前三者的權限數值,單一的數字可設定的範圍是 0 ~ 7;
整體的可設定範圍是 000 ~ 777。
— 鳥哥的 Linux 私房菜

ls

列出資料夾中的所有檔案

ls foldername

列出指定的資料夾中所有的檔案

ls -l

列出資料夾中的所有檔案與其權限資訊

ls 最常被使用到的功能還是那個 -l 的選項,為此,很多 distribution 在預設的情況中, 已經將 ll (L 的小寫) 設定成為 ls -l 的意思了!其實,那個功能是 Bash shellalias 功能呢
— 鳥哥的 Linux 私房菜

chmod

修改檔案權限

sh-4.4$ ls -l
total 4
-rw-r–r– 1 33581 33581 978 Mar 12 17:30 README.txt
-rw-r–r– 1 33581 33581 0 Mar 12 17:32 test
sh-4.4$ chmod 777 test
sh-4.4$ ls -l
total 4
-rw-r–r– 1 33581 33581 978 Mar 12 17:30 README.txt
-rwxrwxrwx 1 33581 33581 0 Mar 12 17:32 test
sh-4.4$ chmod 444 test
sh-4.4$ ls -l
total 4
-rw-r–r– 1 33581 33581 978 Mar 12 17:30 README.txt
-r–r–r– 1 33581 33581 0 Mar 12 17:32 test

uname

顯示系統相關的資訊

$ uname -a                                                            
Linux e955582759de 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 
2017 x86_64 x86_64 x86_64 GNU/Linux

選項與參數:
-a :所有系統相關的資訊,包括底下的資料都會被列出來;
-s :系統核心名稱
-r :核心的版本
-m :本系統的硬體名稱,例如 i686 或 x86_64 等;
-p :CPU 的類型,與 -m 類似,只是顯示的是 CPU 的類型!
-i :硬體的平台 (ix86)
— 鳥哥的 Linux 私房菜

file

查詢檔案基本資料(類型)

file *

jazzy: ASCII text
mark: empty
marsen: directory

wc

顯示檔案資訊

行數 字數 字元數 檔名

$ wc jazzy

3 10 39 jazzy

wc -l filename

顯示檔案行數資訊

wc -w filename

顯示檔案字數資訊

wc -c filename

顯示檔案字元數資訊

sort

印出排序過後的結果(遞增)

$ sort
owls
pigs
dogs
cats

cats
dogs
owls
pigs

sort filename

印出檔案內排序過後的結果(遞增)

cut

切割資料

參數:
-d 分割字元
-f index (從 1 開始)

範例

cat > filenames
Name-Sport-Age
Roger-Tennis-30
Nadal-Tennis-25
Tiger-Golf-37
Michael-Baseball-49

$ cut -d”-“ -f 1,3 filenames
Name-Age
Roger-30
Nadal-25
Tiger-37
Michael-49

dd

資料處理、拷貝、備份、轉碼;更多

$ cat > infile
this is the input file
$ cat infile
this is the input file

$ dd if=infile of=outfile conv=ucase
0+1 records in
0+1 records out
23 bytes copied, 6.6972e-05 s, 343 kB/s
$ cat outfile
THIS IS THE INPUT FILE

man

查詢其它指令用法

$ man ls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LS(1)	User Commands  LS(1)
NAME ls - list directory contents
SYNOPSIS ls [OPTION]... [FILE]...

DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of
-cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .

-A, --almost-all
do not list implied . and ..

--author
with -l, print the author of each file

-b, --escape
print C-style escapes for nongraphic characters
Manual page ls(1) line 1 (press h for help or q to quit)

h看更多訊息

$ man ls
h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                   SUMMARY OF LESS COMMANDS

Commands marked with * may be preceded by a number, N.
Notes in parentheses indicate the behavior if N is given.

h H Display this help.
q :q Q :Q ZZ Exit.
---------------------------------------------------------------------------

MOVING

e ^E j ^N CR * Forward one line (or N lines).
y ^Y k ^K ^P * Backward one line (or N lines).
f ^F ^V SPACE * Forward one window (or N lines).
b ^B ESC-v * Backward one window (or N lines).
z * Forward one window (and set window to N).
w * Backward one window (and set window to N).
ESC-SPACE * Forward one window, but don't stop at end-of-file.
d ^D * Forward one half-window (and set half-window to N).
u ^U * Backward one half-window (and set half-window to N).
ESC-) RightArrow * Left one half screen width (or N positions).
ESC-( LeftArrow * Right one half screen width (or N positions).
F Forward forever; like "tail -f".
r ^R ^L Repaint screen.
HELP -- Press RETURN for more, or q when done

q退出查詢畫面

輸出用#組成的大形文字

實測未出現,上網查了一下 banner 好像有蠻多不同的類型可以安裝?

compress

壓縮檔案

zcat

讀取壓縮檔案

uncompress

解壓縮檔案

compress 已經退流行了。為了支援 windows 常見的 zip,其實 Linux 也早就有 zip 指令了! gzip 是由 GNU 計畫所開發出來的壓縮指令,該指令已經取代了 compress 。
— 鳥哥的 Linux 私房菜

小結

以上是一些基本的 Linux Command ,
下一篇,我們會建立.sh 檔,將 Linux Command 依照指定的順序執行
並使用 sh 命令執行
用以完成一些更進階的工作.

(more..)

[學習筆記] AWS EC2 學習筆記 AWS CLI 與 Login

安裝 AWS CLI

配置 AWS CLI

EC2 開機

EC2 開機

  • 直接開機跳過網路設定(也還沒有辦法設)
  • 第 5 步驟設定 TAG ,對找尋 ec2 的 instance 很有幫助

設定 Putty

連線機器

連線機器

ex:

1
ssh -i /path/my-key-pair.pem [email protected]

預設連線帳戶

For Amazon Linux, the user name is ec2-user.
For Centos, the user name is centos.
For Debian, the user name is admin or root.
For Fedora, the user name is ec2-user.
For RHEL, the user name is ec2-user or root.
For SUSE, the user name is ec2-user or root.
For Ubuntu, the user name is ubuntu or root.
Otherwise, if ec2-user and root don’t work, check with your AMI provider.

windows 好像是 Administrator ? 求補充

Docker

安裝 Docker

1
sudo yum install docker

啟動 Docker 服務,並讓它隨系統啟動自動載入

1
2
sudo service docker start
sudo chkconfig docker on

雷包

  • 重啟機器的話 public dns 會改變.(意味連線的命令參數會變)
  • 注意使用的 AIM, 不同的 Linux OS 會有不同的套件執行命令
  • ubuntu apt-get
  • CentOS yum

參考

(fin)

[讀書會] 單元測試的藝術 - 導讀、序與第一章

要知道的事

  1. 這是單元測試的藝術的閱讀筆記
  2. 筆記的意思就是不一定會有心得
  3. 這篇主要是導讀

譯者序

  • TDD , Test First to Think First
  • 什麼是好的單元測試?
  • 單元測試三支柱:可信任 可讀性 可維護
  • 綠色安全區域
  • 實務上導入的指引

入門建議

  • 了解如何隔離相依(Part II)
  • Stub 與 Mock 的差異,熟練隔離框架(NSubstitute)
  • 如何撰寫優秀的單元測試(Part III)

進階建議

  • 如何撰寫優秀的單元測試(Part III)
  • 如何在組織中導入單元測試(Part IV)
  • 針對遺留代碼的重構與測試,以及可測試性設計(Part IV)

避免

  1. 測試不穩定
  2. 過度指定
  3. 一次不只測一件事
  4. 測試程式重複過多
  5. 可讀性差

關於本書

前言

有寫測試, 也不保証專案成功,
一個失敗的單元測試案例,
作者歸納原因如下,

  • 脆弱的測試(Prod 改一點,測試就錯一大片)
  • 不易維護
  • 測試間相護依賴
  • 可讀性差

作者推薦的框架

學習路線圖

  • Part I 基礎知識
  • Part II 測試框架
  • Part III 最佳實踐
  • Part IV 組識導入/遺留代碼/設計

目錄

  1. 入門
    • 什麼是優秀的單元測試
    • 單元測試與整合測試的分別
    • 第一個單元測試
  2. 核心技術
    • Stub
    • IoC(DI)
    • 值、狀態與互動
    • 測試框架
    • 事件
    • 深入了解測試框架
  3. 測試程式碼
    • 自動化
    • 綠色安全區域
    • 可信任/可維護/可讀性
  4. 設計與流程
    • 組織導入
    • 遺留代碼
    • 設計與可測試性

定義單元測試

什麼是優秀的單元測試

  1. 自動化, 可重複執行
  2. 容易實現*
  3. 到第二天還有存在的意義(非臨時性的,ex:hotfix)
  4. 任何都可以一鍵執行
  5. 執行速度快
  6. 結果一致
  7. 可以完全控制(不與外部相依)
  8. 獨立於其他測試
  9. 失敗時,錯誤應該是明確的

整合測試

  1. 整合測試相依於真實物件
  2. 整合測試的結果不穩定
  3. 整合測試與單元測試應該被分開(見 ch7.2.2)
  4. 整合測試執行時間長
  5. 依據現實狀況無法完全控制
  6. 缺點: 一次測試的東西太多

理解測試趨動開發

  1. TDD 不保證產品會成功
  2. 步驟
    1. 寫一個失敗的測試
    2. 寫一個符合測試預期的產品程式碼,以通過測試
    3. 重構

TDD 的核心技能

  1. 可維護、可讀、可靠(這本書的目的)
  2. 寫出可維護、可讀、可靠的測試不等於 TDD,至於如何寫優秀的 TDD,作者推薦閱讀〈Test-Driven Development:by Example〉
  3. 就算執行 TDD,也不保証能設計一個完善的系統,作者推薦閱讀Growing Object-Oriented Software, Guided by Tests無瑕的程式碼

簡單說就是:

  • 寫好測試
  • 測試先行(TDD)
  • 設計

作者認為這是三種技能, 同時學習三種技能門檻會相當的高, 最後導致放棄.

小結

  • 優秀的測試就是
    • 自動化
    • 容易撰寫
    • 執行快速
    • 任何人都可以執行,並得到相同結果

揪錯

印刷錯誤

本書資源

  1. Samples
  2. The Art Of Unit Testing
  3. Videos

(fin)

[活動筆記] 變異測試 - 一種改進測試和代碼的 「新」 方法

應該知道的事

  • 範例使用 Java
  • 這場活動使用人肉找尋變異
  • 實務上應使用工具
  • 但是不能完全相信工具
  • 活動聯結
  • 講師是 Odd-e 的姚若舟
  • 簡報 preview 版

什麼是變異

前言

想像一下產品(Production)就是你的身體,
我們可以透過健康檢查(Unit Test);
檢查你的身體有沒有異狀 ?

但是檢查真的可靠嗎 ?
比如說一般的流感的快篩只有 50~60%的準確率,
我們的測試也無法達到 100%準確率(這裡不是指覆蓋率喔).
如何抓到測試抓不到的漏網之魚就是變異測試的目的.

我們透過讓 Production 產生變異(Mutation)
來確認我們的 Unit Test 是否可靠.

題外話,當大流行的時候會跳過快篩節省醫療資源,
因為可能有一半(50%)的患者都是流感,
而快篩準確率也只有 50%,加上時間及醫材成本,
不如直接開克流感能有效抑止疫情

變異測試(Mutation Testing)

變異後導致測試失敗?
yes , good
應該要失敗,表示你的測試有覆蓋到這個變異

no , test not covered
這表示你的測試並未

測試不一定能補捉變異

比如說 邊際值 或是 隱含的互動;
測試覆蓋率 100%也不一定能補捉變異
要麼少了 test case,
要麼多了無意義的代碼
看看以下例子
ex:

1
2
3
4
5
6
foo(x,y)
{
//// logic here
sideeffct();
return z;
}

反思一下, 測試過了代碼就沒問題 ?
不能捉到變異的測試,
有發揮它的功能嗎 ?
一般來說如果透過 TDD 進行軟體開發,
我們的測試應該是會恰巧符合一項 Test Case
而如果是先寫代碼再寫測試,
將很難通過變異測試(容易產生多餘的代碼)

找到變異的幾個方向

  • 邊界條件(< => <=)
  • 反向條件(< => >)
  • 移除條件(永真/永偽)
  • 數學
  • 遞增/遞減
  • 常量
  • 返回值
  • 移除代碼

先寫代碼再寫測試有問題是很正常的

Kata-PokerHands 範例

原碼(使用 java)

變異實例

有問題 ,反向測試案例不足

1
2
3
4
5
6
7
private List<Integer> getPairCardRanks(List<Integer> cardRanks) {
List<Integer> result = new ArrayList<>();
for (int index = 0; index < CARD_COUNT - 1; index++)
if (isTwoNeighborCardRanksEquals(index, cardRanks))
result.add(cardRanks.get(index));
return result;
}

有問題 , -1 但是預期中的行為

1
2
3
4
5
6
protected   Integer   getThreeOfAKindCardRank(List<Integer\> cardRanks) {
for (int index = 0; index < CARD_COUNT - 2; index++)
if (isThreeNeighborCardRanksEquals(index, cardRanks))
return cardRanks.get(index);
throw new IllegalStateException();
}

其它

  1. 沒有 TDD 沒有單元測試,別跑變異測試
  2. 至少要有行級別的覆蓋率(line coverage)
  3. 分支覆蓋(Branch Coverage)好一點 仍不夠
  4. 在需求不變的情況下,再作變異測試
  5. 以變異測試的角度來說,覆蓋率 100%是木有用的(testing coverage is useless)
  6. 發現變異怎麼辦
    • 報告(記錄)
    • 重現
    • 評估
    • 修改 或 補測試
  7. 依靠工具不要相信工具,上一步的評估
    Ex: mock 物件會取代互動實際的行為,導致變異測試失敗

Tools

參與者心得

  1. 變異測試 (Mutation Test) —  一種提高測試和代碼質量的 ”新”  方法速記

  2. Test - 變異(Mutation)測試之你的測試到底是寫爽的,還是有效的?

心得

  1. 佩服當天就能寫出文章的人
  2. 變異測試是好上加好的測試
  3. Odd-e 的講師真的很粉棒, 雖然不致到毀三觀 不過眼界大開

參考

(fin)

Please enable JavaScript to view the LikeCoin. :P