原始碼的價值

影片提到軟體開發過程中,真正有價值的東西是設計的邏輯。技術日新月異,需求也一直在變,所以原始碼很快就會過時。就算其他人用非法的手段拿到原始碼,也很難馬上修改,原始碼越龐大,就要花越多時間理解原始碼的運作邏輯,對於競爭對手來說可能重寫還比較快。總體來說,原始碼本身其實沒有想像中這麼有價值。 (影片是這麼說,不過我個人覺得競爭對手拿到原始碼,是可以逆向工程出很多知識的。我想影片作者真正想表達的是從原本的開發團隊來看,原始碼可以視為負債而不是資產,真正的資產是下面所提到的邏輯。) 這個影片的重點是 Peter Naur 提到,軟體開發過程中有三個很難用程式碼或文件完整記錄下來的思考邏輯: 現實世界與原始碼的對應關係 技術決策當下的背景與原因 原始碼如何適應新的需求 而這些難以記錄下來的邏輯,卻是整個軟體專案最有價值的經驗,這些經驗會有很大一部分殘存在參與過專案的人腦海中。 軟體的價值在於解決真實世界的問題 這個影片剛好連結到自己最近看到一個軟體工程的方法:領域驅動設計(Domain-Driven Design, DDD),討論軟體開發的價值所在。開發者常常會陷入鑽研酷炫技術,卻忘了真正要解決的問題,導致做出來的東西沒人用。DDD 思考如何讓領域知識盡早參與到開發過程中,讓開發者在設計時,能更好地捕捉現實世界的問題,最後交付出真正有價值的軟體。 一般軟體開發者因為沒有領域相關的知識,得花很多精力去理解真實世界的問題。另一方面,因為理解原始碼的精神成本很高,除了維護該原始碼的人難以參與其中,要等到做出功能後,才能從利害關係人與領域專家們中獲得重要的意見。為了進一步降低開發的風險,在這個基礎上發展出了領域故事化(Domain Storytelling) 的方法,嘗試使用圖形化語言,消除自然語言中的模糊地帶,增加團隊間溝通的效率。 站在地科領域的角度可以怎麼看? 非資訊相關科系的人,缺少的是對軟硬體生態的理解,導致 AI 出錯的時候找不到原因,怎麼下 prompt 都沒辦法準確地修正,結果越改越糟,所以才會有工程師說: AI 不會通靈,短期不會取代工程師。 前面提到開發者苦於吸收領域知識,而擁有領域知識的人很少可以開發複雜且龐大的程式。不過在這個 AI 可以幫忙寫程式的時代,很多程式語法的問題,現在都可以快速解決,甚至一些簡單的應用都可以快速生成出原型。 AI 時代學習程式的方向? 個人認為現在非資訊科系學習程式的重點,可以不用像過去花大量時間在學習程式的語法上,只要可以理解的程度就好,如果當下不能理解,就叫 AI 幫忙解釋。更多時間可以花在理解技術背後的原理和應用情境,就可以有效引導 AI 得到我們想要的結果。 具體一點的問題像是:每個程式語言的特性?資料怎麼儲存在電腦裡的?程式之間怎麼分配工作?電腦之間怎麼溝通? 理解這些背後的原理後,可以進一步去了解如果資料規模放大數千倍,或是硬體被限縮在規格很低的小電腦上,瓶頸會發生在哪?整個軟體架構該如何適應?這個過程需要慢慢累積,建立出現實世界與軟硬體技術的關係。 如何更有效率的使用 AI 協作開發程式? 如果不知道如何開始,可以從自己遇到的問題作為起點,不要急著生成程式碼(因為修改具體程式碼的成本比修改抽象的程式架構來的高出不少),先問問 AI 怎麼設計功能,為什麼要這樣設計? 理解程式架構後,自己嘗試去評估這些技術與自己現有的資源是否匹配,來回交談確定選用的技術與架構,再根據功能生成出每個程式碼片段組合起來。 在迭代的初期不需要太眷戀生成出來的程式碼,可以直接修改抽象的程式架構重新生成原型,等功能釐清、架構穩定了,再來詳細修改程式碼,這樣就可以慢慢理解整個軟體開發的邏輯。 如果必須維護舊的程式碼,可以先叫 AI 抽取出各個程式碼段落的意圖,抽象回程式架構,利用自己的領域知識去補足當時可能的情境,與 AI 討論組織出新的功能與架構設計,再用 AI 去修改或產生新的程式碼。

<span title='2024-10-02 11:31:05 +0800 +0800'>October 2, 2024</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

利用 Copilot 輔助開發 Word 自動化填入

使用情境: 平常助理有很多重複的行政表格需要填寫,有沒有辦法降低工作量? (以下個資是 AI 生成的虛構資料) 初步想法: 以前在演講看過用 AI 在 Excel 產生大量範例可以填入 Word 制式化表格 撇除 AI 的部分,我們知道可以用 Excel 可以大量填入 Word 表格 尋找最合適的解決方案: AI 給出三種方法: Word 郵件 合併列印功能 Word 巨集 Python 腳本 Python 腳本的問題是需要先建立 Python 環境,考量到一般使用者不會想要用指令來跑程式,所以先不考慮。 合併列印功能需要在 Excel 先做好每一筆的內容,但考慮到每次填入的內容其實都有點不一樣,所以需要手動複製貼上相關資訊這件事情並沒有解決。 Excel 可以根據某欄位的資料去尋找對應的相關資料,就像資料庫一樣。 分析需要填入的資料發現一些可以建表的欄位: 人員相關資料:姓名(索引)、身份證、工作單位、職稱 計畫相關資料:計畫名稱(索引)、計畫編號、會計編號 但是如果要在 Excel 先做好每一條的資料,再用合併列印功能輸出到 Word 上好像沒有這麼直觀。 找到 Word 開發者模式可以在文件中插入互動元件,例如:下拉式選單與勾選框,會讓 Word 用起來像網頁介面一樣。 這邊發現 Mac 的 office 功能比較少 ,Windows 的功能更齊全一點。 要用到互動式元件就得用 VB 寫巨集,這裡就拿出 ChatGPT 幫忙生成。 開發: 一開始小功能能夠產生出合適的程式碼,不過一開始是沒辦法執行的,後來問問 google 得知是中文編碼 Big5 問題。...

<span title='2024-05-31 05:36:10 +0800 +0800'>May 31, 2024</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

使用 CLion 與 CMake 開發 Fortran

Fortran 作為一個打孔卡時代就存在的古老程式語言,除了學校教的 Vim 或 Notepad 以外,其實可以使用較為現代的 IDE 來減少開發上的阻力,有很多不錯的功能像是一鍵編譯、語法檢查等等。傳統使用指令編譯與 Vim 編輯的方法還是得先了解過,以備不時之需。 CLion 是由 PyCharm 的母公司 JetBrains 所開發的 C/C++ IDE,裝上插件後也可以拿來寫 Fortran。 Generate by Midjourney niji 5在這裡先假設已經灌好 Fortran 跟 CLion 了,如果 Fortran 還沒安裝可以看看這篇:Installing GFortran 第一次安裝好 CLion 後要先灌 Fortran 插件,從歡迎頁面中左邊選單有個 Plugins,到 Marketplace 尋找這個 Fortran 插件。 在創立新 Project 時就有 Fortran executable 可以選 創立好 Project 後,裡面就會發現系統預先建立好的 CMakeLists.txt 模板 CLion 主要就是靠這個 CMakeLists 讓電腦知道要編譯什麼程式碼,將 進入 Vim > 改程式 > 存檔退出 Vim > 指令編譯 > 執行 這繁瑣的步驟變成一鍵完成。 前面三行是系統產生的模板,注意 Fortran 關鍵字不能刪掉,系統才會知道要用 Fortran 編譯器。...

<span title='2023-08-02 06:45:33 +0800 +0800'>August 2, 2023</span>&nbsp;·&nbsp;2 分鐘&nbsp;·&nbsp;Jimmy

如何解決 PyCharm Pro 2023.2 執行遠端主機中容器內的 Python 找不到檔案的問題?

一般在使用 Docker 容器開發程式的時候,大部分是在自己的電腦上透過 Docker Desktop 產生 Container,但是如果手上只有弱弱的筆電,沒辦法跑那種很吃效能的程式,那就只能在 Server 上直接用 Docker 開發程式。 Generate by Midjourney niji 5照著 PyCharm 的 UI 引導設定 New Interpreter > Docker 的時候, SSH 遠端主機的 Docker Container 會有路徑映射的問題: 這其實要分成三個問題解釋: 筆電的 code 要上傳到遠端主機上的哪裡? -> SFTP 上傳的檔案怎麼放進容器? -> Mount Volume 容器內的 Python 怎麼知道執行路徑? -> Path Mapping - - - - - - 筆電的 code 要上傳到遠端主機的哪裡? -> SFTP Settings > Deployment > SFTP 建立檔案上傳 Connect 分頁選擇要連接 SSH 的主機,如果沒有適合的選項按右邊 ⋯ 建立 在 Mappings 分頁的 Deployment path 選擇主機上的上傳路徑...

<span title='2023-08-01 07:48:18 +0800 +0800'>August 1, 2023</span>&nbsp;·&nbsp;2 分鐘&nbsp;·&nbsp;Jimmy

如何學習程式

我覺得要能夠寫好程式有幾個要點: 有個明確的需求,像是研究題目或想做些有趣的專案 寫出簡單會動的版本,先不用考慮太多複雜的設計 找一些可以優化目前程式的知識 最重要的是要拿自己的程式碼來改改看 重複 3-4 第三點需要一點靈感,像是看一些文章、影片,或是從一些經典的書來搜索。可以先選不會太複雜的來下手,重點是看完要能夠實際運用到手上的程式碼,改過之後就會更有印象。 我每次都會推薦從 Clean Code 這本書開始,裡面提到的改變都是一些看起來微不足道的東西,像是變數命名跟註解之類的,但累積起來會提升很多開發上的效率。 從書裡面的關鍵字可以往外延伸到其他更多的書,像是重構、敏捷開發之類的。實際上一開始列的那四點都可以從軟體工程的相關書籍中找到一些影子。 非常推薦博碩與歐萊里出版社的書,可以去天瓏書局網站上面逛逛,如果覺得買書很貴可以網路上找關鍵字,也是有很多線上資源可以參考。

<span title='2021-02-11 18:34:57 +0800 +0800'>February 11, 2021</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

VS Code 好用的 plugin

VS Code 越來越完善了,幾乎可以整個從 Pycharm 轉移過來。目前收集的 plugin 開始變多,想開一篇來紀錄一下不錯的插件。 Darcula Theme 把 Pycharm 的深色主題移植過來。 Remote Development 因為我都是用網路連一台 Linux 工作站做遠端開發,這個可以讓程式在遠端執行。他一次會裝三個套件:SSH、Container 跟 WSL,如果不想全裝也是可以只選 SSH。 Live Share 如果想要遠端請教別人程式怎麼改,但不想用 TeamViewer 把整個桌面傳給別人看,可以用這個討論程式碼。 Python 讓 VS Code 可以 Debug Python 的程式碼,還有 Jupyter Notebook 支援。寫 Python 程式前 VS Code 會要求你裝,不然 VS Code 就真的只是個 Notepad。 Pylance 就是把 VS Code 變成 Pycharm 等級 IDE 的神奇玩意,可以自動補完程式碼、自動排版、查找來源等。 vscode-pdf 渲染 PDF,這樣就不用到外面開 GMT 畫出來的圖。 Excel Viewer 拿來解析很大的 .csv ,不然有時候會看到眼花。 Live Server 寫 html 存擋後會自動更新瀏覽器上的頁面。 Docker...

<span title='2020-09-27 21:06:45 +0800 +0800'>September 27, 2020</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

第一次貢獻開源專案

以前看到開源專案上面貢獻程式碼都是大神,遲遲不知道怎麼下手加入討論,很怕一個外行人去攪人家的局很不好意思。 ![怕.jpg - Home | Facebook](https://jimmylab-images.seisblue.com/uploads/2020/08/image-1.jpeg) 今天分享一下貢獻開源的經驗,讓想要貢獻程式碼的朋友們可以跨出第一步。 前情提要 最近在 Scipy 上面看到一個 document 令人混淆的地方,花了一陣子研究原始碼發現是參數順序對不上的問題,雖然自己把問題繞過去了,但想說順便把這個 issue 反應給 Scipy 的開發者,確認 issues 裡面沒有人開過相關的主題,就來自己開一個吧~ 提交 Issue Issue 其實應用範圍很廣,從回報 Bug 到提供新想法都可以。 每個成熟的開源專案都有自己的 issue 模板可以套,照著裡面的空格填入就好。這次用 Bug 回報,主要要寫的就是敘述問題並重現錯誤,如果知道解法也可以順便附上。 Github 所有的文章是用 markdown 寫的,可以加入超連結、文字 highlight 等。 編輯的時候可以 Preview 看效果 開發者回覆 發了 issue 後過幾天會有開發者團隊開始分流,本來以為那些藍色標籤要自己貼,但實際上只有開發者可以貼。分流後會有對應專門的開發者來回覆,有時候也會有其他社群的人參與討論,有共識後就會請你去改程式碼然後發 Pull Request。 開發規範 改之前要去看他們的 Development guide,通常在原始碼根目錄的 CONTRIBUTING.md 裡面或他們網站上的開發者專區,Scipy 詳細的規範發 PR 時會再提醒一次。 Scipy 會對 commit 的內容與 PR 的名字做規範,例如文件相關的更改要在開頭加上 DOC:,他還會給你一個清單提示你該做什麼。 動手改 code 要改程式碼前要先把原本的程式碼 Fork 過來 正常來講應該要 clone 下來改,自己先在本機跑完測試再 push 到自己的 fork 上,但因為 scipy 有點太大只是要改個 docstring 要 clone 很久,所以就直接在 Github 上面改。改個 docstring 應該不太會報錯 (吧?...

<span title='2020-08-20 16:53:08 +0800 +0800'>August 20, 2020</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

AI Academy 台北分校 環境介紹

台北分校位於三重群光大樓的 12, 13F。 交通資訊為捷運先嗇宮站(橘線) 一號出口出去後左轉,然後左轉光復路一段。 接著一直走約 15 分鐘就會在右手邊看到很高的群光大樓。 不建議騎 Ubike,一方面搶不到車,另一方面停車地方距離大樓也有一段距離,不如直接走方便。 ![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1741.jpg) ![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1742.jpg)![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1743.jpg) ![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1744.jpg) ![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1746.jpg) ![](https://jimmylab-images.seisblue.com/uploads/2019/07/img_1748.jpg) 沿路有許多早餐店。 但過了這家 7-11 後就要走一段距離才會有吃的。 路上還有 Gogoro 換電站。 接近大樓還有一些流動餐車可以選。 大樓外。 大樓一樓有許多桌子,因為 9 點才能上樓,太早來可以在這裡先坐著等或吃早餐。 電梯前有門禁,搭電梯都需要刷卡才能按樓層,能到 1, 2, 3, 12, 13F 一般教室為開放式環境,每 8 人一桌。 桌子中間有插座與 USB 充電,wifi: Ai Academy 密碼 1~8,另有 chicony-guest 可以申請臨時帳號。 旁邊是助教辦公室。 有幾個會議廳可以線上預約使用。 有廁所跟飲水機。 另外有沙發區可以閒聊。 13F 還有咖啡機跟微波爐可以使用。 三樓是國際會議廳,整個會議廳是狹長形的,由五台投影機同步投影。 二樓是員工餐廳,有咖啡廳跟自助餐。 自助餐秤重低消 50 元,飯湯吃到飽,上面這樣 81 元。 也有一些配好的便當,65 元。 再來是一些線上資源,都要透過學號與密碼才能登入: 課表與講義:整個課程規劃是看影片與 PPT 為主,自己進度自己抓,不懂就問助教。講義不會一次放上去,會開放約一周的進度。 Gitlab:這個是他們自己架的 Gitlab,跟官方的沒有同步。 Mattermost:是一個自架聊天室,可以在上面問問題,學校也會在上面廣播一些事情。這東西有手機 app,這樣就不用一直開著分頁怕沒收到訊息。 Hub:練習用的硬體,每人有配到一張 1080ti GPU 的額度 (48,000 元的學費很多都在這RRR),到後期做專題 3~5 人可以一起合開多 GPU 的伺服器。...

<span title='2019-07-26 09:35:42 +0800 +0800'>July 26, 2019</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

VS Code 使用 WSL Terminal

如何將 Windows 上的 Ubuntu Terminal 連動到 VS Code 中? 6/30 更新:現在 VS Code 有一個統一的外掛 Remote Development 可以使用,底下有個Remote – WSL 會幫你管理預設的 WSL 版本。 安裝 Remote Development: ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image.png) 打開 Powershell : ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image-1.png) 輸入 `wsl -l` 將目前安裝的 Linux 版本列出來: ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image-2.png) 利用 `wsl -s ` 選擇要變成預設的 Linux 版本。 ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image-6.png) 回到 VS Code 後按下左下方的連線按鈕,選擇 Remote-WSL: New Window。 ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image-4.png) 會看到新視窗右下角變成 WSL 就成功了。 ![](https://jimmylab-images.seisblue.com/uploads/2019/06/image-5.png)

<span title='2019-03-18 22:44:27 +0800 +0800'>March 18, 2019</span>&nbsp;·&nbsp;1 分鐘&nbsp;·&nbsp;Jimmy

如何用 SSH 連進遠端主機內的 docker container?

Docker 是個好用的虛擬服務技術,可以快速將開發環境建立在其他電腦上,例如 Tensorflow 就有提供官方的 Docker image。但是如果想要用 Pycharm 遠端開發,會發現沒辦法直接跟遠端主機中 Docker container 內的 python 溝通。這時就得將 Container 的 SSH 服務安裝起來,讓 Container 直接可以對外連線,這樣對 Pycharm 而言就像是在另一台遠端主機上開發一樣。 如何將 container 的 port 22 暴露出去利用網際網路連線呢? 參考資料:Dockerize an SSH service 首先我們要建立一個名為 Dockerfile 的空白文件,以下是官方的 Dockerfile 範例: <pre class="brush: bash; highlight: [5]; title: ; notranslate" title=""> FROM ubuntu:16.04 RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix....

<span title='2018-12-05 16:54:26 +0800 +0800'>December 5, 2018</span>&nbsp;·&nbsp;2 分鐘&nbsp;·&nbsp;Jimmy