星期日, 9月 30, 2007

不拘泥於招式

前幾天管電腦軟硬體的同事(以下簡稱管理員)和我說:
管理員:你上次買的server沒有電腦編號耶
鳥毅:為什麼
管理員:你用簽呈買,沒有填電腦申請單
鳥毅:你不能直接新增一台設備嗎
管理員:可以呀,只是在申請單那欄會變成空白
鳥毅: ...
對於硬體管理的重點,應該在於數量清點確實,而不是每樣東西都有申請單。事實上,申請單的意義並不大,只是一筆記錄。由於管理程式的缺失及歷史的遺毒,這個no key系統資料亂七八糟,若真的要求那麼多,為何不花時間整理一下DB呢?
在1990年,那時鳥毅用的FORTRAN 77不支援recursive,FORTRAN 90才支援。某日在寫河內塔時
FORTRAN 77的寫法

INTEGER N
WRITE (*,*) 'How many towers do you have ? '
READ *, N
CALL HANOI(N)
END

SUBROUTINE HANOI(N)
INTEGER N
CALL MOVE(N,'peg1','peg2','peg3')
RETURN
END

SUBROUTINE MOVE(N,FROM, AUX, TO)
INTEGER N
CHARACTER*4 FROM, AUX, TO

IF(N .EQ. 1) THEN
PRINT *,'Move disk 1 from ',FROM,' to ',TO
ELSE
CALL MOVE2(N-1,FROM, TO, AUX)
PRINT 10, 'Move disk ',N,' from ',FROM,' to ',TO
CALL MOVE2(N-1, AUX, FROM, TO)
END IF
10 FORMAT (1X,A10,I2,A6,3A4)
RETURN
END

SUBROUTINE MOVE2(N,FROM, AUX, TO)
INTEGER N
CHARACTER*4 FROM, AUX, TO
IF(N .EQ. 1) THEN
PRINT *,'Move disk 1 from ',FROM,' to ',TO
ELSE
CALL MOVE(N-1,FROM, TO, AUX)
PRINT 10, 'Move disk ',N,' from ',FROM,' to ',TO
CALL MOVE(N-1, AUX, FROM, TO)
END IF
10 FORMAT (1X,A10,I2,A6,3A4)
RETURN
END

FORTRAN 90的寫法(遞迴)

INTEGER N
WRITE (*,*) 'How many towers do you have ? '
READ *, N
CALL HANOI(N)
END

SUBROUTINE HANOI(N)
INTEGER N
CALL MOVE(N,'peg1','peg2','peg3')
RETURN
END

RECURSIVE SUBROUTINE MOVE(N,FROM, AUX, TO)
INTEGER N
CHARACTER*4 FROM, AUX, TO

IF(N .EQ. 1) THEN
PRINT *,'Move disk 1 from ',FROM,' to ',TO
ELSE
CALL MOVE(N-1,FROM, TO, AUX)
PRINT 10, 'Move disk ',N,' from ',FROM,' to ',TO
CALL MOVE(N-1, AUX, FROM, TO)
END IF
10 FORMAT (1X,A10,I2,A6,3A4)
RETURN
END

雖然程式碼重覆是bad pattern,But,so what?解決問題才是第一要務呀!

獨孤九劍最強之處就是遇強則強,無招勝有招才是最高境界,不要拘泥於招式。鳥毅之所以非常佩服同事VB超人的原因,不僅僅是他VB超強,而是他能夠將簡單的VB能夠呼叫系統API、與.Net結合,成為強大的武器。寫程式和做事都一樣,墨守成規者無法成為高手呀!

沒有留言: