如何学好一门编程语言技巧方法一粒

从踏入计算机领域的第一课起,我就在学习各种编程语言,并且每种语言的学习方法我还尝试变换过多次。一路过来,14年的修炼让我对学习编程语言的方法有了一个自己的心得。我想这里分享出来应该可以让更多的Coder在阅读完我的心得后顺便可以改进自己的学习方法,让自己变得更强。

practice make perfect。这是我从《纸牌屋》里听到的一句台词。我很容易就能体会出这个道理,但还是有一些怪问题需要解开。练习本身是很枯燥的,要我说完全就是苦行僧干的事情,一般很难在期望的时间內达到目标。这里有一个关键字,目标。拿我来说,我在学习一些编程语言的时候很容易就迷失了方向,比如C++语言学习的时候,我从一开始就不知道我能用它干什么,只是觉得这个很底层的语言学会一定能成为牛人,实际上只知道语法,日常也就只能编写一些书本中的例子。我相信即使是现在,仍然会有这样的人,和我一样,漫无目的的学习。这就像慢性自杀一样可怕,不知道何时是个头。解决办法只有一个,立即停下来,重新设定目标。我并不是一个训练有序的机器人,所以在想停下来的时候会纠结一段时间。在我经历过多次这样的场景后,现在已经可以快速的做出判断并执行这个技巧了。我相信任何人如果能意识的训练这种技巧后,以后尽快结束这种不必要的纠结时间,那就是万幸。

I love this game。这是我看NBA广告中一句台词。我非常羡慕NBA球员在场上精彩的比赛。但电视仍然欺骗了我,为什么呢?因为事实上电视台转播的都是精华版,常规赛仍然是难看的,并不精彩。像我这样的伪观众更本没有耐心去天天看这个。学习编程语言也是这么个样子,谁也逃不了枯燥无聊的重复代码练习。这个谁都明白,所以我在这里不提这个,我想说说的是另外的一个事情,。程序员的工资水平相对其他行业,总的来说还是过的去的。所以,如果你给我一个不可接受的价钱,我绝对是立即走人的。我看到的这样的场景无数次,包括我也有这样的想法,钱太少了。在经历过无数次的历练后,发现一个事实:你用一门编程语言,是因为你很喜欢使用它,这和钱一点关系没有。你为了能天天编程,你必须要找一个地方施展开。所以无论别人给多少钱,你都不应该为此而诱惑。这里给一个简单的公式,应聘这个可以让你有多大的施展空间,这个才是关键。别用钱来限制自己,应该用舞台来展示自己。

remote by 37singals,这是一本书的名字。我看完后产生一个观点,那就是独立开发者在未来的时代将会有更好的施展空间。已经有很多人早就实现了这个,非常让人羡慕。但我仍然非常坦陈的想告诉你,改变并不容易。不如把当下的你的工作做的更出色。不要再局限于一种语言或者技能上,你要全面的自我学习,超越自己现有的编程能力就是进步。

effective learning。学一门语言到底需要多少时间,大家有自己的判断。但我想给大家一个方法。一本书看一周,就算入门了。不要自己欺骗自己,就一周最多30个小时,就可以入门。很多人一直 迷恋入门阶段 ,即使已经入门了,还在那里原步踏步踏就是不在前行。还有些人更是把读一门语言的源码作为入门的最高境界,比如我买过一本这样的书《Python源码剖析》,至今没有完整看过一遍。其实学编程语言最大的用处是用它,而不是造它,那是孔乙己的学法,过时了。

open source。学一周语言编程,就可以参与开发了。但没人会给你一个赚钱的项目让你练手。所以更多的人,就闭门造车。模仿复制只有少数人能做的漂亮。不如参与一个开源项目,练手比创造要来的容易。随着时间的积累,你随时可以加入新功能,并能快速体会到用户的反馈。这是最真实的,也是最有效的。

RefineryCMS怎么玩起来

首先,要玩就玩最新的。必须支持Rails 4。第二,代码必须是edge的。随时代码有broken的问题奥,颤抖吧,其实没那么夸张。如果你已经开始使用了Git的话,你会知道Branch提交都是有规矩的,不能工作的代码不允许提交到master分支。代码来了:

git@github.com:refinery/refinerycms.git

rails new demo -m ./refinerycms/templates/refinery/edge.rb

bundle

rails s

走起啊。呵呵。起来后后台管理界面是http://localhost:3000/refinery 别急别慌,必须来点只是武装一下自己才可以继续玩下去,到这里: http://refinerycms.com/edge-guides/getting-started

今天先埋个坑,以后慢慢的添。

高下立判的事实背后隐藏的秘密

今天

打开ruby-china.org上的一个帖子 用 Ruby Koans 学习 Ruby,其中一道题,到 stackoverflow 上一看,高下立判啊! ,主题内容是一道题,“题目要求很简单,写一个triangle(a,b,c)函数,判断是等边,等腰,或一般三角形,并且能在有一边小于等于零或两边之和小于第三边的情况下raise一个error”,原帖子给出了普通ruby程序员高端Ruby程序员代码的区别,楼主感叹语言的优雅。我看到后并没有像以往一样,潜水乐一下就关掉,而是停顿在这个页面冥想了一会,偶有一些心得,写下来分享给网友。如能博得网友一笑当然更好。

普通Ruby程序员:

我在读完这段代码,并比对原题的条件。我的直觉告诉我,我真的理解到这个程序员是如何思考的,并写下这段代码的。这不就是DSL吗,直白明了。回帖中提到的优雅,每个人都有自己的解释。但无外乎于“代码量小”,“效率高”,“简单”等标签的组合。有人关心,有人并不关心。不管别人强加给你的要求,还是你内心要求的“优雅”,这都是一个心结。我想在写代码的过程,是一个思绪的流动,不应该是肤浅的把人类的语言转换成机器的语言(“Ruby”)。但我们的经验都是一段一段积累的,熟能生巧么。所以最开始写的代码最好是像普通程序员这样写出来,然后再改进。我近期得出来的方法就是把这样的代码放在测试用例中,越直白越好。不知道网友你怎么看。

高端Ruby程序员:

这段代码还是挺优雅的。哈哈。四行代码能完成问题谁都会很高兴。但我想如何让我也能也出这样的代码呢?学算法,靠天份,疯狂练习?我觉得那样都不靠谱。只要我把这个网页关掉,自己写一定写不出这样的代码。为啥,我无法看透这段代码背后的思路啊。思路太重要了,以至于做事之前大家都会三思。WHY?WHY?WHY? 好吧,看来锻炼思路真的非常重要。纸和笔就可以。不妨在遇到问题的时候,记录下来思路。

秘密

是什么呢?我看到了两个方面,一个是如何通过在测试中写DSL的代码来逼近写优雅代码的水平。另一块就是有意识的锻炼思路,不管是不是有志将来一直做程序员,我想这一点的重要性不用在强调了。好了,就这么多。一个帖子能看出来什么,还请看官自辨。

如何找到值得学习的开源项目

今天在ruby-china社区看到这样的提问“有哪些代码质量比较高的、值得学习的开源项目?”,楼主的问题非常典型,主题无外乎如何通过学习优秀的代码来提升自己。开源是个好东西,代码都是开放的,人人都可以看到。那这里就有一个问题,什么样的开源代码是代码质量比较高的、值得学习的呢?

我认为这个问题还是需要动点脑筋的。好吧,这里我分享一下我的观点。首先,开源软件的重大意义是社区协作。对于你要选择学习的代码,一定要有多个人参与协作的。这样的代码才有可能是高质量、值得学习的。

第二,高质量的代码我认为并不是人人都能看懂。比如ruby的源代码我就没有看明白。这说明的问题,即使有一份高质量的代码也并不一定能提升你的个人能力水平。

第三,提问的帖子里想要的是Rails的开源项目,其实国内的开源项目并不是没有,比如19wu,rubychina都是可以看的。代码的质量高不高并不是提升自身能力的条件,重点还是拿到别人的代码,如何学习到别人的思想。如何能发现问题并提交Patch,这才是最好的提升方式。其实有很多人已经在默默的这样做了。我这里只是总结一下。

好吧,一下思路断了,不想再写了,就此了断。

打造安全gem生态圈,从我做起!今天你signed了吗?

快速直通车:

http://developer.zendesk.com/blog/2013/02/03/signing-gems/

实战指南:

http://blog.meldium.com/home/2013/3/3/signed-rubygems-part

讲讲我的理解:

当我看完这个slide: Hacking with gems (https://speakerdeck.com/benjaminleesmith/hacking-with-gems-ruby-conf-australia) ,我意识到现在的gem太不安全了。理论上任何人都是可以发布gem包到rubygems平台。这里没有签名的后果是,如果第三方把你的gem下载来,解压后打入漏洞文件就可以让任何人的电脑安上后门。那怎么办?

我们知道rubygems是社区驱动的,如果强制让大家安装签名,不是不可以,只是这样行不通,因为并不是每个人都理解和支持你。这里是开源社区,需要的是一种可以选择的安全模型,让任何人可以表达安全问题的关注,但大家谁也强制不了谁。

首先,gem 提供了一个”-P”参数来支持HighSecurity. bundler也提供了一个”—trust-policy"支持HighSecurity。这样在工具链上提供了安全机制的功能选项。

然后,大家可以通过gem生成自签名的证书。这个证书是关键,私钥由个人保管,公钥提供给rubygem发布使用。大家看出问题的关键了吗?安全信任关系完全还是归于个人。rubygem并没有增加增加更多的安全防范,还是提供和原来一样的gem repo功能。目前这种安全模型还需要时间来验证,不管你信不信,我是做了。发布lazy_high_charts 1.4.1,支持签名gem.

https://rubygems.org/gems/lazy_high_charts

Google reader have gone, Setting Up Your Free Private Feed Reader

自rubyconf china 2012之行后,我全心扑在一个nodejs/realtime web的项目,没怎么关心技术八卦,同事聊到google reader不能用了。这让我一惊,因为我现在有个习惯是,每周看一下rss reader的技术八卦。所以眼下我需要搞一个自己的Rss reader。网上搜索一番,发现一篇教程很管用,Setting Up Your Free Private Feed Reader . 内容很实用,但时过境迁,OpenShift API早就变的更好用了,所以,我汤了一遍坑,给大家杀出一条康庄大道::-)

准备工作:

首先,我们的思路是,使用OpenShift的免费空间,配合Tiny-Tiny-Rss直接部署一个在线版的Rss Reader,经试用,支持中文挺好的。

配置步骤如下:

rails-dev-box, rails developer最好的开发环境

rails社区开发目前使用的这个pupet环境,应该是理想的开发环境。这里推荐给大家:rails-dev-box

我的环境是Fedora,kernel经常会更新,导致virtualbox需要重新在guest上build驱动,不然会提示警告:

$ vagrant up [default] Importing base box ‘ubuntu-12.04-64bit’… [default] The guest additions on this VM do not match the install version of VirtualBox! This may cause things such as forwarded ports, shared folders, and more to not work properly. If any of those things fail on this machine, please update the guest additions and repackage the box.

今天看了一个这个技巧:Vagrant Tip: Sync VirtualBox Guest Additions

使用了vagrant的plugin: vagrant-vbguest 我试用了,平滑升级,it works like charm!

jasmine不支持beforeAll and afterAll,What happen

Case: 用例测试mongoose的Model。想要全局连接mongo。发现没有全局的function: beforeAll 和 afterAll。问题看这里:https://github.com/pivotal/jasmine/pull/56 。 通过这个Case,你应该就会体会到社区驱动的好处,能比较出不同的观点。这个jasmine是为rails项目中的javascript测试写的测试框架,无法满足NodeJS开发的发展步骤。用TJ开发的Mocha应该是更好,更纯净的选择。我不想误导大家,我的观点是:使用开源项目,有很多时候你可以自己选择。 测试NodeJS代码,使用jasmine-node-task,然后用grunt插件grunt-jasmine-node做的集成。 grunt.js

grunt.loadNpmTasks('grunt-jasmine-node');

    jasmine_node: {
      projectRoot: "./spec/node",  //这里是指测试文件放的地方。变量名起的太stupid!
      requirejs: false,
      forceExit: true,
      jUnit: {
        report: false,
        savePath : "./build/reports/jasmine/",
        useDotNotation: true,
        consolidate: true
      }
    }

既然只能用beforeEach和afterEach,我就这么使用,it’s works for me.

 
beforeEach(function(){
  process.nextTick( function () {
    mongoose.connect('mongodb://localhost/cantas_test');
  });
});

afterEach(function(){
  process.nextTick( function () {
    mongoose.connection.db.executeDbCommand({
      dropDatabase: 1
    },function(result) {
      console.log(err);
      process.exit(0);
    });
    mongoose.disconnect();
  });
});

新纪元,做一个持续进步的WebApp开发者

ruby icon

Update

  • Dec 24,2012 改进文字

没有银弹

No Silver Bullet,这个道理大家都懂。但社区里每天还是可以看到有初学者发帖子,讨论类如纠结RailsDjangoVimEmacs那个更好等等的问题。开始我也觉得国内技术落后,你看国外的初学者就不会提这个问题。但当我真的去开源社区里参与开发后发现,天下初学者都是一样的,一堆一堆的纠结帖子,问题也非常的不专业,我是懒得回这样的帖子。这说明目前咱们初学者的环境和国外初学者的环境并不会差到哪里去。但有一个细节让我很意外,那就是他们学的很快,他们纠结的时间阶段很短,为什么呢?那是因为初学者如果真的明白学的内容后,他们就不会提这样那样很“白痴”的问题了。那我们再反观国内的开发社区,大量的初学者跪求,抱歉,原谅的话一大堆,挺诚恳的。但解决的问题都是一个点,一个极端的点子问题。但他们得到“大虾”的反馈后得到快速解决后就不再更近一步学习了,总是拿着经验当挡箭牌, 止步不前。这样能自我提高吗?所以,做一个好学的开发者,不是没有代价的,你需要平静心灵,不贪图虚名,多看书,多实践。

保持简约(Keep it Simple)

学习Ruby最喜欢的是它的DSL语法,这种接近英语的语法让我写代码时一点压力没有。其实我们程序员才是设计软件的核心,语言只是工具,我喜欢自己来控制语言,而不是语言来控制我。现在Ruby已经不是那么简单的语言了,我希望自己能更进一步,在13年能参与进Ruby开发社区,关注自己感兴趣的VM模块。不知道大家在学习Ruby的过程中有没有注意到,通过Ruby,我们知道了Rails,GitHub,MacOS,ObjectC,JavaScript等等。这就好像一根连线,把我之前并不敢兴趣的知识都串起来了,多么棒啊!我清晰记得在学习JAVA AOP概念时,百思不得其解的痛苦。当时确实觉得无法理解它。但回过头来,遇到Ruby里几行代码就可以告诉我什么样的代码叫AOP,在此基础之上反过来理解JAVA的AOP就变得容易理解多了。这里我不是说JAVA多么不好,我是发现一个道理,多学一门自己容易理解的语言,在此基础上再回顾没有学好的语言,是有可能更好的克服学不好C,C++,JAVA之类的编程语言的。事实上每一门语言都有它独到之处,我们是不可能拿着一门语言去解决所有开发领域问题的。只有通过理解并善用每种语言的优秀特性,并让我们程序员来控制这些编程语言才是好方法。这里我们不必纠结一时学的没别人好,学的不够深入,用自己真正理解的语言去开发程序就可以了,比如Ruby。只有理解的语言,才能让我们学的很快

拥抱开源

前几天在网上虚心听完@tinyfool盗版启示录。感慨地说,我用过盗版软件,实际上我觉得挺好用的(注:因为感觉不用花钱了。实际上钱还是花在更新换代硬件上。),但一路走下来,我并没有得到快乐(注:软件更新总是跟着别人屁股后面走,比如win98->win2000->win7->win8,到底是不是自己需要的也不清楚)。我希望能从自己做起改变这一切,开发环境切换到Fedora两年多,我想既然不愿意支付一个软件的费用,那就使用免费软件吧,没人强迫我付费。开源软件已经足够强大,在没有特别的需求下已经足够使用。如果是我需要的工具,我会知道它的价值,我自然会去买。就是这个道理。让自己变的简单一点,让大家都能受惠互利。开源软件的代码都是开放的这个大家都是知道的,有多少开发者在参与呢?重造轮子在国内大厂已经泛滥,这是国内开发者技术资源的浪费,我们真没有必要去做这些没有必要的浪费,Fork它,改进它,pull request它就OK了。你注意到这个流程一直在Ruby社区里发生。太有意思了,如果你还对开源社区没有感觉,那就参与到Ruby社区感受一下吧。

And more?

Follow @xds2000 on Twitter for the latest news.

RubyConf China 2012参会印象

Update Nov 23,2012

1.FAQ change to QA 

2. slides show off

RubyConfChina 2012 问卷调查数据汇总

http://ruby-china.org/topics/7015

Another topics:

https://speakerdeck.com/flyerhzm/jruby-at-openfeint

RubyConf China 版:https://speakerdeck.com/fredwu/2012-become-a-better-developer-you-can (101页)
完整版:https://speakerdeck.com/fredwu/2012-uncut-become-a-better-developer-you-can (178页)

http://quake.github.com/slides/rubyconfchina-2012/

https://speakerdeck.com/mechiland/beyond-rails-server

以下为正文:

我是@xds2000,ruby developer,我参加了今年的rubyconf china 2012在上海举办的社区大会,两天,并且在周末。我从北京过去,反而觉得机会不错,如果搞到周五那一定去不成。不管是不是有意这样设计,我还是感谢吕国宁,李华顺,还有甘愿默默奉献的志愿者。这样的大会,有社区来驱动并举办,绝对困难重重。如果打分5分制,我就打5分。我确实融入到里面了,我很开心。

下面完全是个人技术偏好的见解,希望给你一点料

第一天,我是冲着@yukihiro_matz去的。ruby 2.0特性没啥特别的,早就有网络介绍。但收获点在于介绍了作为语言的设计者,一些心得体会。coding for fun,如果喜欢,那就来当ruby guy吧。另外,提到了mruby, embeded ruby.最近应该是Matz主推的项目。不管你敢不敢兴趣,你应该知道,除了ruby on rails做网站之外,我们还可以在嵌入式这一块走出天地。最后QA,没啥出彩的问题,新手有多,我就不表了。因为重点话题都在第二天。对了,到场人数应该在500+

Koz 的暖场 Slide: https://speakerdeck.com/lgn21st/koz-ting-wo-men-de
Matz 的 Slide: https://speakerdeck.com/lgn21st/matz-be-a-language-designer

第二天,我提早过来,巧遇@poshboytl介绍,由于家中有事,@yedingding的topic可能要提前到第一个出场。@yedingding讲的是realtime web,如果你在现场,你要知道他讲的很有节奏,每个slide的留白都恰到好处。但如果你是新手,估计就只能听着概念过瘾了。但在我看来,核心亮点有两处,一处大胆提出Web 3.0就是realtime web。另一处就是四个realtime技术的拆解,分析思路。其他方面的细节由于时间有限,没有太多出彩之处。由于@yedingding家中有事,没法做QA,幸运的是讲师@yedingding承诺一定做个cast视频在讲一遍。可以期待。

"Real Time Web" slide:
http://www.slideshare.net/sishen/real-time-web-15229483

第二场是vmware开发经理David Tian以本公司的文件共享系统(类似dropbox)的设计开发实践。讲师很幽默,经验很丰富。系统市值几千万美元,可以说明ruby在企业级应用中也可以发挥很大的作用。很多新手在开始总是质疑企业会用这个ruby来开发吗?好吧,vmware的Mozy Web应用程序总可以说明一种可能,Have a try,why not?!讲师只有3年的ruby开发经验,就已经可以开发大型ruby项目了,新手可以放心学ruby啦,收益超值啊!

第三场是东南亚知名的,全栈式ruby开发者@xdite(发音“叉代”)讲的最佳实践如何变成最“慢”实践。其实我是看这她的“博客”成长的,:-),内容靠谱,你就只管记录吧。另外我需要提醒大家的是,就目前中文入门资料,只有@xdite的Rails 101一家是原创的。想入门快一点,那就买一本读一读。

https://speakerdeck.com/xdite/rubychina-2012-ten-slow-things-you-dont-know

第四场,我听的是@poshboytl的How we test our projects,首先我需要表达对http://railscasts-china.com/的谢意,我制作的RailsStarter入门课程就放在上面。这位讲师气场非常大,讲的内容很有料,关键很容易理解。很直接。straightforward.我不知道大家对rspec有多熟,反正我是从新手过来的,我从不会不愿意写rsepc测试,到可以随心所欲地写测试,花了很长时间来实践。关键还是练,不练一点机会都没人会给你。

https://speakerdeck.com/poshboytl/how-we-test-our-projects

第五场我离开主会场去了分会场捧一下ruby老将@flyerhzm(Richard Huang)的Semi automatic code review。在来上海之前,我就在youtube.com上找到了这个topic在railsconf 2012的视频,志敏是国际知名的ruby开发者,内容确实给力。这个话题估计都讲了差不多2年了估计,仍然让我敬佩地是精益求精,不断进取的开阔步伐。我不知道如何能赶上他,但至少我可以通过这篇印象Blog写出我对他的敬意。谢谢。

第六场是吕“大哥”的超越正则的正则表达式,这个话题有点意思的地方是,话题有点偏门但大家都会用到。讲师诙谐幽默,一会一个笑点。内容有料,都超时了还不忘介绍ruby2.0正则的新写法,敬业,我服了。

https://speakerdeck.com/luikore/more-than-regexp

第七场是微创业路上的红宝石,嘉宾是@robinfan @flyerhzm @xdite。主持人@lgn21st精心组织话题,把分会场的气氛带到一个高潮。

第八场是Lu linqing的OpenShift,云服务上的ruby开发。我同事的topic,我完整的听完了,从ruby developer的角度,我觉得还是很值得听一听的。OpenShift作为一个完全开源的云解决方案,让ruby developer能抢先知道云的架构,非常值得。代码也是公开的,更重要的是有ruby代码库可以让开发者直接参与OpenShift开发,太Geek了。谢谢Lu linqing,给ruby社区助力一把云体验。

后记,主持人 @lgn21st很有主持风范和气场,导致他到那里主持,我就跑到那里去听节目。其他Session只能等视频了。办这样一个公益的,ruby社区驱动地峰会不容易。现在圆满成功,谢谢你,@lgn21st。你可以在家乐一乐了。

that’s all.