2016-08-05

[Design Pattern] [C#] Null Object Pattern

身為一名Developer
你一定寫過類似這樣的code

Employee em = getEmployeeByDB();            
if(em != null)  {   em.IsAvailable() }
if(em != null && em.IsAvailable()) { … }
......
if(em != null) { em.IsAvailable() } if(em != null) { em.IsAvailable() } if(em != null) { em.IsAvailable() } if(em != null) { em.IsAvailable() } ......

Employee em 是來自於 getEmployeeByDB()
我們要先確認它是不是null 接下來才呼叫它的method

所以我們每次getEmployeeByDB 之後都要判斷它是不是null

是不是很麻煩 ???
是不是很麻煩 ???
是不是很麻煩 ???

所以Null Object Pattern的存在就是為了解決這個困擾

讓我們看看原本正常的一個Case
這個故事是在描述
1. 根據ID去DB查詢 並回傳一個Employee的Instance
2. 如果查無此人 就回傳 null

來看看正常情況下 程式怎麼寫吧
em 是來自於 getEmployeeByDB(string id)
所以 em 有可能是 null
因此在使用em.IsAvailable()之前必須要先確認 em 不是 null


假設我們僅讓ID為"10001" 才當作是員工 其他人都查無此人而回傳 null


Employee裡面的實作 僅為範例


getEmployeeByDB() 原本預期會回傳兩種結果
一個是正常的Employee 另一個是null



讓我們看看 如果換成 Null Object Pattern的話 要怎麼做

一個簡單的原則 產生一個介面跟Employee一樣的Class 但是要實作當狀態是Null 或是 Failure時的回傳值 (也可能是什麼都不做)



實作步驟 :

1. 我們可以將Employee抽象出一個抽象類別 ANullableEmployee
讓Employee繼承ANullableEmployee






[註] 這裡的NullableEmployee其實就是Employee 我只是換個名字

2. 實作一個Private的Null Class, NullEmployee (同樣繼承ANullableEmployee) 這是要表示當狀態是Null的物件

    這裡值得注意的點是 要override每個抽象類別定義的方法 實作的內容必須考慮當狀態是Null時 這個method必須回傳什麼才合理

3. 在抽象類別 ANullableEmployee 中 產生一個NullEmployee的靜態變數 NULL



4. 當狀態是Null或是有誤時 回傳NullEmployee 而非null



5. Caller可以直接呼叫ANullableEmployee定義的方法 不用像之前一樣要一一檢查


如果真的還是必須要判斷是不是null
可以直接去比對
em == ANullableEmployee.NULL



Null Object Pattern 是一個簡單的實作
但是能避免每次都必須重複確認的動作
不過一個比較麻煩的點是
要去思考 要用什麼行為去代表NULL
另一方面 當抽象類別增加方法時 內部的NullEmployee也一定要複寫這個新方法喔

2016-07-10

Cross-Site Team Retrospective Experience

這是我第一次主持Cross-site 的retrospective meeting (真的要感謝我們Project Manager給我這個機會主持)
我們Project Team的成員分隔三地 (台灣 , 大陸 及 美國)
所以沒有機會讓大家聚集在白板前面一起Brainstorming
於是我找了一個線上的Tool , BoardThing
BoardThing 是一套線上的Brainstorming tool
讓不同地方的夥伴們 能夠對同一個版面貼便利貼 討論事情

以下就來記錄一下主持這場Cross-site meeting前的準備動作吧

Step 1: Survey 工具
    一開始有想過 JIRA或Trello 但實際去用之後 發現還是不太方便
    所以就開始Survey 類似的工具
    然後就看到這篇文章 
    太棒了 有人已經整理好了一堆工具
    於是我就從裡面找幾個適合的來試用
    
    發現BoardThing 可以讓參與者很方便的加入Board
    只需要share link, 參與者就能加入
    貼便利貼的效果也不錯 能分組 能投票 也能畫畫

    所以 BoardThing 就決定是你了

Step 2: 寫下使用方法
    決定採用BoardThing之後 為了要讓夥伴們會使用
    所以寫了上一篇文章
    讓夥伴們能夠清楚地了解怎麼使用這個Tool

Step 3: 請夥伴們試用
    會議前一天 我Create一個Rehearsal的版讓夥伴們先行試用 主要是我想確定每一個人都能夠貼便利貼

Step 4: 準備Board的Template
    我設計完當天要進行的方向與流程之後 便Create這個版的Template
    在這個Template 我先塞進了以下東西 (用不同顏色的便利貼代表不同功能)
    寫這麼多描述的目的是 我希望大家看這個Board就知道我們要幹嘛
    (1) Rule & Information
          紅色便利貼 : 這個會議的規則 例如 對事不對人 , 請勿中斷他人發言等
    (2) Timebox
          綠色便利貼 : 低頭寫便利貼的時間 / 大家討論的時間
    (3) Column
          灰色便利貼 : 流程 (例如 : good, bad)

    圖為Template的一部份


Step 5: Go
    到了Retrospective當天 我先描述今天的流程
    進行時 盡量遵守Timebox
    為了讓每個人在時間內都有講到話 
    我限制一個人一次只能講一張便利貼
    如果時間還沒結束 就能繼續輪流下去
    所以請大家一定要先從最想講的話題開始
    
    低頭寫便利貼的時間 是請大家先把想講的話貼在Note上
    待輪到時 就用貼上的方式Create一張新便利貼
    若是想講的話已經有人貼過了 也可以用複製便利貼的方式貼上
    使用上真的跟在白板上貼便利貼一樣便利

Step 6: Export
    BoardThing的缺點就是輸出不太方便 所以我用拍照的方式整理最後的結論

結論
BoardThing真的是套方便的 online brainstorming tool
參與者能夠很方便的加入討論
使用上跟在白板上討論差不多
而且還是免費
所以推薦給各位有需要remote brainstorming的朋友

2016-06-18

[工具篇] BoardThing - online brainstorming tool

目的
Retrospective Meeting

需求
要有線上白板功能
要讓Member 方便存取白板 (不要再另外註冊帳號)
最好有便利貼的感覺
方便分組
投票

緣由
由於我們Project Team的成員分隔三地 (台灣 , 大陸 , 美國) 所以我們沒辦法大家一起在白板前面做Brainstorming. 更何況是需要member們聚在一起的Retrospective Meeting了.
所以我就花了一點時間Survey了一下 目前有哪些online brainstorming的工具

參考來源 :
26 Tools for Online Brainstorming and Decision Making in Meetings
BoardThing

裡面試用了幾套 最後覺得這套 BoardThing最好用
只要主持人自己開了一個Board 將這個Board的link 分享出去
參加者就能參與討論 一起貼便利貼了

接下來就為大家介紹 怎麼使用這個Tool

How to Use BoardThing

Step1 主持人要先去BoardThing註冊 這部分就不特別提了
BoardThing 官方網站
http://boardthing.com/

新建一個Board


進入剛新建的Board 一片空白


來貼上第一張 便利貼 吧


便利貼可以用圖片

圖片還可以用網路上的Link

便利貼可以換顏色 不是只有黃色喔


可以用拖曳的方式 將類似的便利貼分組
不過很可惜 分組完會自動將第一張便利貼變成群組的名字

所以可以選擇先貼一張來當作群組名字
或是直接編輯這個群組

變成群組之後 可以設定投票

投票是針對裡面的便利貼 點一下圓圈就會 + 1
不過缺點是 按了就按了 不能取消
白板上還可以用畫筆 我們也可以用這個來分類

這個畫筆 也可以用橡皮擦功能擦掉
如果懶得打重複的字 可以Copy便利貼


可以Resize 便利貼的大小


最重要的一點 要將這個Board 分享給參與者

參與者只要在瀏覽器貼上這個Link 就能馬上加入這個Board的編輯


最後這個Board 是個Export出來的
只是我覺得效果不是很好




最後讓大家看看 我們POC 的 一個Board


目前還沒有讓團隊來試過
所以也還不確定多人同時上線的效果如何?
待我們試過之後 我再回頭報告測試的結果


2016-06-14

How to get started with .NET Core on Mac

最近剛入手Mac 唯一一個還不習慣的是
過去常常開Visual Studio來寫一些POC 驗證一些演算法 一些想法
但是在入手Mac之後就變得不方便了

剛好最近剛瞄到.NET Core 於是就來研究看看怎麼在Mac上開發.NET的程式
參考了很多資料之後 發現很多套件要安裝
這篇文章的目的 就是將這些步驟整理起來

Step 1 : Install Homebrew Requirements
為了要開發.NET Core 我們必須要先安裝OpenSSL套件
目前可以透過Homebrew來安裝 OpenSSL
但是安裝Homebrew之前 我們必須先安裝Xcode

(1) 透過Apple Store 安裝Xcode
(2) 將你的apple id加入到Xcode
(3) Get Command Line Tool
In Terminal >
xcode-select --install

(4) 確認是否正確安裝
In Terminal >                
 xcode-select -p
               


Step 2 : Install Homebrew
安裝 Homebrew
In Terminal >
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"          

Step 3 : Install OpenSSL
In Terminal >
brew update
brew install openssl
brew link —force openssl
           
           
Step 4 : Install .NET Core
安裝完OpenSSL之後 就能開始安裝.NET Core SDK了
(1) 如果有裝過過去版本的.NET Core 請將他們移除
https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh

(2) 下載官方的PKG Package
https://go.microsoft.com/fwlink/?LinkID=798400

(3) 安裝.NET Core SDK        
         
Step 5 : Install Visual Studio Code
正所謂工欲善其事 必先利其器
Visual Studio的好用就不多說了
但是Visual Studio Code 比較像是Editor (但是仍是相當強大的Editor)

(1) 到官網去下載 Visual Studio Code
      https://code.visualstudio.com/

(2) 安裝 C# Extensions
      打開 Visual Studio Code
      打開 Quick Open (⌘+P)
      輸入 ext install csharp

Step 6 : Install Yeoman
Yeoman Generator for ASP.NET Core 1.0能夠幫你很快地建立一個.NET Core的專案
要安裝Yeoman之前要先裝Node.js
請參考 https://www.npmjs.com/package/generator-aspnet
           
(1) 透過剛剛裝好的homebrew 安裝 Node.js
In Terminal >
brew install node

(2) 透過剛剛裝好的Node.js 安裝Yeoman
In Terminal >
npm install -g yo

(3) 安裝 bower
In Terminal >
npm install -g bower
           
(4) 安裝 Yeoman generator for ASP.NET Core 1.0
In Terminal >
npm install -g generator-aspnet

Step 7 : 建立新專案
你可以選擇你要建立哪一種專案
我們這邊先選擇建立一個Console Application
In Terminal >
yo aspnet
           
           
 
給專案一個名字吧
你會發現 Yeoman 有提示你接下來該怎麼做 照做就好了


到專案的目錄 輸入 dotnet restore 目的是重新整理這個專案的project.json file
接著你就能輸入 dotnet build 去build 這個專案 最後 dotnet run 執行這個程式



Step 8 : 來寫個程式吧
打開 Visual Studio Code
File -> Open (這邊請選擇整個專案Folder)
           

開始coding


Build


Run




Reference :
It is very easy to get started with .NET Core on your platform of choice.
如何在 Mac 建立 ASP.NET Core RC2 網站
Your First ASP.NET Core Application on a Mac Using Visual Studio Code
Visual Studio Code Getting Started
http://edentsai231.logdown.com/posts/151421-install-homebrew-in-mac-os-x
Tutorials

2016-05-31

新部門的首次Retrospective


轉到新部門也一個月了
這個月多多少少也聽到一些抱怨
也觀察到一些可以改善的空間
所以就讓同事們來體驗一下Retrospective Meeting
希望能找出大家的共識
以及討論出可以解決痛點的Action Item

今天使用的引導方法仍是O.R.I.D


  • O是 Objective , 代表客觀的事實
  • R是 Reflective, 代表心中的感受
  • I 是 Interpretive, 代表上述事實或是感受的解釋
  • D是 Decisional, 代表行動

由於同事們過去沒有參加過Retrospective的經驗
所以開場我先花幾分鐘解釋一下
Retrospective的目的及ORID的含義

首先

Retrospective不是幹譙大會喔!!!
Retrospective不是幹譙大會喔!!!
Retrospective不是幹譙大會喔!!!

我們是希望透過大家的共識找出痛點
然後看看有什麼是團隊內部可以改進的?
哪些是團隊外面的問題 要怎麼處理?

今天進行的方式是ORID各個區塊分別討論10分鐘
3分鐘讓大家一起寫便利貼
7分鐘時間讓大家輪流上來說明
一次說2~3張
最後我們找出一個可以改善的Action Item

進行到一半的時候
我發現很多情緒是在抱怨一個團隊外部的問題
於是我就稍微引導一下
希望大家能再想一下 我們團隊內部 自己能做些什麼?
畢竟外面的問題 抱怨再多 也不是我們能控制的
所幸後來還是有討論出對內的Action Item
下個月就來試試看吧!!!

[今日Retrospective的Retrospective]
今天有幾點是下次可以再改進的
1. 從O->R的過程中 應該要有所連結的 不然光看情緒便利貼 會忘記這在抱怨什麼
        下次來試試 "水道"
2. 討論root cause 時 很容易把Action Item也一起講出來了
         e.g. 我覺得問題是xxxx 所以我們應該要oooo
3. 群組討論的感覺還是少了一點 大家是上台講自己的想法
    但是這次還是少了一些互動與討論
    下次試試 讓大家圍在白板前面討論
4. 雖然時間有限 但還是希望大家都能多提一些正面, 令人開心的事 算是正面的力量吧 可以鼓舞大家的士氣
5. 討論Decisional的時間仍舊不夠 今天應該要在Interpretive階段選出大家想要改善的問題
    然後鎖定這個問題在Decisional時討論Action Item

=================
[第二次的Retrospective]
本部門第二次的Retrospective Meeting 我嘗試加入了上次的一些回饋
1. 水道
2. 圍著白板討論
3. 先花5分鐘提開心的事

儘管今天的時間還是有超時
不過最後大家針對Decisional的討論 有進入狀況
也真的引導出大家的痛點

持續改善吧

2016-04-14