読者です 読者をやめる 読者になる 読者になる

ボクダイモリ

Life is like a Game

nodebrewを使ってNode.jsをインストール

プログラミング プログラミング-node プログラミング-javascript

仕事でnodeを使っているので勉強がてら触ってみる。

まずは環境構築から

開発環境

  • ツールのバージョン
    Homebrew 1.1.11

nodebrewのインストール

nodeのバージョンを管理したいのでnodebrewを使ってnodeをインストールすることにする。
まずはnodebrewをbrewを使ってインストール

$ brew install nodebrew
$ nodebrew -v
nodebrew 0.9.6

nodeのインストール

前述した通り、nodebrewを使ってnodeをインストール

$ nodebrew install-binary stable

上記のコマンドで最新の安定版がインストールできるはずだが、Failed to create the fileというようなエラーが出てインストールに失敗する(エラーログは取り忘れた) これはインストールするためのディレクトリがないために発生している。なので、まずはインストールするためのディレクトリを作成する。

$ mkdir ~/.nodebrew
$ mkdir ~/.nodebrew/src

ディレクトリを作成した後にもう一度インストールを実行すると問題なくnodeがインストールされる

nodeが使えるように設定

インストールしたnodeを実行できるようにnodebrewからnodeのバージョンを選択する

$ nodebrew use stable
$ nodebrew ls
v7.7.3

current: v7.7.3

また、nodeにPATHを通すために以下のように.bash_profileにPATHを追加

$ echo 'export PATH=$PATH:/Users/xxxx/.nodebrew/current/bin' >> ~/.bash_profile

ターミナルを再起動してからnodeを実行

$ node
> console.log('Hello Node.js!')
Hello Node.js!

環境構築おわり。

作業の工数を見積もるときの3つのポイント

IT

自分は今年で3年目のエンジニアになるが、未だに作業工数の見積もりは難しく思う。

今までいくつかのプロジェクトにアサインされてきた。その中で、自分はPGとしてコーディングをしたり、 SEとして設計書作成をしていたが、共通しているのはそのタスクには期限があるということ。
そしてその期限をもって、プロジェクトの全タスクはスケジューリングされている。
タスクには期限を設ける必要があるため、そのタスクについていくつか考えなければならないことがあるだろう。

「そのタスクの成果物は?」
「そのタスクの完了にはどのくらい時間がかかるの?」
「そのタスクはいつ終わる?」

将来の結果を予測するのは難しい。だが見積もりは重要だ。
なぜならいつ終わるのか分からなければ、次のタスクをいつ振ればいいのか決めようがないから。

つい先日、プロジェクト内のPMに見積もりについていい事を聞けたので、ここでまとめてみる。 見積もりのポイントは次の3つ

  • タスクは細かく分割する
  • 工数はフィボナッチ数列を使って見積もる
  • 工数が分かるタスクで相対的に測る

1つずつ章ごとに分けてまとめてみる

タスクは細かく分割する

タスクの見積もりは難しい。それが大きなタスクであればなおさらだ。 タスクは細かく分けるほど正確な工数を見積もれるのだから、タスクを分けるのは重要なことだ。

個人的にはタスクは最大でも3日で終わるような規模にするべきだと考えている。
でないと自分の今持っているタスクを十分に見える化することができない。

例えば「実装」というタスクを振られたとして、その作業をどのように分けるべきか。

実装といってもコーディングして終わり、ではないだろう。コーディングが終わったら動作確認をしたり、 バグがあればまたコーディングに戻り、動作確認が終わればリポジトリにコミットして次はソースレビュー。
レビューで指摘を受けてまたコードを修正、動作確認、…という流れになるはず。
なのでタスクを分割すると以下のような感じ。

  • コーディング
  • ソースチェック
  • 動作確認
  • リポジトリにコミット
  • ソースレビュー
  • レビュー指摘箇所の修正
  • 修正後の動作確認
  • 修正後のソースコミット
  • 修正後のソースレビュー

このように作業に分割すれば見積もりはしやすくなるだろう。
また、ソースレビューは自分の作業だけでは完結せず、レビューが行われるまでは待ちの状態になる。
その点も考慮してスケジュールを組まないと余裕を持って期限内に終わらない可能性が出てしまう。
タスクが十分に分割されていれば、正確に見積もりができ予定通りに作業を完了させられるように なるのではないだろうか。

工数はフィボナッチ数列を使って見積もる

フィボナッチ数列とは1,1,2,3,5,〜と続く数列で、ある値はその前とその前の前の数を足し合わせた値になる。 フィボナッチ数列に登場する値を使うと相手に工数が伝わりやすくなるとのこと。 例えば

1人日:すぐに終わりそう
3人日:そこそこ時間かかるね
5人日:結構かかるな〜
8人日:え!かかりすぎじゃない!?
13人日:何かがおかしい

ポイントとしては5人日以上かかる想定であれば、そのタスクの見積もりは妥当ではないということ。
前の章でも述べたが、タスクは小さく区切るべきであり5人日かかるタスクというのはそもそもタスクの分割が 不十分である。従ってそのようなタスクがあれば、またタスクを分ける作業に戻るべきだろう。 また、1人日、3人日、5人日というような見積もりだけだとかなりざっくりしているが、さくっと相手に 作業時間を伝えることができる。
自分は見積もりに結構時間を使ってしまうタイプなので、この方法を活用して楽出来ればなーとか考えてます。

工数が分かるタスクで相対的に測る

あるタスクの作業量を伝える時、単純に何人日かかると言っても伝わりにくい場合は、 すでにある実績と比較して伝えるとわかりやすいらしい。
例えば、
「以前こういう作業にこれぐらい時間がかかり、今回の作業は誰々さんが実施するので〜倍の何時間かかります」
というような感じ。
この方法なら割と簡単に時間をかけずに工数を見積もれる気がしますね。

自分は実績をものさしにして見積もりをするということはしなかったですが、今後は実績はちゃんと計測して 将来の見積もりに役立てるようにしたいなー。

まとめ

ポイントとしては以下の通り。
1.細かくタスクを分ける
2.フィボナッチ数列でざっくり見積もる
3.タスクは他の作業と比べて相対的に測る

今回はPMとの飲み会でいい話が聞けたので、まとめてみた。
これらのポイントを抑えれば見積もりもきっと上手くなると思うので、これからはちょっと意識してみます。

Android4.3以前の標準ブラウザはplacefolderをサポートしていない

プログラミング プログラミング-css

placeholderのcssをどうやって古いAndroidのブラウザにも対応させようかで詰まってたけど、 そもそも対応してなかったというオチ

http://caniuse.com/#search=placeholder

リンク先の通り、Android4.3以前のバージョンはplaceholderをサポートしていない。 もっと早くにこの線で調査すればよかったorz

caniuse便利だね

継続的インテグレーションによって何が出来るようになるか考えてみる

プログラミング

継続的インテグレーション(CI)について、軽くググってみたら色々出てきた。

継続的インテグレーションとは?– アマゾン ウェブ サービス

www.techmatrix.co.jp

なんでこんなこと調べていたかというと、社内のプロジェクトでCIについて議論する機会があったが、 この辺のノウハウには疎かったのであまり話についていけず気になっていたから。

今現在所属しているプロジェクトは、短いスパンでサービスをリリースしてはそれと並行して開発進めている、いわゆるアジャイル開発だ。
また、開発自体は外部に委託していて、うちの会社はコードの品質管理などをしている。

そんなプロジェクトだが、歴史自体は浅くCIツール(Jenkins)などは導入されていない。
あるとすればコードの品質を最低限保つためのSonarQubeがあるだけ。
それとソースはGitで管理しているが、なぜかリポジトリはBacklogで管理されている。
また、ブランチ管理はGit FlowとかGithub Flowとかではない。masterとリリース+開発用のブランチがあるだけ。

こんな感じのプロジェクトだが、プロジェクトの現状についてどう改善していくか議論する機会をもらえたので、 せっかくなのでCIツールとは何か、CIってなにするのか、問題点とか将来こうしたいなど自分の考えとか理想とかをまとめてみる。

CIについて

CIについては上のAmazonのページがよくまとまっている。
CIの目的はつまりこのような感じだろう。

  • 開発者の生産性向上
  • コードの品質向上
  • リリースと結果確認にかかる時間の短縮

上記3つを目標とする際、実際にするべきことはなんだろうか。それぞれ必要なことを軽く挙げてみる。

開発者の生産性向上

  • 重要なコーディングに集中する
  • 開発中に埋め込まれるバグを減らす
  • バグを早期発見する仕組みを作る

コードの品質向上

  • コードレビューを実施する
  • コーディング規約を設けて機械的にコードをチェックする
  • 定期的にビルドする(コンパイルエラーになるようなコードは埋め込まない)

リリースと結果確認にかかる時間の短縮

  • リリーススクリプトを用意して、リリース作業を自動化する
  • ビルド、リリース結果を担当者に通知する
  • ビルドからリリース結果確認までの手順を簡略化する

CIツール等を使えば上記のようなことはできそう。
他にもできることはありそうだが、とりあえずは上の項目をプロジェクトに盛り込みたい。

現プロジェクトの問題点

今プロジェクトが問題にしていることはだいたい以下の通りである。

  • CIツールがないため、自動ビルドや自動デプロイというような仕組みがなく、その作業に時間を使っている
  • 品質向上の為、SonarQubeを使ってはいるが、手動で行っていて時間がかかっている
  • 開発フローにコードレビューが存在せず、局所的にコードレビューを行っているのみ
  • リリースの手順が複雑、時間もかかる

現プロジェクトの問題点として、自動化できるような部分で時間を取られていたりしていて面倒くさい。
やはりエンジニアとして自動化出来る部分は自動化して、本質的な作業に集中したい。

また、ブランチ管理の規約を設け、開発用のブランチを用意することでブランチの構成をシンプルにした上で、 他のツールとの連携もしやすい環境にしたい。

そのためにもまずは、JenkinsなどのCIツールの導入や、ブランチ管理、開発フローの見直し等が必要なのかなと 考えている。

今後について

今のプロジェクトについて問題点を挙げたので、次はそれについて具体的な解決策などを模索していきたい。 まだまだ勉強不足で考慮が足りていない部分もあるだろうけども、今後メンバーとプロジェクト体制を見直していく上で 少しずつ知識を身に着けていければいいかなー。

まとめ

今回はCIとは何であって、プロジェクトの問題に焦点を当てながら理想の開発環境を書いてみた。

今後どうやってCIを導入していくかは気が向いたら書く。
今はもう疲れたから寝る。

【Swift3.0】Errorプロトコルを使った例外処理のサンプルを作ってみた

Swift3.0でErrorプロトコルとdo~catch構文、tryを使ってみた。 最小限のコードだけメモとして残しておく。

実行した環境は以下の通り

  • xcode version:8.2.1
  • swift version:3.0.2

Errorプロトコルを定義

以下の様にErrorプロトコルを定義する

enum TestError:Error {
    case Error1(String)
    case Error2(String)
}

enum要素に引数をとることで、エラーメッセージなどを呼び出し元から参照することができる。

次に上記の例外を投げる関数が以下。

func TestMethod(str:String) throws {
    if str == "error1" {
        throw TestError.Error1("エラー発生1")
    }
    else if str == "error2" {
        throw TestError.Error2("エラー発生2")
    }
}

また、例外をthrowするメソッドはthrows宣言をしないとコンパイルができない。

try~catch構文とtryで関数呼び出し

作成した例外を投げる関数をdo~catch構文の中で呼ぶ。
関数を呼び出すときは先頭にtryをつける。
Errorプロトコルの要素は引数にStringを取っているので、 例外発生時にその値を出力するようにしてみる。

do {
    try TestMethod(str: "error1")
} catch TestError.Error1 (let err) {
    print (err)
} catch TestError.Error2 (let err) {
    print (err)
}
//実行すると「エラー発生1」と出力される

まとめ

  • Errorプロトコルを使うことで例外を定義できる
  • 要素に引数を与えることで、例外発生時に呼び出し元にデータを渡せる
  • 例外を投げる関数にはthrows宣言をつける
  • 例外が発生しうる関数の呼び出しはdo~catch文の中で呼び出す

2017年の抱負

日記

明けましておめでとうございます。
2016年もあっという間に過ぎて社会人生活も3年目に突破しようと
しています。

社会人になってから時間が経つのがものすごく早く感じます。
この一年間でたくさんの人と出会って、慣れない仕事もそれなりに経験してきましたが
本当に時間の流れというのはあっという間です。
それでも今ある時間をより充実したものにするために、今年は目標をつらつらと立ててみたいと思います。

続きを読む

自分が面白いと思える本の見つけ方

自分に合った本を見つけるって難しいですよね。
僕は最近本屋に行くとビジネス書や技術書を探すことが多いのですが、
1時間ぐらい店内を探してもなかなか面白そうだと思える本は見つかりません。

IT系の技術書であればどんな言語を勉強したいかが明確であれば、目的の知識が得られる
本を見つけるのは難しくないでしょうが、小説などの文庫本となると物語の舞台だとか世界観だとかキャラクターの個性だとか作者の文章が読みやすいかなどで好き嫌いが分かれるでしょう。

続きを読む