不要將事情複雜化
本週針對公司新版的移動辦公產品,有需求要求可以直接點選推送欄調整到應用的指定頁面,如訊息推送推送的是一個新郵件提醒,則點選推送會進入到該封郵件的明細頁面。在我看來,這個需要並不算複雜,於是我提給產品組實現可以在下個版本釋出更新。
可是事情似乎並沒有我想象的順利,從產品組反饋過來的資訊,我基本理解是存在什麼問題難住了他們。每一條推送,要想開啟就必須將該資訊的上下文資料一併推送過來,而蘋果之前的政策是隻支援256位元組的資料負載,而目前推送的引數資訊已經明顯超過256位元組,訊息無法正常推送到蘋果伺服器,這是下面的人給我的解釋,但是他們補充了一條額外資訊就是蘋果在iOS10裝置最大已經可以支援4k容量的內容推送了,但是測試下來好像不行。
下面討論過程中制定了2套方案:
- 將額外的推送引數,進行編碼壓縮以減少字元長度。但是編碼的長度不會變短,很快被否。
- 將推送的引數資訊以鍵值對的形式儲存在服務端,同時將該資訊的key通過推送傳遞過來,這樣就明顯減少了推送內容的長度。製作一箇中間頁面,用來接收key和查詢對於的引數資訊,再來進行跳轉。
第二種方案,我第一反應是非常排斥的,因為這樣不僅僅降低了使用者體驗,而且會增加額外工作量來維護引數鍵值資訊。我的理念是,如果可以一步到位做到的事情絕不能繞著彎子將事情複雜化。
我讓iOS開發人員將推送的p12證書發給我,我自己驗證apns推送的問題。公司以前的android和iOS推送方案都是我設計開發的,所以apns的推送機制還是比較熟悉的。我們之前後端推送採用的javapns的開源jar來實現蘋果伺服器的推送的,我知道目前公司統一訊息中心肯定還是沿用了之前的方案。
第一步,就是還原作案現場,明確採用javapns到底是行還是不行。配置好證書路徑,接著在payload裡新增引數資訊,讓payload的大小超過256位元組,看看是否能夠順利推送。很遺憾,控制檯的提示我們傳送了294位元組的資料,但是其限制是256位元組。我在心裡想,難道真的不行,這次難道是我的判斷有誤。我開始分析javapns.jar包的原始碼,發現以上的限制異常是由PayloadMaxSizeExceededException丟擲並列印的,我感覺事情似乎有轉機,這代表超出限制反饋資料並非有蘋果伺服器之間反饋,而是客戶端自己的提示。所以我判斷,javapns.jar出問題了。
第二步,尋找替代方案。找到一個apns4j和apache的camel-apns的apns傳送方案。經過驗證可以順利推送超過256位元組的資料,最終決定採用camel-apns來替代javapns,該問題順利得到解決。
這讓我聯想到到上週的另一件事情,有需求反饋要求在移動辦公中增加離線通訊錄功能,雖然我自己認為沒有保留的必要,這隻會讓事情複雜化。於是,我讓產品組在通訊錄的右上角防止一個“斷開的閃電”的圖示,點選進入離線通訊錄模組,該功能和目前的線上通訊錄不要摻雜在一起。
週五產品組把改造成果拿給我看,並且介紹實現方案是將離線通訊錄和線上通訊錄做了合併展示,這樣就不需要再增加入口,期待我的讚許。我體驗了下,反問了一個問題:如果實際部門資訊變更了(名稱調整,部門刪除,部門層次變更),你有沒有考慮到離線資料和線上資料展現矛盾的問題,並且做相容異常處理?得到的回答是暫時還沒考慮!我立即把這個的方案給否決,並且要求按照之前既定的方式處理,就不會存在這樣的問題,兩塊內容相互獨立。更重要的是,我們的產品功能將來肯定會面對專案上諸多的個性化改造,一個考慮不全面的設計會將專案組拖進深淵,有的問題我們要知道提前規避。
第三件事,近期專案中我們在即時通訊產品中碰到了這樣的需求,“在即時通訊客戶端推送的待辦,郵件的提醒,明明在系統中已經處理掉了,但是在即時通訊的角標數字卻沒有同步消除”。在即時通訊最初的版本中,我們將系統的訊息與即時通訊整合,達到在即時通訊提醒系統訊息的目的。就這樣一個看似簡單的需求,其實在我們在專案中是花費了很大力氣在維護的,專案中的情況是複雜的,要達到與各種系統版本訊息提醒的目的,就要與各種版本實現功能對接。系統升級了,訊息推送方式變化了,單點登入方式改變了,那麼就需要改造即時通訊以實現與各種新系統的適配。如果我們面對的需求不僅僅是一個專案,而是來自數十個甚至幾十個專案的要求,這個結果是災難性的,在有限的人力資源投入的情況下,軟體的可靠性是無法保證的。
還是不要將事情複雜化,即時通訊就關注即時通訊本身,解決溝通的問題,不要附加其他內容。這樣的好處是,無論是產品的部署實施,開發,維護都能夠大大降低成本。所以在下個版本的即時通訊中,我們會盡可能取消其他不必要的內容,重點關注即時通訊本身,讓一切歸於簡單。
“墨菲定律”在軟體行業一樣適用,你擔心的問題在將來有很大可能會發生,有點類似於出來混遲早要還的。不要抱有僥倖心態來開發設計軟體,有的明知道在某種狀況下會出現問題,但是在心裡確安慰自己應該不會那麼巧吧,殊不知這樣的思想將來會把自己害死的,也許將來會花幾倍的精力來堵漏洞。如果你能預見到哪裡將來可能有問題,那麼最好的做法是靜下心來仔細思考要用什麼樣的方式來處置來規避這些可能的問題,將它扼殺在萌芽狀態。考慮問題時,儘量遵循“關注點分離”原則,同一時間儘量做好一件事情,不要將事情複雜化。