mirror of
https://github.com/phodal/github
synced 2026-05-22 00:29:47 +00:00
update title
This commit is contained in:
parent
dbfd72ee91
commit
7cc62662e6
6 changed files with 179 additions and 227 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.idea
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
#Github 100天
|
||||
#Github连击
|
||||
|
||||
##100天
|
||||
|
||||
我也是蛮拼的,虽然我想的只是在Github上连击100~200天,然而到了今天也算不错。
|
||||
|
||||
|
|
@ -22,8 +24,7 @@
|
|||
|
||||
而现在是``为了填坑而commit``,为自己挖了太多的想法。
|
||||
|
||||
|
||||
##40天的提升
|
||||
###40天的提升
|
||||
|
||||
当时我需要去印度接受毕业生培训,大概有5周左右,想着总不能空手而归。于是在国庆结束后有了第一次commit,当时旅游归来,想着自己在不同的地方有不同的照片,于是这个repo的名字是 [onmap](https://github.com/phodal/onmap)——将自己的照片显示在地图上的拍摄地点(手机是Lumia 920)。然而,中间因为修改账号的原因,丢失了commit。
|
||||
|
||||
|
|
@ -49,7 +50,7 @@
|
|||
- 对于Mock、Stub、FakesServer等用法有更好的掌握
|
||||
- 可以持续地交付软件(版本管理、自动测试、CI、部署等等)
|
||||
|
||||
##100天的挑战
|
||||
###100天的挑战
|
||||
|
||||
(ps:从印度回来之后,由于女朋友在泰国实习,有了更多的时间可以看书、写代码)
|
||||
|
||||
|
|
@ -65,7 +66,7 @@
|
|||
- 没有足够的空闲时间,除了周末。
|
||||
- 希望去寻找那些有兴趣的人,然而却发现原来没有那么多时间去找人。
|
||||
|
||||
##140天的希冀
|
||||
###140天的希冀
|
||||
|
||||
在经历了100天之后,似乎整个人都轻松了,毕竟目标是100~200天。似乎到现在,也不会有什么特殊的情怀,除了一些希冀。
|
||||
|
||||
|
|
@ -78,7 +79,7 @@
|
|||
- 提了bug,并解决了。(ps:这是最理想的情况)
|
||||
|
||||
|
||||
#Github 200天Showcase
|
||||
##200天的Showcase
|
||||
|
||||
今天是我连续泡在Github上的第200天,也是蛮高兴的,终于到达了:
|
||||
|
||||
|
|
@ -90,7 +91,7 @@
|
|||
|
||||
先让我们来一下ShowCase,然后再然后,下一篇我们再继续。
|
||||
|
||||
##一些项目简述
|
||||
###一些项目简述
|
||||
|
||||
上面说到的培训一开始是用Java写的一个网站,有自动测试、CI、CD等等。由于是内部组队培训,代码不能公开等等因素,加之做得无聊。顺手,拿Node.js +RESTify 做了Server,Backbone + RequireJS + jQuery 做了前台的逻辑。于是在那个日子里,也在维护一些旧的repo,如[iot-coap](https://github.com/phodal/iot-coap)、[iot](https://github.com/phodal/iot),前者是我拿到WebStorm开源License的Repo,后者则是毕业设计。
|
||||
|
||||
|
|
@ -134,7 +135,7 @@
|
|||
|
||||
这个可以从两部分说起:
|
||||
|
||||
#### 重构Skill Tree
|
||||
####重构Skill Tree
|
||||
|
||||
原来的是
|
||||
|
||||
|
|
@ -161,7 +162,7 @@
|
|||
|
||||
代码: [https://github.com/phodal/sherlock](https://github.com/phodal/sherlock)
|
||||
|
||||
###Django Ionic ElasticSearch 地图搜索
|
||||
####Django Ionic ElasticSearch 地图搜索
|
||||
|
||||

|
||||
|
||||
|
|
@ -172,7 +173,7 @@
|
|||
|
||||
代码: [https://github.com/phodal/django-elasticsearch](https://github.com/phodal/django-elasticsearch)
|
||||
|
||||
###简历生成器
|
||||
####简历生成器
|
||||
|
||||

|
||||
|
||||
|
|
@ -185,7 +186,7 @@
|
|||
代码: [https://github.com/phodal/resume](https://github.com/phodal/resume)
|
||||
|
||||
|
||||
###Nginx 大数据学习
|
||||
####Nginx 大数据学习
|
||||
|
||||

|
||||
|
||||
|
|
@ -195,7 +196,7 @@
|
|||
|
||||
代码: [https://github.com/phodal/learning-data/tree/master/nginx](https://github.com/phodal/learning-data/tree/master/nginx)
|
||||
|
||||
###其他
|
||||
####其他
|
||||
|
||||
虽然技术栈上主要集中在Python、JavaScript,当然还有一些Ruby、Pig、Shell、Java的代码,只是我还是习惯用Python和JavaScript。一些用到觉得不错的框架:
|
||||
|
||||
|
|
@ -218,7 +219,7 @@
|
|||
- MongoDB
|
||||
- Redis
|
||||
|
||||
#Github 365天
|
||||
##365天
|
||||
|
||||
给你一年的时间,你会怎样去提高你的水平???
|
||||
|
||||
|
|
@ -226,8 +227,6 @@
|
|||
|
||||
正值这难得的sick leave(万恶的空气),码文一篇来记念一个过去的366天里。尽管想的是在今年里写一个可持续的开源框架,但是到底这依赖于一个好的idea。在我的[Github 孵化器](http://github.com/phodal/ideas) 页面上似乎也没有一个特别让我满意的想法,虽然上面有各种不样有意思的ideas。多数都是在过去的一年是完成的,然而有一些也是还没有做到的。
|
||||
|
||||
##说说标题
|
||||
|
||||
尽管一直在Github上连击看上去似乎是没有多大必要的,但是人总得有点追求。如果正是漫无目的,却又想着提高技术的同时,为什么不去试试?毕竟技术非常好、不需要太多练习的人只是少数,似乎这样的人是不存在的。大多数的人都是经过练习之后,才会达到别人口中的“技术好”。
|
||||
|
||||
这让我想起了充斥着各种气味的知乎上的一些问题,在一些智商被完虐的话题里,无一不是因为那些人学得比别人早——哪来的天才?所谓的天才,应该是未来的智能生命一般,一出生什么都知道。如果并非如此,那只是说明他练习到位了。
|
||||
|
|
@ -238,19 +237,19 @@
|
|||
|
||||
于是在想明白了很多事的时候起,便有了Re-Practise这样的计划,而365天只是中间的一个产物。
|
||||
|
||||
##编程的基础能力
|
||||
###编程的基础能力
|
||||
|
||||
虽说算法很重要,但是编码才是基础能力。算法与编程在某种程度上是不同的领域,算法编程是在编程上面的一级。算法写得再好,如果别人很难直接拿来复用,在别人眼里就是shit。想出能work的代码一件简单的事,学会对其重构,使之变得更易读就是一件有意义的事。
|
||||
|
||||
于是,在某一时刻在Github上创建了一个组织,叫[Artisan Stack](https://github.com/artisanstack)。当时想的是在Github寻找一些JavaScript项目,对其代码进行重构。但是到底是影响力不够哈,参与的人数比较少。
|
||||
|
||||
###重构
|
||||
####重构
|
||||
|
||||
如果你懂得如何写出高可读的代码,那么我想你是不需要这个的,但是这意味着你花了更多的时候在思考上了。当谈论重构的时候,让我想起了TDD(测试驱动开发)。即使不是TDD,那么如果你写着测试,那也是可以重构的。(之前写过一些利用Intellij IDEA重构的文章:[提炼函数](https://www.phodal.com/blog/intellij-idea-refactor-extract-method/)、[以查询取代临时变量](https://www.phodal.com/blog/intellij-idea-refactor-replace-temp-with-query/)、[重构与Intellij Idea初探](https://www.phodal.com/blog/thoughtworks-refactor-and-intellij-idea/)、[内联函数](https://www.phodal.com/blog/intellij-idea-refactor-inline-method/))
|
||||
|
||||
在各种各样的文章里,我们看到过一些相关的内容,最好的参考莫过于《重构》一书。最基础不过的原则便是函数名,取名字很难,取别人能读懂的名字更难。其他的便有诸如长函数、过大的类、重复代码等等。在我有限的面试别人的经历里,这些问题都是最常见的。
|
||||
|
||||
###测试
|
||||
####测试
|
||||
|
||||
而如果没有测试,其他都是扯淡。写好测试很难,写个测试算是一件容易的事。只是有些容易我们会为了测试而测试。
|
||||
|
||||
|
|
@ -264,7 +263,7 @@
|
|||
|
||||
测试是代码的最后一公里。所以,尽可能的为你的Github上的项目添加测试。
|
||||
|
||||
###编码的过程
|
||||
####编码的过程
|
||||
|
||||
初到TW时,Pair时候总会有人教我如何开始编码,这应该也是一项基础的能力。结合日常,重新演绎一下这个过程:
|
||||
|
||||
|
|
@ -281,7 +280,7 @@
|
|||
|
||||
在我们实际工作中也是如此,接到一个任务,然后分解,一步步完成。不过实现会稍微复杂一些,因为事务总会有抢占和优先级的。
|
||||
|
||||
##技术与框架设计
|
||||
###技术与框架设计
|
||||
|
||||
在上上一篇博客中《[After 500: 写了第500篇博客,然后呢?](https://www.phodal.com/blog/after-500-blogposts-analytics-after-tech/)》也深刻地讨论了下这个问题,技术向来都是后发者优势。对于技术人员来说,也是如此,后发者占据很大的优势。
|
||||
|
||||
|
|
@ -301,7 +300,7 @@
|
|||
|
||||
技术同人一样,需要不断地往高一级前进。我们只需要不断地Re-Practise。
|
||||
|
||||
##领域与练习
|
||||
###领域与练习
|
||||
|
||||
说业务好像不太适合程序员的口味,那就领域吧。不同行业的人,如百度、阿里、腾讯,他们的领域核心是不一样的。
|
||||
|
||||
|
|
@ -311,7 +310,7 @@
|
|||
|
||||
这也是下一个值得提高的地方。
|
||||
|
||||
##其他
|
||||
###其他
|
||||
|
||||
是时候写这个小结了。从不会写代码,到写代码是从0到1的过程,但是要从1到60都不是一件容易的事。无论是刷Github也好(不要是自动提交),或者是换工作也好,我们都在不断地练习。
|
||||
|
||||
|
|
|
|||
BIN
github-roam.epub
BIN
github-roam.epub
Binary file not shown.
125
github-roam.md
125
github-roam.md
|
|
@ -104,7 +104,6 @@ Wiki百科上是这么说的
|
|||
|
||||
等等。看上去像是大餐,但是你还需要了解点什么?
|
||||
|
||||
|
||||
###版本管理与软件部署
|
||||
|
||||
jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以看到如下的提交信息:
|
||||
|
|
@ -115,8 +114,7 @@ jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以
|
|||
- Build: Move test to appropriate module fbdbb6f
|
||||
- Build: Update commitplease dev dependency
|
||||
- ...
|
||||
|
||||
|
||||
|
||||
###Github与Git
|
||||
|
||||
> Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius、Merb和Bitcoin在内的很多知名项目都使用了Git。Git同样可以被诸如Capistrano和Vlad the Deployer这样的部署工具所使用。
|
||||
|
|
@ -125,8 +123,7 @@ jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以
|
|||
|
||||
[^jQuery]: jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。
|
||||
|
||||
##提高
|
||||
|
||||
##用好Github
|
||||
|
||||
###敏捷软件开发
|
||||
|
||||
|
|
@ -143,7 +140,7 @@ jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以
|
|||
|
||||
当只有一个人的时候,你只需要明确知道自己想要什么就够了。我们还需要的是CI、测试,以来提升代码的质量。
|
||||
|
||||
##测试
|
||||
###测试
|
||||
|
||||
通常我们都会找Document,如果没有的话,你会找什么?看源代码,还是看测试?
|
||||
|
||||
|
|
@ -201,7 +198,7 @@ lettuce.js | 98.58% (209 / 212)| 82.98%(78 / 94) | 100.00% (54 / 54) | 98.58% (2
|
|||
|
||||
本地测试都通过了,于是我们添加了``Travis-CI``来跑我们的测试
|
||||
|
||||
##CI
|
||||
###CI
|
||||
|
||||
虽然node.js不算是一门语言,但是因为我们用的node,下面的是一个简单的``.travis.yml``示例:
|
||||
|
||||
|
|
@ -223,7 +220,7 @@ lettuce.js | 98.58% (209 / 212)| 82.98%(78 / 94) | 100.00% (54 / 54) | 98.58% (2
|
|||
|
||||
CI对于一个开发者在不同城市开发同一项目上来说是很重要的,这意味着当你添加的部分功能有测试覆盖的时候,项目代码会更加强壮。
|
||||
|
||||
##代码质量
|
||||
###代码质量
|
||||
|
||||
像``jslint``这类的工具,只能保证代码在语法上是正确的,但是不能保证你写了一堆bad smell的代码。
|
||||
|
||||
|
|
@ -272,13 +269,13 @@ CI对于一个开发者在不同城市开发同一项目上来说是很重要的
|
|||
|
||||
这就意味着我们可以对上面的代码进行重构,他们是重复的代码。
|
||||
|
||||
##重构
|
||||
###重构
|
||||
|
||||
不想在这里说太多关于``重构``的东西,可以参考Martin Flower的《重构》一书去多了解一些重构的细节。
|
||||
|
||||
这时想说的是,只有代码被测试覆盖住了,那么才能保证重构的过程没有出错。
|
||||
|
||||
#基本知识
|
||||
#Git基本知识与Github使用
|
||||
|
||||
##Git
|
||||
|
||||
|
|
@ -345,12 +342,9 @@ CI对于一个开发者在不同城市开发同一项目上来说是很重要的
|
|||
|
||||
#Github项目分析一
|
||||
|
||||
##用matplotlib生成图表
|
||||
##生成图表
|
||||
|
||||
如何分析用户的数据是一个有趣的问题,特别是当我们有大量的数据的时候。
|
||||
除了``matlab``,我们还可以用``numpy``+``matplotlib``
|
||||
|
||||
###python github用户数据分析##
|
||||
如何分析用户的数据是一个有趣的问题,特别是当我们有大量的数据的时候。除了``matlab``,我们还可以用``numpy``+``matplotlib``
|
||||
|
||||
数据可以在这边寻找到
|
||||
|
||||
|
|
@ -362,11 +356,11 @@ CI对于一个开发者在不同城市开发同一项目上来说是很重要的
|
|||
|
||||
要解析的json文件位于``data/2014-01-01-0.json``,大小6.6M,显然我们可能需要用每次只读一行的策略,这足以解释为什么诸如sublime打开的时候很慢,而现在我们只需要里面的json数据中的创建时间。。
|
||||
|
||||
==这个文件代表什么?
|
||||
==,这个文件代表什么?
|
||||
|
||||
**2014年1月1日零时到一时,用户在github上的操作,这里的用户指的是很多。。一共有4814条数据,从commit、create到issues都有。**
|
||||
|
||||
###python json文件解析##
|
||||
###数据解析
|
||||
|
||||
```python
|
||||
import json
|
||||
|
|
@ -415,7 +409,7 @@ minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)]
|
|||
[(0, 92), (1, 67), (2, 86), (3, 73), (4, 76), (5, 67), (6, 61), (7, 71), (8, 62), (9, 71), (10, 70), (11, 79), (12, 62), (13, 67), (14, 76), (15, 67), (16, 74), (17, 48), (18, 78), (19, 73), (20, 89), (21, 62), (22, 74), (23, 61), (24, 71), (25, 49), (26, 59), (27, 59), (28, 58), (29, 74), (30, 69), (31, 59), (32, 89), (33, 67), (34, 66), (35, 77), (36, 64), (37, 71), (38, 75), (39, 66), (40, 62), (41, 77), (42, 82), (43, 95), (44, 77), (45, 65), (46, 59), (47, 60), (48, 54), (49, 66), (50, 74), (51, 61), (52, 71), (53, 90), (54, 64), (55, 67), (56, 67), (57, 55), (58, 68), (59, 91)]
|
||||
```
|
||||
|
||||
##matplotlib
|
||||
###Matplotlib
|
||||
|
||||
开始之前需要安装``matplotlib
|
||||
|
||||
|
|
@ -531,7 +525,7 @@ draw_date("data/2014-01-01-0.json")
|
|||
8474, 7984, 12933, 13504, 13763, 13544, 12940,
|
||||
7119, 7346, 13412, 14008, 12555
|
||||
|
||||
###python 数据分析
|
||||
###Python 数据分析
|
||||
|
||||
重写了一个新的方法用于计算提交数,直至后面才意识到其实我们可以算行数就够了,但是方法上有点hack
|
||||
|
||||
|
|
@ -580,7 +574,7 @@ def get_month_total():
|
|||
|
||||
接着我们需要去遍历每个结果,后面的后面会发现这个效率真的是太低了,为什么木有多线程?
|
||||
|
||||
###python matplotlib图表
|
||||
###Python Matplotlib图表
|
||||
|
||||
让我们的matplotlib来做这些图表的工作
|
||||
|
||||
|
|
@ -608,7 +602,7 @@ if __name__ == '__main__':
|
|||
|
||||
让我们分析之前的程序,然后再想办法做出优化。网上看到一篇文章[http://www.huyng.com/posts/python-performance-analysis/](http://www.huyng.com/posts/python-performance-analysis/)讲的就是分析这部分内容的。
|
||||
|
||||
##time python分析
|
||||
##Time Python分析
|
||||
|
||||
分析程序的运行时间
|
||||
|
||||
|
|
@ -626,9 +620,6 @@ $time python handle.py
|
|||
|
||||
##line_profiler python
|
||||
|
||||
这是
|
||||
##Mac OS X 10.9 line_profiler Install##
|
||||
|
||||
```bash
|
||||
sudo ARCHFLAGS="-Wno-error=unused-command-line-argument-hard-error-in-future" easy_install line_profiler
|
||||
```
|
||||
|
|
@ -690,17 +681,15 @@ Line # Hits Time Per Hit % Time Line Contents
|
|||
|
||||
于是我们就发现我们的瓶颈就是从读取``created_at``,即创建时间。。。以及解析json,反而不是我们关心的IO,果然``readline``很强大。
|
||||
|
||||
##memory_profiler python
|
||||
##memory_profiler
|
||||
|
||||
###memory_profiler install
|
||||
首先我们需要install memory_profiler:
|
||||
|
||||
```bash
|
||||
$ pip install -U memory_profiler
|
||||
$ pip install psutil
|
||||
```
|
||||
|
||||
###memory_profiler python
|
||||
|
||||
如上,我们只需要在``handle_json``前面加上``@profile``
|
||||
|
||||
```bash
|
||||
|
|
@ -733,7 +722,7 @@ Line # Mem usage Increment Line Contents
|
|||
|
||||
##objgraph python
|
||||
|
||||
###objgraph install
|
||||
安装objgraph
|
||||
|
||||
```bash
|
||||
pip install objgraph
|
||||
|
|
@ -831,8 +820,6 @@ def get_count(username):
|
|||
|
||||
这个数据库文件有**905M**,不过查询结果相当让人满意,至少相对于原来的结果来说。
|
||||
|
||||
##Python SQLite3
|
||||
|
||||
Python自带了对SQLite3的支持,然而我们还需要安装SQLite3
|
||||
|
||||
```bash
|
||||
|
|
@ -859,7 +846,7 @@ sudo zypper install sqlite3
|
|||
|
||||
不过,用yast2也很不错,不是么。。
|
||||
|
||||
##Pythont Github Sqlite3数据导入
|
||||
###数据导入
|
||||
|
||||
需要注意的是这里是需要python2.7,起源于对gzip的上下文管理器的支持问题
|
||||
|
||||
|
|
@ -915,8 +902,6 @@ def build_db_with_gzip():
|
|||
|
||||
``executemany``可以插入多条数据,对于我们的数据来说,一小时的文件大概有五六千个会符合我们上面的安装,也就是有``actor``又有``type``才是我们需要记录的数据,我们只需要统计用户的那些事件,而非全部的事件。
|
||||
|
||||
##python 遍历文件##
|
||||
|
||||
我们需要去遍历文件,然后找到合适的部分,这里只是要找``2014-03-01``到``2014-03-31``的全部事件,而光这些数据的gz文件就有1.26G,同上面那些解压为json文件显得不合适,只能用遍历来处理。
|
||||
|
||||
这里参考了osrc项目中的写法,或者说直接复制过来。
|
||||
|
|
@ -939,11 +924,7 @@ date_re = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]+)\.json.gz")
|
|||
|
||||
更好的方案?
|
||||
|
||||
###redis
|
||||
|
||||
结合了前面两篇我们终于可以成功地读取出用户数据、处理,再接着可以找相近的用户。
|
||||
|
||||
##Python Redis
|
||||
##Redis
|
||||
|
||||
查询用户事件总数
|
||||
|
||||
|
|
@ -992,7 +973,7 @@ pipe.execute()
|
|||
|
||||
到这里我们算是知道了OSRC的数据库部分是如何工作的。
|
||||
|
||||
###Python redis 查询
|
||||
###Redis 查询
|
||||
|
||||
主要代码如下所示
|
||||
|
||||
|
|
@ -1035,7 +1016,8 @@ def get_vector(user, pipe=None):
|
|||
|
||||
osrc最有意思的一部分莫过于flann,当然说的也是系统后台的设计的一个很关键及有意思的部分。
|
||||
|
||||
##Python Github
|
||||
##邻近算法
|
||||
|
||||
邻近算法是在这个分析过程中一个很有意思的东西。
|
||||
|
||||
>邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法可以说是整个数据挖掘分类技术中最简单的方法了。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用她最接近的k个邻居来代表。
|
||||
|
|
@ -1186,14 +1168,16 @@ C | 2
|
|||
|
||||
##Google Ngx Pagespeed
|
||||
|
||||
else
|
||||
cat << END
|
||||
$0: error: module ngx_pagespeed requires the pagespeed optimization library.
|
||||
-Look in obj/autoconf.err for more details.
|
||||
+Look in objs/autoconf.err for more details.
|
||||
END
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
else
|
||||
cat << END
|
||||
$0: error: module ngx_pagespeed requires the pagespeed optimization library.
|
||||
-Look in obj/autoconf.err for more details.
|
||||
+Look in objs/autoconf.err for more details.
|
||||
END
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
#创建你的项目
|
||||
|
||||
|
|
@ -1205,7 +1189,9 @@ C | 2
|
|||
|
||||
#重构
|
||||
|
||||
#Github 100天
|
||||
#Github连击
|
||||
|
||||
##100天
|
||||
|
||||
我也是蛮拼的,虽然我想的只是在Github上连击100~200天,然而到了今天也算不错。
|
||||
|
||||
|
|
@ -1229,8 +1215,7 @@ C | 2
|
|||
|
||||
而现在是``为了填坑而commit``,为自己挖了太多的想法。
|
||||
|
||||
|
||||
##40天的提升
|
||||
###40天的提升
|
||||
|
||||
当时我需要去印度接受毕业生培训,大概有5周左右,想着总不能空手而归。于是在国庆结束后有了第一次commit,当时旅游归来,想着自己在不同的地方有不同的照片,于是这个repo的名字是 [onmap](https://github.com/phodal/onmap)——将自己的照片显示在地图上的拍摄地点(手机是Lumia 920)。然而,中间因为修改账号的原因,丢失了commit。
|
||||
|
||||
|
|
@ -1256,7 +1241,7 @@ C | 2
|
|||
- 对于Mock、Stub、FakesServer等用法有更好的掌握
|
||||
- 可以持续地交付软件(版本管理、自动测试、CI、部署等等)
|
||||
|
||||
##100天的挑战
|
||||
###100天的挑战
|
||||
|
||||
(ps:从印度回来之后,由于女朋友在泰国实习,有了更多的时间可以看书、写代码)
|
||||
|
||||
|
|
@ -1272,7 +1257,7 @@ C | 2
|
|||
- 没有足够的空闲时间,除了周末。
|
||||
- 希望去寻找那些有兴趣的人,然而却发现原来没有那么多时间去找人。
|
||||
|
||||
##140天的希冀
|
||||
###140天的希冀
|
||||
|
||||
在经历了100天之后,似乎整个人都轻松了,毕竟目标是100~200天。似乎到现在,也不会有什么特殊的情怀,除了一些希冀。
|
||||
|
||||
|
|
@ -1285,7 +1270,7 @@ C | 2
|
|||
- 提了bug,并解决了。(ps:这是最理想的情况)
|
||||
|
||||
|
||||
#Github 200天Showcase
|
||||
##200天的Showcase
|
||||
|
||||
今天是我连续泡在Github上的第200天,也是蛮高兴的,终于到达了:
|
||||
|
||||
|
|
@ -1297,7 +1282,7 @@ C | 2
|
|||
|
||||
先让我们来一下ShowCase,然后再然后,下一篇我们再继续。
|
||||
|
||||
##一些项目简述
|
||||
###一些项目简述
|
||||
|
||||
上面说到的培训一开始是用Java写的一个网站,有自动测试、CI、CD等等。由于是内部组队培训,代码不能公开等等因素,加之做得无聊。顺手,拿Node.js +RESTify 做了Server,Backbone + RequireJS + jQuery 做了前台的逻辑。于是在那个日子里,也在维护一些旧的repo,如[iot-coap](https://github.com/phodal/iot-coap)、[iot](https://github.com/phodal/iot),前者是我拿到WebStorm开源License的Repo,后者则是毕业设计。
|
||||
|
||||
|
|
@ -1341,7 +1326,7 @@ C | 2
|
|||
|
||||
这个可以从两部分说起:
|
||||
|
||||
#### 重构Skill Tree
|
||||
####重构Skill Tree
|
||||
|
||||
原来的是
|
||||
|
||||
|
|
@ -1368,7 +1353,7 @@ C | 2
|
|||
|
||||
代码: [https://github.com/phodal/sherlock](https://github.com/phodal/sherlock)
|
||||
|
||||
###Django Ionic ElasticSearch 地图搜索
|
||||
####Django Ionic ElasticSearch 地图搜索
|
||||
|
||||

|
||||
|
||||
|
|
@ -1379,7 +1364,7 @@ C | 2
|
|||
|
||||
代码: [https://github.com/phodal/django-elasticsearch](https://github.com/phodal/django-elasticsearch)
|
||||
|
||||
###简历生成器
|
||||
####简历生成器
|
||||
|
||||

|
||||
|
||||
|
|
@ -1392,7 +1377,7 @@ C | 2
|
|||
代码: [https://github.com/phodal/resume](https://github.com/phodal/resume)
|
||||
|
||||
|
||||
###Nginx 大数据学习
|
||||
####Nginx 大数据学习
|
||||
|
||||

|
||||
|
||||
|
|
@ -1402,7 +1387,7 @@ C | 2
|
|||
|
||||
代码: [https://github.com/phodal/learning-data/tree/master/nginx](https://github.com/phodal/learning-data/tree/master/nginx)
|
||||
|
||||
###其他
|
||||
####其他
|
||||
|
||||
虽然技术栈上主要集中在Python、JavaScript,当然还有一些Ruby、Pig、Shell、Java的代码,只是我还是习惯用Python和JavaScript。一些用到觉得不错的框架:
|
||||
|
||||
|
|
@ -1425,7 +1410,7 @@ C | 2
|
|||
- MongoDB
|
||||
- Redis
|
||||
|
||||
#Github 365天
|
||||
##365天
|
||||
|
||||
给你一年的时间,你会怎样去提高你的水平???
|
||||
|
||||
|
|
@ -1433,8 +1418,6 @@ C | 2
|
|||
|
||||
正值这难得的sick leave(万恶的空气),码文一篇来记念一个过去的366天里。尽管想的是在今年里写一个可持续的开源框架,但是到底这依赖于一个好的idea。在我的[Github 孵化器](http://github.com/phodal/ideas) 页面上似乎也没有一个特别让我满意的想法,虽然上面有各种不样有意思的ideas。多数都是在过去的一年是完成的,然而有一些也是还没有做到的。
|
||||
|
||||
##说说标题
|
||||
|
||||
尽管一直在Github上连击看上去似乎是没有多大必要的,但是人总得有点追求。如果正是漫无目的,却又想着提高技术的同时,为什么不去试试?毕竟技术非常好、不需要太多练习的人只是少数,似乎这样的人是不存在的。大多数的人都是经过练习之后,才会达到别人口中的“技术好”。
|
||||
|
||||
这让我想起了充斥着各种气味的知乎上的一些问题,在一些智商被完虐的话题里,无一不是因为那些人学得比别人早——哪来的天才?所谓的天才,应该是未来的智能生命一般,一出生什么都知道。如果并非如此,那只是说明他练习到位了。
|
||||
|
|
@ -1445,19 +1428,19 @@ C | 2
|
|||
|
||||
于是在想明白了很多事的时候起,便有了Re-Practise这样的计划,而365天只是中间的一个产物。
|
||||
|
||||
##编程的基础能力
|
||||
###编程的基础能力
|
||||
|
||||
虽说算法很重要,但是编码才是基础能力。算法与编程在某种程度上是不同的领域,算法编程是在编程上面的一级。算法写得再好,如果别人很难直接拿来复用,在别人眼里就是shit。想出能work的代码一件简单的事,学会对其重构,使之变得更易读就是一件有意义的事。
|
||||
|
||||
于是,在某一时刻在Github上创建了一个组织,叫[Artisan Stack](https://github.com/artisanstack)。当时想的是在Github寻找一些JavaScript项目,对其代码进行重构。但是到底是影响力不够哈,参与的人数比较少。
|
||||
|
||||
###重构
|
||||
####重构
|
||||
|
||||
如果你懂得如何写出高可读的代码,那么我想你是不需要这个的,但是这意味着你花了更多的时候在思考上了。当谈论重构的时候,让我想起了TDD(测试驱动开发)。即使不是TDD,那么如果你写着测试,那也是可以重构的。(之前写过一些利用Intellij IDEA重构的文章:[提炼函数](https://www.phodal.com/blog/intellij-idea-refactor-extract-method/)、[以查询取代临时变量](https://www.phodal.com/blog/intellij-idea-refactor-replace-temp-with-query/)、[重构与Intellij Idea初探](https://www.phodal.com/blog/thoughtworks-refactor-and-intellij-idea/)、[内联函数](https://www.phodal.com/blog/intellij-idea-refactor-inline-method/))
|
||||
|
||||
在各种各样的文章里,我们看到过一些相关的内容,最好的参考莫过于《重构》一书。最基础不过的原则便是函数名,取名字很难,取别人能读懂的名字更难。其他的便有诸如长函数、过大的类、重复代码等等。在我有限的面试别人的经历里,这些问题都是最常见的。
|
||||
|
||||
###测试
|
||||
####测试
|
||||
|
||||
而如果没有测试,其他都是扯淡。写好测试很难,写个测试算是一件容易的事。只是有些容易我们会为了测试而测试。
|
||||
|
||||
|
|
@ -1471,7 +1454,7 @@ C | 2
|
|||
|
||||
测试是代码的最后一公里。所以,尽可能的为你的Github上的项目添加测试。
|
||||
|
||||
###编码的过程
|
||||
####编码的过程
|
||||
|
||||
初到TW时,Pair时候总会有人教我如何开始编码,这应该也是一项基础的能力。结合日常,重新演绎一下这个过程:
|
||||
|
||||
|
|
@ -1488,7 +1471,7 @@ C | 2
|
|||
|
||||
在我们实际工作中也是如此,接到一个任务,然后分解,一步步完成。不过实现会稍微复杂一些,因为事务总会有抢占和优先级的。
|
||||
|
||||
##技术与框架设计
|
||||
###技术与框架设计
|
||||
|
||||
在上上一篇博客中《[After 500: 写了第500篇博客,然后呢?](https://www.phodal.com/blog/after-500-blogposts-analytics-after-tech/)》也深刻地讨论了下这个问题,技术向来都是后发者优势。对于技术人员来说,也是如此,后发者占据很大的优势。
|
||||
|
||||
|
|
@ -1508,7 +1491,7 @@ C | 2
|
|||
|
||||
技术同人一样,需要不断地往高一级前进。我们只需要不断地Re-Practise。
|
||||
|
||||
##领域与练习
|
||||
###领域与练习
|
||||
|
||||
说业务好像不太适合程序员的口味,那就领域吧。不同行业的人,如百度、阿里、腾讯,他们的领域核心是不一样的。
|
||||
|
||||
|
|
@ -1518,7 +1501,7 @@ C | 2
|
|||
|
||||
这也是下一个值得提高的地方。
|
||||
|
||||
##其他
|
||||
###其他
|
||||
|
||||
是时候写这个小结了。从不会写代码,到写代码是从0到1的过程,但是要从1到60都不是一件容易的事。无论是刷Github也好(不要是自动提交),或者是换工作也好,我们都在不断地练习。
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
150
index.html
150
index.html
|
|
@ -78,52 +78,43 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
<li><a href="#什么是github">什么是Github</a></li>
|
||||
<li><a href="#版本管理与软件部署">版本管理与软件部署</a></li>
|
||||
<li><a href="#github与git">Github与Git</a></li>
|
||||
<li><a href="#提高">提高</a><ul>
|
||||
<li><a href="#用好github">用好Github</a><ul>
|
||||
<li><a href="#敏捷软件开发">敏捷软件开发</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#测试">测试</a></li>
|
||||
<li><a href="#ci">CI</a></li>
|
||||
<li><a href="#代码质量">代码质量</a></li>
|
||||
<li><a href="#重构">重构</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#基本知识">基本知识</a><ul>
|
||||
</ul></li>
|
||||
<li><a href="#git基本知识与github使用">Git基本知识与Github使用</a><ul>
|
||||
<li><a href="#git">Git</a><ul>
|
||||
<li><a href="#git初入">Git初入</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#github">Github</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#github项目分析一">Github项目分析一</a><ul>
|
||||
<li><a href="#用matplotlib生成图表">用matplotlib生成图表</a><ul>
|
||||
<li><a href="#python-github用户数据分析">python github用户数据分析</a></li>
|
||||
<li><a href="#python-json文件解析">python json文件解析</a></li>
|
||||
<li><a href="#生成图表">生成图表</a><ul>
|
||||
<li><a href="#数据解析">数据解析</a></li>
|
||||
<li><a href="#matplotlib">Matplotlib</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#matplotlib">matplotlib</a></li>
|
||||
<li><a href="#每周分析">每周分析</a><ul>
|
||||
<li><a href="#python-github-每周情况分析">python github 每周情况分析</a></li>
|
||||
<li><a href="#python-数据分析">python 数据分析</a></li>
|
||||
<li><a href="#python-matplotlib图表">python matplotlib图表</a></li>
|
||||
<li><a href="#python-数据分析">Python 数据分析</a></li>
|
||||
<li><a href="#python-matplotlib图表">Python Matplotlib图表</a></li>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
<li><a href="#github项目分析二">Github项目分析二</a><ul>
|
||||
<li><a href="#time-python分析">time python分析</a></li>
|
||||
<li><a href="#time-python分析">Time Python分析</a></li>
|
||||
<li><a href="#line_profiler-python">line_profiler python</a></li>
|
||||
<li><a href="#memory_profiler-python">memory_profiler python</a><ul>
|
||||
<li><a href="#memory_profiler-install">memory_profiler install</a></li>
|
||||
<li><a href="#memory_profiler-python-1">memory_profiler python</a></li>
|
||||
<li><a href="#memory_profiler">memory_profiler</a></li>
|
||||
<li><a href="#objgraph-python">objgraph python</a></li>
|
||||
<li><a href="#python-sqlite3-查询数据">python SQLite3 查询数据</a><ul>
|
||||
<li><a href="#数据导入">数据导入</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#objgraph-python">objgraph python</a><ul>
|
||||
<li><a href="#objgraph-install">objgraph install</a></li>
|
||||
<li><a href="#redis">Redis</a><ul>
|
||||
<li><a href="#redis-查询">Redis 查询</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#python-sqlite3-查询数据">python SQLite3 查询数据</a></li>
|
||||
<li><a href="#python-sqlite3">Python SQLite3</a></li>
|
||||
<li><a href="#pythont-github-sqlite3数据导入">Pythont Github Sqlite3数据导入</a></li>
|
||||
<li><a href="#python-遍历文件">python 遍历文件</a><ul>
|
||||
<li><a href="#redis">redis</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#python-redis">Python Redis</a><ul>
|
||||
<li><a href="#python-redis-查询">Python redis 查询</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#python-github">Python Github</a></li>
|
||||
<li><a href="#邻近算法">邻近算法</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#github项目分析">Github项目分析</a></li>
|
||||
<li><a href="#创建pull-request">创建Pull Request</a><ul>
|
||||
|
|
@ -135,32 +126,24 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
<li><a href="#创建项目文档">创建项目文档</a></li>
|
||||
<li><a href="#测试-1">测试</a></li>
|
||||
<li><a href="#重构-1">重构</a></li>
|
||||
<li><a href="#github-100天">Github 100天</a><ul>
|
||||
<li><a href="#github连击">Github连击</a><ul>
|
||||
<li><a href="#天">100天</a><ul>
|
||||
<li><a href="#天的提升">40天的提升</a></li>
|
||||
<li><a href="#天的挑战">100天的挑战</a></li>
|
||||
<li><a href="#天的希冀">140天的希冀</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#github-200天showcase">Github 200天Showcase</a><ul>
|
||||
<li><a href="#一些项目简述">一些项目简述</a><ul>
|
||||
<li><a href="#天的showcase">200天的Showcase</a><ul>
|
||||
<li><a href="#一些项目简述">一些项目简述</a></li>
|
||||
<li><a href="#google-map-solr-polygon-搜索">google map solr polygon 搜索</a></li>
|
||||
<li><a href="#技能树">技能树</a></li>
|
||||
<li><a href="#django-ionic-elasticsearch-地图搜索">Django Ionic ElasticSearch 地图搜索</a></li>
|
||||
<li><a href="#简历生成器">简历生成器</a></li>
|
||||
<li><a href="#nginx-大数据学习">Nginx 大数据学习</a></li>
|
||||
<li><a href="#其他">其他</a></li>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
<li><a href="#github-365天">Github 365天</a><ul>
|
||||
<li><a href="#说说标题">说说标题</a></li>
|
||||
<li><a href="#编程的基础能力">编程的基础能力</a><ul>
|
||||
<li><a href="#重构-2">重构</a></li>
|
||||
<li><a href="#测试-2">测试</a></li>
|
||||
<li><a href="#编码的过程">编码的过程</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#天-1">365天</a><ul>
|
||||
<li><a href="#编程的基础能力">编程的基础能力</a></li>
|
||||
<li><a href="#技术与框架设计">技术与框架设计</a></li>
|
||||
<li><a href="#领域与练习">领域与练习</a></li>
|
||||
<li><a href="#其他-1">其他</a></li>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
<li><a href="#如何在github寻找灵感fork">如何在Github“寻找灵感(fork)”</a><ul>
|
||||
<li><a href="#一lettuce构建过程">一、<a href="https://github.com/phodal/lettuce">Lettuce</a>构建过程</a><ul>
|
||||
<li><a href="#需求">需求</a></li>
|
||||
|
|
@ -260,7 +243,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
<blockquote>
|
||||
<p>GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。</p>
|
||||
</blockquote>
|
||||
<h2 id="提高">提高</h2>
|
||||
<h2 id="用好github">用好Github</h2>
|
||||
<h3 id="敏捷软件开发">敏捷软件开发</h3>
|
||||
<p>显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧:</p>
|
||||
<ul>
|
||||
|
|
@ -274,7 +257,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
<p>你存在,我深深的脑海里</p>
|
||||
</blockquote>
|
||||
<p>当只有一个人的时候,你只需要明确知道自己想要什么就够了。我们还需要的是CI、测试,以来提升代码的质量。</p>
|
||||
<h2 id="测试">测试</h2>
|
||||
<h3 id="测试">测试</h3>
|
||||
<p>通常我们都会找Document,如果没有的话,你会找什么?看源代码,还是看测试?</p>
|
||||
<pre><code>it("specifying response when you need it", function (done) {
|
||||
var doneFn = jasmine.createSpy("success");
|
||||
|
|
@ -337,7 +320,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
</tbody>
|
||||
</table>
|
||||
<p>本地测试都通过了,于是我们添加了<code>Travis-CI</code>来跑我们的测试</p>
|
||||
<h2 id="ci">CI</h2>
|
||||
<h3 id="ci">CI</h3>
|
||||
<p>虽然node.js不算是一门语言,但是因为我们用的node,下面的是一个简单的<code>.travis.yml</code>示例:</p>
|
||||
<pre><code>language: node_js
|
||||
node_js:
|
||||
|
|
@ -352,7 +335,7 @@ after_success: CODECLIMATE_REPO_TOKEN=321480822fc37deb0de70a11931b4cb6a2a3cc4116
|
|||
<p>代码来源: <a href="https://github.com/phodal/lettuce" class="uri">https://github.com/phodal/lettuce</a></p>
|
||||
<p>我们把这些集成到<code>README.md</code>之后,就有了之前那张图。</p>
|
||||
<p>CI对于一个开发者在不同城市开发同一项目上来说是很重要的,这意味着当你添加的部分功能有测试覆盖的时候,项目代码会更加强壮。</p>
|
||||
<h2 id="代码质量">代码质量</h2>
|
||||
<h3 id="代码质量">代码质量</h3>
|
||||
<p>像<code>jslint</code>这类的工具,只能保证代码在语法上是正确的,但是不能保证你写了一堆bad smell的代码。</p>
|
||||
<ul>
|
||||
<li>重复代码</li>
|
||||
|
|
@ -395,10 +378,10 @@ Lettuce.send = function (url, method, callback, data) {
|
|||
<li>Similar code found in two :expression_statement nodes (mass = 86)</li>
|
||||
</ul>
|
||||
<p>这就意味着我们可以对上面的代码进行重构,他们是重复的代码。</p>
|
||||
<h2 id="重构">重构</h2>
|
||||
<h3 id="重构">重构</h3>
|
||||
<p>不想在这里说太多关于<code>重构</code>的东西,可以参考Martin Flower的《重构》一书去多了解一些重构的细节。</p>
|
||||
<p>这时想说的是,只有代码被测试覆盖住了,那么才能保证重构的过程没有出错。</p>
|
||||
<h1 id="基本知识">基本知识</h1>
|
||||
<h1 id="git基本知识与github使用">Git基本知识与Github使用</h1>
|
||||
<h2 id="git">Git</h2>
|
||||
<p>从一般开发者的角度来看,git有以下功能:</p>
|
||||
<ol type="1">
|
||||
|
|
@ -451,9 +434,8 @@ git push -u origin master</code></pre>
|
|||
git push -u origin master
|
||||
</code></pre>
|
||||
<h1 id="github项目分析一">Github项目分析一</h1>
|
||||
<h2 id="用matplotlib生成图表">用matplotlib生成图表</h2>
|
||||
<p>如何分析用户的数据是一个有趣的问题,特别是当我们有大量的数据的时候。 除了<code>matlab</code>,我们还可以用<code>numpy</code>+<code>matplotlib</code></p>
|
||||
<h3 id="python-github用户数据分析">python github用户数据分析</h3>
|
||||
<h2 id="生成图表">生成图表</h2>
|
||||
<p>如何分析用户的数据是一个有趣的问题,特别是当我们有大量的数据的时候。除了<code>matlab</code>,我们还可以用<code>numpy</code>+<code>matplotlib</code></p>
|
||||
<p>数据可以在这边寻找到</p>
|
||||
<p><a href="https://github.com/gmszone/ml" class="uri">https://github.com/gmszone/ml</a></p>
|
||||
<p>最后效果图</p>
|
||||
|
|
@ -461,9 +443,9 @@ git push -u origin master
|
|||
<img src="./img/2014-01-01.png" alt="2014 01 01" /><figcaption>2014 01 01</figcaption>
|
||||
</figure>
|
||||
<p>要解析的json文件位于<code>data/2014-01-01-0.json</code>,大小6.6M,显然我们可能需要用每次只读一行的策略,这足以解释为什么诸如sublime打开的时候很慢,而现在我们只需要里面的json数据中的创建时间。。</p>
|
||||
<p>==这个文件代表什么?</p>
|
||||
<p>==,这个文件代表什么?</p>
|
||||
<p><strong>2014年1月1日零时到一时,用户在github上的操作,这里的用户指的是很多。。一共有4814条数据,从commit、create到issues都有。</strong></p>
|
||||
<h3 id="python-json文件解析">python json文件解析</h3>
|
||||
<h3 id="数据解析">数据解析</h3>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> json
|
||||
<span class="cf">for</span> line <span class="op">in</span> <span class="bu">open</span>(jsonfile):
|
||||
line <span class="op">=</span> f.readline()</code></pre></div>
|
||||
|
|
@ -492,7 +474,7 @@ date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"
|
|||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python">minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">set</span>(dataarray)]</code></pre></div>
|
||||
<p>这样的数组以便于解析</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python">[(<span class="dv">0</span>, <span class="dv">92</span>), (<span class="dv">1</span>, <span class="dv">67</span>), (<span class="dv">2</span>, <span class="dv">86</span>), (<span class="dv">3</span>, <span class="dv">73</span>), (<span class="dv">4</span>, <span class="dv">76</span>), (<span class="dv">5</span>, <span class="dv">67</span>), (<span class="dv">6</span>, <span class="dv">61</span>), (<span class="dv">7</span>, <span class="dv">71</span>), (<span class="dv">8</span>, <span class="dv">62</span>), (<span class="dv">9</span>, <span class="dv">71</span>), (<span class="dv">10</span>, <span class="dv">70</span>), (<span class="dv">11</span>, <span class="dv">79</span>), (<span class="dv">12</span>, <span class="dv">62</span>), (<span class="dv">13</span>, <span class="dv">67</span>), (<span class="dv">14</span>, <span class="dv">76</span>), (<span class="dv">15</span>, <span class="dv">67</span>), (<span class="dv">16</span>, <span class="dv">74</span>), (<span class="dv">17</span>, <span class="dv">48</span>), (<span class="dv">18</span>, <span class="dv">78</span>), (<span class="dv">19</span>, <span class="dv">73</span>), (<span class="dv">20</span>, <span class="dv">89</span>), (<span class="dv">21</span>, <span class="dv">62</span>), (<span class="dv">22</span>, <span class="dv">74</span>), (<span class="dv">23</span>, <span class="dv">61</span>), (<span class="dv">24</span>, <span class="dv">71</span>), (<span class="dv">25</span>, <span class="dv">49</span>), (<span class="dv">26</span>, <span class="dv">59</span>), (<span class="dv">27</span>, <span class="dv">59</span>), (<span class="dv">28</span>, <span class="dv">58</span>), (<span class="dv">29</span>, <span class="dv">74</span>), (<span class="dv">30</span>, <span class="dv">69</span>), (<span class="dv">31</span>, <span class="dv">59</span>), (<span class="dv">32</span>, <span class="dv">89</span>), (<span class="dv">33</span>, <span class="dv">67</span>), (<span class="dv">34</span>, <span class="dv">66</span>), (<span class="dv">35</span>, <span class="dv">77</span>), (<span class="dv">36</span>, <span class="dv">64</span>), (<span class="dv">37</span>, <span class="dv">71</span>), (<span class="dv">38</span>, <span class="dv">75</span>), (<span class="dv">39</span>, <span class="dv">66</span>), (<span class="dv">40</span>, <span class="dv">62</span>), (<span class="dv">41</span>, <span class="dv">77</span>), (<span class="dv">42</span>, <span class="dv">82</span>), (<span class="dv">43</span>, <span class="dv">95</span>), (<span class="dv">44</span>, <span class="dv">77</span>), (<span class="dv">45</span>, <span class="dv">65</span>), (<span class="dv">46</span>, <span class="dv">59</span>), (<span class="dv">47</span>, <span class="dv">60</span>), (<span class="dv">48</span>, <span class="dv">54</span>), (<span class="dv">49</span>, <span class="dv">66</span>), (<span class="dv">50</span>, <span class="dv">74</span>), (<span class="dv">51</span>, <span class="dv">61</span>), (<span class="dv">52</span>, <span class="dv">71</span>), (<span class="dv">53</span>, <span class="dv">90</span>), (<span class="dv">54</span>, <span class="dv">64</span>), (<span class="dv">55</span>, <span class="dv">67</span>), (<span class="dv">56</span>, <span class="dv">67</span>), (<span class="dv">57</span>, <span class="dv">55</span>), (<span class="dv">58</span>, <span class="dv">68</span>), (<span class="dv">59</span>, <span class="dv">91</span>)]</code></pre></div>
|
||||
<h2 id="matplotlib">matplotlib</h2>
|
||||
<h3 id="matplotlib">Matplotlib</h3>
|
||||
<p>开始之前需要安装``matplotlib</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> pip install matplotlib</code></pre></div>
|
||||
<p>然后引入这个库</p>
|
||||
|
|
@ -586,7 +568,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
<pre><code> 6570, 7420, 11274, 12073, 12160, 12378, 12897,
|
||||
8474, 7984, 12933, 13504, 13763, 13544, 12940,
|
||||
7119, 7346, 13412, 14008, 12555</code></pre>
|
||||
<h3 id="python-数据分析">python 数据分析</h3>
|
||||
<h3 id="python-数据分析">Python 数据分析</h3>
|
||||
<p>重写了一个新的方法用于计算提交数,直至后面才意识到其实我们可以算行数就够了,但是方法上有点hack</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="kw">def</span> get_minutes_counts_with_id(jsonfile):
|
||||
datacount, dataarray <span class="op">=</span> handle_json(jsonfile)
|
||||
|
|
@ -629,7 +611,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
monthdaycount.append(get_minutes_count_num(filename))
|
||||
<span class="cf">return</span> monthdaycount</code></pre></div>
|
||||
<p>接着我们需要去遍历每个结果,后面的后面会发现这个效率真的是太低了,为什么木有多线程?</p>
|
||||
<h3 id="python-matplotlib图表">python matplotlib图表</h3>
|
||||
<h3 id="python-matplotlib图表">Python Matplotlib图表</h3>
|
||||
<p>让我们的matplotlib来做这些图表的工作</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="cf">if</span> <span class="va">__name__</span> <span class="op">==</span> <span class="st">'__main__'</span>:
|
||||
results <span class="op">=</span> pd.get_month_total()
|
||||
|
|
@ -645,7 +627,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
<p>我们还需要优化方法,以及多线程的支持。</p>
|
||||
<h1 id="github项目分析二">Github项目分析二</h1>
|
||||
<p>让我们分析之前的程序,然后再想办法做出优化。网上看到一篇文章<a href="http://www.huyng.com/posts/python-performance-analysis/" class="uri">http://www.huyng.com/posts/python-performance-analysis/</a>讲的就是分析这部分内容的。</p>
|
||||
<h2 id="time-python分析">time python分析</h2>
|
||||
<h2 id="time-python分析">Time Python分析</h2>
|
||||
<p>分析程序的运行时间</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ot">$time</span> <span class="kw">python</span> handle.py</code></pre></div>
|
||||
<p>结果便是,但是对于我们的分析没有一点意义</p>
|
||||
|
|
@ -653,7 +635,6 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
user 0m39.226s
|
||||
sys 0m0.618s</code></pre>
|
||||
<h2 id="line_profiler-python">line_profiler python</h2>
|
||||
<p>这是 ##Mac OS X 10.9 line_profiler Install##</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> ARCHFLAGS=<span class="st">"-Wno-error=unused-command-line-argument-hard-error-in-future"</span> easy_install line_profiler</code></pre></div>
|
||||
<p>然后在我们的<code>parse_data.py</code>的<code>handle_json</code>前面加上<code>@profile</code></p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="at">@profile</span>
|
||||
|
|
@ -699,11 +680,10 @@ Line # Hits Time Per Hit % Time Line Contents
|
|||
28 19 349 18.4 0.0 f.close()
|
||||
29 19 20 1.1 0.0 return datacount, dataarray</code></pre>
|
||||
<p>于是我们就发现我们的瓶颈就是从读取<code>created_at</code>,即创建时间。。。以及解析json,反而不是我们关心的IO,果然<code>readline</code>很强大。</p>
|
||||
<h2 id="memory_profiler-python">memory_profiler python</h2>
|
||||
<h3 id="memory_profiler-install">memory_profiler install</h3>
|
||||
<h2 id="memory_profiler">memory_profiler</h2>
|
||||
<p>首先我们需要install memory_profiler:</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash">$ <span class="kw">pip</span> install -U memory_profiler
|
||||
$ <span class="kw">pip</span> install psutil</code></pre></div>
|
||||
<h3 id="memory_profiler-python-1">memory_profiler python</h3>
|
||||
<p>如上,我们只需要在<code>handle_json</code>前面加上<code>@profile</code></p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">python</span> -m memory_profiler handle.py</code></pre></div>
|
||||
<p>于是</p>
|
||||
|
|
@ -727,7 +707,7 @@ Line # Mem usage Increment Line Contents
|
|||
26 f.close()
|
||||
27 return datacount, dataarray</code></pre>
|
||||
<h2 id="objgraph-python">objgraph python</h2>
|
||||
<h3 id="objgraph-install">objgraph install</h3>
|
||||
<p>安装objgraph</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">pip</span> install objgraph</code></pre></div>
|
||||
<p>我们需要调用他</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> pdb<span class="op">;</span></code></pre></div>
|
||||
|
|
@ -781,7 +761,6 @@ type 705</code></pre>
|
|||
<p>值得注意的是。</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">-rw-r--r--</span> 1 fdhuang staff 905M Apr 12 14:59 userdata.db</code></pre></div>
|
||||
<p>这个数据库文件有<strong>905M</strong>,不过查询结果相当让人满意,至少相对于原来的结果来说。</p>
|
||||
<h2 id="python-sqlite3">Python SQLite3</h2>
|
||||
<p>Python自带了对SQLite3的支持,然而我们还需要安装SQLite3</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">brew</span> install sqlite3</code></pre></div>
|
||||
<p>或者是</p>
|
||||
|
|
@ -791,7 +770,7 @@ type 705</code></pre>
|
|||
<p>openSUSE自然就是</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> zypper install sqlite3</code></pre></div>
|
||||
<p>不过,用yast2也很不错,不是么。。</p>
|
||||
<h2 id="pythont-github-sqlite3数据导入">Pythont Github Sqlite3数据导入</h2>
|
||||
<h3 id="数据导入">数据导入</h3>
|
||||
<p>需要注意的是这里是需要python2.7,起源于对gzip的上下文管理器的支持问题</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="kw">def</span> handle_gzip_file(filename):
|
||||
userinfo <span class="op">=</span> []
|
||||
|
|
@ -841,7 +820,6 @@ type 705</code></pre>
|
|||
conn.commit()
|
||||
c.close()</code></pre></div>
|
||||
<p><code>executemany</code>可以插入多条数据,对于我们的数据来说,一小时的文件大概有五六千个会符合我们上面的安装,也就是有<code>actor</code>又有<code>type</code>才是我们需要记录的数据,我们只需要统计用户的那些事件,而非全部的事件。</p>
|
||||
<h2 id="python-遍历文件">python 遍历文件</h2>
|
||||
<p>我们需要去遍历文件,然后找到合适的部分,这里只是要找<code>2014-03-01</code>到<code>2014-03-31</code>的全部事件,而光这些数据的gz文件就有1.26G,同上面那些解压为json文件显得不合适,只能用遍历来处理。</p>
|
||||
<p>这里参考了osrc项目中的写法,或者说直接复制过来。</p>
|
||||
<p>首先是正规匹配</p>
|
||||
|
|
@ -854,9 +832,7 @@ type 705</code></pre>
|
|||
<p>最后代码可以见</p>
|
||||
<p><a href="http://github.com/gmszone/ml">github.com/gmszone/ml</a></p>
|
||||
<p>更好的方案?</p>
|
||||
<h3 id="redis">redis</h3>
|
||||
<p>结合了前面两篇我们终于可以成功地读取出用户数据、处理,再接着可以找相近的用户。</p>
|
||||
<h2 id="python-redis">Python Redis</h2>
|
||||
<h2 id="redis">Redis</h2>
|
||||
<p>查询用户事件总数</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> redis
|
||||
r <span class="op">=</span> redis.StrictRedis(host<span class="op">=</span><span class="st">'localhost'</span>, port<span class="op">=</span><span class="dv">6379</span>, db<span class="op">=</span><span class="dv">0</span>)
|
||||
|
|
@ -889,7 +865,7 @@ pipe.execute()</code></pre></div>
|
|||
</figure>
|
||||
<p>蓝色的就是push事件,黄色的是create等等。</p>
|
||||
<p>到这里我们算是知道了OSRC的数据库部分是如何工作的。</p>
|
||||
<h3 id="python-redis-查询">Python redis 查询</h3>
|
||||
<h3 id="redis-查询">Redis 查询</h3>
|
||||
<p>主要代码如下所示</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="kw">def</span> get_vector(user, pipe<span class="op">=</span><span class="va">None</span>):
|
||||
|
||||
|
|
@ -918,7 +894,7 @@ pipe.execute()</code></pre></div>
|
|||
<p>有意思的是在这里生成了和自己相近的人</p>
|
||||
<pre><code>['alesdokshanin', 'hjiawei', 'andrewreedy', 'christj6', '1995eaton']</code></pre>
|
||||
<p>osrc最有意思的一部分莫过于flann,当然说的也是系统后台的设计的一个很关键及有意思的部分。</p>
|
||||
<h2 id="python-github">Python Github</h2>
|
||||
<h2 id="邻近算法">邻近算法</h2>
|
||||
<p>邻近算法是在这个分析过程中一个很有意思的东西。</p>
|
||||
<blockquote>
|
||||
<p>邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法可以说是整个数据挖掘分类技术中最简单的方法了。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用她最接近的k个邻居来代表。</p>
|
||||
|
|
@ -1127,7 +1103,8 @@ pipe.execute()</code></pre></div>
|
|||
<h1 id="创建项目文档">创建项目文档</h1>
|
||||
<h1 id="测试-1">测试</h1>
|
||||
<h1 id="重构-1">重构</h1>
|
||||
<h1 id="github-100天">Github 100天</h1>
|
||||
<h1 id="github连击">Github连击</h1>
|
||||
<h2 id="天">100天</h2>
|
||||
<p>我也是蛮拼的,虽然我想的只是在Github上连击100~200天,然而到了今天也算不错。</p>
|
||||
<figure>
|
||||
<img src="./img/longest-streak.png" alt="Longest Streak" /><figcaption>Longest Streak</figcaption>
|
||||
|
|
@ -1146,7 +1123,7 @@ pipe.execute()</code></pre></div>
|
|||
<p>同时这似乎也意味着,我每天的commit数与之相比多了很多。</p>
|
||||
<p>在连击20的时候,有这样的问题: <em>为了commit而commit代码</em>,最后就放弃了。</p>
|
||||
<p>而现在是<code>为了填坑而commit</code>,为自己挖了太多的想法。</p>
|
||||
<h2 id="天的提升">40天的提升</h2>
|
||||
<h3 id="天的提升">40天的提升</h3>
|
||||
<p>当时我需要去印度接受毕业生培训,大概有5周左右,想着总不能空手而归。于是在国庆结束后有了第一次commit,当时旅游归来,想着自己在不同的地方有不同的照片,于是这个repo的名字是 <a href="https://github.com/phodal/onmap">onmap</a>——将自己的照片显示在地图上的拍摄地点(手机是Lumia 920)。然而,中间因为修改账号的原因,丢失了commit。</p>
|
||||
<p>再从印度说起,当时主要维护三个repo:</p>
|
||||
<ul>
|
||||
|
|
@ -1170,7 +1147,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>对于Mock、Stub、FakesServer等用法有更好的掌握</li>
|
||||
<li>可以持续地交付软件(版本管理、自动测试、CI、部署等等)</li>
|
||||
</ul>
|
||||
<h2 id="天的挑战">100天的挑战</h2>
|
||||
<h3 id="天的挑战">100天的挑战</h3>
|
||||
<p>(ps:从印度回来之后,由于女朋友在泰国实习,有了更多的时间可以看书、写代码)</p>
|
||||
<p>有意思的是越到中间的一些时间,commits的次数上去了,除了一些简单的pull request,还有一些新的轮子出现了。</p>
|
||||
<figure>
|
||||
|
|
@ -1184,7 +1161,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>没有足够的空闲时间,除了周末。</li>
|
||||
<li>希望去寻找那些有兴趣的人,然而却发现原来没有那么多时间去找人。</li>
|
||||
</ul>
|
||||
<h2 id="天的希冀">140天的希冀</h2>
|
||||
<h3 id="天的希冀">140天的希冀</h3>
|
||||
<p>在经历了100天之后,似乎整个人都轻松了,毕竟目标是100~200天。似乎到现在,也不会有什么特殊的情怀,除了一些希冀。</p>
|
||||
<p>当然,对于一个开源项目的作者来说,最好有下面的情况:</p>
|
||||
<ul>
|
||||
|
|
@ -1194,7 +1171,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>提了bug、issue、问题。</li>
|
||||
<li>提了bug,并解决了。(ps:这是最理想的情况)</li>
|
||||
</ul>
|
||||
<h1 id="github-200天showcase">Github 200天Showcase</h1>
|
||||
<h2 id="天的showcase">200天的Showcase</h2>
|
||||
<p>今天是我连续泡在Github上的第200天,也是蛮高兴的,终于到达了:</p>
|
||||
<figure>
|
||||
<img src="./img/github-200-days.png" alt="Github 200 days" /><figcaption>Github 200 days</figcaption>
|
||||
|
|
@ -1202,7 +1179,7 @@ pipe.execute()</code></pre></div>
|
|||
<p>故事的背影是: 去年国庆完后要去印度接受毕业生培训——就是那个神奇的国度。但是在去之前已经在项目待了九个多月,项目上的挑战越来越少,在印度的时间又算是比较多。便给自己设定了一个长期的goal,即100~200天的longest streak。</p>
|
||||
<p>或许之前你看到过一篇文章<a href="https://github.com/phodal/github-roam/blob/master/chapters/12-streak-your-github.md">让我们连击</a>,那时已然140天,只是还是浑浑噩噩。到了今天,渐渐有了一个更清晰地思路。</p>
|
||||
<p>先让我们来一下ShowCase,然后再然后,下一篇我们再继续。</p>
|
||||
<h2 id="一些项目简述">一些项目简述</h2>
|
||||
<h3 id="一些项目简述">一些项目简述</h3>
|
||||
<p>上面说到的培训一开始是用Java写的一个网站,有自动测试、CI、CD等等。由于是内部组队培训,代码不能公开等等因素,加之做得无聊。顺手,拿Node.js +RESTify 做了Server,Backbone + RequireJS + jQuery 做了前台的逻辑。于是在那个日子里,也在维护一些旧的repo,如<a href="https://github.com/phodal/iot-coap">iot-coap</a>、<a href="https://github.com/phodal/iot">iot</a>,前者是我拿到WebStorm开源License的Repo,后者则是毕业设计。</p>
|
||||
<p>对于这样一个项目也需要有测试、自动化测试、CI等等。CI用的是Travics-CI。总体的技术构架如下:</p>
|
||||
<h4 id="技术栈">技术栈</h4>
|
||||
|
|
@ -1262,7 +1239,7 @@ pipe.execute()</code></pre></div>
|
|||
<img src="./img/sherlock.png" alt="Sherlock skill tree" /><figcaption>Sherlock skill tree</figcaption>
|
||||
</figure>
|
||||
<p>代码: <a href="https://github.com/phodal/sherlock" class="uri">https://github.com/phodal/sherlock</a></p>
|
||||
<h3 id="django-ionic-elasticsearch-地图搜索">Django Ionic ElasticSearch 地图搜索</h3>
|
||||
<h4 id="django-ionic-elasticsearch-地图搜索">Django Ionic ElasticSearch 地图搜索</h4>
|
||||
<figure>
|
||||
<img src="./img/elasticsearch_ionit_map.jpg" alt="Django Elastic Search" /><figcaption>Django Elastic Search</figcaption>
|
||||
</figure>
|
||||
|
|
@ -1273,7 +1250,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>OpenLayers 3</li>
|
||||
</ul>
|
||||
<p>代码: <a href="https://github.com/phodal/django-elasticsearch" class="uri">https://github.com/phodal/django-elasticsearch</a></p>
|
||||
<h3 id="简历生成器">简历生成器</h3>
|
||||
<h4 id="简历生成器">简历生成器</h4>
|
||||
<figure>
|
||||
<img src="./img/resume.png" alt="Resume" /><figcaption>Resume</figcaption>
|
||||
</figure>
|
||||
|
|
@ -1285,7 +1262,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>Showdown</li>
|
||||
</ul>
|
||||
<p>代码: <a href="https://github.com/phodal/resume" class="uri">https://github.com/phodal/resume</a></p>
|
||||
<h3 id="nginx-大数据学习">Nginx 大数据学习</h3>
|
||||
<h4 id="nginx-大数据学习">Nginx 大数据学习</h4>
|
||||
<figure>
|
||||
<img src="./img/nginx_pig.jpg" alt="Nginx Pig" /><figcaption>Nginx Pig</figcaption>
|
||||
</figure>
|
||||
|
|
@ -1295,7 +1272,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>Pig</li>
|
||||
</ul>
|
||||
<p>代码: <a href="https://github.com/phodal/learning-data/tree/master/nginx" class="uri">https://github.com/phodal/learning-data/tree/master/nginx</a></p>
|
||||
<h3 id="其他">其他</h3>
|
||||
<h4 id="其他">其他</h4>
|
||||
<p>虽然技术栈上主要集中在Python、JavaScript,当然还有一些Ruby、Pig、Shell、Java的代码,只是我还是习惯用Python和JavaScript。一些用到觉得不错的框架:</p>
|
||||
<ul>
|
||||
<li>Ionic: 开始Hybird移动应用。</li>
|
||||
|
|
@ -1317,25 +1294,24 @@ pipe.execute()</code></pre></div>
|
|||
<li>MongoDB</li>
|
||||
<li>Redis</li>
|
||||
</ul>
|
||||
<h1 id="github-365天">Github 365天</h1>
|
||||
<h2 id="天-1">365天</h2>
|
||||
<p>给你一年的时间,你会怎样去提高你的水平???</p>
|
||||
<figure>
|
||||
<img src="./img/github-365.jpg" alt="Github 365" /><figcaption>Github 365</figcaption>
|
||||
</figure>
|
||||
<p>正值这难得的sick leave(万恶的空气),码文一篇来记念一个过去的366天里。尽管想的是在今年里写一个可持续的开源框架,但是到底这依赖于一个好的idea。在我的<a href="http://github.com/phodal/ideas">Github 孵化器</a> 页面上似乎也没有一个特别让我满意的想法,虽然上面有各种不样有意思的ideas。多数都是在过去的一年是完成的,然而有一些也是还没有做到的。</p>
|
||||
<h2 id="说说标题">说说标题</h2>
|
||||
<p>尽管一直在Github上连击看上去似乎是没有多大必要的,但是人总得有点追求。如果正是漫无目的,却又想着提高技术的同时,为什么不去试试?毕竟技术非常好、不需要太多练习的人只是少数,似乎这样的人是不存在的。大多数的人都是经过练习之后,才会达到别人口中的“技术好”。</p>
|
||||
<p>这让我想起了充斥着各种气味的知乎上的一些问题,在一些智商被完虐的话题里,无一不是因为那些人学得比别人早——哪来的天才?所谓的天才,应该是未来的智能生命一般,一出生什么都知道。如果并非如此,那只是说明他练习到位了。</p>
|
||||
<p>练习不到位便意味着,即使你练习的时候是一万小时的两倍,那也是无济于事的。如果你学得比别人晚,在<strong>很长的一段时间里</strong>(可能直到进棺材)输给别人是必然的——落后就要挨打。就好像我等毕业于一所二本垫底的学校里,如果在过去我一直保持着和别人(各种重点)一样的学习速度,那么我只能一直是Loser。</p>
|
||||
<p>需要注意的是,对你来说考上二本很难,并不是因为你比别人笨。教育资源分配不均的问题,在某种程度上导致了新的阶级制度的出现。如<a href="https://www.phodal.com/">我的首页</a>说的那样: <strong>THE ONLY FAIR IS NOT FAIR</strong>——唯一公平的是它是不公平的。我们可以做的还有很多——<strong>CREATE & SHARE</strong>。真正的不幸是,因为营养不良导致的教育问题。</p>
|
||||
<p>于是在想明白了很多事的时候起,便有了Re-Practise这样的计划,而365天只是中间的一个产物。</p>
|
||||
<h2 id="编程的基础能力">编程的基础能力</h2>
|
||||
<h3 id="编程的基础能力">编程的基础能力</h3>
|
||||
<p>虽说算法很重要,但是编码才是基础能力。算法与编程在某种程度上是不同的领域,算法编程是在编程上面的一级。算法写得再好,如果别人很难直接拿来复用,在别人眼里就是shit。想出能work的代码一件简单的事,学会对其重构,使之变得更易读就是一件有意义的事。</p>
|
||||
<p>于是,在某一时刻在Github上创建了一个组织,叫<a href="https://github.com/artisanstack">Artisan Stack</a>。当时想的是在Github寻找一些JavaScript项目,对其代码进行重构。但是到底是影响力不够哈,参与的人数比较少。</p>
|
||||
<h3 id="重构-2">重构</h3>
|
||||
<h4 id="重构-2">重构</h4>
|
||||
<p>如果你懂得如何写出高可读的代码,那么我想你是不需要这个的,但是这意味着你花了更多的时候在思考上了。当谈论重构的时候,让我想起了TDD(测试驱动开发)。即使不是TDD,那么如果你写着测试,那也是可以重构的。(之前写过一些利用Intellij IDEA重构的文章:<a href="https://www.phodal.com/blog/intellij-idea-refactor-extract-method/">提炼函数</a>、<a href="https://www.phodal.com/blog/intellij-idea-refactor-replace-temp-with-query/">以查询取代临时变量</a>、<a href="https://www.phodal.com/blog/thoughtworks-refactor-and-intellij-idea/">重构与Intellij Idea初探</a>、<a href="https://www.phodal.com/blog/intellij-idea-refactor-inline-method/">内联函数</a>)</p>
|
||||
<p>在各种各样的文章里,我们看到过一些相关的内容,最好的参考莫过于《重构》一书。最基础不过的原则便是函数名,取名字很难,取别人能读懂的名字更难。其他的便有诸如长函数、过大的类、重复代码等等。在我有限的面试别人的经历里,这些问题都是最常见的。</p>
|
||||
<h3 id="测试-2">测试</h3>
|
||||
<h4 id="测试-2">测试</h4>
|
||||
<p>而如果没有测试,其他都是扯淡。写好测试很难,写个测试算是一件容易的事。只是有些容易我们会为了测试而测试。</p>
|
||||
<p>在我写<a href="https://github.com/echoesworks/echoesworks">EchoesWorks</a>和<a href="https://github.com/phodal/lan">Lan</a>的过程中,我尽量去保证足够高的测试覆盖率。</p>
|
||||
<figure>
|
||||
|
|
@ -1346,7 +1322,7 @@ pipe.execute()</code></pre></div>
|
|||
</figure>
|
||||
<p>从测试开始的TDD,会保证方法是可测的。从功能到测试则可以提供工作次效率,但是只会让测试成为测试,而不是代码的一部分。</p>
|
||||
<p>测试是代码的最后一公里。所以,尽可能的为你的Github上的项目添加测试。</p>
|
||||
<h3 id="编码的过程">编码的过程</h3>
|
||||
<h4 id="编码的过程">编码的过程</h4>
|
||||
<p>初到TW时,Pair时候总会有人教我如何开始编码,这应该也是一项基础的能力。结合日常,重新演绎一下这个过程:</p>
|
||||
<ol type="1">
|
||||
<li>有一个可衡量、可实现、过程可测的目标</li>
|
||||
|
|
@ -1361,7 +1337,7 @@ pipe.execute()</code></pre></div>
|
|||
<li>一步步实现</li>
|
||||
</ol>
|
||||
<p>在我们实际工作中也是如此,接到一个任务,然后分解,一步步完成。不过实现会稍微复杂一些,因为事务总会有抢占和优先级的。</p>
|
||||
<h2 id="技术与框架设计">技术与框架设计</h2>
|
||||
<h3 id="技术与框架设计">技术与框架设计</h3>
|
||||
<p>在上上一篇博客中《<a href="https://www.phodal.com/blog/after-500-blogposts-analytics-after-tech/">After 500: 写了第500篇博客,然后呢?</a>》也深刻地讨论了下这个问题,技术向来都是后发者优势。对于技术人员来说,也是如此,后发者占据很大的优势。</p>
|
||||
<p>如果我们只是单纯地把我们的关注点仅仅放置于技术上,那么我们就不具有任何的优势。而依赖于我们的编程经验,我们可以在特定的时候创造一些框架。而架构的设计本身就是一件有意思的事,大抵是因为程序员都喜欢创造。(ps:之前曾经写过这样一篇文章,《<a href="https://www.phodal.com/blog/sorry-i-don't-like-programming/">对不起,我并不热爱编程,我只喜欢创造</a>》)</p>
|
||||
<p><strong>创造是一种知识的再掌握过程。</strong></p>
|
||||
|
|
@ -1373,12 +1349,12 @@ pipe.execute()</code></pre></div>
|
|||
</figure>
|
||||
<p>而在我们实现的编码过程也是如此,使用不同的框架,并且让他们能工作。如早期玩的<a href="https://github.com/echoesworks/moqi.mobi">moqi.mobi</a>,基于Backbone、RequireJS、Underscore、Mustache、Pure CSS。在随后的时间里,用React替换了View层,就有了<a href="https://github.com/phodal/backbone-react">backbone-react</a>的练习。</p>
|
||||
<p>技术同人一样,需要不断地往高一级前进。我们只需要不断地Re-Practise。</p>
|
||||
<h2 id="领域与练习">领域与练习</h2>
|
||||
<h3 id="领域与练习">领域与练习</h3>
|
||||
<p>说业务好像不太适合程序员的口味,那就领域吧。不同行业的人,如百度、阿里、腾讯,他们的领域核心是不一样的。</p>
|
||||
<p>而领域本身也是相似的,这可以解释为什么互联网公司都喜欢互相挖人,而一般都不会去华为、中兴等非互联网领域挖人。出了这个领域,你可能连个毕业生都不如。领域、业务同技术一样是不断强化知识的一个过程。Ritchie先实现了BCPL语言,而后设计了C语言,而BCPL语言一开始是基于CPL语言。</p>
|
||||
<p>领域本身也在不断进化。</p>
|
||||
<p>这也是下一个值得提高的地方。</p>
|
||||
<h2 id="其他-1">其他</h2>
|
||||
<h3 id="其他-1">其他</h3>
|
||||
<p>是时候写这个小结了。从不会写代码,到写代码是从0到1的过程,但是要从1到60都不是一件容易的事。无论是刷Github也好(不要是自动提交),或者是换工作也好,我们都在不断地练习。</p>
|
||||
<p>而练习是要分成不同的几个步骤,不仅仅局限于技术:</p>
|
||||
<ol type="1">
|
||||
|
|
|
|||
Loading…
Reference in a new issue