about 5 years ago

這個議題在今年創業潮之前算是比較冷門,沒看到什麼人在討論。最近大概是大家瘋創業,有實際上的頻寬需求,所以看到網路上又開始吵頻寬的價格,一些討論串看起來讓人都有股張飛打岳飛的錯覺。

這個主題我在三年前其實寫過類似的內容,現在環境當然有點不一樣了,被 Fox 拱出來寫一篇 2012 版的。

Hosting Plan

  • Simple CMS and Facebook Pages
  • Shared Hosting
  • VPS
  • Cloud Hosting
  • Dedicated Hosting
  • Amazon EC2

不少創業者談到開網站,始除了最原始的技術支出之外,一開始最令人覺得恐怖的就是頻寬的支出了。然後談到頻寬這個議題,接下來就會陷入 panic 。

台灣的 IDC 價格是不便宜,但不代表這樣的價格不能讓人做事,主要還是看公司的營運策略。

Bootstrap 期:利用 Tumblr + Facebook

在過去,作內容網站要直接養一批內容觀眾是困難的。創業者必須先架起一個內容網站(也許是 Wordpress 或者是 Customized CMS),探尋適合的 Hosting Plan,接下來每日寫文,做好 SEO…etc.

於是一開始會糾纏於到底要選用那種 Share Hosting 比較便宜(Blehoust? Dreamhost?)…

2009 與 2012 年,創業狀況很不一樣的地方在於,現在我們有了 Tumblr、成熟的 Facebook 行銷工具、完整的 Amazon Web Services 以及地區配套。

現今,一般的內容網站最主要的流量來源龍頭,不再是 Search Engine,而是 Facebook。一個網站若做好 facebook-optimized,成效往往會比投注在 SEO 上更加的驚人。

所以,熟悉網路議題操作者。會改用以下手法:先用 Tumblr (簡單的 CMS) + Facebook 專頁,進行議題操作養出粉絲。確定這一塊主題有一定的市場,才決定是否拓展成「訂製網站」規模。

知名網站「iCook」一開始其實就是用粉絲團的方式先去操作,買出 Application 製作的時間,即使身處在製作期也不至於造成沒有網站就沒有觀眾。而是一開始就把觀眾養在 Facebook,把人養出來之後等到網站上線後再一口氣倒過去。避免掉內容網站一開始上線沒觀眾沒內容,還需要很多時間經營的尷尬。

使用 Tumblr 的原因:Scaling

要養內容的方式有很多種,不一定需要自己弄一個 Wordpress + Shared Hosting。不過這當中最關鍵的點在於,其實一般人付不起需要自己 Host 內容網站的成本。

我並沒有誇飾。

經營不錯的內容網站,一個網站 daily 30000 PV 並不誇張,Wordpress 本身的好處是有很多第三方 plugin,帶來網站修改的靈活性。但壞處也是這些第三方 plugin 本身的效能低落。可以將這些 plugin 比喻成類固醇,短期績效很棒,但長期副作用也很強大。

若網站經營者本身不具備 Performance Tuning 能力,大概到 daily 10000 PV 規模開始,就會開始力不從心。每到當日的尖峰時段(10:00, 15:00, 22:00 ),就會倒站。

重灌狂人 這樣等級的 Blog,都要租到不錯的 Dedicated Hosting 機器才擋得住。一個月要花上一兩百塊美金跑不掉…

Tumblr / Wordpress.com 這種 vendor CMS,雖然修改彈性是比較小一點點,但是背後的 scaling 能力卻是完全不用擔心。就算養到數十萬 PV /daily …也不用擔心倒站。

Shared Hosting

Shared Hosting 在幾年前比較流行,主要是因為大多數的 Open source Application 還是以 PHP 為主。上傳了就能開始使用。俗稱的「空間」大部分是指這樣的方案。

Shared Hosting 大概的價錢都在 $10/month 以下。比較好的 Solution 像是 Media Temple 大概會在 $20/month 以上。

不過 Shared Hosting 就如同字面上的意思,是跟人 Shared 的。Hosting 廠商,將一台機器切成幾十份資源,租給大家。如果你有爛鄰居(spam site)或者是胖鄰居(heavy site),很容易被連帶牽連倒站。

說人胖鄰居其實也不公平,7000/daily 的 content site 基本上就會超過 Shared Hosting 廠商提供的 CPU limit 了(超過也是倒站)。

VPS

VPS 也是這三年來變得比較成熟的 solution,主要是因為虛擬機技術的成熟 (ex. Xen) 和 PHP 以外的 Language Framework 變得很熱門(Ruby on Rails / Python …etc)

會佈署上 VPS 的 Application 共通特徵是,佈署時通常需要自訂客製整塊 stack。也就是開發者自己要搞定 MySQL、HTTP Server、Mail Server 、 Memcached Server 等等。

雖然是小網站,但這些 Server 疊一疊加一加至少也要吃掉 512 MB 的常駐記憶體空間。

VPS 市場在這幾年也有比較大勢底定的走向。一般來說,如果你要人推薦哪一家廠商比較優質?幾乎大多數的人都會推薦 Linode

Linode 的起步價是 $19.95 USD/month (512 MB)。

除了便宜之外,Linode 的優勢在於最近這一兩年來在東京佈了點。從台灣連過去 Ping 值大概可以壓在 80ms 以下。(美國就算點再好至少要 130ms 起跳,這樣的 ping 值會讓使用者「有感」)

所以在台灣,Linode 會算是一個可以考慮的 Option。

Cloud Hosting (單指 PaaS )

雖然這樣講有點傷害到人。但是這個市場自從 GAE 改變收費模式而 Heroku 開始支援除了 Ruby 以外的其他語言之後。這個市場就變成了....Cloud Hosting = 「Heroku 與其他」。

Heroku 的模式是開發者必須按照 Heroku 規定的架構設計程式,然後把網站上傳即可。而 Heroku 本身也會提供一些基礎措施方便讓開發者銜接而不需要自幹(ex. memchaced, mail, MySQL, DNS, backup…etc.)

缺點當然就是架構在某方面被限制住了,設計修改起來不是那麼靈活。但好處是 Scaling 的問題 Heroku 可以幫你解決。資源不夠用,信用卡只要開下去就可以撐著了。

當然會有一些開發者覺得 Heroku 的收費很貴,覺得不值得。但是在真實的運營狀況中,Scaling 從來不是一個很簡單的課題。一台機器的架構當然很簡單,但是兩台、三台、十台、百台,那就幾乎不是一般純開發者能夠 handle 的狀況。

有一些開發者,如 Facebook Application / iOS 開發者,他們往往只懂設計「遊戲」和專注本業而已,而不是那麼熟 Scaling。於是他們通常會採取這樣的模式:付錢 Scale,讓事業長上去,繼續賺錢。買到時間空間之後再補人改架構。

不過 Heroku 也不是沒有致命缺點,Heroku 幾年來都只有美東的點而已,美東以外的點,從來沒有明確的時間表和承諾。我估計以後也不可能會有....(大工程)

Dedicated Hosting

Dedicated Hosting 就是租整台機器給你用,然後贈送一定 quota 的流量(大概是給個幾 T 的 free 流量,超過另算)。@gslin 在他以前的文章裡面有推薦幾家外國品質比較穩定的廠商:

當然,國內當然是…沒有推薦的廠商 XDD

Dedicated Hosting 的優點當然是整台機器資源是你的,而且換算成「單位成本」C/P 值最高。但缺點通常也是你要自己「管」。包括備份、Monitoring 什麼都要自己來。需要的底子相對功力要跟很多(VPS 多半還提供個簡單的 gui console 可以幫開發者弄備份、監視系統狀態…etc)

台灣的人會跑去租美國的 Dedicated Hosting 多半是拿來作需要高輸出流量但品質不需要那麼好(高 ping 值)的 Service ....如影音之類的 streaming server 。

因為美國頻寬非常便宜,大概是 400TWD - 900 TWD / Mbps 上下(看你的量,遠低於這個數字到非常誇張的地步的都有...)。而「反應」比較慢的這件事在「影音服務」上面相對是可以被接受的。

AWS : EC2

自從 AWS 在亞洲地區佈點之後(新加坡、東京)之後,在台灣幾乎就直接吃掉 VPS 等級這一塊的市場。原因當然就是 C/P 值真的還算夠,價格也能讓人接受。

而在地點的選擇部分, 台灣 <-> 東京 比 台灣 <-> 新加坡 來的有優勢許多(routing 和 bandwidth)。

所以很多人創業租機器的首選,就是租東京的 EC2 了。

但別以為 AWS 真的其實很便宜,它只是對一般入門者門檻很低而已(不需要保證 commit 量,「牌價」比較令人有辦法親近)。真要比較起來,東京 AWS 的流量其實比台灣 IDC 的價格還要「貴」。

@deduce 這篇 iCook 圖片費用的討論

提到在 S3+ Cloudfront 上 250GB 的流量只要花費台幣 1500。不知道在台灣要花多少錢?

事實上若把 iCook 放在台灣的機房,光計流量的花費是可以低於 1500/month 的。

==== FB 分隔線 ====

250G 如果算 30 天,平均 1 天 8.3G 左右。一天流 8.3G 出去大概就是 0.83M 的線左右。所以只要租一條 1M 的線就夠擋了。如果你向 IDC (中華 / TFN ) 租一條 1M 的線,拿到的牌價可能會是 2000+ / m 左右。但是如果是一次租到 10M+ 的線,或者是去跟二房東租,絕對可以拿到 1500/m 以下的價格(900-1500 不等)

所以不可能是 40k 或 50k 這個價錢。最多只會花到原先所說的 1.5k 以下的價格。而事實上 amazon 的頻寬還比台灣純租 IDC 的價格貴,也不算什麼便宜的 CDN。只能算是刷卡就有,而且不用保證 commit 的水管....。若真要省錢的話通常會去跟國外專業的 CDN 廠商談 地區性 / global CDN,不過這都是量大之後的事了....

==== FB 分隔線 ====

當然事實上也不能這樣比。因為這個價格不是 colocated,而是 CDN 的價格(雖然 AWS 價格兩者是一樣)。但說實話,CDN 比 Cloudfront 便宜而且品質高的選項不是沒有,純優質流量(Hinet/TFN)其實也比 EC2 便宜。這都不是錯覺。

只是你可能都要有一點 connection 或必須要有保證 commit 的使用量才拿得到。

對沒有「背景」的 Startup,EC2 才相對變成了「好」選擇…

IDC : colocation

以上講的都是廠商提供機器與流量,創業者不需要自己出任何設備的狀況。但事實上還有另外一種情形,就是你自己有機器,直接放在 IDC 裡面。

現在什麼年代了,大家都雲來雲去,為什麼還要自己買機器放在 IDC 裡面?

「軟體」「雲」其實不是萬能。

有一些特殊的服務和需求,不買硬體 Solution 丟在 IDC 裡面,用軟體自己幹反而會很昂貴。比如說 F5NetAppBluecoat,這些東西自己幹就會很貴。所以才會有自己買設備放在機房的需求。

再來是 EC2 始終是虛擬機,而且有一些 Web services 因為業務型態,需要訂製的 Server 才能達到需求。

比如說 37 signals 的這兩篇文章

又或者是你的客戶有很強的地域性需求,比如說用戶都在台灣或者是用戶都在中國。才適合 colocation。

而租 IDC 作 colocation 並不只是頻寬支出。你要先買機器、然後租機櫃(一個櫃 幾千元/月),然後才是談頻寬(2000+/Mbps)。

所以一般 startup 並不建議從這個方向直接開始。因為起步成本實在太高,而且手上沒有一定的 commit 量幾乎價格砍不下來

HiCloud

我個人對 HiCloud 並沒有什麼喜歡和討厭。因為 HiCloud 實際在我的生意模型裡面從來不是個選項。HiCloud 的模型比較像是 Hinet 提供你一個可以用「低於牌價」的機會租到優質頻寬+一小台機器資源的選項。

這是一般 Startup 在沒有向固網業者有議價能力時的其中一個選擇。

你會注意到我在這篇文章中,提到了「優質頻寬」這個字不只一次。很多沒有實際網站運營經驗者,寫文章的攻擊重點往往是擺在價格。而忽略了更重要的一個重點「頻寬品質」。

什麼樣的價格,什麼樣的品質,做什麼樣的服務

如果你平常有觀察國內一些大網站使用的頻寬。你會發現他們幾乎只會租這三家(Hinet , TFN, Seednet)的頻寬,其他的不太考慮。這是因為這三家業者互連或對國外的水管真的就很粗。網站開起來也非常的快。

當然這個現象不是絕對,但是 Web Front Server幾乎都會在這三家的點上面。至於周邊 Service 就不一定了,比如說圖片、相片就會丟在 CDN 上(省去圖床 Server 的 tunning),影片就會丟在外國機器、三流頻寬、次等 CDN 上。

都是處於架構以及 C/P 值的需求。影片可以接受比較高的 latency 所以就會這樣作,節省開銷。

網站開啟的「速度」,攸關著一個網站的 User Experience 和 Conversion Rate
。(註)

====

ref : 亞馬遜執行長貝佐斯 「性價比」最高的CEO

例如,貝佐斯不斷改善亞馬遜網站頁面下載速度,因為分析顧客使用網站習慣後,他們發現,網頁下載速度只要慢○.一秒,顧客在網站的使用時間就會減少一%。

====

「速度」影響的指標也還不僅只這些,SEO 以及 Alexa 的 ranking 甚至也有大幅相關。

所以,也不是說誰誰誰便宜,就應該喊誰誰誰應該降價太誇張。

難道 40 盎司巨無霸牛排只要 900 元,高級鐵板燒店裡面賣的「和牛」就應該比照辦理嗎?

Summary

當然,寫這篇文章的初衷只是把一些過去作網站測過和用過的 solution 寫出來。不同型態的服務,和團隊的人力配置,適用不同的架構和方案。

AWS 對一般 Startup 是友善,也是 pay as you go,只是千萬不要誤以為這是萬靈丹。

只是看到一些張飛打岳飛的討論有感 …

BTW,如果你有興趣談更多這方面的話題的話,歡迎 寫信聯絡 我。

如果你想研究更多美國的 hosting plan,可以上webhostingtalk.com 這個網站,這裡有很多討論。

 
about 5 years ago

借用 新創網站這樣開發才夠快 這篇格式,希望不要介意。我主要是想闡述以前在 T客邦 的經驗方法。

T客邦在一年半裡面,就從台灣 Alexa 400 名以外,衝進台灣 Alexa 100 名內。這一年半時間技術團隊開發出了四個大網站,十數個子網站,和背後一群深厚的基礎建設(HA, backup, PV stat, advertising system...etc.)。T17 實際開發的工時在 2.5 個月以內。

我是一個軟體工程師,過去六年我都在開發網站。在新創公司裡,速度節省時間、時間就是金錢、金錢就可以再去請更多工程師讓整個開發速度更快。學校並沒有教很多「軟體工程」的方法,或是怎樣才算是一個好的Programmer。這些東西在台灣業界其實不存在的,大家都是邊做邊摸,從經驗中學習。我從書籍上和網路上學了很多能讓團隊更有效率的做事方法,因為我相信我在新創團隊裡我必須先這樣,用業界公認覺得快,且快得有道理的方式。底下是幾點可以和大家分享的。

1. 讓全團隊都用一個成熟的開發框架和環境:

我的專長是 Ruby on Rails。我並沒有偏好推薦別人如果現在是用 PHP 或 .NET 或 JAVA,就要不計成本的導入新框架。就像我其實也沒有很喜歡硬導入 Scala 或 Node.js 一樣。它們可以在它們派得上用途的地方加分,但是絕對不能是主體。道理很簡單,我不認為他們成熟到夠讓所有成員快速上手,不重造輪子。

一般團隊喜歡用 PHP。因為 PHP 工程師好找,Rails 工程師不好找。但在我一路走下來的經驗,我認為這是一個「假命題」。因為在人力市場和公司實際運作的狀況裡面,你會發現這個命題不怎麼牢靠。沒錯,你是找的到 PHP 工程師,但很抱歉,很多人寫的 code 是不能用(更精確的說是 write only ) 的居多。(我沒有冒犯 PHP 開發者的意思)

原因是 PHP 開發並沒有太多一致性的規範,基本上就是愛怎麼寫就怎麼寫。這導致了即使你團隊裡面就算裡面有一個很厲害的開發者,也是沒有多大的用處。因為大家 coding style 不一樣,甚至連網站結構也不一樣。補人幾乎是沒有辦法發揮到加成作用,大家只能各寫各的,就算爆炸了也幾乎只有當初的作者可以修。

這在我眼中是極度浪費團隊戰力的元兇。

Rails 沒有這樣的狀況嗎?這是我覺得 Rails 優勢的地方,它是一個非常熱門的 Framework(只有在台灣你可能沒有感覺到他很熱門)。因為這是一套 Framework,也就是它本身有很強的約束性,至少 MVC 和 routing 規則,一般就算新手也不會亂放的太離譜。寫 code 有一定的潛規則存在。

開發中遇到任何東西發生錯誤了以後,開發者幾乎可以用 Google 找到任何可能發生的原因,修復完畢。而這幾乎不是一般自建 Framework 可以比的上的地方,如果你在公司自建一套 Framework,基本上發生任何問題,最後幾乎都得去煩當初設計的 Architect 才行。(這也是很浪費錢的地方,因為 Architect 的薪水都很貴)。

學習曲線過高,我也不覺得這件事真的存在。Rails 高手是難尋沒有錯,但是 Rails 中低手只要訓練得當,生產力也是非常驚人。因此只要把重心放在如何協助一般想入門者,可以快速克服入門幾大門檻(搞定開發環境,RESTful,Plugin,Debug,Deploy),剩下的部分就可以靠網路教材和實戰訓練出來。這也是我發明Rails 101 的原因。

我設計這一套教材的目的是要讓所有新進的開發者,在最長兩週時間內要學完基本 Linux 指令、Git、Rails 所有基礎的知識、佈署、SCSS 撰寫等等,一個月之內就能上戰場跟我們一起開發功能開發新網站。這樣的進度很誇張嗎?
不,不誇張。這裡的每一個開發者都有這樣的程度,他們有些人應徵時是連 Rails 都不會寫的。你能相信連 T 客邦的 PM 和 ART 他們也會寫 Rails 嗎?( no kidding)

寫 Code 規則怎麼規範?同事和我從社群中吸收了很多 Best Practices,我們把這些東西整理出來變成新手指南、最佳實踐,甚至是包裝成 Gem 和 Generator,越後進的開發者能花越少的時間追上前輩,在短時間他們的作品也能跟前輩一樣預先搭載 Best Practices。我最近也開始在撰寫另外一本書 Essential Rails Pattern for Beginners

Rails 本身還有豐富的 Ecosystem,和預設的架構最佳實踐就更不用說了。

新創團隊資源很少,人事預算沒有這麼夠,反而要巧妙的運用天然資源並讓團體戰力*3才行。

2. 功能設計給當下使用,考慮一定程度的擴充性:

我也不相信在新創團隊有人可以預知未來,即使很多東西看起來未來往那個方向擴充很合理。對我來說,我在設計功能時並不會 overthinking,甚至我也禁止同事 overthinking。因為專案中最高的原則是 get things done,not over design。

但這不代表不需要在設計上不需要留一定程度的擴充性,在內部的工作流程通常最後一道是有 refactor 整理空間的。在這時候同事會把雜亂的 code,整理回當初規範中必須寫的樣子。如果這是常見功能,一再出現,就必須整理成 Library,或架構 Pattern。一但是 Pattern,擴充性就留出來了。

在之後新的專案中,就可以拿上一個案子打下來的基礎一再重複利用再利用。甚至最後竟然還有 Event Generator 這種東西...(Authenication , Rails Admin, SEO, ...etc.)。

3. 程式本身即註解

一般軟體實踐上本身也不贊成寫註解。而是鼓勵程式本身即要可以表達自己的行為。如果寫的程式亂七八糟讓人看不懂,進 review 時是會被回退的。我們團隊能夠被接受的程式是可以寫得很笨拙,但每個同事都看得懂。因為笨拙但能理解,其他前輩有時間可以去 refactor。但亂寫,之後就沒人動得了了。

4. 盡力寫下所有的 documentation

世界上沒有人能夠寫出一份完整的系統架構書可以詳盡的描述現在系統上真實的狀況。但是一個好的 issue tracking system 和寫的 commit log,可以能夠很好的協助你了解為什麼現在系統會是這樣設計的,為什麼當時會做出這樣的決策,導致程式必須要這樣設計。

在新人訓練期時,我通常會訓練新人要有將任何實作上遇到任何的 detail 和狀況詳細 document 在票上的習慣。而在完成整個專案時或者是技術架構稍具規模雛形時,要把這些 ticket 上的筆記梳理紀錄下來。

這樣會對整個團隊程度的躍升會有非常強大的正面效益。同時在人員流動(新進或離職時,衝擊會非常非常的小。

因為至少很多的 "basic" 的教育成本,在這部分會幾近於 0。一路都在 startup 的歷練,讓我很早就理解到一件事,人員流動幾乎是無可避免的,所以重要的是要怎樣讓人員流動造成的衝擊更小。

在新創事業讓同事投資一項新技術,也是很昂貴的。所以要學的話,大家一定也都全都要會,否則就會一直很貴。

這是 documentation 可以帶來的價值。

5. 要有測試環境和 policy

從昂貴的教訓裡面我學到的就是一定要有測試環境和 policy。在 Rails 中將環境切分成好幾份,並沒有超困難。而且一定要有測試環境(staging),是因為每個人開發的環境不一樣,在當下 focus 在自己電腦前,很多設計並不會考慮那麼多。丟上 remote server 你才會知道炸掉一大片,或者是 performance 極度不好。這都是會傷害商業 credit 或者搞砸交易的(比如說你跟客戶談好明天 on 檔一支幾十萬的廣告,但明天因為人為疏失倒站一天,請問你要去挪誰的 queue 給他,一天到晚發生這樣的事。誰要跟你做生意?)。

至於 policy 就更重要了。

很多加班的狀況其實都是不必要發生的。比如說在頭腦不清醒的時候寫了爛 code commit 上去。導致自己清醒時要去清理這攤爛泥。在吃飯前或下班前 deploy 了最新版的 code,結果中午倒站數小時;原本可以準時下班,十點都走不了。

但寫了好東西不直接 commit master 和不馬上 deploy,會讓 RD 非常癢。這種病連我都不能倖免。

但是商業網站是不能一天到晚失火的,團隊還是有人要去捍衛這種大局。所以最後也只好執行了這樣的規範:

  1. 寫功能一律上 feature branch
  2. 上線前必須使用 staging server, apply feature branch 測過一輪
  3. 絕對不在中午 11 點 - 12:00 deploy,絕對不在 17:00 後 deploy。
  4. deploy 流程必須使用工具自動化,出事要能 rollback。

執行了這樣的 rule 之後,幾乎就沒有人需要餓著肚子修 bug,半夜因為軟體的問題跳起來加班修理了。

因為我深信:長期處在失火/救火的環境下,會快速減低一個團隊的戰力。

熱血的投入通常會讓人有假象,我投入的工時越高,成果會越好。事實上這是一個徹底的偽命題。而創業初期的不穩定,忙碌,失火,更讓你會有只要我努力加班,一切就改善的錯覺。腎上腺素最多只能讓你撐三個月,接下來一切都會破滅的。作一個網站要到可以出場,大家比得是命長,而不是 Startup weekend 冠軍。

6. PM 的話聽聽當參考就好,但要好好溝通

在很多情形下,PM 也許規劃出來的方案 A,需要 10小時。但你知道可以把它改變成方案 B,只需要 3 小時。但前提是,你要好好的去追問出來,為什麼他會做出 A 設計案這樣。不可否認台灣具備專業素養的 PM 極度稀少,能遇到一個就是燒香了。所以很大的程度遇到的可能是一個只會照抄其他網站畫架構圖的人,或者是負責賣廣告的Sales 自己兼,但這都不要緊。要緊的是你要問出為何這樣設計,因為他的外行程度可能會讓他估出一個讓公司嚴重虧本的實作案,你卻沒阻止他。或者是這個案子架構是合理的公司方向,但你卻誤解背後的設計原理擅自修改而失效:

一個設計方案會這樣設計的背後原因有很多個,有可能是:

  1. PM 路上隨便抄
  2. PM 自己喜歡這麼作
  3. ART 要求
  4. 客戶要求
  5. 這是 key feature, 一定得這樣作, 否則失去此系統意義

所以不能是自己喜歡 B 就 B。開發一個系統一定有「成本」、「預計收益」,而實作的方案必須要去找出這兩者的平衡點。這就是靠溝通溝通溝通...

7. 要寫出一定程度的程式碼

要使用 HTML / CSS 架構設計網頁,不要濫用 ORM,不要重造輪子,不要寫出會被人公幹的 code ,這些都是基本的開發常識。很多新創網站寫出第一版很快,但之後就陷入開發泥淖,無法配合業務模型快速調整,幾乎 90% 的原因以上都是因為第一版 code 爛到當初的開發者自己也改不太動,結果光是後續調整架構作小改版就耗掉超多時間,變成超大致命傷。

8. 要追求一定以上的網頁效能,tune 在刀口上

不追求效能實在是一句非常不可思議的話。

不可否認有些開發者效能和 Fancy 技術實在追求過頭,比如說甚至一開始就用 Backbone 寫整個網站,或者是從頭到尾使用 Node.js 寫網站。這都是一開始就打算寫 mobile 版 web service 給 mobile phone 使用才需要做的事。因為 3G 的 Latency 實在太大,要盡力的壓縮頻寬使用量和追求頁面 response time。

但實作一個 Desktop 版網站完全沒必要。而在 website performance tuning 的時候,優先調整的也是 Frontend Performance,因為 C/P 值高很多,壓縮一下 CSS 也許就可以省 3 秒。db 或程式語言 tune 的要死可能才省 0.1 秒。

而網站的指標和 User Experinece 並不是說打的開就好。比如說網站開的速度會直接影響 Search Engine 和 Alexa 排名,不知道這到底有多少人曉得?還有一般使用者對於 Blog / Album 和 Video 各自能夠忍受的 response time 根本是不同的,Video 大家可以忍個 5 秒
還沒打開都能接受,但是相簿和網誌開一頁要 5 秒這大概就沒人要用了吧...

效能調校這件事,過與不及都是不好的事。

9. 少用 Fancy 的東西,實作前先估算成本與效益

身為開發者,世界上每天會冒出很多新的好東西,這些不去玩玩看手實在會手癢。但是其實每引入一項都會有一定的成本存在,而且效益/成本比不見得是你當初想的那樣。

比如說一直追 Rails 新版,換上效能很好的 Ruby 1.9.2,改用 SCSS 去寫 CSS,改用 CoffeeScript 寫 JavaScript。Apply 新發明的 Asset Pipeline 架構。這些都是很新很棒的東西。(T 客邦都有,架構從最早的 2.3.2 一直 upgrade 到 3.1.3,內行人才知道這樣工程有多大)

但跟其他事物的道理其實是一樣的,新的東西就有新風險。而且通常引入這些東西,不是自己一個人爽就好,是大家都要用的東西。

所以通常我是這樣做的:先 branch 一個版本,我自己或是請資深 RD 自己下去把整個實作方法都做出來或者是進行評估,確定可行後整理成可行的 SOP。才大符推行。

如果是新想法,則是在一個 event 或是小版面先行製作嘗試效果。

好的東西是不錯。但不要孤注一擲。

======

綜合以上,我想說的是:在開發初期,任何一點戰力都是相當寶貴的,所以沒有什麼理由把程式碼亂扔,不實行一定的規則而導致到處都失火。永遠都在作重複的白工。

任何舉措,最好都要是能以盡量把成本壓到差不多低,但效益都非常高。

以上我上面所說的這些東西都不是我的創舉,事實上幾乎所有 Rapid Development, Agile Development, 還有很多 Engineering Blog 常常都在聊這樣的話題。

我發現很多工程師朋友常常有自幹且認為自己的東西最好的傾向。認為外界的方法「絕對」不適用在自己的團隊上,美國的常態並不適合在台灣使用。但事實上這世界真的非常大,說實在真的沒什麼理由把自己的成長速度綁在自己的眼界裡面,很多的 principle 在不同產業不同國家都是適用的。多看看別人怎麼作,你會驚訝這些方法的引入,對自己事業加成的幅度是多麼驚人的。


P.S. 貢獻一個不是八卦的八卦:T 客邦從來就不是一間網路公司,這是一支傳統出版社裡面的數位團隊。技術團隊大概永遠只有五個人: 1 Leader, 1 PM, 3RD, 1 ART。兩年以來幾乎都是這樣的狀況…

 
over 5 years ago

我在 網站程式上線前需要準備的事 (四) 提到了為了順利進行專案,一個好的專案管理系統絕對是必備的。

專案管理系統背後運作的邏輯何在,就是這篇文章主要的重點。

What is issue tracking (project management) system ?

Issue Tracking system ,顧名思義就是紀錄追蹤 問題的系統。BugZillaTracRedmineJIRAlighthoustappBasecamp ...等等這幾套軟體,都是知名的 Issue Tracking system。

一套合格的 Issue Tracking system 的 Issue 至少要可以紀錄這些內容:

  • Issue 的主題
  • Issue 的內容
  • Issue 現在的狀態 (新建立、已指派、已解決、已回應、已結束、已擱置…etc)
  • Issue 優先權 (正常、重要、緊急、輕微、會擋路…etc.)
  • Issue 發生日期
  • Issue 希望解決日期
  • Issue 實際解決日期
  • Issue 被分派給誰
  • Issue 的附件
  • Isuue 的觀察者有誰

Project Management Tool

其中 RedmineJIRABasecamp 並不僅止是 Issue Tracking System,更精確的來說,它們應該被稱為「專案管理工具」。

它們多半能夠提供以下作用:

  • 一個地方可以透明的列出所有需要被執行的項目 (Issue List)
  • 一個地方可以列出階段內需要被執行的項目 ( Issue Milestone )
  • 一個可以記載 內容,狀態、優先權、日期、分派者、觀察者,且具有「permalink」、「權限控管」,且讓大家可以討論執行項目細節的地方。(Issue Ticket)
  • 可以 cross reference 或具有子票功能
  • 一個地方可以整理統合專案現在所有的相關資訊。( Wiki 功能)
  • 一個地方可以看到自己今天需要 Focus 進行哪些項目(Issue Personal Dashboard)
  • 一個地方能讓 Manager 可以看到自己的 Member 正在進行哪些項目,這些項目目前的狀態是什麼。(Issue Query)

背後運作的原理

網站程式上線前需要準備的事 (四) 這篇文章刊出後,得到不少的迴響。其中我看到的絕大多數的回應多是多半抱怨 PM 根本不稱職不盡責,只顧著畫規格,然後只按照自己寫出來的無法執行ㄉ的天才(?)規格的催進度。所謂的 M 不是 Management,而是 Magic。即使成員賣了命的加班,專案還是得不到好的結果:超時,品質粗糙,成本
過高,scope 過大無法完成。

在我進行開發軟體專案時,也發現所謂的其實絕對多數的 PM,其實職稱與進行的事務完全不合。它們的工作內容往往只有 Project Planning,應該被稱作是 Planner,而不是 Project Manager。

一個軟體開發專案,最重要的變數有四:成本、品質、時間和規模。真正的 Project Management,是能夠準確 Manage 這四項變因,在可以接受的與變動差異下,完成整個專案,產出預期的成果。

我認為 Project management tool 可以協助做到專案中以下幾項的管理:

規模管理

專案會無限膨脹,主要多半是因為規模的掌控不佳。而規模掌控不佳,時間和成本就會隨之膨脹。

規模之所以膨脹,有幾個原因:

  • 沒有人知道,到底「總共」有多少事情需要完成。
  • 離目前的時間表,「還有」多少事情需要完成,還有多少時間可以用。這些事情裡面有沒有可以被「調整縮減」的餘地。


所以,專案需要一個工具能提供以下功能:

  • 一個地方可以透明的列出所有需要被執行的項目 (Issue List)
  • 一個地方可以列出階段內需要被執行的項目 ( Issue Milestone )
  • 一個可以記載 內容,狀態、分派者、執行者,且讓大家可以討論執行項目細節的地方。(Issue Ticket)

時間管理

一個專案中,最寶貴的資源是「時間」。什麼東西都可以用「錢」買到,唯獨時間不能。
在專案中時間最容易被浪費的地方在:

  • 使用信件往來,交涉的互相等待時間。
  • 沒有被壓定「完成日期」,「詳細需求品質」的工作細項。(陷入不必要的完美,或者是悠哉的怠惰)
  • 不符合期待,修改的來回時間。(沒有達到良好溝通,導致方向錯誤)
  • 類似的事情,重複消耗資源。(沒有 SOP,每次都要花費一定以上的資源去解決)


所以,專案需要一個工具能提供以下功能:

  • 一個可以記載 內容,狀態、優先權、預計完成日期、分派者、執行者,且讓大家可以討論執行項目細節的地方。(Issue Ticket)
    • 可以平行討論,而不是信件順序往來
    • 明確的完成時間
  • 一個地方可以整理統合專案現在所有的相關資訊。( Wiki 功能)
    • 提供專案相關的資訊以及 SOP


同時,專案最好能夠搭配舉行每日的 Standup Meeting,確保每個人正在進行的方向是正確的,以及確保專案資源沒有被浪費的跡象。

團隊工作管理

一個專案,成員至少會有兩人以上。兩個人以上,就會有溝通與工作協調安排的問題。專案的工作項目往往是有 related 的,少有獨支。
比如說 Planner 沒有把規格寫完,RD 和 Art 就不太容易先動工。沒有把 Database schema 規劃好,後續就很難繼續開發程式。

這也是專案當中最傷資源的狀況:優先權等級為:「block」票。因為 A 方沒有交付,導致 B 方不能交付,連帶導致 C 不能開始。

而專案當中也有很多工作項目分別是「對最終專案目標很重要,但當下不重要」、「對當下 milestone 很重要,對最終目標沒那麼重要」,「只對合作同事很重要」...etc

如果工作項目不能夠按照當下狀況調整正確的優先等級分派給團隊成員。就很容易會造成所有的人雖然很努力,整體工作效益卻非常低的情形。

當然,不只是 Project Manager 需要知道全部的人今天要做什麼。而被分派到項目的成員,也需要能夠知道自己當天所需要執行的項目依序是哪些,按照優先狀況完成。如果優先狀況有錯誤,可以及早告知資源協調者 (Manager) 。


所以,專案需要一個工具能提供以下功能:

  • 一個地方可以列出階段內需要被執行的項目 ( Issue Milestone )
  • 一個可以記載 內容,狀態、優先權、日期、分派者、觀察者,且讓大家可以討論執行項目細節的地方。(Issue Ticket)
  • 可以 cross reference 或具有子票功能
  • 一個地方可以看到自己今天需要 Focus 進行哪些項目(Issue Personal Dashboard)
  • 一個地方能讓 Manager 可以看到自己的 Member 正在進行哪些項目,這些項目目前的狀態是什麼。(Issue Query)

資源調配管理

Project Management,並不是在專案的一開始設下「完成時間」,切出所有「工作項目」,列出「完成目標」這麼簡單。隨著專案的進行,開始會有很多變因出現,造成資源不足,需求改變,規模追加,人力減少...等等的挑戰障礙出現。

都在考驗著專案經理對於資源調配的管理能力。能不能在預定的時間、預定的預算、預定的人力資源內,如期完成當初設立的目標以及交付達到品質要求的產品。

如果條件不允許,當下必須作出取捨、做出決定,而非死板的捍衛規則與命令。


所以,專案需要一個工具能提供以下功能:

  • 一個地方可以列出階段內需要被執行的項目,並可以移動改變階段項目。 ( Issue Milestone )
  • 一個可以記載 內容,狀態、優先權、日期、分派者、觀察者,且讓大家可以討論執行項目細節的地方。(Issue Ticket)

Agile Method

若讀者對於專案管理有興趣的話,研究過一些「敏捷開發」的 method,不管是 XP、Scrum、Kanban...,你會發現到這些工作方法都在傳達幾件類似的事:

  • 專案必須透明,進行局勢一目了然
  • 專案要能拆分成可執行的階段
  • 溝通、溝通再溝通
  • 不斷的消除浪費
  • 不斷的 deliver

而一個好的 Project Management Tool 能夠輔助專案具備以上的特徵。

小結

還是老話一句:真正的 Project Management,是要能夠準確管理,成本、品質、時間和規模這四項變因,在可以接受的與變動差異下,完成整個專案,產出預期的成果。

「Project Manager」必須要做到的事,也就是要在動態的環境下,利用種種手段盡力讓這件事發生。

所謂的「Project Management」其實可以用很科學的手段達成,因為事實上這本身就是一門科學。

一般所謂的 PM 很常誤以為 Project Management 就是用 mail+excel、口頭分配任務,得到專案成員的口頭回覆,接著只要坐著回去發呆或無時無刻的跑到座位上催專案成員作事,整件事情就會發生。
如果你真的一直這樣想,我想可能最後程式設計師可能做的事:就是直接用 shell script 換掉你。

no kidding。

Thinkgeek : Go away or I will replace you with a very small shell script

Go away or I will replace you with a very small shell script

推薦書單

====

廣告:Essential Rails Pattern 開始 update 了

Essntial Rails Pattern 這本書已經進入排版階段。
詳情請看這篇文章

 
over 5 years ago

Essntial Rails Pattern 這本書已經進入排版階段。

各位已經購買的讀者,近期信箱應該會開始一直收到本書的 update。

感謝你們一直以來的耐心等候。

這本書絕對不會讓你們失望。

===

樣章
線上預覽

目錄

線上預覽

如果有任何書籍內容錯誤,和 Billing 上的問題,請透過聯絡表單 通知我,協助我改善產品。

如果你有任何學習 Rails 上的問題,請不要害羞,直接上 Ruby Taiwan Group 詢問。

 
over 5 years ago

第 5 件事:Close Alpha Test、Close Open Test

終於談到跟這個系列標題比較吻合的內容了!最後一個月上線前該做些什麼事?

在 本系列(一) ,我提到了無論如何最後一個月是測試期。這一個月又分成

  • close alpha
  • close beta

Close Alpha 內測 (一週)

close alpha 的對象是開發組以及營運組人員。也就是與核心較為相關的組別。此時針對的測試目標是這個 project 業務上應該被「實作」的 functionalty。比如說是食譜網站,就應該可以

  • 上傳食物照片
  • 新增烹飪步驟
  • 站方精選
  • 有熱門食譜、新進食譜
  • 分享到社群網路 ...etc

如果是討論區,要應該可以

  • 可以發表文章
  • 可以回應文章
  • 可以貼圖
  • 可以收藏
  • 可以搜尋
  • 編輯器運作正常 ...etc.

另外測試時要擬定使用「未登入會員」、「登入會員」、「營運權限」、「Admin 權限」各測過一次。

因為開發組成員在撰寫功能時,為了方便,幾乎都是以 admin 帳號在開發,如果不制定測試步驟和角色,很容易沒測到死角。

此時的修復重點放在 feature complete ( 或取捨 ) 以及 functionaly 是否正常運作。

** 請不要在此時進行任何 UI 動線調整 **。

Close Beta 半公測 (二週+)

close beta 的對象是全公司所有人,公司員工的親朋好友,可以信賴的死忠會員等等...etc. 此時針對的測試目標是這個 project 的 UI 動線。

如果是討論區:

  • 發表的動線是否順暢
  • 是否 UI 的暗示容易讓使用者 miss 掉上傳照片步驟
  • 回應文章的動線是否流暢
  • 網站新訊息的流動是否不夠快速,容易造成網站看起來一片死城。

此時已經是視同準上線了(所以 Close Alpha 階段的資料會清掉),所有營運組的人必須視同營運狀態一樣運營站務,以避免正式開站遇到狀況時手忙腳亂。

(這一招是從參訪壹電視時學到的。當時壹電視快開台時有受邀去內部參訪,當時聽到他們已經內部試 run 報新聞 run 了一年時,震撼非常...XD)

此時的修復重點放在 UI 動線的調整,以及運營方針、步驟的調整,避免開站之後網站就變成死城。

Performance Tuning 與 Website Optimized (一週)

我在開發階段時,最常向 RD 宣導的事情是:我不想管你這個功能怎麼寫出來,但我要你準時交出來。(但最少要符合內部寫程式規範,有辦法讀懂)

原因是:網站最重要的是 Deliver 上線。而不是站上的 feature 用了多屌的技術,用了多棒的 best practices,沒有用戶會在意這件事。而「貪玩」「遲交」會砸了一切。

直到 Open Beta 期,Optimized 這件事都不會被提到。因為在網站稍微 stable 之前,所有的 optimized 都毫無意義,做了也是白作。因為會發生效能瓶頸的地方,永遠在你設計時意想不到的地方。

Backend Performance Tuning

如何作 Performance Tuning?

  • 抓出最慢的地方 Refactor 掉

幸運的是,我的專案都是 Rails Project,有New Relic 這套軟體可以用。它可以幫你找出你的網站哪一段 Ruby Code 特別沒效率,哪一段 code 製造出來的 SQL query 特別 slow。

其他技巧請看:Rapid development with Rails P.54- P.59

這是其他題目了。有空我會再整理 update 一篇 Rails Performance Tuning 的文章。

  • 找出最常造訪的頁面壓力測試

既然已經進入 Open Beta 期了,這時候手上應該可以拿到這個網站最常造訪和效率最差的頁面。

可以使用 ab 去對網站進行壓力測試。

再決定是要 refactor slow code 或者是先上 cache 檔著先。

Frotend Performance Tuning

影響網站使用者感受最大的其實不是 backend 的效率,而是 Browser side 的效率。上線前我會

其他技巧請看:

  1. Rapid development with Rails P.42- P.53
  2. Scaling Rais Site by default
Website Optimized

以上說的都只是 Performance。但是這跟實際運營沒有那麼大的正關係。我擅長開發的是「內容網站」以及「社群網站」,這一類的網站重點其實是 SEO 以及社群穿透力。

  • SEO 以及 Facebook OpenGraph

比如說:這是在 T 客邦累積出來的兩套 gem。

網站的每一個頁面都會確保分享至社群網站是正常的。

  • Advertising

靠廣告賺錢,所以要調整廣告板位

  • RSS / Email Subscribe / 粉絲團活動經營操作

跟 user 的互動...etc.

開站

這些都確認沒什麼問題了,然後才是開站。然而開站不是這一切的結束,還有其他事情需要作...

====

系列文章:

 
over 5 years ago

第 4 件事:架設一套 issue tracking system

你用什麼工具來管理軟體專案的進度呢?我曾經一度認為使用 issue tracking 管理專案進度,是一件天經地義的事。大家都是這麼做的,所以這個題目沒什麼好談的。
後來,我才發現這個印象大錯特錯...

** 絕大多數的人真的只用「mail」和「cc」來管專案,that's all。(註1) **

P.S. issue 真的太多的話,他們會改用 ...Excel!!

ZOMG...

What is issue tracking system ?

Issue Tracking system ,顧名思義就是紀錄追蹤 問題的系統。BugZillaTracRedmineJIRAlighthoustappBasecamp ...等等這幾套軟體,都是知名的 Issue Tracking system。

一套合格的 Issue Tracking system 的 Issue 至少要可以紀錄這些內容:

  • Issue 的主題
  • Issue 的內容
  • Issue 現在的狀態 (新建立、已指派、已解決、已回應、已結束、已擱置...etc)
  • Issue 優先權 (正常、重要、緊急、輕微、會擋路...etc.)
  • Issue 發生日期
  • Issue 希望解決日期
  • Issue 實際解決日期
  • Issue 被分派給誰
  • Issue 的附件
  • Isuue 的觀察者有誰

為什麼 email 不管用?

常人使用的 email 管理法其實會有幾個很大的缺點:

喪失時間感、無確切完成日期

專案中最珍貴的資源無非是「時間」。僅使用 email 往來,會造成一個嚴重的假象:大家都一直有信件往來,所以整件事其實是有進度的。但其實,專案進行的速度卻是牛步...

後面的原因其實是因為:「回信」是一個「順序」執行動作,當一方回了,下一方才能決定要做什麼、要回什麼。「什麼時候」再回(有空回,做完回?)其實沒有人知道。通常一個來回就要搞掉一個上午,甚至是一個整天。但其實整件事沒什麼進展。

這麼浪費效率,逼得某些 PM 還得自己用 TODO list + email tracking label 才可以勉強控制這種局面。

無確切執行人

有的 email,cc 者一大堆:A 先指派了 B 作這個工作,但 B 做到一半覺得需要 C 的火力支援,於是把 C 加入這個討論串裡面。C 做到一半覺得不妥,請示長官 D 要如何配合這個專案。往往一整個 mail 牽扯了一大堆人進去,大家討論來討論去,好不熱烈。

但是呢...誰需要去執行,哪些事需要被執行,什麼時候這些事需要被執行完畢?在這一整個串裡面完全被模糊掉了。

洩密

cc 者一大堆。怎麼分得清楚誰有權知道、誰無權知道這一串信裡面提到的執行事項?

優先權的分配

一個專案可能同時間有幾十上百條待處理事項需要被執行。請問哪一條需要先被執行?它們的優先權又是用什麼標準決定的呢?

處理事項目前的執行狀態

一個較具規模的專案,可能不只一個人參與(多個 RD 和多個美術)。到底誰正在執行什麼項目,會不會相撞(項目、執行者)?什麼項目其實已經完工了,需要被 archive 起來?資訊有沒有 outdate 問題?

Email + Excel 其實很不夠用...

What you need : Project Management Tool

其實由這一連串的問題整理下來,可以清楚的發現,一個專案需要的是什麼?這也是 Project Management Tool 可以提供給你的東西。

與其說 RedmineJIRABasecamp 是 Issue Tracking System,更精確的來說,它們應該被稱為「專案管理工具」。

要能夠的讓專案項目有計畫且順利的被執行,需要:

  • 一個地方可以透明的列出所有需要被執行的項目 (Issue List)
  • 一個地方可以列出階段內需要被執行的項目 ( Issue Milestone )
  • 一個可以記載 內容,狀態、優先權、日期、分派者、觀察者,且具有「permalink」、「權限控管」,且讓大家可以討論執行項目細節的地方。(Issue Ticket)
  • 可以 cross reference 或具有子票功能
  • 一個地方可以整理統合專案現在所有的相關資訊。( Wiki 功能)
  • 一個地方可以看到自己今天需要 Focus 進行哪些項目(Issue Personal Dashboard)
  • 一個地方能讓 Manager 可以看到自己的 Employee 正在進行哪些項目,這些項目目前的狀態是什麼。(Issue Query)

至於我個人一直以來偏好的系統,就是 Redmine。尤其是近一兩年的版本,Issue Query 的加強和 子票 / 相關票的功能被開發出來, 讓我在專案管理上更加的得心應手(註2)。

簡單歸納

專案往往會搞到失火,或是時間不夠用。問題往往出在整個專案之間的「不透明」。

  • 搞不清楚總共有多少事需要完成
  • 搞不清楚目前這件事的進行狀態
  • 搞不清楚今天要進行哪些事
  • 搞不清楚現在正在做的事,是否跟「目前」的全局有強大的正關聯
  • 搞不清楚哪些事必須在何時就需要「確切」的被完成,否則就會產生重大風險

要讓專案順利上線,一套好的 issue tracking system 是不能少的啊。

  • 註 1: 我一直以為裝個 issue tracking system 是常識。為什麼會寫這種「常識」等級的東西?因為我後來發現這完全不是「常識」,特別對 「PM」 來說不是「常識」(顛覆了我的認知...orz)!之前在某社服務時,就發現他們竟然沒有這種東西,提議要部門內架設還被當作是異類。接著所有高階主管討論了超過一個月才勉強決定要裝 issue tracking。接著又花了兩個月的時間討論要裝哪一套 issue tracking,再花了一個月才把決定好的 issue tracking 架起來。真是嘆為觀止!...實在受不了種種的低效率,最後早早 say bye。

  • 註 2: 切票示範 (已取得授權)

====

系列文章:

 
over 5 years ago

第 3 件事:制定 Art / RD 都遵守的開發 convention

在傳統的開發過程中,作法多半都是:規劃 => UI / 畫面設計 => 程式設計。

其實若專案規劃階段結束的早(也就是實作類似最低可行產品產品的概念),並非需要等待 UI / 畫面設計 完工,才可以進行到「套版」(程式設計)的階段。

一直以來,我都認為「套版」是一個非常不好的說法,造成了偏差的印象。因為一個網站實際上是「一整套」的「軟體」,並非是「畫面」設計的出來,程式就配合寫的出來。雙方必須都要是可以執行實作的部分才行。

程式一定要實際的「美術畫面」被設計出來才能夠被接著實作嗎?其實不是這樣的:只要有 wireframe,RD 往往就可以先行動工。

但問題來了:若雙方各自進行自己的部分,那最後要怎麼組起來?

這其實還不是最大的問題。

最大的問題,其實是 Art 切出來的「版」,多半是不能夠被「套」的。

畫面不是切得出來就能「套」

這個問題其實不能夠怪 Art,它們有的是藝術細胞,並非邏輯細胞。而:

  • 能夠熟練 Photoshop,並 不代表 能夠寫出良好結構的 HTML 與 CSS code。

    • 這需要一定的經驗以及技術實力。
  • 能夠切出 HTML 與 CSS,並 不代表 這一份原始碼,可以被實際使用。

    • 有一些 Art 只懂得 PSD to table,整個畫面毫無結構可言,讓人頭痛萬分。
    • 有一些 Art 專精製作單頁的活動頁面,但 application 需要整套的 DOM 能夠重複利用,CSS 一旦被重疊使用時大爆炸。

在傳統的專案進行到「套版」階段,程式開發進度會難以掌控的其中一個原因。也是因為:RD 面對著一套爛 HTML,完全不知從何下手「套」進去。不改結構無法讓程式運作,或者程式運作效率會很低;但一改結構,就別肖想 Art 再幫你調整細部 style 和追加細節了。(東西被改的不爽情緒或原始結構被改變)

「套版」這個過程中無端被追加浪費了大量時間,這也是一個上線前的隱藏變因。

解決方法:製作一套 HTML / CSS 設計準則

多數的 application 有固定結構的 DOM。差異在於 <div id="content"> </div> 內的不同。
至於

  • header
  • sidebar
  • warning
  • form
  • footer
  • etc...

其實多半是相同的。

與其抱怨 Art 切出來的東西不能被套,不如設計一套 general 的實際準則可以被大家遵守學習。

不僅僅是 HTML 設計規則,其實開發當中會花掉很多時間的,還包含一些常見的 CSS hack / IE hack。這些也可以被整理起來,節省開發時間(當然,現在你只要學 compass 就好)。

平行開發互動:解決多人團隊的偏好歧異問題

剛剛有一個問題我們沒有回答到:就是個人偏好如何「組合」?

比如說美術的版裡面有這樣的 DOM <div class="article"> </div>,class 是 article

但是 RD 實際的程式碼卻是 post 這樣的物件名稱。

<% @posts.each do |post| %>
  <%= post.title %>
<% end %>

這樣「套」起來不是很有問題嗎?如何實現所謂我說的「平行開發」?

其實 Art / RD 雙軌平行開發,才可以有效的為專案爭取到時間。

其實之前的所謂「套」,因為有完工的時間壓力,DOM 往往不能夠被更改。但是不改 DOM 又不能讓專案繼續被執行下去。

若是雙方平行開發,又有一個 deployable 的 application 讓進度透明,所有的修改和溝通調整,只是一下子的功夫(article 與 post 的不同,可以在很早期就被抓出來修掉),不但不會打亂開發節奏,反而會加速專案的進行。

====

系列文章:

 
over 5 years ago

第 2 件事:application deployable from day 1

在進入開發階段後,我會做的第一件事: ** make application deployable**

也就是:專案開始第一天,就必須要有個 production 直接可運行(可以鎖密碼,當作測試 server)才行。(我在 Rails 101 這本書最後一章,加入 capistano 與裝機為必練技能,就是這個緣故。)

為什麼專案需要 deployable?

提前控制風險:開發環境與線上環境的不同

在一般的經驗中,往往在在專案進行到尾聲快上線之時,才會注意到一個可能使專案時程大爆炸的事情:** 開發端與線上端的環境通通不一樣 **。

在開發過程中,所有人只專注在自己的機器上能不能動,這是常態。專注在實現功能,東西有缺就先在 local 上塞假資料。在最短時間內將 feature 盡可能寫完絕對是第一要務。

但很可惜的,寫完並 不等於 放到正式環境上可以動。

網站上其實非常多功能需要實際被「真人」測試,才會知道到底有沒有問題。有一些設定,甚至開發環境與上線完完全全不一樣。(以 Rails 來說,其實就差很多。比如說程式 class 會不會被 cache,asset 有沒有 optimize,上傳路徑以及與第三方接軌的設定等等...)

如果拖到最後一個月才作 deploy 的這件事,因為「到底有多少東西不一樣」,變成了一個完全的未知數。原本夠用的一個月測試期,被這樣一壓縮可能完完全全就不夠用了。而且因為專案截止日已進,隨之而來的壓力更加大了犯錯的可能性。

一個透明的已知進度

Day1 就有一個可以直接實際測試的站台,還有一個很大的好處,能夠確保專案中所有人都知道現在進度,與規格書上的東西到底差多少。如果有重大瑕疵,或者是絕對不可行的功能,就可以早早會提出修改,下架等等。節省大家寶貴的開發精力。

如果專案截止日最後十五天,大家才知道很多東西原來根本是作不出來的,或者是跟原本想像差太多的,這時候鐵定陷入交相指責,一遍慌亂的狀況。

絕對注意:捍衛進度

不過這一招的使用,專案經理或者是 RD 主管要特別注意。因為 Day 1 就有一個直接可以看的站台,不少完全不懂「技術」的專案參與者(通常是企劃或老闆),會對網站的「裸站」狀態感到極度的恐慌,他們會挑剔 UI,會不滿 implement 細節,進而想要實際插手進度修改內容。請務必堅持住,堅持到進入最後一個階段:測試修飾期才可以讓他們修改(通常進入準完工階段,裸站狀態其實也消失了,當初挑剔的東西幾乎在這個階段不復存在,故也沒有修改的必要。)

P.S. 可以架設一個 issue tracking system,把他們提出的修改事項先通通記起來,但通通不實作。等到接近測試期,再來看看這些當初的「建議」到底還有哪些實際需要被執行。

只有「完全不合實際應用」的東西,或者是「變更會讓實作方式更合理」的東西可以在整個開發期,被丟入排程中。

否則,他們的驚慌,會害這個專案完全結不了案。

====

系列文章:

 
over 5 years ago

很多人知道如何實作網站功能。但是卻不知道如何將網站成功的完工,並且如期上線。往往明明專案開始之初有不少的工期,有不錯結果的卻很少。上線前後總是一團慌亂。

其實「上線」這件事情完全是可以被掌控的。這當中有不少眉角,只是多半被疏於控制,導致風險橫生。

在回答別人幾次這樣的問題之後,我決定把我的經驗分享整理出來:

第 1 件事:界定時程

這是我認為在專案管理過程中,最重要的一件事。累積參與過幾十個專案下來的經驗之後,我發現上線前手忙腳亂的原因,幾乎都是時程的安排不當。時程混亂冒出的很多風險又沒有被妥善的管理,最後才大失火...

傳統瀑布式專案進行法:寶貴的時間被大量的浪費

一般的專案進行方式,雖然都會有確切的完工期,但專案進行的方式往往會形成相當的浪費而最後造成大量的風險。

比如說一個需要 6 個月工期的案子進度通常是這樣的:

  • 花了 3 - 4 個月無盡的訪談需求
  • 花了 1 個月請美術設計視覺與介面,以及反覆修改
  • 最後剩下不到 1 個月請 RD 寫程式

=> 完全來不及寫完程式 => 半成品上線

上線後一個月:

  • 到處都是 Bug
  • 發包方抱怨
  • 使用者抱怨

上線後第二個月:

  • 終於寫完當初規劃的程式
  • 終於修完大部分的 Bug
  • 使用者早已認定這是個未完工的網站,不再來訪

上限後第三個月:

  • 因為網站規劃不良,使用者對這個網站不感興趣
  • 因為網站規劃不良,預計的成效沒有出來
  • 還有資源 => 繼續籌畫下六個月的改版
  • 已無資源 => 死城

「規劃」從來不是最重要的事

「規劃」其實絕對不是開發一個網站的最重頭項目。「施工」和「調整」才是。

傳統的專案進行方式往往會掉進一個陷阱:六個月看似非常長,於是就大膽的將大部分的時間都丟入「規劃」這個一階段,因為沒有時間壓力,於是會議也通常沒有結論,或者是 feature 發散。等到驚覺時間已大幅燃燒殆盡,再不進行開發絕對完蛋,才匆匆結束。

「規劃」畢竟是個空想產物,等到實際請美術設計頁面,又會發現很多畫面以及 UI 實際上不可能完成。

於是在這一個月,團隊又會大幅的來回修改刪除功能:直到一個勉強接受的範圍,等到視覺完工再轉交給程式設計師「套版」。

在上一個階段,粗估的一個月往往是不夠用的。因為還牽扯到往來的修改時間。而這時交出的產品 scope,也僅只限於「UI」部分有辦法被完成。

「UI」部分有辦法被完成 不等於 「功能」有辦法被完成。有時候畫面上一個小小的按鍵功能,背後的基礎開發工時可能要花上三個月。

最終的上線版本,因為不夠時間了,通常最後只有寫完當初規劃出的功能的 10 - 30% 。而且 Bug 還很多。(因為時間關係,只有辦法完成勉強達到 UI 操作的目的,細部細節根本來不及實作)

最後成效不彰,檢討會議上大家互相指責。但無論如何怎麼檢討來檢討去,完全沒有人會把最根本的問題朝向「規劃時間太長」,只會輕描淡寫的用「必要之惡」一筆代過。

我的方法:從後面倒回來推算時程

我的作法完全相反。如果一個工期是六個月。我會這樣分:

  1. 什麼時候要上線:上線前 1 個月前要 Feature Complete,留足夠的時間進行各樣測試和修復 bug。(剩下 5 個月可以用)
  2. 寫程式要花多久時間:寫程式要花多久時間是不一定的事,但是可以粗估不出包的時間大概是 2 - 3 個月,可以粗抓 2.5 個月。(剩下 2.5 個月)
  3. 視覺設計要花多久時間:畫面設計要花多久的時間也是不一定的事,,但是可以粗估不出包的時間大概是 1 - 2 個月,可以粗抓 1.5 個月。(剩下 1 個月)
  4. 是的。只剩下 1 個月時間可以開會、規劃、畫草圖。請不要浪費時間。

只有 1 個月,是否不夠時間詳細規劃功能?

完全不會。

我會在以後其他的專案管理文章解釋為什麼。

====

系列文章:

 
over 5 years ago

Hi, 各位讀者好。

因為 Apple 一直在改變 XCode 的編譯套件位置,所以 Rails 101 內附的裝機實務已經過期了。

我最近正在籌劃下一次的改版,已經進行的差不多了。將會直接 support 到 Rails 3.2.2。

不過因為裝機實務這個步驟比較會卡到大家,所以我先放這個章節: Rails on Mac 安裝最佳實務 出來給大家使用。

若您在裝機上還碰到什麼問題,請至 Ruby Taiwan Group 上面回報。