王梦琪的博客

记录技术学习及感悟

第七周的总结

| 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,聂师傅,思宁,国锋....感谢全栈营的你们。
最后,感谢自己。感谢自己的努力带来的收获,在不断成长的过程中不断地增加信心。继续加油,成长无止境!

第六周的总结

| Comments

  1. 只学最小必要知识并实践是节省时间和快速上手的最佳方法,如果想要进阶,需要学更多的内容。
    本周一半时间大战css,由于css学了code school上的一个课程(css cross country)就直接开始写,写的过程是结合学的内容,使用chrome的检查研究别人的网站,使用工具画图算间距,然后动手。
    如果不是学完一个课程就开始写,到今天应该还是在学习。
    但同时,由于学的内容较少,所以一旦局部页面复杂程度增加一倍,时间成本至少会变双倍。所以一天差不多写一个3屏页面。
    另外由于学的比较浅,前端页面代码可维护性比较差,结构比较冗余,如果改版,需要进行代码重构。
    如果有时间的话,应该不断进阶,再继续写页面,这样后续能够节省更多的时间。

  2. 确定规则的讨论才有意义,否则是无效讨论。
    比如头像功能,我们讨论了很久,讨论不出结果的原因是因为大家没有统一标准,各自的观点建立在自己的标准上。
    因为讨论的虽然是具体功能,但是实际问题在于价值排序, 比如说可能有些人认为用户体验更重要,有些人认为页面信任度更重要,有些人认为实现成本高低更重要。自然很难确定。
    此时统一标准就显得尤为重要。

  3. 做对的事情比把事情做对更重要,所以要确定什么是对的事情
    方法论特别重要,没有方法去做事,事倍功半。比如回到头像功能,xdite老师周五分享了growth hack的高阶方法。先算这个功能的价值,再算这个东西的实现成本,再去更其他功能进行比较,做性价比最高的事。如果大家都认同这套方法论,将所有的功能一一列出算出得分,这种细节功能就没有争论的必要了。

  4. 尝试了才知道自己喜不喜欢
    之前很多研发同学说前端有趣,好玩,易上手,推荐女生转前端。
    但是实际去做后我发现,比起前端我更喜欢后端。前端更琐碎,更多条条块块,细节更多。
    后端更重逻辑和流程,做起来会让我更有成就感。

第六周好用的工具

| Comments

atom pakages, atom插件
tree-ignore
隐藏文件:创建一个.atomignore文件可以将treeview不常用的文件夹隐藏。
git-time-machine
使用快捷键alt+t查看该文件的所有历史版本,并和当前版本对比。
特别适用于协作。

git快捷键设定
在atom里的/.git/config文件里加入
[alias]
ci = commit -m
co = checkout
st = status
br = branch
此时就可以在iterm里用缩写打出对应命令。

iterm命令
rails c里查看一个对象的所有方法。
例如:a = User.all
a.methods.sort

第六周的大坑

| Comments

xdite老师分享说有把自己之前实现问题的整个过程都记录下来,不仅记录对的还有记录错的,好处是:

  1. 帮助攻克难题:方便查看之前的步骤,避免步骤太多忘记之前的思路和尝试的方法。
  2. 避免以后犯同样的错误:错的东西一旦记录下来以后会犯得可能性大大降低了。
  3. 便于回顾:以后可以回顾自己是如何解决问题的,回顾当时的思路和方法。
  4. 可以帮助遇见相同问题的开发者。

实现步骤

本周有一半时间在做前端,前端的坑主要还是排版的问题,这里记录一个后端的功能。

功能:admin创建一个项目的时候通过输入user的email的方式指定用户(说明是哪个用户创建的)。

我的想法是:admin在新建项目页输入email提交时,将email参数传入controller,在数据库里找对应的user_id,找到了就将user_id存到project表里,找到后进行其他栏位的判断,找不到在当前页面报错。

步骤

  1. 第一步:在view里使用simple_form将email这个参数传到controller
    因为在project这个model里没有email字段,所以google ”rails simple form not",此时出现最佳匹配句“rails simple form field not in model”
    找到用法:在model里添加attr_accessor:user_email, 在view里就可以写<%= f.input :user_email %>

  2. 第二步:在controller里取出email的对应value,并进行判断。
    第一稿:

    def create
    @project = Project.new(project_params)
    @user = User.where(email: params[:user_email])
    if !@user.present?
      render :new
      flash[:alert] = "无此用户"
    else
      @project.user = @user
      if @project.save
        redirect_to admin_projects_path
      else
        render :new
      end
    end
    end
    

    此时出现坑
    使用:@user = User.where(email: params[:user_email])
    取不出来user_email参数,去看rails log 出现:

    <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"kAzFJ7l7dzx9j+pZxlQbNT+9CEexlmT/ 6wfjRgL6w5hZmOKt+R/ep6KVuC8M9se46fapQ1UIyy53sMlNXvSDJA==", "project"=><ActionController::Parameters   {"name"=>"22", "description"=>"<p>22</p>", "user_email"=>"1", "category_id"=>"1", "fund_goal"=>"33",     "video"=>"3"} permitted: false>, "commit"=>"创建项目", "controller"=>"admin/projects",  "action"=>"create"}
    

    发现是hash套hash结构,应该现将:project对应的value取出,再将:user_email对应的value取出。如下:
    @user = User.where(email: params[:project][:user_email])
    此时又发现
    报错AssociationTypeMismatch @project.user = @user
    使用binding.pry发现可以取出@user,但是取不出 @user.email.看来是数据类型不对,发现使用where得到的是一个array,而使用 find_by得到的是一个值。
    在rails log里 使用where是

    SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1],
    

    而使用find_by得到的是

    SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1]    ["LIMIT", 1]]
    

    至此出了第二稿,正确。

     def create
    @project = Project.new(project_params)
    @user = User.where(email: params[:project][:user_email])
    if !@user.present?
      render :new
      flash[:alert] = "无此用户"
    else
      @project.user = @user
      if @project.save
        redirect_to admin_projects_path
      else
        render :new
      end
    end
    end
    

最快做出mvp的方法是什么

| Comments

rocket项目从开始到如今近3周了,在没有前端,没有设计的5个ror新手努力下(好吧,有一个做了2年java的学霸),居然进展了80%,到了修bug,完善用户体验的阶段,实在是很神奇。
这一切来源于xdite老师的方法。

  1. 每天拿出一个完整展示当天成果的产品gif,
  2. 每周拿出一个能完整展示本周成果的presentation
  3. 每周结束时确定下周任务,
  4. 每天完成tower任务加开晨会
  5. done.

这个方法最重要的是一二两条!正是这些简单的方法,带来了莫大的好处。
很多互联网公司做产品的进展很慢,一种经常出现的情况是,产品做完交接给设计,设计做完交接前端,研发自己默默地写,直到一个月研发套完页面后,我的天,产品发现逻辑跟设想的完全不一样!
而做以上的方法的好处是:

  1. 目标感:团队目标统一,每个人的目标都是做成“能动的程序”,提供团队作战能力,保证大家对当前的项目有贡献,避免团队成员走偏。
  2. 解决沟通问题:每天/每周都有结果汇总,团队成员都可以看到最新进度,避免上述的消息不对称及沟通不畅的问题,可以快速纠偏,避免一个月之后才发现问题。
  3. 成就感:增强团队成就感,每天每周的展示让每个成员都意识到自己对项目的贡献,成就感本身就是对开发者的莫大激励。

事实上,上述方法的本质就是“展示所有成果”,所谓一招制胜,想到之前开发过程中的辛酸泪,真是无语凝噎呀。

第五周的大坑

| Comments

ror入门之后发现程序出错,踩到坑也不算什么大不了的了。因为只要是坑必然可解,只要能解,都不算特别了不起的大坑。所以本周最大的坑不是程序方面的。而是更深入领悟了一个道理:

学code,状态非常重要。

状态分为两个方面:一方面是注意力,一方面是心态。
注意力:最影响注意力的是体力,所以千万不要熬夜。人的精力(体力)是有限的,第一天透支了,第二天势必会效率下降。
所以错误一:这个月停止运动,整取使用尽可能多的时间写code。
错误二: 第二天熬夜至2-3点,第二天7点起,导致第二天效率极大下滑,第一天的夜算是白熬了。
要想保证注意力,体力是根本保证,要好好吃饭,好好睡觉,好好锻炼,尽量减少生病的概率。

心态:心态是意愿,想保持好的心态,秘诀很简单。不要被闲杂事干扰情绪,不停地找成就感。在每天晚上拿出一个让自己有成就感的成果,就是对自己最好的激励~ 同时在明白这个道理的时候,也是提醒自己每天要特别关注注意力管理,把当天重要的事情做完,做好。

第四周的大坑

| Comments

  1. 建立model关系后导致的坑

    分别建立了plan和project的model后,在plan内加入了project_id栏位。分别作了plan和project的CRUD,功能均可以用。
    当加入了belongs_to和has_many的关系时,plan的create不可用,原因是此时未在controller里加入plan和和project的关联,所以plan新建时找不到project_id

  2. git 命令

    git命令一定要看说明书,不能看见命令想当然。
    比如 git pull origin master
    git push origin master
    此处第一处master指的是远端的master分支,第二处指的是本地的master分支。

  3. 将项目文件夹丢掉trash导致
    将项目文件夹丢到了trash之后,重新clone远端后,忘记重开rails server,所以此时server捞的是trash里的。所以无论修改什么localhost都不显示。

建议在问题处将内容输出检查,比如
在判断式@plan.price < @project.fund_goal判断式不生效时,执行输出,测试变量是否正确。
puts "#{@plan.price} ----- #{@project.fund_goal}"

git pull、git fetch、git push

| Comments

合并远程分支
简单说“pull = fetch + merge”

fetch(推荐)

把远程分支C(远程主机名为origin)拉到一个分支D,确认无误后再合并到自己的原来分支B。

  1. git fetch origin C
  2. git branch -a (查看全部分支,包括远端分支,假设里面有远端分支缓存remotes/orgin/E)
  3. git checkout -b D origin/E (远端分支必须装到本地分支才能取出)
  4. 有冲突,git status
  5. 在atom里面改对应文件。head下是你的,往下是远程的。
  6. 如果schema错了, rake db:migrate , 重开rails server
  7. 提交git add . git commit -m “”
  8. 切换至B git merge D

pull高级版

把远程分支C(远程主机名为origin)拉到一个分支D,查看后再合并到自己的原来分支B。

  1. 切至D,git pull origin C
  2. 有冲突,git status
  3. atom里面改对应文件。head下是你的,往下是远程的。 4.如果schema错了, rake db:migrate , 重开rails server 5.提交git add . git commit -m “” 6.git checkout B 7.执行 git merge D

pull简易版

把远程分支C拉到合并所在分支B。

  1. git pull origin C
  2. git status
  3. 在atom里面改对应文件。head下是你的,往下是远程的。
  4. 如果schema错了, rake db:migrate , 重开rails server
  5. 提交git add . git commit -m “”

push

本地分支B推送至远程终端
1、将远端拉下来(参考fetch推荐)
2、再git push origin B

第三周总结

| Comments

本周上课第一天就完全懵了,什么,购物车?各种条件限制? 我还只会做CRUD啊,真后悔上周周末休息了一天半。
拼命一周,到第五天回顾的时候,发现自己弄懂了参数传递,会看rails log,弄明白了数据库基础语法,搞明白了状态机(下图为订单流程图)终于可以给自己点个赞。不由得说前几天惶惶不可终日,连睡眠都睡不够的状态太夸张了些。


于此明白了学习就是”懵懵懵懵懵“然后”哦哦哦哦哦“的循环往复的状态,懵是因为给自己高于处理能力的信息量,每天大概只懂了70%;哦是因为把所有的知识处理完毕,将所有的拼图拼了起来(知识练了起来,融会贯通)。而这种是快速学习的捷径。
最重要的心态是”不要慌,不要慌,不要慌“,最重要的态度是”专注,拼命往前“

截止目前已经完成了一个有“admin后台管理产品,管理用户,管理订单(确认退款,确认退货,发货);user前台查看产品,购物车,下单,收到邮件通知,管理我的订单(付款(api没有做),申请退款,确认收货,申请退货)的一个project。从一行代码没写过,到现在出了一点内容,对自己慢慢有了信心~。这个世界上的天花板往往是自己给自己设定的,下个礼拜继续和伙伴们一起成长~,加油~~~~

第三周最棒的概念或工具

| Comments

推荐工具:

  1. process on
    画流程图禁止不能更棒!
    详细内容见:https://www.processon.com/

  2. 生成表关系的gem Rails-ERD
    会有一个表关系结构图(表里有重要字段)
    1.安装 Graphviz: brew install graphviz
    2.安装 Rails ERD,在Gemfile里面修改如下:

    group :development do
    gem "rails-erd"
    end
    bundle install
    

    3.在终端里执行 rake erd
    会生成一个pdf文件erd.pdf,在你的项目文件夹里~
    详细内容见:http://rails-erd.rubyforge.org/install.html

本周重要概念:

总结!现在可以开始总结了,方法的应用,参数的传递这一步都有开始总结清楚!!!现在不总结,下一步写的时候会糊涂。
此处先填个坑,回来补参数和方法之我的看法。