算了吧,你又做不到。

Photo by Tengyart on Unsplash

我在台北自己一個人租屋,平常除了晚上睡覺以外,我都不會鎖門。這麼做是因為出入廚房、陽台都比較方便,何況室友如果要找我也會先敲門。

但今晚稍早,我一如往常的沒穿褲子、在房間裡刷牙,忽然聽見房門被打開的聲音。本來以為是隔壁的房門,但想想覺得聲音也太近,於是我從浴室探頭,發現我的房門被打開了。

我的腎上腺素飆升,看見門外站了一個陌生男子。

他拿著手機,雙眼充滿跟我一樣的困惑和緊張(只看到雙眼是因為他有戴口罩),我才想到他應該是來看房的。

我住的公寓房東是用「自主看房」的方式管理,也就是拿了信箱鑰匙、輸入門鎖密碼就能進入公寓看房。但我不知道最近有空房釋出,房東和代管機構的人們沒說,我也沒發現有人來看房。

“Is this the room on 591?” 他問。

“Um I don’t think this is the room you’re looking for,” 我邊說邊祈禱這位仁兄可以趕快轉頭走人。

“I’m sorry! Is this the one?” 他指著隔壁房間。

“Yeah I think so,” 想到很久沒看到隔壁室友,我就這樣回答他,希望趕快結束這場對話。

“Thank you. Again, I’m very sorry,” 他在我關上門時說。

“It’s fine,” 關門後我發現我在微微發抖。

這是什麼情緒我也不懂,但應該是混雜著恐懼和憤怒吧。

我想了很多,「還好我穿著大號球衣,除非雙手舉高不然不會走光」、「還好我是在浴室刷牙,離房門比較近,可以馬上反應」、「還好他只是迷路」…。

想完一輪「還好」才開始想到,「房東怎麼沒跟我們說有人來看房?」、「房東怎麼沒跟他說是哪一間?」、「他怎麼沒先搞清楚,如果不清楚怎麼沒先敲門?」…。

冷靜下來,我剖析了自己關門後湧上來的情緒。

我想到馬斯洛的需求理論,我們首先需要的是安全感,所以我先想到那些「還好」:誰知道,在別的國家可能我就被搶了,還好我安全無虞而且只是場意外;當安全感被滿足後,其次我們需要尊重:也就是房東的尊重(事先告知)跟看房者的尊重(做好功課或敲門)。

然而想完以上理論,我還是隱約覺得不對勁,因為按照我的個性,對於這種情況應該要破口大罵或是尖叫才對!我居然只有故作鎮定的說「你在找的是隔壁間」、然後關門開始默默發抖?這一點都不像我認識的我。

人家都說要「設身處地」,今天我自己為兩分鐘前的自己設身處地的想,還是想不透我會有這種行為的原因。

於是,我想到那些過去我給別人的建議:總是叫不開心的人去找出瓶頸問題然後正面迎擊、叫被打壓的人想方設法提出抗議、在趴踢上揪著被吃豆腐的人去罵那個加害人、叫工作不爽的人離職…。

我意識到這樣的建議就像關門後的自己,對著兩分鐘前從浴室探出頭的自己說,「罵他啊!」

兩分鐘前在刷牙的我,當下也知道有十足的理由表達不滿,因為他引起我的情緒反應很大,何況我也不是什麼以和為貴的人。

但兩分鐘前那個我就是呆立著什麼也沒做、甚至禮貌的回說「沒關係」。

我想到過去當我 judge 著別人太軟弱、太不懂得讓別人知道自己的不滿、太放縱糟糕的人做糟糕的事情的同時,是不是因為我根本不知道人家的情境?

如果因為我對自己個性如此了解,遇到事情當下還是無法做出自己認為「應該」做的事情,那憑什麼我在給別人建議的時候不考慮進去人家的恐懼、憤怒或無奈?

我意識到我應該停止設身處地,因為根本就不可能做得到:不是當事人,不知道那時候的情境、不知道人家面對事物的情緒反應,就不該隨便議論別人或任意的指點,即便那件事再合理不過。因為即使對方有意識到問題並清楚怎麼解決,很多時候還有更抽象的東西要克服,像是今天刷牙中的我的情緒。

所以我想停止怪罪那個刷牙被中斷的自己、還有那些整天被我建議造反的人們,然後跟他們說聲,「我沒有辦法體會甚或分擔你的擔心,但有我在呢,我陪你面對那些 bullshit feelings。」


把到目前的人生當成一場社會實驗,觀察到的有趣結果。

我的人生有兩個人格交錯爭取著我的身心的注意力:一個是積極進取、希望拿到一定的社會地位、經濟能力、他人掌聲和聲望的我;另一個是覺得積極進取很搞笑、覺得人生苦短要及時行樂、希望帶給旁人快樂的人的我。

這兩個人格其實很是衝突:前者需要投注大量時間學習、工作、社會化、瞭解時事;後者需要投注大量時間放鬆、玩樂、任性自得、通常還要玩些藝術。

我覺得我的人生前十八年應該都是前者,主要都在努力向上,上了大學就徬徨了一陣,發現原來可以有另一種生活方式,接著慢慢轉往後者,直到畢業後開始工作。工作前三年就是兩個人格的互相拔河,切換來切換去的,導致我自己也很衝突。

我可以上午下午努力進取,為公司做業績、為自己努力賺錢爭取社會主流價值的認同,晚上去華山大草原在營火旁跳舞、不管他人的眼光和朋友跳得快樂聊得快樂就好了。也可以週間為公司忙到半夜、週末去花蓮海邊嗨到凌晨。

切換這兩個模式是個神奇的感受,就像泡野溪溫泉,你忽然抽出熱騰騰的身體,跳進隔壁冰冷的瀑布中一樣,有點令人抗拒卻又有點酥麻。

而有些時間點,我的生活這兩個人格衝突達到極致。

例如去年的此時,隻身前往澳洲旅行的我。在伯斯我住一個音樂節認識的朋友他們家,朋友的其中一位朋友剛準備要去實習(一個很可愛、小我三四歲的弟弟),成天來他家閒晃,後來常常載我去海邊的小鎮 Frementle 玩,我好想每天每天就躺在那片綿延好幾公里的沙灘上,看著浪花打到岸上,忘記自己的責任,c’est la vie。

伯斯某處海灘, Nikon D90

但當時我的責任卻異常重大,因為這次責任不是對著某些冰冷的法人,而是對我自己。我要轉職,所以邊在澳洲玩還要邊學寫程式。於是我在墨爾本(還沒找我朋友前)狂跑圖書館、咖啡廳,在伯斯我借住朋友家時就趁他們出門工作,以及沒被載去海邊游泳、湖邊散步、酒吧跳舞的時候,打開 vscode 一行一行敲打著那些責任。

我不知道是每個人或多或少都有這兩種人格存在還是怎的,但我總覺得我的兩種性格衝突比一般人嚴重,常常會有交錯到讓我整個人精神很混亂的時候。

但也因為這種衝突感,藝術性也是十足:積極進取的我不會想去畫裸男裸女的素描寫生、練習跳鋼管舞,在生活中得到很多啟發(即使他們可能很難餵飽我),認識很多有趣的靈魂;任性自得的我也不會為了一些有意義的專案持續奮鬥、拉時程、學習、創造與累積出有意義的東西來。

現在的我就著我兩種性格也有了三種朋友:第一種放蕩不羈、熱愛自由,很多嬉皮、音樂仔、藝術家,曾經跟一些人聊到靈魂深處而感到雞皮疙瘩;第二種通常很自律,有很好的時間管理,做出很多厲害的專案,在企業身居高位或是被評為充滿潛力,在職涯上是很好的戰友或 mentor;最後一種我最羨慕,就是兩者兼備,而且切換自如,有點看似過度輕易到簡直有點人格分裂傾向了。

那個在伯斯認識的可愛弟弟有天載我跟另一個朋友去海邊途中猜我的 MBTI 性格(總共有 16 種)竟然一次就猜中,我以為他通靈,他卻說他只是這幾天跟我互動感覺出來的。我認為十分有趣,別人看我有時可能比我看我自己還要精準呢。


DI 有什麼好?如何實作 DI?DI 到底是什麼?

相信很多人對 Dependency Injection(DI,依賴注入)的觀念有很多疑惑。從最根本的本質(到底它是個技術?工具?設計模式?還是信仰?)、到目的(注入一堆東西是為了單元測試好寫嗎?)、到引入的手段(是不是要學會用 DI container 才能實現 DI?)等,都很容易讓人寫著寫著就黑人問號了。

因為我也很問號(尤其一開始就碰 MS DI 有夠不解),所以有次在一個 Backend 隨意聊的分享場合就決定講這主題,逼自己好好研讀大神同事 J 借我的書—「依賴注入:原理、實作與設計模式 by Steven van Deursen, Mark Seemann」這本經典,好好坐下來認識 DI,並跟大家討論我的理解,假日順手整理成文章。目的是學好 DI 架構、一起寫出更舒服的程式碼。

大綱

  1. Why …


1.0.0 小數點那麼多在幹嘛?Breaking change 要 break 什麼?向下相容是要跟誰相容?

今天我推了一份扣,新增了 DB 某表格的欄位,發完 PR 沒過多久,我準備戴上耳機聽音樂。這時幫我 code review 的資深同事走到我旁邊坐下說:「你剛剛給我那包扣啊,有動到 DB schema,想跟你確認這要上 production 嗎?」

我誠惶誠恐的放下耳機:「可能要欸,因為之後前端還要接這支 API 回傳的東西,需要用更新的版本。」

「喔那如果這次要上線,就會有 breaking change……。」他說,「你先輸出這次更動的 script,我先上 script 再上扣。因為如果 script 沒先上直接上最新版號的扣,程式跟 DB 要東西要不到就可能炸掉。但因為你這次只新增欄位,對沒更版的人來說也是可以向下相容。」

修但幾咧……版號?Breaking change?向下相容?

身為菜 …


實現分散式儲存的星際檔案傳輸協定

Photo by Jeremy Thomas on Unsplash

IPFS (InterPlanetary File System) 是什麼?

A peer-to-peer hypermedia protocol designed to make the web faster, safer, and more open.

有鑒於 HTTP 協議在儲存檔案方面成本高、效率低、內容可能消失等特性, IPFS 是一個用 peer-to-peer (P2P) 架構設計出來的協議,目的是讓檔案儲存也能做到去中心化。

如果你對區塊鏈有興趣,你應該要了解 IPFS ,區塊鏈本身是一項去中心化的分散式資料庫系統,由於必須做到去中心化的程度,它本身僅是適合紀錄數字的簡單儲存系統,無法載入文件或是圖片。但區塊鏈技術若要成功商業化,則必須擁有更複雜的儲存系統,用來提供複雜程式、文件、圖片及影片的儲存功能,而 IPFS 能補足區塊鏈的儲存性能問題。

目前去中心化 …


Using state machines to define behaviors and state transitions — explained with dating apps

What’s a state?

In information technology and computer science, a system is described as stateful if it is designed to remember preceding events or user interactions; the remembered information is called the state of the system.

A system’s states are often defined by the aggregation of behaviors its users do. States are important because it’s a more systematic way of verifying whether certain behaviors at certain states are valid or not.

States of a traffic light

Consider a traffic light as an example. If it’s been green, drivers and passengers expect to see yellow — not red — next. When it turns yellow, they’d expect red and not…


寫程式前先釐清每個物件的「我是誰?」和「我在哪裡?」

最近架構師主管出了個作業給我們:康威生命遊戲(Conway’s Game of Life),要用這個經典題目讓我們練習 OOP 介面 (interface) 的設計理念。本文記錄我跟他聊生命遊戲程式設計的對話過程。

他出作業的理由是:

OOP 很強調 interface,而良好的 interface 是開出良好的 API 的基礎。看過太多用了先進開發工具與框架的工程師,卻設計出很糟糕的 API 有感。

舉例來說:看到一個題目你會定義哪些類別?你定義的類別各自的職責是什麼?如何表達各物件間的關聯?這個任務適合由這個類別的物件來做嗎?

Photo by Marisa Morton on Unsplash

遊戲都有規則,我們馬上來看看這個遊戲怎麼玩。

生命遊戲怎麼玩

康威生命遊戲,又稱康威生命棋,是英國數學家約翰·何頓·康威在 1970 年發明的細胞自動機

簡而言之,你可以想像有個棋盤(或是一片稿紙、或是一塊塊綠豆糕),在它的每一格都放入細胞,可能是活細胞或死細胞。細胞會因為一些條件在一段時間後生長或死亡,你在放入細胞後就可以站在旁邊開始觀察一段時間並計算整個過程。

像這樣(黑色是活細胞、白色是死細胞):


最近寫 PoC 在打 API 取得資料、瀏覽器 set-cookie 的時候,遇到一點問題:用本地透過 https 打都沒事,但用 docker 改成用 http 打就失敗了。

跟同事追了整整半天 ASP.NET core 的 cookies, same-site, secure policy 設定,最後才發現問題根源完全不是這些,而是瀏覽器的快取跟 HSTS 設定,於是想寫篇筆記做個紀錄。

問題

情境:用 dotnet webapp 一個專案中的登入頁 (/Signin),呼叫 HttpContext.SignInAsync,用 CookieAuthenticationDefaults 把登入成功拿到的資料(用戶名字、ID)塞到 cookies,轉址到會員資料頁 (/Member)。

var cl …


透過培訓轉職後端工程師的心得

因為最近又到了 AppWorks School 的申請季節,身邊很多親朋好友在詢問我這個軟體培訓計畫 (coding bootcamp) 的種種,於是希望透過本文分享心路歷程給非本科系、也想轉職成為工程師的人們。官網有的內容不做過多贅述,這邊整理關於 AppWorks School 常常有人問我的問題、以及分享我個人的體驗。

* Disclaimer: 本文為非官方的個人心得

Photo by Sean Lim on Unsplash

AppWorks School 是什麼?

Code Your Future

遠距學習 4 週 + 駐點集訓 16 週,成為軟體工程師

AppWorks School 是個「集結業界實務所需,精心設計的訓練課程」,目標就是透過它的培訓,你可以成為一位軟體工程師

我在 AppWorks School 花多少時間?

AppWorks School 要求連續 16 週、每週約 70–75 小時的學習量。表訂每週一到五 9 …


客製化種種零件以打造複雜物件

建造者模式在幹嘛?

建造者 (Builder) 模式將物件的「建構」與「表示」分離,隱藏並封裝建構過程的細節。它讓我們可以將物件本身拆解成不同的元件,一步一步建造每一部分,最後產生出我們想要的複雜物件。

Builder is a creational design pattern that lets you construct complex objects step by step. The pattern allows you to produce different types and representations of an object using the same construction code.

為什麼要用建造者模式?

要解決的問題為:

  1. 拖太長的建構子 (telescoping constructor)
  2. 建構子內不需要的參數 …

Wenchin

Software engineer | wanderer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store