手持 Python 利剑,一路向前
学习 Python 课程究竟有什么用?Python 课程学员假牙运用课程所学,在工作中设置自动化检验脚本,为团队排除 bug 规避风险。「最难受的时候再坚持一下,不要轻易放弃。放弃这种事儿,等到多试一次再去考虑。」从磨砺、失败到成长,假牙的学习经历值得一看,其学习感悟更值得你借鉴!
我是假牙
软件测试工程师一枚,主攻大数据方向。Python 课程期间因 Scrapy 爬虫初窥其神奇,这一年来开路填坑,也幸亏手中握有 Python。数据科学基础班三期参与复训,获得全额学费退还。我将继续在开智课程的路上勇猛精进。
磨砺
学会用 Python 编程是一件我从大学时代就在不断规划的事情,且屡试屡败。但最终还是在大妈的带领下,找到并达成了跳出循环的条件,然后执行了数据分析基础班(两次)。现在,准备投身深度学习。
当初报名,只是想要一把利剑,完成一个技能的收藏。在大妈言传身教的启发式教学方法的指导下,种下 Python 这棵技能树,才发觉我得到的是铸剑术,进入了一种「不服写点 Python 」的状态。
今年初,加入新项目组,遇到了一个尴尬的问题。我们产品基于一个内部工具构建,但是这个工具对开发者并不友好,很容易在开发和修改的过程中引入各种 bug,而且几乎只能在运行态才能发现这些问题。测试团队指责开发团队提供的产品质量低下,开发团队转而指责内部开发工具能力太弱,火药味儿很重。换一个开发工具?不行,这不在选项列表中。
这有点像 Python 基础班的时候,要求大家禁止使用 IDE 写代码,只能通过文本编辑器写出一个个的 .py 文件。对个人学习来说,这种放开手让自己犯错的方式确实很有用处,毕竟你不闹几回 敲成 、括号不匹配,是很难静下心来对待的。但对产品开发来说,这种套路就是灾难,因为这会降低开发测试效率,降低最终交付的产品质量,影响项目进展等等。
于是我决定用 Python 写一个静态扫描工具,在不依赖运行环境的情况下,发现尽可能多的问题,让开发修改。原型花了一周左右的时间,然后不断增加功能,优化扫描结果的日志。到前几个月停止维护,这个工具的代码行达到了 3k 左右,能识别出所有的静态问题,也能识别出只有产品运行才能发现的 bug。
之后,写了 Nmon 日志的解析脚本、MapReduce hist日志的解析脚本,基于数据科学基础班学习到的数据分析和可视化的技能,又给这些脚本增加了图形化的能力。月初,用 Flask 写个 Web Server 来当跳板机转发自动化执行机发出的 REST 请求,绕开了大小网环境网络不通的问题。周末加班玩了下 Fabric,又有信心做部门 500 多台服务器的日常维护了。
失败
「铸剑术」提供的优势是:见招拆招,四两拨千斤。在跨界或者领域交叉的情况下,这种优势会展现出降维打击的效果。可是,从 Python 基础班、数据科学基础班的经历来看,「报名参加课程」与「习得技能」并不等价,总有小伙伴没有走到终点线。
拿下 Python 课程,数据科学第一次课程失败,数据科学第二次课程再次成功完成。结业的时候,我总结成功的经验为「坚持」,想要放弃的时候再尝试一下另外一种可能。现在看来,这两个字总结的简单粗暴。
失败可以分为两种,系统性失败和非系统性失败( http://t.cn/RGk5uRJ ),偶尔遭遇技术难题导致作业不能准时提交,或者学习进展暂时阻塞的,其实只是非系统性失败。这种失败是良性的,可以通过上面说的「再尝试一下另外一种可能」或者求助他人从而得到解决。
但阻碍的自己没能走到终点的,更多的是系统性失败。系统性失败的原因有几种:短期压力与长期目标冲突;周遭环境不利于实现目标和工作时间过长。
数据科学第一次课程的失败其实受多个因素的影响。具体来说,自己原本存在拖延的习惯,没有将每周任务拆解落实到每天,期间突发出差任务导致工作时间过长(每天工作十几个小时)。拖延症碰上没时间,死局。所以在数据科学第二次课程的时候,不管发生什么事情,拼死确保周末两天有足够的时间投入学习,采取各种措施来规避系统性风险。
从理性的角度来考量,这次的深度学习班也有可能失败,逆向思考一下失败的可能原因:
突发出差或者工作任务过于忙碌,导致课程学习时间投入不足
学习「深度学习」的门槛知识不满足,影响课程消化
继续犯拖延症,或不能很好得处理好短期压力与长期目标之间的冲突
日常练习不足,影响对基础知识的理解,进而根基不牢
成长
但,再次失败了也没什么。单纯的结果导向,是僵固型心智的表现。
非系统性失败指出了具体的改进方向,是优化、夯实系统内部要素的机会。系统性失败暴露出系统本身固有的缺陷,描述了当前框架下的瓶颈与极限,其意义就像是鱼儿终于发现了水。这两者都指向了「学习」的根本目的:改变。
第一序改变处理非系统性失败,在不改变原有系统的前提下,对系统内部元素、元素间关系进行优化。第二序改变则是改变系统本身,即改变自身时间管理能力、改变自控力、改换一个有助于实现自己目标的环境。
所以,不管是 Python 班还是考驾照,技能学习仅仅是一小部分,更多的是要学习新的思维方式,反思自身时间管理能力、自控力、学习方法、固有的方法论,后者才是更需要 Study and Practice 的对象。扔掉单一标准,使用多维视角来看待分析问题,这样才能前进得更远。
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- 动态创建MySQL Group Replication的节点(r11笔记第84天)
- sysbench压测小记(r11笔记第99天)
- WordPress启用memcached动态缓存以及报错解决
- 升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- 相差数十倍的SQL性能分析(r11笔记第98天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php curl操作API接口类完整示例
- PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
- Python叠加矩形框图层2种方法及效果
- PHP常量define和const的区别详解
- 解决运行出现'dict' object has no attribute 'has_key'问题
- tensorflow之读取jpg图像长和宽实例
- Python数据可视化实现多种图例代码详解
- Python使用tkinter实现摇骰子小游戏功能的代码
- pandas to_excel 添加颜色操作
- Python自带的IDE在哪里
- php+Ajax无刷新验证用户名操作实例详解
- PHP经典设计模式之依赖注入定义与用法详解
- 浅谈python出错时traceback的解读
- PHP判断是否是微信打开还是浏览器打开的方法
- php面向对象程序设计中self与static的区别分析