原本代码:

application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  skip_before_action :verify_authenticity_token

本地运行app没有问题,上传到Heroku成功,打开Heroku app开始报错“Application Error”。输入heroku run rails console发现问题是verify_authenticity_token has not been defined (ArgumentError)

修改:

application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  # skip_before_action :verify_authenticity_token

不确定为什么之前加了这一行,但改好之后整个app运行正常,原本设计在登陆前能看到的东西都可以看到,改要求登陆的地方也都会正常要求登陆。

参考:
http://stackoverflow.com/questions/39260198/verify-authenticity-token-has-not-been-defined

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L122

今晚跟一个从华尔街回国的朋友聊天,发现金融圈跑出来创业的人,在学生时代都拥有一个共同标签:特别能忽悠。

其实很make sense。会忽悠的人在融资、营销、销售、挖人这些初创阶段比较重要的事情上都颇有优势,所以很容易感觉表面繁华。

但是,会忽悠的人往往产品做得稀烂,Retention几乎为0。
这可能是中国创业者和美国创业者最大的不同。

很可惜,我在学生时代并没有这样的标签,所以只能靠后天补勤了。

最近跟几个想创业的朋友聊了一些他们的创业idea,有感而发:

1. 大部分人看好的项目,最终不一定成功

2. 大部分人不看好的项目,最终不一定不成功

3. 最终成功的项目,大部分人一开始都不看好

4. 最终不成功的项目,没有人记得一开始大家看不看好

总结:

大部分人怎么看你的创业项目根本没任何毛线关系,尽管有些漏洞百出的白痴idea,但也可以在产品一上线的时候迅速知道可不可行

太过于在乎其他人怎么看你的idea,唯一影响的是你自己的军心

很少投资人能够预测未来,不要把运气好的人和有insight的人搞混

只有几个人的想法重要:

1. 你自己

0. 你的团队

0. 最亲的人

0. 已经投了你的人

你是1,其他的都是0.

问题:

Turbolinks在帮助页面加速(不去重新加载已经加载过的物件)的时候,JS指令“document.ready"不会被引发,所以根据该指令产生的jQuery动作也不会执行。在网站页面不多、物件不复杂的时候,直接干掉Turbolinks是可行的(也是之前写的一篇教学中所推荐的),但当页面越来越多,加载速度越来越慢的时候,使用Turbolinks变得十分重要,所以需要将"document.ready"修改成一个Turbolinks会发出的指令。

解决方案:

$(document).ready(function()
    //YOUR FUNCTION

);

修改为

$(document).on("turbolinks:load", function()
    //YOUR FUNCTION

);

记住要加回Turbolinks:

application.js
//= require turbolinks

这样页面的指令就会在正常执行了。

参考:http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks

今天的两件事情我觉得比较值得回味。

第一件就是Xdite分享了接案公司的运营。
第二件是晚上去一个朋友的局被好友劝说去大公司工作。

1.

接案公司是我昨天晚上在班上提出的一个想法,为的是解决我们很多人在课程结束后还渴望继续练习,同时需要找工作产生收入的需求。联合开一个接案公司可以解决这个问题,一方面有项目可以继续练习,另一方面又可以开始有收入。与此同时,接案公司在台湾碰到的两大瓶颈:人才短缺和市场太小,在大陆都不是问题。

但今天早上,Xdite老师分享了接案公司的心得后,这一条路似乎又看起来没有那么promising。核心点在于接案公司的盈利能力很大程度上取决于客户。好客户想法不变、修改不多、按时付费、结算尾款。坏客户朝三暮四、各种改动、拖延付款、尾款坏账。在这种行业里,公司的收入是浮动的(案子有时多有时少 + 付款是被动的),但开销却是固定的(程序员工资 + 房租),所以很容易在市场不景气或者客户不靠谱的时候拖垮一家公司,或者至少说接案的钱并没有那么好赚。

就这样,我们从约饭、VPN到接案三个不同idea的迅速转移又回到了原点。

2.

今天晚上,我跟几个很久没见的朋友们喝东西。我现在已经不隐瞒学编程这件事情了。如我所料,其中两位朋友开始说6万块如何不值,如何用3个程序员4万工资2个礼拜就开发出来了两个角色两个版本的iOS App。另外一个朋友拉着我聊了许久,觉得我应该去一个大的科技公司工作几年再创业,认为独自干的学习成本太高,不如积累好资源、想清楚再干。

Well,这些东西我在过去半年里,已经反复想过很多遍了。

技术可不可以外包?当然可以。作为一个推荐所有创业者“能外包的东西尽量外包”的人,我为什么会想不开,自己去学最难学会的那个本可以外包的东西?因为我需要在连4万块工资都开不起的时候把东西做出来。我已经很清楚地看到,MVP不是做一次就结束了,而是需要不断修改,甚至做很多次才能完善的东西。而创业idea,更是有可能快速失败后快速更换。所以即便在资本寒冬之后程序员外包成本急剧下降,没有钱想要聘人写一版又一版的程序是不现实的。

另外说一下去大公司这一点。

如果我打算用未来两年时间摸索创业,而我面临的选择是A:去BAT/GFA工作两年,还是B:连续创业失败3次?我会选B。很多人可能永远无法理解,唯一让你“创业能力”更强的工作,就是创业。去大公司积累人脉、看准需求、看好趋势,都比不上在创业过程中用实际的产品去碰撞实际的需求。

以上。

如何正确的面对自己?

起笔写这个心得,比我想象中要难好多。

我其实并不是一个喜欢研究如何“学习”的人,或者说我在较早的时候就已经经历了迷恋研究如何学习的时期。我在大一的时候痴迷于GTD,买了很多书,给自己做了inbox、文件夹、各种todo list、用了各种App(那个时候就用了第一版经常闪退的Evernote Beta),后来发现效率的确有提升,但并没有那么“神奇”,和我自己持续正常努力的结果可能不会有太大差距。也可能是因为从小就足够会学习,家里满墙奖状、高中当选学生会主席、哥伦比亚大学提前录取、本科毕业就年薪百万,这些对我来说虽然不算轻而易举,但真的也没那么难。我是个典型的实践主义者:Just do it。思考,远没有执行来的有快感。

我也不是不擅长写字。我7年前就开了自己的博客,从高盛辞职的时候写过整个金融圈都看到过的“我为何离开香港”,在知乎上过去一年也积累了接近一万个粉丝。但我不喜欢写日记。也不擅长总结自己学习的过程或方法论。我比较擅长的是分享人生阅历、在每一个人生节点为什么做出和别人不太一样的决定的思考,或者对最近所观察到的事情做出自己的一些看法和总结。换句话说,一篇文章对我来说更像是一个会被展示的项目,而不是一段文字记录或思路整理。这是个我仍需要克服的问题。

在"Just Do It"的模式下运行惯了的我,却发现在创业这件事情上并行不通。在过去两年中,我尝试过两次互联网创业,享受了融资成功、百人团队、9个月烧掉一千万的盛世,也体验过产品零增长、融资失败、合伙人撕逼、团队解散的挫败。长这么大第一次深刻意识到,再漂亮的简历、再牛逼的背景、再花哨的西装、再强大的自我包装能力,在市场面前,完全没有任何卵用。

你可以说我是一个自以为是的over-achiever,一个精致的利己主义者,一个创业动机不纯的wantrepreneur——我曾经100%是,直到现在一部分的我,可能还是。

通常,和我类似背景的人在碰到上述困难的时候,会选择去读MBA,准确的说是哈佛、沃顿、斯坦福的MBA。但当我脑海中闪过这样的念头的时,我会立刻将其抹杀,因为我不需要再多一个名校标签,被潜意识的逃避所屈服,两年后回到远点,再一次思考工作vs.创业的窘境。

所以我选择了面对。面对自己的失败的最大好处,就是让所有心高气傲的想法统统被干掉。全栈营开学第一天,我没有要做队长,甚至在前两周都没有说什么话。我告诉自己,我就是个什么都不懂的初学者,我需要做的唯一一件事,就是学。所以,能够让我真正进入学习状态的,不是智商或勤奋,而是抛开了我的傲慢。

创业失败了,所以呢?

创业失败后的总结过程中,我越来越认为创业不是需要去理解多么高阶、深奥、复杂的理论,而是将一些非常简单又基本的原则真正去实践。以下是我认为在所读过的文字中最能够概括创业所需的基本原则:

  1. Companies create X amount of value, and capture Y% of X(创造价值X,然后获取X里面的Y%占比).
  2. Avoid competition and always try to monopolize a small market(避免竞争,尽可能垄断一个微小市场).
  3. The best way to think of startup ideas is not to try to think of startup ideas. It's to look for problems, preferrably problems you have yourself(思考创业点子的最好办法就是不要去想创业点子,而是去找寻问题,最好是你自己正面临的问题).
  4. The best startup ideas tent to have three things in common(最好的创业点子拥有以下特征): a. they're something the founders themselves want(是创始人自己想要的东西) b. that they themselves can build(是创始人可以创造的东西) c. and that few others realize are worth doing(而且很少其他人会认为这件东西有价值).

前两条来自Peter Thiel 2012年在斯坦福的创业课,后来被整理写入他的书《从零到一》,后两条来自Paul Graham的博客,同样写于2012年。

这些原则可能会是我下一次创业的指南针,但其中有一个很大的缺口:4.b——创始人需要自己能够打造自己想要用来解决问题的产品。 而这,也正是我学编程的原因。

过去两年,我看到了太多创业者在开发上所浪费的时间、精力、钱,最终打造出来设计丑、体验差、没人用的产品。选择创业是为了给世界创造价值,而这样的创业只会摧毁价值。

我没有对身边的任何人提我要去学编程这件事情。他们不会那么容易理解,我也懒得浪费时间去解释自己。在获得了我唯一需要的支持后(我的家人),我就报名了全栈营。

全栈营是什么鬼?

刚来全栈营的时候,我是怀疑的。经验告诉我,大部分告诉你能够速成的东西都是骗人的。

我不知道Ruby on Rails是什么。我查了网上的解释,还是不知道Ruby on Rails是什么。我听过Github无数次,甚至之前创业的iOS代码就备份在Github上,但我不知道一行Github指令,也不说不出Github是什么。我上一次写代码,是13岁的时候为了让自己的MySpace能够更好看一些,勉强用HTML调整了背景图、字体、颜色。所以对,我也不知道CSS是什么,因为没用过。

7个星期的项目成果,大概是长这样:

【第一个项目:贴吧,开学前两周独立完成】

【第二个项目:论坛,开学前独立完成】

【第三个项目:招聘网站,独立6天完成】

【第四个项目:电商,独立8天完成】

【第五个项目:投票游戏,2人2天完成的Hackathon】

【第六个项目:约饭平台,5人15个工作日完成】

如果说我曾经怀疑自己成为一个全栈工程师的潜力,在做完这6个项目之后,我不再有任何怀疑。尽管我现在还不足以称自己为“全栈”,但我已经具备了开发最基础功能的web + mobile前端和后端技能(从这里延伸到iOS/Android也提供了快捷的方法和教材)。更重要的是,我已经拥有了自学开发任何其他简单功能的基础。不喜欢写日记的我,也攒下了近60篇博客,其中约10篇是关于开发某个功能的方法或总结。

不得不承认,在“把学生教会”这一件事上,全栈营做到了。

所以Ruby on Rails到底是什么?

如果一个程序是一个世界,那么程序员就是建造这个世界的神。《创世记》中,神说:“要有光”,就有了光。但神是如何获得制作光的工具?万一光子并不知道如何连接在一起让光线可以从A照射到B呢?万一被光照射到的地方并无法反光所以透露不出自己的颜色呢?人只看得到光,所以认为神可以用一句话让光出现,但人并不知道神是这么造光的。

神要创造光,需要两样东西:给光下达指令的方式,和下达指令的框架。前者可以使任何神和光都懂的语言,而后者,是让神在写任何东西的时候都可以快速高效的写出来,而不需要去担心存放东西空间的大小、里面的物质等其他琐碎却复杂的细节。

所以,在这个世界里:

  • 神=程序员
  • 光=程序
  • 人=用户
  • 神对光下达指令的方式=Ruby
  • 神创造任何东西的框架=Rails

写程序的人非常多,程序非常多,语言也非常多,但为什么说Ruby on Rails会比其他方式更快?因为Rails对神想要做的事情做了很多的预估和猜测,设计了一系列方便神去创造的框架细节。就像在一个锅碗瓢盆因有尽有的厨房炒菜和跟在一个什么都需要去买的厨房炒菜是完全不一样的。Rails就是那个连新鲜调味料都帮你备好的厨房。

7个星期中具体都学到了些什么?

在过去一段时间的学习中,我最大的surprise就是Rails有多么的简单。回顾日记,我可以清楚的看到自己是在哪一天学到了什么:开始学会用Google自己搜教学完成某个功能(第3天...)、如何写seed文档(第4天)、上传附件(第6天)、理解migration和重建db(第8天)、自由搭建routes(第9天)、写CRUD以外的新action(第11天)、自动发邮件(第13天)、装状态机(第14天)、使用AWS存储文件(第15天)、用Figaro保护AWS云服务(第16天)、如何规划Hackathon的超短线开发做Landing Page(第20天)。

从第五周起(第21天)我们进入团队开发模式,项目管理和协作变成了首要学习要点,也就是从这里开始真正模拟实战开发项目的场景。没有什么产品会是一个人独立写出来的,而无法协作的人一定无法成为好的程序员。也是在这个时候,我开始觉得我的小宇宙爆发了。从写User Story在Redmine上切票写Onboarding文档,到写前端做demo,都在一定程度上发挥了我的罗辑思维能力、项目管理能力和视觉审美。我们团队也顺利成为全班进度最快、产品最完整的团队。

8周6万的课,是否值得?

人在衡量一段经历的价值的时候会展现出惊人的认知偏差。成果令人开心的事情价值很容易抬高,反之则无论前面体验如何都会变的不值;自己选择的事情很容易觉得宝贵,被强迫的选择很容易不值;经过千辛万苦被虐到废的经历会十分珍惜,轻易得来的东西则不那么在乎。所以当我们问一个人某段经历是否值得的时候,100个人会有100种答案。

按照我创业前工资来算,过去2个月的机会成本大概是26万人民币。但我在很早之前就已经放弃了按月计算机会成本的短视角。因为这样算的人,永远不会离开高薪打工的岗位去尝试任何带有较高风险的事情。打工和创业,就像是债权回报和股权回报的对比。买债券拿到的是每月的固定收益(工资),而股权回报可以几年不分红甚至亏损,而在未来的某一天腾飞,获得几十甚至上百倍的回报。

从一个技术的门外汉,到能独立开发极简程序、共同开发完整可上线程序,能够看懂Stackoverflow上的交流贴并自己实现没有做过的新功能、解决没有碰到过的bug,这一切对我来说,其实已经远远超出了我对自己“程序员”身份的假想。有很多人会去花时间选择编程语言,甚至去网上跟人撕哪一种语言更好。在这一点上quote一句老人的话“不管黑猫白猫,捉到老鼠就是好猫”。

在我上一次创业当中,开发一款iOS的App,从立项到内测花了近4个月时间,用了1个iOS、1个后端、1个后端实习生、1个产品经理、1个外包设计师、1个全职设计师,开了几十万的工资。而现在的我,再继续练习1-2个月之后,可以1个人完成那6个人做的所有事情。

但在这里学到比编程更有价值的,是关于创业的一些best practice和know-how。Landing Page, User Story, 项目管理,Growth Hacking...如果说编程让我创业的成功率从1%上升到了2%,那么这些其他的知识可能让2%成为了5%(虽然实际情况可能这些概率都得再除以10,哈哈哈)。

结论

在过去半年里,我拒绝了来自投行、PE的offer,以及来自影视行业、医药行业、创业公司CFO的橄榄枝。无论是投资人还是创业者,下注小概率事件的人都是有一定赌性。既然只能下注一次,为什么不博一把大点的呢?

过去两周team基本进入了前后端共同推进阶段,而我作为组内设计元素的主要贡献者,不可避免的花了大量时间写前端。这不是我想做的,因为学技术的目的是希望能够自主开发更多功能,但为了项目推进,必须要实现最大化每个人的产值,同时也是对自己前端HTML、CSS很好的练习。

两周前端写下来,分享一下自己的体会:

前端和后端一样需要提前规划

我在之前的一篇日记中提到过,在项目进行到一定程度,MVC需要提前规划再写入。前端开发其实在荧幕适配这个问题上是类似的。由于我们项目从一开始只想到了电脑荧幕适配,所以没有写入任何的小荧幕适配CSS。这就导致在之后写入这代码的时候需要修改大量以前的代码,排版和CSS定义越多的地方修改越大。

由于Bootstrap提供了非常便利的responsive grid system,所以其实在一开始写的时候就应该想好两套适配模式:电脑和移动端,基本可以用Bootstrap上的col-md-XXcol-xs-XX覆盖。而只有需要罗列大量物件的地方才需要考虑使用col-lg-XX和其他大小的适配。

另外,如果所有页面都通过Bootstrap nav tab以及render partial的方式呈现,可以让使用的时候几乎没有任何跳转(“设计师”项目应该就是这样设计的,所有页面都是partial的形态存在views/common下面)。但同样,这种写法需要一开始就定好,因为之后修改的时候营业面需要将view里面的定义通过controller重新确定,越往后越麻烦。

前端的核心不是技术,是审美和时间

之前以为技术大牛朋友跟我说过,后端决定了项目的底线,前端决定了项目的上线。虽然不是100%完全认同,但基本上表达了项目前后端的角色。前端不需要对编程有深刻的理解,不需要对项目管理有详细的规划,只需要懂得如何通过HTML/CSS/jQuery来实现视觉上的效果。而且有了Bootstrap、jQuery、HTML5、CSS3等便捷语言的出现,在开发模式下其实想要调整前端也非常容易。

但前端却是可以非常耗时间的意向工作。每实现一个新的视觉效果、生成一个新的页面,都需要花大量的时间去编排。甚至套模板也不是很便捷,因为大部分模板都是为基本的HTML、CSS而写,都不那么智能,在根据自己网站需求套上之后如果要加效果还得另行写入。

所以如Xdite所做的,前端完全可以外包给一个专业点的设计师,同时有一个in-house胜任者就可以完成。

珍惜时间,远离APP

下周希望学习高瑞是如何用15秒生成“法律在线”项目App的,然后如果整个产品都是JS + Partial的形式,基本上不会有太多页面跳转,使用起来跟App的体验是差不多的。App开发时,手机荧幕大小的适配、App Store的认证、审核,都会耗费大量的时间和精力,在创业早期,能不碰就千万别碰。

Objective

关于今天的课程, 你记得什么?

  • 上午进行了group project的最后一次demo
  • 下午Xdite分享了有关技术人才求职的技巧与心得,以及如何包装自己的简历和整个public profile

完成了什么?

  • 通常demo之后大家都会比较松散,想要多休息和整理
  • 下午weekly meeting的时候组员们分享了过去一周的感想和心得

Reflective

今天的高峰是什么?

  • Xdite分享技术行业人才求职的public profile时候,深刻了解到如何去展示自己的学习成果

今天的低点是什么?

  • demo之后效率不高,每次demo后应该立刻开weekly meeting,一天的工作一定要有momentum,否则就会懒散下来浪费很多没必要浪费的时间

Interpretive

我们今天学到了什么?

  • 程序员public profile应该如何建立

今天一个重要的领悟是什么?

  • 大家都发现当项目衍生到接近上线时,任何功能上的改动都需要格外小心,一个字段会改掉所有现有数据的呈现、一个新model的关系会将MVC变得更加复杂,所以必须一开始就将MVC全部规划好在开始写,否则会变得非常乱

Decisional

我们会如何用一句话形容今天的工作
有哪些工作需要明天继续努力?

  • 周末会花时间写整个课程下来的学习心得,也是我一直以来自己就很想做但一直懒没有做的事情。非常庆幸是课程的一部分。

Objective

完成了什么?

  • 今天的主要任务是完善明天的demo版产品
  • 团队将redmine上的任务继续细分,然后根据redmine各自完成任务

Reflective

今天的高峰是什么?

  • 凌晨2点突然脑子一通就把小头像功能几行代码敲出来了:

今天的低点是什么?

  • 上传Heroku的版本在上线后还是偶尔会碰到bug,比如一个order生成后它的post还会在后台可见,如果一不小心删除了就会报错
  • 添加新字段会影响之前的数据,而Heroku的console又比较慢,所以最好是有一个很好的seed文档可以把所有东西做好,另外在添加字段的时候一定要设置default数值防止报错

Interpretive

我们今天学到了什么?

  • 其实有些功能需要多做一些思考,而不是一上来就做。有些时候想清楚了就可以很快做出来
  • demo之前需要填写大量的seed数据,其实是需要思考的,不同账号的不同用户发起不同邀约,很耗时间,最好都提前备好在Excel里面

今天一个重要的领悟是什么?

  • 在上线一个版本之前,大家都会很急着想上线,不愿意花很多时间测试功能(因为已经开发很久了)。但在上线Heroku之前其实非常需要详细的测试,因为上线之后再看到bug修复就不能立刻看到结果,还需要线下修复再重新部署,效率比较低

Decisional

有哪些工作需要明天继续努力?

  • 明天demo,产品比较成型了,应该会有不错的展示

  1. 参考这里:https://github.com/plataformatec/devise/wiki/i18n
    里面有各种个语言的devise提示讯息,根据自己devise版本下载一个中文的:

  2. 将下载的.yml文件存在config/locale文件夹里面

  3. 在config/application.rb当中加入一行代码:

    config.rb
    module 【项目名称】
    class Application < Rails::Application
        config.i18n.default_locale = :'【文件名devise后面的部分】'
    end
    end
    


    记住别加到外面去了,会报错

  4. 重启服务器

voila:

  • 其他:

这时候填写表单时候,有日期选择的地方会报错undefined methodmap' for "translation missing"`,这是因为日期没有重新翻译,所以需要在config/locales下面创建一个新文件"zh-CN.yml"(或者下载的其他翻译文件的语言名)里面加上如下代码:

zh-CN:
  date:
    order:
      - "year"
      - "month"
      - "day"