2017年8月5日 星期六

別再只問我要答案,這次沒有!

這幾年做教育訓練、顧問服務、和系統導入,發現一件有趣的事情。

有幾次碰到一些客戶(有商業公司、非營利組織、學校…都有),在開會或課程之後私下跟我說,希望我們在提供建議的時候,可以『直接』告訴我們的team member,這件事情該怎麼做,而不用花太多時間告訴我們這些事情的原則,或是背後的邏輯或原理。因為team member只需要快速地得到答案,加上事情很緊迫,他們也沒有時間去學,說多了徒增困擾(這句話有個潛台詞,建議讀者細想,很有趣…),顧問(講師)直接告知做法之後,我們就可以比較快進入下一個問題(議題)。

可能有人看了上面這段話不明白意思,我舉其中一個比較具體的例子。

有一次碰到一個軟體開發的資安問題,我花了幾個小時解釋為何程式碼這樣寫不行,為何這有可能帶來風險,從這樣的程式碼我們可以得知外包的開發人員應該有哪些問題…,幾個小時下來,我發現,客戶唯一關心的事情只有一個: 那現在這行程式要怎麼改? 直接告訴我就好。

至於其他的,大夥兒絲毫不在意。

這類的例子最近層出不窮。由於樣本數雖然多但我沒徹底研究,因此目前我無從取得確切的證據,證明背後的原因是什麼?

但推敲之後,能猜個大概。

可能是因為這年頭大家都很忙,碰到問題,只想快速知道答案。而網路的便利性讓許多人變成只願意(也似乎可以)迅速的取得結果,久而久之,慢慢地不願意也沒耐心花太多時間深入理解問題背後的成因。

也就是說,大家並不真的在乎(到願意付上代價、例如時間)來面對問題、或學習解決問題的能力。許多人變得只想知道,當下眼前這問題怎麼解決。

『告訴我解法就好,其餘的我不想多知道。』似乎已經是網路速食時代的寫照。

這是最近幾年碰到的,以往,大概十年前,這情況比較不常發生。但不用我說大家應該也知道,長久下來這(對企業、或團隊)會導致什麼結果。

再加上,網路時代很多流傳文章,標題長這樣:『OOO的原因原來是XXX』、『解決XYZ的N種方法』、『想要OOO就得XXX』這類的文章都很紅。標題看似一針見血,但內容往往很武斷。大部分的文章(或課程)中提出的見解或解決方案,其實都隱含著一個假設前提,就是你的環境和他(作者)相同,然而你也知道,真實世界中哪有環境都相同的? 礙於篇幅(也礙於其實讀者也沒興趣知道),因此大多數文章的作者,也不太會詳細敘述案情的成因與環境的背景,導致部分憨直的讀者以為,我照著做就會有一樣的結果,其實不然。

一個問題的解決方案,依照環境、人員狀況、時空情境…常常會有著不同的解法。我們在客戶端導入開發方法、框架、或Scrum,不同團隊、不同時空碰到的同一個問題,提出的建議往往是南轅北轍,甚至看似彼此互斥。

曾經有助理跟著我,一周內到兩家不同的公司,客戶問出的問題幾乎完全一樣,但我對兩家客戶提供的建議卻整個大不相同,助理一開始很遲疑,久了之後就慢慢理解為何我們會這麼做。

但,外人乍看之下一定很難理解背後的原因。

不過你可能會質疑,那這樣一切豈不都是自由心證,沒有標準可循? 這樣怎麼知道講師或顧問說的是對是錯?

其實不然,你可以分辨,只要你知道為什麼? 顧問給一個建議,你需要問為什麼,講師給一個做法,你也得知道為什麼?

我常說:知道『為什麼(Why)』永遠比知道『怎麼做(How)』還重要!

要知道,我們專注的是『目標』,各種具體的解決方案都只是手段。目標即便完全一樣,但面對不同的情境,就可能會有不同的做法。但如果學員(team member、客戶)只在乎得到一個答案,卻不在意這答案為何出現? 怎麼來的? 背後的思維是什麼? 考慮的重點為何? 有哪些情境上的先決條件? 背後需要配合的技術環節有哪些? 會不會有副作用? … 那獲得的只是『這次的』解答,僅此而已。

要知道整個解決方案出現的思考脈絡和架構,才是真正有價值的重點,這也才是確保你日後能夠獨立面對問題的關鍵。

我明白,我真的不是不知道,對很多人來說,先把問題解決比較重要...

但這就好比我在台上講時間管理的課程,試圖告訴學員如何安排事情的優先順序,但突然間有位學員大聲喊:『 停、停、別講那麼多道理,直接告訴我下禮拜我該先做什麼就好了...』

這…有點怪,不是嗎?

碰到問題,直接要答案,不是不行,只是可惜…

2017年8月4日 星期五

關於LineBot(10) - 取得用戶上傳給Linebot的照片

在用戶與你所設計的Linebot對談的過程中,我們常常會需要接收用戶傳遞過來的資料,除了文字之外,最重要的就是圖片(或照片)了。

用戶可以從手機或PC版的Line上面,輕易地上傳圖片給我們的linebot,這圖片來源可以是直接抓取相機拍照的照片,或是從手機上的相簿、圖庫裡面抓取,當然也可以從第三方的資料來源(像是Dropbox)把圖片傳遞給Line。

因此,圖片會有各種不同的格式,但慶幸的是,Line會幫我們把圖片做初步的處理(例如對太大的圖進行縮小、調整格式…等),我們想要抓取處理好的結果,只需要簡單的使用API即可。

透過我們的SDK,可以輕易的使用底下這個API來取得用戶上傳的圖片,回傳的結果是bytes[] 陣列。

當然,從上面你不難發現,要取得圖片時,我們需要傳遞給API一個ContentID參數,這參數怎麼來呢?

透過這樣的方式,就可以順利的取得用戶上傳的圖片資料囉。

補充一:

別忘記一件事情,我們並不能假設用戶上傳的一定就是圖片(搞不好是文字?或是GPS座標位置啊…),因此,採用上面那兩段程式前,你必須先判斷,用戶這次傳遞給我們的訊息是否為圖片:

補充二:

抓到圖片Bytes後,要怎麼辦?
一般來說,我們會在WebHook裡面抓取圖片,而WebHook在.net多半是以WebAPI的方式撰寫,因此,在你抓取到圖片Bytes之後,會有幾個考慮。

  • 該圖片要不要讓其他系統使用?(例如azure影像辨識API,或是後端其他系統)
    如果要,你多半需要把Bytes儲存為實體的檔案,這部分可以透過  System.IO.File.WriteAllBytes(路徑, bytes);
    這樣的Method來完成,如果是圖檔,附檔名直接給png即可。
  • 該圖片要不要讓用戶下載?
    如果要讓用戶下載,則該圖檔不僅僅要儲存,還必須要有一個可公開的URL,這樣我們會建議你把圖檔存放到azure blob,或是在你的WebApi所屬網站上開一個folder,用上述WriteAllBytes指令存檔時,儲存到該公開folder中即可。當然,如果你要把圖檔放到資料庫中也行。

------------------
相關課程: http://www.studyhost.tw/NewCourses/LineBot
LineBotSDK : https://www.nuget.org/packages/LineBotSDK 
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。 

2017年8月2日 星期三

天下本無事


今天去剪髮,幫我剪髮的設計師和我認識了20多年(很神奇吧),從她年輕的時候年輕的我就讓她剪髮,到現在,20年,在同一家店。

也因為如此,我每回去剪髮的時候,都會回想起20年前的自己,今天我想的是,20年前的自己和現在的自己,在意的事情有哪些不同?

我問她,她覺得自己這20年有何改變? 她說:『沒有啊,我沒想過這個問題。』『我從來都不會想這些奇奇怪怪的事情…』

我微笑『這樣很好啊...日子單純多了。』我說。
她回答:『對啊,反正想了也不會改變什麼,那幹嘛想?』

『你知道嗎?』我想起來。『有一本暢銷書,花了很長的一段篇幅,在告訴人們,多花點時間關注自己能改變的事情,而不要花太多時間去憂慮自己無法改變的事情上。』

她聽了笑著說:『這也要寫一本書跟大家講? 既然自己不能改變,那花時間去想幹嘛呢? 愈想愈煩悶而已。而且,花在這樣的事情上愈多時間,不就愈沒時間去做自己能改變、能帶來影響的事情嗎?』

『是啊,不過...』我說:『有時候這就是人的本性,雖然理智上知道,該專注在自己能施力、能造成影響的事情上,但大多數人總是對那些自己無法改變的,像是政治制度、經濟、疾病、外在環境、輿論、他人的看法...這些事情上,花了太多的時間,卻總是忽略了、或放棄去經營自己能造成改變、能發揮影響力的地方。』

『好在我沒這個困擾,可以洗頭囉...』她說。

洗頭的時候我在想,這個道理我十年多年前從書上看到,但一直到現在,這十多年來,我真的專注在自己影響範圍的事情又有多少呢?

---------------------------------------

ref 1: 關切範圍 & 影響範圍
ref 2: The 7 Habits of Highly Effective People
ref 3: How to stop worrying & start living