若干个关于程序员的笑话。

软件开发过程

  1. 程序员写出自认为没有Bug的代码。

  2. 软件测试,发现了20个Bug。

  3. 程序员修改了10个Bug,并告诉测试组另外10个不是Bug。

  4. 测试组发现其中5个改动根本无法工作,同时又发现了15个新Bug。

  5. 重复3次步骤3和步骤4。

  6. 鉴于市场方面的压力,为了配合当初制定的过分乐观的发布时间表,产品终于上市了。

  7. 用户发现了137个新Bug。

  8. 已经领了项目奖金的程序员不知跑到哪里去了。

  9. 新组建的项目组修正了差不多全部137个Bug,但又发现了456个新Bug。

  10. 最初那个程序员从斐济给饱受拖欠工资之苦的测试组寄来了一张明信片。整个测试组集体辞职。

  11. 公司被竞争对手恶意收购。收购时,软件的最终版本包含783个Bug。

  12. 新CEO走马上任。公司雇了一名新程序员重写该软件。

  13. 程序员写出自认为没有Bug的代码。

程序员的进化——从学生到首席执行官


中学阶段

       10 PRINT "HELLO WORLD"
       20 END

大学一年级

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

大学高年级

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

初级程序员

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

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

编程老鸟

       #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 << end

         return(0);
       }

编程高手

       [
       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);
       }

黑客初阶

       #!/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;

黑客有成

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

黑客高手

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

黑客大虾

       % cat
       Hello, world.
       ^D

初级经理

       10 PRINT "HELLO WORLD"
       20 END

中级经理

       mail -s "Hello, world." bob@b12
       Bob, could you please write me a program that prints "Hello, world."?
       I need it by tomorrow.
       ^D

高级经理

       % zmail jim
       I need a "Hello, world." program by this afternoon.

首席执行官

       % letter
       letter: Command not found.
       % mail
       To: ^X ^F ^C
       % help mail
       help: Command not found.
       % damn!
       !: Event unrecognized
       % logout

牛人与非牛人的对话  

2001年,当SUN提出SUN.ONE构架的那一天,XX大学毕业的牛在“牛狼之家”  

聊天战碰到了一个公司的Coder  

——————————————————————-  

牛: 你懂XXX协议、YYY框架、ZZZ思想吗  

coder:稍微知道一点点  

牛: 那你看过XX牛的《XXXX》第X版第X卷,YY牛的《YYYY》第Y版第Y卷,  

    ZZ牛的《ZZZZ》第Z版第Z卷吗  

coder:你说的这些书都是《经典书籍》,不过我大都没认真看过  

牛: 这么说,你对XXX协议、YYY框架、ZZZ思想的底层细节应该不是很了解哦  

coder:可以这么说  

牛: 你具体做什么项目,  

coder:做X2X网站  

牛: 你说你不懂XXX协议、YYY框架、ZZZ思想的底层细节,那么你们做X2X网站时,      碰到XXX问题你怎么解决的  

coder:很简单,我们会给XX、YY大学的牛发Email,叫他们给我们解XXX组件。很方      便的。  

牛: 如果没人肯帮你们解XXX组件呢  

coder:不会的,每次都有N多牛排长对呢。再说了,到Internet上Search一下,买      XXX组件的公司成堆  

牛: 好了,好了,我再问你,你都用什么语言开发呢  

coder:用ASP+VB  

牛: 你只不知道MS已经不再支持VB+ASP了,改为C#+MS.NET  

coder:在聊天室里听牛说过  

牛: 那你为什么还要用VB  

coder:C#,JAVA我不懂 ,所以我用VB  

牛: 唉,又来了,基础的XXX协议、YYY框架、ZZZ思想的底层细节你说你不太懂,      前沿的C#, MS.NET;JAVA,SUN.ONE你又不懂,你难道没想过要好好学学吗  

coder:我有想过啊  

牛: 那你为什么不学呢  

coder:我没有时间  

牛: 你的时间都到哪儿去了  

coder:用VB+ASP编代码赚钱啊  

牛: 赚钱干吗  

coder:供我儿子出国读大学  

牛: 读研究生  

coder:不是,是读本科  

牛: 读本科就出去读,没必要吧  

coder:在XXX协议、YYY框架、ZZZ思想的底层细节方面,国内经常生产牛的最牛的       XX大学刚刚入门,在****方面连门都没入。我知道我儿子是块搞技术的料,      所以我想要让我儿子系统掌握XXX协议、YYY框架、ZZZ思想的细节,精通前       沿的…  

   (听到Coder批评牛毕业的XX大学,牛有点生气了,开始不客气起来)  

牛: 你知不知道,你没有XXX协议、YYY框架、ZZZ思想的底层细节,是写不出完美     的代码出来的。还有,像你这样,虽然现在可以赚一点小钱,但四年后肯定要      被淘汰的……  

coder:在我淘汰之前,我就不想干了  

牛: 那你去干嘛  

coder:我想开一家软件公司,招很多牛,包括精通XXX协议、YYY框架、ZZZ思想的      底层细节的牛,精通MS.net SUN.ONE的牛……  

牛: 好笑!  

———————————————————————-  

4年后,软件业VB已经彻底绝迹,XXX协议、YYY框架、ZZZ思想的底层细节已经被大量修改,MS.net和SUN.ONE也快倒掉的时候…….  

牛: (XXX公司CTO办公室里,看着www.xxx.com上的新闻)  

   啊! MS.net和SUN.ONE真要倒掉了吗?看来偶要继续充电了…….  

coder:(XXX公司CEO办公室里,看着www.xxx.com上的新闻)  

  哦,MS.net和SUN.ONE果真快倒掉了。看来我要招聘新的CTO和Coder了…  

谁也不知道,XXX公司的CTO和CEO就是当年在“牛狼之家”聊天战聊天的牛和Coder。  

   

 很多人自以为什么都知道—的确有很多牛从协议细节到当前潮流到开发环境…. 样样都精通,但那是少数—可是却偏偏不知道自己正真需要的是什么,自己最需要的又是什么,自己为什么要去知道这么多东西。  

 有的人知道的的确不多,但是他知道他最需要的是什么。他知道他时间不多,只能去争取他最需要的东西。  

 以后的社会分工会越来越细,没必要也没有可能什么都懂,开飞机的显然不必知道流体力学—虽然流体力学毫无疑问是飞机飞上天的基础;装配飞机的显然不必知道采购来的发动机具体是如何把航空油变成动力输出的—-虽然这是飞机可以开动的基础。  

 一样,用COM+或者EJB组件构造企业系统,你根本没有必要知道这个COM+或者EJB组件是如何处理底层TCP/IP连接的。组件生产者关心的是实现细节–稳定性,效率,安全……至于你,就去关心企业业务流程好了,即使不明白什么是TCP/IP,什么是IPv6也没有关系。 

程序员与妓女的相同之处:

程序员与妓女基本一样,以下为证: ^_^

1、 都是靠出卖为生。 2、 吃青春饭,人老珠黄肯定混不下去。 3、 越高级收入越高,当然中间人的抽头会更高。 4、 生活没有规律。以夜生活为主,如果需要,凌晨也要加班。 5、 名声越大,越容易受到青睐。 6、 必须尽最大可能满足客户各种各样非正常的需求。 7、 鼓励创新精神。 8、 喜欢扎堆。程序员集中的地方称为硅谷,妓女集中的地方叫红灯区。 9、 流动性较大,正常情况下没有工会。 10、如果怀孕了,既不能做程序员,也不能做妓女。 11、都为防病毒的问题而烦恼… 12、当然, 个中高手还专门以制毒传毒为乐 13、一个是Plug&Play,一个是Plug $ Play 14、工作状态相同。工作时精神高度集中,最怕外界干扰。工作完毕身心放松,体会到一种不可替代的工作快乐。 15、女孩子最好还是不要做这两个职业,但还是有很多女孩子做。 16、除非在转行以后,否则都不愿意结婚。 17、都是无本生意。资源随身带,用过再重来。 18、都是从“要我做”变成“我要做”。 19、主要的一条:为了钱,工作的热情都相当的高涨。

最大的共性是… 得到快乐的同时,又得到了金钱…

下面跟贴就更有意思:

程序员比妓女还惨!以下为证:

1、妓女每个月总有几天可以理直气壮的说不,程序员如果老板不发话,可要一年干到黑。 2、妓女不干了人家那叫从良,程序员如果不干了,估计是下了岗。 3、妓女的工作隐蔽性很强,程序员的工作只怕亲戚朋友都知道,所以更加没脸皮。 5、程序员做的越好,要做的程序越多,妓女做的好,就可以挑三拣四。 6、程序员现在流行FREE、OPEN什么的,说白了就是自己玩自己,妓女界好象还没这样恶性竞争