我的第一个开源项目

纸上得来终觉浅

MyPythonPractise是我的学习和开源项目集中地,最近写了两个小项目,加起来也有小六百行代码,还在持续开发中,颇有些心得,和大家分享。

项目简介

仓库来源

一年多来断断续续的被Python的信息包裹,打开了Github就创建了这个仓库。最开始是希望自己的代码可以公开管理,可以被高手点评。转念一想,为什么不写一些有用的东西,顺便给别人看看呢,开始寻找一些相对简单的适合入手的需求。因为开智的Python课程一般都是从输入输出开始,我也从这里开始吧,所以有了下面的01 separator changer Project项目,后来积累了自信,就有了02_timecard_process的项目。02的项目开始前我心里并没有底,这么复杂的功能也不知道是否可以自己完成。实现起来也没有想太多,就是一个坑一个坑的跳,一个坑一个坑的爬,等到核心小功能写出来之后发现,哇塞,原来我可以。就像我在“教练叔叔,我害怕” 博客写到的,打倒我们的往往并不是困难本身,而是想到困难后的恐惧。

01 separator changer Project

该项目的初衷是自己在使用 Moinmoin 时经常会遇到表格的制作,把分隔符转换为“||”是没有技术含量的体力活,为什么不能交给程序执行呢?那就交给Python来做吧。我要做的是一个txt或者excel文件读入,将文件中在文件头、中间、尾部的指定分隔符转换为用户指定分隔符的功能。

目前初版的功能已经实现,可以使用,但是由于定位和设计的原因,这个功能不会继续开发维护了,主要基于以下几点:

  1. 单纯的针对Moinmoin的txt格式转换已经实现。
  2. 拓展功能的定位有问题,分隔符替换和实际的excel文本替换很类似,而excel提供的分列功能更强大,没必要重复造轮子。
  3. 文件的读入场景也是有问题,如果是为了moinmoin考虑,更适合做的是基于moinmoin的插件开发,而不是一个文件处理后再复制粘贴过去,还是很麻烦。

02_timecard_process

初衷是为了给自己的工作“偷懒”。作为项目管理者,每个月要给项目组人员核算考勤,需要逐行人工处理,非常的不“人性化”,为什么不让Python去做呢,有了01 separator changer Project的基础,文件读入不再是问题。目前还在开发阶段,已经实现了逐行扫描Excel文件(后缀为xls的文件),根据上下班打卡时间给出状态写回excel的基本功能。后续还要增加的功能有:

  1. 根据导出的固定格式的表格进行初步加工,对正常上下班、非正常上下班但是都打卡、未打卡等几类情况进行标记(已完成)
  2. 人工给出固定的状态或者扣减小时后,根据状态值自动计算扣减小时数(开发中)
  3. 根据人工和机器判定的小时数,结合项目组人员等级核算出对应的扣款情况(计划中)
  4. 根据扣款情况计算付款情况,输出固定格式的文件(计划中)

心得体会

实际的几百行代码写下来发现,和当初学习时比起来,为自己写一个功能的感觉是不一样的。而当你理顺逻辑后看到的风景也是不一样的。就好像一个向往登山的人听别人讲述登山的旅途和自己走在珠峰脚下,完全是两个概念。说说我的心得,其实最希望的,还是你建一个仓库,立马开始为自己写一个功能。

MVP

“最小、最小、最小”,最初开始写的时候会遇到各种困难,要调用什么包不确定,确定了包还需要看文档了解函数方法,有了函数方法,可能还有一些基本的语法忘记了,要去回顾。所以一开始的阻力很大,进展不会太快,怎么办?
给自己设定最小的目标,实现最小的功能后,问自己还有没有精力,如果没有了,该玩游戏玩游戏,该睡觉睡觉。休息之前记得提交你的代码哦,保存一个版本,也是一种仪式感,告诉自己这个功能完成了。我的仓库里每一个提交的版本都是可以执行的,让自己下一次再开始的时候是完整的状态。
即使博客发布的现在,02的功能并不是全部完成,但是根据上面拆分的功能点,我已经完成了好几轮的功能迭代。日积月累,你会发现MVP终成大事。

做中学,学中做

有了MVP的概念,每次都告诉自己完成最小的功能迭代,然后遇到了问题就立刻去查询,去解决。刚开始学习编程,总会有我先把语法都学会了编写起来就牛逼了的想法。其实并不是这样,在刚开始实现小功能,不断的积累后,你会发现自己的一些问题,由于问题的驱动,解决问题后get了新的技能,要么回去迭代修改代码,要么继续开发新的功能。根本没有什么把语法都学会了再编程的可能。就拿Python举例,知道了函数、类、逻辑运算符等等就够了么,就算你知道了元类,知道了源码的原理,一行都没有写过,还是要从头开始。

写一个对自己的工作生活切实有帮助的功能,在功能完成后是对自己最大的奖励,如果顺便还能给别人用,别人也觉得好用那更是“独乐乐不如众乐乐”的典范了。单纯的学习在遇到困难时容易丧失动力,有主动性的前提下,写实际的需求代码,才是真的“做中学,学中做”。

有一个引导师

很感谢炜枫(职业Python开发者)在我代码的过程里给予的帮助,“引导师”的作用不是手把手的教你,开发这件事情,没有人可以手把手教会。“引导师”可以在你“山重水复疑无路”的时候给出适当“柳暗花明”,让你继续探索,不至于最终放弃。“引导师”还会在你完成功能后给出专业的意见,让你发现自己没有发现的问题。在这个Issue可以看到炜枫给我提出的意见和建议。炜枫并没有帮我写过一行代码,但是他的作用确实非常大。

所以,如果你希望自己的编程之路走的更加顺利,可以找一位“引导师”,在你遇到困难,已经“竭尽全力而不得”的时候拉你一把。

不断迭代

炜枫说“写代码是不断迭代的过程”,这里的迭代是全方位的。随着开发过程的深入,功能在迭代,代码也在迭代。之前直接写出来的内容会想到函数化,之后封装为类,再然后封装为包。学会更简洁的写法,学会业界惯用的方法等等。

最近我也是遇到了这样的迭代过程,现在遇到的几个需要突破的点如下:

  1. 程序的容错不再使用if逻辑判断,考虑用抛出异常。
  2. 函数需要有意识的分清作用域。
  3. 尝试使用类进行封装。
  4. iTerm2和Atom的高级功能使用。
  5. 了解和实践不同的文件之间的调用关系。
  6. 了解和实践业界惯用的代码规范。

近期有很多朋友都在学习Python,共勉之~

ChangeLog

170805 新建