三周学|三周学 Python (不,三周做个产品)
我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验。惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自己牛叉的事情(不少人可能用一周左右就可以做到),思考过后,我还是答应了同事的邀请,复盘总是一件能让人获益匪浅的事。首先,我接触 Python 也就几周,不可能分享 Python 的技巧和经验,其次,通过对同事需求的分析,我发现他的真正需求并不是学 Python 这件事,而是他感觉我比他高效。于是,我写下了这篇心得,以供那些有意愿,却未能有机会来参加我分享会的朋友们。
绕不开的三个终极哲学问题 【三周学|三周学 Python (不,三周做个产品)】我是谁
- 我是一个全球分布式云存储系统的软件测试工程师,常年工作在 Linux 平台下。
- 管理过 20 人的测试团队,负责测试交付。
从哪里来
- 曾就职于一家外经公司的国际劳务部,管理大量出国人力资源资料档案。
- 现任一家软件公司软件测试工程师,负责一个全球分布式云存储系统的测试。
要到哪里去
- 短时间内掌握 Python,期望能学以致用。所谓「人生苦短,我用 Python」,它向我敞开了编程之门。
分析态势 为什么要花时间研究这三个问题?因为我可以在此基础上分析出我的优劣势、机会和威胁,也就是肯尼思安德鲁斯的 SWOT 分析法。只有清晰了态势,才能规划出一个明确、具体且能追踪管理的实体化目标,而非面对一个空虚无法明细的愿望。
当时我简单列了一下:
优势
- 拥有 Shell 这一初始技能
- 有自动化测试经验
- 专业的灰盒测试技能使自己同时拥有客户视角和开发思维
- 作为一个大型分布式存储系统的测试经理,具有很强的项目管理能力及交付经验
- 可以把 Python 作为工作中的一项改进内容
劣势
- 没有任何语言的开发经验
- Python 零基础
机会
- 网上有不少优秀的 Python 教程
- 业内比较看好 Python
- Python 可以像脚本一样使用
- 项目组内鼓励自我学习型工程师
威胁
- 平时为追求工作效率,可能会使用熟悉的 Shell 而非生疏的 Python
- 工作中不要求使用 Python
立项 分析完之后,我制定出了第一个实体化的目标:
熟悉 Python 思维,把工作中现有的 Shell 脚本用 Python 重写。
何为 Python 思维,我并没有把这个名词定义得多么玄乎,其实很简单,就是在拿到一个需求的时候,我知道从何下手,并且能熟练的反应出用 Python 语法,不让自己觉得很痛苦。所以当我能够把目前工作中所使用的 Shell 脚本都转换成 Python 的时候,就肯定能达到这个效果了。
为了达成这样的目标,我列出了约束这个项目的三大要素:
范围
- 范围跟目标不一样,目标是个最终状态,而范围包含了具体要做的事情。
- 比如到底要学哪一款教程,具体要把哪些脚本重写。
时间
- 总周期:一周。
- 为什么逼自己这么紧?虽然这个项目看起来不需要花费金钱,但这项任务一定会耗费自己很多的非工作时间,这些都是应该计入成本的,时间就是金钱,战线拖得越久,损耗越大。
- 那这个时间是拍脑袋想的吗?当然不是,我制定了更详细的日程表,后面会提到。
资源
- 网上的教程很多,其实只要认定一个,专心看下去,都是可以的,不必纠结哪个教程最好。我直接搜索了一个在线阅读起来也比较方便的图文教程,为什么没有选择视频?因为太费时间,有时候为了提速,我必须要一目十行。
- 人力资源很纯净,就我自己一个人。
- 另外还有一类资源不能忽视:随身的笔记本电脑和流量充裕的手机。想要短时间内完成目标,必须用上所有可能的时间。有些人觉得零散的时间无法运用,我不完全认同。零散的时间可能无法专心编程,但可以用来做搜索式学习,以强化或者探索学习过程中遇到的问题点,所以笔记本电脑用作完整时间的学习,手机则是用在碎片化学习的时间中。
计划 由于只有一周时间,所以必须要把时间表细化到每天、每半天、甚至每个时间段,比如上班前、中午休息时间、下班后,还需要考虑到一些影响因素,比如就我来说,那一周里面有一个已知的未知状况 —— 可能要出差一天,但是预估应该只会占用上班时间,所以判断它不会影响进度。
时间表不仅仅是思考自己有哪些可以利用的时间段,还要计划每个时间段做什么,比如哪几个时间段学习,学习的具体章节,几天之后就要开始脚本重写,具体写哪个脚本,越详细越好。
控制进度 每天按照计划的时间表来学习,想按时完成教程一般都不会出现状况。意外多会发生在实践阶段,比如我经常会发现费力写了一段代码,竟然是重复造轮子,因为早有人提供了使用起来更方便快捷的第三方库。对此我并不丧气,因为我的目标是完成 Python 学习,而不是利用最高的效率去写 Python 程序,虽然别人已经造好了轮子,但我练习了基础,锻炼了 Python 思维,不亏,但它着实影响了进度。
每个时间段我都会检查自己是否按时完成进度。如果落下进度,只能赶工,怎么赶?如果真的压缩了工作之外的所有时间,那么只能选择稍微牺牲一下睡眠,以不影响第二天工作为限。那些「保证睡眠时间」的鸡汤文就不看了,天道酬勤才是真理。
风险评估 但即使这样,也难免还会出现失控。当我发现连续两天,也就是差不多 6 个时间段的进度都未能达成时,我意识到最后的目标肯定要延期了。虽然有点沮丧,但并不觉得难以接受,项目延期实在是再正常不过的现象了。
需求变更 在我分析完延期的主要原因是在于时间没有供给充足,比如出差那一天的时间远远超出我的预估,以至于相当于少了一天的练习。我开始考虑的是延期两天完成目标,虽然这是一个非常合理的需求,但在第二天我就改变了主意,总觉得少了点什么。于是,在分析了 SWOT 之后,愿意接受增加范围带来的影响,对自己提出了一个重大的需求变更:
- 范围从「把所有 Shell 重写」变更为「挑选两个脚本重写,用 Python 写一个客户关系管理系统」
- 项目完成时间由「一周」变更为「三周」
之所以选择做一个客户关系管理系统,是由于我曾经每天都要管理几百人的信息资料,对此类信息的管理有一些理解,另外因为斜杠青年的身份,我也需要这么一个 CRM,Python 的简单易用,也让这个目标变得可行。
由于这一重大变更,我不得不重新启动、规划、执行、监控。
变更后的项目其实包含了两个目标了,所以我的内心是把这次的项目当作两个项目去管理的, CRM 的实现更多还是站在了产品经理的角度去管理。
最终,我按时完成了预定目标,做出了一个适合自己用的 CRM,这个 CRM 并不完美,当时甚至没有图形界面,但它实现了从无到有。(第四周结束的时候,我又迭代完成了两个大版本的改进,但由于没有产品开发和架构设计的经验,导致在第三版的时候几乎重写了所有逻辑)
正如一开始我说的一样,这不是一篇 Python 的快速学习指南,更像是 PMP 的文章,我的整个过程涵盖了 PMP 五大过程组。在这次的项目中,我接触到了很多新知识、新工具,甚至对于产品的架构设计也有了理解,希望分享的这次心得,能和大家一起进步,让自信的朋友更肯定自己,让怀疑自我的朋友突破自己。
推荐阅读
- 慢慢的美丽
- 开学第一天(下)
- 奔向你的城市
- 学无止境,人生还很长
- 由浅入深理解AOP
- “成长”读书社群招募
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 小影写在2018九月开学季