w5d4

O

今天演示顺利,下午xdite讲了『onboading』,但是看得出『周五综合症』还是有点发作,吸收不佳,然后剩下的实现就是把律师端的用户问题筛出来,这时候看出了数据库设计的问题,结果造成逻辑不佳,费了很大劲,绕弯了不少最终实现了。

今天从xdite那里明白了一个道理,多数人做决策追求的不是『理性的』和『最好的』,而是为了『省事的』和『没错的』,因此好的产品重点在于让用户『习惯』这个产品,因此我们做的产品应该尽可能让用户很容易方便很习惯你的产品。

设计方面,从曾铮那里学到了『最低成本的安全有效的设计模式』,估计对明天做遗嘱有速度和美观加成。

R

『习惯』真的是一个强大的力量,我发现我也是,只不过是为了贪图用小米用惯了,不需要适应新的其它手机系统,所以干脆懒得尝试别的设备,即便别人告诉我他的新手机多好,我也懒得尝试。除非原来的东西有重大缺陷,不然还是会尽可能将就着用。

I

在有老师有助教的情况下有经验类问题赶紧问,坑是不可预见的,不要把问题和疑惑放过夜,让自己以最大效率前进,然后不在的情况下问题想办法多试试关键词及时google。

D

下午xdite跑太快了,等活干完后又没时间抓住她问东西了,只好等下周了再。

明天继续做『遗嘱』,需要把LandingPage前端赶快搞出来,下午至少把mailer搞出来,然后周日前一定要想办法和律师项目一起上线了,不然在没有时间搞了。

w5d3

O

一天时间超级赶,在copy仿的那个站点的时候花了不少时间在js上面,还有就是样式方面调整了不少时间,一切都是为了明天的演示,真的发现deadline的效用无穷大,以至于最后回去时候已经没有地铁了,坐了一个小时的公交才回家。

R

另外有了之前自己做项目的感觉,就是『热血渐退』,即为了完成目标,功能、特性、优化砍砍砍,最终大脑终于出来了主线,只要按照主线往前走就好了。

但是,这种情绪我不知道是好事还是坏事,好在可以督促自己加快进度,很快滤出主线,坏处在于,处于这种情况下虽然会降低code质量,甚至使自己的code之后难以维护,很容易编出一些图省事而后期可能维护吃力的地方。

I

今天为了deadline,实在是忙的腾不出手,所以没什么特别的感悟,唯一的感觉就是『日清』很有效,尤其是danniel逼我使劲赶进度,还帮我把其他人的问题给引流出去,腾出了更多的时间清掉当天的票,基本能保证『票不过夜』,之前工作性质原因看不出『日清』这种事情的成效,现在用到后才发现好处,虽然一天很累,但效率超高。

D

鉴于之前的每周五的情况,今天提前把明天的事情安排出来,尤其警惕明天突然散架的『星期五病』。

w5d2

O

今天精力不错,三块儿重功能终于搞出来了,attach附件、动态合并、notification系统终于都能用了。

尤其是晚上,参考了上期学员的大作业,提示系统前终于work了,耗费了不少精力。靠yy提供的资源,发现居然思路命名都一样,真不愧是一个老师教的,看代码逻辑完全无障碍。

但好在,这次我觉得自己做的要比他们强一点,至少没有用那个笨笨的layout方法,使用popover来提示更加像话一点,只是代码有点乱,但他们用了什么json.build的格式不知道什么鬼,回头还需呀问xdite。

R

最近看到知乎有很多人在评价我们这个班,发现不看好的也大有人在,不过后来看到了一个技术人评价,我发现自己还真是有很多东西没有补上,比如react、后台架构、数据库的设计等等本来是我上这个班之前关心的东西,结果由于自己太沉迷冲项目进度,花了过分长久的时间研究自己课下也能搞定的东西,结果都没时间问xdite,这是失误

I

时机这件事情很重要,很多时候我们有机会把握的时候懒得去抓,甚至随意挥霍,然而在真正需要的时候再想抓可就抓不到了;在做事时候,不要因为琐碎就偏离自己的主线,并且我自己又是太容易发散的人,还是要聚焦才好。

D

赶紧把手上的事情清掉,我要花更多的时间在『套路的练习』和『新东西的了解』上,不要再浪费时间在『课下也可以做的事情』上,对得起自己付出的钱和时间。

w5d1

O

早上明明和xdite确认了view的拆分问题,然而,到实际上手时才发现我他妈居然懒得下手改,之前的在view里面大量插入ruby的临时办法成为了技术债务,一坨一坨的扎在里面,下手去调它实在是非常恶心,但只有做这样的事情才叫套路,才能积累成长,自己在这方面心里已经犯懒了。

R

另外发现一个很严重的事情,一直以来,我觉得我的基础比较好一点,所以应该比别人走得更快才对,然而,我今天才发现,原来我有可能比别人走得还要慢。

看着大家都从零基础往前跑的时候,我却走得像龟爬一样,并没有走得更快,反而只是在原基础上修修补补,慢慢悠悠的前进,还是用之前的方法对新的小特性一个骨头一个骨头的啃,我觉得在参加培训时候做这样的事情不够明智。

I

课程每天的价格平均下来1000还要多,我是来学习怎么赛跑,怎么高速搞定产品的,已经有现成经验的东西我应该通过老师协助,索取解决方案来解决,不该自己磨大量时间钻进去,这种耗时『钻』的方式我应该是放在课下的,不该在课程期间搞,反而我应该集中精力去搞清楚自己之前不明白的东西,否则难以看到自己每天自己在技术层面的明显进步

作为一个实用主义者,应该以快速解决问题为目标,教练课程的精髓在于反复『练习』,而不是『学习』,即便要学东西,也该是学习自己不了解的新领域而不是在原有的基础上叠加。

D

最近这两周花了太多时间研究了太多即便在课下也能自己研究出来的东西,接下来把这些东东西还清后,我打算还是反过来折腾和练习刚刚掌握的一些自己没搞熟的东西,尤其是标准的crud、rest接口、heroku、s3等用法

w5d0

O
今天发生了一件事。亚东居然被xdite劝退了,可是一直以来觉得亚东学还可以呀,怎么就被劝退了呢?问了亚东,结果他好像也是一脸懵逼。毕竟是方舟同侪,他就这么突然离开总是觉得有点别扭,可能原因要事后才能知道了…

今天下午由于工作需要,给同事远程了大半个下午,也没有解决,所以需要临时跑了趟东单去排障,结果下午除了调出100个页面问题,晚上啥都没干成,果然我是单线程的,一次只能做一件事,只能希望接下来半个月这种事不再发生罢。。。

R
以前一直是长期自己单打独斗,由于工作性质关系,就连在公司也是如此,最近这周这次终于有了协作的概念,和一群都很优秀的人同盟做事是个十分享受的过程,虽然还在磨合阶段,但是配合做事的感觉越来越强,我发现自己总是觉得自己脑子快结果做了很多反而是猪队友的事,可能需要我这边需要经过更多的团队协作活动经验逐渐改善。

I
原来α版本之后并不是应该是β版本,应该是α++。一个可投入使用的α++版本。要远远强过一个有更多功能但却不能用的β版本。今天列出来了将近100个优化点,发现单是把这些完成就有不小的压力,更不要说本来这周想做的一大堆高大上的功能了。幸亏xdite赶紧叫停,不然前面还不定多少坑。

D
经过今天的梳理,虽然lawfirm要做的事情还很多,但是感觉思路蛮清楚的,有望在这周全部搞定,下周就可以磨炼hackthone技巧了。

ror突进-js的评价rating

评价系统其实是个input单选框,换成了星星样式而已,基本上是个纯前端的效果,使用现成的jquery基础上的plugin就可以了,实测可用的项目地址如下
https://github.com/wbotelhos/raty/

其中有用的只有

https://github.com/wbotelhos/raty/blob/master/lib/jquery.raty.js
https://github.com/wbotelhos/raty/blob/master/lib/jquery.raty.css

这两个文件,把这两个文件分别放在项目的

app/assets/javascripts
app/assets/stylesheets

下面

然后需要设置一下页面的预备载入,初始化时候加入该文件位置

config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( jquery.raty.css )
Rails.application.config.assets.precompile += %w( jquery.raty.js )

但是这里面还是有个问题需要解决,就是需要设置评分的星星样式
比如我设置了两个图片分别是

star-off.png
start-on.png

图片下载地址如下

https://ooo.0o0.ooo/2016/11/21/5832a40577f56.png
https://ooo.0o0.ooo/2016/11/21/5832a40578015.png

直接放在了 public/ 下面,这样我就能通过/star-off.png和/star-on.png来直接调用

都设置完成后,我终于可以再项目中使用了
首先我需要做个带id的div

<div id="rating-for-message-1" class="text-center"></div>

在我需要给该rating嵌入一个script

          $("#rating-for-message-1").raty({
            path:"/",
            starOff: 'star-off.png',
            starOn: 'star-on.png',
            size: 32
          });

这就行了,跑起来后浏览器会把它渲染成为一个input,到时候里面填好值,直接放到表单里submit提交就行了

Ajax提交rating

如果是简单的表单提交评价,以上即可,如果是ajax提交要求页面不刷新,需要继续往下看

ajax提交首先后台需要有个接收提交的controller的action,比如这个接收三个参数conversation_id,message_id,rating

  # 评价系统

  def rating
    # 获取message的参数

    conversation_id = params[:conversation_id]
    message_id = params[:message_id]
    score = params[:rating]

    # 找到指定的message

    conversation = Conversation.find(conversation_id.to_i)
    message = conversation.messages.find(message_id.to_i)
    # 为message评级

    message.rating = score
    message.save

    return 'success'
  end

然后路由需要把它放出来

  # 评价系统

  collection do
    post :rating
  end

然后js部分比较繁琐

    $(function() {

        // 初始化rating选框

        function initRating(obj) {
          obj.raty({
            path:"/",
            starOff: 'star-off.png',
            starOn: 'star-on.png',
            size: 32,
            click: function(score, evt) {
              // ajax提交

              ajaxRating(score);
              // 锁定rating

              lockRating(obj,score)
            }
          });
        };

        // ajax提交评级

        function ajaxRating(score) {
          $.ajax({
            url: '<%= rating_account_questions_path %>',
            type: 'POST',
            dataType: 'json',
            data: {
              'conversation_id' : <%= @conversation.id %>,
              'message_id' : <%= m.id %>,
              'rating': score
            },
          })
          .done(function() {
            console.log("raty success");
          })
          .fail(function() {
            console.log("raty error");
          })
          .always(function() {
            console.log("raty complete");
          });
        };

        // 锁定星星不可重新提交

        function lockRating(obj,score) {
          // 锁定部分样式

          obj.raty({
            path:"/",
            starOff: 'star-off.png',
            starOn: 'star-on.png',
            size: 32,
            readOnly: true, score: score
          });
        };

        // 允许评分的对象

        var ratableObj = $('#rating-for-message-<%= m.id %>');
        initRating(ratableObj);
        // 已经评过分的对象

        var unRatableObj = $('#raty-for-message-<%= m.id %>');
        lockRating(unRatableObj,'<%= m.rating %>');


      });
      </script>

细节是:
首先需要有个初始页面自动加载的函数

$(function() {
  // 需要运行的所有js

});

然后需要区分两种星星,一种评价前的一种评价后的,使用不同的js函数来处理

        // 允许评分的对象

        var ratableObj = $('#rating-for-message-<%= m.id %>');
        initRating(ratableObj);
        // 已经评过分的对象

        var unRatableObj = $('#raty-for-message-<%= m.id %>');
        lockRating(unRatableObj,'<%= m.rating %>');

分别写initRating()和lockRating()
initRating()

        // 初始化rating选框

        function initRating(obj) {
          obj.raty({
            path:"/",
            starOff: 'star-off.png',
            starOn: 'star-on.png',
            size: 32,
            click: function(score, evt) {
              // ajax提交

              // 锁定rating

            }
          });
        };

lockRating()

        // 锁定星星不可重新提交

        function lockRating(obj,score) {
          // 锁定部分样式

          obj.raty({
            path:"/",
            starOff: 'star-off.png',
            starOn: 'star-on.png',
            size: 32,
            readOnly: true, score: score
          });
        };

未评价的input点击后事件是

           click: function(score, evt) {
              // ajax提交

              ajaxRating(score);
              // 锁定rating

              lockRating(obj,score)
            }

由于『锁定rating』直接用lockRating()就可以了,而『ajax提交』需要另外写,用来提交这三个参数
ajaxRating()

        // ajax提交评级

        function ajaxRating(score) {
          $.ajax({
            url: '<%= rating_account_questions_path %>',
            type: 'POST',
            dataType: 'json',
            data: {
              'conversation_id' : <%= @conversation.id %>,
              'message_id' : <%= m.id %>,
              'rating': score
            },
          })
          .done(function() {
            console.log("raty success");
          })
          .fail(function() {
            console.log("raty error");
          })
          .always(function() {
            console.log("raty complete");
          });
        };

w4d4

O

一整天没干什么正事,自从早上展示成功后,就只是重新梳理了项目的主干和us,然后剩下的时间到处晃荡聊天。

开始进入币圈,加入了雁飞的群,没想到daniel这么懂,帮我搞清楚了很多币圈的知识要点,还搞到了王秒翻的《精通比特币》。回想自己以前碰这个也算是早的,但是苦于身边没有关注和讨论这个的人,有种找到了组织的感觉。

R

觉得每次都是,紧绷的神经突然放松,一整天都会过的比较荒废,一天都没有办法吧精神与注意力集中起来。不知道这是不是好的情况,每次这样的一天结束都会感到有些懊恼,毕竟一天学费也蛮贵的。看来个人的进度与习惯真的是与环境息息相关的,只有在同侪压力下才能很快进步。

I

晚上听前几期的逻辑思维,听到了一个代班老罗的女记者转投行有了很多感悟,发现原来自己居然也是一个被『传统思维』困住的人,可能就连『相对保守』都不一定能很好的适应这个快速变化的时代了,很多机会转瞬即逝,我们唯一可以做的就是必须紧跟着时代的节奏走,做个合理追赶『潮流』的人,才不会被落下。

另一点就是发现保持前进从某个角度很容易,就是让自己长期处于『非舒适区』,这样的压力会让自己很快找平,并且不要自己全学全干,时间是有时间成本的,一定要学会和各领域熟练高手配合,应该花大量的时间提高自己的『社交货币』,让自己成为『被需要的人』,单枪匹马VIP、小富即安在这个商业文明正在快速发展的时代已经不是一个好的选择了。

D

以后还是要不断往高处去,这样会更容易找到和自己追求类似的人,不要没事自我设限,这会阻拦自己的成长。

明天接着弄遗嘱项目,做更多的前端和us,把前端的编辑器铺进去。

王秒椅子太棒,一定要买一把。

w4-overview

在rating的ajax上花了过长时间,先是第一时间试了下gem测了半天不成功,然后换了一个偶然查到一个js库,折腾了一下午总是感觉差一点就能用了可就是搞不定,最后发现原来我用的源码版本和readme不匹配,又切换到了最新的版本,却依然被卡住。

后来才想起之前原来自己用过一个库是能用的,又去翻以前项目的源码才找到,发现原来自己之前找到的这个库居然这么流行和好用,自己查昨天拿到的东西却很冷门,白白浪费了很多时间。

然而用了这个库之后,却发现存在第一次请求后加载的jquery-rating.js失败的问题,只有在第二次刷新后才能成功。找了半天尝试了在全局静态文件里面预载入才成功,最后终于work。

然而这些东西明显都应该是能很快搞定的东西,属于小套路,却耗费了大量时间来解决,所以我学会了要形成一个套路:做感觉有套路的东西先想自己有没有做过类似的,没有的话找有没有轮子,有轮子的话先花足够的时间去找该轮子最权威的资料,不要自己猜,遇到问题及时google,搞定后要把套路记下来,避免下次重新趟坑。

收获

这周大致翻了下亚东花一百多大洋买的《深泽直人》,加上又有职业设计师曾铮的解说,对设计这个领域有了更深刻的理解,而不仅仅只是『美工』这种低级的层面,也不是,更多的是一种思维方式,与解决问题的哲学。

看到了曾铮设计的东西,发现设计真的是有条理的东西,是可以通过思考、推理与练习学会的一种技能,是可以直接体现在任何的产品上的,即便是跨界,从设计层面一个普通的设计师也能秒杀一个技巧熟练的美工,这两者的技能明显不在一个维度上,而且设计师更通用的,这会是一个终身受益,而且可以扩展到很多行业的技能。

再有就是上瘾了,很明显这周的工作开始越来越沉浸,找到了节奏,就能很快适应它,并且找准自己的套路去配合,然后就能高效和投入的做事情,xdite的上瘾论果然是有效的。

总结

学习的过程是个探险,在自己不熟悉的地方探索的时候,挖到宝是运气好,但不能指望每次都走运,又是费了半天劲就是什么也没得到,然而有的很有价值的东西甚至可能很轻松就能搞到。

而一个好的老师并不是直接把宝贝交给你,那样只会让你丧失自己探索的能力,优秀的老师是先给你示范到底是怎么挖宝的,然后给你指出哪里有比较大的几率挖到宝。

这可能就是我之前有个老师说的指兔子的感觉,虽然他没能做到,但是这次我终于头次深刻体验到了这种训练模式。

w4d3

O

今天效率爆表,进度超级吊,终于把评价系统搞定,还fix和增强了对话的功能和提示性。

李校长又来了,今天说了3句:

  1. 能力取决于思维的颗粒度,当越能微观的了解一件事,就越有更多的方法处理它,但是颗粒度越小,学会它就越困难,就需要依赖良好的规划能力。
  2. 良好的规划能力是把一件事情拆分的能力,不锻炼拆分能力依靠短期脑子快是不会提高逻辑能力的,拆分能力越强就越能处理小颗粒度的东西。
  3. 学的越多,不仅不会越来越轻松,反而会越来越忙,因为能力越强,能做的事情就越多,视野也越大,欲望也会增长,但这是良性循环;人无法学会东西的本质原因是因为觉得这个不重要,只有想办法把要学的东西变成刚需,才能学会,所以我们应该成天琢磨怎么把自己要学的东西变成自己的刚需,刚需一定能学会。

最后还赠了一句:
听大多数人的话,参考少数聪明人的意见,最后自己做决定。

R

我感觉一个问题沉浸进去之后,会开始有情绪,解不出了会着急,走错路会沮丧,新问题会好奇,这个时候大概就是到了上瘾的状态,自己效率会提升很多,尤其体现在今天,况且明天又是展示的deadline,压力在这里也起到了作用,看来之前xdite的『上瘾』必须完成的『压力』是有效的,单靠好奇与意志力确实不靠谱。

I

这次校长话里营养太多,还有待整理,只记住了最后的一句,老桂也说过,第一次听得时候没往心里去,不过这次校长话听进去才觉得,自从长大后自己做决定对我来讲一直是一个很麻烦的事情,很多都做的很匆忙草率,很多盲从他人意见,脑子不够清楚到能自己知道决定是否正确。

原来逻辑训练这是需要投入时间不断练习的,通过细化颗粒度-良好的规划拆分-把自己要学的东西变成刚需,形成良性循环,不断的强化和训练这个循环,以此提高见识和逻辑能力,提高自己做优质决定的概率。

D

虽然校长给了个大概的套路,但是目前还是欠缺实践,唯一能保证的是趁年轻还有足够的精力来不断投入,在各种新的领域,加强自己的正循环。

晚上随王秒点的全速健康食品,虽然一大盆,可是我们吃的完全不顶饿,决定明天点垃圾食品...

另外上次公司的那个金喇叭不白发言,今天收到了郑璇邮的奖品——一杯咖啡+一个多肉,明天争取找Devid要个咖啡杯种上。

w4d2

O

由于我之前总是习惯再daniel做了merge前继续加功能分支,但是由于merge后功能有了变化就很难合并了,所以之后做的功能总是要重做,所以总有浪费时间。

今天下午被一个问题卡住了三个多小时,就是评价系统,一开始打算用gem,结果文档太老,基本没法用,放弃了,后来搜到一个貌似能用的,没有想到,反而卡给我三个多小时。

后台的restful还是很快就能搞清楚,但是前台的js就很恶心了,由于其实js生成的,我总在想办法通过转换css和html的属性去禁用它,结果总是觉得马上就能hack解决了,可就是解决不了

最后的最后到晚上11点才终于发现,是这个项目是有关我的他的原信我拿到了代码已经是很老的版本,那么我,按照现有的文档代码逻辑去敲门也敲不通是正常的。

R

而且我在第一次卡纸时候没有及时的调整思路,这是一个很大的问题,其实当时呢,就已经想的很明白,这条路走不通,会及时地切过去,但是呢,总是觉得,哎呀在马上就解决了,马上有解决结果一拖再拖,拖两个小时都没有解决。

I

这给了我一个很重要的教训,就是,如果一个问题被卡的时间长比较长,应该先尝试换个思路,换一种方法让我去,不应该跟他死磕。不要纠结于已经浪费在上面的时间,这是沉没资本继续纠结,没有任何的好处

学习阶段开始的时候可以思考死磕,但是做项目的时候这就变成很浪费时间的事情,会拖累大家的进度,我们可能面临更多的时候是要及时解决问题。

另外还有一个教训就是找信息,一定要尽可能的去找官方的,而不要去找些乱七八糟渠道管东西,有可能它就会误导你,让你浪费很多的时间。所以说会找东西,有可能更是一门更有用的学问。

关于继续加功能的问题,我应该调整习惯,所有事情在merge后就停了,剩下的时间去搞别的,对项目功能有修改的话要和大家知会,不然大家不知道可能会有代码冲突。

D

今天一方面是推进度,不要再犯资料源的问题,还有就是能用正规途径解决不要抄小路去hack,hack的前提是正常途径搞不定的补救手段,不是一个合理的使用方式。另外加强协作沟通,不要自己私加功能。