分類: General

  • 思考自己接下來在 IT 圈的發展路線

    其實這個問題我一直在思考,也不斷在修改想法,「君子立志恆,小人恆立志」看來我就是個不折不扣的小人。

    小時候(其實是大學畢業前啦)我想做個遊戲製作人,因為那時候(約 2000 年前後)遇到日本遊戲業界的大震盪,即使在經營困難下,不少公司、製作人仍舊出了很多有如藝術品(唸作:叫好不叫座)的遊戲。回頭看看,那段期間的煎熬,讓現在還存活的一些日本遊戲公司結出了豐盛的果實。

    那個時候,我很嚮往「榨乾系統的能力,創造優秀的遊戲聲光、互動體驗,帶給玩家感動」這件事,也嚮往遊戲公司從頭(晶片)打造平台,充分掌握軟硬體這種「硬派」的作風。不過後來的發展卻是,遊戲公司沒人自己在搞處理器了,還願意自己打造遊戲引擎就該拍手稱許了,不管軟體硬體,相當程度已經轉為從外部找資源。我並不是說這樣的發展不好,因為系統發展的愈趨複雜,這樣專業分工是不可免的。

    扯遠了…總之後來我並沒有走上這條路。後來我的工作多是做 Web 開發與打雜,在這段時期,可以說一直到今天,我想做的是「親朋好友在日常生活裡會用到的軟體」、「對社會有益的軟體」,這就是我為什麼去過中研院臺史所、中研院生物多樣性研究中心、曾有過圖書搜尋引擎產品的某公司、做活動報名與售票系統的那間公司。我一直希望自己能夠「益於世」。雖然我的三腳貓功夫還能勉強做這行,可是身體狀態的負荷,以及感受到隨時都會被年輕一輩(以十年為一世代的話,不只一輩,應該還有二輩、三輩…)取代的壓力,讓我又開始思考,自己還能做什麼?有什麼是在應用層面上更往中介軟體、核心元件走、不容易輕易就被嫩肝取代的?

    回顧自己的本科所學,其實我知道那答案再清楚不過,就是「資料庫」與「搜尋引擎」。但是這兩門學問的坑都很深,在 Library and Information Studies 裡,會用稍微進階的 SQL 與 Boolean 檢索就算不錯了,遑論還要往理論與實作鑽,現在才說要踏進來,也許旁人看來可說是有勇無謀,貽笑大方,我自己也明白,所以就只挑了其中一個來專注研究。

    我希望幾年之後,我在搜尋引擎這方面,可以提供專業服務。

  • 重新檢討自己的技術選型

    我現在的狀況是這樣:幾乎只能工作大約半個工作日(約四至五小時),手臂跟背部就開始抗議了,有時覺得那一天狀況奇佳,可以衝了快十小時,隔天就又被討回來。

    於是我覺得我該重新檢討自己的技術選型。再不然,我就得考慮盡早轉行。

    誠實地說,以往我因為自己的學歷出身,長期在這個圈子裡覺得很自卑,喜歡電腦科學、軟體工程,但是幾乎沒有用過比較貼近系統底層的語言,遑論做相關開發,這種無法往 “bare-metal” 靠、「榨乾、徹底且有效發揮硬體能力」的歷程,讓我覺得自己始終低人一等。

    以前我讀朱邦復的組合語言教材《組合語言的藝術》,他錙銖必較於「少用幾個指令,卻做到相同的功能」那種情懷,很讓我嚮往,雖然我知道現在很多編譯器產品做的最佳化,已經很聰明了,往往只要你的程式寫法不要寫得太爛,效能表現其實都不會太差,反之,如果你的程式爛到原本就用很差的算法去叫電腦做事,用再怎麼貼近底層的程式語言,編譯器可能還是會編出同樣也是在繞很多路來做事情的機器碼,這樣並沒有比較高明。

    但是我一直以來都在用相對「軟式」的 scripting language 做開發,常常還是會想「哪天我也可以做點比較『硬底子』、更貼近系統底層的東西」,如果可以這樣,自己是不是就可以更往 “bare-metal” 靠、更 rock 一點?

    不過以我現在的狀況,我想了想,我必須選擇那些更能讓我表現 “intent” 的程式語言與工具,也就是那些雖然可能還是很「軟式」,卻可以一眼望去,就立即知道這段程式碼想要處理、解決什麼問題的程式語言與工具。

    當然,scripting language 不盡然都可以很不反人類地表達 intent(為了怕傷感情,我就不多舉例了…),貼近系統底層的語言也不盡然就寫不出「高 Intent 表達力」的程式。所以我說的是,我接下來的技術選型,可以讓我更能表現 “intent”,粗糙一點來說,就是「同樣行數,卻更能涵蓋問題解法,且不管你資淺資深、本科非本科,有基本程式觀念的人都容易讀懂」的程式。

    一來是因為我必須很容易找到人一起跟我共事,做出解決方案,二來,考慮我的生產力整個打折,我必須用更少時間,做出原來在正常工作日該有的產能。

    再來就是,就算我沒能做出什麼揚名立萬、揚眉吐氣、超硬底子、超貼近系統底層的東西,只要我在這行,還能有點用處,解決一些其他人覺得很煩、很痛的問題,其實,就很好了。

    補充:這篇網誌寫完後的晚間,我恰巧讀到〈尤雨溪回应:Vue与TypeScript为什么相性特别差?〉一文,其中提到 “intuition based design”,即符合我上面講的「表現 “intent”」這件事。我書讀的少,不知道有這麼一個現成的好詞可以表達我的意思,真是笑話了。

  • 離開 InfuseAI

    去年七月進來這家公司,但是最近身體狀況又變差,難以負荷工作,就在一月底決定離開。

    其實多多少少還是有人在猜測背後有沒有什麼隱情之類的八卦,沒有,真的沒有。把在 Twitter 上寫的再貼來講一遍:公司沒有什麼問題,老闆是出社會以來遇過最好的,同事也都是極為優秀的人才,產品也解決了很多企業亟需導入 AI 時的基礎建設痛點。

    而且很可惜的是,之前在 KKTIX 共事很愉快、從他那邊也學到很多東西的 Ash 後來也加入這間公司,再度當同事,但是我不得不先離開,不然還會再從他那邊偷學到更多東西。

    真要說有什麼問題的話,就是我自覺給團隊惹的麻煩比貢獻多,非常抱歉。

  • 我的復健路

    四個多月前,我開始了待業、且經常跑醫院的日子。

    復健項目一開始有熱敷、牽引治療、低週波電療,後來調整為熱敷、牽引治療、干擾波電療。

    熱敷的作用是讓頸關節先熱開,避免接下來的牽引治療發生拉傷。低週波電療與干擾波電療的作用,復健師沒跟我說,我也不好從網上抄作用機制來貼。

    每個項目表定 20 分鐘,所以一整個療程做下來就是基本一個小時。健保補助看診一次可以做六次復健。

    每次做完復健,當下幾乎都感覺比較舒服,但是也常常隔了一天患部就又痠疼麻。

    中間我曾經自費購買熱敷墊、瑜珈墊,希望在家也能多少做點「自」療。

    後來綜合醫師與復健師的說法,我懷疑自己這樣反覆發作,其中一個因素是我的睡姿不良,側躺、俯臥壓迫到患部肌肉、筋骨,所以我又去買了「護腰墊」與「床頭靠墊」來矯正我的睡姿,回到對背部肌肉最無負擔的仰臥,目前看來改善不少,但是我不能確定是心理作用使然,還是物理機制確實如此,僅提供我自身經驗,非宣傳療效,請注意。

    在這之前,我從不知道「能夠握緊拳頭出力」這樣尋常的動作,竟是如此難能可貴的事,那段只能撐半天敲鍵盤工作、接下來就呈現無法使力的報銷狀態的時光,連拿個碗都拿不穩,工作上也覺得拖累團隊步調,久而久之,會讓原本就很廢柴的自己覺得更加百無一用,心情受到很大的影響,惡性循環之下,整個人的身心都不好。

    如今稍有改善之後,我學著要注意保持正確、避免不當壓迫的姿勢,還有透過醫療資訊的線索,在原本茫然不知從何改善的狀態下,漸漸能夠自主掌握些什麼,心理會踏實不少。不過還是要再強調,資訊的媒體識讀很重要,我一直很小心讓自己不成為那種「病急亂投醫、胡亂相信一些作者不知打哪來的醫療文章、被牽著鼻子走、買了一堆來路不明的藥物、器材」的人。

  • COSCUP 2018 「帶您讀源碼」議程軌熱烈徵稿中!

    我一直很想在今年的 COSCUP  推動「帶您讀源碼」議程,起因是我某天在放空時,就這麼突然想到:

    在 COSCUP 這個臺灣的 F/OSS 年度盛會當中,主角之一 “source code” 反而佔不到什麼版面?大家都在談 Open Source,但是好像沒什麼人在意那個 “Source”?

    我覺得這個現象蠻奇妙的,而如果我們可以讓 source code 在 COSCUP 裡多一點份量,會產生什麼效應?我自己有一些預設的想像與期望,希望透過這樣的活動,可以鼓動更多人投入軟體開發(當然,如果是開發 F/OSS 那尤其是再好不過的了),或者再講淺白一點,撒下一顆顆「程式人」的育成種子。

    由於一些陰錯陽差,這個構思差點泡湯。好在貼心的 BobChao 大人幫忙,送出了議程軌申請案,最後這個議程軌也成案了。

    現在這軌議程開放徵稿了,非常需要您來分享圍繞著 source code 主題的各種有趣議題!

  • Minikube 0.26.1 開設 Kubernetes 1.10 cluster 遇到 “failure loading apiserver certificate: the certificate is not valid yet” 的 workaround

    Minikube 0.26.1 開設 Kubernetes 1.10 cluster 遇到 failure loading apiserver certificate: the certificate is not valid yet

    $ minikube start
    Starting local Kubernetes v1.10.0 cluster...
    Starting VM...
    Getting VM IP address...
    Moving files into cluster...
    Setting up certs...
    Connecting to cluster...
    Setting up kubeconfig...
    Starting cluster components...
    E0424 09:10:22.557702 22820 start.go:276] Error starting cluster: kubeadm init error sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI running command: : running command: sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI
    output: [init] Using Kubernetes version: v1.10.0
    [init] Using Authorization modes: [Node RBAC]
    [preflight] Running pre-flight checks.
    [certificates] Using the existing ca certificate and key.
    [WARNING Swap]: running with swap on is not supported. Please disable swap
    Flag --admission-control has been deprecated, Use --enable-admission-plugins or --disable-admission-plugins instead. Will be removed in a future version.
    failure loading apiserver certificate: the certificate is not valid yet
    : running command: sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI
    .: Process exited with status 1

    目前試出來的 workaround 是指定 bootstrapper 為不知何時會棄用的 localkube(被 kubeadm 取代):minikube start --bootstrapper=localkube