记一次NodeSchool线下活动 & NodeJS训练营首周记

作为一只预备程序猿,在相当长的一段时间里,我都处于一种及其散漫和低效的状态:学校所教的往往高屋建瓴泛泛而谈,没法深入;自己学的又是纯兴趣驱动,一个东西如果几周都出不了成果或者不易感到进步,便容易半途而废。即便是折腾所见即所得的前端,当最初的驱动我学习的东西暂时完结之后——如这个Blog的主题,便往往没有继续深入学习的动力。

好在这样的情况最近终于有了改观。

20多天前,正徒劳地啃着swift语法的我在V2EX闲逛时看见了这个帖子:[成都活动] NodeJS Workshop 六月七号(周六),抱着长长见识和接触一下圈子的想法,便与@heavenwesker约好一起去。

坐了整整2个多小时的公交车,终于赶到了软件园。与@heavenwesker汇合后,我们在软件园周围小逛了一圈。软件园附近高楼林立,街道宽敞,绿化也很不错,再加上遇到一个成都难得的晴天,总体上给了人一种非常干净的感觉。

活动的过程可以参看@hayeah老师的这篇Blog,总之,一是nodeschool.io的教程本身就设计得很合理,二是这种一群气氛类似的人一起做事情的感觉很让人舒服,三是身边有大牛掉坑不用愁——从没有这样舒服的写代码体验。

归来后,又花了大约一天的时间写完了learnyournode,之后便向@hayeah老师请教接下来的学习路线图,他笑嘻嘻(此处为我脑补)地为自己的NodeJS训练营打起了广告——不得不佩服这定向广告打得比Adsense不知高到哪里去了!我和他谈笑风生!

老实说,这个NodeJS训练营的学费实在太便宜了:学生优惠连同小伙伴折扣下来,竟然只要290/人。而这一周的暖身课程下来,也确实给我带来了很大的收获。

以下是我这几天学习时的打卡记录和一些备注:

第一天

打卡记录

因为之前自学过一点 npm 相关的知识,所以打包本身没有很大的难度。但是还是遇到了不少的小问题:

  1. 同学 QQ 对我骚扰严重,外加蚊子太多,导致浪费了很多时间,本来预计20分钟就能完成的,实际用了快1个小时……
  2. 在没有传递参数进入时,由 minimist 生成的argv._为一个空[],而我想当然的使用了if (!argv._){},这样无论有否参数传入,表达式的值恒为 false——这说明我应该补习一些 js 的基础语法——后来改使用if (!argv._.length){}解决了问题。不知道有没有更优雅一些的做法。
  3. 以前因为害羞( _(:3 」∠)_ )的缘故,从来不敢在 GitHub 上发布代码,都是使用的自建的 GitBlit,第一次在 GitHub 发布代码,误勾上了 “Initialize this repository with a README” 选项,导致合并时冲突,而我在保持 GitHub for Mac 客户端未关闭的状态下直接删除./.git重建的行为又导致了 GitHub for Mac 客户端的 Bug,另外一个 git 目录下的 log 被混杂了进来……只好全部删掉重做。

我新学到了什么:

  1. npm install--save参数,以前都是手动修改 package.json 添加的……
  2. npm link
  3. #!/usr/bin/env xxx的详细含义。
  4. 其他一时想不起了……

回顾:

第一次在github上建项目,羞耻度已爆表,感觉自己萌!萌!哒!

第二天

打卡记录

以前只在刚进大学时那门高屋建瓴泛泛而谈的《计算机引论》课里听说过「测试」这种概念。这是第一次实际接触,才发现原来 learnyournode 就是以单元测试开发的形式教的 nodejs 呀!

因为今天开始外出旅游三天,所以只是大概咀嚼了一下,并没有消化吸收得彻底。BDD、TDD 相关知识看上去非常诱人,回去以后会加深学习之。

今天早上在火车上的时候修改了昨天课程上的代码,将 CLI 行为和程序内部的逻辑分离了开来:所有命令行的输入输出功能都由 ./bin/greet.js 处理,内部逻辑由 ./lib/index.js 负责,并将结果回调给 greet.js(或其他引用了 index.js 的模块)。没想到这给晚上写测试的时候带来了麻烦,感觉反而让测试逻辑显得很复杂了。

另外,写的时候一直在思索:如果真的以单元测试的模式驱动开发,应该是直接测试 CLI 命令还是测试 npm 模块?后来我觉得应该是先完善内部逻辑,再补充处理输入输出。于是写了 greet lib 和 greet cli 两部分的测试代码。

学习时读到的一些可能有用的链接:

回顾

第二天的时间主要花在反复思索describeit等关键字到底是javascript本身的还算mocha带来的上……总之还是因为对js本身太不熟悉了,随着越写越多这个问题在逐渐好转。

第三天

打卡记录

本身课程是很简短的,但我遇到的主要问题在于看完 Convert index.js 后,就想当然的按照昨天 npm test 时看见的链接,使用 prepublish 来完成编译 coffee 为 js 见 da5f84a

后来按照课程使用的 Makefile 的方法来写了一遍,但还是觉得 ./bin 中使用 js 而其他地方使用 coffee 有点昏。

好在我 js 基础都不牢固,为了夯实基础,还是先写一段时间 js 等利索了再换 coffee 吧 :)

回顾

第三天的感觉还是学有余力吧,不然也不会去按照自己的思路走下去,直接用npm的script来处理coffee的编译来。不过到了第四天就哦呵呵呵……

第四天

打卡记录

这一课几乎花了一整天……通过测试了才发现「啊这么短???」

主要障碍在于:

  1. 我的英语能力太差,光是把对象方法属性等词汇的中英文之间建立联系这一步就导致头晕了。
  2. 对对象和类完全缺乏了解,既没有足够的Javascript基础,也对面向对象这一思维模式缺乏认识,大一学C++时基础没打牢固的恶果。

用来补JS对象基础的链接:
Javascript 面向对象编程(一):封装

回顾

第四天开始真的是被虐成渣渣啊……悄悄的说,从高中的时候在手机上学python开始,我就不怎么能理解面向对象,准确说是面向类的编程,而这次……幸好大一上课学C++时还不明就里的死记硬背了不少有关类的知识,比如构造函数析构函数父类继承之类的,如今自己开始写,那些死记硬背的条条总算(部分)活了起来。

第五天

打卡记录

总体而言:难哭了……

遇到的坑:

  • 自己眼神不好

我把那个:

var B = Class({
    b: function() {
        return 2;
    }
},A);

理解错成了:

  var B = Class({
    b: function() {
          return 2;
    }
  ,A});

还处理了半天,一直在奇怪为什么var i in args的循环方法拿不到A……

  • 外加读教材不认真

做Implement Super的时候,没有认真读教材,想了各种方法,折腾了2个小时,但this始终指向父类……然后想到昨天老师说 @Cloverstd 多此一举的时候那个神奇的apply()函数,结果果然可行!得意洋洋的心想这个坑老师怎么不点明啊,然后一看教程:

Hint: Use arguments and Function.prototype.apply to call the super method.

当场我就被自己蠢哭了啊……

  • 理解能力不够

做Implement Super’s Supe时,明明已经在终端里看到了,却没有意识到return那行语句本身就是一个递归。反而自己去尝试构造递归函数。

  • 体力弱

做到后面实在是累了,翻了一下上期的同学们的答案,发现也大多没有做_super,明天睡一觉起来满血了之后再做吧……

吃晚饭去……

回顾

有了第四天的经验,一早起来就做好了被虐的准备,果不其然,活生生让我从早上11点写到晚上9点……打卡填时间的位置好想填个∞……

不过,看到自己是第二个做完的,而且截止这个文章写完也没看到第三个同学做完,心里还是有点小自豪小自豪的。

周六

周六周末都没有课的,看了03期中 @Luin 大大的视频,决定照虎画猫,重写一次。重写本来很顺利,可是遇到了个很奇葩的问题,百思不得其解,最后经过老师点拔,才发现是一个变量声明时忘记加var,被全局了……那个囧啊……

好在,重写之后的代码看起来好看多了。

周日

待续,初步打算写一个小package,把js的数组封装成类似python的dbm样的模块,以后用起来方便一些。

(不用写都知道这是在重复造轮子,只是为了学习而已啦……)

哦对了,这周的空余时间还折腾了一个用tcp + 非标端口解析DNS的小工具,目前用起来还是安全的,我也想学习其他大大们直接丢弃UDP伪造包的方法,不过现在网络方面的基础知识还不够,弄不出来呢……