はじめに

はじめまして。プロトソリューション ソリューション開発部沖縄の平良です。

SNSサービスの開発プロジェクトマネージャーをしています。また、人狼お兄さんです。

今回は私のストーリーをご紹介いたします。

入社までの略歴

前職はデザイナーをしており、沖縄の観光/レンタカー向け雑誌やポスター・パンフレット作成・カメラマン・インタビュー記事作成まで、何でもやってました。

締め切り直近で日付を跨いで作業をしていた中、先輩に仮眠を取ろうと言われて、段ボールを床に敷かれて「どうぞ!」と言われた時は、会社を色々変えなきゃいけないなと使命感を覚えたのは懐かしい記憶です。(段ボールベッドは寝心地良かったです)

ただ、前職のスキルが現職でも有効利用できることが多々あるので、経験には無駄がないと実感しています。

このような写真を撮ってました。加工無しです!沖縄の海は綺麗ですね〜

プロトソリューションに入社

当時iPhoneの波がきていて、様々なアプリを利用していく中で「デザインがいまいちだな〜」と感じて、生意気にもデザインもプログラムも1人でできれば最強になれるじゃん!と考えて、デザイン→ITという別業種へ挑戦しました。

前職より規模が大きい会社を体験したく、元々知り合いが働いている会社で、ちょうど市の教育事業が適用中で現場にいながら学べることに魅力を感じて入社しました。

実は1回目は落ちてて、2回目の挑戦で合格してます笑

(タイトルに使用している画像は入社1,2年目の頃にまだハロウィン文化がまだ根付いていない部署で1人だけコスプレしてました。怒られないかヒヤヒヤしながら出社したことを覚えています)

キャリアステップ(企画→テスター→ PG → SE → ITD → PM)

・企画者時代

入社直後、弊社で企画・運営していたアプリが大バズリし、社内にいながらチームが急拡大していく様子を感じられるのは貴重でした。

その様子に憧れて、チーム配属決まるか決まらないかの時期に、アプリ企画を社内募集していたので、10コくらいA4用紙1枚に企画を書いて応募し、アプリ企画チーム配属になりました。(選定基準が何だったのかはいまだにわかってないです笑)

企画チームの中でさらに企画を競い合った結果、敗北しました。その後、企画を続けていくか、開発者の道に進むかで、開発者の道を選択しました。

・テスター時代

テスト専門チームの存在と規模に驚きつつ、様々な観点や手法を元に戦術的に検証を行っていて、テストの深さを学びました。当時の経験が現在のシステム設計/問題抽出の観点に活用できていると実感します。

・PG〜SE時代

第1希望だったスマートフォン向けアプリ開発を担当しました。マンツーマンで一から十まで教えていただきながら、複数のアプリを横断しながら対応していき、1人前の開発者として成長できました。

当時「わからないことがあれば聞いてほしい」とよく言われていました。聞く前に自身で調べて調べてどうしてもわからなかったら聞くスタイルだったのですが、粘り過ぎてよく思考の迷宮に陥ってました。

今でもその癖がちょこちょこ出てきたりするのですが、助けを求めれば多くの仲間が助けてくれますので、かなり意識的に頼るようにしています。

・(ITD)開発ディレクター時代

お客様との関係が構築でき、自身の裁量で案件が進めることができるようになって、提案ベースで開発を行っていきました。

一生懸命作ったシステムがユーザーに満足してもらえているのかが気になり、マーケティング手法もわからず、自分なりにアプリストアのユーザーレビューやSNSのコメントをエゴサーチしてみたりしながら、開発案件を決めてリリースし、アクセス解析で効果を測ることを意識して行うようになっていきました。

・(PM)開発プロジェクトマネージャー時代 (コロナ禍へ突入)

挑戦してみないか?と声をかけていただき、改めて自身のキャリアを考えました。ごりごりの開発者ではなく、もっとサービスに深く関わっていきたいと考え、新しいポジションへ挑戦しました。キャリアが上がっていく度に視野が広く・視座が高くなっていることを実感しています。

挑戦した矢先にコロナ禍に突入し、仲間がPCの中にしかいない状況になりました。初めてのポジションで多くの不安を覚えましたが、配属直後に在宅勤務になったため、リアルでコミュニケーションをとっていたチームよりは、スムーズにコミュニケーション再設計ができたと思います。

サービスをより大きくグロースできる方法を常に考えながら、いつも相談を積極的にしてくれるメンバーに支えられつつ、日々奮闘しています。

メンバーとビデオ中どこを見たら良いのかわかっていない当時の私

・寄り道

ふと、漠然と外国の友達が欲しくて、ワーキングホリデーを斡旋している会社へ説明を聞きに行きました。

担当者が面白い方で、目的を聞かれて開口一番に「行かない方がいい」と言われました。目的がハッキリしないまま、環境を変えても上達は望めないし、友達なら沖縄でも作れるでしょと。オンラインでも。その辺の店でも。

その後しばらくして、外国人の方が入社してきて一緒に肩を並べて仕事をすることになり、お互いに英語⇄日本語を教え合う中になりました笑

ちなみに「外国人の女性が好きだから、口説き落としたいけど、英語がわからないから勉強したい。」が目的でワーキングホリデーを利用した方は、英語力がメキメキ上達したようです。内容はどうあれ目的意識の大切さを実感しました。

今やっていること

開発プロジェクトマネージャー担当としてお客様とものすごく近い立ち位置で仕事をさせていただいています。サービスとしてまだまだ成長段階で、開発だけでなくユーザー分析も並行で行っています。ちょうど本記事作成中に、お客様の推し案と私の推し案で、UI対決を行っている最中です笑

また、社内交流も兼ねて人狼をやっています。人狼初心者の方でも安心して楽しめるよう演出と環境作りを心がけておりますので、興味があればお声かけください!🐺わおーん

人狼会の様子。右下の人狼アイテムは知り合いのデザイナーに自費で作ってもらいました。

今後やりたいこと

開発だけでなく、同じ方向を向いて切磋琢磨できる仲間と共に、サービス全体を動かしていきたいです。プロトソリューションは多種多様な業種とつながりがあるため、外から見えている以上に様々なことに挑戦できるチャンスがあると思います。

あと、休日に愛用しているCYCYの全ステーション制覇をしたいです。

あと、コロナが落ち着いたらまた社内外でも人狼イベントを定期開催したいです。

あと、小学校の卒業文集で将来の夢として書いた、タスマニア島へ行ってみたいです。

あと…etc…

12月の社内インタビューで語ったことをそのまま記載させていただきました…!!

最後に

私は新人さんが大好きです。この世にまったく同じ人はいません。なので今までいなかった新しい考えを持っている方と話をするだけでワクワクが止まりません!

一緒にワクワクしましょ〜

最後までお読みいただき、ありがとうございました。

プロジェクトマネージャー

プロジェクトマネージャー

沖縄本社では、一緒に働くプロジェクトマネージャー、リーダーを募集しています

AIエンジニア、システムエンジニア、その他多数募集中!

こんにちは!こんばんは!プロトソリューション 技術広報の川満です!
今回の記事は先日12/18に開催された「Tech BASE Okinawa(テックベースオキナワ)」のレポートを参加者目線で投稿させて頂きます!
※弊社が運営している「CODE BASE OKINAWA」は主催団体として参加しています!

Tech BASE Okinawaって??

新しい技術の学びを体験できる、沖縄最大級のエンジニア向けTechイベントです!これからエンジニアを目指す方・学生の方もお楽しみ頂けてる内容になっており、沖縄でトップエンジニアとして活躍されている方々からのトークセッション・参加者によるLT大会など様々な催しが開催されていました!

※詳しくはイベント情報へ

資料はこちらから

Session1

UZABASE 小副川 健さん
事業と共に育てる機械学習システムのこれまでとこれから

Session2

株式会社Alpaca Lab 松井 豊さん
日本一の禁煙アプリをつくっちゃった件

Session3

UZABASE 矢野 勉さん
プログラミング言語とシステムデザイン – Clojure, Java, DDD, Clean Architecture

Session4

株式会社プロトソリューション 比嘉 由紀さん
プログラム未経験の私がプログラミングと出会って人生激変した話

Session6

UZABASE 小玉 祐輝さん
Webアクセシビリティを身近にする

Session7

株式会社プロトソリューション レッティグ・セバスチャン・ペーターさん
サーバーレスアプリケーションの開発とデプロイ
IaCを含む、スマートな環境構築の旅

Session8

株式会社Alpaca Lab 棚原 生磨さん
起業&スタートアップで働くという選択肢

Session9

ちゅらデータ株式会社 真嘉比 愛さん
国内におけるAIの最先端事例紹介 〜2022年のトレンド予想を添えて〜

Session10

沖縄科学技術大学院大学(OIST)船井 正太郎さん
一人一人に寄り添う文章が書けるAIを目指して

Session11

株式会社 クアンド 西 孝幸さん
クラウドで手軽に始めるモダンなモニタリング

LT-1

CBcloud株式会社 新垣 雄志さん
データ指向プログラミング(仮)のススメ

LT-2

サイボウズ株式会社 西原翔太さん
草の根 IT コミュニティに着目した新しい郷土資料
流氷交差点



見所

Keynote Speech(基調講演)には和田卓人さんにご登壇頂きました!
企業の技術顧問を担当されており、テスト駆動開発の第一人者でソフトウェア開発に関わる書籍の執筆・監修もおこなっているTech業界を代表される方です!

他にもテックリードエンジニアの方や経営者の方も多数登壇されました!

Keynote

メインイベントのKeynoteが始まりました~!登壇者は前述で紹介させて頂いた和田卓人さん!
テーマは「堅牢なコードを書く – 例外、表明、契約による設計」です!
※大きな会場ですがほとんど席が埋まってますね・・・!

今回のテーマで重要な部分としてはコードの内側から品質をあげていこう。という点となり、

賢明なソフトウェア技術者になる為の第一歩は、動くプログラムを書くことと正しいプログラムを適切に作成することの違いを認識すること -M.A.Jackson(1975)-

引用コメントにある違いを埋める為にはどのような設計が必要なのか?というお話を以下3つのパートに分けてお話頂きました!

第1部:予防的プログラミング

処理の失敗は色々な原因が考えられるが、特に多いのがコードの使い方を誤った形で設計するという部分なのでそこに着目し、失敗しにくいコードを作る必要がある。その為には正しい予防的プログラミングの知識を身に着ける必要があるが、意外と誤った認識をお持ちの方が多いとの事・・・!

・プログラミングに対して防御的になること、つまり「そうなるはずだ」と決めつけないこと
・予防的プログラミングの根底にあるのは、他のコードのせいで不正なデータがあったとしても
 影響を受けないようにすること

上記は登壇されて際におっしゃっていた予防的プログラミングについてのコメントです!
確かに他に影響を受けないという観点は凄く大切だと思いますし、心理的なバイアスがかかって「だろう」的な考えで進めてしまう事は誰しもがあるはず・・・!勉強になります!!



第2部:攻撃的プログラミング

攻撃的プログラミング = 早めにクラッシュさせるような作りにする
・障害を抱えて中途半端に動いているプログラムよりも死んだプログラム方がダメージが少ない
・「あり得ない」何かが発生した際にプログラムは実行可能なもの(要望を満たせない)ではない
上記が定義となり、正当性堅牢性のバランスが大事でクラスは正当性を重視し、アーキテクチャ/フレームワーク等で堅牢性を保証する事をおススメされていました!
正当性=確からしさ。不正確な結果を返すぐらいなら何も返さない方がよい
堅牢性=不正確な結果を返しても動き続ける

第3部:契約プログラミング

このパートも凄く響きました・・・!

不具合や欠陥を減らすために間違えにくい設計していく。但し一人一人が予防のみに固執してしまうと周りのメンバーを信用できなくなり、重複した作業が発生する事で内部品質(可読性や変更容易性)が下がってしまう。

これは恐ろしい。。。ですがありがちなのかなっと思いました。。
こちらについてのアクションは「誰が予防的or攻撃的プログラミングを担当する?何をやるべきか?を決め(信じる)契約による設計で要求されたこと以上・以下の事を行わない。」という事でした。
何事も自身と他者の役割を理解し、責任をもって業務に臨むことが大切なんだな。と強く思いました!!



Keynoteまとめ

予防的プログラミングで間違えにくいコードを書き、それでも障害が発生した場合を想定して攻撃的プログラミングの観点で早めにクラッシュ(影響を拡大させない・障害を早めに検知)させてしまおう!
但しきちんと自身・他者の役割を理解し、責任をもつ事が大切である!という所をしっかり意識していきたいと思えるとても身になる内容でした!

各Session

Keynoteも終了し、お昼は美味しいお弁当も頂けて満足★ご馳走様でした!!
午後もためになるセッションが目白押しです!!!

Session1

登壇者:UZABASE 小副川 健さん 
「事業と共に育てる機械学習システムのこれまでとこれから」
教師データに関する課題克服の体験談やこれから挑戦される目標を惜しげもなく発表されており、
今後機械学習システムを取り入れる際には要チェックだなと感じました!

Session2

登壇者:株式会社Alpaca Lab 松井 豊さん 
「日本一の禁煙アプリをつくっちゃった件」
強い信念に圧倒されましたし、アプリを作る上で大切な考え方を学ばせて頂きました!
エンジニアとしてはもちろん、人としても尊敬出来る温かい方でした!!

Session3

登壇者:UZABASE 矢野 勉さん
「プログラミング言語とシステムデザイン-Clojure,Java,デザインパターン,DDD,CleanArchitecture-」
言語毎の種類や特徴の違いについて発表して頂きました!凄い人の数・・・!

Session4

登壇者:プロトソリューション 比嘉 由紀さん
「プログラム未経験の私がプログラムと出会って人生激変した話」
プログラミング未経験の方にも希望を与え、現役の方も共感できる発表内容でした!
堂々と発表されてて、めっちゃかっこよかったです!!

Session5

登壇者: 株式会社 Solafune 光武 亨さん
「衛星データで地球をハックせよ!」
地球上のあらゆる事象をソフトウェアで制御可能にする。というMissionにロマンを感じました!

Session6

登壇者:UZABASE 小玉 祐輝さん
「Webアクセシビリティを身近にする」
プロダクトのアクセシビリティを高める為の施策や考え方を発表して頂きました!
私自身アクセシビリティに対して意識する機会が少なかったので勉強になりました!

Session7

登壇者:プロトソリューション レッティグ・セバスチャン・ペーターさん
テーマ「サーバーレスアプリケーションの開発とデプロイIaCを含む、スマートな環境構築の旅」
最先端の技術を用いた環境構築の方法を発表されていました!皆様、興味深々!!

Session8

登壇者:株式会社Alpaca Lab 棚原 生磨さん
テーマ「起業&スタートアップで働くという選択肢」
企業立ち上げの経験談をお話頂けて、これから起業を目指している方にはぴったりな内容でした!
実績を出す為の取り組み内容がとても勉強になりました!AIRCLE私も使ってます!!

Session9

登壇者:ちゅらデータ株式会社 真嘉比 愛さん
テーマ「国内におけるAIの最先端事例紹介~2022年のトレンド予測を添えて~」
AIビジネス導入に関する課題や責任、最先端事例が聞けて難しい問題もありますがワクワクする内容でいっぱいでした!

Session10

登壇者:沖縄科学技術大学院大学(OIST)船井 正太郎さん
テーマ「一人一人に寄り添う文章が書けるAIを目指して」
文章を数値化し、学習させたAIがアウトプットした内容を人に理解させる事が出来るか?という実験結果や現在挑戦されている実験内容を発表されていて、QAエンジニアの私としては検証に近い実験のお話だったので興味深い内容でした!

Session11

登壇者:株式会社 クアンド 西 孝幸さん
「クラウドで手軽に始めるモダンなモニタリング」
マイクロサービス普及に伴う課題への取り組み内容をお話して頂きました!学ぶべき部分が多かったです!



参加者LT

全てのSessionが終わりまして(登壇者の皆様お疲れ様でした!!)、続いてはLT大会に移ります!

まずはCBcloud株式会社の新垣 雄志さんです!データ構造に着目した観点での発表でした!

続いてお二人目!UZABASE 二木 拓也(にっきー)さんです!
テスト駆動開発を認知~実践する中での気づきを発表して頂きました!

最後の登壇者の方です!サイボウズ株式会社 西原翔太さんです!
圧倒的な宣伝力でコミュニティのご紹介をされていて、聴き入ってしまいました!!

LT登壇者の皆様、本当にお疲れ様でした!!!



パネルディスカッション

続いてが最後の催し、パネルディスカッションです!!みんなで「沖縄テックの未来シナリオを考えよう!
画像左側から・・・・
<モデレーター>
株式会社Link and Visible 豊里 健一郎さん
<パネラー>
プログラマー テスト駆動開発者 和田卓人さん、沖縄科学技術大学院大学(OIST) 船井 正太郎さん
UZABASE 林 尚之さん、プロトソリューション 仲濱 政治さん

テーマ①「多様化するエンジニアの働き方」

やはりお話の中心はコロナ禍に対する影響ですね!フルリモートへの切り替えはスムーズに行えており、海外やフリーランスのエンジニアの方とお仕事する機会は増え、通勤時間・移動費用が無くなった等のプラスの話題もありますが、コミュニケーションに関しての課題があり、出社する機会も作る等の工夫をされている方もいるようです!
コミュニケーションのコツという所で、GatherVirbela等のバーチャルオフィス空間のサービスを利用されているなんてお話もされてて使ってみたいなーと思いました!

他にもテキストコミュニケーションのハードルを下げる(考えて文字を打たせない)文化を作る事で生の声を聞き取れる事が出来るようになる。絵文字を増やして感情のリアクションのバリエーションを増やすのもあり。というお話が出ており、凄く共感しました!※私もチームメンバーに対して出来るだけテキストコミュニケーションのハードルを下げられるように意識している。

テーマ②「これから活躍するエンジニアに求められること」

まず、沖縄IT産業の年間売上高は年々右肩上がりになっているが全国の労働生産性の順位としてはワーストになっているようです。。※悲しい
そういう背景も含め、県内で求められる人材像のアンケートを取った所以下の人材が上位に入っているようです!

・システム全体を俯瞰して思考できる人材
・上流工程の技術力を持つ人材
・最新技術を持つ人材

また県外の方から見ると沖縄のエンジニアはしっかり仕事をしてもらえるイメージがあり、可能性を感じているという声もありました!※素直にうれしい♡

Tech系のコミュニティに積極的に参加していき、求められる人材に近づきたいと思いました!

テーマ③「沖縄の未来をどう描いていく?」

コロナの影響でどこにいてもプログラミングが出来る状況が整備されており、沖縄という土地は魅力的だと思うので未来は明るい(人が集まりやすい)!ただ技術の教えを乞う(誰に聞けばよい?)機会が土地柄的に少ないのでコミュニティに積極的に参加し師匠(教えを乞える人)を見つけたり、技術を磨いていく必要はある。という話題で盛り上がっていました!土地の魅力に甘えず、自立性をしっかりと上げていこう!!



最後に

ディスカッションQ&Aも盛り上がりつつ、Tech BASE Okinawa の全プログラムが終了しました!
最初から最後まで勉強になりっぱなしでした!!参加応募総数も200名以上になり、大成功で終了しました!

今回このようなイベントに開催出来た事は沖縄全体に良い影響を与えられたのではないかと思います!
そして本イベントに参加された方はもちろん、運営チームの皆様本当にお疲れ様でした!!
次回の開催をお楽しみに!!!!

はじめまして。プロトソリューション AIテクノロジー推進室の新垣佑樹です。
ラクネコのカスタマーサクセスを担当しています。
今回は私のストーリーをご紹介いたします。

新卒採用でプロトソリューションへ入社

私は沖縄のIT系専門学校を卒業後、新卒でプロトデータセンター(現・プロトソリューション)へ入社しました。

高校卒業後、大学進学を考えていましたが当時は行きたい学部が無く、仕事するならIT系?Web?と漠然としたイメージがあったのでIT系の専門学校へ入学しました。

就職活動の際、いくつかピックアップした企業の中に高校生の頃から眺めていたグーネットを発行しているプロトコーポレーションのグループ会社である株式会社プロトデータセンター(現・株式会社プロトソリューション)があり、ご縁に感謝しつつ就職を決めました。

入社当時はテストチームで教育を行っていて、サービスや会社の業務知識を学びながらWebやスマートフォンアプリのテストを担当しました。

その後、Web開発チームへ移動し、様々な案件を通じてPGからPL/PMまで経験しました。

沖縄から東京へ

入社から半年が経過したころWeb開発チームに移動した私に東京出張の話を頂きました。

大型の基盤システムのリプレイスがあり、東京のベンダー企業へ入り込んで武者修行するという話でした。

高校生の頃から吟味していた車の納車待ち…友達いない…東京の人怖い…

でもこのように大きなプロジェクトに携わる機会は無さそう。なんとかなる…!

というようなことを数秒考え、東京出張を決意しました。

(車は父も好きな車で嬉しそうに乗り回してくれたので、少し親孝行ができました。笑)

東京ではたくさんの方にお世話になりました。

今思い返してみると引くほど激務だったのですが、当時は「何がなんやら。この人達について行くしかない」という事だけを考えていました。複数のベンダーが集結し開発していたプロジェクトですが、そんな中でも開発者間の助け合いや、重たい課題をどう乗り越えるか、深夜まで続く話し合いは今でもいい経験だったと感じます。

そのプロジェクトもなんとかゴールすることができ、エンジニアの底力を目の当たりにしました。

ラクネコのカスタマーサクセスと今後について

Webサービスで様々な案件を経験した後、現在はラクネコという自社サービスのカスタマーサクセスを担当しています。

▼ラクネコに関してはこちら▼

一般的にカスタマーサクセスとは、サービスを通じお客様の課題を解決し、お客様を成功に導くことをミッションとしています。(イメージ:ラクネコで受付コストを削減→お客様は浮いたコストを別のところに投資→”お客様の事業活性化”)

ラクネコは今とても勢いに乗っており、ありがたいことに日々、導入頂く企業数が増えています。

“受付”ということもあり業界を縛らず、一般の企業だけでは無く、工場や美容室など様々な業界で利用が始まっています。

ラクネコを担当する以前(Webの開発を担当していた頃)は、要望をもとに作り上げることに重きをおいていましたが、カスタマーサクセスを担当し、どうやってサービスが活用されているのかを考えるようになりました。

提供する側が思いつかないような使い方をお客様がイメージしている事もあり、また、ラクネコを良くする為のヒントも多くあります。

要望やイメージを吸い上げ、サービスを良くする。サービスを利用しお客様の課題が解消され、よりお客様が事業を良くする。

私自身まだまだ未熟ですが、こういった循環をイメージしながらカスタマーサクセスができれば理想的と考えてます。

最後に

今回はざっくり私の経歴と今の役割について紹介させて頂きました。

また機会があれば、要所を絞って学んだことや経験談を紹介できればと思います。

プロトソリューションでは多くの事業を行っています。その為、隣を見れば全く違うことをやっていたり、幅広く対応しているオールラウンダーもいれば、専門性に特化して1つのことに集中している人もいます。

多種多様な人が集まっている会社だと思うので、他のストーリーも見て頂き、少しでも興味を持った方は応募いただけると嬉しいです!

最後までお読みいただき、ありがとうございました。

はじめに

前回のブログ記事では、FastAPIで画像内容を判定できるAPIを作成しました。そのAPIは、CloudFormationのテンプレートでAWS LambdaとElastic Beanstalkにデプロイしました。

今回のブログ記事では、AWS CodePipelineを使ってCI/CDプロセスを実装することで、そのAPIのデプロイを自動化します。

自己紹介

私はアダムと申します。PROTO SolutionのAIテクノロジー推進室で機械学習/深層学習のシステムやプロトタイプを開発しております。

主な仕事は、TensorFlowを使った深層学習モデルの開発と、それらを使ってAmazon Web Services (AWS)にデプロイできるAPIやバッチアプリケーションの開発です。

CI/CDとは

Continuous Integration (CI)

Continuous Integrationとは、開発者が行った変更をソースリポジトリのメインブランチに可能な限り頻繁にマージすることです。

これにより、ソースコードを結合する時間が短縮され、リリース前に他の開発者のアプリケーションの変更をマージすることで発生する問題を軽減することができます。

開発者がコードをメインブランチにマージするたびに、自動ユニットテストや統合テストが実行され、自動的にテストされます。

Continuous Delivery/Deployment (CD)

Continuous Delivery/Deploymentとは、アプリケーションの変更をテスト環境や本番環境に自動的にデプロイするプロセスです。

このプロセスのすべてのステップが完全に自動化され、人の介入を必要としないのが理想です。

ただ、CI/CDの導入する前に下記の導入も重要だと考えています。

●新機能を別々のブランチで開発し、リリースのためにメインブランチにマージするワークフローです。
●ビルドおよびデプロイメントパイプラインのさまざまな段階で実行可能な自動テストです。
●クラウドサービスを使用している場合、アプリケーションが実行されるインフラが自動的に立ち上がる方法です。
●インフラにアプリケーションを自動的にデプロイする方法です。
●新しいカラムの追加や参照データの挿入など、データベースの変更を管理するための自動化されたプロセスが存在することも理想的です。

CI/CDに向けたAWSサービス

AWSでは、CI/CDパイプラインを実装するための様々なサービスが提供されています。以下に主なサービスを紹介します。

AWS CodeCommit

CodeCommit は、AWSにホストされているGitリポジトリです。GitHubのようなサービスです。

AWS CodeBuild

CodeBuild は、ソースコードをコンパイル・ビルド・テストできるAWSのサービスです。

AWS CodeDeploy

CodeDeploy は、CloudFormation、ECSとLambdaに向けたデプロイメントのサービスです。Blue/Green デプロイなど機能を提供しています。

AWS CodePipeline

CodePipeline は、ビルドとデプロイのプロセスの全体的なフローを定義します。

CI/CDフローの実装

先に紹介したAWSサービスを使ってCI/CDのフローを実装します。

プロジェクトの要件に応じて必要なステップと技術が異なる場合もあると思いますが、CI/CDのフローは最低限でも下記に載っているステップが必要だと思います。

1,開発者は、ソースコードをCodeCommitにpushします。
2,CodePipelineは、CodeCommitのソースコードが更新されたたびに、最新のソースコードを取得します。
3,CodePipelineは、CodeBuildにソースコードを渡します。CodeBuildは、ソースコードをテスト・パッケージし、ECRにアップロードし、タグを付けます。アップロードしたイメージのURIをアウトプットします。
4,CodeCommitにあったCloudFormationテンプレートを実行します。最新のイメージをデプロイするために、CodeBuildで作成したイメージのURIにCloudFormationテンプレートのURIパラメーターを書き換えます。CloudFormationで開発環境のリソースをデプロイします。
5,承認を得るまで待ちます。
6,承認された場合、ステップ4と同じように本番環境のリソースをデプロイします。

サンプルコードには含まれていませんが、以下のタスクをフローに追加することを強く勧めます。

●自動ユニット・インテグレーションテストの追加
●デプロイ後、APIへの自動システムテストの追加
●Gitにビルドに使ってたソースコードにタグを付けます
●コード静的分析、コードカバレッジのレポート生成

これらのタスクのどれかが失敗したり、コードが一定の品質レベルを満たしていない場合、ビルドは停止します。

CodePipelineの構築

このフローを実現するために、フローのステップをCloudFormationのテンプレートで定義します。

CloudFormationのテンプレートでCI/CDフローに必要なAWSリソースを見てみましょう。

ユーザーが入力可能なパラメータ

ユーザーが入力可能なパラメータを定義しましょう。このような情報をパラメータとしてテンプレートに入れることで、テンプレートを変更することなく、他のプロジェクトで再利用することができます。

ほとんどのリソース名をApplicationName (アプリケーション名)のパラメータに基づいて決定します。また、ソースコードを取得したいブランチや、DockerイメージをアップロードしたいECRリポジトリの名前を指定できるようにします。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ApplicationName:
    Default: SampleApi
    Type: String
    Description: Enter the name of your application
  CodeBuildImage:
    Default: 'aws/codebuild/standard:4.0'
    Type: String
    Description: Name of codebuild image to use.
  BranchName:
    Description: 'The name of the branch to deploy from.'
    Type: String
    Default: 'main'
  ImageRepository:
    Description: 'The name of the ECR repository where images are stored.'
    Type: String
    Default: 'test'

CodeCommitリポジトリ作成

ユーザーが入力したApplicationNameの元にリポジトリの名前を設定し、作成します。

SourceRepository:
 Type: 'AWS::CodeCommit::Repository'
 Properties:
   RepositoryName: !Ref ApplicationName
   RepositoryDescription: !Sub 'Source code for ${ApplicationName}'

CodeBuildのジョブ

Dockerイメージをビルドし、ECRにアップロードするためにCodeBuildのプロジェクトを作成します。

こちらに設定された環境変数はビルドのコンテナ内でアクセスできます。

AppPackageBuild:
 Type: 'AWS::CodeBuild::Project'
 Properties:
   Artifacts:
     Type: CODEPIPELINE
   Environment:
     ComputeType: BUILD_GENERAL1_SMALL
     Image: !Ref CodeBuildImage
     Type: LINUX_CONTAINER
     PrivilegedMode: True
     EnvironmentVariables:
       - Name: REPOSITORY_NAME
         Value: !Ref ImageRepository
       - Name: AWS_DEFAULT_REGION
         Value: !Sub '${AWS::Region}'
       - Name: AWS_ACCOUNT_ID
         Value: !Sub '${AWS::AccountId}'
   Name: !Sub '${ApplicationName}Build'
   ServiceRole: !GetAtt
     - CodeBuildRole
     - Arn
   Source:
     Type: CODEPIPELINE


buildspec.yaml

デフォルトでは、CodeBuildのプロジェクトは、buildspec.yamlというファイルの中のコマンドを実行して、アプリケーションをパッケージします。このファイルの内容を説明します。

version: 0.2
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - ECR_URL=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      - REPOSITORY_URI=$ECR_URL/$REPOSITORY_NAME
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URL
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - BUILD_TAG=$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
      - BUILD_LABEL=build-$BUILD_TAG

ビルドの事前準備です。ECRのリポジトリにログインし、ビルドの番号を作成します。次のステップにこれを使う予定です。

  build:
  commands:
    - echo Build started on `date`
    - echo Building the Docker image...
    - docker build -f Dockerfile.lambda -t $REPOSITORY_URI:latest .
    - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$BUILD_LABEL
    - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$COMMIT_HASH
    - printf '{"ImageUri":"%s"}' $REPOSITORY_URI:$BUILD_LABEL > image.json
    - cp deploy/lambda.yaml deploy.yaml

buildspec.yamlの主要部分です。Dockerのイメージにソースコードをパッケージします。イメージにバージョンのタグを付けます。最後にイメージURIをファイルにアウトプットします。

  post_build:
  commands:
    - echo Build completed on `date`
    - echo Pushing the Docker images...
    - docker push $REPOSITORY_URI:latest
    - docker push $REPOSITORY_URI:$BUILD_LABEL
    - docker push $REPOSITORY_URI:$COMMIT_HASH
artifacts:
files:
  - image.json
  - deploy.yaml

ビルド後の処理です。DockerのイメージをECRにアップロードします。CodePipelineでの次のステップに利用するファイルをartifactsに指定します。

CodePipeline

こちらからCodePipelineのフローを定義します。まずは、CodePipelineの名前と必要なRoleを設定します。

  AppPipeline:
  Type: 'AWS::CodePipeline::Pipeline'
  Properties:
    Name: !Sub '${ApplicationName}Pipeline'
    ArtifactStore:
      Type: S3
      Location: !Ref ArtifactBucketStore
    RoleArn: !GetAtt
      - CodePipelineRole
      - Arn

StagesのところにCodePipelineのステップを定義します。

最初のステップは、CodeCommitからソースコードを取得するステップです。

      Stages:
      - Name: Source
        Actions:
          - ActionTypeId:
              Category: Source
              Owner: AWS
              Version: 1
              Provider: CodeCommit
            Configuration:
              BranchName: !Ref BranchName
              RepositoryName: !GetAtt
                - SourceRepository
                - Name
            OutputArtifacts:
              - Name: SourceRepo
            RunOrder: 1
            Name: Source            

その次のステップは、以前に定義されたCodeBuildのプロジェクトを参照し、ソースコードをビルドするステップです。

CodeBuildがビルドした成果物(DockerイメージのURIとCloudFormationのテンプレート)がBuildArtefactsに保存されています。それは次のステップに参照できます。

        - Name: Build
        Actions:
          - InputArtifacts:
              - Name: SourceRepo
            Name: CodeBuild
            ActionTypeId:
              Category: Build
              Owner: AWS
              Version: 1
              Provider: CodeBuild
            OutputArtifacts:
              - Name: BuildArtefacts
            Configuration:
              ProjectName: !Ref AppPackageBuild
            RunOrder: 1

CloudFormationのテンプレートで開発環境デプロイに向けた変更セット(Change Set)を作成します。

変更セット(Change Set)では、テンプレートが実際に実行される前に、どのリソースが作成、変更、削除されるかを確認することができます。

デプロイする前に先ほどECRにアップロードしたDockerイメージのURIをCloudFormationのテンプレートに書き換えます。デプロイするテンプレートのパスは、BuildArtefactsに保存したCloudFormationのテンプレートに設定します。

        - Name: Development
        Actions:
          - ActionTypeId:
              Category: Deploy
              Owner: AWS
              Version: 1
              Provider: CloudFormation
            InputArtifacts:
              - Name: BuildArtefacts
            Name: CreateDevelopmentChangeSet
            Configuration:
              ActionMode: CHANGE_SET_REPLACE
              ChangeSetName: !Sub '${ApplicationName}DevelopmentChangeSet'
              RoleArn: !GetAtt
                - CFNDeployRole
                - Arn
              Capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
              StackName: !Sub '${ApplicationName}DevelopmentStack'
              TemplatePath: 'BuildArtefacts::deploy.yaml'
              ParameterOverrides: |
                {
                  "ImageUri": {"Fn::GetParam": ["BuildArtefacts", "image.json", "ImageUri"]}
                }
            RunOrder: 1

次に、前のステップで作成した変更セットを実行し、実際に開発環境へのデプロイを行います。

            - RunOrder: 2
            ActionTypeId:
              Category: Deploy
              Owner: AWS
              Version: 1
              Provider: CloudFormation
            Configuration:
              StackName: !Sub '${ApplicationName}DevelopmentStack'
              ActionMode: CHANGE_SET_EXECUTE
              ChangeSetName: !Sub '${ApplicationName}DevelopmentChangeSet'
              OutputFileName: StackOutputs.json
            Name: ExecuteChangeSet
            OutputArtifacts:
              - Name: AppDeploymentValuesDevelopment

開発環境へのデプロイが完了したら、次は本番環境に同じパッケージしたイメージをデプロイします。

開発環境のように変更セットを作成し、DockerイメージのURIをCloudFormationのテンプレートに書き換えます。

        - Name: Production
        Actions:
          - ActionTypeId:
              Category: Deploy
              Owner: AWS
              Version: 1
              Provider: CloudFormation
            InputArtifacts:
              - Name: BuildArtefacts
            Name: CreateProductionChangeSet
            Configuration:
              ActionMode: CHANGE_SET_REPLACE
              ChangeSetName: !Sub '${ApplicationName}ProductionChangeSet'
              RoleArn: !GetAtt
                - CFNDeployRole
                - Arn
              Capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
              StackName: !Sub '${ApplicationName}ProductionStack'
              TemplatePath: 'BuildArtefacts::deploy.yaml'
              ParameterOverrides: |
                {
                  "ImageUri": {"Fn::GetParam": ["BuildArtefacts", "image.json", "ImageUri"]}
                }
            RunOrder: 1

本番デプロイが行われる前に、チームリーダーなどの承認が得られるまでデプロイを停止する承認ステップを追加します。 このステップでは、変更セットが実際に実行される前に変更セットの詳細を確認することができます。

            - Name: DeploymentApproval
            ActionTypeId:
              Category: Approval
              Owner: AWS
              Version: 1
              Provider: Manual
            Configuration:
              NotificationArn: !Ref ApprovalTopic
              CustomData: 'Please approve the change set to allow deployment.'
            RunOrder: 2

最後のステップでは、実際に本番環境にデプロイを行ないます。

            - Name: ExecuteChangeSet
            ActionTypeId:
              Category: Deploy
              Owner: AWS
              Version: 1
              Provider: CloudFormation
            Configuration:
              StackName: !Sub '${ApplicationName}ProductionStack'
              ActionMode: CHANGE_SET_EXECUTE
              ChangeSetName: !Sub '${ApplicationName}ProductionChangeSet'
              OutputFileName: StackOutputs.json
            OutputArtifacts:
              - Name: AppDeploymentValuesProduction
            RunOrder: 3

テンプレートの残りの部分は、CodePipelineとCodeBuildのプロジェクトに権限を付与する周りです。

こちらにテンプレート全体を確認してください

Code Pipelineのデプロイ

先に定義したCode Pipelineのテンプレートを実行するには、以下の手順を行います。

1,CloudFormationのコンソールを開きます 。
2,利用したいリージョンを選択します。
3,Create Stack With new resources (standard) 「スタックの作成 (新しいリソース)」を選択します。
4,テンプレートファイルのアップロードを選択します。
5,deploy/pipeline.yamlのパスを入力します。(Next)「次へ」をクリックします。
6,テンプレートに必要なパラメータを入力します。
1,Stack Name。 今から作成するスタックの名前です。例:「ImageNetPipeline」。
2,ApplicationName。アプリケーションの名前です。多くのCodePipelineに入っているリソースはこの名前の元に作る予定です。
3,BranchName。どのブランチからソースコードを習得します。
4,ImageRepository。ECRのリポジトリの名前です。
7,(Next) 「次へ」をクリックします。
8,画面下部のチェックボックスをすべてチェックします。
9,(Create Stack)「スタック作成」をクリックします。



初めてのビルドとデプロイ

テンプレートのデプロイ後、CodeCommitリポジトリにコードが存在しないため、Code Pipelineは失敗状態になります。

ソースコードをpushすると、Code Pipelineのビルドが自動的に始まります。

ビルドが無事に完了するとCloudFormationで開発環境を立ち上がってDockerのイメージをデプロイします。

その後、本番環境へのデプロイのステップに入り、ビルドは停止し、承認が得られるのを待ちます。

リリースが承認されると、ビルドが続行され、本番環境へのデプロイも完了します。

最後に

この記事では、AWSのCI/CDに向けたサービスを使い、自動ビルドとデプロイのフローを実現できました。

このパイプラインは出発点として使用されるべきで、プロジェクトの要件に合わせてステップの追加や削除、フローの変更を自由に行うことができます。

ソースファイル

このプログ記事で使ったソースファイルをGitHubに公開しました。

buildspec.yaml – CodeBuildが利用されたbuildspec.yamlファイル
Dockerfile.lambda – Lambdaのデプロイに向けたDockerfile
deploy/lambda.yaml – Lambdaのデプロイに向けたCloudFormationのテンプレート
deploy/pipeline.yaml – CodePipelineのデプロイに向けたCloudFormationのテンプレート

最後までお読みいただき、ありがとうございました。

AIエンジニア

AIエンジニア

沖縄本社では、一緒に働くAIエンジニアを募集しています

システムエンジニア、その他多数募集中!

はじめに

はじめまして、プロトソリューション ソリューション開発部 沖縄の玉城です。

私はテストチームに所属しており、主にWebサイトやスマートフォンアプリのリリース前テストにてテスト設計書のレビューアを担当しています。
※レビューア:検証内容に抜け漏れ/不備がないかのチェックをする人
今回は私のストーリーをご紹介いたします。

入社までの略歴

私は漠然とした「将来、IT系の職業に就きたいな」という思いだけでIT系の専門学校に入学を決め、PGを目指す学科にて開発言語や資格取得に向けた勉強をしていました。ですが、生涯PGを続けていけるか?という点では正直不安を感じていました、、。それでも、IT系の職業に就きたい!という思いは変わっておらず、多数の合同企業説明会に参加し、様々な職種を取り扱っているプロトソリューションと出会い、ここでなら自分が楽しいと思える何かに出会えるのでは!?と思い、入社を志望しました。

▶プロトソリューションで扱っている職種は、こちらをご参照ください!



プロトソリューションに入社

プロトソリューションに入社当初、部署の人数は30名程と少なく一人一人が自分の業務と多方面からの電話問い合わせに奮闘し、せわしなく動き回っており、まさに戦場という状態でした。

▶当時から現在までの様子は、こちらをご参照ください!


そんななか、私は部署の登竜門としてあったテストチームに配属が決まり、最初の業務は同期2名と自社スマートフォンアプリをマニュアル化するというもので資料や実際に操作をしながら、レイアウトの違いを見付けては開発者へ質問しに行ったり自分達で作成した統一感のないマニュアルの修正を行ったり、複数人での共同作業に戸惑いながらも作業を行っていました。ただ、意見を交わしながらの作業は楽しくリリースされる前のアプリに触れられる特別感やモノ作りの一部分に関われた事に感動したのを覚えています。

今思うと、あの慌ただしい状況下のなかマニュアル作成をやらせてもらえたことで業務中の先輩社員の様子を覗けたり複数人で行う作業の難しさ、コミュニケーションの必要性を理解する良い機会となったので先輩社員の配慮に感謝しています!

それからは、実案件に入りWebサイトやスマートフォンアプリでのバグ探し(探索テスト)を中心にテスト業務を行っていましたが、なかなかバグを検知することが出来ず、、先輩社員にどういう操作をするとバグを検知できるか、何でそれをやろうと思ったのかなど質問しては実践を繰り返し、夢中で業務を行っていました。(この頃には就活時に感じていた、漠然とした不安はなくなっていました)

また、この頃のテスト業務では、今では当たり前にある業務フローやテストケースも決まっていない状態での実施だった為、新規サービスの立ち上げや既存サービスの拡大に伴い、テストコンサル会社よりテスト技術の基礎を学ばせて頂きました。

コンサルが参画してからのテスト業務は、大型の新規案件(プロトグループを代表するサービスの新規構築)を筆頭に様々なサービス・案件が動き、慌ただしさを増していきました。

初めての東京出張もその頃に経験しました。
テスト設計を行う為にPMや開発者と仕様について直接やり取りを行い、資料からは見えてこなかったプロジェクト背景や担当者の思い、またどんな利用者に向けたサービスなのか等をヒアリングする事ができ、これまで行っていた行き当たりばったりのテストから利用者にとって良いサービス・機能となっているかを確認する為のテストへと少しづつ変えて行く事が出来ました。

コンサルの方には、テスト業務/技術者のあるべき姿を実践を交え、示して頂いたことで知識や技術面だけじゃなく、業務との向き合い方についても学ばせてもらい有難い経験となりました。

その後も複数の新規案件のテスト設計/進捗管理を担当し、検証パターン漏れによるアクシデントを発生させてしまったり、テスト実行遅延により部署全体へヘルプを要請する事態に陥ったりと様々な出来事がありましたが、上長やチームのメンバーをはじめ、部署の方々に支えられ10年間テスト業務を続ける事が出来ました。

あまり部署の「人」についてのお話が出来ていませんが、私の部署の方々は黙々と業務を行っている為、近寄りがたい印象を受けるし、仕事に対する責任感から厳しさを感じることもありますが、仕事という場から離れると年齢や性別に問わず、楽しそうにふざけ合っていたり真剣に相談にのってくれたり、自然とお互いを支え合う事の出来るあたたかい人達です。

新卒として入社し、業務の事だけじゃなく社会人としての姿勢、仕事に対する責任感、様々な事を会話から・立ち振る舞いから学びました。
今こうして10年を迎える事ができるのは、本当に周りの方々の支えがあってこそです。


今やっていること

今の私がやっている事を紹介させて頂きます。

変わらずテストチームに所属していますが、テスト設計書のレビューアとして全サービスのレビューを担当しております。チームとしては、常時30名程のメンバーが常駐する程に成長を遂げ、日々各サービスのテスト設計書作成やテスト実行、自動化ツールの導入に取り組んでいます。

そんなメンバーが作成したテスト設計書を私の方でレビューしておりますが、リリース前に行う最後のテストとなる為、実際のレイアウトや動きを確認しつつ、各案件・サービスによって考慮すべきテスト観点が含まれているか、検証粒度は?他サービスへの影響は?利用者目線での使い勝手は?など、サービスが成し遂げたい事に焦点を置きつつ、サービスのこれまでの不具合やテスト設計者ごとの不足観点の傾向をみながら検証内容の過不足がないかのチェックを行っております。

気になる箇所を1つ1つ確認しながら、品質の良いサービスの提供に繋がるよう日々意識し、業務に励んでいます。

ここで私のチームメンバーを紹介します!(一部にはなりますが)

部署の中でも大所帯のチームになるので定期的にこのようにMTGを行い、問題の吸い上げ/課題に対策する進捗確認などコミュニケーションを取りながら業務を行っています。

今後やりたいこと

今後、私がやりたい事は「テスト技術者の輩出」です。

入社から10年間テストチームに所属し、新規案件や自動化導入など様々なテスト業務を経験してきました。品質を保証する者として果たす責任は重く、日々実力不足を痛感していますが、そう感じるからこそ気付けた課題、今後やりたい事を見付けるが出来ました。経験から得られた知識、当事者だから感じたテスト技術者の在り方、重要性。その想いも含め、新たな挑戦が出来るテスト技術者の輩出に尽力していきたいと思います!

▶テスト業務に少しでも興味を持たれた方は、こちらをご参照ください!

テストチームには、私のような教育分野の他にもテスト自動化ツールや非機能検証を極めたいと考えているメンバーもおります。各分野の取組みを強化していきたいと考えておりますので参考になれば幸いです!

最後までお読みいただき、ありがとうございました。

自己紹介

こんにちは。

沖縄に拠点を構える株式会社プロトソリューションで、インハウスマーケターをしているフクハラです。 オウンドメディアのSEOを中心にWeb集客支援の領域を担当しています。

はじめに

Webマーケティングを行う上で、避けては通れないアクセス解析。 今回はそのアクセス解析に欠かせない二つのツール『Google Analytics(以下GA)』と『Search Console(以下サチコ)』の違いを簡潔にまとめてみました。 Web担当者になったら知っておきたい基本中の基本が、サクッと読んでパッと理解できる内容です。

【こんな人におススメ】
・自分で調べたが理解できなかった人
・長文を読む時間の確保が難しい人

そもそも「Google Analyticsって何!?」「Search Consoleとは何ぞ!?」と、なっている人は丁寧に説明しているサイトが星の数程存在しているので、そちらを参考にしてください。

GAってなに?

●GA(グーグルアナリティクス):

簡単にまとめると、

Webサイト上でのユーザー行動を数値化したものです。

ユーザーの行動履歴で「どんな人」が「どんなデバイス」を使って「どうやって訪問」してきたのか、そしてサイトのどこに魅力や不満を感じたのか、サイトへ訪問した目的は達成したのか?していないのか?などを知る事ができます。

代表的な指標:ユニークユーザー数、セッション数、ページビュー数

サチコってなに?

●サチコ(サーチコンソール):

簡単にまとめると、

グーグルから見た自社サイトの状況を数値化したものです。

グーグルの検索結果ページ(SERPs)でのパフォーマンスで、対象ページがどんなクエリで何位に掲載されていて、何回表示されていて、何回クリックされたのか、などなどが把握できます。

代表的な指標:クリック数、表示回数、CTR、掲載順位

GAとサチコの違い(データ編)

取扱いデータを簡潔に説明すると、 Webサイトを軸にユーザーの状態(Webサイトへ訪問する前後)で区別しているデータと言えます。

●GA(グーグルアナリティクス):Webサイトへ訪問した後のデータ

●サチコ(サーチコンソール):Webサイトへ訪問する前のデータ

GAとサチコの違い(利用編)

何をいつどう利用するのか、
それは前述したユーザーの状態によって決められます。
簡潔にまとめると、以下のようになります。

●GA(グーグルアナリティクス):

GAは、Webサイトの目的(コンバージョン)を達成させたい時に、 訪問ユーザーの行動(直帰率や滞在時間など)や閲覧状況を把握して、データ分析を行い改善に向けて利用します。

●サチコ(サーチコンソール):

サチコは、Webサイトへの訪問ユーザー(集客)を増加させたい時に、 掲載順位・表示回数・クリック数・CTRを基に強化するクエリやページを把握して、データ分析を行い改善に向けて利用します。

まとめ

つまり、

●GA(グーグルアナリティクス)とは、ユーザーの行動履歴を基に、CVの最適化を行う為のツール

●サチコ(サーチコンソール)とは、グーグルのパフォーマンス評価を基に、集客の最適化を行う為のツール

と言えるでしょう。

したがって、改善したいポイントが「CV(コンバージョン)」なのか「集客」なのかでツールが選択できます。

本来はどちらのツールももっと深く、もっと細かく分析ができますが、個人的に一番押さえておくべきだと思っている事を3分で理解できるようにまとめてみました。

いかがでしたでしょうか。

今回ご興味を持っていただけたようでしたら、ぜひいろんな視点からデータ分析にチャレンジしてみてください。

それでは、お疲れ様でした。

はじめに

はじめまして。プロトソリューション東京支社の前沢です。
今回は最近自分自身で振り返ってみたら、自分の会社ってちょっと珍しいタイプなのかなと感じたので、プロトソリューションの組織や運営の思想についてご紹介したいと思います。

私のプロフィール

2012年04月 ~ 2016年09月
株式会社アイソリューションズ入社
1年目にタイミングよく新規大型案件があり、2021年現在、役員・責任者の鈴木さん・針生さんと共にアサインされ要件定義・設計・テストを順に経験。この案件で厳しく、そして優しくご指導いただきました。その後、同プロジェクトの保守チームへアサインされ東京所属として運用保守開発業務に従事。

2016年10月 ~ 現在
株式会社プロトデータセンターと合併し、株式会社プロトソリューションへ商号変更。合併後、SES事業の部署から東京支社の開発部署へ移動する第一号メンバーとして部署移動。Salesforce開発者となり、翌年チーム化。2020年にはプロジェクトの管理者を兼任しつつ東京支社Web開発チームの統括となりました。

東京支社所属になって感じたこと

まずは、変化を恐れない。
正直最初は恐れがなさすぎると思っていました。
IT企業って結構守備力というか安定性みたいなモノを重視すると思ってたんですけどプロトソリューションはかなりの頻度で組織改革が行われていて、毎年~2年に1回くらいマイナーチェンジとは言えないくらいの組織変更が行われてます。事業のベースがプロトコーポレーション(親会社)の案件で占められている分、お互いが「そのほうがいい組織になるな」となれば一気に変更をかけることができて、納得して変更するからハレーションも起きないといった形が多いです。そういった背景があるので最初は恐れがなさすぎると思っていましたが、蓋をあけたらリスクほとんどなくとにかく成長するために変化してるんだなという結論に至りました。
 

次に、「社員のやりたいこと」に対してかなり寛容。
部門内でやってる事業や、その延長線上にあるものであれば自分がやりたいと思ってることはほぼ必ずできる。もちろん、思ってるだけでは厳密にいうとダメで、日々それに向けて例えば勉強したり先輩・上司と話したり・・・とにかくやりたい。挑戦したい。やれます!っていうのを発信していくのが重要だったりします。


実際に取り組んだ例は以下をチェック!
他にもあるので興味のある方はプロトソリューションの記事を是非チェックください!

ラクネコ

・JomoNeX

最後に、社員の成長機会を重要視している。
一つ目の内容と少し重複しますが、役割変更や次のステップへの挑戦・本人がやりたいことへのチャレンジを推進しているのは、それが本人が成長する機会になると考えているからだと思っています。打合せの際にたまにキーワードとして出てくるのですが、変更する・変更しないで「どっちがメンバーが成長する?」という会話がなされることが多いです。その視点を基準にみて変更をしないという選択をすることもあるくらいです。

結局どこがめずらしいの?

IT部門は親会社からの開発案件が柱になりつつ、新規事業に力を入れだしていてチャレンジングな領域に踏みこみ始めた時期だと感じています。IT企業で働く一員として、改めて振り返って考えてみたときに以下の点を全部満たす企業ってそんなに多くないんじゃないかと思いました。
 ・やりたいと思ったときに取れる選択肢の広さ
 ・安定した事業基盤
 ・新しい領域への挑戦が始まったばかり

プロトソリューションってどんな会社?

企業目標は「KANDOU COMPANY(感動カンパニー)」で、データとAIを活用して社会課題を解決することに取り組んでいます!

●企業文化
すでにいい記事があがっていました!

●未経験からの活躍者多数!
こちらも記事参照!!

最後に

東京支社は現在、半数を超えるメンバーがIT部門所属になっています。東京支社は今後、IT部門の中心になって上流工程に力を注いでいくことになると思います。まだまだ20名程度ですがこれからもメンバー一丸となってお互いを支え合いながら成長していける組織として頑張っていきたいと思います。

この記事を見て、
・興味があるな。
・私もこんなエンジニアになりたいな。
・エンジニアとして実現したい夢が叶えられそうだな。

と感じましたらぜひカジュアル面談でお聞かせください。

WEBディレクター

WEBディレクター

東京支社では、一緒に働くITエンジニアを募集しています

データサイエンティスト、フルスタックエンジニア、その他多数募集中!

最後までお読みいただき、ありがとうございました。

自己紹介

AIテクノロジー推進室仙台に所属しております櫻井と申します。

2013年に入社、学生時代にアプリ開発を行っていた経験を買われ、エンジニアとしての第一歩はAndroidアプリ開発からスタートしました。それからJavaを用いた業務システム開発や、親会社のクルマ・ポータルサイト「グーネット」でのAPIプラットフォームの新規開発業務など様々な分野の案件を経て、現在は当社が展開しておりますSaaS「受付クラウドシステム ラクネコ」のプロジェクトで開発セクションリーダーを担当しています。

ラクネコでは先日インターホン機能という、来訪者が受付端末を介して担当者と通話できる機能をリリースしました。

こちらのインターホン機能はWebRTCという技術を用いて実装しておりまして、来訪者が受付操作を行った際に担当者のモバイルアプリケーションに電話発信を行い通話を行うことができます。

本記事ではWebRTC技術についての説明と、どのような構成によって通話機能を実現させたかをご紹介したいと思います。

WebRTCとは?

Web Real-Time Communicationの略で、ウェブブラウザやモバイルアプリケーションが音声や動画などのデータをリアルタイムに通信するための技術です。

端的に説明すると上記のようになりますが、正確には映像の圧縮技術や画面共有で使われるスクリーンキャプチャ技術なども含まれており、さまざまな技術の集合体とも言えます。

従来にもオンライン会議アプリケーションは存在しておりましたが、それらは専用のプラグインやクライアントアプリケーションのインストールが必要で、また開発コストも高いものでした。

しかし現在にいたってはモダンウェブブラウザがWebRTCを標準でサポートしており、誰でも簡単にリアルタイムなコミュニケーションに参加することが可能になりました。

コロナ禍で世界中の人々にオンラインでコミュニケーションを行う文化が普及した今、WebRTCは無くてはならない技術になりつつあると思います。

WebRTCの仕組み

次にWebRTCがどのような仕組みでリアルタイム通信を実現しているかを説明します。

まず大事なキーワードとしてP2P(Peer to Peer)を理解する必要があります。P2Pはネットワーク上で端末同士がサーバを介さずにデータをやりとりする通信方式で、中央サーバを用意するクライアントサーバ方式と比較するとサービス提供者が低コストで運用でき、耐障害性も高いなどのメリットがあります。

WebRTCは基本的にP2Pで映像や音声といったデータをリアルタイムで送受信するようになっています。ただ、P2P通信を確立させるにはお互いに通信相手の情報が必要なわけで、事前にいくつかのサーバ通信が発生します。

まずはWebサーバ・シグナリングサーバに接続し、SDPと呼ばれる通信確立に必要な自身のIPアドレス・ポートなどが含まれた情報をシグナリングサーバ経由で相手に送信します。相手は受け取ったSDPを登録します。この処理をお互いに行います。

ここで通信経路上にNATの存在することによる問題があり、その対処が必要です。

NATはネットワークアドレスを変換する役割を持ち、プライベートIPアドレスをポートに割り当てることにより、ひとつのグローバルIPアドレスで複数端末の通信を可能にします。この変換処理の存在によって、SDPに含まれたIPアドレスでは相手と通信できない状態となってしまうため、それを対処するためSTUNサーバを利用します。

STUNサーバは外部ネットワークから見た時のIPアドレス情報を返してくれます。そのIPアドレスと自身のIPアドレスを比べることで、NAT越えの処理が必要かを判断します。

NAT越えでの接続が必要な場合、外部ネットワークから見た時のIPアドレス・ポートでの通信をしたいことをシグナリングサーバ経由で相手に通知し、その情報を受け取ってもらいます。これによりP2Pが確立します。

ただ、このSTUNでの対処は確実なものではなく、NATやファイアウォールの設定によっては通信を遮断されてしまうことがあります。その時の最後の手段として、TURNという仕組みが用意されています。P2Pによる通信は不可能と諦め、TURNサーバを中継させることにより、データを受け渡せるようにします。

通話アプリケーションを構成するまで

ここまででWebRTCの仕組みを簡単に解説しましたが、シグナリングサーバなどを自前で用意するとなると流石に面倒です。現在はそれらを提供してくれるWebRTCプラットフォームを利用することで、リアルタイム通信アプリケーションを少ない開発量で構築することができます。

有名どころのサービスとしてTwilioやSkywayの他、多くのサービスが提供されています。それぞれクライアントライブラリや料金(無料のものもある)、導入実績などに違いがありますので、利用する際は比較検討をするのがおすすめです。ラクネコでは国内にサーバがあり、低コストで運用できるSkywayを採用してアプリケーション開発を行いました。

設計について

さて、WebRTCを使って通話アプリケーションを作るとなった場合、オンライン会議アプリケーションとは違う点について考慮が必要となります。一般的なオンライン会議アプリケーションでは、時間や会議URLを示し合わせて、各々が自ら通話に参加する形かと思います。しかし通話アプリケーションの場合は、一方が通話発信を行った後に相手に通話のリクエストが来ている事、つまり着信通知の仕組みが必要となります。

iOSでの開発を例にあげますが、着信通知を実現させるためにはPushKit、そしてVoIP Pushを使うことができます。VoIP Pushは標準のPush通知とは異なり、受信時にアプリが動作していなくてもバックグラウンド処理を確実に行え、また遅延が少なく安定性が高いといわれています。まさに通話リクエストのようなリアルタイム処理のためにある仕組みです。またPushKitはVoIP Pushを受け取るためのフレームワークとして用意されています。

次にVoIP Pushの配信に使うサービスですが、もしAWSでシステムを構築しているならAmazon SNSの採用が良いと思います。他のAWSサービスとの連携ができ便利です。

使用する技術・サービスの紹介は以上で、ここからはラクネコで実装した通話を成り立たせるための処理フローをご紹介します。

まずは事前準備として、VoIP Pushを受け取られるようにするために端末の登録が必要となります。デバイストークンと呼ばれる情報が取得できますので、それを自前のAPIを経由させてAmazon SNSに登録します。するとPush通知をパブリッシュ(配信)する際に必要なtarget ARNが返されますので、ユーザに紐づける形でデータベースに保存しておきます。これを通話の発信側、受信側の端末それぞれで行います。

次がいよいよ通話を確立させるまでのフローです。始めにSkywayにPeer作成のリクエストを行います。PeerはSkywayにおける概念のひとつで、Skywayのシグナリングサーバや他の端末との接続を管理するエージェントです。1:1通話においては発信側、着信側の2つのエージェントが存在することになります。

Peer IDを受け取った後は発信したい相手の情報をパラメータに、自前の通話発信APIをリクエストします。すると、DBに保存されているtarget ARNをもとにVoIP Pushが配信されます。VoIP Pushには通話発信側のPeer IDを含めており、着信側は通知受信後にそのPeer IDとの接続をSkywayに要求します。これでP2P通信が確立され、インターネット回線を使った通話が行われます。

今回ラクネコでの構成を紹介させていただきましたが、こちらは実装の一例ですので実現したいシステムイメージにあわせて設計を検討されることが望ましいかと思います。

最後に

一昔前であれば、自分が開発するサービスに音声通話機能を付けるなんてことはハードルが高いと感じていたと思いますが、今こうして機能として実装・リリースできていることから、リアルタイム通信技術がだいぶ身近な存在になったということを実感しています。

コロナ禍で生活様式が大きく変化し、なるべく人との接触を避けるようになった事を考えると、手軽に遠隔でのコミュニケーションを実現するWebRTCは時代にマッチした技術であると言えます。

これから更に活用され身近な存在になっていくかと思いますので、存在や仕組みをなんとなくでも理解しておくと役立つ日が来るかもしれません。

SaaSエンジニア

SaaSエンジニア

仙台本社では一緒に働く自社プロダクト(SaaS)開発エンジニアを募集しています

システムエンジニア、その他多数募集中!

はじめに

このブログでは、情報処理の単位を落とすほどITに疎く、大抵の問題は「気力と体力」で解決してきた男が、「これからの時代はスマートフォンか!」と無謀にもIT業界に飛び込み、
8年間の経験を通して感じたエンジニアに必要なスキルについて、ご紹介できればと思います。
「システム開発ってどんなんなん?」と考えている方や、実際に開発現場で働く人にも、何かヒントになるお話しができれば幸いです。

自己紹介

こんにちは、はじめまして。プロトソリューションの棚原と申します。
私はAIテクノロジー推進室沖縄に所属しており、現在は自社SaaS開発の業務に携わっています。

私は入社してこれまで、Webアプリやスマートフォンアプリの開発、ハイブリットアプリやAPIの開発と、さまざまなプロジェクトでさまざまなシステム開発に携わってきました。
経歴を簡単にまとめると以下の通りです。

業務概要 触れた技術など
H25.9~ 入社して初めてプログラミングを学ぶ PHP, Objective-C
H26.4~ 自社サービスのB向けWebアプリ開発 Zend-PHP, PostgreSQL
H27.4~ グーシリーズやCtoCフリマアプリ等のスマホネイティブアプリ開発 Objective-C, Swift, Andorid Java, FuelPHP(API), MySQL
H29.9~ 自動車ディーラーの業務支援アプリ開発(ハイブリットアプリ) Ionic AngularJS, FuelPHP(API)
H30.7~ グーバイクの新規コンテンツ開発(SPA) Angular, Laravel(API), AWS
R2.4~ 自社SaaS開発 Angular, React, AWS(Serverless), Chalice(Python)

私の考えるエンジニアのスキル

これらの経験を通して私が考えるエンジニアに必要なスキルは、「効率的により速く、最適解を導き出す」力だと考えます。 システム開発とは、「業務上発生する何かしらの課題をコンピューターの力で自動化・効率化・仕組み化する」様な仕事をしますが、その中で効率的により速く最適な答えを出すことがなぜ必要だと考えるのか、説明していきたいと思います。

なぜ「効率的により速く」が必要か?

私たちの仕事はどのプロジェクトにおいても、背景にビジネスがあり、ニーズがあり、競合がいて、必ず期限があります。 こうした背景の中にある課題を技術で解決することがエンジニアには求められますし、そこにはスピードが伴います。それに応え、効率よく素早く課題を解決することがエンジニアの仕事なんだと、私は考えています。

どうやって「効率的により速く」を実現するか?

例えば、ドラえもんはポケットの中から課題に対する最適な答えを素早く出し、課題を解決します。まさに理想像です。 ですが、ドラえもんのすごいところは、道具を的確に出すところです。 つまり、多くの引き出しを持ち、それらでどんなことができるかを知ってるということが、効率的により速く答えを導き出すスキルの一つなんだと思います。

私も色々な技術に触れたことで、それぞれのクセや特徴が引き出しになり、ふとした場面で課題解決のヒントとなった経験が多々あります。

また、多くの引き出しを持つというのは「知ってるだけ」で十分です。 極端な話ですが、私は未だにプログラミングの基本構文であるfor文も覚えていません。知ってるだけです。それでもIDE(プログラミング環境)の拡張機能を使ってfor文を書くことができます。 無駄に多くのことは覚えず、必要な時に取り出せればとても効率的です。

知ってるか知らないかの違い

少しかじった話になりますが、具体例でイメージしていきます。 例えば、Webサイト(静的サイト)を作成してインターネットに公開したい、という場面があります。

Webサーバを利用した場合

通常、Webサイトを構築・公開するには、大きく以下の様な対応が必要になります。

・Webページの制作
・Webサーバの構築(サーバの調達・ミドルウェア(Webサーバソフトウェア)のインストール等)
・Webページのアップロード・公開
・サーバの運用監視

と手間がかかります。

Amazon S3を利用した場合

ところが、AWS(Amazon Web Services)のS3というストレージサービスの静的ウェブサイトホスティングを利用した場合はこうなります。

・Webページの制作
・S3バケットの作成・設定
・Webページのアップロード・公開

S3を利用すればWebサーバの構築が不要で、必要な設定は管理画面上で操作でき比較的容易です。 また、S3はマネージドサービスでサーバの運用監視が不要です。(しかも安価です)

AWS Amplifyを利用した場合

それだけでなく、同じくAWSのAmplifyというサービスを利用した場合、S3の静的ホスティングと同様の仕組みを自動で構築してくれる他、https通信に対応させる為のSSL証明書の発行・設定も自動で行われたり、カスタムドメインの設定が管理画面上で容易にできたりと、手動で行う作業を更に削減することができます。

このケースだと、Amplifyで出来ることや特徴を知っていることで、他の構成よりも効率的により速くWebサイトを構築することができます。

実際の現場では、どの構成が最適なのかはプロジェクトの要件次第です。 ですが、複数の構成パターンを知っていることで、効率的でリソースに無駄のない最適な選択ができます。

プログラミングにおいての効率

上の例はシステム構成寄りのお話でしたが、プログラミングの場面でも「知ってるかどうか」が効率化につながります。

複雑さがないこと・無駄なプログラムは書かないこと

身近なExcelの関数で簡単な例です。

①
=IF(A1>=80, "優", IF(A1>=70, "良", IF(A1>=60, "可", "不可"))) 

②
=IFS(A1>=80, "優", A1>=70, "良", A1>=60, "可", A1<60, "不可")

どちらも同じ結果を得られますが、①の方は入れ子が多く見辛いです。条件が増えると更に見づらくなります。 ②のIFS関数を知っていれば、シンプルになります。 プログラミングでも、プログラムが見辛いと不具合につながりますし、シンプルである方がレビューなど多方面に効率的です。

引き出しから引き出しが生まれる

また専門的な話になってしまいますが、プログラミングでの例です。 プログラミング言語は、それぞれ似た様な機能を持つことがあります。

Javaで有名なエラーにぬるぽ(NullPointerException)があります。 nullの格納された変数に、メソッド呼び出し等すると発生します。発生するとアプリが停止したり、致命的です。

String str; // null

int num = str.length(); // ぬるぽ

Swiftでも同様のエラーがありますが、これを避ける方法としてOptional Chainingという機能が用意されています。

var str: String? // nil

let num = str?.count() //Optional Chaining

JavaScriptでも同様のエラーを避けたい場合があります。 そうした場合、「JavaScript Optional Chaining」とググってみます。

var str //undefined

let num = str?.length //Optional Chaining

JavaScriptでも同じくOptional Chainingが用意されていることがわかり、同じ様な記述で回避できました。 この様に、一つの言語で知っていた情報が、他の言語においても解決策となる場合があり、その観点さえあれば、効率的に問題を解決することができます。

まとめ

いかがでしたでしょうか。 ここで私がお話ししたかった内容をまとめるとこの様になります。

・システム開発とは、様々な背景にある課題を解決する仕事であること
・システムの設計やプログラミングは課題解決の手段で、それを駆使して課題を解決するのがエンジニアであること
・課題解決の手段はより多くより効率的である方が、最適で素早い課題の解決につながること

これはもちろん、基礎があってこそだと思います。 私自身もPHP, Objective-Cのプログラミング学習から始まり、色々なプロジェクトに首を突っ込むことで Webアプリ→API、iOSアプリ→Androidアプリ→ハイブリットアプリ→SPAと引き出しや感覚を身につけてきました。 これを機会に、この経験談が誰かのスキルアップに繋がれば大変嬉しく思います。

おわりに

今なら情報処理で”優”が取れそうな、なんかそんな気がしました。 今回は技術特化の内容ではありませんでしたが、またの機会には日頃触れている技術のアウトプットもしていきたいと思います。 最後までご覧いただきありがとうございました。

ITエンジニア

ITエンジニア

沖縄本社では、一緒に働くAIエンジニアを募集しています

AIエンジニア、システムエンジニア、その他多数募集中!

ページトップへ戻る