<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>fidel (Feifei)</title>
    <link>https://ruby-china.org/fidel</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>分享下澳洲跳槽的经验</title>
      <description>&lt;p&gt;之前发过一个&lt;a href="https://ruby-china.org/topics/39257" title=""&gt;帖子&lt;/a&gt;，写了一点自己学习 rails 的经验，说是要再发一个帖子来分享自己写测试的经验和想法的，一直没发，倒是先发了一个跳槽的经验分享的帖子。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;坐标袋鼠国，工作两年半，本科国内，澳洲读的研，毕业之后进了一家主要业务是做外包的公司。现在跳槽到另外一家公司，mid dev 的职位。&lt;/p&gt;
&lt;h2 id="薪水"&gt;薪水&lt;/h2&gt;
&lt;p&gt;去澳洲读书之前，就听说有学 IT 的毕业之后转行去做装修，做国内的蓝领工作。三年前自己刚毕业的时候，班上有同学去了墨尔本悉尼，也真有人转行去做装修了，聊天的时候，那个哥们的原话是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;来了悉尼墨尔本发现，做装修，做得好，两三年就能年薪十万澳币，做 IT 做得好要五年，做得不好可能要十年了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;最近自己跳槽，发现澳洲做 IT 也是可以两三年年薪十万澳币的，我拿到的是九万多，还不到十万，不过我朋友说我没有去谈工资，我当时是新公司问我多少多少钱行不行，我就直接同意了。并且澳洲还有很多做得比我好的人，我看墨尔本那边有 IT 群，graduate dev 的职位直接拿到十二三万年薪的也有 (Amazon 和 Canva)&lt;/p&gt;
&lt;h2 id="过程"&gt;过程&lt;/h2&gt;
&lt;p&gt;最近这次跳槽成功，投了大概有三家吧，都是在 Seek 上直接投的，一个是中介，还有两家是公司直招。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;中介给我介绍了两家公司面试，一家可能是因为疫情原因，流程很慢。一家面试直接挂了（因为没做准备，问的一些面试的 general question 就答的不好，直接被拒了）。&lt;/li&gt;
&lt;li&gt;一家公司因为我之前没有 remote 经验把我拒了。&lt;/li&gt;
&lt;li&gt;最后这家公司面了三轮还加上一个 coding challenge。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术面问的问题"&gt;技术面问的问题&lt;/h2&gt;
&lt;p&gt;其实也没有准备，基本上都是平时看到过的，依稀记得一点，投简历都没有报太大希望来着的，佛系投简历。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby Design Pattern（Factory，Singleton）其实 Singleton 我也答的不好，就说了一个大概。&lt;/li&gt;
&lt;li&gt;抢票场景并发情况处理&lt;/li&gt;
&lt;li&gt;Rails 的 session&lt;/li&gt;
&lt;li&gt;lambda 和 proc&lt;/li&gt;
&lt;li&gt;最喜欢的 ruby 的方法/特性&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Coding Challenge"&gt;Coding Challenge&lt;/h2&gt;
&lt;p&gt;这个 coding challenge 就是写一个 rails 程序，给 24 个小时（给你发邮件之后，需要在 24 小时之内回复），要求是做一个 Good 的管理平台，有进货出货的记录，可以 csv 批量导入，有一个管理员登陆功能，不能用 devise gem，用不用前端框架都可以。我做的放在&lt;a href="https://github.com/fidel-hsiung/ibsa" rel="nofollow" target="_blank" title=""&gt;Github&lt;/a&gt;上面了，没有什么特殊的地方，就是中规中矩的写法。&lt;/p&gt;

&lt;p&gt;现在也开始在新公司上班了，由于疫情关系，还需要继续 work from home 一段时间，希望接下来能把测试的分享的帖子发出来。也希望有大佬们来分享下自己跳槽升职加薪的经验。&lt;/p&gt;</description>
      <author>fidel</author>
      <pubDate>Mon, 29 Jun 2020 20:59:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/40044</link>
      <guid>https://ruby-china.org/topics/40044</guid>
    </item>
    <item>
      <title>分享一点自己的 Rails 学习开发经历经验</title>
      <description>&lt;p&gt;接触 rails 有两年了，有大项目的开发经验，也有自己负责小项目前端 + 后端 + 服务器部署的经验。&lt;/p&gt;

&lt;p&gt;用的框架是 RoR, React.js(比较推荐), Stimulus.js(特别安利), Foundation, Bootstrap。&lt;/p&gt;

&lt;p&gt;看过的 ruby 方面的书有：&lt;em&gt;Ruby on Rails 教程&lt;/em&gt;，&lt;em&gt;面向对象设计实践指南 :Ruby 语言描述&lt;/em&gt;，&lt;em&gt;Ruby 元编程&lt;/em&gt;。&lt;/p&gt;

&lt;p&gt;最开始是看官方文档 + &lt;em&gt;Ruby on Rails 教程&lt;/em&gt;( &lt;a href="https://ruby-china.org/topics/39192" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/39192&lt;/a&gt; )，几天后开始在公司内部项目做一些小改动，一个月后开始半学半做的接手一个新项目。两年的外包工作下来，感觉 rails 蛮多是一个熟练的过程，上手还是比较快的。多做项目，做真正的项目能极快的上手 RoR。&lt;/p&gt;

&lt;p&gt;想分享给大家的是上手到现在这 2 年过程中的一些个人经验和个人看法。&lt;/p&gt;
&lt;h3 id="Controller"&gt;Controller&lt;/h3&gt;
&lt;p&gt;Controller 想分享的一个是避免 N+1，另一个是把复杂逻辑集成到 service 中。&lt;/p&gt;

&lt;p&gt;N+1，我看到过在一些比较大的项目，一个 API 调用或者一次页面刷新，数据库的访问几十几百次，ActiveRecord 的 load 时间需要几百 ms，如果解决了 N+1 的 wen ti，这个时间至少能缩短 1/10。我一般是在 controller 中使用 rails 的 incluces 方法 preload 所需要的 associations 来避免 N+1。这里推荐一个 gem bullet( &lt;a href="https://github.com/flyerhzm/bullet" rel="nofollow" target="_blank"&gt;https://github.com/flyerhzm/bullet&lt;/a&gt; )，可以在 console，浏览器 console 等各种地方给出提示警告和解决方案，特别好用。&lt;/p&gt;

&lt;p&gt;把复杂逻辑集成到 service 中，对以后代码维护修改都特别好，代码可读性高，写单元测试也比较好写。一个 controller 的 method 只做一件事情（视具体情况），尽量遵循单一功能原则。我看有蛮多人写的 controller 的 method 根据传的参数不同，会有不同的功能表现；有的还把 update 和 create 的功能混在一个 method 里面。还有就是尽量把 model 的处理放到对应的 controller，不要把一个 model 的一些 CRUD 放到别的 model 对应的 controller 中进行处理。我看到过有的人把 model 的 CURD 方法放到了这个 model 的 associations 的 model 的 controller 中。对代码的阅读，功能扩展修改都造成了很大的困扰。&lt;/p&gt;
&lt;h3 id="Test"&gt;Test&lt;/h3&gt;
&lt;p&gt;测试方面的话我用的是 Rspec，然后用 simpleCov 来看测试覆盖率（一般尽量达到 controller, model, service, concern, helper 的 100% 覆盖，高测试覆盖率是你以后功能扩展修改的强力后盾），之后我可能会再写一个帖子来谈谈编写自动化测试的经验和分享一些想法。&lt;/p&gt;
&lt;h3 id="Gem"&gt;Gem&lt;/h3&gt;
&lt;p&gt;推荐一些我觉得好用的 gem：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gem 'bullet', 避免 N+1 用的&lt;/li&gt;
&lt;li&gt;gem 'pry', 很好用的一个开发以及测试工具，在代码中一句&lt;code&gt;binding.pry&lt;/code&gt;就可以在 console 中进行调试&lt;/li&gt;
&lt;li&gt;gem 'factory_bot_rails'，用来自动化创建测试所需数据&lt;/li&gt;
&lt;li&gt;gem 'faker'，用来构造数据的&lt;/li&gt;
&lt;li&gt;gem 'rspec-rails', rails 的测试框架&lt;/li&gt;
&lt;li&gt;gem 'rails-controller-testing'，让你可以在 controller 测试中使用&lt;code&gt;assigns&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;gem 'simplecov', 用来检查测试覆盖率的&lt;/li&gt;
&lt;li&gt;gem 'database_cleaner'，配置好之后，可以在测试中使用 before(:all) 来缩短创建 activerecord 所需时间，缩短测试所需时间&lt;/li&gt;
&lt;li&gt;gem 'whenever', 用来管理 conjob 的&lt;/li&gt;
&lt;li&gt;gem 'exception_notification'，用来发送报错邮件的&lt;/li&gt;
&lt;li&gt;gem 'parallel_tests'，并行测试用的&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;都是一些很粗浅的见解，希望对想要接触或者刚接触 rails 的人能有点帮助，也欢迎大佬们指正。&lt;/p&gt;</description>
      <author>fidel</author>
      <pubDate>Mon, 18 Nov 2019 13:52:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/39257</link>
      <guid>https://ruby-china.org/topics/39257</guid>
    </item>
    <item>
      <title>如何判断什么时候用 Aggregate 方法 什么时候应该新建一个 column？</title>
      <description>&lt;p&gt;各位大佬，问个新手问题，什么时候用 Aggregate 方法，什么时候应该新建一个 column?&lt;/p&gt;

&lt;p&gt;比如说，我有一个 exercises 的表和对应的 model: Exercise，然后有一个 user_activity_exercises 的表和对应的 model: UserActivityExercise.&lt;/p&gt;

&lt;p&gt;user_activity_exercises 有一个 reps 的 column 用来记录每次用户做了多少个 rep。&lt;/p&gt;

&lt;p&gt;如果在 ExercisesController 的 index 的 view 的表格里面需要用到 exercise 对应的 user_activity_exercises 的总数，以及 reps 的总数。
为了避免 N+1 和方便排序可以用 aggregate 的方法，
&lt;a href="/exercises" class="user-mention" title="@exercises"&gt;&lt;i&gt;@&lt;/i&gt;exercises&lt;/a&gt; = Exercise.left_joins(:user_activity_exercises).select('exercises.*, COUNT(user_activity_exercises.id) as workouts_count, SUM(user_activity_exercises.reps_count) as reps_count').group("exercises.id").distinct&lt;/p&gt;

&lt;p&gt;我知道 rails 有一个 counter cache 的方法可以用来统计 exercise 对应的 user_activity_exercises 的数量，排序也很方便，有对应的 column，但是好像 reps 的总数只能用 aggregate 的方法来算了。&lt;/p&gt;

&lt;p&gt;我想问的是，需要在 exercises 的表创建新的 column 来存放 reps 的总数吗？怎么来做这个取舍？感觉加一个新的 column，然后再给 user_activity_exercise 加上对应的 after_commit 的 callback 方法去更新 exercise 对应的 column 的值就可以避免使用 aggregate 方法了？&lt;/p&gt;</description>
      <author>fidel</author>
      <pubDate>Fri, 01 Nov 2019 15:28:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/39206</link>
      <guid>https://ruby-china.org/topics/39206</guid>
    </item>
  </channel>
</rss>
