先讲个古老的段子吧。

几十年前(操作系统还是DOS时代)不知道哪个大人物想对抗AutoCAD,于是纠集了从清华大学...至大连理工,十几所985高校联合起来开发一款独立自主,功能和AutoCAD类似的软件。教授博士生应有尽有,资金当然也是大手笔,历时十几年。这么庞大的阵容,却远远不是Autodesk Inc.当时才几十名程序员的对手... 其实现实中绝大多数高材生都写不了像样的程序,这就如同搞中文教学的教授和博士生比某某作家识字多却写不出某某文学作品一样的道理。更何况软件是一门工程,恰恰是纯搞理论的人士们最欠缺的东西。

基础软件一般是很难做的,例如,开发一款具有商业价值的编译器或操作系统难度肯定超过做火箭或者做核弹。打个比方,F35战斗机控制系统的源代码大约2千9百万行,仅在模拟器上调试这些程序至少会敲坏10万块键盘不止...体力尚且如此,智力活动就更不用说了

拿路人皆知的高考作为比较吧,考名牌985获得什么状元,跟开发一款像样的软件比起来,难度可以忽略。因为软件要想很好的活下来需要做到世界第一,很多时候第一吃肉第二连汤都喝不上几口。题目再难也有人会,因为考试都是已知的东西。开发一款软件会遇到太多未知的东西,需要很多创新。形式上,考试都是个人“英雄主义”,开发软件则是集体作战,每人都得“强”而且优势互补。持续时间上,考试完后可以如释重担再不用理会过去,软件则需一年又一年的持续迭代升级下去。

举例容易明白。例如操作系统,Windows在PC上占绝对优势,iOS小众,
免费的Linux连3%都不到...再如Office,Microsoft Office第一,第二是谁已经不重要(LibreOffice, OpenOffice...),即使免费也没多少人用。再如PDF编辑器,Adobe占据92%以上份额,其余十几家合起来市场份额还不足8%...这是一般软件,专业软件更是残酷,例如前面说的AutoCAD,业界几乎没有对手,第二名根本就活不下去!


敲字太苦,网上搜一下,果然有文笔功厚人士,直接贴过来,https://www.zhihu.com/question/22508677/answer/956755281

--------------------分割线----------------------

买苹果

普通人:

我今天要买一斤苹果。

程序员:

我今天要买一斤苹果。

因为我只喜欢红富士苹果,所以我只买红富士苹果。

我能接受的最高价格是10/斤。

正常情况下一斤苹果用一个袋子能装下,但是为防万一,我会带两个袋子。

我知道附近的3家水果店,所以我会依次访问这3家水果店。

根据上述条件,我设计出以下的买苹果的流程:

买苹果流程开始

    对水果店0、水果店1、水果店2依次执行:

    拜访一家水果店流程开始

        走到此水果店

        如果此水果店没有开门,则结束当前的拜访一家水果店流程

        如果此水果店没有苹果,则结束当前的拜访一家水果店流程

        如果此水果店的苹果当中没有红富士苹果,则结束当前的拜访一家水果店流程

        如果此水果店的红富士苹果剩余不到一斤,则结束当前的拜访一家水果店流程

        如果此水果店的红富士苹果的价格高于10/斤,则执行3次:

        讲价流程开始

            询问店主是否愿意将价格降到10/斤或更低

            如果店主愿意,则跳过剩余的讲价流程

        讲价流程结束

        如果此水果店的红富士苹果的价格仍然高于10/斤,则结束当前的拜访一家水果店流程

        打开一个袋子,将其作为当前的袋子

        重复执行以下流程,直到总重量大于一斤:

        装袋一个苹果流程开始

            从所有的不在袋子中的红富士苹果中选出最好的一个

            如果此苹果能装入当前的袋子,则将此苹果装入当前的袋子,否则执行:

            换袋子流程开始

                如果我有剩余的袋子,则从中任意选出一个并作为当前的袋子,否则执行:

                向店主要袋子流程开始

                    向店主索要一个袋子

                    如果店主拒绝给我袋子,则将我的所有袋子里的所有苹果取出,然后结束当前的拜访一家水果店流程

                    将店主给我的袋子作为当前的袋子

                向店主要袋子流程结束

            换袋子流程结束

            测量我的所有袋子里的所有苹果的总重量

        装袋一个苹果流程结束

        根据我的所有袋子里的所有苹果的总重量和店主给出的价格,计算我应付的价格

        向店主询问我应付的价格

        如果我不接受店主索要的价格,则执行3次:

        校对流程开始

            向店主解释我计算出的价格,并询问其是否同意

            如果店主同意,则跳过剩余的校对流程

        校对流程结束

        如果我仍然不接受店主索要的价格,则将我的所有袋子里的所有苹果取出,然后结束当前的拜访一家水果店流程

        如果我没带钱,则将我的所有袋子里的所有苹果取出,然后结束当前的拜访一家水果店流程

        付钱拿走苹果

        跳过剩余的拜访一家水果店流程

    拜访一家水果店流程结束

买苹果流程结束

这个流程怎么样?我来设计一些测试样例,测试一下这个流程。

测试发现一个问题:如果水果店0和水果店1都有红富士苹果并且价格都低于10/斤,而且水果店1的价格比水果店0更低,那么我希望买水果店1的苹果,但我设计的流程会让我买水果店0的苹果。

为了解决这个问题,我应该先询问所有水果店的价格,然后去价格最低的那一家买苹果。

经过修改,我重新设计出以下的买苹果的流程:

买苹果流程开始

    对水果店0、水果店1、水果店2依次执行:

    询问一家水果店的红富士价格流程开始

        走到此水果店

        如果此水果店没有开门,则视此水果店的红富士价格为无穷大元/斤,并结束当前的询问一家水果店的红富士价格流程

        如果此水果店没有苹果,则视此水果店的红富士价格为无穷大元/斤,并结束当前的询问一家水果店的红富士价格流程

        如果此水果店的苹果当中没有红富士苹果,则视此水果店的红富士价格为无穷大元/斤,并结束当前的询问一家水果店的红富士价格流程

        如果此水果店的红富士苹果剩余不到一斤,则视此水果店的红富士价格为无穷大元/斤,并结束当前的询问一家水果店的红富士价格流程

        向店主询问此水果店的红富士苹果价格并记录

    询问一家水果店的红富士价格流程结束

    3家水果店中选出红富士价格最低的一家(如果有并列则随机选择),将其作为目标水果店

    如果目标水果店的红富士苹果价格为无穷大元/斤,则结束当前的买苹果流程

    走到目标水果店

    如果此水果店的红富士苹果的价格高于10/斤,则执行3次:

    讲价流程开始

        询问店主是否愿意将价格降到10/斤或更低

        如果店主愿意,则跳过剩余的讲价流程

    讲价流程结束

    如果此水果店的红富士苹果的价格仍然高于10/斤,则结束当前的买苹果流程

    打开一个袋子,将其作为当前的袋子

    重复执行以下流程,直到总重量大于一斤:

    装袋一个苹果流程开始

        从所有的不在袋子中的红富士苹果中选出最好的一个

        如果此苹果能装入当前的袋子,则将此苹果装入当前的袋子,否则执行:

        换袋子流程开始

            如果我有剩余的袋子,则从中任意选出一个并作为当前的袋子,否则执行:

            向店主要袋子流程开始

                向店主索要一个袋子

                如果店主拒绝给我袋子,则将我的所有袋子里的所有苹果取出,然后结束当前的买苹果流程

                将店主给我的袋子作为当前的袋子

            向店主要袋子流程结束

        换袋子流程结束

        测量我的所有袋子里的所有苹果的总重量

    装袋一个苹果流程结束

    根据我的所有袋子里的所有苹果的总重量和店主给出的价格,计算我应付的价格

    向店主询问我应付的价格

    如果我不接受店主索要的价格,则执行3次:

    校对流程开始

        向店主解释我计算出的价格,并询问其是否同意

        如果店主同意,则跳过剩余的校对流程

    校对流程结束

    如果我仍然不接受店主索要的价格,则将我的所有袋子里的所有苹果取出,然后结束当前的买苹果流程

    如果我没带钱,则将我的所有袋子里的所有苹果取出,然后结束当前的买苹果流程

    付钱拿走苹果

买苹果流程结束

现在这个流程是不是完美了呢?不是,我还能发现很多问题。
如果3家水果店都有红富士苹果但都不到一斤,但是三家店加起来能达到一斤,那么我不应该结束流程回家,而是应该把三家店的红富士苹果都买下来。
如果我向水果店询问价格的时候这家店还有红富士苹果,但我询问完所有水果店的价格后这家店的红富士苹果卖完了,那么我的流程会让我试图处理不存在的红富士苹果。
我走路的过程中可能会遇到突发事件,比如发现了新的水果店,比如袋子破掉了苹果掉一地,对于这些情况我的流程都无法进行处理。

啊问题太多了我懒得再改流程了。我还是去X宝买吧。
那么接下来我要设计一个在X宝买红富士苹果的流程……


打鸟


某日,老师在课堂上想考考学生们的智商,就问一个男孩: “树上有十只鸟,开枪打死一只,还剩几只?”
  男孩反问:“是无声手枪,还是其他没有声音的枪么?”
  不是.”
  枪声有多大?”
  “80~100 分贝.”
  那就是说会震的耳朵疼?”
  .”
  在这个城市里打鸟犯不犯法?”
  不犯.”
  您确定那只鸟真的被打死啦?”
  确定.”老师已经不耐烦了,拜托,你告诉我还剩几只就行了,OK?”
  “OK.鸟里有没有聋子?”
  没有.”
  有没有鸟智力有问题,呆傻到听到枪响不知道飞的?”
  没有,智商都在 200 以上!”
  有没有关在笼子里的?”
  没有.”
  边上还有没有其他的树,树上还有没有其他鸟?”
  没有.” “方圆十里呢?” “就这么一棵树!”
  有没有残疾或饿的飞不动的鸟?”
  没有,都身体倍棒.”
  算不算怀孕肚子里的小鸟?”
  都是公的.”
  都不可能怀孕?”
  “………,决不可能.”
  打鸟的人眼里有没有花?保证是十只?”
  没有花,就十只.” 老师脑门上的汗已经流下来了,
  下课铃响起,但男孩仍继续问:“有没有傻的不怕死的?”
  都怕死.”
  有没有因为情侣被打中,自己留下来的?”
  笨蛋,之前不是说都是公的嘛!”
  同性恋可不可以啊?
  “………….,性取向都很正常!”
  会不会一枪打死两只?”
  不会.”
  一枪打死三只呢?”
  不会.”
  四只呢?”
  更不会!”
  五只呢?”
  绝对不会!!!”
  那六只总有可能吧?”
  除非你他妈的是猪生的才有可能!一枪只能打死一只!”
  “…好吧,那么所有的鸟都可以自由活动么?”
  完全可以.”
  它们受到惊吓起飞时会不会惊慌失措而互相撞上?”
  不会,每只鸟都装有卫星导航系统,而且可以自动飞行.”
  恩,如果您的回答没有骗人,学生满怀信心的回答,打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩.”
  老师推推眼镜,强忍着要昏倒的感觉,颤抖地说道:你可以去当程序员了……”

程序员的笑话

一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,要了一杯洗脚水
一个测试工程师走进一家酒吧,要了一杯蜥蜴
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷
一个测试工程师走进一家酒吧,要了NaN杯Null
一个测试工程师冲进一家酒吧,要了500T啤酒咖啡洗脚水野猫狼牙棒奶茶
一个测试工程师把酒吧拆了
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒并且不付钱
一万个测试工程师在酒吧门外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧
测试工程师们满意地离开了酒吧。
然后一名顾客点了一份炒饭,酒吧炸
...