軟體工程師的進化

毛慶禎

輔仁大學圖書資訊學系   

2001/05/10


電腦素養不夠, 怎麼學都少根筋 -- 其實不是你的錯

不知那來的傳說, 

請耐著性子看完, 最精彩的部份在結尾

軟體工程師

The Evolution of a Programmer(一個軟體工程師的進化)

  1. High School/Jr.High (高中生)

    10 PRINT "HELLO WORLD"
    20 END

  2. First year in College (大學一年級)

    program Hello(input, output)
    begin
    writeln('Hello World')
    end.

  3. Senior year in College (大學高年級)

    (defun hello
    (print
    (cons 'Hello (list 'World))))

  4. New professional (社會新鮮人)

    #include <stdio.h>
    void main(void)
    {
    char *message[] = {"Hello ", "World"};
    int i;


    for(i = 0; i < 2; ++i)
    printf("%s", message[i]);
    printf("\n");
    }

  5. Seasoned professional (老鳥)

    #include <iostream.h>
    #include <string.h>

    class string
    {
    private:
    int size;
    char *ptr;

    public:
    string() : size(0), ptr(new char('\0')) {}

    string(const string &s) : size(s.size)
    {
    ptr = new char[size + 1];
    strcpy(ptr, s.ptr);
    }

    ~string()
    {
    delete [] ptr;
    }

    friend ostream &operator <<(ostream &, const string &);
    string &operator=(const char *);
    };

    ostream &operator<<(ostream &stream, const string &s)
    {
    return(stream << s.ptr);
    }

    string &string::operator=(const char *chrs)
    {
    if (this != &chrs)
    {
    delete [] ptr;
    size = strlen(chrs);
    ptr = new char[size + 1];
    strcpy(ptr, chrs);
    }
    return(*this);
    }

    int main()
    {
    string str;

    str = "Hello World";
    cout << str << endl;

    return(0);
    }
  6. Master Programmer (初任軟體部經理)

    [
    uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
    ]
    library LHello
    {
    // bring in the master library
    importlib("actimp.tlb");
    importlib("actexp.tlb");

    // bring in my interfaces
    #include "pshlo.idl"

    [
    uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
    ]
    cotype THello
    {
    interface IHello;
    interface IPersistFile;
    };
    };

    [
    exe,
    uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
    ]
    module CHelloLib
    {

    // some code related header files
    importheader(<windows.h );
    importheader(<ole2.h );
    importheader(<except.hxx );
    importheader("pshlo.h");
    importheader("shlo.hxx");
    importheader("mycls.hxx");

    // needed typelibs
    importlib("actimp.tlb");
    importlib("actexp.tlb");
    importlib("thlo.tlb");

    [
    uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
    aggregatable
    ]
    coclass CHello
    {
    cotype THello;
    };
    };

    #include "ipfix.hxx"

    extern HANDLE hEvent;

    class CHello : public CHelloBase
    {
    public:
    IPFIX(CLSID_CHello);

    CHello(IUnknown *pUnk);
    ~CHello();


    HRESULT __stdcall PrintSz(LPWSTR pwszString);


    private:
    static int cObjRef;
    };

    #include <windows.h>
    #include <ole2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "thlo.h"
    #include "pshlo.h"
    #include "shlo.hxx"
    #include "mycls.hxx"

    int CHello::cObjRef = 0;

    CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
    {
    cObjRef++;
    return;
    }

    HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
    {
    printf("%ws\n", pwszString);
    return(ResultFromScode(S_OK));
    }

    CHello::~CHello(void)
    {

    // when the object count goes to zero, stop the server
    cObjRef--;
    if( cObjRef == 0 )
    PulseEvent(hEvent);

    return;
    }

    #include <windows.h>
    #include <ole2.h>
    #include "pshlo.h"
    #include "shlo.hxx"
    #include "mycls.hxx"

    HANDLE hEvent;

    int _cdecl main(
    int argc,
    char * argv[]
    ) {
    ULONG ulRef;
    DWORD dwRegistration;
    CHelloCF *pCF = new CHelloCF();

    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    // Initialize the OLE libraries
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
    REGCLS_MULTIPLEUSE, &dwRegistration);

    // wait on an event to stop
    WaitForSingleObject(hEvent, INFINITE);

    // revoke and release the class object
    CoRevokeClassObject(dwRegistration);
    ulRef = pCF- Release();

    // Tell OLE we are going away.
    CoUninitialize();

    return(0); }

    extern CLSID CLSID_CHello;
    extern UUID LIBID_CHelloLib;


    CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
    0x2573F891,
    0xCFEE,
    0x101A,
    { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
    };

    UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
    0x2573F890,
    0xCFEE,
    0x101A,
    { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
    };

    #include <windows.h>
    #include <ole2.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "pshlo.h"
    #include "shlo.hxx"
    #include "clsid.h"

    int _cdecl main(
    int argc,
    char * argv[]
    ) {
    HRESULT hRslt;
    IHello *pHello;
    ULONG ulCnt;
    IMoniker * pmk;
    WCHAR wcsT[_MAX_PATH];
    WCHAR wcsPath[2 * _MAX_PATH];

    // get object path
    wcsPath[0] = '\0';
    wcsT[0] = '\0';
    if( argc 1) {
    mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
    wcsupr(wcsPath);
    }
    else {
    fprintf(stderr, "Object path must be specified\n");
    return(1);
    }

    // get print string
    if(argc 2)
    mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
    else
    wcscpy(wcsT, L"Hello World");

    printf("Linking to object %ws\n", wcsPath);
    printf("Text String %ws\n", wcsT);

    // Initialize the OLE libraries
    hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if(SUCCEEDED(hRslt)) {

    hRslt = CreateFileMoniker(wcsPath, &pmk);
    if(SUCCEEDED(hRslt))
    hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

    if(SUCCEEDED(hRslt)) {

    // print a string out
    pHello- PrintSz(wcsT);

    Sleep(2000);
    ulCnt = pHello- Release();
    }
    else
    printf("Failure to connect, status: %lx", hRslt);

    // Tell OLE we are going away.
    CoUninitialize();
    }

    return(0);
    }

  7. Apprentice Hacker (駭客學徒階段)

    #!/usr/local/bin/perl
    $msg="Hello, world.\n";
    if ($#ARGV = 0) {
    while(defined($arg=shift(@ARGV))) {
    $outfilename = $arg;
    open(FILE, " " . $outfilename) || die "Can't write $arg: $!\n";
    print (FILE $msg);
    close(FILE) || die "Can't close $arg: $!\n";
    }
    } else {
    print ($msg);
    }
    1;

  8. Experienced Hacker (有經驗經驗的駭客)

    #include <stdio.h>
    #define S "Hello, World\n"
    main(){exit(printf(S) == strlen(S) ? 0 : 1);}

  9. Seasoned Hacker(經驗豐富的駭客)

    % cc -o a.out ~/src/misc/hw/hw.c
    % a.out

  10. Guru Hacker (駭客界的精神導師)

    % echo "Hello, world."


軟體部經理的進化

  1. New Manager (初任軟體部經理)

    10 PRINT "HELLO WORLD"
    20 END

  2. Middle Manager (中階軟體經理)

    mail -s "Hello, world." bob@b12
    Bob, could you please write me a program that prints "Hello,
    world."?
    I need it by tomorrow.
    ^D
    鮑伯, 明天請幫我寫個程式, 印出 "Hello, world."

  3. Senior Manager
    資深軟體經理

    % z mail jim
    I need a "Hello, world." program by this afternoon.
    吉姆, 下午寫個程式,  "Hello, world."

  4. Chief Executive (公司的最大總經理)

    % letter
    C:\\letter: Command not found.
    % mail
    To: ^X ^F ^C
    C:\\ % help mail
    help: Command not found.
    C:\\ % damn!
    !: Event unrecognized
    % logout
    搞什麼鬼!..
    誰給我過來一下.)

結論是: 新生最好, 愈原始愈好。


測量高塔

有點學問的笑話, 不是念物理的不知道看不看得懂.

有一天, 加州理工/麻省理工/哈佛的物理學生在一起聊天.他們走著走著看到了一座塔... 就必賽起誰可以最精確的量出塔的高度.

於是, 加州理工的學生就拿出量子力學, 計算出該塔是 "存在的"
(加州理工量子力學很好)

於是, 麻省理工的學生就拿出高度量測儀, 量出該塔的高度是 50.327 公尺.
(麻省理工的工程能力很受肯定.)

最後, 哈佛的學生從口袋裡拿出 50 元鈔票, 塞給高塔的管理員, 得到了最正確的答案 - 50 公尺.
(喂, 那個哈佛的, 比賽作弊不是好事喔 !)

結論是: ......

毛慶禎
臺北縣新莊市輔仁大學圖書資訊學系
Tel: 02 29031111 ext 2334, 3244(研究室) - Fax: 02 29017405
E-mail: mao@blue.lins.fju.edu.tw
http://www.lins.fju.edu.tw/~mao/va/jokes.htm