i'm sam

C++|WorkFlowy|軟體開發|數位筆記

Programming

[035] 再談設計範式(Design Pattern)

(又遲了,慚愧) 有些設計範式讓我一見傾心,其中之一是 Factory Method [https://en.wikipedia.org/wiki/Factory_method_pattern]。我對於這個範式的理解如下: > 「製造」與「使用」物件的責任應分離。工廠專責生產,客人只想使用服務,沒興趣知道東西怎麼做出來的。 散佈各處的 new Foo(x,y,z) 維護修改易出錯,感覺不踏實。由「生產地」集中出貨,需求有變,調整產線,有機會在不影響「客人」的情況下滿足需求變更。 沒接觸範式前,似乎有感覺這樣做比較好,看到「工廠範式」後晃然大悟,進一步理解發現其中的諸多變化,感覺功力大進(這當然是自我感覺良好,啊不然咧)。 把範式當工具,納入「
2 min read
[033] Apple Watch(一)

[033] Apple Watch(一)

(這篇是昨天要給的,今天還) 去年托老弟到日本帶回一支 Apple Watch,最便宜的款式。目前為止用了約五個月,沒什麼特別的感想,能夠天天戴不會受不了,已經超乎我的期待。 購入 Apple Watch 前,我已經先買了另一支我不知道什麼牌子的藍牙手錶,約台幣四仟五,戴了不到一個月就放在某個地方生灰塵了。主要原因是錶帶讓我感覺不舒服,而且會影響我寫打字,所以工作一定會脫下來。 Apple Watch 的錶帶很舒服,戴出門不會讓我想要脫下來,應該說沒震動的話幾乎感覺不到她的存在。而多數人嫌惡的電池只能撐一天多的先天不足,我倒覺得還好。對我來說,她反而比較像手機而不是手錶。手機天天充電是很平常的事,沒什麼不方便的。 目前為止覺得 Apple Watch 的情境有: 1. 來電提示與接聽與否 2. Line 通知 3. Slack 通知 4. 控制 Overcast 還有最重要的功能:現在幾點XD
1 min read
Programming

[034] 設計範式(Design Pattern)不可取?

出社會寫程式約四年後才「正式」接觸設計範式(Design Pattern),幾年的程式設計經驗確實遇到許多一再重複或類似的問題與解決方法,讀了 Design Pattern 才知道自己不孤單。 花了一些時間與心思「理解」Design Pattern 奧義,沒全懂,也不敢說理解透徹(大概是因為書籍的範例多以 Java 為主,而我恨透了 Java),但我深深覺得 Design Pattern 讓我寫程式的「眼界」開闊了許多。 Design Pattern 可說是前人一再撞牆後累積下來的結晶,歸納整理出來的範式,目的是減少後人撞牆的次數(注意,是「減少」,不是「避免」),要說這是壞東西,說不通。 有人愛,有人恨。任何事物都一樣。 先前看了王垠把 Design Pattern 跟四人幫評得一無是處的文章,今天又看到 TonyQ 討厭
1 min read

[031] 「持續」本身就是挑戰

(這篇是昨天的份額) 即使到目前為止的文章「深度」嚴重不足,即使每篇文章可能花不到半小時就能搞定,還是中斷了「一天一文」的寫作期望。 古有云:「滴水石穿」,世上大部分的事,只要能夠「持續不間斷」,其累積的能量驚人,可偏偏這能量無法立即感受到,以致於多數人開始沒多久就放棄了,而且堅信沒有人能做到。其一生也因此定調,無法再有突破。 雖然「斷了」,我還是想要繼續寫。雖然內容沒深度,卻能從中學到不少經驗,而每天自我要求,強迫自己在有限的時間內完成更多事,讓生活更有意義。 別人做得到,我一定也能做到!
1 min read
[032] 總是做出最糟決策?

[032] 總是做出最糟決策?

這篇來好好反省今天早上發生的事... 今早因事擔擱,較晚出發上班。原本從家裡走路約十分鐘即可抵達公司,不過因為下雨手上又提重物,經過公車站牌時決定等個五分鐘看能不能走運搭到直達車(兩個站,約四個紅綠燈就到公司)。 五分鐘過了,直達車沒來,手有點痠,心裡又想:「乾脆搭優步好了」,拿出手機一看「抵達時間約五分鐘,下雨天,時間大概要再延長三分鐘,那我乾脆走路好了...」 「手好痠,乾脆搭計程車好了...」 「其實不是很遠,計程車一跳錶就七十五元,太浪費了...」 綠燈了,再等看看公車好了...,切!又沒等到。算了,還是走路好了... 浪費了十來分,最後我還是拎著重物,一步一步走到公司,花了八分鐘。(走到一半看到那班「直達車」開了過去 Orz) -------------------------------------------------------------------------------- 我學到了什麼? 1. 不要想太多(優柔寡斷),決定了就去做。手痠就在站牌多等幾分鐘,公車總是會來的。時間寶貴,從家裡就搭計程車,百元不到省了十分鐘,划算的。 2.
2 min read
[029] 給部門同仁的話(貮零一六)

[029] 給部門同仁的話(貮零一六)

Hi Team, 去年是公司第一個「滿滿的年」,謝謝各位這一年來的努力。對於一間剛起步的公司來說,我覺得表現平平,努力空間不小。我希望也相信不管是個人職涯(技術力、薪資力)或公司的發展,今年會比去年更好。 我們是小公司,每一員都是戰力,每一年都會有艱難的戰役。我希望各位不論如何都要挺住,可以放鬆但不要鬆懈。今年各位任職皆滿一年,可以安排放長假,不過請幫我個忙,務必提前「預約」,原則上不希望各位的請假「衝堂」。 今年年終獎金給得或許不如各位想得漂亮,但畢竟才剛起頭,大家一起努力,只要公司成長,老闆會很大方。坦白跟各位說,前三年的打底階段會很辛苦,要有心理準備。 幾件事希望各位務必自我要求: 1. 生活作息調整好,對自己或公司都是好事。有好體力才有戰力,作息規律是保持好體力的一大因素。 2. 試著用不同的「手法」解決問題。常用的技法要練熟,但不要排斥或忽視其他可能的工具或技術。 3. 記住「Done Done 工作術」
2 min read
[028] 你是我寶貝,但我要毒死你

[028] 你是我寶貝,但我要毒死你

說的是在兒女面前(家裡、車裡...)抽煙的父母——腦袋有洞需要看病的人。 > “對小孩說你是我寶貝,然後一直灌他二手煙。病得不輕,凸!” - Sam Tsai pic.twitter.com/RtLz49c4cR [https://t.co/RtLz49c4cR] — sam (@mhtx) January 28, 2016 [https://twitter.com/mhtx/status/692648541106343936] 為了一己之私(抽煙很爽我知道 [https://samtsai.ghost.io/ghost/editor/194/] ),明知道影響小孩健康甚鉅,還是硬灌「寶貝」二手煙,這不是智障是什麼?嫌自己命長,硬拉著小孩下水,寶貝寶貝,莫名其妙!
1 min read
[027] OmniFocus 出走潮

[027] OmniFocus 出走潮

OmniFocus 是許多 Mac/iOS 圈內人中意的工作(待辦)事項管理工具,在「涉入」該圈子前早有耳聞此軟體,第一印象是:「哇靠!一個工作管工具要價台幣近二仟,而且只支援 Mac,沒有跨平台,有沒有搞錯?」 Mac/iOS 圈內人有個共通特點:我欽定的東西都超級好用,貴也是有道理的。然後就一直推,一直推... 雖然 OmniFocus 1.x 大受歡迎,但 2.x 推出後似乎引起一些死忠粉絲不滿,有的認為介面設計失敗,有的認為新版功能不符期待。 最近該圈開始有人耐不住,紛紛出走,新的選項是 2Do [http://www.2doapp.com/],同樣也是 Windows 不沾鍋。(身為重度 Mac/Windows 兩棲,
2 min read
[026] 看 Code 說故事:Facebook Folly(三)- Optional
C++

[026] 看 Code 說故事:Facebook Folly(三)- Optional

先前 [https://samtsai.org/2016/01/22/022-facebook-folly-part-2/]的 Lazy 其中一個特性是:運算式/資源只會被執行/索求一次。實作此特性用到了 Optional,位置: * folly/Optional.h Lazy 實作 operator() 覆載函數如下: result_type& operator()() { if (!value_) value_ = func_(); return *value_; } value_ 可被用來「判斷是否已給值(Function func_ evaluated or not)」,也可用來儲值 func_ 的回傳值。 由此來看,Optional 可以讓原本的型別多了一種「供外界查詢是否已被賦值」的能力。
1 min read
[025] 人生就是不斷地撞牆

[025] 人生就是不斷地撞牆

撞牆就是「試錯」,親身體會效果為最。 明知為了更遠大的目標,棉花糖不能早吃,可還是忍不住誘惑,張口吃下,事後才反悔,但時間過了就沒了。 今天腦袋空空,不能怪台灣幾十年罕見的雪景,不能怪出人意外的事件。就怪自己不懂得珍惜「時間」,沒了才嘆可惜,又有什麼用呢? 「最想做的永遠不是手上正在做的」,缺少貫徹到底的意志力,信心便慢慢流失...
1 min read
[024] 一窩瘋

[024] 一窩瘋

台灣這幾天最重要的頭條新聞非「Snow」莫屬,難得能在台灣看到雪景,許多人放假前就計劃了賞雪行程。媒體(傳統或社交)推波助瀾,想也知道各大山肯定人滿為患。這就是「一窩瘋」。 我對這種「浪漫」是一點勁也沒,想到塞車、憋尿、低溫、爭吵、人禍,怎麼可能來勁! 有人說「自己沒勁也不要潑人冷水」,我說雪你都不怕了,還怕冷水嗎? 隨著年齡增長,又有了小孩,很多「活動」早已與我絕緣: * 跨年看煙火 * 一窩瘋賞XX * 大排長龍吃美食 說真的,人世間沒有什麼比「時間」更貴的了。花幾個小時看一樣「東西」,而那「東西」還不特別稀奇,怎麼算都不划算吶。 本來嘛,瘋不瘋是個人自由,可是為了讓那些「自私」的人滿足賞雪慾,可苦了警察跟救難人員(別說你不知「人多的地方容易出事」
1 min read
[023] 狂得有理?
Programming

[023] 狂得有理?

因為一篇文章 [http://www.yinwang.org/blog-cn/2016/01/18/java/],讓我這幾天連續看了這位名為 Yin Wang [http://bit.ly/1WDU7ER] 狂人的十來篇狂文。最初看的幾篇文章就是「這個程式語言爛,那個大師爛到不行,那間公司爛到吐血...」,幾乎名聲在外的人事物都被他評得一無事處。 這樣的評論有種 DHH-fu,總之就是狂。對這位狂人稍做調查 [http://bit.ly/1RF6Ebx],發覺來頭不小,似乎狂得有本事( 如此長的退學申請文件夠嗆的 [http://www.lofter.com/postentry?from=search&permalink=183ec2_47a02c] )。文章寫得不錯(比我好太多了),越看越有趣。對於軟體工程領域,他的許多觀點跟我相差甚多,
2 min read
[022] 看 Code 說故事:Facebook Folly(二)- Lazy
C++

[022] 看 Code 說故事:Facebook Folly(二)- Lazy

Facebook C++ library 檔案命名慣例為 FileName.h,也就是 Camel Case [https://en.wikipedia.org/wiki/CamelCase] 命名法,開頭大寫。我目前愛用的命名法是 Google 的 Snake case [https://en.wikipedia.org/wiki/Snake_case],長這樣:file_name.h。 單元測試使用 Google C++ test framework [https://github.com/google/googletest] ,各大開源專案的一致選擇。測試碼統一放在 test 目錄(我覺得複數 tests 較為合適)
3 min read
[021] 看 Code 說故事:Facebook Folly Library(一)
C++

[021] 看 Code 說故事:Facebook Folly Library(一)

Facebook 在 2012 年公開其內部重度使用的 Folly C++ library [http://on.fb.me/1ZEooDe]。快速瀏覽過 Folly 原始碼,發現主要開發人員之一是我稱之為 Template-man 的 Andrei Alexandrescu [https://en.wikipedia.org/wiki/Andrei_Alexandrescu],非人類。 Andrei Alexandrescu 有一本書叫《Modern C++ Design [http://amzn.to/1QmUBi2]》,是我最初接觸 C++ Template 的書,當時看的是侯捷老師的中譯本《C++設計新思維 [http://www.taaze.tw/apredir.
2 min read
[020] 「持續寫作」二十天小結

[020] 「持續寫作」二十天小結

「第二十天了呢...」,心裡這樣想著,我還想繼續寫下去。小結目前為止的感想: 1. 文章內容沒深度,寫作能力果然停留在國中程度... 2. 評論不到位,說了比沒說還糟。 3. 技術方面的文章太少,應多專注在「本業」。 4. 總是趕在最後一刻才交作業,一天一篇不到千字的文章就覺得有壓力,時間的掌控有很大的進步空間。 5. 移動式的寫作環境不夠純熟,總是要有筆電才能好好寫文。(說明「移動式寫作環境」也是個好題目) 其實幾年前(Movable Type 時期)開始就有寫東西的習慣,只是通常寫到一半就中斷了,原因不外乎「我在幹嘛啊?與其浪費時間寫沒人看的文章,倒不如多寫一些程式,看幾集美劇...」「截圖、修圖、潤飾文字...,太累了...」 現在我的心態變了,沒人看我寫給自己看,就當做筆記,而且寫作過程常出現靈感,也算意外收穫。「持續寫作」的目的是培養毅力,慢慢寫,多多看,寫作力總會提昇。 因為「
2 min read
[019] C++ Class 的設計考量(一)
C++

[019] C++ Class 的設計考量(一)

昨天 [https://samtsai.org/2016/01/18/018-function-should-not-have-side-effect/] 談到函數(Function):「好的函數不該有副作用」。今天來談物件,以及生成物件的類別(Class)。 1. 介面設計成讓使用端不容易誤用。 2. 少用繼承(Inheritance [https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)], is-a 關係),善用合成(Composition [https://en.wikipedia.org/wiki/Object_composition] , has-a 關係)。 3. 內部實作露出越少越好。 介面設計成讓使用端不容易誤用 以 Virtual Function 為例,底下 Animal 類別有一個
2 min read
[017] 人善被人欺

[017] 人善被人欺

以「遲到」這件事來說「人善被人欺」的真理。 來說個故事。我有一位朋友甲君,每次與他相約,十有八九遲到。誇張一點甚至比約定的時間晚一個小時,後來乾脆把約定時間「提前」。不過,對於「遲到老手」甲君來說,不管提前多久,他總是有辦法遲到。 有一回,跟一位共同朋友(Mutual Friend)聊到這事,他說週遭的朋友,包括甲君在內,很少有人會慣性遲到。我納悶,遲到大王怎麼可能不遲到? 共同朋友說與甲君稍熟時,便發覺他有遲到惡習。對於這種遲到大王,他早有應付之道。有一回,他跟甲君約好一同出遊,約定時間過五分鐘甲君還沒出現,他毫不遲疑,獨自出發前往目的地。事後朋友對甲君說:「大家的時間都寶貴,五分鐘是我給朋友的最大限度。」之後甲君與這位朋友相約,幾乎不遲到。 仔細回想,每次遇到甲君遲到,我都傻呼呼地等他出現,聽他說那些明顯有漏洞的理由,平白地浪費許多寶貴時間。或許當時甲君真有罪惡感,由於遲到的「成本」
2 min read
[016] 衛生麻將++

[016] 衛生麻將++

三五好友偶爾聚聚,打打衛生麻將,好不快活。麻將好玩,偶有驚喜,不過傳統玩法有點無趣。那天心血來潮,跟朋友「試用」新玩法:增加 Bonus 點數來增加胡牌台數。 玩法有兩種: 1. 29中發白 2. 19東南西北中發白 版本一:29中發白 莊家共擲「兩次」骰子。第一次擲三粒骰子;第二次擲二粒骰子,決定「獎勵牌」。「獎勵牌」點數對應如下: 1. 2-9:不論哪一門,胡的牌點數若是「獎勵牌」,則「加三台」。 2. 10(中)、11(發)、12(白):若胡的是「獎勵牌」,「加五台」。若胡的不是「獎勵牌」,但是手上有「獎勵牌」
2 min read
[015] 糟糕的 Medium 「上一頁」體驗

[015] 糟糕的 Medium 「上一頁」體驗

Medium [https://medium.com] 愈來愈受歡迎,許多名人紛紛將部落格移往這個由 Twitter 創辦的寫作平台。國外對於 Medium 的編輯器評價不低,我在中文輸入方面的體驗不太好,不過今天的重點在閱讀,不在寫作。 一些有名的公司或個人選擇將文章放到 Medium 上,使其磁吸效應愈來愈強大,連一向愛自幹的 37signals 家都決定搬到 Medium [http://bit.ly/204vOSg],可見其吸引力。 但是,今天在 Medium 讀一篇文章 [http://bit.ly/1Rhsh1w] 時發現一個擾人的問題:「上一頁」不是回到先前閱讀的地方,而是回到文章開頭。範例如下圖: 問題的步驟: 1. 打啟任一文章(必須有人留言)。範例:http://bit.ly/1Rhsh1w 2.
1 min read
[014] 我的備份策略(二)

[014] 我的備份策略(二)

昨天 [https://samtsai.org/2016/01/13/013-backup-plan-1/] 提到「活」的資料備份,漏掉了一個重要備份策略:系統備份。 Backblaze [https://www.backblaze.com/cloud-backup.html#af9kje] 是將電腦檔案備份至雲端,略過了「系統檔案」,也就是作業系統本身是沒有備份的,只有使用者的資料會備份。 系統之所以重要,是因為它能在電腦無預警罷工,開不了機(我遇過 SSD 掛了,當場死給你看),能讓你在短時間內回復至可運作的狀態。Mac 上,我使用的系統備份工具有: * OS X Time Machine。備份至兩個不同地方: NAS 以及外接硬碟。一天至少一次。 * SuperDuper [http://www.shirt-pocket.com/
1 min read
[013] 我的備份策略(一)

[013] 我的備份策略(一)

幫你的資料買幾份保險,出事時才有得「理賠」。電腦「意外」來得快又突然,昨天還好好地,怎麼今天就開不了機了?「重要資料遺失救不回來」是很痛苦的事,不要輕易嘗試! 所幸,幫寶貴資料買保險一點也不難。在說明怎麼做之前,必須釐清幾件事: * 單純把「檔案複製到隨身碟」不算備份。以我協助處理過的案例,以及親身經歷,在搶救資料的危急時刻到來時才發覺,那個用來備份資料的隨身碟或外接硬碟,幾乎毫無用處: * 重要的資料沒有備份到 * 電腦認不到裝置 * 被寵物或小孩弄丟了 * 狡兔三窟,資料最少要備份到三處不同地方,而且要用不同的方式與週期進行備份 * 備份就是為了還原,要確定備份的資料有辦法安全地還原,否則白搭 以下是我目前的備份策略與工具,之所以說是「目前」,因為資訊科技進步神速,昨天可行的策略,明日可能就不堪用,所以每隔一段時間就要檢視調整備份策略。 我把資料備份分成兩種: * 「活」的資料備份 * 「靜止」的資料備份 「活」的資料備份 即時反應目標電腦上當前的資料,這類型的備份常於背景自動完成,一小
4 min read
[012] 坐板凳  看爭議

[012] 坐板凳 看爭議

身為一個局外人,前天在心得戰火點燃當天,寫了一篇對於〈心得戰火的心得文 [http://bit.ly/1ZUL0S1] 〉。我有寫作力低的自覺,所以只敢在自己的場子撒野。 由於完全不了解個中「私怨」,我用旁觀者的角度看〈心得文〉,讀完感覺很不舒服,文章寫得不厚道。一個三輩子不愁吃喝的人把那些覺得東西不錯吃的人說成「平常可能都吃飼料」,怎麼看都不厚道,甚至相當刻薄。(當然,能有三輩子花不完的財富,我羨慕的要死!) 我相信「同一邊」也是有人覺得不妥,但在心裡自我解讀成「一切都是為了節目效果,重點在其他地方。」或者,「這一切都要由事主承擔,誰叫她...」 是啊,就私怨嘛。「以前打別人,現在被打也是活該」,這很好懂,但也很難懂。難懂的是,這就是你們的「格局」嗎?或許有機會了解更多,才有辦法弄清楚為什麼格局會這麼小,明明都是成年人啊,而且也小有成就不是? 談談今日最新的〈自爆文〉(說是自爆其實也沒有全爆,不過這麼做是對的,
3 min read