如何 減少 寫程式 的 風險,作出 較精確的 時程估計

>最近兩周在完成一份工作
要把之前作的兩份研究,整合到另一個專案中
面對的問題大概是這樣子:

記錄一下實作時的想法

一開始,是一片混亂,不知道從哪邊開始著手
不確定這兩個研究是否還可以順利操作
不知道如何規畫時間,不知道兩周是否能完成

之前在 Head First OOAD 書上提到 減少風險 的想法
最大的風險來自無知,要減少風險就是要 減少不確定的因素
那麼就先來設計程式的流程吧

1. Top-down 設計程式流程

設計出 來源 –> 目標 的 overview flow (如左圖)
來確定每一個 function block (藍色方塊) 的 輸入 / 輸出 是什麼?
大致的想好 function block 的可行性
如果有需要 再為 function block 畫出其流程圖 (如右圖)
(function block 要到多細? 個人的感覺是,可以很快的想出其 pseudo code 時,就差不多了)

先設計程式的流程,有幾個好處

  • 對程式流程有大概的了解,了解問題有多嚴重? XD
  • 提早發現不確定的地方,不可行的地方,需要其他支援/技術的地方
  • 實作時不會迷失方向,能設計出較好的介面
  • 可以較精確的估計時程,這是最重要的,減少不確定性,才能作出合理的預估

2. 開始寫程式,要從什麼開始寫?
秉持著 減少風險 –> 減少不確定的因素 的想法
我選擇從 頭尾的 block (Fetcher / Inserter) 開始寫,
因為這兩個是對外的介面,完成對外的介面,剩下的都是在自已可以掌控的範圍內,相較之下風險較小

先寫出所有對外的介面,有什麼好處:

  • 優先解決不確定的因素,剩下可以完全自已掌控的環境
  • 隔絕外界的干擾,讓你的程式可以與外界更獨立的運作,就算面對的外在環境改變,就只用改介面部份的程式就好

3. 寫程式的過程中,使用 unit test / recorded test
為什麼要寫 unit test? 以及 什麼是 unit test? 可以參考 fcamel 大大 所寫的文章 為什麼要寫 unit test? 為什麼要先寫測試?
概念就是,為你的程式的每一個 function (unit),寫測試,而且最好要先寫
寫測試的效果大家都知道,就是確保你的程式的正確性
除此避免 bug 外,它也是一種減少風險的方法

  • 避免過度設計 (over-design):先寫測試,可以讓你了解 function 的輸入 和 輸出,只用寫出滿足輸入 / 輸出正確就行了,往往 “這功能以後很可能會用到" 的寫出來的功能,多半都是用不到。更何況,要用到,以後再寫就好。
  • 提高程式的可讀性 (readability):程式常常無法重新利用的原因,都是看不懂它在幹嘛 或是 跑出來的結果跟想像不一樣。測試 就 是許多的 use case,可以很快的幫助了解程式。
  • 提高程式的重用性 (re-usability):當一個 function 覺得難以測試時,就代表它該被拆成多個小 function。例如: 要寫一個 function 來以 統計 文件中 各個字 出現的數量,字以空白就分隔。這當然可以寫成一個 function 來解決,只是這測試起滿麻煩的;較好的寫法是,拆成3個 functions,一個讀入檔案,一個切空白,一個統計次數。如此一來 各 function 的定位簡單易懂,如此也提高了重用性,假設之後要 以 tab 作分隔 或是 算出文章的長度,都只用再改一個 function 就好了
以上,是最近的一些想法
運作的還滿順利的,時程都比較在掌握之中
記得 人月神話 中提到的
完成一個專案,1/2在 debug,1/3 在作規畫,只有1/6在寫程式
還滿符合這次的經驗 (最後,我大概花了4天在 de 一個 bug… orz)

Man vs Wild 荒野求生秘技

>第一次看到是在 youtube 上亂看看到的
一看就愛上了,實在非常喜歡這種很特別的節目

Man vs Wild 荒野求生秘技 是一個 Discovery 上的節目
目前出到第5季了

每一集都是跟著主角 Bear Grylls 到一個極端的地方
如何利用身上僅有的 一把小刀,一個水壺,和一個打火石,來求生
所謂極端的地方,真的是很極端哦!
像是:
雨林 (哥斯大黎加雨林)
沙漠 (下加利福尼亞沙漠)
孤島 (太平洋小島)
高山 (阿爾卑斯山)
足繁不及備載
最另我印象深刻的是
Bear Grylls 為了要示範如何從結冰的湖面的破洞中爬起來,還真的跳到洞中示範 XD
所以,要點讓我非常印象深刻
一開始,要讓你控制你的心跳,因為冰冷加上驚嚇,心跳會非常的快,不快控制心臟會受不了
要從你掉下去的地方爬起來,因為你不知道其他的地方會不會更脆弱
爬起來後,馬上把衣服脫掉,不然你馬上就會結冰
再來在身體抹一些冰!! 因為冰會把身上的水吸走
最後就是拼命的動,讓身體回溫,甩手讓血液回到手指
然後,既然是荒野,食物來源一定非常不容易
所以常常出現 吃蟲子,蛆,蜘蛛,動物屍體,毛毛蟲,擠大象的大便的水來喝等等
看 Bear Gryll 的吃後的表情,和形容食物的口感,都覺得超好笑 XD
就隨便找一個看感受一下 XD
雖然節目中看起來很有趣 XD,但是實際上碰到一定是笑不出來的 – -a
看著,也了解到自然的偉大,以及人類的渺小
我們現在能夠很容易的衣食無缺實在是很幸福的事情
希望大家都能平安,以及抱著敬畏的心情來對待我們的地球!
而在極端地方下,要如何求生
最重要的是要想辦法生存下來,那麼就不能缺少:
1. 飲水
2. 食物
3. 身體的溫度
再來才是想辦法求生:
1. 找河流:河岸多半會有人湮
2. 找方向:利用太陽來確定方向
3. 利用資源來讓移動加快:木筏,繩索等等

其他 highlight code syntax 方法

>上一篇介紹了 SyntaxHighter: 在 blogspot 上顯示漂亮的 code 格式

還有其他的方法
1. code-prettify
一個介紹它的網站,可以看一下它 highlight syntax 的外觀
沒有選擇這一個,純粹是因為我覺得 Syntaxhighlighter 比較漂亮,而且有行數

2. Online syntax highlighting
超方便的 syntax highlighter
完全不用安裝,而是用 html 語法,來改變字的顏色和背景
有支援許多種語言
可惜我選不到喜歡的樣式,以及希望有行數

範例:

class X(object):
def __init__(self, x=set([])):
self.x = x

好用連結:
http://www.elliotswan.com/postable/
幫你轉換 <, > 等字元,在貼code時很好用!

SyntaxHighter: 在 blogspot 上顯示漂亮的 code 格式

>SyntaxHighlighter 目前出到 3.0.83 版
以下是簡單的如何使用在 blogspot 上的流程,官網有詳細的說明

1. 安裝 SyntaxHighlighter的 core 和 theme
在 <header> … </header> 之間加上

<link href='http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/styles/shCore.css' rel='stylesheet' type='text/css'/>  
http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shCore.js

注意:blogspot 一定要加上 SyntaxHighlighter.config.bloggerMode = true;

4. 使用
語法:

<pre class="brush: <code 的語言>">
... code ...
</pre>

例子: Python code

<pre class="brush: py">
class X(object):
def __init__(self, x=set([])):
self.x = x
</pre>

顯示:

class X(object):
def __init__(self, x=set([])):
self.x = x

使用實例: Python: default value to a constructor’s parameter

Python: default value to a constructor parameter

>我們有一個 class X
constructor 有一個參數 x
我們想給 x 預設值為一個空的 set
直覺會這樣子寫:

class X(object):
  def __init__(self, x=set([])):
    self.x = x

只是會發生不符合預期的結果:

a = X()
b = X()
print a.x is b.x # True <-- not expected! a.x 和 b.x 指到了同一個 set([])

a.x.add(1)
print a.x # set([1])
print b.x # set([1]) <-- not expected!

目前是這樣子來避開這個問題

class X(object):
  def __init__(self, x=None)):
    self.x = x 
    if x is not None else set([])

跪求好的解法! 謝謝

SEO: blogspot 自動產生 meta keyword 和 content

>meta標籤,必須放在 之中,用於說明網頁的內容
對 Search Engine Optimization (SEO) 來說,一直視為很重要的最佳化項目

而其中最重要的就是兩個

1. description
語法:<meta name="description" content="sheep 的隨手筆記"/>
說明:網頁的內容簡述。
search engine 會抓取 description 來了解網頁的概述,如果沒有,則會抓取網頁內容的最前面幾個字 (ex: 25個字)

2. keywords
語法:<meta name="keywords" content="sheep,note"/>
說明:網頁的關鍵字。最好是以 ‘,’ 來隔開

每個網頁最好都加上此兩種 meta 標籤
而 blogspot 預設是沒有對 meta 作任何的撰寫的
有一個方便的方法來自動的在 blogspot 產生 meta tag

便是從 “設計" -> “修改html"

<b:skin/><![CDATA[ 之前,加上

<b:if cond=’data:blog.pageType == &quot;item&quot;’>
<meta expr:content=’data:blog.title + data:blog.pageName’ name=’Description’/>
<meta expr:content=’data:blog.title + data:blog.pageName’ name=’Keywords’/>
</b:if>

如此一來,在你的每一篇blog,都會自動的 產生 以 blog title 和 blog pageName 組成的 meta tag
當然還不夠好的是, 可以再把 keywords 取代以 ‘,’ 作分隔
(只是我不會,有沒有大大可以提供方法(跪求))

然仍,此方法對 SEO 到底有多少幫助?
Google 已經公開的提出,不使用 meta keywords 來作 ranking 的依據

原因當然就是因為 keywords 被濫用了
然而,據說在 Yahoo 的 search 還是有用
但是,未來如果跟 Bing 合作了,一切就很難說了

>rsync 來備份 mysql database (MyISAM)

>詳細的 rsync 的介紹

第一次用到 rsync 是用來作 mysql 的 database 的 備份
如何你的 database 是用 MyISAM 的 storage engine 的話
(wiki 上 MyISAM 的介紹)

每一個 database 就是一個 directory
每一個 table 是以三個檔案的形式來儲存
要備份,可以直接 cp 就好

而用 rsync 的原因在於,
當 sync 的檔案有改變時,rsync 會去更新有改變的地方,並且可以跨機器的作 sync

在同機器上作 database 的備份

  1. cd mysql_path (ex: /var/lib/mysql)
  2. sudo rsync -va database/ destination (需要有 root 權限才能 sync mysql 中的資料夾)

在不同機器上作 database 的備份

  1. (server1) cd mysql_path (ex: /var/lib/mysql)
  2. (server1) sudo rsync -va database/ user@server2:tmp_destination
  3. (server2) cd mysql_path
  4. (server2) sudo rsync -va tmp_destination/ destination
  5. (server2) sudo chown -R mysql:mysql destination (change directory owner and group)

rsync的小細節
rsync -va directory destination
會把 directory 整個sync到 destination 中,會變成 destination/directory

rsync -va directory/ destination
會把 directory 下的所有東西 sync到 destination 中

[讀書筆記] 孫子兵法

孫子兵法的內容很好取得,
有很多網頁都有孫子兵法了 (ex: 孫子兵法)

而這一本,有逐段的譯文,
以及提供相關的歷史故事和企業發展的例子,來作輔助的內容
當然有些並不是很相關,但是大部份都還滿不錯的

ps. 只是有點問題是,此本書的孫子兵法的內容有些遺漏,與網路上的版本不太相同

先說明一下,目前我是在一個目標是創業的team作程式工程師
看完孫子兵法後,就有一些淺薄的想法,想寫下來跟大家分享

小敵之堅,大國之擒也
對一個新創公司而言,面對者已經佔有市場的大公司,是不能直接的衝突的,
畢竟,很可能在人才,資金,市場佔有率,等,都沒有辦法跟大公司對抗
在一開始, 一定要避開直接的對抗,尋找自已的利基市場
當然,這就是困難的地方
只能多觀察,多思考的來尋找

其用戰也貴勝,久則純兵挫銳。故兵聞拙速,未睹巧之久也
找到了認為的利基市場,那就趕快的推出產品的 prototype ,來試試市場的水溫
像是如果是作網路的服務,有網頁的 prototype 後,請5~6個使用者,來提供使用上的建議
來了解市場真正的需求,和使用情境在哪
再來作產品的加強
了解使用者需求,產品才能成功
速度是非常重要的!

善戰者,其勢強,其節短
那如何提升速度呢?
要形成大家一起合作的氣氛,就是peopleware中的 團隊氣氛
這部份 peopleware中提到了不少,而孫子兵法著墨就不多
大概只提到了 愛民如子 的觀念而已
把成功,當成大家的成功。對待同袍都像對待自已親人一樣誠信。
形成了團隊,再來就是利用團隊擅長的地方,形成一個難以抵擋的氣勢

將能而君不御者勝
君命有所不受
一個小公司而言,我認為每個人都是 ,而不是兵
領導者要作的是,讓每個人都有發揮的空間
套用 peopleware 中的話,就是 有犯錯的權利
這樣子,每個人才敢真的放手去作,在自已的位子上發揮
之後,每個人在其的領域,就會比主管了解的更多,作到 君命有所不受 的地步

知已知彼,百戰不殆
孫子兵法中,處處在強調 的觀念,也就是資訊的了解
不知,的風險是很高的
不了解市場,公司就不會賺錢
不了解使用者,就作不出好的產品
不了解員工,就沒辦法知能善任
不了解對手,就沒辦法避實而擊虛
不了解技術,就訂不出合理的目標

以上就是一些小小的感覺
大部份都是自已公司內部如何努力

孫子兵法中著墨很多的部份,是在如何與對手對抗
但是目前並沒有什麼經驗,沒有辦法寫出什麼想法

[讀書筆記] 瞬間贏得信任的冷讀術

術 (cold reading)
從字面的解釋,:代表事先沒有任何準備的。:觀察、讀心的技巧
概念就是,利用話術,觀察,透過潛意識來影響對方,來達到目的
書中提到了不少的技巧,對此,我相信是滿有用的
像是:
話術
  • 一定不會錯的話。 你是個開朗的人,但是有時會悲觀。(正反兩面都說的話一定不會錯!)
  • 受騙者心理。你不對別人展開心胸是很可惜的,其實你是一個極有魅力的人,只是還沒有全部發揮出來。 (讓別人希望你說的是真的)
  • 沒有辦法拒絕的話。待會想去吃飯,還是喝咖啡? (沒有說的選項)
  • 容易套出對方話的話。你… 不是高雄人嗎? (就算是說錯了,通常對方會自然糾正)
觀察
  • 杯子技巧。不經意的把杯子靠近對方的杯子 (因此是杯子是親近之物,代表距離感)
  • 暗示。問對方"你想要A或是B"時,用手勢指一指A (潛意識會受到影響)
  • 手掌。讓對方看到手掌 (對方潛意識感到這個人很放開的對待自已)
  • 學對方的用詞。(利用同調的語言,來增加好感)
很多的技巧,都是想利用潛意識,讓對方不自覺的達到自已的目的
就跟許多激勵人心的書一樣,對自已精神喊話,不是也是潛意識的一種嗎?
書裡還提到了一點人的心理層面
  • 一個人最關心的,還是自已
  • 一個人的煩惱,不外乎:人際關係、金錢、健康、夢想
都是滿有趣的點
當然,學這些,不管有沒有用,都是希望對人性,對自已,多一份了解
不應該利用一些技巧去達到不好的目的!
知識和智慧都是沒有對錯的,會作錯事是,還是人心。

[讀書筆記] 有錢人的口頭禪 貧窮人的口頭禪

作者 齋藤一人 是日本連續蟬聯12年TOP10納稅人
不到200頁的篇幅,內容也是非常的淺顯,講的是作者的人生態度
這個世界其實很簡單
作者開宗明義的第一句
再來的內容,跟其他的人生觀書差不多,不外乎就是
  • 正面的態度,清澈的心靈
  • 給予他人自我重要感,說好話
  • 積極的行動,不要怕失敗
  • 面對挫折,心情的轉換
  • 分享
  • 如何作個有吸引力的人 等等
其實一直對此類說人生觀的書籍,抱持著 「真的嗎?」的想法
有這麼簡單的抱持著 正面的態度,問題就能解決了嗎?
一直告訴自已要樂觀,不也是自我催眠的一種嗎?
這跟之前很流行得發正念殺電腦病毒有什麼兩樣?
但是,或許 世界就是這麼簡單!
之前有聽過一句話,很振奮我的心
人生要學的道理,在幼稚園時就已經全教過了!
就算你沒有上過幼稚園,小學總有上過了吧?
老師不是常常告訴我們:不要欺負別人,要有禮貌,東西要跟別人分享 等等
或許 世界就是這麼簡單!
文字的表達,非常的不容易
因為要攻擊別人的文字,很容易
一句話總是有漏洞,很簡單的就用極端的例子來反駁
但這其實沒有什麼意思,對自已和對他人都沒有什麼幫助
不管別人怎麼告訴你他的方法
如果自已沒有思考,吸收,消化
都是沒有用的
總之,對自已的人生觀
多思考,多尋找有效的方法
並且再融會貫通後,想辦法傳達給其他人
當然,自已的想法總會有局限
因此,多閱讀他人的智慧,一定是有幫助的
只是,重點還是自已要多思考!
共勉之