王梦琪的博客

记录技术学习及感悟

TTT课程心得

| Comments

3天高浓度的简报课,想起来像是一周一样。看再多理论,不如老师的言传身教。可谓听君一堂课,胜读十年书。
这几天我所学到的,首先是理念的颠覆:

教课的核心是:控制学生的注意力。
教学不是老师的表演。ppt多好,讲师的演讲技巧多好,这些都不是核心要点。重点是:你如何去控制学生的注意力,把控学生的进度?你了解你的听众么,他们想要的是什么?

互动才是王道
传统的教育模式是填鸭式教育,而体验式教学的核心就是互动,达到说的越少教的的越好的目的。

好的课程是通过精心设计,由老师千锤百炼练出来的。
就拿福哥这堂课来说,老师的每个动作,每个不经意的话都是有目的的。在课程之前就可以预估学员的反应。
精心设计后就是不断得演练,今天出神入化的水准是背后练了1000次的事实。

高手都会复盘总结
福哥上了1000堂课,还在做详细的自我评估和复盘。无论哪个行业的高手都是不断联系,不断总结最后精进的。

福哥对自己的要求是满分水平,在言传身教里,我学会了很多内容,特别是第三天同学的实际练习,对每组学员的点评更是精华,列一些点吧:
下面要来真的了哦,激发学生的好奇心。
图片教学法。在图片上标识出来,非常直观。
填空题。选择题。都是可以采用的好的教学手法。
图片和影片全屏。
游戏法永远是最好玩的
类比法
图片对比。
老手套,上台时要用自己熟悉的内容。
自我介绍夯实自己。
层层相扣,第一次做一个练习,第二次在这个基础上做练习。
小组讨论时,下台走动,和学员交流
小组讨论时间提醒。还剩多长时间。
小组讨论时,可以播放音乐
刚开始压缩时间,之后再慢慢放时间,时间是由讲师控制的。
走位。
声音大一些可以吸引学生注意力
一定要有加分机制,要分组,设置奖励。
讲一个笑话,大家会比较有印象。
提问法不要乱用。
控制时间,带一个小表,不能带手表。
如果要播放影片,自己一定要先播一遍,确定音量。
不要拖时。
游戏要控制时间。
下午的时候要先让同学做活动,学生注意力集中再开始做游戏。
教学手法要多样,不一定要拘泥于一种教学手法。
要控制话筒位置。
一定要拿话筒,不然手会乱晃。
实物感的奖励比较好。
ADDIE
让同学动一动,演示便利贴法,让同学站立来围在四周。
教学方法:提问法,小组讨论法, 游戏法,演练法,影片法,便利贴法。
有所学习
按b键,可以黑屏
不要有眼光偏好
如果感到紧张,采用提问法。
提问法可以帮助破冰,如果同学不回答,继续推下去。不要停留。
影片可以加快速度。
如果能实操,效果会好很多(vicent手机测速)。

3天的课程累惨了,也太值了。再次感谢福哥!

做程序员半年后的复盘

| Comments

好久不来,blog都快长草了。之前在上课的时候,觉得忙没时间写blog,总是安慰自己工作之后要多写,结果在全栈营工作之后发现比起原来更加忙碌了,更没有时间和精力写blog了。回顾一下才过去半年,感觉日子过得很紧实,像过去了一年半一样。

盘点一下自己做的不好的事:

  1. 排bug排不出来的时候不甘心。受争强好胜的心理影响,一搞搞几个小时一直钻牛角尖掉进死胡同。最后就算搞出来了,时间和精力也浪费了。正确的做法是中断,去做别的事,过一会儿特别是睡一觉就有思路了,或许几分钟就搞定了。
  2. 没有留足学习的时间。时间分配不好,给自己的work load太满,留出的消化学习时间太少。程序员是一个不停地学习的职业,不管再忙,都应该给自己留出足够的时间学习。特别现在正是一个从高级新手到熟练者的阶段,有大量需要学习的内容,特别是有一些内容是需要系统学习的,不是看几篇google的文章就可以解决的。
  3. 没有认真看说明书。在新手时排错,google出结果首选stackoverflow,现在首选官方文档,api还有github上的issue。使用gem做功能时一定要好好看readme,如果readme内容10屏以上的时候,只看一遍一定会遗漏内容,比较好的做法是看至少看两遍,第一遍先记录下来跟所做的功能有关的关键字。第二遍再去具体研究第一遍记录下来的内容。如果不这么做,看上去是省时间,其实后期会浪费掉好多时间排bug,找问题,得不偿失。
  4. 没有好好复盘。复盘特别特别重要,吾日三省吾身说的就是复盘,常复盘才能避免不要每次都掉进同一条河里。羞愧的想到,这半年做复盘的频率太低了,要改进。

工作之后发现帮助成长的习惯是:

  1. 在pull request之前对所做的功能录制一个gif。看似麻烦,但这个行为性价比超高:
    1. 帮助排bug和找出流程体验不顺畅的地方。随着功能越来越复杂,总会有一些地方注意不到,但是在录制gif的过程中,相当于是借由第三方的视角来全面审视自己的功能,就会发现自己开发时没有注意到的一些问题。或许是设计的流程不够好用,或许是非法操作没有判断。
    2. 节省和工作伙伴的沟通成本,一图胜千言,一动图胜百图。复杂功能的解释说明是不容易的,手把手教可能对方还会遗忘,不如直接将功能录制出来,给个链接给对方,一目了然也相当于做了个教程。(推荐mac下的:LiceCap和ipic,录制和上传)
    3. 给予自己完结感和成就感。程序员的工作是比较繁忙的,任务与任务之间很少能有切断的时间,停不下来。录制动图相当于给自己的一个鼓励,又完成了一个作品,成就感是不言而喻的。
  2. 揣摩别人的代码。主管vincent来了之后,看他的code学习到了不少。看的时候,带着如果是我我要怎么做的态度去看,如果自己想法和他不一致的时候,问自己他那么设计的原因是什么。
  3. 只做最重要的事。把事情分成紧急和重要的事这个每个人都耳熟能详,但是实际做起来并不容易。之前看采铜所说,只做半衰期长的事,也不太现实。很可行的方案是,每天把需要做的事列出来,然后每次只做当下最重要的事。长久下来,就会发现自己所做的是当时所能做的最好的选择。

使用CanCanCan进行权限管理(一)

| Comments

为什么要使用Cancancan

网站在发展的过程中,用户角色会不断的增加,并且会出现很多细分的权限,此时如果每次都在相应的controller和view里写判断,会变得非常冗杂,后期很难进行维护。针对这种情况,cancancan为我们提供了非常好的一种解法,详见Github官方文档


举一下我们自己的例子:
我们做的是一个在线编程教育的网站,之前是有三种角色的:admin,VIP和普通用户,最初课程只有草稿/公开两种状态,在上线前增加了一下状态:上锁/未上锁,付费/免费。
于是针对用户能否查看课程,我写了以下的权限判断,看起来比较乱,但是能够快速解决问题。

def check_course_validation(course)
  if !current_user.is_admin
    if course.is_locked
      if course.paid_courses && !current_user.valid_member?
        redirect_to vip_to_payment_path
      else
        redirect_to dashboard_path
        flash[:alert] = "暂无权限"
      end
    else
      if course.paid_courses && !current_user.valid_member?
        redirect_to vip_to_payment_path
      end
    end
 end
end

上线后,用户基数加大,管理者身份里,单admin一个权限已经不合适了,需要再加editor的角色,editor有很多细分的权限,比如可以管理课程,但不能新增删除课程。

此时再在controller里去判断权限就不合适了,使用cancancan来进行权限管理就合理很多。

cancancan的基础步骤

说明:下文中,注的内容如果看不懂可以忽略掉,在实作的过程中再理解。

第一步:安装

在Gemfile里添加gem 'cancancan',然后在终端执行bundle install,成功后执行
rails g cancan:ability

注:这样会生成一个ability.rb的文件,简单来说,我们会把网站所有的权限定义在这个ability文件里,在controller里和view里不用在权限判断了,只需要在view里检查是否有权限,在controller设置一下,更棒的是,view和controller里的权限是一致的。

第二步:在ability里定义用户角色相应的权限

在app/models/ability.rb里定义用户角色和权限,如果只有两种用户user,admin:

class Ability
  include CanCan::Ability
  
  def initialize(user)
    if user.blank?
      # 未登录

      cannot :manage, :all
    elsif user.admin?
      # admin

      can :manage, :all
    else
      can :manage, Course
      cannot [:new, :create, :destroy], Course
    end
  end

注:
1.以上定义的内容是,未登录状态下,什么都不能做;admin可以做所有的操作, User只能管理Course,单不能对Course执行以下三个(:new, :create, :destroy)的操作
2.all 是指所有 object (resource)
3.cancancan 预设了几个action的组合方便我们使用:

    # :manage: 是指这个 controller 內所有的 action

    # :read : 指 :index 和 :show

    # :update: 指 :edit 和 :update

    # :destroy: 指 :destroy

    # :create: 指 :new 和 :crate

    

can :manage, :all 指的是可以管理全部的内容
4.权限的顺序很重要,如果重叠,下面的会覆盖上面的,比如

  can :manage, Course
  cannot [:new, :create, :destroy], Course

上述说明用户不得删除/新增course

cannot [:new, :create, :destroy], Course
can :manage, Course

但如果顺序反过来,就表明:用户可以对课程进行任意操作。

在对应的controller设置

在app/controllers/admin/courses_controller.rb里设置

class Admin::CoursesController < AdminController
load_and_authorize_resource
  
  def new
    @course = Course.new
  end
  
end

此时权限就识别好了,如果你测试会发现,user已经无法删除某一个course了。

注:

  1. cancancan是根据controller判断的,而非model。
  2. cancancan 很聪明得会在controller里识别同名的资源,在CoursesController里会load和authorize @course, 如果你希望比如在SyllabusController里去识别 @course,你可以这样写
class Admin::SyllabusController < AdminController
 load_and_authorize_resource :course
 ...
end
  1. load_and_authorize_resource:指的是两件事load_resource和authorize_resource.关于这个,xdite有一篇文章,Cancan 實作角色權限設計的最佳實踐(2),在此不再赘言。
  2. 需要补充说明的是,请尽量使用load_and_authorize_resource
  3. 如果在上述controller里直接使用authorize_resource, cancancan是找不到@course这个instance的,所以要么使用load_and_authorize_resource或者在authorize_resource生效前,使用before_filter塞入一个@course的instance
  4. 请注意:strong_params的命名要规范。比如course_params不可写作courses_params,不然cancancan无法识别。

在View里进行检查

在app/views/admin/courses/index.html.erb里


<% if can? :destroy, Course %>
<%= link_to '删除', admin_course_path(course), method: :delete, data: { confirm: 'Are you sur e?' } , class: "btn btn-default btn-sm" %>
<% end %>

此时,如果我们在ability里定义用户能够删除course,则显示这个按钮,如果用户没有权限,前台就不会显示了。

增加报错提示

我们可以在ApplicationController里定义

class ApplicationController < ActionController::Base
    rescue_from CanCan::AccessDenied do |exception|
      redirect_to root_path, :alert => exception.message
     end
 end

这时如果用户进入到权限之外的网址,就会被导至root path,并且看到相应报错了。

下一篇我会写一些具体情况 如nested resource,shallow routes, hash conditions等。

Iterm 经常用的快捷键(包括:后退/前进/删除一个词)

| Comments

使用iterm经常有的时候经常输错字,但是前进后退甚至删除只能一个一个字母进行,很麻烦,我们可以配置一下。(以下为mac版)

  • 找到 iTerm > Preferences... > Profiles > Keys.
  • 在 Profile Shortcut的Keys下, 点击+号.
  • 配置前进一个词:输入快键键,比如option+→;action选择Send Escape Sequence;在Esc+的输入框内填f 就可以了。
  • 配置后退一个词:输入你希望用的快键键;action选择同上;在Esc+的输入框内填 b 就可以了。
  • 配置删除一个词:输入你希望用的快键键,action选择同上;在Esc+的输入框内填 d 就可以了。 以后执行相应的快捷键就可以执行操作了。

注:如果以上执行结果是[C[D的话,使用编辑器打开 ~/.oh-my-zsh ,找到key-bindings.zsh,

在bindkey -e下输入

bindkey '\e\e[C' forward-word
bindkey '\e\e[D' backward-word

( OSX + oh-my-zsh + iTerm2 + ctrl-left/right 配置)


iterm的其他常用快捷操作为

新建标签:command + t

关闭标签:command + w

切换标签:command + 数字 command + 左右方向键

查看历史命令:command + ;

切换全屏/还原:command + enter

查找:command + f

清空当前行(无论光标在什么位置):ctrl + u 

新手学习程序的一大障碍——怕出错

| Comments

前两天跟几个刚开始学习程序的同学聊天,发现大家非常怕出bug,一旦看见Rails Server的红色窗口就会感到很强的挫败感。

回想起来,我刚开始学程序的时候也是一样,总是感觉电脑在默默地嘲笑自己傻。

“你错了”的魔咒

这其实是程序很特别的地方。很少有技能像程序一样,能迅速给你反馈对错。对于新手而言,刚刚开始接触并不理解程序的逻辑,不断出错是很正常的。因为有的时候错的比对的还多,心理感觉上就是程序不停地提示你,“你错了”。

“你错了”这三个字简直是国人的魔咒,一提起来马上让人郁闷,烦躁,怀疑自己。传统教育对错误的容忍度很低,长年以来我们都被教育出错是很蠢的,要做到满分,优秀的人是“不犯错”的。于是我们渐渐成为了表现型人格。其实哪个凡人能不犯错呢?只是不表露给其他人看而已么。

Bug就是Boss

其实简单得装换个角度,世界就会大不同。

想象你是在打RPG游戏,在游戏里你想升级怎么办?打Boss攒经验值啊! 程序世界也是一样,每个小Bug都是一个小Boss,赢了他就能提升经验值啊!大Bug更酷啊,解决了甚至能升级呢。如果解不了也没什么,不代表不聪明,而是代表目前这个Boss难度系数太高了,回去练级或者找队友请教都是很好的方法么!

反倒是长久遇不到Bug是一件可怕的事情,这意味你已经再做熟悉的东西,不再“刻意练习了”。在游戏中,你天天跑地图遇不见一个大Boss不着急么?

通过不断地犯错改正,我们才能不断得进阶,现在来看,解Bug正是程序入门的捷径。

Bug本来就是萌萌的小怪兽专门给你当陪练的,为什么不爱跟它过过招呢?

POW与POWDER的常见用法

| Comments

Pow is a zero-configuration Rack server for Mac OS X.

详见http://pow.cx/

powder manages pow

详见https://github.com/Rodreegez/powder#readme

基础配置

将当前项目链接至 ~/.pow/nameit
使用pow

cd ~/.pow
ln -s ~/Projects/myapp    nameit

~/Projects/myapp 为app所在路径,nameit 为你希望的链接名称,配置好后
使用powder powder link [nameit]
可前往登录http://nameit.dev

常用命令

查看rails log
使用pow tail -f log/development.log
使用powder powder applog

重开当前项目
使用pow touch tmp/restart.txt
使用powder powder restart

打开当前项目网址
powder open

取消链接
使用pow 消除其他的指向链接:进入pow,删除不必要的即可,例如删除nameit.dev的指向

cd ~/.pow
rm -rf nameit

使用powder powder unlink

使用Arel进行SQL查询

| Comments

Arel简介

Arel is a SQL AST manager for Ruby. 源自Arel的github主页

Arel是一个SQL AST管理器,AST全称Abstract Syntax Tree(抽象语法树)。Arel原本是一个Ruby Gem,后来被吸收进Ruby框架,成为Rails源代码的一部分,可用用来编写复杂SQL查询。

先定义,就可以使用了

def table
 User.arel_table
end

users.where(users[:name].eq('amy'))
# SELECT * FROM users WHERE users.name = 'amy'

Arel可以方便定义各种运算符 =, !=, <, >, <=, >=, IN:

users.where(users[:age].eq(10)).project(Arel.sql('*'))
#  => SELECT * FROM "users"  WHERE "users"."age" = 10


users.where(users[:age].not_eq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" != 10


users.where(users[:age].lt(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" < 10


users.where(users[:age].gt(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" > 10


users.where(users[:age].lteq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" <= 10


users.where(users[:age].gteq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" >= 10


users.where(users[:age].in([20, 16, 17])).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" IN (20, 16, 17)

联表查询也很方便

users.join(photos).on(users[:id].eq(photos[:user_id]))
# => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id

Arel一个重要特性是“composability”,可组合

users.where(users[:name].eq('bob')).where(users[:age].lt(25))


users.where(users[:name].eq('bob').or(users[:age].lt(25)))

我是怎么被坑的?—被诱导的非理性消费

| Comments

这些年在销售的推销下做出的不理性决定没有一千也有八百:
买一条一年穿不了两次的裙子;买一双昂贵却不合脚的鞋;办一张几千元的理发店的卡然后被迫去很多次为了用完(把这张卡用完后,为了反省自己,我已经半年都没去过理发店了);买一大堆化妆品然后一年用不到两次;旅途中买下特别昂贵的纪念品,回到家坏掉了。
昨天当我累了一天,满心欢喜地在自如找到房子后,坐在那一盘算,我的天,又被坑了。
为什么我总是会做出别人想让我做出的决定?而不是自己的决定?为什么我明明不想做这个决定,最后还是做了?为什么事后后悔下次还会做?
为了决定以后减少不理性的消费决定,我决定把这个过程写下来,并且以后践行我的原则。

昨天我是怎么被坑的

昨天是个艳阳天,一个自如小哥跑前跑后带我看了好几套房子,特别热心,他不厌其烦地给我讲每个房子的特点,人超nice。
当我定下房子后,他开始推荐我使用“京东白条”(一种类似于信用卡的方式)付款。
“我的10个客户里,有8个都用这个”他说。
我有疑虑,他继续说“这个特别划算,全年服务费打七折,总价比较低”
我还是不确定,想亲手算算。他说“您不用算,我们客户都算过,这个比较便宜,要不然他们会用这个?”
“呃…”我在纠结。
“而且这个是押一付一,如果你用别的方式的话要押一付三”
在未选择付款方式前,是不能看到的京东白条的月付金额的。看着小哥真诚的眼神,我付了首付款。
支付完我怎么看月付款都不对,于是算了算, 一算吓一跳,尽管我第一个月少支付了两个月的房租和部分服务费,算下来我需要为这晚交的1-2月支付近10%的利息!
有理财经验的人都知道,1-2月无风险10%是多划算的投资,如果按照复利计算的话,算下来年化收益在170%-310%。
而且我并不差这两个月的房租,所以我,亏大了!
我很生气,钱只是一部分,我为什么又被坑了呢!我很不爽地回到教室,看见了金剑哥。
我 “金剑哥,你不是住得自如么?你用的哪种支付方式?”
“京东白条啊”他说。
…….
说明:京东白条的利息并不高,签了京东白条相当于京东支付了一年的全款给自如,相当于你向京东贷了一年的款项。自如为了实现尽快收款,给每一个销售小哥提成,让他们说服用户选择这个支付方式。后者是我猜的。

为什么销售总是“坑人”?

因为销售和我们的利益和目标不一致。作为消费者,我们寻求最高性价比的买卖,如果寻求不到我们往往会选择不消费;作为销售,他们想得到最多的利润(提成),这往往意味着卖给我们最不划算的商品和服务。两者的利益不仅完全不同,而且很多时候是相反的。
如果一个销售不指望一个顾客重复消费或者帮TA引荐更多的顾客,他能挣到最多提成的方式当然是在这个一次性交易中挣到你最多的钱,即卖给你最不划算的商品或者服务。

他们是怎么做到的?

我不得不想,到底为什么他们每次都能坑到我?想到《影响力》和Xdite之前的分享,我认为以下手法极具杀伤力。

  • 从众心态
    人事具有社会性的,我们没有那么多的注意力、意志力做每一个决定,我们往往也懒得思考,所以我们潜意识里相信大多数人的选择。
    “这件衣服卖的可好了,今天上午刚卖了一件。”
    “我的十个客户里有八个都选了这个”
    “我有个客户,跟你一样年纪,就选了这个。这不,昨天定下来的。”
    …..
    于是我们相信了...

  • 制造稀缺
    “就这一个了,你再来晚一点就没了”
    “你选的这套房刚卖掉了,这个户型就剩两套了”
    我们认为稀缺等于好的。

  • 互惠原则
    “尝尝吧,这个是我们最新推出的热销品”
    “这个是免费赠送您的”
    于是,我们由于不好意思,拉不下脸面买下来了并不好吃的食物和昂贵的套装。

  • 害怕失去
    “这是我们活动的最后一天”
    “这个卖的太好了,过两天你要是再定可能就没了”
    提到失去我们就会恐慌,然后匆忙下决定。

  • 喜欢占小便宜
    “第二件半价”
    请注意,相当于买两件,每件7.5折
    “满599送166”
    请注意,相当于7.8折,而且没准你根本买打算买到600块。
    双十一...

我的原则

经过反思,我希望践行以下原则来减少我被坑的几率,以免做出不理性消费:
1、慎重思考: 当做出重大消费决定时,一定要过夜,最好咨询有购买经验的人。
2、意识到销售的策略:当意识到销售的以上策略时,自动屏蔽他们的话。不因为任何理由原因买原本没打算买的东西,无论是便宜还是马上就卖光了。
3、亲自计算:当做出消费决定的时候,一定要亲自算账,不相信别人所说的更划算的选择。
4、做预算: 如果是有计划购买,如旅行,购物,双十一,做好预算,不做超出预算的消费。
5、做记录和反思: 记录下每次被坑的原因,下次吸取教训。

最后,我想说

请不要再坑我了,我已经吸取教训了。

===

xdite老师的观点
不一定需要在意被坑这件事,只要对方能帮自己解决问题,被收智商税也是没问题的。因为往往被收时间税和被收智商税只能二选一,而时间比较贵。
这是非常有趣的观点,我同意。

16年最重要的决定

| Comments

一个重要的决定

2016年的七月份,我还是一只有理想的产品汪,尽管被现实屡屡打击,一直希望给自己成长升级大换血,看到新生大学的发文,我特别的激动,觉得这是我的机会:
我是编程0基础,大部分的0基础培训看上去都是培训基础知识,而我想实战;我希望学习全栈的技能,而不是单纯的前端后端;google了教练xdite老师,浏览了Xdite老师的blog,发现教练非常的牛;相信李笑来举办新生大学软件学院的诚意…
但同时对于报名这件事,我是很纠结的:
这个价格对于毕业两年的我还是非常高的,几乎是大半年的收入了;毕业之后我就直接回了家乡(二线城市),内心对去一线城市还是有很多的恐慌和不确定性;去得话几乎只能离职,而这是我付出很多心血的第一份工作,内心是有很多感情的;学完rails之后我所在的城市几乎没有对口的职位,不知道出路在何处...
留在原地是安稳的选择,风险小,无收益,去远方是冒险的选择,风险大,收益大。最终我决定给自己一个机会,放弃安全感,拥抱可能性,于是我报名了。

疯狂的过程

刚来的第一天,北京下了2016的最大的一场暴雨,提着行李箱,爬着地铁坏了的电梯,想到被子床单都在奔波的路上...第一天真是凄惨无比,北京欢迎我的方式真独特。
培训开始了,没搬家之前,我几乎每天就睡5-6小时,剩下时间都在学习,尽管累,但是每天都非常兴奋,刚进入编程领域,万事万物都是全新的,创造是这个世界上最能带来快感的事。
两个月的高强度训练,写code,修bug,记录成为我的日常,朝9晚10,晚11,晚12都是常有的事,经常写着写着就忘记了时间。周末休息一天就感觉非常愧疚。这种状态从最初持续到了最后。

我的改变

编程能力

我现在可以独立开发web端中型网站,会写前端css,html,query,熟练运用ruby on rails。最后4周,我们团队5人完成了人才火箭项目,完成了从最初的使用user story分析拆解需求,到开发,到使用on boarding收尾,seo优化,及测试,性能优化及上线的整个流程,以下是我们的作品(下图是我实作的landing page):


地址:https://talent-rocket.herokuapp.com

观念

和code能力同等重要的是观念的大幅改变。甚至,在我看来这是更重要的事。之前有多少观念在脑海里洗涤不清,乱做一团。
xdite老师我是我接触过的大大牛,而慢慢我才发现,牛不仅是技能,而是在观念上就与我远远岔开了。接触到这样的牛人,为我的世界打开了一扇窗,让我看到了窗外的世界,与屋内的世界有多不一样。如果没有跳出来,就永远看不到差距。

做对的事

做对的事比作对的是更重要。但是往往你是不知道什么是对的事,什么是对的观念。而在这里,不间断地接受正确的理念。
比如幸运的公式是“1.看说明书。2.做更高级的决定”。更高级的决定是你当下无法通过自己的判断得出,而是比你厉害比你专业的人给予你的建议,例如,如果你的工作不能让你在感兴趣的领域成长,马上换工作,哪怕待遇好。可能你当时并不能理解,实际做了,才能体会到这个决定带来的红利。其实道理很简单,如果你从事感兴趣的事业,每天投入的时间是“8+2”小时,如果你只在业余时间从事感兴趣的事业,每天投入的时间是2小时。所以每天的差距是5倍。日积月累,能力积累何止翻5翻?
比如,安全感不是来自于你的工作,你的另一半,你的银行卡上的数字,甚至是你和别人一样,而是你的能力,你的视野。井底之蛙当然会担心没有食物,因为它只守着一口井,不能控制井的干涸,天气的情况,只能听天由命。当它跳出来,才发现安全感来自于捕食的能力。

学习理念

编程学习就是拼图学习+联系套路(肌肉记忆)+成就感
很多人认为学习是登山,但如果真正去学的时候,大多时间没有攀登的感觉,不是匀速向上,而是混乱。
这是由于学习不是线性学习,而是拼图学习,混乱是常态。
在拼图学习中,最重要的快速拼出框架,而不是纠结于细节。快速联系套路是掌握拼图框架的最好方式。在混乱的过程中,正反馈是必须的,这样才能坚持不断地前进。

真正高效的学习法——
喂给学生能够有效、够多量「启动思考」的基础知识
这句话的重点在于「启动思考」而不是「基础知识」
甚至是要教给新手「可启动」的「套路」,而「事实型知识」留待新手自己补完
所谓「可启动的套路」,实质上是 一个有效连结「高频存取知识」(由教师统计出)的完整成果
然后,练习练习再练习,总共练三遍。烧进长期记忆中。
甚至迁移迁移再迁移,使得学习者建立可以在陌生场景中,轻易辨识一个新问题(即便以前没有建构)的内在结构的能力。

https://gist.github.com/xdite/bb0dd0aa0e3f986089a5481bf5c013b7
这套模式让我开始可以独立开发,而且不可思议的是,学习了rails之后,再学css和jquery居然没有在感受到陡峭的难度,完全可以自学,通过重复练习小的套路,然后上手,实际效果很不错。

商业理念

xdite老师的growth hack整套理念改变了我的商业价值观。原来如果努力做一件还是赚不到钱的话,不是要更加努力,而是要思考转变道路,如果还是不能成功的话,就要考虑所做的事情是否正确。
这套源自硅谷的概念,经xdite不断深挖,成熟可实操,第一次听到振聋发聩。比如传统的互联网营销注重的是拉新,而在growth hack体系里,这只是acquisition,远没有referal和activation重要,后两者可以改变商业模式的成长系数,让收益成本比翻几倍。

回顾

不敢相信,时光过去了两个月。这两个月是我人生中感受最长的两个月,时光仿佛无限拉长,现在谈起一件发生在5月份的事,仿佛发生在去年。我们感受的时光不是24小时制,而是时光的密度,事件的浓度,所以这两个月发生了大多,更像是是一年的强度。
2个月后,我庆幸做了这个决定,这无疑是我2016年最重要的决定。我发现,来全栈培训营是一个投资回报率超高的投资,收益比我想象中大,无风险。
2个月的时间足以让我焕然一新。

第七周的总结

| Comments

团队的利益远高于个人利益

rocket项目上线了。特别感谢我的战友们,5个rails 0起点的队友能把网站从0在四周内搭建起来。
我认为原因在于成员三观一致,认同团队利益远高于个人人利益,个人的成果通过团队展示,所以没有人炫技,每个人都负责任,只为把网站做好。在实际开发过程中,当然大家会产生争执,但是由于三观一致,所以对事不对人,可以用最小的成本把事情解决。尽管上周我说过更喜欢做后端,但是团队目标需要我做前端的时候,一定义不容辞。


地址:https://talent-rocket.herokuapp.com
只有每个人都以团队为先,大家在一起才能做出最棒的成果。

给自己最利于成长的外部环境

你最想要的是什么,如果是成长,请给自己最利于成长的外部环境!对一个最在意的是自我成长的人来说,对自己好不意味着最好的物质享受、声色犬马,而意味着最好的外部环境,最好的队友,持续给你正反馈的环境。在这种环境中,能放大你的成果,让你的成长速度提升至200%。所以为什么不花时间?不花钱?不放弃代表稳定的安全感?你值得最好的!

不要追求完美主义,时间成本使最昂贵的,优化的工作应该在迭代的时候做。

应该用最短的时间完成mvp,前期不应该花太多时间追求完美主义,做到85%即可,因为85%-99%之间是成倍的工作量,而从99%-100%几乎是不可能的。做到85%可以极大地压缩时间成本,相当于给自己留下了巨大的时间资产,才有可能在固定的时间内完成整理,测试,根据运营迭代等有价值的事,最重要的是按时达成有质量完成上线目标。
在迭代前要开始进行前后端代码整理工作,便于团队合作改bug及功能迭代,不然后续加功能会很痛苦,易出错。其实代码整理是很爽的事,可以回顾之前的工作,删繁就简,大大提升网站性能。

最后是感谢

2个月马上就结束了,有点伤感,更多的是收获还有感激。
感谢xdite老师,你升级了我的观念,让我看到更大世界的可能性,是我的 role model。
感谢rocket团队,学霸,nfree哥,liber和李师傅,能够和你们合作,我感觉很幸运。感谢给我鼓励和帮助的小红老师,eve老师和yy老师。感谢曾经帮助过我的同学们:DJ, 班长,lily,聂师傅,思宁,国锋....感谢全栈营的你们。
最后,感谢自己。感谢自己的努力带来的收获,在不断成长的过程中不断地增加信心。继续加油,成长无止境!