PYTHONCAMP0 上海站大妈分享:自我驱动和软件工程
主讲人:大妈
时间:2015/04/25 17:45-20:35
大妈来之前,我们正在头脑风暴要做什么项目,列举了几个,是为引子。
大妈:
终于可以干想干的事情了,但:编程不是万能的,现在掌握的python的程度,和想到完成的目标,之前还有一个距离,要把握这个度。
掌握不好,很容易陷入两个极端
- 盲目乐观(一下子就完成了几个小任务,感觉什么都能做)
- 盲目悲观(为什么其他人一下子就完成了,自己却 debug 了好几天,是不是自己太愚蠢?)
---> 都不好?界限在哪儿?
---> 要平和地积累代码
未来的两个阶段
- 从开始就要自我驱动,干大家愿意干的事情
- 软件工程方式来戳大家干活
1. 自我驱动
1.1 为啥过去六周大家没有碰面?
1.2 谁公众演讲过
大猫:参加过 Toast Masters
演讲俱乐部,是否每次都要录音?
第一次和最后一次是否反差特别大?
类似于演讲这种训练,是主动去参加的,人的一生中,不可能以一次都没有,比如学自行车、游泳。你看见小伙伴都学会骑车了,你不会,赶紧去学,这就是自我驱动。
本次 python 课,最初大家是抢票来参加的。这也是自我驱动的表现。
正如学骑车免不了要摔跤,学习编程也会遇到各种坎儿。
1.3 本次学习的自我驱动,可能会怎么表现?
TO 大腿组组长
- 本周最大的问题是什么?
- 做了哪些尝试?
- 最大的挫折?
- 为什么没有其他尝试?
- 为什么不打电话?(是因为觉得通知了就好,其他人学不学毕竟是自己的是,跟我没有关系?)
- 国外不是这样。尤其是在社区、社群中,谁主张,谁执行。权利就在那里,要主动去拿。
TO 学员
- 一起编程的伏笔早就埋下了,就是第一周大家填的调查表,预期用编程解决什么问题。
- 刚讨论想法的时候,有谁和刚开始的想法还是一致的?(现场只有 cp4 还是原来的想法,1/7)。为什么一致,又为什么变化了?
- 刚知道自己未来有 5 周来写程序的时候,有没有人想过应该怎么安排这 5 周?应该去找谁?(5 周,就是个梗。)
- 今天的头脑风暴,不应该是现场来想要做什么,而是大家带着想法来,各自应该有迷你演讲的准备。
- 想好要做什么,但是要怎么做,想过没有?
——今天的主要任务!
2. 软件工程
2.1 自然而然,追随常识和直觉
- 学编程、开始编程、想象自己编程,是不同的。但是有共同点——需要逻辑。
- 先规划、明确方案、尝试、解决问题的过程,跟日常生活中解决问题的场景和逻辑,是一模一样的。
- 但是,目前没有场景去让大家在编程中把这种能力,固化下来,更难以复现。
- 但好处是,现实世界是一个很模糊的系统,同样的流程经常导致不同的结果。而编程不一样,一条代码写定以后,哪怕运行十万遍,结果都是一样的。
- 而任何程序,其实都只有三个环节:输入、处理、输出。这三个环节,是我们根据常识和逻辑就可以提前规划和判断的。
2.2 举例:碎片复原
设想场景(由石子佳设想),如何把被公司碎纸机切碎的文件拼回去?
假设文件被切成大小均匀的长条形,并且已被扫描为图像。
- import:碎纸机产生的文件碎片(长条形)(物理输入)--》图片(假设已解决)。
- 处理:
- 人工:没有软件的时候怎么拼?
- 电脑(暴力):每个纸片有 4 个状态,在 200 个序列中有 200 个可能性,200 的 4 次方的组合,在所有结果中 OCR 匹配,然后选择匹配字数最多的图片,over
- 生成所有可能的大图
- OCR 所有图片,识别文字最多的即为成果
- 难点是什么?
- 有没有 python 的 OCR 的模块儿?
- not
- 其他语言的 OCR
- creat(难度最大)
- 替代 OCR 的软件?(最易)
- export:输出为图片
- 工作量评估?
根据规划的流程即可判断。
坎
没有意识到暴力匹配对于电脑是很简单的事儿。
思路总结:
- 尽可能的先列出来所有的可能性
- 逐级分析并列出预案
- 找出能用程序表述的方法。(机器最擅长的是干重复的事儿。)
2.3 团队协作编程
一个人的效率是最高的
- 一个人的效率是最高的,因为没有误解,不需要传达和解释自己的需求。
- 超过一个人就需要沟通,人越多沟通越麻烦。2 个人意味着 2 个信道,3 个人意味着 6 个信道,4 个人意味着 24 个信道,人再多下去,简直难以想象。
- 但,在今天,一个人很难完成大型复杂的项目。把求伯君扔到今天,他也基本不可能再一次四个月写出一个 WPS,因为现在 WPS 的代码已经大于 1000 万行。
项目管理的迷思
- 传统项目管理思维:
- 需要有 1 个人统筹(盯进度)、预判(进度的快慢)、为每个进程设置 deadline、监督每个人的工作留出接口。
- 要有一个人进行初始操作,画出产品逻辑,然后解释给coding的人(程序员A),产品的每个动作和每个功能要去用代码来实现。程序员 A 要反馈实现方式,并将结果传达给程序员B\C\D(是否可以通过写注释说明的方式来传达理解)。
- 启动的环节,分解,达成共识和标准,如模块儿要怎样去发生互动、发生互动的标准是什么?增加模块儿的测试环节。
- 传统管理思维的坑:
- 居中调度太复杂工作量太大。
- 谁负责分模块儿,怎么分,怎么确认你分的是对的,分错了谁来改?
- 架构原则?切分原则?怎么确保其他人的模块儿也能运行?
- 浪费宝贵的人力,为什么要放一个人来居中协调呢?
- 为什么要写注释说明?软件能够运行,就是最好的说明。Talk is cheap, show me the code.
如何协作?
在网上,通过邮件、分布式开发软件合作开发,是软件工程的天然状态。
- 工具
- GitHub 大展身手的时候到了。通过 GitHub, 可以回溯每个人写的每个版本的代码。
- 用GitHub 直接 pull 最新的代码。用运行代码的方式来传达想法,省口水。
- 思路
- 从第一天第一个小时开始,就应该有一个可以运行的版本(哪怕只有 print)。
- 在此基础上添砖加瓦,并保证每次添加后都可以运行。
- 由于每个 .py 文件都可以被视为一个 package, 直接在 python 中 import,所以可以把任务分解为 import, process, export 三个python 文件,分别编写。
- 需要有一条主线贯穿三个环节和文件。比如在上面的碎片复原案例中,始终贯穿的主线就是图片。
- 半程预警的思维。一周迭代,周三就该预警是不是任务量无法完成;一日计划的时候,中午就要预警,做不完怎么办?
- 增加时间:早起、晚睡、利用中午
- 向他人请教
- 降低任务要求
- 使用备用方案
- ...
- 程序运行反复测试
- import
- 专门的测试网站,可以提供测试用的数据(伪数据)
3. Q&A
Q1: cp4: 遇见坑迈不过去怎么办?
- 任何一项工程都有三个相互依赖、相互冲突的元素——目标、资源和人力
- 人力不能改变,资源始终有限
- 目标:降低目标;设定目标的时候就预设初级、中级、高级的目标,不行就逐步降低。
Q2: Issam: 对 Python 的了解很少的时候,如何评估自己的条件和目标之间的差距?怎么迈进?
- 不了解具体编程的细节?
- 有了明确目标后会飞快掌握合适的库和模块。
- Python 了 250 多个库,直接搜索调用即可。
- 走错方向。别人已经做过的正确的路径不知道。
- 设想的模块儿在哪里找到?
- 去 Python 仓库--》大部分的官网都在GitHub上,老的模块也会放GitHub上(便宜、不要钱)--》公平的竞争环境同类的模块
Q3: cp4: 多个同样功能的模块儿如何选择?
用的最多的、代码最少的、评论、开发时间、文档写的如何,加星多,fork 多,开发是否积极,这些都可以判断一个模块是否好用。
4. 总结
- 不知道相关的 python 库的时候,一样可以做好项目规划。
- 养成每周迭代-每日计划-GitHub 上协作的习惯
- 回顾完成任务中反反复复写的代码有多少?
- 半程预警
- 怎么协同工作
- 使用 Git 仓库
- 大家目前 push 的次数为 2 次/天左右。但,正常应该 push 20-30 次/天,这样才方便追溯每个版本。
- 无论任何时候,整个系统都就是可控的——可运行+可预期
- 及时模拟,零启动的时候就可以用的(伪数据等)
- 永远保证程序是可运行的
- 以及,对情绪的调整是最消耗心智能量的
5. 作业
- 本次分享纪要文稿。
- 拆解想要完成的任务,写成项目计划书。
- 解决了什么实际问题?
- 按三个步骤拆解任务
- 困难在哪里?
- 自己能完成计划的哪个部分?
6. 补充资源
.
Record by Rainvoo.
QED