pythoncamp0

GitBook 链接 http://cici19891.gitbooks.io/pythoncamp0/content/source/part3/4.html

大妈视频链接 http://youtu.be/BUoI7TWO8hc

大妈语音链接 http://openmindclub.qiniudn.com/res/tapes/150425-qa-sh/index.html

大妈的几个问题(Q——大妈,A——学员):

  • 线下组织为何受阻?
  • Q(大妈):这是你们第一次线下聚会吗?之前都没有见过?(是的)为什么呢?

    A(阡陌):小组才刚刚成立。
    
  • Q(大妈):你们也刚刚才认识吗?有规定你们不可以自己组织吗?是不是因为动画 EVA 中所说的“绝对领域”?

    你们在微信上、邮件列表里,有过不下一百万次的照面,为什么不自己组织起来?

    为什么我和志平仁波切一开始要选择十个人建立小组,后来又按地域建大腿组?

    其实我们是希望你们自发的组织起来的,但一直没有人接到这个梗。(大妈多次说到许多梗都没有被学员 get 到,痛心不已......==。)

    权限就在哪,这些权利没有人限制你。从来都是——谁主张,谁执行

  • Q(大妈):权利就在那里,你为什么不用,想过没有,你为什么没有用起来?

       大妈的层层追问无言以对。。。
    
  • Q(大妈):是怕说错吗?

    有些人是这样,知道自己会说错,怕说错,所以就不说。

    但有些人,就像安替老师,知道自己会说错但仍要讲,结果是什么,越说越好了。

    而如果一个人要自主的(自我驱动)真正学会什么东西,学习中的摔跤是必然的、必须的。

  • 当知道有五周的时间来完成一个项目时,有没有想过怎么开始,每周完成什么,组织一些什么人,由什么人来完成什么?
    • Q(大妈):头脑风暴并不是就刚刚一会儿你们坐在这儿才有的,你们接到这个计划时,脑子里就已经开始计算了,只是还不能适当的提取出来,刚刚你们的讨论是头脑风暴的碰撞。那么你们有想过那一系列问题了吗?

        (没有人回答的出来,大妈此行的目的已经明了了,虐我们。。。)
      
    • Q(大妈):编程是强逻辑的手艺活。这是什么意思?编程和现实中的其他事有什么区别?

      比如给你一堆木材,要你打一些桌子椅子,你第一步怎么做?

      A(阡陌):设计步骤...

      A(大猫):??????

    • Q(大妈):嗯,看来大家都知道如何开始,编程也是一样,就像我们过来这里,要设计线路,要按线路一步步执行,这一切我们都非常熟悉,调用起来非常方便。但现实的程序是很难复现的,比如你做十万次麻婆豆腐十万次都不同,哪怕弄的像在实验室中做实验那样也不可能,对吧。但编程呢?

      A(众):精确。
      
    • Q(大妈):对,代码写定后,运行几百万次都还是那个结果,编辑器不会故意开玩笑,写对了不给你跑起来,人倒是会这样。

  • 团队是什么?一个人要完成一个项目可能需要十个月,那么十个人一起合作,是不是只需要一个月?
    • Q(大妈):人的效率能这样简单的叠加吗?

       A(众):不能。
      
    • Q(大妈):对,可能十个反而需要一年或者更长时间,甚至根本没法完成了。人的效率根本不可能这样简单叠加,所以什么是团队,怎样形成一个团队?怎么分工?

      A(大猫):程序是对现实的逐步还原,所以固定追踪,由一个人专门统筹,分派任务和整理进度,由他来调配和分工。
      
      A(阡陌):这样这个人应该还要负责审核每个人并入的代码是否正确。
      
  • Q(大妈):这里面很多坑。谁分?怎么分?怎么证明这样分配是对的?遇到问题怎么办?在问题面前如何止损?

    A(大猫):就是类似于产品经理这样一个人。
    
  • Q(大妈):为什么要一个人这么高智能的生物来做这件事呢?你们知道这意味着什么?

    团队有三个人或四个人,我们现在的要求是不超过四个人,其中一个人专门来做这个,也就是直接少了一个程序员,这是极大的浪费。

  • Q(大妈):所以,更好的方式是什么?

    是程序本身,软件是最自然的理解方式,有什么能比一个可运行的代码更好的沟通两个程序员是想干嘛呢?

    软件就是这么写出来的,分布、合并,用软件说话,用可运行的代码说话。

    • Q(大妈):代码就是这么合作写出来的,自然而然

学员提问(A——大妈,Q——学员):

  • Q(Rainvoo):进度不一怎么办?

    A(大妈):对呀,进度不一怎么办?现在你们就是面临这样的问题,进度不一,怎么办吧。

    A(众):大家一起帮他。
    

    A(大妈):对呀!不都知道吗。

  • Q(Cp4):遇到无法预见的坑怎么办?

    A(大妈):我们面对的是什么目标?手上有什么资源,也包括时间资源,有哪些人可以用?当然人也是一种资源。在开始之前有没有问过自己这样的问题?

    我们都是由这三者出发来展开我们的项目,这个过程中一旦遇到不可预见的坑,说明什么?我们有没有正确评估者三者的权重,是不是要重新评估?

    A(石子佳):可能是目标定高了。是不是可以一开始就准备好一个最高目标,一个优秀目标,然后一个保底的基本目标。
    
|整理者按:大妈的发布作业时,总是分别列出可用、合格、优秀和天才几个等级。原来处处是伏笔。

A(大妈)(某种难以言传的表情。)嗯。。。

  • Q(Issam) :方向的问题。如何确定我现在走的不是弯路,如何知道我现在是在离目标越来越近了,如何缩短与目标之间的距离?

    A(大妈):

    • 搜索。
    • ????
    • 常识,即使从来没学过,也该知道大致的架构。
  • Q(???):如何选择合适的模块?

    A(大妈):首先,基本的,在 GitHub 上找。

    A(大妈):其次,有哪些筛选条件?

        A(学员):最多人 Fork
    

    A(大妈):还有呢?还有呢?(大妈不断的重复追问)

        A(学员): 代码行数最少
                  他人的评价比较好
                  加星最多
                  开发的时间比较近
    

    A(大妈):还是那句话,我翻来覆去讲的自然而然,这些都是常识。

    比如,看到一个 09 年的和一个前两个小时刚改动过的,选哪个?看到没有几个人改动,和一个几乎天天有新的变动的?选哪个?当然是刚刚改动过的和开发积极的那个。

  • Q(???):如何更好的利用 GitHub?

    A(大妈):你们用了 GitHub 这么久,每天 push 多少次?

     A(阡陌):每天两次。
     A(石子佳):我是直接 GitHub 上写。
     A(Rainvoo):可能写了这么久以来一共几十次。
    

    A(大妈):你们还没有意识到 GitHub 真正的(美好???),我们每天 push 二三十次,甚至更多?为什么要这样,知道为什么要这样?

     A(阡陌):为了得到更多改动比较小的版本,当出现错误时,能在更小的范围测试是哪个代码错了。
    

    A(大妈):对,版本越多追溯越容易。

项目分解示范(Q——大妈,A——学员)

以石子佳同学的“碎纸恢复”项目为例:
  • Q(大妈):一个项目、一个程序它的主要框架是什么?(由大到小分步)

       A(众):输入/处理/输出
    

    |大妈画逻辑图

  • Q(大妈):好,继续。输入的是什么?

       A(石子佳):碎纸片/条状的
    
  • Q(大妈):好,这个条状碎纸片为对程序的输入来说表现为什么形式呢?

       A(石子佳):(思索)图片吧。。。
    
  • Q(大妈):好,图片。那么输出呢?

       A(众):也是一个图片,一个整合的图片。
    

    |大妈画逻辑图

  • Q(大妈):好,输入、输出完成了。这个让你们写已经没有任何难度。现在我们就当已经获得了这个输入对象,怎么处理它?人工是怎么处理的?

       A(石子佳):将接口处吻合起来
       A(Rainvoo):将字的偏旁之类对应
    

    |大妈画逻辑图

  • Q(大妈):好,那工程上是怎么做的呢?工程上的暴力处理?

      A(众):...
    
  • Q(大妈):人脑最怕做重复的事情,但计算机恰恰相反,它们最擅长的就是重复的计算。计算机获得的输入是,很多张长条的碎片,我们要的是它们最后会整合成为的一张 A4 纸,可不可以这样,不管它怎么排列组合,我们先得到所有的它可能排列组合成的 A4 纸,这正是计算机最擅长做的。得到所有的 A4 之后,我们只要找出我们想要的那一张,输出,就可以了。怎么找?很简单,读取纸张上的文字,找出可识别文字最多的那一张。

      众学员一下子明白了。
    
  • Q(大妈):这里面几个步骤?

      A(众):生成碎片所有可能的排列组合
             用一个类似于扫描仪的模块来扫描所有图片
             比较可识别文字最多的即成果(用 len(list)) 
    

    |大妈画逻辑图

  • Q(大妈):排列组合没有问题,找出最多文字的那一张,也没有问题,已经有同学把用哪个代码都说出来了。所以难点集中在识别文字的模块 —— 一个 OCR 模块。

    • Q(大妈):有几种解决方式?

       A(众):PyOCR
      
    • Q(大妈):如果没有呢?NoPyOCR(又一轮不断的追问)

       A(众):其他语言的 OCR 模块。。。
             自己写一个 OCR
             Python 中可以替代 OCR 的模块
      
    • Q(大妈):还有呢?

        已榨干。。。
      

    |大妈画逻辑图

  • Q(大妈): 判断工作量,或说评估难度。

    • Q(大妈):那一种工作量最大?

        A(众):自己写
      
    • Q(大妈):第二呢?

        A(众):调用其他语言的模块
      
    • Q(大妈):对,因为说实在的你们根本不会 python 以外的任何其他语言。所以最终找到的路径是,在Python 中找替代物。

       (尽说实话。。。)
      

|大妈画逻辑图

大妈的 Tips:

  • 启动样本数据,即处理对象

  • 测试接口的匹配

  • 任何时候可运行、可预期,如何实现?——随时可以测试的样本数据

  • 每天练习,不断练习才能顺利提取

  • 每天进步,这需要形成规律的每日三问

  • 止损,超过一个时间临界点,换一种方式。微信、打电话、发列表等等方式。

大妈的建议:

这个建议也可以说是任务:
  • 尽快写出项目计划书

    • 分析图
    • 如何劝服小伙伴们加入你的项目组?
    • 怎么做
    • 指出项目的难点在哪里
    • 解决的具体方法

最后一问

有多少人放弃了一开始报名时想做的项目,作出这种改变的原因是什么?供所有学员思考。