転戦1ヵ月 前と後、どうなん?

まず、誰ですか?

昨年後半よりめきめきと露出度を増やしていますが、Webエンジニアで猫好きな @jiyuujinプロフィールをご覧ください。

PHPを中心に、特にLaravelを使った制作は、2年近くと少々長め。Vue.jsとの出会いもこの時です。最近は関西を拠点としたコミュニティv-kansaiの立ち上げ、昨年年末のv-kansai Vue.js/Nuxt Meetup #1初主催をはじめ活動しています。

転職前に書いた記事はこちら!

webneko.info

慣れましたか?

慣れました。しかし、まだまだ改善の余地。

今回、リモートでお仕事を進めていますが、最大の違いは「リモート生活」です。ちなみに私個人のリモート経験は、ほぼ無いです(少なくとも、フルリモートは)。まずこの判断をしていただいたことは、今でも感謝すべきことと思います。

使えるものは使う、分報とか

その上でコミュニケーションを進めるため説明にどうしても口頭で伝えたい場合にテレビ会議で、など手段のレベルで困ったことは特にありませんでした。特に自身の意図が伝わらない、といったことにならないようにするため、Slackの「分報」を最大限活用している。前職にも似たようなものが存在、使う上で困ることはありませんでした。ですがあくまで口頭の補助的な役割で使っていたため、当時と位置付けが異なりその点で手こずった。

聞くこと、存在感を示すことを心がけ

また自分自身から他メンバーに対して「聞く」、「わからないことがあったら聞く」ことができなかった。前職から染み付いていることだが、実質一人で管理画面周りを廻していた環境で自身でやり切ること。このようにやり切ることはもちろん重要だが前職と違って、既に熟知されている方もいらっしゃる現状、聞いた方が早いのも事実。自身から声を上げていかないといけないことを改めて痛感させられました。このような試行錯誤を経ながらも成長していければ、確実に慣れてくるだろうと思っています。

その他、「前」と「後」

ステークホルダーの多さ

言ってもこれに尽きると思いました。今までゲームユーザーを筆頭に、社内でのCS、プランナーと言った限られた職種の人たちに対してのみ、想定すれば良かった世界。極端なことを言うと利益は、基本的にゲームユーザーに対してのみ考慮すれば良かったのが、エージェント企業や求職者、その採用企業までと立場がとにかく多いと感じました。

工程管理

先述の通り実質一人で廻していた環境もあり、今回初耳だった「スプリントプランニング」。プランニングでどのように設計をこなし、実装を進めていくかということ。これをしっかりと行うためには、事前の知識として仕様をおおまかに把握していないと中々できない部分もあり、これからだなぁと思っています。

開発環境・使用技術

基本的に大きな違いは存在しません。強いて言うならフロントエンド周りNode.jsの管理で、NodebrewからNodeenvに変わったこと、NpmからYarnに変わったことなど。

外出機会の量

想定の範囲内でしたが毎日4000歩(5km)は歩いていた日々が一切無くなる訳で、意識していないと不健康の塊になるのは必至です。汗笑 どちらかと言うと関西では不活性な部類に入る勉強会やコミュニティ活動を平日晩に充実、もっと交流を深められればと思っています。v-kansaiもそのうちの一つ。

最後に、

SCOUTERではエンジニア、デザイナーともに募集しております! 新規事業、絶賛グロース中の事業ともにLaravel, Vue.jsで開発しておりますので、 興味のある方はお声がけください!

www.wantedly.com

www.wantedly.com

www.wantedly.com

外部パッケージを修正したあと確認するまでのコストの削減

こんにちはSCOUTERでエンジニアをしているhirokinishizawaです。

弊社ではVue製のUIコンポーネント集をはじめいくつか外部パッケージ化をしています。以前まで外部パッケージの開発を行う際に変更したら外部パッケージを毎回ビルドし直して、その外部パッケージを使用しているアプリケーションに反映をさせていました。少しの変更でも再ビルドを行い反映をするという作業が入るため、外部パッケージの大きめなアップデートをするときにはとてもじゃないですが面倒臭すぎてやってられませんでした。なので今回差分ビルドを行い確認するまでのコストを削減するようにしたのでその話をしていこうかと思います。

どのような問題があったのか

冒頭でも説明したのですが、外部パッケージを修正したあとローカル環境で確認コストが高いというのが開発メンバー内で挙げられた課題でした。実際パッケージを修正してからアプリケーションに反映をするまでに下記を実行していました。

外部パッケージを修正
↓
外部パッケージを再ビルド(yarn dist{webpack --progress --config build/webpack.base.conf.js})
↓
アプリケーションに修正を反映させるためにビルドしたファイルをrsyncでコピーする
↓
アプリケーションで反映完了を待つ

これを少しでも修正する度に行っていました。

外部パッケージの再ビルドに時間がかかるためコストが高いというのもあるのですが、弊社で開発をしているSARDINEというサービスではadminを含め3つのステークホルダーが存在しているため、それぞれに反映させるのがとても面倒臭いというのが今回差分ビルドやyarn linkを出来るようにする起因となりました。

なぜ外部パッケージを作成したのか

上記でも同じことを言いましたが弊社で開発をしているSARDINEというサービスには3つのステークホルダーが存在します。

それぞれユーザーの種類は違いますがいくつか共通な画面があります。なので共通部分のコンポーネントをパッケージ化することによってコードを1箇所にまとめることができるため、修正を加えるレポジトリが1つで済むようになり、同じドメイン領域に関するコードがまとまっているためどのような処理が行われているのかを見通しやすくなるため作成しました。

yarn link + 差分ビルドするための方法

変更自体はほとんどありません。 外部パッケージで差分ビルドできるようにするために外部パッケージのpackage.jsonにscriptsを追加。

"watch": "webpack --progress --config build/webpack.base.conf.js --watch"

これでyarn watchでパッケージの差分ビルドを行えるようになります。

次にwebpackの設定を変更しないと外部パッケージでyarn link で貼ったシンボリックリンクの解決に失敗しアプリケーション側で参照できないため、resolve.symlinks を false に変更します。

以上で準備完了です。各リポジトリ1,2行ぐらいですねw

最後にターミナルでの実行方法を書いて終わりにしたいと思います。

外部パッケージでyarn link
↓
外部パッケージでyarn watch
↓
アプリケーションでyarn link <package-name>
↓
アプリケーションをビルド

実行したあとは外部パッケージを修正しターミナルでパッケージのyarn watchとアプリケーション側のビルドが動いているのを確認できれば完了です。

余計なコストを減らして爆速で開発をしていきましょう!

最後に

SCOUTER社では一緒に働く仲間を募集しています! 興味のある方は下記からご応募いただくか、弊社CTOまでご連絡ください!

www.wantedly.com

www.wantedly.com

www.wantedly.com

Nuxt Meetup #7 を開催しました!

総括を!

nuxt-meetup.connpass.com

nuxt-meetup-7
株式会社ピースオブケイクにて

初めまして、2/1 京都のゲーム会社ポノス・にゃんこスタジオより転戦したWeb猫こと、@jiyuujin (北村勇磨)です。今回のミートアップは、株式会社ピースオブケイクさんで開催されました。移転したばかりの素敵なオフィス、素晴らしい環境でございました。改めて場所提供のほどありがとうございます。

スポンサーLTでは、CTO @konpyuさんによる登壇。メディアプラットフォームNoteのAngularからNuxtへのリプレースについて取り上げられました。去年のVue Fes Japan 2018でも、福井烈さんの発表「note のフロントエンドを Nuxt.js で再構築した話本番運用は既に始まっている。」があったように非常に大きな話題となっています。

レガシーブラウザと向き合うNuxt.js

slides.com

面白法人カヤックのフロントエンドエンジニア、@kengotoiroさんの登壇、Lobi Web版のAngularからNuxtへリプレースをした話でした。開発中辛かったこととして、Nuxtが1系→2系の移行期にありドキュメント少なくハマったとのこと。機能拡張する場合レガシーブラウザで動くように変換するため、Polyfill.ioを使うと、nuxt.config.jsのheadに記載してあげるだけで簡単に対応できるといったTipの紹介もありました。

Nuxtを中心とした開発エコシステムと、個人開発のススメ

受託開発をメインに行っているフロントエンドエンジニア、七洋株式会社の金井淳さんの登壇。キッチン周りの解決を行うサービスsmall dish (Beta Version)の開発で、Nuxtを採用。ContentfulでModel、Fieldsを永続化データで実装。Vuexストアで献立やアイディア、いいねなど管理して、スピーディに開発している話でした。

Catch up Nuxt.js 2018.02

speakerdeck.com

最近異常に活発なNuxt.jsの活動方針について、@andoshin11さんの発表でした。nuxt-edgeを使うと、毎日ビルドされアップデートされるので、日々使ってみるのも楽しくなりますね。その他主に気になった点として、以下挙げられると思います。

  1. Universal Fetch対応、ビルトインにnode-fetch、fetch polyfill
  2. nuxt.config.jsにPromiseが入った。
  3. .nuxtignoreファイルがサポートされた。
  4. Unitテストで気軽に動作確認できるようになった。
  5. NuxtでTSサポート本格化。nuxt-tsが使えるようになった。

私自身TSサポートしか知らずでしたが、色々新しい発見があり非常に興味深い話でした。

Re:ゼロから始めるNuxt生活

speakerdeck.com

株式会社nana musicでサーバサイド中心に開発を行っている角谷さんの発表でした。音楽アプリのリプレースについての話、SEOに貧弱であったことや、Python2という今では考えられない古いバージョンを解決するため、今回Django + Nuxtを採用。Vuexは便利な反面、メンテされていないtypescript-templateを使わないと言った話でした。

Web猫ブログで問い合わせにFirestoreを採用した話

master.d15419h4sw4nyx.amplifyapp.com

自ら登壇させていただきました。去年秋より関西エリアを中心に登壇、メキメキと露出を増やしています。今回ミートアップ開催1時間前になって初めて、資料を作るという手際の悪さは反省の一つでしたが、NuxtとFirestoreを使ったスタートアップの事例、あえてVuexを採用せずに作ったことなど、参考になれば幸いです。

NuxtとTailwind.css

slides.com

急遽一人LTのキャンセルが出て、10分で作ってくれました。弊社石岡の発表、FABRIC TOKYOのリプレースした話でした。UIフレームワークにこだわった時の変更や、クラス名を考える時の辛さを払拭するため、Tailwind.cssを採用。私も機会あればこの「天才的な」CSSフレームワークを使ってみようと思います。

最後に、

SCOUTERではエンジニア、デザイナーともに募集しております! 新規事業、絶賛グロース中の事業ともにLaravel, Vue.jsで開発しておりますので、 興味のある方はお声がけください!

www.wantedly.com

www.wantedly.com

www.wantedly.com

Laravel JP Conferenceでスポンサード&IRT&登壇しました

こんにちは kotamat です。 2019/02/16に行われたLaravel JP Conferenceにてゴールドスポンサーと、IRT、登壇をさせていただきました!

f:id:kotamat:20190218112333j:plain

conference2019.laravel.jp

IRT

午前中の時間を使い、「Vue.js と Laravel の相談会」というテーマでInteractive Round Tableを開催させていただきました。

他のセッションのほうがかなり魅力的だったのか、人数的に時間を区切って相談会をするのが難しかったので、都度都度相談をするような形で相談会を行いました。。

スタート時間では、ytakeさんも参加されていました。

Laravel と Vue.jsは親和性が高く、今回の発表でもVue.jsに言及されているものも多かった印象でした。 そのためトピックとしては非常に多いため、一つのテーマで20分話すものより様々なトピックに関してお話することができ、そういった意味では良い結果になったかなと思います。

登壇

登壇した内容はこちらです。

slides.com

前回のPHPカンファレンスで話した内容と若干かぶっているところもありますが、DXの面やアーキテクチャの面等で工夫したところをご紹介させていただきました。 細かい話になると非常に長くなってしまうので、アウトラインの紹介 + Ask The Speakerの方で話をする感じのスタイルにしたのですが、早口で話ししてしまったのか結構時間余ってしまったので、もうちょっと詳しく話しても良かったかなぁと思っています。

まだまだDXの向上はする余地があると思っているため、今後もいろいろなチャレンジをして開発スピードを今後も上げていこうと思っています。

カンファレンス全体を通して

Laravel JP Conferenceは今年限りというところでしたが、セッションの内容もそれぞれ非常に面白く、どのセッションを聞きに行っても満足度が高い会だったなと思っております。 特にカンファレンスの運営メンバーのホスピタリティーが高く、これほどスポンサーに対しても登壇者に対しても参加者に対しても気配りのできるカンファレンスは珍しいなと思いました。

今年はPHP系のカンファレンスも非常に多いため、PHPユーザが今後も増えていくといいなぁと思っております。

一日中喋ったので、しばらくは休養させていただきます。

最後に

SCOUTERではエンジニア、デザイナーともに募集しております! 新規事業、絶賛グロース中の事業ともにLaravel, Vue.jsで開発しておりますので、 興味のある方はお声がけください!

www.wantedly.com

www.wantedly.com

www.wantedly.com

Vuex のルールと Component 設計

こんにちは、自意識過剰な正義のヒーローでお馴染みの株式会社SCOUTERの石岡 将明( @masaakikunsan )です。

前回の Flutter のブログで、「2月半ばにAPIの叩き方やページ内のレイアウト作り方などをちゃんと解説したブログを書こうと思うのでお楽しみに!」と言ったのですが、あれ以降 Flutter を触れていないので今回は普段触ってる技術について書きます。

techblog.scouter.co.jp

現在 SCOUTER では、SARDINE と back check の大きく分けて2つの開発チームで開発を行っています。 僕は、back check で プレイングマネージャーとして開発をしているのですが、SARDINE チームに最近フロントエンドの相談を受けるようになってきたので今回はその話をしていきます。

Vuex でのルール

Vue や Nuxt で開発している場合状態管理に Vuex を使っているかと思います。 なので、今回は Vuex の概念や書き方については省略し僕が開発するときのルールを紹介します。

namespaced を true にしよう

namespaced を true にすることで、モジュールごとに自動的に名前空間が付与されます。 これがないと、複数のモジュールが同じミューテーション/アクションタイプに反応することができてしまい大きくなったときに破綻してしまうでしょう。

Nuxt で開発をしている場合、モジュールモードが上記の namespaced=true になります。

ja.nuxtjs.org

mapState を使わない

Vuex には mapGetters ヘルパーが存在します。 mapGetters はゲッターの評価後の値を返すコンポーネントの computed オプションを作成します。 Vuex の state を使いたい時に filter したりやなんらか変更したいというモチベーションは結構あると思います。 そのような理由から getters では state を加工しないデータも全て乗せ mapGetters で統一するとわかりやすくなって良いでしょう。

mapMutations を使わない

state を変更する唯一の方法はミューテーションです。 なのでコンポーネント内で直接 mapMutations を使ってミューテーションをコミットする方が結構いますが、 actions でミューテーションをコミットするのが良いでしょう。 そうすることでコンポーネント内で mapActions ヘルパーを使うだけでよくなりわかりやすくなりますし、管理が楽になります。

厳格モードにしよう

普通にルールにしたがってやってたらこれは本来しなくていいのですが、結構いろんなプロジェクトで state をミューテーションハンドラの外部で変更してるコードを見ます。 なのであらかじめ厳格モードにしミューテーションハンドラ外部で state を変更できないようにしましょう。

Nuxt で開発している場合デフォルトで厳格モードになっているので特に設定などはいりません。

ja.nuxtjs.org

state を全て Vuex に逃すのをやめよう

結構 Redux を書いている人は state を全て Vuex に逃しているのですがこれは store が肥大化したり助長でまわりくどくなりいいことはありません。 状態がコンポーネント内で完結するのであればそれはローカルステートに持たせましょう。

モジュールの切り方

以前はページ毎 Vuex のファイルを作成していたのですが、そうすると複数ページで共通する state がでてきて困りました。 今はドメインごとにファイルを作成するようにしています。 そうすることで、違うモジュールの state をいじる必要性は基本的にないでしょう。

以上が僕が Vuex を書く上でのルールです。 次に Component の設計について書いていきます。

Component の設計

Component を設計する上でよく耳にするのが「再利用性の高い」です。 僕は、Component を設計する上で再利用性はあまり考えないようにしてます。 まずはじめにその理由について書きます。

再利用性の高いコンポーネント

再利用性の高いコンポーネントを作る上で、3つのことが必要だと僕は思っています。

  1. 実装者の能力
  2. デザイナーの能力
  3. 時間

1に関しては言わずもがなだとは思いますが、実装者の能力がない場合依存性が高かったり等再利用性のあまり高くないコンポーネントになってしまうことが多いでしょう。

2は以外と頭にない人が多いのですが、これも大事です。 デザイナーはコンポーネント志向をまず理解している必要があります。次に過去・未来を考え再利用性ができるものは再利用ができるように設計しデザインをしなければいけません。

デザイナーが実装もできる人間であればこれらは当然頭にあると思うので問題ないと思うのですが、必ずしも上記をデザイナーができる必要があるわけではありません。 エンジニアと協業し、しっかりとコミュニケーションをとりやれば上記を満たすデザインができるでしょう。

3の時間は当たり前だろとは思うと思うのですが、口で言うほど再利用性の高いコンポーネントは簡単には作れないので思ってる以上に時間はかかるよという話です。 再利用性の高いコンポーネントを作る上で、コンポーネントの粒度・ロジックのシンプルさ等色々と考えることがあります。 なので時間はかかるものと考えるのが良いでしょう。

再利用性の高いコンポーネントを作る難しさはここまででわかっていただけたと思います。 本題の再利用性をあまり考えなくていいと考えている理由ですが、大きい理由としてはどうせ使わないというのがあります。

プロダクト開発をしている人であれば、割と経験あると思うのですが、再利用性を考えてコンポーネントを作り込んだは良いがその後デザインで使われることがなかってのはざらにあります。 そういうことを考えると再利用性の高いコンポーネントを作る難しさとコストを考えるとあまり再利用性はあまり意識しないほうが良い意思決定でしょう。

僕は2回から3回同じデザインがでてきたら切り離しコンポーネント化するようにしています。

次にコンポーネントを作るときに考えることを書いていきます。

コンポーネントを作る上で考えていること

僕は、コンポーネント作る上で以下3つを意識しています。

  1. コンポーネントの役割を考える
  2. 依存を少なくする
  3. なるべく状態を持たないようにする

コンポーネントの役割を考える

コンポーネント志向で開発をしている場合 Presentational Component と Container Component を耳にしたことあると思います。 基本的にコンポーネントはこの分類で考えましょう。

Presentational Component とは、View に特化したコンポーネントで、自身では状態は持ちません。 Presentational Component では、コンポーネントに閉じた状態を除き状態を持たず、props で渡ってきたデータを表示するようにします。

Container Component とは、Presentational Component にデータを渡したり、機能をもたせたりと子コンポーネントの振る舞いを定義していきます。

この2つで大枠分類して進めると状態管理とかでも悩んだり基本的にしないでしょう。 ただ例外も存在するとは思うのでその都度チームで話しあいルールを決めると良いかとおもいます。

Nuxt で開発する場合、僕は基本的にpages に Container の役割をもたせています。 コンポーネントに閉じていない状態やロジックや Vuex による操作は全て pages で行うようにしており、そうすることで pages からコンポーネントへ上から下に流れるようなイメージで開発が進められて良いです。 ただ、pages が肥大化する場合もあるのでそのような場合は Container Component を作成し、pages と Presentational Component の間に挟んでいます。

依存を少なくする

これは、再利用性にも関わってくる話です。 依存が大きいと再利用性もしずらくある一定の場所でしか使えなくなってしまうデメリットがあります。 そして依存が大きいコードはレビュアーのコストも上がります。 依存している箇所のコードを読みしっかりと理解していないと正しいレビューができないデメリットがあります。

なので、再利用性は考えなくてもいいですが、なるべく依存は少なくしましょう。 そうすることで、修正なども用意に行えます。

なるべく状態を持たないようにする

状態を持つということはそれだけでその状態に振り回される為依存が大きいということです。 状態をもたせるかどうか責務で考え、状態をもって良いか良くないかをしっかりと考えましょう。 ここまでを踏まえて考えれば状態を持つべきかどうかはわかるかと思います。

コンポーネントを作成する時は、しっかりとそのコンポーネントの責務などを考えて粒度やデータの持ち方を考えて作成しましょう。

さいごに

Vuex のルールや Componentの設計について書きましたがいかがだったでしょうか? 他にも考えていることはあると思うのですが、言語化できていないので今回はこれぐらいにしようかと思います。 状態管理やコンポーネントの設計は トライ&エラーを繰り返していくしか身につける方法はないと僕は考えています。 なので、いっぱい失敗して自分なりのルールを見つけられるようになりましょう。 この記事がどこかで役に立つと幸いです。

現在、back check チームでは、エンジニアの募集をしております。 僕と一緒にフロントエンドを朝まで語り尽くしたいフロントエンドエンジニアやレベルの高いフロントエンドチームと最高のプロダクトを作って行きたいサーバーサイドエンジニアは是非ご応募お願いいたいします!

www.wantedly.com

www.wantedly.com

SaaSのPdMが持つべき3つの考え方

はじめに

こんにちは、株式会社SCOUTERの開発責任者の小平(@ryotakodaira )です。 業務では、SARDINEという人材紹介会社向けの業務管理システムを開発しています。

SARDINEは月額課金型のビジネスモデルでユーザーに提供されれており、いわゆるSaaSと呼ばれるカテゴリのサービスとなっております。 弊社の場合は、人材紹介会社向けというかなり限定的なユーザーをターゲットにしているバーティカルSaaSとなっております。

バーティカルSaaSについてはこちらの記事で説明されています。

boxil.jp

基本的には自社で開発しているプロダクトを中心にお客様の課題を解決し、それを長期に渡ってご利用いただくことでビジネスが成り立っています。

前述の通り事業上プロダクトが中心にあるため、プロダクトマネージャーとしてそのプロダクトの方針を決定する役割のメンバーが必要になります。

プロダクトマネージャーはプロダクト開発のスペシャリストでありながらも同時に事業戦略を深く理解し、ビジネス課題の発見から解決といった期待役割を持つ非常に責任の範囲が広いポジションであり、そのポジションの広さ故、何を大切にしながら動けばよいのかがわからなくなってしまうこともあります。

僕自身そのような経験がありますが、その中でも今の自分を構成した常に持ち続けるべき考え方や姿勢を紹介していきます。

定量評価と定性評価のバランス感覚

ここで言う定量評価はデータによる評価、定性評価はユーザーや事業に関わる者の声としています。

データによる評価はプロダクトが 今どこにいてどういう状態なのか を測るためためには非常に有効になります。

最近はデータによる意思決定こそが重要という声を聞くことが多くなりました。僕自身それは間違ってはいないと考えております。 しかし、意思決定をするときにデータに頼りすぎるのも危険である場合もあるため定量と定性のバランスを大事にしています。

例えば、立ち上げフェーズなどではユーザー数もそこまで多くないため統計的に信憑性のあるデータが集まるまでには時間がかかる場合が多いですが、プロダクトマネージャーは事業戦略に基づいて意思決定をし続けなければなりません。そのときにデータによる定量評価や仮設を定性評価によって裏付けることでプロダクトを前に進めるようにしていました。

その後はデータによる定量的な評価を行うことができるように開発時に計測ポイントの定義とコードを仕込むことをやり続けるのがポイントです。

中長期を見据えた判断

よくプロダクトマネージャーはプロダクトにおけるCEOと言い表されることがあります。 僕自身プロダクトマネージャーというポジションをやってみてまさにその通りだと感じています。

更にプロダクトマネージャーは会社のCEOや経営陣ですら判断できないことについて意思決定する必要がります。 何がそれに該当するかというと、プロダクト開発における攻めと守りのバランスの判断です。

通常、プロダクトは事業が継続している限り常に開発が続き、時間と共にコードベースは大きくなっていくことでしょう。そしてその過程で生み出された技術的負債と今後ずっと付き合っていくこととなります。

立ち上げフェーズが終わったプロダクトは 短期的にビジネスをより伸ばすための開発長期的に安定的な成長を阻害しないための開発(技術負債の返済) の両方のバランスを取って開発案件の意思決定する必要がります。

この意思決定には事業戦略への深い理解とシステムの状態を正確に把握していることが前提条件となるため、プロダクトマネージャー以外には正しく判断することが出来ません。プロダクトマネージャーは短期〜長期を総合的に考え、一見遠回りになりそうな開発でも将来像からの逆算で判断する能力が必要となります。

プロダクトに対する姿勢

バーティカルSaaSのようなユーザーのビジネス課題を解決するためのサービスは一般的に開発チームのメンバーや自分自身がそのサービスのユーザーになることはないと思います。

しかし、プロダクトを中心に事業を展開している以上、事業に関するドメインの深い知識が求められます。自分に普段馴染みのない業種だっとしてもそれを自分ごとにとらえてソリューションの1つとしてプロダクト開発に落とし込むことをプロダクトマネージャーには求められます。

また、プロダクトマネージャーはプロダクトについて全責任を負い、言い訳をせずに失敗から学びそれを克服する姿勢が必要となります。

それと、反感を買うかもしれませんがプロダクトを成長させるために自分の全てをつぎ込むくらいの決意と姿勢があるくらいの方が個人的には良いと思っています。笑

まとめ

プロダクトマネージャーとは開発チームに属しながらもエンジニアやデザイナーとは全く違う視点が求められる不思議なポジションになります。

それでもプロダクト開発においては必ず必要なポジションで有ることは間違いなく、これという正解が無い中で開発チームに価値の高いを仕事をしてもらえるかはプロダクトマネージャーの手腕にかかっています。

責務範囲が広く大変なポジションではありますが、ユーザーにとって 最高の課題解決のソリューション となるプロダクトを創れる人が増えて欲しいですし、この記事から何か気づきを発見してもらえたら嬉しいと思っております。

最後に

事業・サービスが成長していくにあたって、これからもメンバーを増やしていきたいと思っています。

新規事業や既存事業の拡大も考えているため将来のPM候補も絶賛募集中です!

興味のある方は下記からご応募いただくか、@ryotakodairaにご連絡ください!!

www.wantedly.com

www.wantedly.com

www.wantedly.com

Vue.jsイベント修飾子.stopと.preventの使いどころ

こんにちは!SCOUTERでフロントエンドエンジニアをしている匠平です。 SCOUTERではフロントエンドをVue.js(Nuxt.js)で開発しています。

Vue.jsのイベント修飾子の使いどころがいまいち掴めていなかったので、簡単な事例を挙げて理解していきたいと思います。

Vue.jsのイベント修飾子

イベント修飾子は以下の6種類があります。

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
  • .passive

公式ドキュメント イベント修飾子

中でも使用頻度が比較的多い.stop.preventの使い方を見ていきましょう。

使い方と使いどころ

.stop

.stopはJavaScriptのstopPropagationを呼び出します。

現在のイベントのさらなる伝播 (propagation) を止めます。

MDN event.stopPropagation

Vue.jsのドキュメントには、親要素への伝搬を止める、とあります。Vue.jsのイベント修飾子.stopは、子要素のイベントが親のイベントを呼び出さない、ということを設定するわけですね。

<!-- クリックイベントの伝搬が止まります -->
<a v-on:click.stop="doThis"></a>

.stopの動作サンプル

サンプルとして、彼女の実家の呼び鈴モデルを作りました。

実家住まいの彼女の家に訪問するとき、なるべく彼女のお父さんには会いたくないですよね。そんなときにこのイベント修飾子.stopが有効です。

codepen.io

buttonタグを押すと、彼女がお出迎えするアラートが表示されます。2つのbuttonタグはいずれもお父さん(fatherクラスを持ったdiv)に囲まれていて、同じようにクリックイベントを持っています。過保護なお父さんなんですかね。

普通に呼び鈴を押してしまうと、彼女のあとにお父さんも出てきてしまいます。お父さんを呼び出さないよう彼女に伝えておきましょう。

buttonのクリックイベントに.stopを与えてあげると、見事父親ブロックを回避することができました。

子要素に.stopを与えることで、親要素への伝搬を止めるという動作です。実生活でも活用していきたいですね。

.prevent

.preventはJavaScriptのEvent.preventDefaultメソッドを呼び出します。

Event インターフェースの preventDefault() メソッドは、イベントが明示的に処理されない場合に user agent に、そのデフォルトアクションを通常どおりに行うべきではないと伝えます。

MDN Event.preventDefault()

.preventの動作サンプル

どのような場面で使うのか、こちらもサンプルで見ていきましょう。

codepen.io

フォームにテキストを入力してsubmit送信するとアラートが発動します。

上側のフォームで送信してアラートを閉じると、画面が更新されてフォーム内の文字列が消えてしまいます。これはそもそもsubmitがaction属性で画面遷移を想定しているからですね。

下側のフォームで送信してアラートを閉じても、フォームに入力した文字列はそのまま残ってるのが分かります。ここではフォームのsubmitに.preventを与えています。

意図しない画面遷移、画面更新を避けるため.preventが有効なんですね。

submitが成功したかどうかをモーダルやポップアップで表示したいことがあると思いますが、画面が切り替わって正しく動作しないことがあるので.preventが必要になります。

まとめ

.stop.preventは使用頻度が多いので、これらの動作をしっかり覚えておきたいですね。

この記事がお役に立てれば嬉しいです。

最後に

SCOUTER社では私たちと一緒に働く仲間を募集中です! ご興味のある方はぜひご応募ください!

www.wantedly.com

www.wantedly.com