先延續昨天的主題,來看個比較現實的層面:stipend(助學金),根據 Wikipedia ,會分為兩個階段領 2500 USD,也又是總額 5000 USD。然而這是過時的資訊,GSoC 前幾年新推出的策略如下:
共有三個階段的審核並給與獎勵
* 第一次審核 (paid ~June 22): 30%
* 第二次審核 (paid ~July 20): 30%
* 第三次審核 (paid late August): 40%
其中 stipend 根據不同國家的 PPP(Purchasing Power Parity)[註1] 也有不同的總額,2018 年台灣的金額為 3000 USD,其中最高為 6600 USD。
儘管比一開始的 5000 USD 降低不好,以今日匯率換算一下:3000 USD -> 92,408 NTD,仍然有 9 萬左右的助學金可以賺又能參與開源組織專案開發,何樂不為?
[註1]關於 PPP 的理論而換算出的金額跟兩個貨幣的匯率是有相當的關係,因為牽扯到的層面屬經濟學的領域,可以詳閱中文版解釋 Wikipedia PPP
FYI:經過一夜的思考,筆者決定先從 GSoC 的專案著手深入去瞭解開源組織的生態,並把過程中找到的資訊一一分享出來,今天的主題應該會比較適合想參與開源組織卻不知如何著手的朋友,或者想瞭解 GNOME 在開發專案需要具備哪些基本知識。
好!所以今天要來觀察的是 GNOME GSoC 2018 的專案,首先來看看 GNOME 針對 GSoC 做出的(說明頁面)[https://wiki.gnome.org/Outreach/SummerOfCode/2018/Ideas] ,底下節錄
You can get started now by fixing a small bug, which is a requirement for a successful application, but should not take you a lot of time and will show us your willingness to dive into the code. We are generally looking for students who are willing to learn, have good coding skills and, most importantly, have a keen interest in open source software development. More
簡單來說,GNOME 建議如果你想參與 GSoC,可以從「修復 Bug」入手,說起來簡單,實際上可以怎麼做呢?
1.找一個 GNOME 開發的專案 => 2.(編譯)安裝 => 3.持續使用 => 4.總結使用心得
特別將 1、2 區分,是為了將「編譯專案、安裝專案」獨立出來,這個步驟對於大部分的新手開發者來說會是一個痛苦的門檻,因為你很有可能看到以下訊息(底下絕沒有要偷渡字數的概念XD):
這部分是取自 guake issue#1181
$ sudo make uninstall && make && sudo make install
rm -f "/usr/local/share/applications/guake.desktop"
rm -f "/usr/local/share/applications/guake-prefs.desktop"
rm -f "/usr/local/share/pixmaps/guake.png"
rm -f "/usr/local/share/glib-2.0/schemas/org.guake.gschema.xml"
rm -f /usr/local/lib/python3.6/$(python3 -c "import site; import os; print(os.path.basename(site.getsitepackages()[0]))")/guake/data/schema.guake.gschema.xml
[ -d /usr/local/share/glib-2.0/schemas/ ] && glib-compile-schemas /usr/local/share/glib-2.0/schemas/ || true
Schema files were not found: an existing output file was deleted.
Uninstalling Guake-3.0.5.dev6:
Successfully uninstalled Guake-3.0.5.dev6
generating desktop files
generating po/ko.po
generating po/hu.po
generating po/ca.po
generating po/de.po
generating po/nl.po
generating po/it.po
generating po/cs.po
generating po/el.po
generating po/id.po
generating po/fa.po
generating po/tr.po
generating po/ru.po
generating po/fr.po
generating po/pt_BR.po
generating po/ja.po
generating po/pa.po
generating po/sv.po
generating po/pl.po
generating po/nb.po
generating po/zh_CN.po
generating po/uk.po
generating po/hr.po
generating po/es.po
generating po/gl.po
rm -f guake/data/gschemas.compiled
glib-compile-schemas --strict guake/data/
# 'make' target, so users can install guake without need to install the 'dev' dependencies
install -Dm644 "guake/data/guake.desktop" "/usr/local/share/applications/guake.desktop"
install -Dm644 "guake/data/guake-prefs.desktop" "/usr/local/share/applications/guake-prefs.desktop"
install -Dm644 "guake/data/pixmaps/guake.png" "/usr/local/share/pixmaps/guake.png"
install -Dm644 "guake/data/org.guake.gschema.xml" "/usr/local/share/glib-2.0/schemas/org.guake.gschema.xml"
glib-compile-schemas /usr/local/share/glib-2.0/schemas/
for f in $(find po -iname "*.mo"); do \
l="${f%%.*}"; \
lb=$(basename $l); \
install -Dm644 "$f" "/usr/local/share/locale/$lb/LC_MESSAGES/guake.mo"; \
done;
# you probably want to execute this target with sudo:
# sudo make install
Installing from on your system is not recommended.
Please prefer you application package manager (apt, yum, ...)
Ignoring typing: markers 'python_version < "3.5"' don't match your environment
Requirement already satisfied: pbr in /usr/lib/python3.6/site-packages (from -r requirements.txt (line 13))
running install
[pbr] Writing ChangeLog
[pbr] Generating ChangeLog
[pbr] ChangeLog complete (0.0s)
[pbr] Generating AUTHORS
[pbr] AUTHORS complete (0.1s)
running build
running build_py
running egg_info
writing Guake.egg-info/PKG-INFO
writing dependency_links to Guake.egg-info/dependency_links.txt
writing entry points to Guake.egg-info/entry_points.txt
writing requirements to Guake.egg-info/requires.txt
writing top-level names to Guake.egg-info/top_level.txt
writing pbr to Guake.egg-info/pbr.json
[pbr] Processing SOURCES.txt
[pbr] In git context, generating filelist from git
warning: no previously-included files found matching '.gitreview'
warning: no previously-included files matching '*.pyc' found anywhere in distribution
writing manifest file 'Guake.egg-info/SOURCES.txt'
running install_lib
creating /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/main.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/dbusiface.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/gsettings.py -> /usr/lib/python3.6/site-packages/guake
creating /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/about.glade -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/__init__.py -> /usr/lib/python3.6/site-packages/guake/data
creating /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-128.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-tray.svg -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-64.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/Makefile.am -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-48.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-notification.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/quick-open.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/add_tab.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/pixmaps/guake-tray.png -> /usr/lib/python3.6/site-packages/guake/data/pixmaps
copying build/lib/guake/data/guake-prefs.template.desktop -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/guake.template.desktop -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/prefs.glade -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/org.guake.gschema.xml -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/data/guake.glade -> /usr/lib/python3.6/site-packages/guake/data
copying build/lib/guake/__init__.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/terminal.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/guake_logging.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/about.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/prefs.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/keybindings.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/settings.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/utils.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/globals.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/simplegladeapp.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/palettes.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/guake_notebook.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/common.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/notifier.py -> /usr/lib/python3.6/site-packages/guake
copying build/lib/guake/guake_app.py -> /usr/lib/python3.6/site-packages/guake
creating /usr/lib/python3.6/site-packages/guake/tests
copying build/lib/guake/tests/test_guake.py -> /usr/lib/python3.6/site-packages/guake/tests
byte-compiling /usr/lib/python3.6/site-packages/guake/main.py to main.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/dbusiface.py to dbusiface.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/gsettings.py to gsettings.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/data/__init__.py to __init__.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/__init__.py to __init__.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/terminal.py to terminal.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/guake_logging.py to guake_logging.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/about.py to about.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/prefs.py to prefs.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/keybindings.py to keybindings.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/settings.py to settings.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/utils.py to utils.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/globals.py to globals.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/simplegladeapp.py to simplegladeapp.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/palettes.py to palettes.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/guake_notebook.py to guake_notebook.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/common.py to common.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/notifier.py to notifier.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/guake_app.py to guake_app.cpython-36.pyc
byte-compiling /usr/lib/python3.6/site-packages/guake/tests/test_guake.py to test_guake.cpython-36.pyc
writing byte-compilation script '/tmp/tmp10xoto9w.py'
/usr/bin/python3 /tmp/tmp10xoto9w.py
removing /tmp/tmp10xoto9w.py
running install_egg_info
Copying Guake.egg-info to /usr/lib/python3.6/site-packages/Guake-3.0.5.dev6-py3.6.egg-info
running install_scripts
Installing guake script to /usr/bin
An error occurred when opening the directory "/usr/local/lib/python3.6/site-packages/guake/data/": There is no such file or directory
make: *** [Makefile:43: install-system] Error 1
相信你是快速滑到這裡來的,讓我們繼續講下去,千萬不要小看編譯安裝,遙想當年看強者朋友在我電腦前擺弄 10 分鐘就搞定浪費我一個下午的安裝問題,也就是說這個步驟一旦出問題,想要解決問題?往往需要豐富的經驗和耐心才能找到問題點,舉凡環境沒設置好、相依性套件沒有安裝(相依性套件無法安裝/版本問題),而如果你想要參與開發,必定需要能夠編譯安裝,因此特地將這個步驟劃分出來,當然這邊不深入探討。
再來
最後
4. 需要你留心觀察軟體的操作流程、紀錄軟體運行發生的 bug,這步驟不是單純的嘴說:「怎麼這麼難用?」「某某軟體比他好用啊!」
借題發揮完後,讓我們再繼續回到 GNOME 官方的指引:
以下可以幫助你選擇專案並提出自己的點子
- 閱讀在 GNOME Wiki 的專案列表頁面
- 潛伏在專案的 IRC 頻道
- 閱讀新手教學來編譯建置專案的程式碼,並執行來使用它的功能
- 閱讀專案最近的 commit 歷史紀錄
- 閱讀 Planet GNOME
我認為 1、3 算是挺基本的,從 4 來看則是相對來說比較進階的做法,可以深入去瞭解最近專案的走向,或是從 commit 來瞭解程式碼的變動,而 2 似乎是相當常見的一種參與方式,另外還有透過 mailing list,如何參與等以後有機會在借題發揮,而最後一點 5 是筆者也沒接觸過,據了解這是一個透過 RSS 收集部落格文章的集散地,稍微瀏覽過,內容算是 GNOME 開發者紀錄開發過程的文章、引導教學,如果志在 GNOME GSoC 也是很值得時間投入閱讀看不同的開發者都是如何紀錄文章的。
最後
來看一下 GNOME 要求學生進行投稿的必回答問題(為求完整,完全複製貼上來做評論,請不要說我偷渡字數XD):
- What is your e-mail address and IRC nick?
- What is your blog address? Note: having a blog is required for a valid proposal, you can create a free one on, e.g., wordpress.com.
- What city and country will you reside in during the summer?
- What is your academic background, including university, major, and expected or achieved graduation date for any degree you have or are pursuing?
- Who is a possible mentor for the project you are proposing?
- What is the ultimate goal of your proposal?
- What applications/libraries of GNOME will the proposed work modify or create?
- What benefits does your proposed work have for GNOME and its community?
- Why are you the right person to work on this project?
- How do you plan to achieve completion of your project?
- Please provide a schedule with dates and important milestones/deliverables (in two week increments).
- For GUADEC, the GNOME conference hosted this year 6th July - 11th July in Almeria, Spain, we encourage you to do a small presentation of 3 minutes. What part of your project will be showable?
- What are your past experiences with the open source world as a user and as a contributor?
- Please include a link to the committed code in the form https://git.gnome.org/browse/[MODULE]/log/?qt=author&q=[YOUR NAME] or to Bugzilla or GitLab merge requests for the issues you fixed for the GNOME module your proposal is related to.
- If available, please include links to any other code you wrote for GNOME or other open source projects.
- What other relevant projects have you worked on previously and what knowledge you gained from working on them?
- What other time commitments, such as school work, exams, research, another job, planned vacation, etc., will you have between April 23th and August 6th? What are the dates for these commitments and how many hours a week do these commitments take?
從這份應徵文件的幾個相當關鍵的問題:
我只有一個感想:如果是小白要來應徵,肯定是不行的,最好是先回到官方建議的指引並且實踐看看,在這個過程中肯定有機會認識未來的導師,到時候在內推(應徵)肯定很簡單!
FYI,如果有興趣看看今年 Mentor 提出的 idea 請參考此頁面的 Accepted ideas,當然也有不合格的提議 (Untriaged Ideas) ,雖然沒有寫為什麼會不合格,但也打破我以為的只要自薦當 Mentor 肯定能過的成見,或許之後可以就這個方向寫一天的文章。
最後的最後
原本以為講完這些,有時間挑一個專案來紀錄,不過看在時間已經快截止,只好把專案的追蹤放到明天,先預告一下,明天應該會講內容會跟這份報告有關係:Link