专业方法,常识自信

涉入未知的领域,人习惯寻找专家或权威支持。这可以理解,隔行如隔山,特别是高风险的专业领域,如医疗抢救,小白乱搞会出大事。
那么,具备编程基础的小鲜肉在开发软件项目时,先学习一本“软件工程”的教科书,再按照书中给出的地图前进是理所应当的选择吗?ZoomQuiet 大妈,始终坚持苏格拉底式的索“鱼”给“渔”训导,对这个问题给了我们 “Nooooooo……” 的回答。
2015/4/25,开智python上海学习小组首次聚会,与大妈面聊。在项目规划,项目启动,团队协作等方面,大妈介绍了专业的工程经验,更通过演示和逼问,告诉大家一个宝贵的道理:树立跨领域的常识理性自信,你已经可以做得很好。

项目分析

用常识拆解项目
鲜肉问题:脑海中一片混沌,没有头绪,怎么办?

大妈用案例演示,用基本的逻辑和常识怎样分析一个软件项目。
案例说明

对已经撕碎的文件,怎样用软件把文件碎片还原?

大妈开导 :一个软件,总可以被划分成输入,处理,输出三个部分

那么你的输入是什么?

答:(第一版中碎纸都是被切成长条形的)碎纸在软件中可以用图片代替,所以输入是长条形的图片。

还有吗? 还有吗? 还有吗?

直到你回答没有为止。

你的输出是什么?(处理是软件主体,放在后面说)

答:输出是完整的原始图片。 考虑处理部分。

有什么办法可以把碎的图片还原?

同学答:通过文字被切断的边缘进行匹配。 大妈答:可以通过暴力方法:即,对全部的碎纸进行排列组合,然后寻找出所有组合方式中包含可识别文字最多的一种,则该种组合方式可以作为输出。

那种方法更容易实现?

答:后一种。就后一种方案进行拆解:

  1. 碎纸全排列
  2. 文字识别
  3. 文字数目统计

1 和 3 比较容易完成,2 难度较大,进一步拆解。

怎样进行文字识别?

答:开发文字识别功能 答:寻找现有的文字识别模块pyOCR?

那种方法更容易实现?

答:后一种。就后一种进一步分析:

找不到python的OCR怎么办?

答:找其他语言的OCR模块,用python调用。 答:找OCR软件,用python调用。

哪一种更简单?

答:后一种。就后一种进一步分析:

找不到怎么办?

答:不可能,使用过。
至此,项目可能性封闭,分析完成。

鲜肉问题:暴力破解的方法怎么想到?

大妈开导 :人脑最不喜欢重复性工作,但计算机最擅长重复性工作
cp4 感想:这个疑问属于问题求解的范畴,解决问题是一个创造性过程,通过常识和推理都不能保证找到最优解。项目的解决方案,只能基于团队成员的智力资源,通过头脑风暴,找到属于团队的最优解。

专业技巧
开始之前不要开始

在分析项目的阶段,不需要google或baidu,运用逻辑,努力设想一切可能性,做通盘地、完备地考虑。避免过早开始行动,忽略了其他可能性。

没有死胡同

对项目规划要留有余地。不但是时间,人员规划也是如此,结合成员的实际产出,对产出低的成员,规划阶段可以不考虑其贡献。

止损

一定要有止损的预案。

项目实施

软件工程的专业方法

教科书中的软件工程大多还遵循自顶向下的开发路径,这种看上去很美的开发套路在实践中隐藏了大量的坑。真实的软件开发过程是自底向上的,不以文档或者注释为中心,而是以可以运行的代码为中心和交流的依据。这种开发方法所需要的工具我们已经熟悉,就是github。对共同的代码仓库进行团队迭代开发,这是github的意义所在。

专业技巧
开始运行!无论多简单

建立主要模块文件,哪怕只有一句输出,一定要运行起来,这就是后面工作可以进行下去的依据。

输入输出提前备料

没有输入模块的输出,处理模块就没有输入。为了不因为输入输出内容的缺乏,影响彼此协同,可以从一开始准备好约定一致的数据。

任何时候保证可控

可运行,可预期。

常识理性操练

成员进度不一致时怎么协调?

你的项目目标是什么?是完成可运行的代码,那么有人进度落后怎么办?帮他一起写。

开发中遇到迈不过去的大坑怎么办?

软件开发中,相互制约的因素有:目标,资源(时间),人力。我们的场景中,人能改变吗?时间就这么多,也不能改变,那怎么办?修改目标。

找到多个同功能模块,怎样甄别?

python的模块大多在github上,你认为一个好的模块是什么样的?使用的人多,代码最少,评论,开发的时间,文档的好坏……这些因素都可以常理推知。大妈:首要的,Star数目,fork数目,当前活跃状态。久而久之会养成嗅觉,嗅出好项目的味道。

写在最后

大妈语录

谁主张,谁执行。权力就在那里,你不拿就没有人拿。
情绪的调整最消耗心智能量,所以要淡定,淡定的前提是每天有进步,而且这个进步是可预期的。

大妈之问

国内通行的软件工程课程完全脱离软件开发现实,为什么存在这种现象?
你们(上海同学)在此之前为什么没有组织过线下交流,什么阻止了你们这样做?
你为什么没有给你的同伴打电话?
大家早已具备基本能力,但是换一种场景就不能应用,为什么不能突破思维的边界?