Sunday, November 27, 2005
軟體管理書目
Joel Spolsky列出了一些他為公司訓練軟體管理課程的書目
主要有三種:商務書籍、軟體管理書籍、軟體或公司企業的歷史
總共有77本(他在網頁上說是75本,應該是算錯了)
訓練三年,每兩個禮拜就要看完一本的樣子,實在是很...嚴酷的訓練
這些書我幾乎都沒看過,給大家參考一下
- The Mythical Man-Month: Essays on Software Engineering, 20th Anniversary Edition
- Don't Make Me Think: A Common Sense Approach to Web Usability
- Growing a Business
- Dec Is Dead, Long Live Dec: The Lasting Legacy of Digital Equipment Corporation
- Applied Cryptography: Protocols, Algorithms, and Source Code in C
- Philip and Alex's Guide to Web Publishing
- Testing Computer Software
- Design for Community: The Art of Connecting Real People in Virtual Places
- Version Control with Subversion
- The Non-Designer's Design Book
- The Pragmatic Programmer: From Journeyman to Master
- Measuring and Managing Performance in Organizations
- Facts and Fallacies of Software Engineering
- The Autodesk File: Bits of History, Words of Experience
- Hackers and Painters: Big Ideas from the Computer Age
- Competing On Internet Time: Lessons From Netscape And Its Battle With Microsoft
- The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity
- The Design of Everyday Things
- The Difference Between God and Larry Ellison: *God Doesn't Think He's Larry Ellison
- Breaking Windows: How Bill Gates Fumbled the Future of Microsoft
- Just for Fun: The Story of an Accidental Revolutionary
- On a Roll: From Hot Dog Buns to High-Tech Billions
- First $20 Million Is Always the Hardest:, The: A Silicon Valley Novel
- Random Excess
- Show Stopper! The Breakneck Race To Create Windows NT And The Next Generation at Microsoft
- The Leap: A Memoir of Love and Madness in the Internet Gold Rush
- Digital Hustlers: Living Large and Falling Hard in Silicon Alley
- In Search of Stupidity: Over 20 Years of High-Tech Marketing Disasters
- Startup: A Silicon Valley Adventure
- Peopleware: Productive Projects and Teams
- The Macintosh Way
- Microsoft Rebooted: How Bill Gates and Steve Ballmer Reinvented Their Company
- Speeding the Net: This Inside Story of Netscape and How It Challenged Microsoft
- aol.com: How Steve Case Beat Bill Gates, Nailed the Nethead, and Made Millions in the War for the Web
- dot.bomb: My Days and Nights at an Internet Goliath
- The New New Thing: A Silicon Valley Story
- Burn Rate: How I Survived the Gold Rush Years on the Internet
- Accidental Empires
- Revolution in The Valley
- The Anatomy of Buzz: How to Create Word of Mouth Marketing
- Death March
- Secrets of Consulting: A Guide to Giving and Getting Advice Successfully
- Rules For Revolutionaries: The Capitalist Manifesto for Creating and Marketing New Products and Services
- Positioning: The Battle for Your Mind
- The Manager Pool: Patterns for Radical Leadership
- Ben & Jerry's: The Inside Scoop : How Two Real Guys Built a Business with a Social Conscience and a Sense of Humor
- The 22 Immutable Laws of Marketing : Exposed and Explained by the World's Two
- The Goal
- Critical Chain
- Microserfs
- The Product Marketing Handbook for Software
- Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency
- The Art of the Start: The Time-Tested, Battle-Hardened Guide for Anyone Starting Anything
- The Business of Software: What Every Manager, Programmer, and Entrepreneur Must Know to Thrive and Survive in Good Times and Bad
- A Random Walk Down Wall Street
- 21 Dog Years: A Cube Dweller's Tale
- Inside Intuit: How the Makers of Quicken Beat Microsoft and Revolutionized an Entire Industry
- Direct from Dell: Strategies that Revolutionized an Industry
- Making the Technical Sale
- Selling Air
- Crossing the Chasm
- Four Days with Dr. Deming: A Strategy for Modern Methods of Management
- Amazonia
- The PayPal Wars; Battles with eBay, the Media, the Mafia, and the Rest of Planet Earth
- The Search: How Google and Its Rivals Rewrote the Rules of Business and Transformed Our Culture
- The Tipping Point: How Little Things Can Make a Big Difference
- The Fall of Advertising and the Rise of PR
- High St@kes, No Prisoners
- The E-Myth Revisited
- The One Minute Manager
- Getting to Yes
- Essentials of Accounting
- Influence
- Geeks: How Two Lost Boys Rode the Internet Out of Idaho
- The Portable MBA
- The Little Red Book of Selling
- How to Win Friends and Influence People
Wednesday, November 23, 2005
AOS Exercise 1
用pipe()
與dup()
寫出 ps aux | grep ghhwang | wc > foo
的效果
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #define READ 0 #define WRITE 1 #define STDIN 0 #define STDOUT 1 int main() { int pid_1, pid_2, pid_3, pfd_1[2], pfd_2[2], fd; pipe(pfd_1); pipe(pfd_2); if( (pid_1 = fork()) != 0 ) { if( (pid_2 = fork()) != 0 ) { if( (pid_3 = fork()) != 0 ) { close(pfd_1[READ]); close(pfd_1[WRITE]); close(pfd_2[READ]); close(pfd_2[WRITE]); wait((int *)0); wait((int *)0); wait((int *)0); } else { close(STDIN); dup(pfd_2[READ]); close(pfd_1[READ]); close(pfd_1[WRITE]); close(pfd_2[READ]); close(pfd_2[WRITE]); fd = open("foo", O_WRONLY | O_CREAT, S_IREAD | S_IWRITE); close(STDOUT); dup(fd); close(fd); execl("/bin/wc", "wc", (char *)NULL); } } else { close(STDIN); close(STDOUT); dup(pfd_1[READ]); dup(pfd_2[WRITE]); close(pfd_1[READ]); close(pfd_1[WRITE]); close(pfd_2[READ]); close(pfd_2[WRITE]); execl("/bin/grep", "grep", "ghhwang", (char *)NULL); } } else { close(STDOUT); dup(pfd_1[WRITE]); close(pfd_1[READ]); close(pfd_1[WRITE]); close(pfd_2[READ]); close(pfd_2[WRITE]); execl("/bin/ps", "ps", "aux", (char *)NULL); } exit(0); }
Commons4E
今天玩了一下JiaYun寫的Commons4E
發現還蠻方便的
所以在這邊分享一下使用的情形
準備
先去抓Jakarta Commons Lang(只需要lang-current.zip這個檔
),加到你Eclipse的project build path中,
其使用方法可以看jini所寫的這篇
再安裝Commons4E這個plugin
使用
先寫一個Dog類別
由於沒有override equals()
這個method
所以會得到false
Commons4E的使用
只要在類別或是程式碼中按右鍵
點選Commons4E Lang→Generate Equals and HashCode...
就會出現下面的視窗
就會產生相對應的code
並成功地實作出equals()
與hashCode()
這兩個原本很麻煩的method
備註
另外這個plugin還可以產生toString()
跟compareTo()
使用的方式也差不多
大家可以自己試試看囉 :)
Thursday, November 17, 2005
AOP之我見
前言
AOP就是Aspect Oriented Programming,有人把它翻作「面向導向程式設計」,是一種新的程式設計方法。雖然目前AOP的發展還沒有完全成熟,相關的理論與技術也是鮮為人知,不過某些AO的基本概念早就已經進入主流領域中,而開始漸漸被大家所注意。
從軟體設計演化史看AOP
AOP之所以會出現,必定是有一段歷史的。
程式語言的演化是從機器語言(machine-level language)、程序性程式設計(procedural programming)、物件導向程式設計(object oriented programming)到現在的AOP。到底是為什麼會這樣演化的呢?
根據我自己認為,在機器語言演化到程序性語言的過程,是因為那些使用機器語言的程式設計師想到了他們可以運用數學函數的概念,把一些為了做某件事而相關的敘述擺在同一個函式中,再對函式進行叫用,藉以達成了功能的抽象化。
後 來這些寫程序性語言的程式設計師在不滿足之餘,發現到了他們居然可以將現實生活中,物件的概念應用到原來的程序性語言,對它進行物件抽象化。像是他們只看 得到電視機的外殼和一些訊號輸入裝置、按鈕,卻看不到其內部的電路板與陰極放射管,於是乎產生了資料封裝和介面的概念;他們看到了自己跟自己的父母、阿公 阿媽、外公外婆之間好像有著某種程度的相似關係,但彼此間卻又不完全一樣,瞭解到了長江後浪是要去推前浪的,而有了繼承的想法;當然其它像是以訊息傳遞、 多型等物件導向的特性也同時一併結合起來,為程式語言提供強大、有彈性的性質,進而讓物件導向程式設計成為當今程式設計領域中的主要潮流。
而 當這些物件導向程式設計師開始建構越來越大、越來越複雜的系統、搞出了一堆有的沒的設計模式後,發現了原來軟體系統中有許多功能是零碎地散佈在其它功能之 間;某些功能又是為了提供一些附屬的服務而必須加入許多與該功能無關的程式碼進去而顯得雜亂。因為這些發現,造成了這些人很大的困擾,讓他們很難進行開 發、維護、擴充、以及再利用,原因即是在於既有物件導向的特性並沒有辦法以很好的方式去解決這種現象,迫使他們必須要以各種骯髒手法來處理這些問題。於是 這些被弄得很難過的其中某些高手就想出了AOP這個厲害的新型軟體設計方法來進行考量(concern)的抽象化。
AOP的目標與概念
軟體系統的設計會包含許多的考量(concern)。所謂的考量,就是為了滿足整體系統目標的一個特定需求。遠在七零年代,就有人認為若是想把一個軟體系統搞得好,就必須要將功能分離(separation of concerns,SOC),也就是所謂模組化的概念。這個概念並不算新,但是說起來容易;做起來難。
某些介紹AOP的書上對SOC的概念有個較為具體的詮釋,就是把系統的需求當做一道自然光束,當這道光透過一個能夠區分功能的三稜鏡後,發散出來的每一種不同波長、不同顏色的小光束就是代表系統中某個維度被分離出來的一種功能。當然,這是一個簡化後的比喻。
回到現實,我們設計一套軟體系統,最重要的就是它的主要功能(core concern),不管是早期的程序性語言或是物件導向語言都是為此目標發展的。然而橫跨系統中多個模組的共通功能(crosscutting concern)則是AOP想要處理的目標。
我再用另外一種方式來描述AOP。物件導向語言中的物件可以儲存資料,也提供了處理這些資料的方法、動作,就像是一般自然語言中的名詞與動詞。而AOP則是在現有物件的資料、方法上增加特性,這就有點類似自然語言中的形容詞與副詞了。所以物件導向技術再加上面向導向技術所提供的,就會是一個更完整的解決方式。
AOP對軟體設計的影響
AOP是基於SOC這種分離功能的概念而發展的產物,但我認為此種想法,通常會是在較為大型、或是十分複雜的系統中才有實行的必要,不然感覺上就像是用牛刀來殺雞般不切實際。
我們會因為多了此種實作共通功能的考量,導致在系統分析、設計的思維都必須與傳統物件導向或程序導向的思維不同,需要好好地洗腦一下。
現實的情況應該是許多從C語言此種程序性語言開始學習的人,還是把像是C++、Java這類物件導向語言拿來當作程序性語言來寫,完全沒有將分析設計的方法、概念轉換過來。
物件導向程式設計有一套OOAD流程,而現在多了一個AOP的概念,想必花在分析、設計的時間與精力又要比原來更多、更困難。
AOP的分析設計大致上分為三項:aspectual decomposition(面向分割)、concern implementation(功能實作)以及aspectual recomposition(面向重組)。而又因為AOP要解決的共通功能,理所當然是要應用在主要功能之上。所以原來的物件導向分析設計一樣也不能少,還必須想辦法在原本的設計流程中加入上面的三個面向的考量,必須要調整原有的使用案例、也不能光用標準的UML來表達系統架構,而要另外找一個方式來表達面向(aspect),就連許多現存設計模式的實作,也與之前大不相同。
目前就有一些探討AOP、AOSD的書籍、文章開始像雨後春筍般大量產生。就連物件導向三巨頭之一的Jacobson也參一腳出了一本。有趣的是他在書中提到,現在所謂AOP的概念,早在1985年他為他自己博士論文的未來目標所寫的一篇論文中有提到,只不過當時連物件的概念都還沒有盛行,引不起大家的注意,所以這項研究也沒有繼續下去。後來AOP在1997年正式出現時,他也有注意到,但由於他那時正忙著設計UML與RUP,導致於錯失了一個成為AOP之父的機會,真的是蠻可惜的,不過對他來說應該也沒有差吧。
最後,AOP不會取代物件導向程式設計或程序性設計,也就是說良好的AO設計必定是要建構在良好的物件導向設計、程序性設計之上,不然仍無法對系統的實作產生任何助益。
以下是從書上摘要出來的AOP優缺點:
AOP的優點
- 單一模組的責任更簡單
- 更好的模組化
- 系統更容易發展
- 設計上更有彈性
- 程式的重利用率更高
- 加快開發
- 減少實作成本
AOP的缺點
- 更難掌握程式執行的流程
- 破壞封裝
結論
AOP會是解決軟體開發問題的一顆銀彈嗎?
我覺得不會,它跟物件導向程式設計一樣,解決的是軟體開發中的附屬性問題,雖然它跟物件導向程式設計結合的威力是前所未見的,但是要如何進行AOSD?如何辨識出不同的面向?該怎麼樣正確地決定到底是要用類別、還是面向?都還是有待研究的。所以我想它跟物件導向程式設計一樣是顆銅彈吧。
AOP對一般的程式設計師來說,是個更高難度的轉換、更痛苦的開端。
不過從另一個角度來想,現在會去玩AOP的應該也不會是一般平庸的程式設計師,所以讓它順其自然地發展,等時機慢慢成熟,可能就會在不久的將來改變軟體界。
參考資料
- Ivar Jacobson and Pan-Wei Ng, Aspect-Oriented Software Development with Use Cases, Addison Wesley 2005, ISBN: 032126881
- Ramnivas Laddad, AspectJ in Action - Practical Aspect-Oriented Programming, Manning 2003, ISBN: 1930110936
- Gregor Kiczales and Mira Mezini, Separation of Concerns with Procedures, Annotations, Advice and Pointcuts, Proceedings of ECOOP'05
- Gregor Kiczales and Mira Mezini, Aspect-Oriented Programming and Modular Reasoning, Proceedings of ICSE'05
- Jan Hannemann and Gregor Kiczales, Design Pattern Implementations in Java and AspectJ, Proceedings of OOPSLA 2002
- Boris Bachmendo and Rainer Unland, Aspect-Based Workflow Evolution
- Anis Charfi and Mira Mezini, Application of Aspect-Oriented Programming to Workflows: The case of Web Service Composition with AO4BPEL
Tuesday, November 15, 2005
94年10月29日「LTTC全民英檢」中高級初試
我閱讀拿94;聽力才拿69 >.< (都要80分才合格...)
比我聽到周杰倫拿到金馬獎的時候還要百感交集阿...
不過反正我就算過了也不會有時間準備複試
所以也沒有太在意啦...(為自己的失敗找理由)
看來要常常聽一些podcast來加強聽力了!
Monday, November 14, 2005
Head First OO
在JavaRanch上亂逛無意間發現的消息
那就是下一本可能會出現的Head First系列
(繼Head First HTML with CSS & XHTML還有Head Rush Ajax之後吧)
如果你想要考一下SCJA卻不知道裡面會用到什麼UML diagram(考試範圍看起來爆大...)
或是完全不知道UML是啥麼的話
裡頭有一份Head First style的UML簡單介紹: UML for the Java Associate
看起來像是這本書的第一章
果然class diagram還是讓人了解OO比較快的方法
Sunday, November 06, 2005
用Subclipse+OpenSVN管理程式碼
如果你跟我一樣在家裡寫一寫程式就要帶到學校寫
然後跑到學校寫一寫又要帶回家寫
又可能要自己寫一寫後給別人寫
然後別人寫一寫後又自己要拿來寫...
在這麼錯綜複雜的狀況之下
鬼才會弄得懂現在的程式到底是那個版本
沒關係,我最近找到一種方便的solution啦~
不用離開心愛的eclipse來import來export去
也不用架一個不知道要架在哪裡好的server
只要使用Subclipse+OpenSVN就好囉
安裝Subclipse plugin(以eclipse 3.1為例)
(原站圖文說明:http://subclipse.tigris.org/install.html)- 到Help→Software Updates→Find and Install...→Search for new features to install→New Remote Site...
- Name:Subclipse
URL:http://subclipse.tigris.org/update - 勾起來按Next安裝
去OpenSVN申請帳號
(我目前只有找到OpenSVN是free的...)- 連到:https://opensvn.csie.org/
- 輸入資料確認後,去收E-mail,再用該Project名稱與密碼登入網站
- 點選"Access Control" tag
- 增加userid與password,這就是要在Subclipse中使用的帳號密碼
- 去收E-mail,記下account、password、repository location
使用Subclipse+OpenSVN
- 在eclipse開啟Subclipse Repository perspective,用剛剛記下的資料加入SVN repository
- 匯出:在Java perspective,在自己專案名稱上按右鍵,選Team→Share Project...→SVN,一直到把專案匯到OpenSVN去
- 匯入:在Subclipse Repository perspective上之前匯出的目錄按右鍵選Checkout As Project就可以匯出
- 其他更詳細的操作可以灌好Subclipse的eclipse help中找到
一些Subvision的參考資料
http://del.icio.us/swanky/subversion附註:關於0.9.37版的簡體中文問題,可以參考這篇
Wednesday, November 02, 2005
繼承關係中初始化的步驟
Father.java
public class Father { // 1 static int f1 = 1; // 2 int f2 = 1; // 3 static { System.out.println("Father static block"); } // 4 { System.out.println("Father non-static block"); } // 5 Father() { System.out.println("Father default constructor"); } // 6 Father(int i) { System.out.println("Father non-default constructor"); } }
Son.java
public class Son extends Father { // 7 static int s1 = 1; // 8 int s2 = 1; // 9 static { System.out.println("Son static block"); } // 10 { System.out.println("Son non-static block"); } // 11 public Son() { System.out.println("Son default constructor"); } // 12 public Son(int i) { System.out.println("Son non-default constructor"); } // 13 static void staticMethod() { System.out.println("Son static method"); } }
Test.java
public class Test { public static void main(String[] args) { // new Son(); // new Son(1); // Son.staticMethod(); } }分別執行Test類別的三個statement
new Son()
: 1→3→7→9→2→4→5→8→10→11- 初始Father的static成員(1, 3)
- 初始Son的static成員(7, 9)
- 初始Father的non-static成員(2, 4)
- 呼叫Father的default建構子(5)
- 初始Son的non-static成員(8, 10)
- 執行Son的建構子(11)
new Son(1)
: 1→3→7→9→2→4→5→8→10→12- 初始Father的static成員(1, 3)
- 初始Son的static成員(7, 9)
- 初始Father的non-static成員(2, 4)
- 呼叫Father的default建構子(5)
- 初始Son的non-static成員(8, 10)
- 執行Son的有參數建構子(12)
Son.staticMethod()
: 1→3→7→9→13- 初始Father的static成員(1, 3)
- 初始Son的static成員(7, 9)
- 執行Son的static方法(13)
另外可參考TIJ 3rd.中的
- Ch4. Static data initualization
- Ch6. Initialization with inheritance