Sunday, March 28, 2021

脊柱模型 (spinemodel)

Spinemodel 是我最近看到的一個思考工具,一開始只是覺得『圖』滿漂亮的。後來,我在寫一篇文章的時候,應用了這個 spinemodel 來寫作,算是解決了我長久以來寫作的一個難題。長久以來,我有一個題目總是寫不出來:「如何把 Clojure programming language 對一般經營管理階層的好處寫出來?

後來,看了 spinemodel 之後,總算想出了寫法 --- Clojure programming language 算是一種 tools ,所以我要寫它的好處,可以先把它對於 practices 的影響做出連結,這樣子就可以了。考慮經營管理階層與軟體開發者的知識落差之後,這應該是最有效的寫法。

也因為如此,又多看了看這個 spinemodel 的其它應用方式,目前有看到兩個其它的應用方式 ,我覺得算是不錯的,網站上已經有把這兩個用法寫得相對清楚了。

Thursday, March 4, 2021

non-ascii character

我不小心寫出了一個 bug ,這個 bug 是在程式碼中錯誤地使用了 non-ascii character 。

我需要寫一個字串 "1280x720" ,正常來講,在打程式碼的時候,因為要使用 ascii characters ,所以中間的乘號會使用英文的 x 字母。然而,因為我是從網路找來的字串貼上的,於是,這個字串中間的乘號,就真的不小心變成了 code 215 ,也就是真正的「乘號」。最麻煩的地方是,這種 bug ,肉眼還幾乎看不出來!

事後去反省,該如何可以快速地去找出這種錯誤,大概研究了兩種可以輔助除錯的工具:


(1) 在 source code 資料夾下指令 

ack "[^\x00-\x7F]"

如此就會立刻找出 source code 資料裡,包含 non-ascii code 的地方。

(2) vim 的指令 ga 或是 :as 可以顯示 cursor 處的字元編碼。

Wednesday, March 3, 2021

開發 Clojure 搭配使用的 ack 設置檔 (.ackrc)

ack-grep 我一直覺得滿好用的,不用特別設定就會自動忽略 node_modules 這種可以忽略的資料夾。然而,開發 Clojure ,尤其又使用 deps.edn &clj 的話,還是要透過 .ackrc 來設定一些資料夾,讓 ack 視為自動忽略。

--------分隔線 ----------------


# Tips:
# using ack to show only the clojure files for further processing
# ack -f --clojure
#
--ignore-dir=resources
--ignore-dir=.shadow-cljs
--ignore-dir=.cpcache

在 macbook 下使用的 .tmux.conf 檔案

我有時候很佩服一些朋友,他們會把一些工具玩轉到極致,我的話,通常還是採取 purpose-driven 的方式去研究工具。確定會派得上用場的,才去做設定。下方是我平常用的 tmux config ,可以搞定我覺得對我來說比較重要的兩個功能:
  • 可以用滑鼠捲動。
  • 複製貼上可以與系統的剪貼簿整合。
------- 分隔線 -------

# Enable mouse scrolling
set -g mouse on

# Vim style navigation in copy mode
setw -g mode-keys vi
bind P paste-buffer
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'pbcopy'
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle


# Tutorial: copy-pase through tmux buffer
#
# default <prefix> is <C-b>
# using `<C-b> + [` to enter copy mode
# using `v` to start selection
# using `y` to copy selection
# it will get the text stored at two places: tmux copy buffer and system clipboard
# using `ESC` to clear selection
# using `q` to leave copy mode
# using `<C-b> + P` to paste at another tmux session

Sunday, February 28, 2021

vim 的「搜尋」相關技巧

我研究了自己在 vim 裡的搜尋行為之後,發現了自己有兩個使用習慣,很明顯地沒有最佳化:

  • 有「無意義的反白高亮度顯示」,卻沒有關閉它。
  • 反覆搜尋同一個字串。
什麼是「無意義的反白高亮度顯示」呢?因為我有設定搜尋字串高亮度顯示,所以一旦我搜尋了 AAA,整個檔案裡所有的 AAA 字串都會變成『反白高亮度』。然而,當我按下 Enter 之後,也就意味著,我已經打算在某一個特定的 AAA 位置開始做編輯了。即使如此,這個時間點,『反白高亮度』卻不會自動消失,有時到達甚至造成干擾的程度。這時候,應該下的指令是 :noh ,這樣一來,就可以順利地關閉反白高亮度。

什麼時候會反覆搜尋同一字串呢?這個低效率的行為常發生在開發程式時,有時候要寫第 50 行的地方,卻需要同時參考第 15, 75, 95 行這三處的寫法。由於行號是會變動的,所以我通常是去記下某一行的關鍵字,比方說,第 15 行有一個關鍵詞是 upload ,我就透過搜尋 upload ,如此就可以從其它地方很快地回到該行。

上述的作法是很低效率的習慣。相對有效率的作法則是,使用 vim 的 marks 功能。比方說,如果我需要之後回到第 15 行的話,我就在該地方,先下個指令 ma ,讓 a 這個 mark 記住該位置。之後,如果我要回到那一行時,我只要下 `a ,就可以快速地回到 a mark 的位置。

Wednesday, February 24, 2021

vim 查找關鍵字/函數引用 vs 開啟多重檔案

vim 有兩組功能,我覺得很適合一起使用

  • 查找關鍵字/函數引用
  • 開啟多重檔案

查找關鍵字的功能,我是安裝 ack.vim 。設定好之後,就可以下 :Ack 指令來找。有比對到關鍵字的檔案,就會在 Quickfix List 裡列出,而且可以用上下鍵來選擇開啟。於是,這時候下列的一組 Quickfix List 專用的指令,就值得記憶了。

搭配指令
:copen                  =>  打開 Quickfix 窗口,顯示所有結果
:cclose, :ccl           =>  關閉 Quickfix 窗口

如果 vim 配合 language server protocol 來使用的話,可以有查找「函數引用」的功能,我使用的 vim plugin 會將函數引用列在 Location list 裡。於是,這時候下列的一組 Location List 專用的指令,就值得記憶了。

搭配指令
:lopen                  =>  打開 Location 窗口,顯示所有結果
:lclose, :lcl            =>  關閉 Location 窗口

上述的功能,就很容易開啟許多的 buffers (即開啟後正在編輯的檔案),於是我們如果想要看到,現在開啟了哪些 buffers ,就可以下 :ls 來看,目前有哪些檔案被開啟。

搭配指令
:ls                          => 看有哪些檔案被開啟成為 buffer
:b [數字id]               => 顯示對應該 id 的檔案
:e [檔名]                  => 開啟特定檔案 
:bd                         => 關閉目前的 buffer

Monday, February 22, 2021

塑造工作 (ShapeUp)

我朋友很欣賞 37 signals 公司的工作哲學 ---「塑造工作」,推荐給我看。(37 signals 公司是間一流的 web application 公司)

該書對於軟體工作倡議的分工方式,我認為相當的有道理。杜拉克曾經有一篇文章探討如何提高知識工作者的產出? 該文提到了幾個重點:

 1. 界定任務

 2. 專注於核心工作

 3. 界定績效

 4. 管理者與知識工作者建立夥伴關系


杜拉克來自實務的觀察自然有其道理,但是,要怎麼應用在軟體開發上呢?對於軟體開發的實務來講,十次中有九次,往往都牽扯到未知的實驗與探索,換言之,軟體開發的實務之中,往往帶有一定的科學理論建構性質。有了未知性質的工作,任務難以界定;而邊界難以界定清楚的工作,績效又該如何界定呢?我在過往工作的經驗之中,往往只能使用「專注核心工作」的原則,對於其它三項原則,往往只聽樓梯響,不見人下樓。


塑造工作」一書提出的解決之道相當有特色:將團隊拆分成「資深團隊」與「循環團隊」。「資深團隊」負責塑造工作,塑造完成的工作,應該是已經將高風險與未知的部分移除、可以在 6 週之內完成的明確開發工作。塑造完成的工作,交給「循環團隊」去開發,而循環團隊的任務則是要在 6 週內完成開發任務。


從界定任務與績效的角度來看,資深團隊的任務是要正確地塑造工作。而循環團隊的工作則是準時地把塑造完成的工作加以交付。這正也符合了杜拉克說過的,「規畫」與「執行」應該分開來做。有了明確的任務界定,界定明確的績效也因此可能發生。(註:杜拉克同時也說:『分開來做,是指在不同的時間做,但是,不一定要交給不同的人來做。』)

從夥伴關系的角度來看,上述的資深團隊,一方面帶有中階管理階層的屬性,因為他們的任務要決定『去做什麼與不做什麼』。更重要的是,他們也是該領域中極為卓越的知識工作者,否則,勢必沒有足夠的能力,來為循環團隊塑造可以達成的工作。管理者與知識工作者兩個不同的身分放在同一個腦子裡,自然可以形成夥伴關系。