全栈营心得

入坑

可能和很多人不一样,我听说『全栈营』完全是个偶然,某天下午,我的好朋友突然丢给我一个链接过来,安利了一下午怂恿我参加。

然而我并不以为然,一方面对我来讲,我不是零编程基础,而且已经可以写出来一些能用的东西也不认为2个月的时间教学能让我长进多少;另一方面,这个价格也太贵了,居然要6万块,远超我接触过的常规培训价格,对我来讲总的机会成本也至少要12万;再有我也不是李笑来的粉丝,而且国内ROR当前也不是很大众的开发语言。而唯一可能相对比较适合的地方只在于——我在北京,我用mac。。

所以,作为一个理智的保守主义青年,显然不会做这么划不来的买卖,于是我果断的告诉他,这个对我来讲太贵了,而且也未必划算,最主要的是,我没有办法一次拿出这么多现金。然而没想到,他居然要半年期无息贷款给我让我参加,让我基本无从拒绝。

于是我重新考虑这个问题,首先我确实一直在自我转型方面走的十分辛苦,而且自学编程遇到了很多瓶颈,不知道正确的道路是什么,还一直十分头痛自己的软件项目不断失败这件事,而这个课程据说似乎能专门能解决这样的事情,并且看到上期学员的节课作业,诧异于2个月就能把0基础的人带到做产品达到这种程度,所以很有可能是我在方向上面出了问题,从这个课程的宣传上页上看到了关于这件事的可能存在解药。

我最终决定赌一把,转型的压力让我当前确实没有什么更好的选择,看是否真的能解决我当前的问题,一点是我的朋友从没坑我,另一点是,直觉告诉我这个课程我应该参加,甚至是期望在30岁前逼自己一下。

改变

老实说课前作业我做的十分马虎,很多时候只是尝试性的复制粘贴而已,很多东西凭借自己的经验,就没有深入的练习,正式上课后才发现原来课前的练习居然这么重要。

头几天的课程我是极其不适应的,大概是没有好好练习初级作业的原因,很多初级问题自己并没有搞定,导致很多作业在开始做的时候蛮吃力,语法层面花了不少功夫,然而却发现很多零基础的人居然比我这个IT出身的人还明白怎么搞,于是摸索着前进;而且我花了6w诶,老师居然每天只是讲了几个小时,剩下的时间全都让我们联系而已,难道不应该是每天课程排满吗,应该尽可能的输出所有东西,才够本。所以我还不能确信xdite的教学方法到底是否有效,因为这和我接受和实践的计算机教育模式完全不一样。

长久以来,我一直把计算机知识当成一个专项领域来探索,惊叹于它的发展历史,乐于研究各个细节,探讨它的应用前景,而且我是按照十分传统的,编程语言、数据结构、算法、设计模式、软硬件架构的方式进行了解的,一直以为自己很科学的在学这个领域的知识,所以我坚信自己在基础知识积淀足够多的情况下不断尝试,未来一段时间就能成功实现转型入行。

然而现实却十分打脸,我花了很多精力来学习编程,但是却因为找不到靠谱人带,自己摸索却又不甚得法,或者是因为自己自学能力不够强的原因,在这条路上到处碰壁,由于公司内部这块完全没人明白,所以做开发基本上是极其粗放的,尤其不知道如何进行项目管理,到处钻坑,屡次失败。我相信这个长久来看是经验活,但是这样积累经验不知道何时是头,我都怀疑自己究竟是否能有机会未来一段时间内转型成功。而我看到很多开发者,开始阶段完全对计算机领域专项知识一无所知,却转眼间成为了能优秀胜任的程序员,令我十分惊诧他们到底是如何做到的,是不是自己哪里搞错了。

终于,这次从xdite这里找到了端倪,原来互联网发展到了今天,随着产业变革,量变带来了质变。编程这个原来十分独立的『学科知识』,已经变成了一个人人都可以通过训练掌握的『普通技能』了。所以,编程这件事情就不应该靠『学』的,而是该靠『练』的。所以编程这件事情使用『学』的方法根本就是没什么效果的,只有『练』才有意义,练到基本的东西完全不用想就能敲出来的程度才能算入门,计算机编程的学习需要的不是听老师在讲台上讲知识,而是需要由大牛带着做项目指导训练。

所以实际的情况是,xdite平时授课就一小会儿,然后剩下的时间大家就练成狗,不懂的互相问或求助助教。然而在这种高强度不断训练过程,不仅让我很快适应了rails框架和ruby语法,而且很快编码效率就超过了自己学了很久python,效果卓著。

最令我惊奇的是,比我起步晚很多,甚至很多零基础的同学们在这种不断练习的过程中,却也在完全没有学习『变量』『函数』『条件』『循环』『算法』『数据结构』的前提下,也能进步神速,全程跟下来,也能独立做站点!!这实在有点震撼我的三观,原来现代的编程语言与软件框架竟然已经自动化到了可以再完全没有基础知识的铺垫下就能work的地步,实在惊人,这和市面上80%以上的计算机教材教学理念方针完全是反着的,却能高效到这种地步!!

几天后,因为有一定基础终于进入了状态,学到的东西全都能搞明白了,而且越做越快,反复的练习之前的东西,努力把小套路练熟,来避免做中套路时候不会被小套路绊倒。

做项目!做项目!

而第四周开始做项目后,我来之前的很多疑虑都解开了,有种『Fuck!原来软件项目原来是这么搞才行啊!』的感觉,原来我原先简单理解的敏捷模式和现实中的真正有效的敏捷团队开发居然还有这么大的差距,幸亏来了这里,否则在我现在这条道理上跑,不论再努力多少年也未必能真正入门。

切票-开票-做票-关票-review,一群新手很快就在很好的团队配合下把项目run了起来,很快形成了自己的节奏。就是这样简单的就把一个大项目,拆成不同的功能,再拆成了不同的小问题,然后剩下的事情就是不断的解决这些小问题就好了,而且不断做这种小循环一个一个把问题解决掉,然后每天一个可用的版本更新,做这种事带来的成就感真的会让人上瘾,现在我都已经忍不住想尝试把这一套用在以后想做的各项目的开发上了。

领悟

xdite让我尤其佩服的地方在于其知识结构归纳的功力上,在我的眼中她基本上把DRY这件事情做到了极致,不仅仅是编程,而是各领域知识都做了大量的封装,沉淀了相当多的套路,基本上成为了『套路王』,而这些套路是需要花正常人大量时间成本不短试错才能得到的宝贵经验,尤其是grouthhack方面,做项目,营销,运营等各方面都形成了大量的知识套路,而这些东西我们能拿到多少,全取决于我们从她哪里能挖到多少,到目前为止,我觉得我已经赚到了几个亿的感觉~~

同时这批的同学们也是独一无二的,不同于往期都是学生党,这次学员都从各个行业而来,都各身怀绝技那种,而且就像李笑来说的『肯为知识和自我提升付大量付费,本身就已经强过大多数人了』,于是课下来自各领域的人就扎堆分享各领域知识,相互交流,谈论想法,碰撞火花,这是在自己习惯的生活环境中抓不到的机会,着实增长见识。

总结

总结下来,这次全栈营对我的最大影响大致如下:

  1. 对于一个不安于现状的人来讲,比钱重要的是时间,比时间还重要的是机会,如果没有好朋友的推荐怂恿,没赶上合适的时间窗口,我是不可能有机会获得这样巨大的成长的,有可能以后的很多年内都要花大量的成本去试错,无缘前进到这一步。
  2. 不要做NPC,我当年经过艰苦卓绝的努力战胜亿万同胞来到这个世界上不是冲着做别人的NPC来的,一定要做时代的主角!!
  3. 学东西一定要跟着高手练习,自己琢磨一辈子也未必能趟出坑,高手经验与套路是无价之宝,随便捡到用到都能为自己省大量试错时间和精力。
  4. 觉得有价值的东西要分享出来,这样才有机会找到自己的问题,继续进步,同时能构建自己的商业价值。
  5. 进步不是和别人比,进步不是不断超越别人,而是不断超越自己,在一个温水中自我麻痹是蠢货行为。

我想目前来看,这次全栈营有可能会对我未来的人生发展带来巨大的积极影响,但到底是什么呢,我还不知道,但我很期待!

w6-overview

不知道是不是必然的事,在上线之后,功能开发变得十分琐碎,这周基本上一个feature都不敢加,很多环节的fix其实都仅仅只是一两行代码而已,最终看这个项目,我们到底都做了些什么呢,其实并不多:

  1. 建立了一个用户与律师一对一沟通的工具
  2. 制定了一个一来一去的沟通规则
  3. 为律师建立一个信用评价体系
  4. 把站点做的稍微好看和易用一点
  5. 上线运营

相比原先初始阶段做userstory的时候要缩水太多,但似乎我们目前也只能在短期内做到这些事情,比自己预期期望略低一点。

收获

这周从xdite身上学到了一些很不错的新套路,比如前后端加速、seo,求职等,还领悟到了技术博客撰写的重要性。

我原先总以为自己写的东西价值太浅,可能没有人看,就算有人看说的不对还会被人打脸;而得到的真正有价值的东西又舍不得共享出来,觉得被别人学会自己就不值钱了。

现在看来这件事情是我看的太浅了,原来分享自己的知识,一方面是对自己知识的定期总结,是沉淀套路的过程,别人的打脸是其实对自己知识的思辨和查缺补漏,是一件很有助于自己提高的事。另一方面这也是建立自己品牌与信用的方式,证明自己价值的一个很好的方案。

心得

上这门课之前虽然做的小东西不少,但没有一个可以达到产品标准。
这次终于在xdite的训练下参与做出了第一个可用的商业级软件产品,解决了太多自己开发时候纠结的不行的乱七八糟的经验,很有成就感,我期望以后能够在各种各样的项目中复制xdite的模式,继续训练自己全栈开发能力,把写程序变成一个基础技能。

w6d4

O

周五的发布很成功,可见的是基本上这个产品已经是个成型可用的东西了,邀请了老桂进行内测,回应很中肯,剩下的时间不过是各种微调而已就够了。

下午xdite又教给了我们很多极其棒的套路,真不愧是套路王,极其有价值

R

自古真情留不住,唯有套路得人心。

我发现『总结套路』和『做轮子』其实感觉是一样的,都是在想尽办法把常用的东西模式化,打包成为开箱即用的kit,这样再遇到类似的事情就能很快的处理,降低自己思考的复杂度,可以跳出琐碎的细节,集中留下更多的精力,做高阶的思考,这大概就是『经验』的力量吧,优秀的教练和不优秀的教练大概差距就在于此罢。果然跟着名师混就是能省很多事。

I

经验很重要,如果发现同一件事情会反复做好几次,就要想办法找轮子找经验,如果找不到就要自己做轮子或者总结,只有这样才能让自己有机会思考更高阶的事情,做到别人做不到的事。

D

周五晚上海底捞,通宵的三国杀,第二天早晨才上地铁回去,果然还是太耗精力了,不想通宵一次至少要2~3天才能恢复回来,周日干活开始整理笔记,要记得梳理以下东西:

  1. 技术blog
  2. xdite这周的讲义笔记

w6d3

O

今天依旧是大量的patch,发现服务器上时间排序和本地开发环境时间排序不一样,最后找到大概是数据库不同的原因,最后使用强制的按日期排序搞定了。

下午在商量商业策略的时候,暂时定为第一个问题免费,其他的必须成为会员才能无限使用,本来以为会很费劲才能做到,结果做的时候发现只要两三行做个判断,居然就搞定了。。

晚上高睿搞出来了ios版本,于是顺手找了个网上的工具把页面打包成了一个android版,现在所谓的『全平台』虽然最终效果不算很理想,不过总算是有了罢~~

R

有的时候想事情很复杂,做出来时才发现很简单;有的时候正好反过来,这可能就是对要用到的知识和还不够了解和缺少经验的原因吧,想要大规模的做类似的事情,看来需要积累大量的经验。

想一想,总共这个从零到现在项目搞了4周,照着xdite的流程方法与套路,一步步的从一个需求搞出了成熟能用的看上去有价值产品,感觉很爽,虽然还没有入法律的行,但为了法律事业也算是开始尽了一点微小力量,很有成就感。

I

技能是工具,在胜任后保证不掉队的前提下,成为领域专家,而不要把精力放在变成单项技能顶尖高手,而要把精力放在实现商业与技术的价值本身上,不应该偏离核心。

D

又是周四,明天又要迎接周五的review,完了听说有大餐,晚上还有桌游,项目总算搞定,连续紧绷神经了7周,总算可以放松下了。

w6d2

O

今天知道了什么叫上线运营的感觉,就是大量的fix。
『诶,这里好像不对』『哪里好像很奇怪』『这里点不开』『怎么炸了』
所以今天一整天就是在开大量的小票,fix各种各样的小bug,这个时候已经完全没有精力去尝试做功能了。

另外邮件系统搞定了,之前把邮件系统想复杂了,搞过一轮之后才知道不过只是配置使用smtp发信而已;而异步发邮件一开始还以为要单独去搞个异步实例,没想到rails居然已经自动化到只要加几个字母就能实现。

R

我总算理解了为什么xdite说『不要不停的做大量的微小项目』,亲身体验了才知道,虽然那样看着很屌,但其实意义并不大。

回想下我们这个项目里最终都做了什么呢?从开始到后来最后做做做、砍砍砍,最终基本只留下了一个『针对特定行业,规则化问问题方式』的一个沟通工具,就是为了满足这么一个小小的功能,就需要做大量的配套,『对话』『评价』『提示』『邮件』『用户管理』等大量的功能和前端工作。

其实这样的特定行业应用,做一个就能把所有的都做了,如果都只是做一点的话,很可能容易浅尝辄止,最后都没做成。

xdite谈教育授课,倡导以结果导向的学习,所有靠讲的都是无效教学,只有当场用得到的东西才能学得会。

配合David的神图

I

昨天睡在这儿,和费奔聊天,想明白了一个事情,之前我一直觉得当自己对一些事情理解稍有理解还不透彻的时候,就随便发blog和心得体会,是不负责任的行为,因为觉得自己很多东西也没想透,不值得发表看法,甚至也不一定会有人看,看了还有可能误导别人。

现在我才发现如果想要向前走,这是一个必要的过程,把自己所思所想share出来,一方面是对自己的一个积淀和总结,另一方面也是征集意见的过程,甚至有很多人提反对意见甚至鄙视,这恰恰是给自己查缺补漏的机会,否则会找不到自己的盲点,也无从下手进步。

另一个事情是,我很多时候会在直觉与逻辑间判断,有时候两者得到的结论是相反的,由于本来我是一个相信理性判断的人,但往往是我没有选择的直觉往往胜出。

费奔给我的建议是,这有可能和直觉与逻辑无关,其实是因为视野不够,身边的环境不足以做足够做理性的判断,我应该做的事情是去认识更多的聪明人,提升自己的network。

D

这几天做事情琐碎而杂乱,很多的fix全是一小行,但都往往很关键,基本上不算是『code』,只能算是『配置』而已,大概上线就是这样的一个过程吧。

w6d1

O

昨晚太晚了没回去,加上本身睡的晚,而且今天精神不济,度过了极度忙碌而琐碎的一天。

到了这个阶段,大的功能已经一个都不敢动了,剩下的都是修修补补,结果全是一些极其琐碎的fix,而且很多小fix非常烧脑,昨晚睡太晚起太早,一整天总是昏昏沉沉的,虽然搞定的票很多,甚至比之前都多,但是基本都是在用最后精力死撑。

R

不过这可能是很正常的情况,可能对于任何项目都是如此吧,恐怕要是项目早期就陷入琐碎的话,可能早就崩溃了。

I

初期陷入琐碎是个很大的陷阱,之前自己单干时候就是这样,常常为了一个小feature,在早期就花费了大量的时间和精力对齐优化,然而到了中后期,才意识到大功能都没搞定,而且很多耗费了很大精力搞出来的东西都没有价值,维护成本超高,最后不得不扔掉。

所以,虽然这个阶段比较难受,不过可能这是很正常的情况,xdite教的大快赶上是正确的路子,重构优化至少是赚到钱以后的事情,不要早期陷入这种黑色旋涡。

D

今天早点回,睡个好觉吧,今天基本把所有能fix的fix差不多了,明天先上线再查漏补缺好了。

w6d0

O

今天终于抓到xdite了,一开始只是尽可能压缩积累了一些技术问题而已,没想到运气好到爆,这回捞到了宝,居然捞到了超多比课上还好的宝贝经验,居然讲到了凌晨,大量干货,感觉对个人成长有莫大好处。

R

今天一晚上新东西收获的兴奋得睡不着,赶忙把日记写了,对原来自己的很多想法有了修正。

I

1.01^365=37.78
『成长是数学,不是玄学』,个人进步是绝对是有章可循的,只要打破原来的思维疆界就够了。
尤其是明白了一个重要的道理——不要去做NPC,NPC是成长中的温柔毒药,要想方设法去探索这个世界的边界,职业生涯规划果然是不靠谱的。

D

偶然翻到xdite知乎上有提到okr,明天要问xdite关于okr的使用,预感这会是个大话题。

ror突进-rails中使用Mailgun

首先,先到mailgun.com注册账户,按照其要求填写primary key,和dns互相设置通

如果通知信内容极少非常简单的话,可以不用附到rails中去,只需要官网的ruby客户端即可
https://github.com/mailgun/mailgun-ruby

也可以使用smtp的方式来发

先找到mailgun里的smtp设置

首先把密码等写在yml文件中

production:
   AWS_ACCESS_KEY_ID: ******
   AWS_SECRET_ACCESS_KEY: ******

   # mailgun私钥

   MAILGUN_SMTP_PORT: '587'
   MAILGUN_SMTP_SERVER: smtp.mailgun.org
   MAILGUN_SMTP_LOGIN: postmaster@whenmgone.com
   MAILGUN_SMTP_PASSWORD: *******
   DOMAIN_NAME: 'http://law-firm.herokuapp.com'

development:

   MAILGUN_SMTP_PORT: 587
   MAILGUN_SMTP_SERVER: smtp.mailgun.org
   MAILGUN_SMTP_LOGIN: postmaster@whenmgone.com
   MAILGUN_SMTP_PASSWORD: *******
   DOMAIN_NAME: 'http://localhost:3000'

调整环境设置config/environments/下文件,填写设置引用application.yml中的密码等设置(注意develop和production都要做)

  # 邮件测试

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :port           => ENV['MAILGUN_SMTP_PORT'],
    :address        => ENV['MAILGUN_SMTP_SERVER'],
    :user_name      => ENV['MAILGUN_SMTP_LOGIN'],
    :password       => ENV['MAILGUN_SMTP_PASSWORD'],
    :domain         => 'whenmgone.com', #eg: 'yourappname.herokuapp.com'

    :authentication => :plain,
  }  # 

建立一个新的mailer叫model_mailer

rails g mailer model_mailer

然后在生成的mailer中,写函数 (内部无法调用ENV)

  # 邮件系统-注册密码

  def send_password_mail(user,password)
    reciver_obj = User.find(user)
    @password = password
    mail to: reciver_obj.email, subject: "Lawyer法律咨询平台-注册"
  end
  #

在需要的地方调用发信函数即可,比如welcome_controller.rb

ModelMailer.send_password_mail(user.id,generated_password).deliver

w5-overview

这周的坑就是自己的进步问题,比起其他人大多0基础起步,我已经积累了一些经验,然而在学习的过程中却依然使用原来的『理解轮子』-『尝试轮子』-『用轮子』的慢速循环。

倒不是这种方法不重要,只不过我认为自己不该在全栈班期间使用这样的方法,这套方法应该是课下有大量时间的基础上自己也能用的,即便不参加全栈班也会这样做。

进步依赖的是『在陌生的领域刻意的联系』,参加训练的目的就是身边有『高手指导』,可是我却总是在熟悉的舒适区晃荡,懒得去学自己真心关心的东西,有种买椟还珠的感觉。

课程还有两周时间,看样子我要抓紧找xdite补足我特别关注的东西了,把学费挣回来。

还是有一些基础错误常常犯,排查起来有很恶心又很懊恼,应该建立一个check-list进行排查。

收获

首先,我们这周的协作更流畅了,上周解决了一些小的沟通问题,这周100个优化点做的很顺,我很喜欢这种团队协作的感觉。

人只有犯了错才有可能注意到自己的问题,才会探索新的解决方案,所以上面那个坑对我来讲也是收获了,所以程序开发我发现也许使用可以『理解与积累轮子』->『Hack Coding』的循环来解决前进的问题。

接下来

打算实践一下『理解与积累轮子』->『Hack Coding』的循环,回头先问一下xdite这种套路是否可行。

另外我打算建立一个专用于检查错误和debug的checklist,来解决自己常常犯的低级错误排查问题。

rubyonrails突进-alert提示系统

大致效果,外观上还需要修改

只要点开后,再次刷新这个数字就没了

思路

总体思路是:

  1. 先把后台做出一个提示系统,搞成数组形式,然后加一个字段『unread』区分true还是false;
  2. 再按照购物车模式后台做个获取当前用户的提示列表,并提供一个post接口可以标记已读;
  3. 最后前端使用bootstrap-popover来实现样式。

后端

生成notification的方法太多了,就不说了,只说渲染部分。

后端的controller需要给前端把 @notifications 这个变量提供出来放到application_controller里面去。

  before_action :get_notification

  # 获取提示系统

  def get_notification
    @notifications ||= Notification.where(recipient: current_user).unread
    # @notifications = current_user.notifications.unread

  end

另外需要提供一个ajax接口可以post获得标记已读,notifications_controller中

  # 标记为已读

  def mark_as_read
    @notifications = Notification.where(recipient: current_user).unread
    @notifications.update_all(read_at: Time.zone.now)
    render json: { success: true }
  end

然后路由提供出来

  # f783-站内通知

  resources :notifications do
    collection do
      post :mark_as_read
    end
  end

前端

直接使用 - Popover
http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html

首先需要在bootstrap中引入这个js (依赖Tooltip!)
为了方便和简单,我直接把全站的bootstrapjs都包进来(注意写完这个就不要在引别的bootstrapjs了)

//= require bootstrap

然后在页面上就可以这样写了

        <li id='btn-notification' type="button" class="btn  btn-secondary text-uppercase flat animation pull-right"
                data-container="body" data-toggle="popover" data-placement="bottom"
                data-content="

                <!-- 插入的html触发码 -->
                <% if @notifications.present? %>
                  <% @notifications.each do |n| %>
                    <p><%= n.actor.user_name %>回复了
                      <a href=<%= account_question_path(n.notifiable) %>><%= n.notifiable.content %></a>
                    </p>
                  <% end %>
                <% else %>
                  <p>没有新的消息</p>
                <% end %>

                ">
            <i class="fa fa-bell-o fa-2x" aria-hidden="true">

              <% if @notifications.present? %>
                <kbd>
                <%= @notifications.count %>
                </kbd>
              <% end %>

            </i>
        </li>

然后我把这个data-content允许html格式,并且做一个js可以ajax-post给后台用于标记已读即可

<script>
$(function (){
  // 绑定触发条件

  $("#btn-notification").popover({
            trigger:'click', //触发方式

            html: true, // 为true的话,data-content里就能放html代码了

        });

  // 标记已读

  $('#btn-notification').on('shown.bs.popover', function () {
        $.ajax({
        url: '<%= mark_as_read_notifications_path %>',
        type: 'POST',
        dataType: 'json',
        data: {'read': 'true'},
      })
      .done(function() {
        console.log("success");
      })
      .fail(function() {
        console.log("error");
      })
      .always(function() {
        console.log("complete");
      });
  })
  //



});
</script>