跳到主要內容

避免落入預期解法的死胡同


買錯票

某天我要去台北,卻發現自己前一天起迄站買反,買成台北 —> 台南,但是搭車前才發現,詢問服務台人員,只得到回覆說發車前 30 分之前才能退票,自己也依稀記得規定是如此,因此只好認栽,誰叫自己買票沒看清楚,趕緊自己去重買一張到台北的車票。後來老婆提醒我也許可以換票,再至服務台詢問,服務小姐說若是錯過班車,可以當天的票搭乘較晚班次的自由座,但是我給她看我的票是早上出發,卻要搭晚上的車,我就解釋是因為我買錯票,她猶豫了一下,竟然說了一個聽起來可以幫我換票的說詞(我忘了他確切的用詞),我雖然感到驚訝但是我已經買了到台北的票,只能說來不及了,她就建議我仍然採用換搭自由座的方法。

預期解法 - 退票

這件事我也犯了一個跟某些客戶常犯的錯誤,就是「沒有提供背景資訊」,或說「預期解法」。我心理預期我的問題的解法只有「退票」,因此我只問了特定的「退票」事宜,發現不能用「退票」解決,就以為沒有解法了。如果我能第一時間提供比較完整的背景資訊(也就是買錯票的狀況)給服務台,因為服務小姐擁有較完整的解決方案,她可以從我的背景資訊中,更清楚我的需求,進而幫我想到其他解法。

破除方法 - 主動探詢

當然服務是雙方的,如果服務台小姐可以在我第一次詢問時,就更主動探詢更多的背景資訊,她也就有機會促使我講出原本的問題,並從中找出其他解法,最終就提供了一個更好的服務體驗。

回到原始問題

在 ZK 技術支援上,有時客戶問到一個特定的功能可否做到某個效果,問題很簡短,也沒有交代需求或應用情境。如果該功能確實可以達到該效果,我通常會簡短肯定回覆,只是確認或補充說明。如果無法做到,或是該功能跟客戶預期的效果沒有什麼關聯,我會在信末提說:「如果你能告訴我們你的應用情境,也許我們能找到其他解法」。因為我推測這位客戶已經落入「預期解法」的思維,他已經認定這個特定的功能就是解法,如果不能做到他的要求,就是不能解。我問的那句話就會促使客戶描述原本的應用情境,我可以據此去找到另外的替代方案或更好的解法。

留言

這個網誌中的熱門文章

iframe DOM 被移動造成重新載入

如果用 javascript 去搬動 iframe DOM 的位置, 瀏覽器會將其內容重新載入,這是現有 HTML 規格 > When an iframe element is inserted into a document that has a browsing context, the user agent must create a nested browsing context, and then process the iframe attributes for the "first time". 範例: http://jsfiddle.net/pZ23B/ 測試結果: * Safari 3.1 / Win: reload * Opera 9.5 / Win: reload * IE10: reload * IE7 / IE8: not reload (部份摘自 https://bugzilla.mozilla.org/show_bug.cgi?id=254144 ) 參考: * https://bugzilla.mozilla.org/show_bug.cgi?id=254144

Web Dynpro 前後端資料流動機制 (Dataflow)

在Web Dynpro中提供3種資料流機制[1],只要適當地設定,可以不用寫程式就將畫面、中間層控制器(controller)到後端模型物件的資料自動化地、牢靠地綁在一起,使得不管前後端某一方有資料變動,變動部份都會自動地流動來保持一致性,使得前後端都能存取到同一份資料。 context 關鍵元件是 context,每個controller都有一份屬於自己的context,它扮演MVC架構中的M (model),web dynpro的實做方式比較像是該controller的「資料空間」,它由node(資料節點)與attribute(資料屬性)組成,controller可以透過wdContext這個預先產生好的 shortcut variable(捷徑變數)去取得context的資料內容。 context中必須要建立node才可以儲存資料,一個node代表一個collection(集合物件)裡面仍可以含有node, attribute,node裡面的一份資料實體就是一個element,一個node可以有一個或多個element(這部份可以透過cardinality property設定),其結構就是該node所包含的結構。 data binding 此種機制可以將UI元件的資料跟context中的某個node或attribute綁定在一起,context中的改變會自動 更新到UI元件上,UI元件的改變也會自動寫入到綁定的context node(or attribute)中。通常UI元件所綁定的node(attribute)是由component controller對應過來的。 context mapping 每一個controller都有屬於自己的context(資料空間)如果要達到彼此共享資料,則要透過context mapping機制,一旦mapping設定好,則會在另一個context產生一個同樣的結構的node,兩邊的controller會存取到的是同一分資料,任何一邊的資料更動都會散佈到設定好mapping的node。 不過在web dynpro裡,只允許將custom controller or component controller的node對應到view controller去,不允許從view controller對應回來,主因是嚴格遵守MVC...

JavaScript 關掉瀏覽器頁面

如果你直接呼叫 window.close() 來關掉目前的頁面的話,你應該會在 console 看到以下訊息: Scripts may close only the windows that were opened by it. ( 我在 Chrome, Firefox, IE 11 都試過) 主因就是你並沒有用 JavaScript 開啟這個頁面,所以也不能用 JavaScript 關掉它。這是 HTML window.close() 的規格 規定,各家瀏覽器應該都遵循。 隨著瀏覽器安全性增加,以下方法已經不適用了,可參考 這個討論 。 有個變通的辦法就是: window.open(location, '_self').close();