2017年5月28日 星期日

Published 凌晨4:02 by with 0 comment

[PM系列 - 我做產品的日子] 專案經理的日常

- 專案經理的日常 -

好像掛個經理就很厲害

Hi, 我是史蒂芬, 
與接案公司配合, 是一個Freelance的專案經理.

主要的工作圍繞在:
- 與客戶洽談需求
- 與工程師講解需求
- 請工程師喝飲料
- 測試產品
- 跟客戶催款
- .......等等

以下我們分階段來說~

*接洽*


通常都是收到朋友的 一則訊息或是一通電話,
對方表示:有朋友有網站或是app的需求想要聊一下,
這時只會大概知道產品的輪廓跟產業.
通常會加一個群組來聊, 但是用打字來講解需求,會是一件很沒有效率的事情
往往都會約一個電話會議 or 見面聊.

=> 通常都是透過FB or Line 來做第一步的認識, 此時我會大概看一下對方的FB, 來推測他想做的產品跟他目前握有的資源是否相符合. 也可以在會議前有多一些瞭解


*需求訪談*


無論是透過電話會議或是面對面開會,
最重要的有三個重點:

1. 功能  2. 交期  3. 預算

瞭解客戶需要的功能, 才能夠規劃成tickets 給工程師估時,
知道交期, 才可以推估說需要幾個工程師一起進行,
最後由以上資訊,推估出此次產品的預算


*開案*


簽約後, 緊接而來就要開工了
透過 wireframe & userstory 來定義畫面跟功能

此時會有三個角色:
1. (業主)提供想法
2. (PM)確認需求, 文件化
3. (設計師)出圖

此時還不會有工程師的角色進來,
主要考量在於 畫面尚未定版的時候, 需求可能會修改
不論是前端工程師 or 後端工程師, 此時都可以會做白工
故不建議偷跑


*與工程師 & 規則*


當畫面以及需求都定義清楚了, 此時也大約有兩週的tickets的量
(兩週的tickets量, 需要知道工程師每週可以提供得時數, 以及他的預估時數來判斷)
就可以請工程師開工拉~
在開始討論之前, 要定義每週開會時間, 每週release時間,
之後就要開始解說本週的規劃


*與工程師溝通的Tickets*


撰寫 Tickets 有幾個大方向:
1. 單條時數不超過 8hr
2. 不同條tickets 時數可以合併報
3. 有畫面一定要附上畫面連結
4. 有檔案一定要附上檔案連結
5. 工程師可以提出修改tickets
6. 工程師可以留言

Tickets 主要是的用意在於溝通
每次我一定會帶工程師一起run過一遍tickets.
因為我的規劃可能會有缺失, 或是我的敘述工程師可能會看不懂
此時透過視訊會議, 來講解, 減少認知上的差異


*每週測試*


與工程師訂定的release 時間通常會早於與業主開會前兩天,
收到當天進行測試, 並且記錄哪邊需要修改
隔天與工程師開會, 如果不多, 請工程師解完之後rlease一版 fix 本週的進度
如果太多, 需要討論是否延到下週再relase 或是 過兩天解完release


*業主開會*


核對上週進度, 確認下週進度
這時候通常業主會新增一些需求, 視情況來調整進度
(但在需求新增的時候, 業主對於結案日,是不會改變的, 所以當下要告知, 這樣新增可能會影響到日後的結案日)


*結案*


依照合約的不同, 對於結案的定義也不同, 
如果是時數約,可能就沒有所謂的結案,因為就一直修改,但是每週tickets 量會下降很多, 
對於專案約, 我通常都是用兩次修改的表來規範結案,

順序是:
業主測試 > 討論內容(表1) > 工程師調整 > 業主測試 > 討論內容(表2) >工程師調整 >結案 

但這邊會遇到的問題可能是, 有些要調整的地方可能是架構上的問題,或是難以處理的Bug
這些都是要在結案前, 跟業主提醒的事情


~恭喜你, 完成了一個專案~


在接案蠻常遇到的事, 請神容易送神難, 很多時候接下一個案子到最後因為雙方的認知不同,往往鬧得不愉快, 業主可能會認為做得還不夠, 但PM會覺得客戶的任何需求都在凹, 此時都會是在於雙方有疑慮時, 要透過溝通來化解.

溝通是專案經理必修的課程

後續會針對個階段會有更詳細的分享啦~
敬請期待~
Read More
      edit
Published 凌晨1:58 by with 0 comment

[PM系列 - 我做產品的日子] 序

- 前言 -

Hi 我是 史蒂芬,
出社會工作以來都一直在摸索,
曾經做過 製程工程師, 機車零件開發, 貿易公司採購,
一直到去年二月(2016) 參加AlphaCamp,
畢業後就投入 專案經理 的職務,
很多人問我專案經理在做什麼?
於是乎就萌生寫這一系列文章的念頭.

目前規劃了六篇:
- 跟客戶聊天,到底要聊什麼? 沒有標準的需求訪談
- 透過客戶需求要如何規劃產品?
- 訂定規則&與工程師溝通
- 開發中一定會遇到的"意外"
- 關於測試&驗收

專案經理沒有一定的標準,
希望這幾篇可以讓你們有收穫.

這邊也要感謝 AlphaCamp, Fable, 還有一起接案的工程師們.

回AlphaCamp分享接案經驗

Read More
      edit

2017年2月22日 星期三

Published 凌晨12:57 by with 1 comment

「預告」 一年多前的今天, 我加入了ALPHACamp, 一年後的現在, 我到底在幹嘛呢?

一年很長, 可以做很多事情
一年很短, 也些事情也無法完成

本篇將會記載從ALPHACamp畢業之後到現在的轉變,
當然也是要等我有時間再寫,
就這樣,
讓我們一起期待完成的那天。


Read More
      edit

2016年6月23日 星期四

Published 晚上10:42 by with 0 comment

Ruby & Rails Coding Style



對於團隊來說,相同的 Coding Style 可以增加工作效率, 也可以減少髒code的產生.

以下是整理網路上的訊息 (筆者最近才開始研究)

1.  Ruby & Rails 風格指南

2. Ruby Coding Style Guides

3. 如何在Rails專案中使用Rubocop統一程式風格?  ( gem rubocop )

    => 原文作者有熱心提供設定檔, 可惜的是因為 rubocop有改版, 所以很多需要rename.

    => Gem Rubocop

    => 安裝步驟 1. /gemfile 新增 gem 'rubocop', '~> 0.40.0', require: false
                           2. 執行 bundle
                           3. 在該資料夾跟目錄底下新增 .rubocop.yml (注意rubocop前方有一點)
                               (位置會在 , 你的app名稱/ 底下直接新增)
                           4. 撰寫  .rubocop.yml
                           5. 執行 rubocop
                         
                           備註:可以跳過 3. & 4. ,直接執行5. ... 但你會發現你想先設定一下

4. 簡易教學 rubocop 

5. 業界案例 : T客邦



後續再補詳細的介紹
Read More
      edit

2016年6月15日 星期三

Published 上午10:50 by with 0 comment

Ruby on Rails - Devise 設定忘記密碼Email

Rails 本身就透過 Action Mailer 支援 E-mail.

這篇主要是在講解 如何設定 Devise 寄送忘記密碼的信件

本篇來源:

1. Rails Guides

2. ihower Ruby on Rails 實戰聖經

3. How To: Mass password reset and email notification

前情提要:

已經安裝過 gem devise
尚未設定 actionmailer



Step 1.

在/config/environments/production.rb


config.action_mailer.raise_delivery_errors = false 改成 true

Step 2.

在Step 那行code的下方新增:


config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options = { host: "http://localhost:3000"} #你的網址,絕對網址 
config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => "587",
    :domain => "gmail.com",
    :authentication => "plain",
    :user_name => "example@gmail.com", #你的信箱
    :password => "123456", #信箱密碼
    :enable_starttls_auto => true
 }

這邊的範例使用 gmail 來設定

Step 3.

正如同上面所看到的會需要輸入使用的信箱跟密碼, 所以需要把這些資訊藏起來

所以我們會新增 email.yml 放在 congig/ 底下


production:
  address: "smtp.mailgun.org"
  port: 587"
  domain: "gmail.com"
  authentication: "plain"
  user_name: "example@gmail.com", #你的信箱
  password: "123456", #信箱密碼 
  enable_starttls_auto: true 

完成後我們要到 .gitignore 新增


/config/email.yml
回到原本的地方寫成


config.action_mailer.smtp_settings = config_for(:email).symbolize_keys
最後我們在/config/environments/production.rb


  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { host: "http://localhost:3000"}
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = config_for(:email).symbolize_keys
設定完environments之後

要開始建立一個 mailer 寄信程式

Step 4.

輸入:

rails generate mailer UserMailer
這會在 app/mailers/ 新增 user_mailer.rb

架構類似 controllers內的檔案

class UserMailer < ActionMailer::Base
    default :from => "http://localhost:3000" #你的網址
end
之後我們新增

def password_reset(user, token) 
    @resource = user 
    @token = token 
    mail(:to => user.email, 
         :subject => 'Password Reset Notification') 
end
到 user_mailer.rb 內

Step 5.

還有到 lib/tasks/ 新增 devise.rake 內容:

namespace :device do
  desc "Mass password reset and send email instructions"
  task mass_password_reset: :environment do
    model = ENV['MODEL'] || 'User'
    begin
      model_mailer = "#{model}Mailer".constantize
      model = model.constantize

      model.where(id: 1).each do |record|
        raw, enc = Devise.token_generator.generate(model, :reset_password_token)

          record.reset_password_token = enc
          record.reset_password_sent_at = Time.now.utc
          record.save

        # Send change notification (Ensure you have created #{model}Mailer e.g. UserMailer)
        model_mailer.password_reset(record, raw).deliver_now
      end
    rescue Exception => e
      puts "Error: #{e.message}"
    end
  end
end
Step 6.

到config/initializers/devise.rb 修改

config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' 
=> '12345@gamil.com' #你的信箱
到config/locales/devise.en.yml 修改

reset_password_instructions: 
 subject: "Reset password instructions"=>"信的主旨"
Step 7.

目前完成 production的功能, 但是在開發時也想要做測試 (development )

我們會安裝 letter_opener

到gemfile 目錄底下新增


gem "letter_opener", :group => :development
在/config/environments/development.rb 修改成

config.action_mailer.delivery_method = :letter_opener
 config.action_mailer.default_url_options = { :host => 'localhost:3000' }
這樣在開發模式底下就會另開新頁 顯示信的內容.

Step 8.

完成!!!










Read More
      edit
Published 上午9:32 by with 0 comment

ALPHAcamp Demo Day, 今天是我的主場! - 我是AC Bootcamp web #8 這不是最後一天 , 是起點

(-Demo Day 活動現場-) 史蒂芬: 這是我最愛的功能. 史蒂芬講完這句話之後, 這三個月來的壓力一瞬間煙消雲散. 還記得二月底跟前公司離職, 一週之後踏入南京東路二段97號五樓. 之後的每天過著這輩子最用功的一段時間, 也認識了一群一輩子的朋友. 你畢業之後要做什麼? 這問題早在六年多前被問過. 殊不知...六年後的今天也可以再被問到. 會慌嗎? 那當然, 因為未來會怎樣你也不知道. 但慌的點是不知道自己是否準備好了. 所以呢? 你幹嘛來? 你的目的又是什麼? ...還記得嗎? 三個月前的面試, Tim Du 最後說了一句話: 看來你自己很清楚自己要幹嘛.. 謝謝這陣子願意跟我討論的所有人, 你/妳們提醒了我,自己當初的承諾 不要往簡單的路走. 如果要走, 為什麼我要來這? 但要如何定義簡單? 這答案沒有一定, 但是走了不要後悔 謝謝 ALPHA Camp 帶給我們這麼好的師資, 課程規劃, 還有環境. 謝謝 Bernard 在去年跟我說: 如果你真的有想做的idea, 那就自己動手做吧! 謝謝 Hugo 盧毅 卓均 這三個月有你/妳們一起唸書, 真的很開心,我愛你/妳們! 謝謝 張文鈿 謝昇佑 Taker Li-Yi 翁麒皓 教會我Rails & 解了無數個Bug 謝謝 PiHan 林思妤 Damon 林士庭 Stephanie 方心妤, 很珍惜與你們一起創造我的記分板! 謝謝同屆的所有同學, 還有在AC的所有同仁~ 這段時間有你們的陪伴,過得很充實! 當然謝謝的最後是家人 李秀英 Li Hung Chen 我爸, 謝謝你們的支持!



  • 靠左
  • 置中
  • 靠右
移除
本魯第一次揪了50+人吃熱炒....


Read More
      edit

2016年4月24日 星期日

Published 凌晨3:25 by with 0 comment

Rails 抓取 Facebook 大頭照解析度 - 我在ALPHACamp 63天


大頭照預設大小有四種

http://graph.facebook.com/id/picture?type=small
http://graph.facebook.com/id/picture?type=square
http://graph.facebook.com/id/picture?type=large
http://graph.facebook.com/id/picture?type=normal

預設都是抓取 square, 但是不論放在手機或是網頁上~ 根本就是8bit時代的產物

所以在抓取檔案時要指定large (200x200)



手機API部分 :

app/model/user.rb,在picture加上 .type(large)

res = RestClient.get "https://graph.facebook.com/v2.4/me",  { :params => { :fields => "email,name,gender,picture.type(large)", :access_token => access_token } }
OmniAuth 部分:

config/initializers/devise.rb 之中 加上 :image_size => 'large'

config.omniauth :facebook, fb_config["facebook"]["app_id"], fb_config["facebook"]["secret"], :scope => 'public_profile,email', :info_fields => 'name,gender,email', :image_size => 'large'
對! 這樣就結束了...
Read More
      edit