2012年6月18日 星期一
刪除 ORACLE ARCHIVE LOG
下面指令,都請至該台DB SERVER cmd模式下執行
1.查看archive相關設定值
c:\>sqlplus / as sysdba
SQL> SHOW PARAMETER ARCH
NAME TYPE VALUE
---------------------------- -------- -------------------
.........(篇幅關係 上面還有,只取下面)
log_archive_dest_state_9 string enable
log_archive_duplex_dest string
log_archive_format string ARC%S_%R.%T
log_archive_local_first boolean TRUE
log_archive_max_processes integer 2
log_archive_min_succeed_dest integer 1
log_archive_start boolean FALSE
log_archive_trace integer 0
remote_archive_enable string true
standby_archive_dest string %ORACLE_HOME%\RDBMS
SQL>EXIT
2.查看寫入目錄路徑及目錄size限制
c:\>sqlplus / as sysdba
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------ -------------- ----------------------------------------
db_recovery_file_dest string D:\oracle\flash_recovery_area
db_recovery_file_dest_size big integer 20G
上面的資訊表示 D:\oracle\flash_recovery_area\ 不能超過20G,
否則oracle會罷工的。
3.刪除archive log
1.執行下面指令,注意!!target 與 / 中間有空格
C:\>Rman target /
RMAN> backup archivelog all delete input;
channel ORA_DISK_1: backup set complete, elapsed time: 00:29:36
channel ORA_DISK_1: deleting archive log(s)
archive log filename=D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC00807_0618831482.001
recid=798 stamp=650904762
archive log filename=D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC00808_0618831482.001
recid=799 stamp=650935209
..............
Finished backup at 02-MAY-08
RMAN>exit;
2.可能還會有另一份Archive log需刪除。
查看 剛剛參數,一般預設如下
standby_archive_dest string %ORACLE_HOME%\RDBMS
則
檢查 D:\oracle\product\10.2.0\db_1\RDBMS\
若還有ARC*.* 請自行刪除。
補充:
1.若是您手動到D:\oracle\flash_recovery_area\目錄
刪除archive log,手動刪除的,
就算執行了backup archivelog all delete input;
因為元配不在,
副的(D:\oracle\product\10.2.0\db_1\RDBMS\arc*.*)
也不會刪,
以後請勿直接去os刪archive。
直接執行下面指令,即可一併刪除。
backup archivelog all delete input;
2.使用backup archivelog all delete input; 仍不行?
有可能磁碟容量大爆滿,rman要備份後刪除也不行
可以改用下面的指令:
C:\>Rman target /
RMAN>delete force noprompt archivelog until time 'sysdate - 5';
RMAN>exit;
完成
3.要是您無法使用EM的自動備份後刪除archivelog?
同事傳授的方法:(使用rman的run script作法)
3.1 產生一bat如下:
rman target=/ cmdfile=c:\rman.txt
3.2 產生c:\rman.txt內容如下:(每次都只保留5天內的archive log)
delete force archivelog until time 'sysdate - 5';
exit;
3.3 最後把bat放到排程,每天執行一次。
4.大絕招增加空間(因為後來還是有遇到上面的方法都不行的)
到db console 用 sqlplus / as sysdba登入 執行下面指令 增大空間到100g
(每個人空間不一樣請自行更正)
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=100g scope=both;
SQL> shutdown immediate;
SQL> startup;
其實到補充3應該就要能可以了,原因是flash_recovery_area目錄下不只擺archive log 檔案還有backupfile目錄(備份檔案)。
一直以來遇到這類問題大家的焦點都擺在怎麼清除archive 其實若有定期做排程備份也是一個佔空間的原因,下次有時間在找出指令刪除備份檔
[oracle@example ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Tue Oct 4 13:54:37 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> conn / as sysdba;
Connected.
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------ ------- ---------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 20G
Delete archive log
備份後刪除:
[oracle@ksfm2 ~]$ rman target /
Recovery Manager: Release 10.2.0.5.0 - Production on Tue Oct 4 14:21:52 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: KCLV (DBID=3445048213)
RMAN> CROSSCHECK ARCHIVELOG ALL;
....
....
RMAN> BACKUP ARCHIVELOG ALL DELETE ALL INPUT;
直接刪除不備份
RMAN> delete force noprompt archivelog until time 'sysdate - 7';
RMAN> exit;
Shell Scripts 清除範例,可以排在 Cron job
(1) clearArchivelogs.sh
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=ORCL
export RMAN_CMDFILE=RMAN_CMDFILE
$ORACLE_HOME/bin/rman target=/ cmdfile=$RMAN_CMDFILE
# Cleaning Empty Folder
find /u01/app/oracle/flash_recovery_area/ORCL/archivelog -type d -empty -exec rm -rf {} \;
(2) RMAN_CMDFILE
delete force archivelog until time 'sysdate - 7';
exit;
2012年6月4日 星期一
【把用戶當傻瓜造就Windows,裝逼文化產生UNIX】你程式設計是實現自己的事業嗎?
【zhaoNew評論】客觀比較一下,UNIX和PC伺服器有什麼不同,UNIX小型機性能好、安全性高,擴展性強,運行關鍵性服務,是企業級客戶的選擇。PC伺服器性能低,安全性較差,擴展性受局限,有大量廉價的相容配件,並且便宜,介面也好,個人使用方便。
力頂最後一句話,發人深省!
文化,我首先想到的是文化。Unix和Windows從誕生之初的文化差異本質上劃分了兩者的界限。直觀看來,一個裝逼文化,一個傻逼文化。
Unix誕生在貝爾實驗室的MULTICS項目之後。據說當時這個項目設計得十分複雜,功能設計也幾乎是上天入地無所不能。雖說當時貝爾實驗室是很牛,可以牛到不用裝逼也能露逼一下的地步。但歷史告訴我們這種項目最後絕對會死得很慘。當然,項目最終結果還是沒有違背歷史規律。當時一位MULTICS參與者Ken
Thompson事後痛定思痛,準備重新自己開發一個多工作業系統,摒棄了MULTICS過於複雜的系統設計,力求新系統的簡潔緊湊。傳聞時值Ken Thompson老婆帶上孩子回娘家過日子去了,一時間Ken Thompson晚上無以為樂,只好天天以堆碼為業。
不到一個月,Ken Thompson用彙編把這套作業系統編寫出來了,這就是後來流芳百世的UNIX。當然,當時的Ken
Thompson根本沒有意會到他這個業餘時間的作品會改變整個電腦發展史。因此這個作業系統設計使用者群只針對他預想的電腦科學家、駭客,再不濟怎麼也得算上個電腦科學技術本科生。Unix只面對政府、研究機構、大學等專業性很強的機構,簡潔、高效、安全是Unix的文化哲學。同時結合到當時的硬體條件限制,也不難理解UNIX誕生之初就根深蒂固的文化:
1、電腦龐大的占地面積、高額的購買維護費用使得普通用戶根本無力支撐起一台電腦的各種資源消耗,當時更多的是電腦專家在通過終端在控制整個電腦運作邏輯。沒有GUI、沒有多媒體,字元介面,這對於這批靠電腦完成科學任務的駭客來說已經完全夠用了。
2、同時遵循簡潔統一的輸入輸出介面,相比於GUI的事件驅動模型來說,更適合使用腳本將各種程式粘合起來,完成複雜多樣的計算任務。
有人說起過UNIX正巧在當年GUI史前誕生,時運不濟,所以只出了個字元怪胎,要是再躊躇幾年,等到GUI日臻成熟,那誕生出的UNIX恐怕就是如今Windows的翻版了。對此我還是不太認可,UNIX的存在是電腦荒洪時代遺留的文化,即使現在豐富多彩的GUI也照樣沒有改變UNIX的基礎設計恐怕就是一個極好的證據。目前大多數的伺服器依然保持著當年UNIX誕生之初的風貌,依然CLI、依然Shell,因為我們需要把更多的資源讓給使用伺服器的客戶,人類對電腦性能的榨取永遠是貪婪的。這讓我想起了幾年前Windows漸入佳境PC,遊戲剛大行其道,桌面遊戲編寫還不是那麼方便時候,有人預言等幾年之後,按照摩爾定律,編寫星際爭霸之類的遊戲便不需要多牛逼的演算法,甚至能用寫指令碼語言都能完成。這幾年算是大致差不多算過來了吧,星際是有牛人用JavaScript完成了,不過現時最牛逼的遊戲(如魔獸世界)還是會用很牛逼的演算法,還是需要使用C/C++,還是需要精通圖形學,還是需要熟悉圖形硬體。所以不管硬體如何發展,UNIX文化中的簡潔高效這些準則還是依然存在,因為我們會把最佳的性能留給我們伺服器的客戶,然後可以把敲打字元,玩弄指法的時間留給自己,在老闆面前裝逼一下。
Windows(以及其前任DOS)誕生在公司,公司不像學院,不會像UNIX一樣如果能裝逼就儘量裝逼一下,公司直接面對客戶,產品唯一使命就是取悅使用者,只能把用戶伺候好了,公司才能維繫發展。所以Windows誕生之初就一直肩負比爾“讓每一個家庭都有一台電腦”的使命,不裝逼,不玩酷,一切功能照顧用戶,就是用戶是傻逼你也得當親爹一樣伺候。故而Windows一直就假定使用它的用戶你就是一個傻逼,哪怕是刪除檔這個小問題上,Windows也會想小娘們兒一樣謹謹慎慎戰戰兢兢地一再向人確認"確實要刪除****嗎?""確實要刪除唯讀檔案****嗎?"。當然,最終能夠讓大媽大叔阿公阿婆阿貓阿狗都能使用上電腦的Windows絕對佔領了終端使用者桌面,比爾也因此一夜暴富,搖身一變成為世界首富&慈善家。
不得不承認,如果沒有Windows,“讓每一個家庭都有一台電腦”的崇高理想恐怕又得推遲幾年才能夠得以實現了。自然,微軟技術是肯定不差的,而不是像一些Linux小菜鳥口中所言"微軟技術很爛",相反微軟技術是很牛的,牛到曾經豪言可以立馬滅掉Google,試看如今還有誰可以發出這樣傻逼的豪言。但是微軟牛,不代表Windows就可以幹過MULTICS,上天入地翻江倒海無所不能。Windows 在安全性、性能以及開源專案上與UNIX相比確實還是有一定差距,但這並不妨礙windows成為桌面第一大作業系統。
UNIX的駭客們,眼見著曾經引以為豪的電腦技術壁壘瞬間被Windows GUI衝擊到蕩然無存了,心中肯定是有落差的。不過這段技術演變技術普及已經成為了歷史發展趨勢。一個少數人才能駕馭的技術,哪怕就是敲一個ls這樣簡單的命令,你也可以把它吹破牛皮,扯虎皮拉大旗捧為藝術珍品,搞得善男甚廣善女甚眾。一旦技術被迫普及後,曾經視作的藝術瞬間就被廉價的工業化大生產所替代,現在滿大街的廉價代碼工就是電腦程式設計工業化後的結果。
前段時間眾人大罵Java程式師把自己的價位又拉低了。殊不知,拉低自己價位的非Java也,乃工業化大生產趨勢。今不出Java,明兒准會出來個Bava,Cava,照樣把你收拾成碼農。時至如今,UNIX駭客們還在裝逼,用CLI命令列跑出花花綠綠的文字,時不時感歎下曾經的軟體英雄時代一去不復返,時不時像祥林嫂一般嘮叨"當年哥可是寫彙編的,沒想到如今淪落到如此地步,人心不古,世風日下啊~",時不時還顧影自憐,想裝逼下,可惜時光不再。
“媽逼的給老子回去寫代碼!這個月還想不想領工資了!?“
結語:
不管是UNIX的裝逼文化,還是Windows的傻逼文化,最終在電腦產業工業化的歷史滾滾長流中歸於平庸,歸於廉價。曾經的那批牛逼的、不牛逼的、風騷的、不風騷的UNIX文化精英們,如今早已是廉頗老矣,尚可喝粥。曾經被意淫為“電腦科學與藝術”如今也早已淪落為“軟體碼工”。軟體英雄時代早已不再,編碼也成為三百六十行中的一行,一種用以謀生的手段,一種混飯吃的活路。關鍵問題早已不在程式,不在編碼:
“程式設計只是一個工具,關鍵在於你拿這個工具來實現別人的事業,還是自己的事業。”
windows和unix的文化的本質的區別
看過很多關於Unix/Linux和Window之爭的文章。即使是我這麼偏愛Unix/Linux的人,都會覺得那些文章中的絕大多數太過偏激,要麼把Windows貶得一無是處,要麼把Windows美化得白璧無瑕。
我的工作不是windows程式設計,我也很不喜歡Windows程式設計,可我的日常工作生活仍然離不開Windows。即使像我這樣的程式師,讓我在Linux/Unix下配置一台印表機,或者安裝一個音效卡,也是讓我頭疼的事情。Windows之所以如此流行,決不是偶然,有它內在的深刻原因。Unix/Linux的設計很優美,實現也很優秀,但是為什麼在某些領域(尤其是桌面系統)幹不過Windows?Unix/Linux社區的人對自己的技術水準一向非常自負,為什麼十多年過去了還沒能取Windows而代之?這些問題我回答不了,但我的直覺和唯物辯證法都告訴我,任何一個事物都有對立統一的兩個方面,Windows也有它的優點,Unix/Linux也有它不盡人意的地方。
最近看《Joel on Software》專欄,發現這個專欄作者發佈在2003年年底的一篇文,把這個問題講得一清二楚,態度公允,分析深入,值得一讀,對系統設計來說也很有指導意義。為了給自己加深印象,節選其中一部分翻譯,做筆記。
Unix和Windows從功能上看越來越相似,剩下的不同僅僅是文化差異。舉個例子:我們都要吃東西。大洋彼岸的人們用筷子,吃生魚片就米飯;但我們用手拿著麵包,就著牛肉吃。文化差異並不意味著美國人消化不了生魚片,或者日本人消化不了麥當勞的漢堡;實際上美國很多人吃生魚片,日本也有很多人吃漢堡包。但文化差異確實意味著,一個美國人第一次踏上東京的土地時,總會覺得這地方怪裡怪氣。儘管哲學上講,所有的人本質相同,都會戀愛工作唱歌死亡,美國人和日本人仍然很難適應對方國家的廁所佈局。
Unix和Windows程式師的文化差異是什麼呢?我們暫且不細說這裡面的細枝末節,最重要的一點差異是:Unix文化重視那些對程式師有用的代碼,Windows文化重視那些對非程式師有用的代碼。這麼說有點簡化,但最大的區別的確就是這一點:我們是為其他程式師設計程式,還是為最終使用者設計程式?此外的任何問題都是對這個問題的注腳。
20世紀60年代末,Unix剛剛誕生,Unix社區的核心文化正在形成,當時的電腦沒有“最終使用者”。那時的電腦,以及電腦的CPU時間,都很昂貴,都僅僅用在很專業的學術領域。“學習電腦”就意味著“學習程式設計”,而不是像現在這樣,“學習使用應用軟體”也是“學習電腦”的一種方式。作為現代的最終用戶,你可能根本不會程式設計,而仍然能用電腦做許多事情。但上世紀60年代末,尤其對Unix社區來說,“用電腦”就是“程式設計”。Windows被製作出來的時候,唯一的目標是出售盡可能多的拷貝,以贏得更多利潤。“每家的每張桌子上都有一台安裝了Windows的電腦”是Windows開發小組的理想,這一理想為windows設定了核心價值觀:對最終用戶來說更容易使用,但顯然,絕大多數最終用戶不是程式師。Windows開發過程並沒有把“方便其他程式師”作為目標。
例如,Unix的一個重要原則就是“清晰區分策略和機制”。該原則源於X系統的設計。(虎注:X為Unix系統上的圖形化使用者介面的基礎設施,其設計者明確提出,X實現的“是機制,不是策略”——X是一個通用圖形引擎,使用者介面風格的選擇,應該是toolkit以及系統中另外一些級別上的決策。策略和機制都會有演進,但是他們變化的速度不同:策略的變化一般比較快,基本機制的變化則比較慢。圖形化使用者介面的風格經常變動,但是用於顯示使用者介面的基本光柵操作——比如在螢幕上畫點/畫線——則沒有太多變動餘地。)“清晰區分策略和機制”這一Unix文化中的基本原則導致了Unix上圖形化使用者介面風格的多樣性。Unix世界裡從未就使用者介面工作方式的全部細節達成一致,並且他們認為這沒什麼不對的,Unix文化並且還尊重這種多樣性。但是對一般的最終用戶來說,在兩個應用程式中,應該能用相同的操作(點擊相同的按鈕或者功能表/快速鍵)達到相同的目的,這樣的系統上的應用程式才是易學易用的。也正是由於上述區別,雖然Unix開發者為給Unix做一個漂亮的使用者介面已經努力了二十年,我們還是看到最大的Linux廠商的CEO告訴大家:“家庭用戶還是用windows好了”。
Linux沒准永遠都不會成為一個好的桌面作業系統,因為Unix文化所看重的那些東西本身,就妨礙了Linux成為一個面向最終使用者的桌面系統。OS/X就是一個例證:Apple終於創造出了面向最終用戶的Unix,唯一的原因是,Apple的工程師和領導者都堅定地以最終用戶為核心,而完全放棄了Unix文化中最基本的“以程式師為核心”的理念。他們甚至把Unix的核心目錄改名了——“bin”和”lib”變成了對一般用戶來說更通俗易懂的”application”和”library”。
我的工作不是windows程式設計,我也很不喜歡Windows程式設計,可我的日常工作生活仍然離不開Windows。即使像我這樣的程式師,讓我在Linux/Unix下配置一台印表機,或者安裝一個音效卡,也是讓我頭疼的事情。Windows之所以如此流行,決不是偶然,有它內在的深刻原因。Unix/Linux的設計很優美,實現也很優秀,但是為什麼在某些領域(尤其是桌面系統)幹不過Windows?Unix/Linux社區的人對自己的技術水準一向非常自負,為什麼十多年過去了還沒能取Windows而代之?這些問題我回答不了,但我的直覺和唯物辯證法都告訴我,任何一個事物都有對立統一的兩個方面,Windows也有它的優點,Unix/Linux也有它不盡人意的地方。
最近看《Joel on Software》專欄,發現這個專欄作者發佈在2003年年底的一篇文,把這個問題講得一清二楚,態度公允,分析深入,值得一讀,對系統設計來說也很有指導意義。為了給自己加深印象,節選其中一部分翻譯,做筆記。
Unix和Windows從功能上看越來越相似,剩下的不同僅僅是文化差異。舉個例子:我們都要吃東西。大洋彼岸的人們用筷子,吃生魚片就米飯;但我們用手拿著麵包,就著牛肉吃。文化差異並不意味著美國人消化不了生魚片,或者日本人消化不了麥當勞的漢堡;實際上美國很多人吃生魚片,日本也有很多人吃漢堡包。但文化差異確實意味著,一個美國人第一次踏上東京的土地時,總會覺得這地方怪裡怪氣。儘管哲學上講,所有的人本質相同,都會戀愛工作唱歌死亡,美國人和日本人仍然很難適應對方國家的廁所佈局。
Unix和Windows程式師的文化差異是什麼呢?我們暫且不細說這裡面的細枝末節,最重要的一點差異是:Unix文化重視那些對程式師有用的代碼,Windows文化重視那些對非程式師有用的代碼。這麼說有點簡化,但最大的區別的確就是這一點:我們是為其他程式師設計程式,還是為最終使用者設計程式?此外的任何問題都是對這個問題的注腳。
20世紀60年代末,Unix剛剛誕生,Unix社區的核心文化正在形成,當時的電腦沒有“最終使用者”。那時的電腦,以及電腦的CPU時間,都很昂貴,都僅僅用在很專業的學術領域。“學習電腦”就意味著“學習程式設計”,而不是像現在這樣,“學習使用應用軟體”也是“學習電腦”的一種方式。作為現代的最終用戶,你可能根本不會程式設計,而仍然能用電腦做許多事情。但上世紀60年代末,尤其對Unix社區來說,“用電腦”就是“程式設計”。Windows被製作出來的時候,唯一的目標是出售盡可能多的拷貝,以贏得更多利潤。“每家的每張桌子上都有一台安裝了Windows的電腦”是Windows開發小組的理想,這一理想為windows設定了核心價值觀:對最終用戶來說更容易使用,但顯然,絕大多數最終用戶不是程式師。Windows開發過程並沒有把“方便其他程式師”作為目標。
例如,Unix的一個重要原則就是“清晰區分策略和機制”。該原則源於X系統的設計。(虎注:X為Unix系統上的圖形化使用者介面的基礎設施,其設計者明確提出,X實現的“是機制,不是策略”——X是一個通用圖形引擎,使用者介面風格的選擇,應該是toolkit以及系統中另外一些級別上的決策。策略和機制都會有演進,但是他們變化的速度不同:策略的變化一般比較快,基本機制的變化則比較慢。圖形化使用者介面的風格經常變動,但是用於顯示使用者介面的基本光柵操作——比如在螢幕上畫點/畫線——則沒有太多變動餘地。)“清晰區分策略和機制”這一Unix文化中的基本原則導致了Unix上圖形化使用者介面風格的多樣性。Unix世界裡從未就使用者介面工作方式的全部細節達成一致,並且他們認為這沒什麼不對的,Unix文化並且還尊重這種多樣性。但是對一般的最終用戶來說,在兩個應用程式中,應該能用相同的操作(點擊相同的按鈕或者功能表/快速鍵)達到相同的目的,這樣的系統上的應用程式才是易學易用的。也正是由於上述區別,雖然Unix開發者為給Unix做一個漂亮的使用者介面已經努力了二十年,我們還是看到最大的Linux廠商的CEO告訴大家:“家庭用戶還是用windows好了”。
Linux沒准永遠都不會成為一個好的桌面作業系統,因為Unix文化所看重的那些東西本身,就妨礙了Linux成為一個面向最終使用者的桌面系統。OS/X就是一個例證:Apple終於創造出了面向最終用戶的Unix,唯一的原因是,Apple的工程師和領導者都堅定地以最終用戶為核心,而完全放棄了Unix文化中最基本的“以程式師為核心”的理念。他們甚至把Unix的核心目錄改名了——“bin”和”lib”變成了對一般用戶來說更通俗易懂的”application”和”library”。
Unix和Windows程式師的文化差異+Mac
到目前為止,Windows和Unix在功能上的相似之處比不同的要多。他們都支援同樣的主流程式作法(由命令列到圖型介面到web伺服器);他們所依循的系統資源基本是完全一樣的,比如幾乎完全相同的檔案系統、記憶體、sockets,還有行程和執行緒等等。兩套作業系統的核心服務,還有開發者能寫的應用程式類型也沒多大的差別。
剩下的就是文化差異。沒錯,我們全都要吃東西,不過海那邊的人是用木筷子吃生魚片加米飯,而我們在這裡則是用手拿著麵包夾大塊碎牛肉在吃。文化差異並不表示美國人的胃不能消化壽司,或是說日本人不能消化大麥克漢堡;也不表示吃壽司的美國人或吃漢堡的日本人很少;文化差異指的是美國人第一次去東京下飛機時所面對,「這地方真奇怪又該死」那種無法承受的感覺。至於什麼「我們其實都是一樣的,我們都有愛,也都會工作歡唱及死亡,將會克服美國人和日本人永遠無法真正對對方的廁所安排感到自在。」這種空話根本連想都不會想。
Unix和Windows程式師的文化差異是什麼呢?細微的地方很多,不過有一項最明顯:Unix文化重視對其他程式師有用的程式,而Windows文化重視對非程式師有用的程式。
這當然是主要的簡化說法,不過事實上確還是個很重大的差異:我們寫程式究竟是為程式師還是為了一般使用者?除了這個問題之外其他的都只是詮釋。
時常大發議論的Eric S. Raymond剛寫了一本有關Unix程式設計的巨作The Art of UNIX Programming,極其深入地探索他自己的文化。你可以去買這本書的紙本來看。如果你覺得Raymond的想法太過激進(anti-idiotarian)而不想付錢給他,還可以在線上免費閱讀,保證作者的心血絕對不會收到一分錢。
讓我們來看個小例子。Unix的程式文化格外重視可由命令列呼叫的程式,這種程式可以用參數控制各種動作,其輸出可以擷取成一般機器可讀的純文字格弋。這種程式之所以會被重視式,是因為可以讓其他程式師輕易地整合進別的程式或較大的軟體系統中。舉個很小的例子,Unix文化中有一個Raymond稱之為「沈默是金」的核心價值,是說當程式成功地完成你所交付的事時應該不要有任何輸出。不管是在命令列輸入300個字元的命令建立檔案系統,還是建立並安裝了一套複雜的軟體,或是把載人火箭送到月球,全部都一樣。只要成功執行就不要有任何輸出。使用者看到下一個命令列提示就會推論一切正常。
由於你是為其他程式師寫程式,所以這才會是Unix文化的重要價值。就如同Raymond所說的:「喋喋不休的程式不太能和其他程式好好合作。」 相較之下在Windows文化中是為張阿姨而寫程式的,而張阿姨搞不清楚程式是因為執行成功而沒有任何輸出,還是因為出錯了所以無法顯示任何訊息,或是因為誤解你的要求而沒有輸出。
同樣的狀況,Unix文化欣賞保持文字介面的程式。他們不是很喜歡圖型介面,不過在純文字介面程式上漂亮地塗一層GUI口紅可以例外,另外他們也不喜歡二位元檔案格式。因為文字介面比較好用程式控制,而圖型介面除非提供其他機制(如內建腳本語言),否則幾乎不可能用程式控制。我們在這裡又再次看到,Unix文化重視有助於其他程式師的程式,而這一點很少會是Windows程式設計的目標。
這並不是說所有的Unix程式都只是為了程式師而設計的。這樣說太偏頗了。不過這個文化重視對程式師有用的東西,而這可以解釋很多很多的事情。
假設你找了一個Unix程式師和一個Windows程式師來,要他們分別寫同一隻針對一般使用者的應用程式。Unix程式師會先建立一個由命令列或文字介面驅動的核心,通常事後才寫一個圖型介面來呼叫核心。這樣子應用程式的主要功能都可以讓其他程式師使用,他們可以用命令列呼叫程式並把結果以文字方式讀入。而Windows程式師會傾向先由圖型介面開始,通常事後才加上腳本語言讓圖型介面的操作自動化。對一個99.999%使用者完全不寫程式(也不打算學寫)的文化來說,這是很正常的。
在Windows程式師中有個主要針對其他程式師寫程式的重要團隊,就是微軟內部的Windows團隊本身。他們做事的方法通常是建立一個可以由C語言呼叫的API,在API裡實作出功能,然後再撰寫圖型介面程式來呼叫API。所有用Windows使用介面能做的事,全都可以用任何合理的程式語言呼叫某個程式介面做到。舉例來說,微軟的Internet Explorer本身只不過是一個89 KB的小程式,裡麵包裝了數十個可供程式老手免費使用,功能強大又有彈性的的元件。問題是程式師無法接觸到這些元件的原始碼,所以只能完全依照微軟內元件開發者所預見並允許的方式使用,而這種作法並不是每次都行得通。有些問題因為缺乏API原始碼,以致於難以甚至無法追查,這時通常就怪罪到呼叫API的人身上。Unix具有公開原始碼的文化價值,使它成為更容易開發的環境。每個Windows平臺的開發者都會告訴你,某一次花了四天去查一個問題,原因只是他們認為LocalSize傳回的記憶體大小應該和原先呼叫LocalAlloc時用的值一樣,或是其他有程式庫原始碼就能在十分鐘內搞定的問題。Raymond創作了一個有趣的故事,說明這個曾經用過無原始碼程式庫都會同意的道理。
所以你看到這些宗教性的論點了。因為可以進入程式庫除錯所以Unix比較好。因為張阿姨可以看到提示確認她的電子郵件真的送出去了,所以Windows比較好。事實上沒有誰比誰更好,他們只是擁有的價值不同:Unix的核心價值是製作有助於其他程式師的東西,而Windows則把製作有助於張阿姨的事視作核心價值。
讓我們來看看另一個文化差異。Raymond說「典型的Unix檔會寫得簡潔而完整…這種風格假設讀者夠積極,可以推導未寫出的推論,並且有自信信任這些推導。小心的閱讀每一個字,因為一件事很少會講兩遍。」天啊,我認為他其實是在教年輕的程式師寫出更不人性的man說明文件。
這對一般使用者而言是絕對行不通的。雖然Raymond可能說這是「過於簡化的屈就」,不過Windows文化瞭解一般使用者不讀檔,即使不得不看也是愈少愈好,因此你必須不斷重複的解釋… 事實上在良好的Windows說明檔中,必須每個主題都能讓一般讀者直接看懂,不必先看懂其他任何的說明主題。
怎麼會出現不同的核心價值呢?這是Raymond的書另一個出色之處:他深入Unix的歷史和演進,讓新程式師熟悉回溯至1969年起累積的歷史。在Unix被創造出來及其文化價值成形的時候,一般使用者並不存在。電腦很貴CPU時間也很貴,學電腦就等於是學寫程式。無怪會蘊釀出重視有助於其他程式師的文化。相較之下Windows的創造只有一個目標:儘量賣更多套以獲得更多利潤,成億上兆套的賣。「每個家庭每個桌上都有一台電腦」就是創造Windows的明確目標,並且設定了它的議題也決定它的核心價值。讓非程式師容易使用,是進駐每個桌面和家庭的唯一方法。因此使用性自然淩駕其他東西而成為文化的基準。對這樣的文化而言,程式師是極其次要的對象。
文化的裂縫是如此的明確,所以Unix從未真正的進入桌面。張阿姨不會真的去用Unix。不斷有人努力幫Unix製作漂亮的外殼,希望讓張阿姨能用Unix,不過全都失敗了。因此這些程式師都深陷在Unix文化中。舉例來說,Unix有一個源自於X設計者的價值:策略與機制分離。這種想法直接導致使用介面的分裂;桌面使用介面運作的細節並沒有大家一致同意的做法,由於這些設計者的文化重視這種差異,所以他們就認為這種作法可以用。不過對張阿姨來說,在不同程式裡剪貼得用不同的使用介面,絕對是行不通的。所以這就是現在的狀況,Unix開發者20年前開始嘗試在系統表面塗上一層漂亮的使用介面,結果到今天最大Linux廠商的執行長還告訴大家,家庭用戶應該直接用Windows就可以了。我曾經聽過有經濟學家宣稱,說矽穀永遠不可能在其他地方(比如說法國好了)重現,因為法國文化對於失敗的懲罰太重,以致企業家不願意冒險。或許Linux也有相同的狀況:Linux可能永遠都不會成為桌面的作業系統,因為它重視一些會阻礙這件事的價值。OS X就是一個證明:蘋果終於創造了給張阿姨用的Unix,不過原因並不光是因為蘋果的工程師和經理堅持針對一般使用者的文化(我獨斷地稱之為「Windows文化」,雖然這從歷史來看是源於蘋果),他們還拒絕了Unix文化中以程式師為中心的基本思想。甚至把核心目錄的名字改掉了(多麼違反傳統!),用常見的英文單字”applications”和”library”代替”bin”和”lib”。
Raymond真的嘗試比較Unix與其他作業系統並突顯之間的差異,不過這卻也是這本好書中最弱的部份,因為他真的不知道自己在講什麼。當他談論Windows時常會顯露他對Windows程式設計的知識多是由報紙讀來,並非來自真正的Windows程式設計經驗。這沒什麼關係:他並不是Windows程式師,而這一點我們可以體諒。不過他身為對一個文化有深厚瞭解的典型,知道該文化所重視的價值,卻沒有注意該文化中針對一般人部份(殺老太太跟當機:一定是不好的),與針對程式師部份(吃生魚片和命令列參數:因對象而不同)的差異。
有太多的單文化程式師,他們就像從未離開過家鄉的典型美國小孩,說不出來文化價值和人類核心價值間的差異。我遇過太多嘲笑Windows程式設計的Unix程式師,他們認為Windows野蠻又愚蠢。Raymond經常落入未考慮原由就輕視其他文化的陷阱。在Windows程式師中很少會發現這種頑固份子,因為Windows程式師大體上都是以解決方案為準而非意識型態的。至少Windows程式師會承認他們文化的缺陷,然後很實務地說:「看,如果你想把文書處理程式賣給很多人,就得能在他們的機器上執行。如果得用邪惡的registry代替優雅的~/.rc檔儲存設定才能辦到,就這樣做吧。」現在Unix世界充滿自以為是的文化優越擁護者和slashdot的灌水教派(karma-whoring
sectarianism),而Windows世界比較實務(我畢竟得在這裡討生活嘛)。這種現狀源於Unix文化感覺自己被圍攻,無法突破伺服器和愛好者小眾市場進入主流桌面市場。這種弱勢的傲慢正是The
Art of UNIX Programming最大的缺點,不過倒也並不是如此嚴重,整體而言這本書充滿了非常有趣的洞見,內容泛及各種程式設計主題,以致我願意閉住呼吸忍受偶而出現的意識型態高論,因為在其他部份可以學到太多一般性的觀念了。事實上我會把這查書推薦給任何平臺任何文化和任何目標的開發者,因為裡面有大多價值是普世通用的。Raymond指出CSV格式不如/etc/passwd格式時,他嘗試由Unix而非Windows觀點去評價,不過你知道嗎?他是對的。/etc/passwd
比CSV容易分析,如果你讀了這本書就會知道為什麼,而且也會成為更好的程式師。
訂閱:
文章 (Atom)