FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

2023年度FLINTERS新卒研修要略

2023年度新卒入社の塚本です。 FLINTERSでは、新卒研修後に技術ブログにまとめを書くことが文化になっており、FLINTERSのことを知りたい方に向けて、自分への復習も兼ねて新卒研修の概略を残します。(私自身、技術ブログの新卒研修エントリが入社の決め手になった気がします。お役に立てば幸いです。)

自己紹介

私は大学では直接的にはITと関わりのない教育社会学を専攻し、最終的に卒業論文は質的研究手法で書きました。一方、私のいた学部は学際的な特徴を持ち、副専攻(サブメジャー)制度がありました。社会学の手法として統計を用いた量的調査に興味があったので、数学は苦手ですが一応高校は理系で学部にも理系入試から入ったのでどうにかはなるだろうと、サブメジャーに数理統計を選び、この中でデータ分析演習や数理的応用プログラミング演習といった形でPythonやRを使ってプログラミングする機会も多少あった程度です。

進路は文科省・教育社会学での大学院進学・高校教員・民間企業総合職など色々考え、国家公務員総合職試験教養区分を受けたり、教育実習に行き教員採用試験に申し込んだりしていたのですが、私の特性として働き方的には教育周辺が合わないと判断し(就職活動としても難易度が高かった)、では自分に働き方の面で合う職種が何か考えた結果、「整備されたドキュメントがある状況での枠組み理解と高速検索が得意」「どうせプライベートでも椅子に座る気がある日は1日15時間画面を見ている」という2点からサブメジャーを活かしITエンジニアを目指すことにしました。

プログラミング経験

前述のように、大学以前においてプログラミングを体系的・中心的に学んだことはなかったです。一応、制御構文やオブジェクト指向、型付けやミュータブル性などの基礎的な概念は理解していましたが、社会学の量的研究と接続したいということが主眼だったので、R StudioやJupyter Notebookといった対話型のソフトウェアを用いて「ファイルからデータを入手して数学ライブラリを使い、結果をコンソールに表示させる」といったことがメインであって、また入社が決まってからコーディングに慣れようと競技プログラミングを始めましたが、これもまたオンラインジャッジシステムがコンパイルをしてくれる&標準入出力を用いてジャッジをしてくれるので、1個の閉じたパッケージとしてのソフトウェア開発経験はゼロでした。FLINTERSに入社するにあたってのコーディングテストでもJupyter Notebookを用いました。

ところで入社後もペースは落ちましたが並行して趣味の競技プログラミングも続けており、ようやくAtCoderのレーティングが一番下のランクから一つだけ昇級したところです。職業プログラマーとしては最低限のアルゴリズム力なので、私の強みといえるようになるまでもう少し精進したいところです。FLINTERSでは大量のデータの処理を扱う機会があることもあり、アルゴリズム力が役に立つところもあるのではないかと考えています。(余談ですが、チーム開発研修では設計段階での検討不良を競プロ的ゴリ押し発想のリファクタリングで乗り切ろうとする場面がありました。)

会社について

私が入社を決めたきっかけは、先輩の入社ブログを読んで、FLINTERSが非常にホワイトな環境であり、在宅勤務がそれなりに長期的に続きそうだったことです。以下、実際に入ってみての所感です。(一般的にITエンジニアを志向する特性を持つ方々にとって)非常に良好な環境だと思います。

出社環境について

今年から新型コロナ禍による制約が撤廃され、去年までのような完全な在宅勤務ではないです。入社式や勉強会、マネージャーとのランチ会などで研修期間に2週間に1回程度対面で集まる機会が設定されていました。配属されてからはチームによるので現時点では確固たることを書けませんが、チームによっては2週間に1度程度出社推奨日を設けていたり、若手の合同勉強会が月1くらいでは組まれている印象があります。個人的にはちょうどいいスタイルだと感じています。リモートワークにメリットは大きいですが、やっぱり人となりを知るのに、対面で合う機会がこれくらい確保されていると捗ります。私はあまりこういうのが得意なタイプではないので先輩方の認知はまだまだだですが、少なくともずっと研修を一緒に走ってきた新卒同期の面々とはかなり仲良くなれたのではないかと思っています。

それはそうとプライベートの生活面において、リモートワーク中心の生活ってメリットもデメリットもありますが、やっぱりメリットが大きい気がします。家をどこに置くかにもよりますが、一般的に往復1時間以上はかかる通勤時間が無くなるので最悪09:45くらいに起きれば始業に間に合いますし、家の立地の自由度も上がります。私はせっかく東京に来たのである程度都心へのアクセスも考慮して新宿10kmくらいのところに済んでいますが、25kmくらいはよく見ますし、家庭を持っている先輩・マネージャー陣だと40km以上なんて人もいます。来年から裁量労働制によってさらに勤務の自由度が上がるらしいので楽しみです。

勤務時間について

非常にゆとりがあってホワイトです。研修期間中も(多少夕会で話が弾んで定時を超えることはありますが、)スケジュールを消化できなくて残業が発生することは全く無いですし、むしろ定時後に至らないところを改良しようとしたりすると、スケジュールに余裕があるので明日すればいいしできるだけ早めに切り上げるよう言われます。業務にあたっている先輩方でも長時間労働があるという話は全く効かないです。休みも初年度から夏季休暇5日(来年から10日)+有給付与10日あって、特に消化しにくいということもないですし、社で共有している休暇カレンダーを見る限り、皆さんどんどん休んでいくのが確認できます。私はまだ取ってないですが、研修中から追いつける範囲で有給を消化することもできますし、スケジュール自体が補講日の存在などかなり余裕を持って組まれています。

そのほか

非常に透明感のある社風でエンジニアにとって過ごしやすいのではないでしょうか。規定やマネージャー会議の議事録などが社内のドキュメント管理ツールにすべて上がっているので、適切な検索ワードで検索を行えば、現在の気になる社内の状況をすべて把握できますし、セキュリティ管理が必要なプロジェクトチャンネルと異なり、社内手続きチャンネルはほぼすべて公開されてるので直接担当者に手続き調整できます。

分社化されている影響は良くも悪くも多分にあると思います。上場企業グループの一部なので、全社ルールはルールの管轄部署が遠くて面倒くさい場合もありますが、多くの手続きにおいて、大企業の安定感を持ちつつ、周囲は基本的にエンジニアとエンジニアに理解のあるバックオフィスなので、非常に話がしやすいです。かなり柔軟性があると思います。

会社の本棚に、私が入社前から気になっている本があったので借りてきました。また姿勢改善のために外付けキーボードがほしいなと思ったのも会社に在庫があったので借りてきました 。あと、今年はスケジュールが立たず見送ったのですが、来年は関東ITソフトウェア健康保険組合の「健保大会と銘打ったディズニーリゾート優待」をぜひ使いたいですね。

研修について

現在、FLINTERSでは扱うサービスの多角化により、あるコア技術についての研修というよりかは、大枠を理解することと、自ら必要な技術をキャッチアップ出来る「自走できるエンジニア」になるための研修が行われています。3ヶ月以上と、かなりのリソースを割いていただいて、プログラミングの基礎や、開発の理念からAWSの外部研修に至るまで、多種多様な研修が行われます。以下、特記するべきものをいくつか紹介します。

プログラミング研修

FLINTERSでは開発言語としてScalaを推しています。ScalaはJavaから派生した言語で、①関数型言語とオブジェクト指向型言語の双方の書き方が出来る、②静的型付けを採用する、③強力な推論機能により冗長性なくコードを書けるといった特徴があり、安全なコードを短く書くことができます。すごい。私はこれまで一番習熟していた言語がPythonであり、Pythonは雑な書き方を比較的許してくれる言語なので、「なんとなくこんな感じでコンピューターの側がいいように私がしてほしいように解釈してくれる気がする!!!!」といったコーディングをしがちで、その間口の広さに助けられる部分もあり、落とし穴にハマる部分もあるのですが、Scalaは静的型付けであるほか、流儀として関数型プログラミングを推していたり、不必要な再代入を禁止していたりするので、各フェーズで入り口と出口を正確に考える必要があります。最初は苦労しましたが、慣れればパズルみたいで楽しいですし、「動きを把握している」安心感があります。実際、作るものが大きくなって部品を組み立てる段階になるとScalaで書いたコードのほうが接合がとてもしやすいです。

後のチーム開発では、フレームワークの知見との兼ね合いから開発言語にJavaScriptを採用することになるのですが、あまり習熟していないライブラリのメソッドが何を返してくるのかわからないといったことが多発し、再び静的型付け言語の強さを実感することになりました。言語は哲学を内包します。

FLINTERSの業務内容の多様化により、現在ではScalaを使わないチームも増えているとのことですが、Pythonでプログラミングを始めた私にとって、静的型付けと関数型言語の魅力、構造的にエラーを減らすプログラミングを指向することを知れたため、この研修で学んだことは絶対に糧になると思います。

研修では、まず宣言や制御構文などの基礎的なことを学んだ後に、クラスやメソッドの実装演習を行い、最後にある程度の誘導をもらって対話的なCLIアプリケーションを1つ完成させることを目標とします。Scalaの持っている哲学がかなりテキストに埋め込まれていたので、この段階でかなりオブジェクト指向等を意識した強固なコーディングができました。

演習の過程ではレビューをもらいますが、読みやすい記法など、かなり細かいところまでレビューを貰えるので、これまで大学の1,2講義程度では指導してもらえなかった我流プログラミングが、かなりチームで通用するコーディングに近づけたのではないでしょうか。このレビューはGitLabでマージリクエストを出す形で行い、バージョン管理はこれまで触れてこなかった部分なので研修中も最初はたくさんミスしましたが、大量にマージリクエストを出す機会があるのでいい練習になりました。GUIでのバージョン管理、便利。

Webアプリケーション研修

現代、インターネットは非常に基幹的な技術であって、IT開発はブラウザ上で動くサービスの提供が増えていたり、アプリ開発でもWebライクに開発することがあったりします。また、サービスを動かすバックエンドでもオンプレミスでサーバーを立てる機会が減っていて、AWSといったSaaSを用いる機会が多いです。このような状況の中で多くの役割において一定Webアプリケーション領域に親しんでいることが求められます。

研修では、ハンズオン資料に従って、ローカルに環境構築をしてバックエンドサーバー・フロントエンドサーバー・DBサーバーを立て、与えられたコードを実際に動かしながらリクエストのやり取りをコンソール・コードの両方から追っていきました。

Web技術は非常に多様で複雑です。ライブラリやフレームワークの役割が重要であり、プレーンなプログラミング言語を扱っていくこととはかなり勝手が異なります。アウトプットのために自分で考えるべきことよりまず規則をインプットすることのほうが重要であり、ドキュメントを読み込む力が問われます。日本語での参考文献ももちろんありますが、そもそもライブラリの開発の作業言語が英語であることが多く、結局英語が出来る/英語に物怖じしないほうが遥かにリサーチが捗ります。私は高3でTOEIC875点を取ったことがあり(TOEICの処理ゲーは要求される英語能力が専門領域以外かなり技術ドキュメント探しに近い気がします)、恥ずかしながら大学で語学を避けているうちにかなり英語力が落ちているのですが、最低限原語ドキュメントに取り掛かるモチベーションが出るだけの英語能力があってよかったと思うとともに、まだスラスラ読めるとは全然言えないので、再び英語にちゃんと向き合おうと思いました。幸いにも、機械翻訳技術の発達により、ある程度は機械翻訳の日本語でも概略をつかめるので、対訳を見比べながら英語の意図を検討していくとかなり効率化が図れます。

ドメイン駆動設計研修

FLINTERSではドメイン駆動設計(DDD)を推しています。開発の思想やアーキテクチャといった領域はこれまでちゃんと勉強したことがありませんでしたが、こうした枠組み部分が非常に重要であることを知りました(後にチーム開発研修でアンチパターンを踏みまくり痛感することになります。)

ドメイン駆動の基本になっている、ビジネスロジックをコードに落とし込むことが重要であり、対象領域の変革とコードは相互に影響及ぼし合っているということはDXに非常に重要な視点ではないでしょうか。また、ビジネスロジックを技術から切り分け、できるだけモジュール間を疎にして技術的な或いは要件的な更新をしやすくするように組み立てていくべきということはミクロにはタスクを増やす行為ですが、実際に開発をする環境では、たくさんのモジュールが関係していくので、依存関係が固定されていくと指数関数的に管理難易度が上がります。こちらも非常に重要です。

SQL研修

FLINTERSはデータを扱う業務が多く、ETLの操作は非常に重要です。その基礎として、データベースの概観とSQLを初歩から学び、綺麗なクエリの概念を理解すること、自分で綺麗なクエリを書けるようになることを目指します。

永続化処理は演算処理とはなかなかに勝手が違うことが多いです。型式の詳細に目を向けるので、クエリの1文が非常に長くなりがちなこと、得られたデータを質的に評価する必要があり、エラーが出ないことを持ってあるクエリが目標に叶うとはいえないこと、コンピュータによるデータ処理の特性を適切に理解するのに必要な一定の規模のテストデータを用意すると演習でも一つのキューにかなり時間がかかること、永続化処理であって、何らかの本体に必然的に変化を伴うものであって、冪等性を保っていないクエリのテストが難しいこと、などがあります。総じて、ある手続きの理解や正誤判定を容易に難しくするものであって、戸惑いの連続でした。 最初はとりあえず見様見真似でそれっぽいものを書いてみてエラー駆動で理解を進めていくことの多い私との相性の悪さを感じてばかりでしたが、慣れるとひとまとまりのパズルを解いている感覚で楽しかったです。勉強会でデータを扱っている方が言っていたように、最終的に本番環境で動かしてみないとわからない部分がどうしてもあるというのは怖いですが…。

チーム開発研修

研修の最後に、これまでの総まとめとして同期全員で役割分担をして、1つのウェブアプリケーションを作り上げる演習があります。教育チームから与えられた仮想の発注に対し、追加でヒアリングをして要件定義をして、モデリングをしてタスクを整理し、技術選定を行い、役割分担をして開発をし、進捗確認をして発生した問題を調整し…と膨大な仕事をすべて自分たちで整理して行っていきます

ウェブアプリケーションにはとてもたくさんの技術が必要です。プログラミング言語基礎、インターネット基礎(HTTP等)、サーバー、ウェブフレームワーク、データベース、ORM、フロントエンド(HTTP,CSS等)…もちろんすべてに習熟しているわけではないですし、チームで開発しようとすると、どうしても全員が知っているわけではない技術を使う必要がでてきます。手分けして必要なことを調べていきます。

開発は難航しました。技術は可能性や哲学を含むので、技術に対する知識があまりに不足していると、タスク整理や役割分担に支障が出るのです。「チーム開発」と呼ぶには不十分な、全員で1箇所についてあーだこーだ議論する時間が大量発生し、最初に全員で全体像を掴むまでに1週間、チーム開発研修全体の日程の半分を費やしてしまいました。モデリングはすんなりと行ったと思っていたのですが、あとから考えると机上の空論を部分的に含んでいて、実際に必要な処理を行うには非常に処理量が多くなってしまい、リソースも食いますし実装力が足りないことに気づいたので、終了3日前にモデルの追加を含む大規模なリファクタリングをかけることになってしまいました。

反省点は非常に多いチーム開発研修でしたが、その分得られた成長は大きかったように思います。技術選定をするとき、コミュニティが生きている・英文ドキュメントくらいはちゃんと整備されていることを確認しようと思いました。モデリング等で大きな構成をぶち上げるのではなく、自分の知っている知識で出来る範囲でいかに削ぎ落とした機能を作れるかどうかが初心者にとっては大事であって、とりあえず動くものを作れることが大事だと思いました。例えば、今回はORMを用いましたが、するとORMの知識が必要になり、ここのドキュメント探しに苦労しました。また、モデルとリポジトリが不可分になってしまうので、モデリングにもバリデーションの位置など色々な制約が付きました。ただのDB接続ライブラリを用いるほうが、面倒くさいことは多いのですが、自分たちの持っている知識で確実にできた気がするので、急がば回れだったかもしれません。

余談

世間がAIの進化に湧いているところですが、FLINTERSにもAI技術に目を輝かせている人がとても多く、社用SlackにAIに質問出来るBotが導入されるなど、様々な活用法が模索されています。私はそれなりにリファレンスが得意というところもあり、現時点ではまだAIの性能より自分の手でググったほうが早く正確な情報が手に入ることが多く、だからこそAIへのキャッチアップは比較的遅れていたので、入社して意識が大きく変わりました。この研修期間でも、概念理解に困っているところでAIに言い換えてもらう、全体像を掴めないコードをAIに逐行解説してもらう、やりたいことはコーディング階層まで明確になっているが、該当言語に習熟していないのでなかなか手こずっている実装をChatGPTに助けてもらうなど、AIの力を借りる場合がたくさんありました。一方で、入力が学習される可能性があるので規約をちゃんと読む&機密情報は入力しない、概念のネットワークに対しては滅法強いが真実性には弱いので聞く対象は選ぶ、真実性への弱さから出力を使うときはテストが必須&責任は使用者、丸投げするのでなく回答を咀嚼して自分のものにしないと結局あとで既存パーツとの接続に困る、といったAIとの付き合い方を考えさせられる機会も多かったです。非常に強力なツールなので上手にセキュアに付き合っていきたいところです。

最後に

3ヶ月にわたる長い研修でしたが、非常に広範囲な研修内容と、強い向上心・知的好奇心を持った同期に出会えて、非常に身のある研修になりました。まだまだ未知の領域は多いですが、早期キャッチアップ・戦力化目指していきます。3ヶ月以上にわたり支えて頂いたFLINTERS BASE教育チームのみなさんほんとうにありがとうございました。