1日1%成長するブログ

毎日成長するために仕事/プライベートで得た学びをアウトプットするブログです

ソフトウェアエンジニアが価値を出すためには毎日どうやって過ごせばよいのか?

f:id:masaru_furuya:20170921201744j:plain

最近仕事をいかに楽しむか?をテーマに色々考えてます。もうかれこれ6年近くエンジニアをしてきているので、ただコードを書くことだけに楽しさを感じられなくなってきたんですよ。

特にフリーランスをやっていると、基本的には手離れの良い作業系の仕事が任されることが多いので自分で仕事を楽しくする工夫を考えるのは必須だと思ってます。

楽しい = 価値を出しているという仮説

価値を出すためには、言われたことだけやってるだけじゃダメなんですよね。それならコードを自動で書いてくれる機械でもあったら、それでいい。

顧客に価値を出すために自分からガツガツ行動しないといけない。 自分で主体的に考えて行動するってこと自体、やりがいがあって楽しいんですよね。

だから結果的に楽しい = 価値を出している状態なんだと思ってます。

そもそも価値って何?

ではそもそも価値って何でしょうか?

自分は価値とは何かの課題を解決することと定義しています。

また価値の種類にはプロフィットコストの二つがあります。 利益を生むものと、時間・費用といったコストを削減するものです。

セールスの新規顧客獲得はプロフィット面の価値、エンジニアの業務効率化ツールの開発はコスト面の価値と言い換えることが出来ます。

価値を出すとは?

価値を出すとは、自分ではなく他人の課題を解決することです。

自分の場合は価値を感じると表現しますよね? それは人やサービスに価値を出してもらった結果というわけです。

なので、価値を出すには相手の課題解決がありきだという前提があります。

ここが理解できておらず、自分は何でこんなに頑張っているのに評価が低いんだ…と嘆いている人は他人の課題をどれだけ解決して価値を出しているのかを省みた方がいいです。

まあ自分も人のこと偉そうに言えないから、この記事を書いて自念しているのですが笑

価値の総量を意識する

価値の総量 = 頻度 ✖️ 大きさ

その人が出している価値には総量があって積み重なっていくものだと思います。 言い換えると信頼残高と言えるかもしれません。

例えば新入社員やインターンが雑務を任されるのは、この頻度を増やすためです。

新人がいきなり大きな価値を生むことは出来ないので、いろんな人の小さな課題解決を積み重ねていくことで価値の総量を増やしていくというわけです。

価値の頻度を高めるには?

ここがエンジニアにとって重要だと思ってます。何故ならエンジニアの仕事はすぐに価値を出せる性質のものじゃないからです。

開発に1か月、成果測定に1か月…と結果が出るまで数ヶ月かかることも珍しくありません。なので、日頃の細かいことで価値を出していくのが大事なのだと思います。

例えば、

  • 開発スピードを上げて、1日に何個も重要なタスクのプルリクエストを出す

  • ミーティングでは事前に内容を把握し着地点を考えておきそのためのファシリテーションを行う

  • 開発メンバーで困っている人がいたら積極的にフォローする

  • 職場の近くの美味しいお店をサーチしてメンバーに共有する

  • 飲み会を企画して他チームとのコミュニケーションの場を作る

  • 他チームに課題ヒアリングしてすぐに解決できることは対応する

とかetc

開発に限らず、複数アイデアは考えられると思います。 自分は現在進行形でここは課題に感じている所なので、改善していこうと思っています。

価値の大きさを高めるには?

価値の大きさを高めることは以下の2つの方向性に分類できると思っています。

  1. 自分で仕事の価値の大きさを高める

  2. 価値の頻度を高め、価値が大きい仕事を任せてもらいやすい状況を作る

1は一見つまらなそうな仕事でもその背景を知り、価値を出すために能動的に行動していくことです。開発の仕事でもこの開発はどんな価値を提供するのか?を常に意識するのは重要なのと同じです。

そして長期的に見て非常に効果が高いのは2です。価値の頻度を高める過程で自分を評価してくれる人は必然的に増えるので、結果的に大きい仕事を任せてもらいやすくなります。

今日の1%

自分で価値を高めること以上に価値を出す頻度を増やすことが重要。 そのために開発以外の領域でも幅広く価値を出して、大きな仕事のチャンスを得られるようにする。

Webアプリ開発プロジェクトの開発開始までに行う5つのステップ

1. 企画書を作成する

プロジェクトの目的と何をするか?を説明する資料

一人で企画を考える場合とチームで考える場合だと、 やり方が全く異なるので、企画段階の話は別記事でまとめたいと思う。

2. ワイヤフレームを作成する

企画書でやることが決まったら、次は画面一覧と各画面に表示する項目と用途を記載する。

画面が決まっていないと開発は進めようがないので、 開発の前にここは必ず決めておかないといけない。

メンバー全員でホワイトボードに図を書きながら書くような場合もあるし、 PMがスプレッドシート等で作成して揉んでいくような進め方になると思う。

3. 工程を細分化する

ワイヤフレームが決まったら作るものは大体決まるので、次は工程を細分化する。 Webアプリの開発だと大体、要件定義、共通設計、デザイン、コーディング、JavaScript、サーバーサイド、テスト、フィードバック修正の流れになるかなと思う。

工程に分けたら、それぞれの工程で漏れが無いようにタスクを分割していく。 これをスプレッドシートに記入して一度チームメンバーに一つずつ共有していく。

懸念事項なども記入したら、これをイシューかチケットに登録して 今後のコミュニケーションを出来る場所を用意する。

4. マイルストーンを決める

工程を細分化しても、そのままだと各担当のタスク量が多すぎて、ざっくりとした見積もりしか立てられない。 なので各画面/機能毎にいつまでに作るか、全体の大まかなマイルストーンを最初に決める。

これによってメンバーもタスクの優先順位が立てられやすくなる。

ここのマイルストーンの立て方がアジャイルウォーターフォールだと違うのかなぁと思っているので、調べて別の記事にしたい。

5. 見積もりを立てる

マイルストーンが決まったら担当者で見積もりを立てる。厳しそうだったら相談してもらう。

今日の1%

  • 1エンジニアやデザイナーとしてプロジェクトにジョインした時も、 プロジェクトマネージャーの視点を持って仕事をすることによって、スピードも質も向上させることが出来る

毎日の仕事を楽しむためのモチベーションマネジメント

仕事って人生の大半の時間を占めてるわけですが、なかなか楽しむのって難しいですよねー。 締め切りに間に合わせることに必死で、楽しむ余裕なんてないやい!って状態に陥ることよくあります。

でもどうせなら日々の仕事を楽しみたい!という訳でどうすればいいのか考えてみました。

仕事が楽しいってどういうこと?

楽しい仕事っていうのはモチベーションが上がる仕事だと思うんですよ。

www.amazon.co.jp

モチベーションの定義はこちらの本の言葉を借りると、 「目標の魅力」✖︎ 「達成の可能性」なんですね。

この2つの変数がより高くなればなるほど、モチベーションが上がる。楽しい仕事だというわけです。

目標の魅力を高めるには?

報酬といっても、お金に限った話じゃないです。 例えば仕事を部下に依頼する時に、仕事に対する期待を明確に伝えることも報酬を高めることに繋がります。 どうでもいいと思われてる仕事よりも難易度が高くても期待されている仕事の方が嬉しいし、やる気が出るじゃないですか。

こういう目の前の仕事の上位にある「なぜやるのか?」を伝えることをラダー効果と呼びます。

www.genkipolitan.com

達成の可能性を高めるってどういうこと?

つまり簡単に達成できそうだなぁと感じられるほど、やる気がでるってことです。 宝くじ1億円が1000万人に1人だったら、買う気しないけど、100人に1人だったら即買いたくなるのと同じです。

1. 今日やる仕事のゴールを設定する

2. 仕事のステップを漏れなく分割する

3. それぞれかかる時間を見積もる

4. 着手して難しそうだったら優先度を考えてマイルストーンを調整する

1-3を朝に行い、着手してからはゴールを意識しながらマイルストーンを調整することで達成の可能性を高めることができます。

まとめ

前述したマイルストーンの設定の上、さらに「なぜこの仕事をやるのか?」の仮説を思考するようにしましょう。

一言で書くよりも、「xxxな人にとってxxxがxxxの理由で不便だったため、これで改善されると、業務が改善されて使える時間が増える」からなように文章ベースで具体的に考えると思考が深まります。可能ならこの仮説を人にぶつけて精度を高めていきましょう。

リモートワークでチーム開発する時に便利なツール・ドキュメントまとめ

Webサービスをチームで開発する時に便利だなと思ったツールや、ドキュメントをまとめてみました。 これからプロジェクトを始める時の参考にブックマークして使ってもらえると、嬉しいです。

プロジェクトの説明資料

  • Googleドキュメントが多いです
  • 作る目的やターゲットユーザー、機能を明記しておきましょう

ER図

  • システムの全体像を把握するために必須
  • 新しくエンジニアが加入した時のために必ず用意しておきましょう

MySQL :: MySQL Workbench

MySQL Workbenchを使うと既存のデータベースをそのままER図に出力できるので、とても便利です。

ワイヤーフレーム & 画面遷移図

  • これは新しく画面を作る時にデザイナーさんと認識を合わせるのに、あると便利です
  • これはGoogleドキュメントやワイヤーフレームツールで作ることが多いですかね

デザイン共有ツール

  • ワイヤーフレームからデザインが固まったらデザインカンプを共有するわけですが、いちいち画像をダウンロードするのは面倒です
  • そこでデザインデータをオンラインで共有できるZeplinというツールがあるのでこれを使うようにしています。

zeplin.io

モックアップ

  • これはデザインの画像同士を繋げて画面遷移を試せるサービスです
  • 実際にサービスを触りながら雰囲気が掴めるので、オススメです

www.invisionapp.com

環境構築手順書

  • これはGithubのREADME.mdやWikiに書いておくことが多いです
  • 新しい人が入ってくる時には必須なので用意しておきましょう

シードデータ

  • Webサービスを最低限動かすために最初から必ず必要となるデータです
  • これが無いと、自分で一つずつデータを入れる必要があるので必須です

自動テスト環境 (CI)

  • 書いたコードが実行できるかを担保する上でテストは必須です
  • ロジックが多めになるサーバーサイドは必ず書きましょう。
  • 自動テストツールとしてはCircleCIが手軽でオススメです。

circleci.com

コード解析ツール

  • コードの品質を保つためにコード解析ツールも必須です
  • 国内だとSideciがオススメです

コードレビュー自動化のためのCIサービス | SideCI

動作確認用サーバー

  • 実際に今作っているサービスを動かして試す環境です
  • HTML/CSSのみの場合と、データ以外は本番環境と全て同じのステージング環境を用意する場合があります

コード共有

  • Githubの有料版ならプライベートリポジトリが作れます。
  • あとはBitbucketやGitlaboが候補になると思います。

github.com

チャットツール

  • Slackで連絡を取りつつ1日1回はappear.inで顔を見ながらビデオ会議が良いかと思います。 slack.com appear.in

タスク管理

開発者同士で使うなら、Trello, Waffle, Pivotal Tracker等色々とありますが、 Slackとビデオ会議で情報共有がしっかりと出来てれば、ぶっちゃけ何でもいい気がしてます笑

trello.com waffle.io www.pivotaltracker.com

幸せを毎日感じて生きるために大切な3つのこと

突然ですが皆さんは今幸せですか?「俺は幸せだー!」って毎日感じながら生きている人の方が少ないんじゃないかなと思います。

自分はプライベートも仕事もうまくはいっているのですが、 幸せを毎日感じて生きてはいないなと感じていました。

そこでどうしたら幸せを感じられるのか?そのために何を意識して生きていけば良いのかを考えたので、 少しでも役に立つ人がいれば良いなと思ってます。

幸せを感じる時ってどんな時?

一言で言うと、「自己重要感」を満たせる時なのだと思います。

例えば、自分が好きなことや頑張っていることを相手が肯定してくれたり、褒めてくれると嬉しいですよね。

これは自分の存在を肯定してくれている人がいると、自分は必要とされる存在なんだという 気持ちになって自己重要感が満たされるからだと思ってます。

なぜ幸せが必要か?

「幸せではない」= 「自己重要感が低い」なので、幸せじゃないと思っている人は自分の存在をどんどん否定してしまい 次第に生きていくのが辛くなっていきます。

なので、生きる上でどうやったら幸せになれるのか?を考えることは必須なのではないかと思ってます。

じゃあ幸せに生きるにはどうすれば?

「幸せ」= 「自己重要感が満たされる」なので、1人では無理です。 幸せになるには、周りに自分に幸せを与えてくれる人が必ず必要です。

1人で「自分は幸せなんだ。なぜなら仕事も順調でお金も沢山稼いでるし、自分の好きなことも出来てるし」とか自己暗示をかけても、 心はよくわかっているので、虚しいだけでかなりしんどいです。

どうしたら幸せを与えてもらえるのか?

幸せに生きるには、人との繋がりが必要。でもただ漠然と一緒に仕事したり、ご飯食べるだけじゃダメ。 月並みですが、「相手に幸せを与える」ことが大切です。

相手の興味のある話や仕事の相談を親身に聞くとか、 花金の飲みで愚痴を言い合う会を企画するとか笑

自分がしてもらったら、嬉しいなぁと思うことを相手にすることを常に意識して行動していると、 気づいたら自分も幸せを分けてもらえるなーと最近ようやく理解してきました。

ビジネスの本質も同じなんじゃないかと思った

仕事やプライベートで一緒に関わる人を幸せにして自分も幸せになるだけでも かなり素晴らしい毎日だと思うのですが、ビジネスをすることは自分が一生生きていて 直接関われない人も幸せにできるので、得られる幸せも大きいのではと思ってます。

もちろん幸せを得るためには一定量のお金も必要

これは個人も会社も同じですが、お金が無さすぎると惨めになって、幸せが逃げていくと思います。 安定して一定以上のお金を稼ぐことはとても大切。お金がないと、余裕が無くなるからね。

まとめ

  • 幸せを得るには人に幸せを与えることを意識して毎日過ごすこと
  • 自分の周りからはじめて、少しずつ幸せにできる人を増やしていくこと
  • 余裕が無くならないほどの、一定量のお金は稼げるようにすること

の3つを実践していけば、幸せ度はどんどん上がっていくなぁと思っています (というか実感してます)

著者自身、あまり人と気さくに話すのが得意な方ではないのですが 頑張って人と関わって幸せを与えあう関係を増やしていきたいなぁと思ってます^^

ActiveRecordのEnum型のデータをJavaScriptから保存する

enum(列挙型)の使い方

ActiveRecordenumを使うと、プログラムからは文字列(名前)でアクセスでき、 DBには数値で保存される属性を作ることができます。

Modelに属性にセットできる文字列を列挙する

class Post < ActiveRecord::Base
  
  enum status: {
    draft: 0,
    published: 1
    deleted: 2
  }

end

DBにカラムを追加する

class AddStatusToPostss < ActiveRecord::Migration
  def change
    add_column :postss, :status, :integer, default: 0
    add_index :posts, :status 
  end
end

追加されるメソッド

  • モデル名.属性名で現在の値を文字列で取得
  • モデル名.文字列?で状態チェック
  • モデル名.文字列!で状態変更
  • モデル名.属性の複数形で列挙した値を全てハッシュで取得
  • モデル名.文字列でその状態のレコードを検索
post = Post.new(status: :draft)
post.status # => draft
post.draft? # => true 
post.published! # statusをpublishedに変更

Post.statuses # => { draft: 0, published: 1 }
# Post.statuses[:draft]のようにして数値を得られる

Post.draft

JSから保存する

JSからAjaxRails側に保存する時は文字列で送れば良い。

data: {
  status: 'draft'
}

文字列にしておけばEnum型が自動で数値に変換してDBに保存してくれる。 JS側で数値を管理する必要がないので便利。

Reactでエンターキーのイベントを取得する方法

onEnterは存在しない

Reactがサポートしているイベントは以下の公式サイトに記載されています。

facebook.github.io

onClick のノリで onEnterは無いのかな?と探してみてもありません。 ただし、代わりになるキーイベントがあります。

onKeyDownを使う

それが onKeyDown です。Propertiesを見ると、keyCodeが取得できるので この値を判定すればエンターキーを判定できます。

https://facebook.github.io/react/docs/events.html#keyboard-events

キーイベントをJSXから受け取る

<textarea onKeyDown={  (e) => props.onKeyDown(e) } />

後はこんな感じでpropsで受け取ったイベントハンドラにイベントオブジェクトを引数で渡して実行します。

keyCode === 13で判定する

if (e.keycode === 13) {
  // エンターキー押した時の処理
}

あとはkeycodeの中身を判定するだけですね。簡単です。