MotA/2015-03-05T20:00:00+08:00糟糕的程式設計師有哪些招牌特質?2015-03-05T20:00:00+08:00張昱珩tag:,2015-03-05:post/zao-gao-de-cheng-shi-she-ji-shi-you-na-xie-zhao-pai-te-zhi/<p>在 <a href="http://www.quora.com/">Quora</a> 上看到一篇不錯的文章,原文為 <a href="http://www.quora.com/What-are-the-characteristics-of-a-bad-software-engineer/answer/Nachiket-Naik">What are the characteristics of a bad software engineer?</a>。</p>
<p>以下為筆者翻譯的版本,在 Quora 的授權條款下,譯文採<a href="https://creativecommons.org/licenses/by/4.0/deed.zh_TW">創用 CC 4.0 姓名標示</a>授權,轉載請註名原文出處及譯者姓名。原作保留收回授權的權利。</p>
<p>以我個人的經驗,糟糕的程式設計師具有以下這些特質:</p>
<ol>
<li>
<p>Stack Overflow 機器人:這種人遇到問題時,會靈活地使用 Google 搜尋,並採用所找到的第一個結果(按:好的答案通常在 Stack Overflow 上)。</p>
<p>問題不在於從 Stack Overflow 上抄答案回來用,因為 Stack Overflow 上面的資料確實比多數官方手冊來的豐富與完整。所以請不要誤會我的意思,上網找答案就算不是最棒的途徑也屬上上策。問題在於不加理解就機械化地採用網路上的答案,甚至也不管適不適用於自己的問題。許多人居然會覺得論壇上的說法比他們眼前的程式碼更可靠。</p>
</li>
<li>
<p>我不是測試人員:我不需要測試自己的程式碼,那是測試人員的工作。</p>
<p>我不認為這種態度在這個敏捷開發方法成熟的時代已經式微。還是有一些原因造成他們不願改變習慣去測試自己的程式碼。其中一部分來自於對設定測試環境沒有興趣,另一部分是對測試這門學問沒有通盤的認識。(還有一部分是開發人員社群對測試人員存有不便明說的輕蔑。)</p>
</li>
<li>
<p>討厭手冊:有些人好像認為手冊必須要押韻,而他們沒有那種文學素養,所以那自然不會是他們的工作。</p>
<p>一點淺見:這是活躍的程式計畫的頭號敵人。好的程式不是那種酷炫功能多如繁星的,而是那種具備一些多數人需要的好功能且程式碼持續被許多開發人員閱讀、修改和更新的。這類不喜歡技術交流和精確、詳盡的手冊的開發人員,是公司邁向成功的最大阻力。</p>
</li>
<li>
<p>程式碼很醜:我的程式碼可以跑,但是:</p>
<ul>
<li>我喜歡為變數取名叫 x、flag、str、arr 等等。</li>
<li>我絕大多數的程式碼都集中在一個很長很長的函式裡。</li>
<li>沒有縮排。</li>
<li>沒有一致的風格和規則。</li>
<li>到處都是全域變數。</li>
</ul>
<p>這一項是最令我困擾的。也不是說程式寫得不好啦,這裡面還是有可能會有超猛的程式碼。但我打個比方,如果一串鑽石項鍊掛在像酷斯拉那麼大的超巨型噁心怪蟲的屍體上被埋葬於地底,就再也不會有人找到它了。就算被找到,也不會有人想要清理它甚或戴上它。</p>
</li>
<li>
<p>短線投機客:他會不斷地寫出程式給你,但是不會嘗試深入瞭解問題,對程式應用領域的背景知識也全無興趣。</p>
<p>給他一些工作,他就算加班也會使命必達地交給你一個會動的程式。但也僅止於此。有時候開發人員具備一些自私的心態,促使他不只關心截止日期,也想從處理的事物中學到東西是很重要的。</p>
</li>
<li>
<p>切割達人:</p>
<p>「那不是我做的。」<br />
「這看起來真糟糕。」<br />
「不是我的問題。」<br />
「這不是我修改的程式碼造成的問題,而是用到我的程式碼的人沒寫對。」<br />
「我超討厭這個(一天要講十遍)。」<br />
「這我修不好,請去把寫這程式的人找來親自處理。」當初寫出錯誤的人已經離職了,不知道什麼時候會輪到你?</p>
</li>
<li>
<p>夜郎自大:「我的方法」或「這才是王道」是他們的座右銘。</p>
<p>但他說來說去都是在比較他的想法和你的想法,而不是這個案子的規格。不然就是拿你的解法和他的解法做比較,隨之而來的就是彼此間的爭論。有時候他們會一直不斷挑剔你的程式碼,因為就算你的程式碼會動、通過測試、看起來也很工整,仍舊令他們感到不舒服。這種人是開發效率的瓶頸,而且通常抗壓性很差。他們對團隊其實沒什麼幫助,雖然他們很可能是資深的開發人員。</p>
</li>
<li>
<p>固步自封:例如當 Java 的程式設計師聽到必須要用 Python 來寫一支程式,馬上就會石化給你看。</p>
<p>有些人對於學習新事物感到很痛苦,有些人則很怕寫東西進資料庫。他們會用盡一切方法來避免離開自己的舒適圈,此外有些迷信也使得他們不敢碰某些特定領域的東西。以我自己的經驗來說,這種現象在新手中是很常見沒錯,但一個好的開發人員即便在他們不熟悉的領域也樂於探索。</p>
</li>
<li>
<p>粗心:忘記備份、同一個案子的程式碼有很多版本分別放在不同的資料夾、在產品版本的程式中印出開發用的除錯訊息等等。</p>
<p>這是另一個常見的新手現象,在他的經驗值提高後就會有所改善。</p>
</li>
<li>
<p>懶惰的假高手:他們對能夠透過一些特殊的技巧讓程式運作感到自豪,會用一些神奇的方法來解決看起來很複雜的問題。</p>
<p>不過根據我的經驗,這些招式十有八九都只是化妝術。那些怪招都嘛很爛,因為不知道什麼時候會爆炸,而且之後在修複、重構上花的時間會比現在一次做好還要多。</p>
</li>
</ol>佈景主題的 license2015-02-08T00:00:00+08:00張昱珩tag:,2015-02-08:post/bu-jing-zhu-ti-de-license/<img alt="" src="/post/bu-jing-zhu-ti-de-license/asuka-langley-soryu.jpg" />
<p>剛才突然發現,我們用的這個佈景主題 <a class="reference external" href="https://github.com/PurePelicanTheme/pure">pure</a> 居然是 <a class="reference external" href="http://www.wikiwand.com/en/GNU_General_Public_License">GPLv3</a> 授權的!</p>
撰寫說明2015-02-06T23:44:00+08:00張昱珩tag:,2015-02-06:post/zhuan-xie-shuo-ming/<img alt="" src="/post/zhuan-xie-shuo-ming/pop.jpg" />
<ol class="arabic">
<li><p class="first">cd 到部落格的根目錄</p>
</li>
<li><p class="first">載入 venv 目錄中的虛擬環境</p>
<div class="highlight"><pre><span class="nb">source </span>venv/bin/activate
</pre></div>
</li>
<li><p class="first">cd 到文章 source code 的目錄</p>
<div class="highlight"><pre><span class="nb">cd </span>content/<span class="o">{</span>username<span class="o">}</span>
</pre></div>
</li>
<li><p class="first">開一個目錄來裝文章並切進去</p>
<div class="highlight"><pre>mkdir 2015-02-06-hello-world
<span class="nb">cd </span>2015-02-06-hello-world
</pre></div>
</li>
<li><p class="first">創建文章 (支援 Markdown 和 reST,這邊以 Markdown 為例) 並開始編輯</p>
<div class="highlight"><pre>touch 2015-02-06-hello-world.md
editor 2015-02-06-hello-world.md
</pre></div>
</li>
<li><p class="first">填寫文章的 metadata,接著開始撰內容</p>
<div class="highlight"><pre>title: 這是標題
date: 2015-02-06 23:24
authors: 作者的名字
summary: 副標題
tags: 用 , 分隔的標籤們
about_author: 簡短的作者介紹
email: 作者的 email
這是文章內容!
</pre></div>
</li>
<li><p class="first">寫完之後記得存檔,然後回到部落格根目錄生成 html</p>
<div class="highlight"><pre>make html
</pre></div>
</li>
<li><p class="first">在自己的電腦上開一個 HTTP server 來看看結果</p>
<div class="highlight"><pre>make serve
</pre></div>
<p>用瀏覽器打開 <a class="reference external" href="http://localhost:8000/">http://localhost:8000/</a></p>
</li>
<li><p class="first">Ctrl-c 中止 server 執行</p>
</li>
<li><p class="first">到文章所在的目錄把文章 commit 並 push,再到部落格根目錄把文章 repo 的變動 commit 並 push</p>
</li>
</ol>
<blockquote>
<div class="highlight"><pre><span class="nb">cd </span>content/<span class="o">{</span>username<span class="o">}</span>
git commit -am <span class="s2">"My super post"</span>
git push
<span class="nb">cd</span> ../..
git commit -am <span class="s2">"Update {username}'s post"</span>
git push
</pre></div>
</blockquote>
<p>更多說明:</p>
<ul class="simple">
<li><a class="reference external" href="http://docs.getpelican.com/en/3.5.0/content.html">官方說明</a></li>
<li>作者文章的 <a class="reference external" href="https://github.com/changyuheng/changyuheng.github.io/tree/mota">source code</a></li>
</ul>
本部落格開發、撰寫環境安裝說明2015-02-06T23:24:00+08:00張昱珩tag:,2015-02-06:post/ben-bu-luo-ge-kai-fa-zhuan-xie-huan-jing-an-zhuang-shuo-ming/<p><img alt="" src="/post/ben-bu-luo-ge-kai-fa-zhuan-xie-huan-jing-an-zhuang-shuo-ming/ayanami-rei.jpg" /></p>
<h2>安裝開發環境</h2>
<ol>
<li>
<p>在想要的目錄把部落格的 <a href="https://github.com/murmuring-on-the-air/murmuring-on-the-air.github.io">repo</a> 遞迴地 clone 回來</p>
<div class="highlight"><pre>git clone --recursive git@github.com:murmuring-on-the-air/murmuring-on-the-air.github.io.git
</pre></div>
</li>
<li>
<p>cd 進 clone 回來的 repo 目錄</p>
</li>
<li>
<p>安裝本部落格用的靜態網站產生器 <a href="http://docs.getpelican.com/en/3.5.0/install.html">Pelican</a></p>
<ol>
<li>
<p>首先用 Python 的 <a href="https://docs.python.org/3/library/venv.html">venv</a> 初始化一個虛擬環境,其中 <code>pyvenv venv</code> 是在當前目錄建立一個名為 <code>venv</code> 的目錄作為 <a href="https://docs.python.org/3/library/venv.html">venv</a> 所需工作目錄之用,<code>source venv/bin/activate</code> 則是載入這個 <code>venv</code> 的虛擬環境。</p>
<div class="highlight"><pre>pyvenv venv
<span class="nb">source </span>venv/bin/activate
</pre></div>
<p>目前的 Ubuntu 14.04 中的 venv 套件是壞的,用這個版本發行版的讀者,若發現上面的指令執行不正常,請改用下面的方法<a href="http://askubuntu.com/q/488529">手動安裝</a>:</p>
<div class="highlight"><pre>pyvenv-3.4 --without-pip venv
<span class="nb">source</span> ./venv/bin/activate
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.4.4.tar.gz
tar -vzxf setuptools-3.4.4.tar.gz
<span class="nb">cd </span>setuptools-3.4.4
python setup.py install
<span class="nb">cd</span> ..
wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz
tar -vzxf pip-1.5.6.tar.gz
<span class="nb">cd </span>pip-1.5.6
python setup.py install
<span class="nb">cd</span> ..
deactivate
rm -rf setuptools-3.4.4* pip-1.5.6*
<span class="nb">source</span> ./venv/bin/activate
</pre></div>
</li>
<li>
<p>安裝 <a href="http://docs.getpelican.com/en/3.5.0/install.html">Pelican</a> 和他相依的 library</p>
<div class="highlight"><pre>pip3 install -r requirements.txt
</pre></div>
</li>
</ol>
</li>
</ol>
<p><br /></p>
<h2>安裝撰寫環境</h2>
<ol>
<li>
<p>在自己的 GitHub 或是任何 Git hosting 開一個 repo,以便存放文章的 source code</p>
</li>
<li>
<p>在自己的電腦上,cd 到部落格開發環境的根目錄,把剛開好的 repo 加進部落格的 repo 中。</p>
<div class="highlight"><pre>git submodule add --branch <span class="o">{</span>branch 名稱<span class="o">}</span> <span class="o">{</span>repo 位置<span class="o">}</span> content/<span class="o">{</span>自己的 username<span class="o">}</span>
git commit content/<span class="o">{</span>自己的 username<span class="o">}</span>
</pre></div>
<p>範例:</p>
<div class="highlight"><pre>git submodule add --branch mota git@github.com:changyuheng/changyuheng.github.io.git content/changyuheng
git commit content/changyuheng
</pre></div>
</li>
</ol>