2009年2月27日 星期五

[轉載] 昨天上的囧課

其實該囧課是和准將一起上的,直接轉他的心得來

=========== 轉載開始 ===========

今天去上某個關於程式寫作標準制定的課程。
不過上的很囧….
(課程單位跟講師名稱我就不寫了。這是搜尋引擎的時代,小心點好)

撇開講師對時間控管很差還有花半個小時自我介紹不知道要幹麻,
還有叫我們自我介紹說可以了解我們的傾向但實際上卻完全沒用外,
他顯然觀念有很嚴重的誤差。跟實際程式設計上的。
(噢好,這樣好像不太客觀,就說跟我的觀念有很嚴重的誤差好了)

首先,他很顯然的把Coding Standard、Code Review、
規格書制定、時程制定全部混為一談。
是的,這些都是軟體管理方面的事務,可是並不是都一樣。
更何況這堂課叫Coding Standard。
幫我個忙,中華網龍那個案例怎麼看都是規格書制定層級的問題。
另外匈牙利命名法的確是個不錯的教材,
不過他也跟Coding Standard沒什麼關係。
它可以跟規格書有關,也可以跟Code Review有關,
不過就是跟Coding Standard沒直接關係。

不過這還不是這堂課最糟糕的地方。
更糟的是,下半堂他開始教我怎麼寫C++。
那個,我不需要你教我C++有靜態變數跟區域性資料,
我也從來沒有寫過/看過在行首放個$的C++程式碼。
還有我並不覺得盡量減少區塊變數是個好主意。
另外現在的C Compiler都有支援//了。
使用enum每個都自己給定數值更不是件好事。

其他他關於Pseudo Code還有Java的教學我就認了。
最讓我覺得囧的是他講義裡面提了個什麼軟體藍領。

什麼是軟體藍領呢?

根據裡面的定義(抱歉我也是第一次看到),
軟體藍領就是說,上面的人寫好規格書往下扔,
下面那堆Coding Monkey--不管他們到底有多會寫程式,
是寫了十年的老手還是剛學C++三個月的菜鳥,
都能啪啪啪的打成一個完全無錯的漂亮程式!有沒有很神!

來我用一般人都懂的方式翻譯一下這句話。
用寫小說來類比的話就是,只要你故事大綱寫的夠完整,
扔給一群不會寫小說只會打字的人,他就會幫你寫成一本神雕俠侶了!

你覺得很荒謬嗎?顯然的有人不覺得呢。

寫小說為什麼複雜?因為要兼顧到文字的美感、故事的流暢、
角色的感情、如何牽動讀者的心讓他們不能自拔。

寫程式為什麼複雜?因為它要同時滿足執行的機器的限制,
還有使用者的感官需求還有使用用途。
軟體很複雜,因為用他的人很複雜。

如果一個小說大綱好到誰都能打出來,那那份大綱就是小說本身了,
被交付大綱的人算不上寫作者,是打字員。
工作是省不掉的,大綱還是要小說作者本身來寫,而高水準的作者就那幾位。
那麼這種代工行為有意義嗎?
(既然這位講師提到了Joel on Software,我也來提一提吧。
這篇有講到些關於這點的事情,有興趣的人可以去逛逛。是中文的,放心)

==
好吧最後我要總結。其實我囧的不是因為這課上很爛。
不是因為我花了錢(錢是公司出的,好家在),也不是因為我浪費了一整天。

我頭痛的是有這樣的講師。頭痛的是課堂上有人對他的講解反應熱烈。

想想看,這種講師一定不只一個,然後每個可能教出幾十幾百個學生。
這課顯然是為主管開的(我們工程師聽的臉上三條線呢),
所以會產生出幾百幾千個相信這種東西的主管--

台灣的資訊產業,看來地雷叢生呢。

==
難怪人月神話Peopleware都出了二十年了,這行業還是這麼痛苦。


=========== 轉載結束 ===========

基本上我的感想一樣這樣 -_-
ㄊㄇㄉ要是遇到這種主管我就囧到炸了……

昨天上了堂課

是我數年來上過最胡說八道的課
細節我懶得講了,我只舉一篇他在教材中引用的文章原文↓

==============================================================

中國軟體業的劣根性(台灣軟體有希望嗎?)

我在工作中,接觸到印度軟體公司開發出來的軟體:整個體系架構非常清晰,按照我們的要求實現了全部 功能,而且相當穩定。但是打開具體的程式一看,拖沓冗長,水平不怎樣。我們自己的一些程式員就有怪 話了,說他們水平真低。但是!印度人能夠把軟體整體把握得很好,能夠完成軟體,並得到相當好的設計 文件。而中國人在那裡琢磨資料結構、演算法,界面人員就還沒寫程式就想著是 Outlook 式的還是 Visual Studio 式的界面。到最後就成為 Code 高手,對某些特定的開發工具精通,但是就是不能保証能 夠把一個軟體穩當、完整的開發出來。

舉個簡單的例子:軟體中需要一個列表,用來表示我們處理的事務。該類表在業務繁忙的時候將變得很大 。中國人就用雙向串鏈,抱著《資料結構》書在那裡寫鏈表的類別。印度人開了一個大陣列,然後就開始 幹。為什麼印度人不用串鏈,他們說:

1. 你們給出的設備最少具備 512M 記憶體,浪費一些沒有什麼。
2. 陣列方式訪問方便、效率高。

看出了一拿到東西就吭哧吭哧寫 Code,和好好進行軟體分析的不同了嗎?

正好前幾天我有幾個同事從印度回來和我們交流,那家公司是 CMM4 級公司,我感受的幾點:

1. 流程重於專案。
2. QC(就是 QA)獨立於研發部門,專門檢查研發部門的開發流程是不是按照既定流程走。如果 QC 覺得流程不對,他會直接上報高層,專案肯定就此停止。
3. 所謂的專案經理(PM)一般也是從程式員升上來的,並不是所謂的不懂技術,一般都至少有四年以上的經驗。
4. PM 主要就是制定開發計劃,負責協調,填寫各種表格。
5. 所有的東西(包括草稿)都有文件。
6. 詳細文件要求達到只有這個文件就可以寫程式的程度,一般寫文件時間占 60%,寫程式時間極少。
7. 有各種詳細的 Review(同行評審),專案組內的,專案組之間的,客戶的...
8. 計劃很詳細,的確能達到小時級,但是實際情況還是誤差比較大,所以他們也有加班.先學習 UML 和 Rose 以及 RUP,不要總是要找著証據。在中國的軟體開發水平下,很難給你一個好的例子,OK?中國人總是要看到一個東西有了試驗田,而且稻子長得好,才換稻種。要知道在國外上述的軟體開發模式的應用,大可以看看 Rational 網頁上的 Story。Just do it!

一句話,中國的軟體開發水平低得很。趕不上印度人,印度的軟體公司可以讓高中生寫程式,它的軟體工 程水平可想而知。當然,你如果是個很行的程式員。估計夠嗆,因為中國的氣氛中,很行的程式員都很難 接受軟體工程的。你可以測試一下自己,看看自己適不適合現在學習軟體工程:

1. 你是不是不能忍受一個寫程式不如你的人做你的專案經理?
2. 你是不是覺得你的老闆對客戶吹牛皮、誇大自己而感到不舒服?
3. 你是不是一個拿到一個需求腦袋裡第一念頭就是如何實現的人?
4. 你是不是很崇拜 Stallman,Linus,很討厭 Microsoft?
5. 你是不是曾經在深夜寫程式的時候,突然感覺到一種乏味,對 code 的生涯感到一種無趣?

我們現在處於深深的自卑當中,感到中國的軟體工程水平的低下已經是牽涉到民族劣根性的問題了。我們 招聘印度人,給應聘者出了一份與國內差不多的試卷,有基礎概念和寫程式題目。等到他們完成後,我們 這些中國的自認高手驚呆了!他們的寫程式題目簡直像是抄襲的?程式結構,注釋,變數命名就不說了吧 ,全部都是極其類似!反觀中國的強人、高手,每個人有自己的一套。到了新的崗位,先把前任的程式貶 損一通,然後自己再開發更多的問題的程式來代替。

我的公司統計,一個軟體中有 4 個以上 CSocket 版本,每個人都覺得別人做得差,自己再搞一套。中國人,就是這個樣子,還會辯解說『我們這樣有創造性』。

其實軟體發展,早就走過了求伯君那個編碼英雄的年代,程式員已經是個坐辦公室的藍領了。你具備擰好 一個螺絲釘的能力就可以了。Code 是最低級的事情了。他們許多公司的專案經理根本就不懂技術。中國 的專案經理如果不能在技術上壓服下屬,那麼下屬將與他搞鬼,越是高手越喜歡搞鬼,根本不知道作軟體 的終極目的是從別人口袋裡掏錢,而在內部搞不團結。技術高手都會糾集一些對他技術上崇拜的菜鳥,與 管理層作對。而印度的軟體經理根本就不懂正在做的東西,許多甚至直接就是 MBA,或者是領域專家(工 業設計、地理專家等),而不是程式的專家。但是卻能夠領導大群素質良好的程式員把工作做好,沒有內 部不團結的情況。許多印度的程式員加入一個公司很長時間,都不知道自己整天寫的程式是幹什麼用的。 給他們的任務可能就是一個函數的宣告以及該函數要實現的功能。我們呢?

他們的編程人員流動率(包括內部專案之間的流動)高達 30%,可以想見他們的文件水平如何。他們的產 品不依賴任何一個人,誰都可以立即辭職,產品的開發還是會正常進行。而中國,是老闆怕總工程師。技 術骨幹擁兵自重,抗拒管理。任何制定好的計劃,都有可能被技術人員推翻或者跟你消極怠工。

他們的開發計劃能夠做到小時級別。如果一個印度公司的專案經理沒有上班,那麼他的下屬將可能不知道 作什麼。他們的計劃一般都定到天,每個基層開發人員每天的工作量就是 8 小時。而我們能夠給出月度 計劃的公司就很少,而給出的月度計劃要麼不可能實現,要麼就可能被取消。開發人員被粗略的給個任務 ,他在月初,可以慢慢琢磨是做成什麼樣子,然後上上網,聊聊天。到了月中和月末,就開始熬夜寫程式 。

看到每年,從各大學不盡高手滾滾來,我們是不得不要招人,同時又是不抱希望。我公司現在有意以後將 核心軟體開發外包給印度公司,中國人?做做界面吧,中國人做界面會極盡奇技淫巧,搞得花裏胡俏的。 BTW,我公司非外資企業,大家不要誤會我們有什麼種族歧視。但是我們現在就是對自己歧視,自卑得很 。中科院那麼多研究院,連個能用的操作系統都搞不定。北大開發一些東西,比如什麼青鳥 CASE,就是 給一幫人評職稱的。楊芙清院士整天搞來搞去,搞出了什麼東西?北大,清大的人最難管理,強得看不見 人。中國的程式員罵微軟,追 Linux 是全世界最狠的,可是我們除了漢化 Linux,做了什麼東西出來。 CDE 是瑞典人寫的,Linus 是芬蘭的,GNome 是墨西哥人寫的。哎,我們曾經是多麼的瞧不起印度人。

最近遊戲橘子出了一款新遊戲叫「天堂」,大家有注意到嗎?我玩了一下。發行方式和經營方向都還不錯 ,找了一個代言人「范曉萱」;拿遊戲光碟不用錢(只要在 7-11 買東西)使用時數卡(在 7-11 有售, 每 12 小時 15 元);電視廣告,雜誌、報紙,不過,技術方面太差了,畫面差,程式能力差,bug 多, 企劃也不行,如果 uo 是 90 分的話,那天堂只有 10-20 分。

這是台灣遊戲的命運,用小錢製作,沒有真正的開發,過分強調執行面而不注重技術面。

這個遊戲若照一般的說法,應該是最好的模式了,在 7-11 的大力支持下,強力的後盾讓他們有了最好的 銷售管道和財力。可是,卻忽略了一個遊戲最重要的部分:「可玩性」。對我來說,這是捨本逐末的做法 。既覺可惜,又覺可惡。可惜的是,還是花了不少人力,財力,卻沒做出像樣的產品;可惡的是,騙了消 費者,又只看錢不好好在遊戲品質上精進。最後的情況是:玩家玩沒多久,就會放棄了。尤其有其他那麼 好玩的外國網路遊戲在競爭。看來,台灣的遊戲軟體還有好長一段路要走呢。

就是中國人的悲哀(台灣也一樣),不管兩岸未來統一或獨立,身上流的都是惡質的血(應該說是基因才 對)誰都不服誰,都想幹老大,很少有團隊精神這一點在基礎科學上已輸給西方國家我們只能在歷史課本 上喊喊中國人的三大發明,真是可笑,我看未來在軟體應用科學上,輸給印度人也是必然的,唉~

感同身受............

==============================================================

這什麼網路小白亂寫的廢水文?

然後居然放在講義裡面當課上,如果管理階層真的這樣想的話,那軟體業吃屎也只是剛好而已 -_-

2009年2月25日 星期三

在Java中任意追蹤堆疊呼叫

我發現把Stack trace硬翻成中文之後不知道在講啥 orz
其實這真的簡單到不行,就:

new Throwable().printStackTrace();

全文完

要找共通呼叫的東西是誰在搞鬼用這個方法非常有效。
####

2009年2月19日 星期四

果然旋轉螢幕不是一定要把Activity砍掉重練的

http://developer.android.com/guide/topics/manifest/activity-element.html#config

一切謎底都解開了,只要在Menifest註冊這個android:configChanges就可以避免砍掉重練,並且可以在onConfigurationChanged()接到這個event
我還一直在想這機制會不會太鳥咧……orz
####

2009年2月18日 星期三

HTC Magic (G2, Sapphire)




HTC Magic 相關功能列表:
‧支援 GSM 850/900/1800/1900,UMTS 900/2100
‧支援 7.2 Mbps HSDPA,2 Mbps HSUPA
‧內建 WLAN 802.11 b/g 無線網路
‧內建 Android 作業系統
‧內建 Qualcomm MSM7201A 528 MHz 處理器
‧內建 192 MB RAM,512 MB ROM
‧內建 3.2 吋 320 x 480 觸控式 TFT 螢幕
‧內建 320 萬畫素相機,自動對焦
‧支援 AAC、AAC+、AMR-NB、MP3、WMA、WAV、AAC-LC、MIDI、OGG 音樂
‧支援 MP4、3GP 影片
‧內建 FM 收音機,支援 RDS
‧內建 GPS、電子羅盤
‧內建 Gmail、Google Maps、Google Search
‧內建 YouTube
‧支援 Android Market 應用程式下載
‧內建 Trackball 軌跡操控球
‧內建 G-Sensor 重力感應器
‧支援 SMS、MMS
‧內建 HTC ExtUSB 傳輸埠 (USB 2.0,耳機共用)
‧支援藍牙 2.0 + EDR
‧支援 microSD 記憶卡
‧無鍵盤

我最在意的是他似乎是用已經裝上Cupcake的Android,那很多東西都會很美好
問題是Google會不會推出對應的SDK,還是要繼續等 orz
==
春天發售是吧

2009年2月17日 星期二

OpenCORE 2.0

雖然還沒整合到G1或Emulator上(應該吧),但OpenCORE本身已經升級到2.0了。詳情:
http://groups.google.com/group/android-framework/browse_thread/thread/92e10684c6f09e16/36c77a281d252289?hl

最主要的差別應該是終於有完整的錄影功能,然後據說要塞codec進去變得更容易,可是到底有多容易我也不知道 囧>
塞codec的手順參考這裡(PDF):http://android.git.kernel.org/?p=platform/external/opencore.git;a=blob_plain;f=doc/omx_core_integration_guide.pdf;hb=master
####

2009年2月16日 星期一

Android Market要開始提供收費服務了

第一階段僅限英國和美國,付款方式是……Google Checkout?O_o
我還滿懷疑有多少使用者會用Google Checkout的……
反正短時間內沒我的事,靜觀其變吧 ~_~
####

2009年2月13日 星期五

使用多層TabActivity時的注意事項

我剛剛被這個問題搞到昏頭:

02-13 10:21:58.722: ERROR/AndroidRuntime(2137): java.lang.NullPointerException
02-13 10:21:58.722: ERROR/AndroidRuntime(2137): at android.view.ViewRoot.draw(ViewRoot.java:992)

基本上原因「大概」是Stack Overflow,我的情況是用了二層的TabActivity然後又Adapt自訂的item導致他掛點,換成單純的string就不會。
所以多層Tab還是拿來裝簡單的東西就好,要華麗的話還是乖乖另外新開Activity吧……
####

2009年2月11日 星期三

SDK 1.1 release

Lag很大
變更點詳細:http://developer.android.com/sdk/android-1.1.html

まとめ:
干我屁事 orz
####
這Video Recording相關bug的到底是啥時才要修

2009年2月9日 星期一

WARNING: Device API version (1.1) does not match SDK API version (1.0)

( ゚д゚)

(打開Android首頁)
嗯,API沒更新

……我實在很害怕這會不會出什麼鎚 orz

2009年2月5日 星期四

使用SQLite時的引號注意事項

如果你使用SQLiteQueryBuilder和ContentValues來作insert/update,那你不需要對字串作任何處理。
可是在query的時候,WHERE CLAUSE裡面你必須加上單引號,或是自建一個WhereClauseBuilder:

public static class WhereClauseBuilder {
public static String whereKeyEquals(String key, String value) {
return key + "='" + value + "'";
}
}
####

2009年2月4日 星期三

ProgressDialog無法在Activity建立過程中使用

居然會因為底層的問題沒辦法在Activity的onCreate() onStart()之類的途中使用 orz
就算要插一個Activity在中間也有資料傳輸的問題,直接改layout更是一整個suck
不是我要講,這還真的滿鳥的…………

所以剩下的辦法就是改用notification:

Context ctx = getApplicationContext();
final NotificationManager nm = (NotificationManager) getSystemService("notification");
Notification n = new Notification(R.drawable.icon,
getString(R.string.loading_message), System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
new Intent(ctx, FileBrowserActivity.class), 0);
n.flags = Notification.FLAG_NO_CLEAR;
n.setLatestEventInfo(ctx, getString(R.string.app_name),
getString(R.string.loading_message), contentIntent);
nm.notify(LOADING_NOTIFICATION, n);
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; } #quote { display: block; /* fixes a strange ie margin bug */ font-family: Verdana; font-size: 10pt; overflow:auto; background: #f7f7f7 url(http://lh5.ggpht.com/_z-VThISftkI/SXUlpyfw9ZI/AAAAAAAABYY/e3GUx9_Z4TE/s288/quote-l.gif) left top no-repeat; border: 4px dotted #ccc; padding: 15px 15px 15px 31px; /*up right bottom left*/ max-height:300px; line-height: 1.2em; }