Category Archives: Software Development

淺談 Startup 公司的軟體開發流程 投影片

Update(2016/3): 投影片新增第四階段:營運成長

感謝 David Ko 的邀請,在 Agile Tour Hsinchu 給一場分享講軟體開發流程,內容就東拼西湊這幾年在 startup 公司學到和用到的東西,沒想到迴響還不錯,得到的評價是很實用,摘要如下:

  1. 需求收集
    • Lean Startup: MVP
    • 用 User Stories 描述
    • 善用線上協同工具 Quip 或 Hackpad
  2. 實作
    • 專案管理: Scrum 或 Kanban
    • 不重複發明輪子
    • 用 Wireframe 做設計
    • 寫自動化測試
    • 用版本控制系統 Git 搭配 Github flow 或 git flow
  3. 佈署上架
    • 自動化部署程序
    • 善用第三方 Monitor 和通訊工具 Slack
    • 使用 Metrics 量測
  4. 最後:在 Startup 就要關注全局,參與產品設計與營運

程式開發入門者的最適黑客松:ALPHA Hackathon

ALPHA HackathonALPHA Camp 即將在下個月舉辦的黑客松活動,我會在這場活動中擔任 Mentor 的角色。最近其實有不少黑客松,這一場有什麼特別的呢?ALPHA Hackathon 的定位主要是針對初級的開發者一個學習與成長的機會,透過團隊合作和現場 Mentor 的指導,協助你親手打造一個產品,解決問題。

因此,當初在發想階段的時候,就做了一些不一樣選擇,例如:

  1. 不是創業比賽,不是比Idea。所以到現場才會公布題目。可以避免參賽者提前偷跑,就失去現場的樂趣了。當然,這也不是單純程式解題競賽,而是以打造產品為主軸的主題。

  2. 沒有 Final Pitch。根據以往我的經驗,最後的上台Demo因為很多組既浪費時間又無趣,而且容易變成投影片競賽,大家只會對上台表現好的給高分。我認為最好的辦法就是各組互評(Peer Review),親自去看看去玩玩。

報名截止的日期是 2015/1/11,黑客松時間則是 2015/1/30 19:00 到 2015/2/1 17:00,歡迎年輕的開發者報名參加

程式設計不像建築工程,而是園藝維護

Update: Real Software Engineering by Glenn Vanderburg 這場演講也值得一看

前一陣子念「笑談軟體工程:敏捷開發法的逆襲」這本書,其中有幾篇文章的說法和比喻常被引用,所以我按圖索驥,也把原文章拿出來念一念,包括:

1. What Is Software Design? by Jack W. Reeves

「原始碼就是設計」「 Source code is the design」,避免花費太多時間在分析設計上,原始碼本身就是是軟體設計的產生,而 compile, link 等才是軟體的生產活動。因此,寫程式是「設計」的活動,而不是「生產」的活動,因此傳統設計文件的重要性就大大降低了。

程式設計不是 “building software”,而是 “designing software”。

2. Is Design Dead? by Martin Fowler

軟體系統的設計是演進來的,不能一步到位,而是要藉由憑繁與使用者互動得到的回饋來修改系統設計。

3. Programming is Gardening, not Engineering

與其把程式設計比喻成蓋房子,實際上更像是園藝。

4. Orthogonality and the DRY Principle

所有程式設計活動其實都是維護,因為絕大部分的時間都在改code,寫一點改一點。即使是新專案,也很快需要回頭作修改。

後兩篇是 A Conversation with Andy Hunt and Dave Thomas 訪談。Andy Hunt 和 Dave Thomas 是 The Pragmatic Programmer 這本經典的作者,他們後來共同創辦了 Pragmatic Bookshelf 這家出版社。其他五篇訪談也值得一看,都是關於軟體開發的真知灼見:

Kent Beck 的四個簡單程式設計原則

什麼是好設計,打從開始 coding 以來就是一個不斷追求的大哉問,從
SOLID 看到 Design Patterns,每一個原則看起來好有道理,每一個設計模式都在等著你的套用。

但是最近幾年的工作讓我有不一樣的心得,而不再費心追求「完美」的設計。同一個問題,每個人都會想出不一樣的解法,都說自己的解比較好。於是這些設計原則,常就淪為爭論的工具,當我覺得你的解法做太多事情時,搬出YAGNI; 當我覺得你的解法太複雜時,搬出KISS; 當覺得一個類別太肥大的時候,就搬出 SRP,反正都可以找到支持的論點就對了。很多時候其實不管哪一種方案,都是可以接受的可行方案,於是後來我就不想去爭個你死我活、斤斤計較當下的細節設計了。好設計應該是演進(grow)出來的,我首先在乎的反而是有沒有留下可用的測試和清楚好讀的程式,這樣才可以留下(後人)改進的機會。

回到正題,Kent Beck 在 eXtreme Programming 中,對於什麼是 Simple Design,留下了四個 Xp Simplicity Rules,我個人蠻喜歡的,因為很簡單又基本:

  1. Pass All Tests 通過全部測試:有測試才能夠讓軟體不斷的演進(grow)下去,不然你不是被 regression bugs 淹死,就是只能不計成本把code砍掉重練。如何寫好測試也是個大哉問,xUnit Test Patterns: Refactoring Test Code一書是其中的bible,嫌厚的話,可以先看看Refactoring Test Code這一篇paper,都是在講重構你的測試程式。當然,事情總是過猶不及,老闆付錢給你是為了得到 code,不是 tests。測試只是幫助我們寫好code的工具,追求100%完整的好測試並不是目的。

  2. Reveals Intent (Self-Documenting Code) 程式能夠表達出意圖:其中最重要而且基本的,就是要有好的程式命名,無論是類別、方法、變數等等。專講 Readable 的書有一本可以推薦 The Art of Readable Code。我這裡還推薦一個我最喜歡的技巧 Composed Method (搞笑談軟工也有一篇介紹),這招也是 Kent Beck 大師提出的,將細節的實作抽取成一個小方法,讓整個方法裡的操作都是類似的粒度,小小一招,大有作用。

  3. No Duplication (DRY) 不重複:”Every piece of knowledge must have a single, unambiguous, authoritative representation within a system” 完整定義請複誦三次。有時候重複並不是這麼明顯,例如作用重複的程式,但命名不同,或是命名重複,但程式作用不一樣。這裡推薦 David Chelimsky 的影片 Maintaining Balance While Reducing Duplication (slides)和 Maintaining Balance while Reducing Duplication: Part II,可以增進對 DRY 的理解,DRY 不只是在講不要重複程式碼而已。

  4. Has no superfluous parts (Minimizes the number of classes and methods) 不多餘:這一條也就是 YAGNI,不要實作多餘的功能。我個人不怎麼喜愛這個原則。不是不贊同,不需要的功能花時間去寫當然是浪費大家時間,而是這個原則太容易例外了。有時候會寫下多餘的程式來增加功能或擴充性,那是因為你擁有的經驗、直覺跟當時的情境告訴你應該這麼做,這可以在不久的將來就派上用場,過於強調 YAGNI 反而一板一眼教條主義了。光單看”減少類別跟方法的數量”跟 SRP 和 Composed Method 就有所衝突了,後兩者都會增加類別和方法的數量。

重要性 1 > 2 > 3 > 4,也有版本講 1 > 3 > 2 > 4。

參考資料

喜愛的程式設計名言

每次看技術書籍的時候,特別喜歡翻過一遍作者放在章節開頭的名言佳句(如果有的話),通常都蠻有意思的。所以在自己的裡也想這樣做,這是目前收集的名言佳句。不過要做到每則名言都剛好呼應該章內容真是困難啊。

  1. Life’s too short to build something nobody wants – Ash Maurya, Running Lean 作者
  2. Give someone a program, you frustrate them for a day; teach them how to program, you frustrate them for a lifetime. – David Leinweber
  3. There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. — C.A.R. Hoare
  4. Actually, I’m trying to make Ruby natural, not simple. Ruby is simple in appearance, but is very complex inside, just like our human body. – Matz, Ruby 發明人
  5. Much of the essence of building a program is in fact the debugging of the specification. – Fred Brooks, The Mythical Man-Month 作者
  6. The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. – Tom Cargill
  7. Complication is what happens when you try to solve a problem you don’t understand – Andy Boothe
  8. Weeks of programming can save you hours of planning. – Unknown
  9. Controlling complexity is the essence of computer programming. — Brian Kernighan
  10. All problems in computer science can be solved by another level of indirection(abstraction) – David Wheeler
    …except for the problem of too many layers of indirection. – Kevlin Henney’s corollary
  11. Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. — Rick Cook
  12. Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
  13. I’m not a great programmer; I’m just a good programmer with great habits. ― Kent Beck
  14. Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris. – Larry Wall, Perl 程式語言發明人
  15. Any fool can write code that a computer can understand. Good programmers write code that humans can understand. – Martin Fowler
  16. Measuring programming progress by lines of code is like measuring aircraft building progress by weight. – Bill Gates
  17. It’s not a bug – it’s an undocumented feature. – Unknown
  18. The most depressing thing about life as a programmer, I think, is if you’re faced with a chunk of code that either someone else wrote or, worse still, you wrote yourself but you no longer dare to modify. That’s depressing. – Peyton Jones
  19. It works on my machine! – 數以萬計的程式設計師
  20. Talk is cheap. Show me the code. – Linus Torvalds
  21. I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages — Alan Kay, Smalltalk 發明人
  22. When you choose a language, you’re choosing more than a set of technical trade-offs—you’re choosing a community. -Joshua Bloch
  23. Quality, Speed or Cheap. Pick two. – Unknown
  24. Developer testing isn’t primarily about verifying code. It’s about making great code. If you can’t test something, it might be your testing skills failing you but it’s probably your code code’s design. Testable code is almost always better code. – Chad Fowler
  25. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. – Donald Knuth
  26. No code is faster than no code. – Merb core tenet
  27. If you’re the smartest person in the room, you’re in the wrong room. – Unknown
  28. How long would it take your organization to deploy a change (to production) that involves just one single line of code? Do you do this on a repeatable, reliable basis? – Mary Poppendieck
  29. Nine people can’t make a baby in a month.  — Fred Brooks, The Mythical Man-Month作者
  30. Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. – Steve McConnell, Code Complete 作者
  31. A person does not really understand something until after teaching it to a computer. – Donald Knuth

有特別喜歡哪句嗎? 或是你自己有喜愛的名言,歡迎告訴我。

TextMate 推薦安裝 Plugins

Update(2011/5): 推薦安裝 Peepcode 快速找檔
Update(2010/5): 10 TextMate bundles/plugins to boost your Ruby on Rails development productivity

textmate_logo

Update(2009/2/21): Textmate 只有內建 Ctrl+Shift+A 的 SVN 功能,要支援 Git 請裝 Git Textmate Bundle,按 Ctrl+Shift+G 就可以有快捷功能。

Update(2009/2/22): 另外推薦一個不是 TextMate 的 Plugin,但是搭配起來非常好用的 Visor,只要使用快捷鍵就可以在螢幕上方下拉出 Terminal 畫面。

第一名是 AckMateack 是一套專門用來搜尋大型程式碼的工具,效能真是超級好。裝了這個套件之後,內建的 Find in Project 就別再用了吧。

第二名是 TextMate Plug-in: ProjectPlus,可以在顯示 SCM 的檔案狀態(例如有本地異動或有新增檔案等等),支援 SVN, Git, Mercurial, Svk 跟 Bazaar。

第三名是 CJK-Input.tmplugin,讓你可以正常輸入中文。如果有需要正常顯示,就必須換字型為 TextMateJ2 (see 解決 Textmate 中文問題)。

跟 Ruby on Rails 相關的有 Ruby on Rails TextMate bundleRuby TextMate bundleRails footnotes(會在例外錯誤畫面放有 Textmate 的連結,點下去就開出來該檔案,十分方便)。

Theme 方面,我自己用的是 Rails Envy Theme 連結失效,改放這裡 Rails Envy Theme (2011/3/20)。

另外就是官方 wiki 上的 Plugins 可以試試看。