Author Archives: Y.O

2017-10-11

コードレビューを怖がっていた新卒エンジニアが始めた対策

この記事の概要


  • 新卒エンジニアのY.Oの自己紹介
  • 入社後苦労した事
  • コードレビューとは何か
  • コードレビューの回数を減らすために行っている対策。

ご挨拶


こんにちは! TAXELチームに配属された新卒エンジニアのY.Oです!
今回は、私が入社してから味わったコーディングの苦労とその対策について、というテーマの記事です。
が、その前にちょっとだけ、私の自己紹介をさせてください。

私は現在、TAXELというレコメンドエンジンの開発を行っています。
レコメンドエンジンとは何か簡単に説明すると、
「この記事を見た人にはこの記事もオススメです」 といった機能を提供する仕組みです。
私はそんなTAXELの管理画面をRuby on Railsを使って改善するお仕事をしています。

今でこそ、会社に入ってエンジニアとしてお仕事をさせて頂いていますが、
入社まではあまり開発作業をした事はありませんでした。

大学時代にやった事と言えば…

  • プログラミングの授業の受講
  • 後輩へのプログラミング指導
  • 研究の一環としてのプラグインの開発
  • 長期休暇中のスマホアプリ開発(ダウンロード3桁レベルの小規模なもの)
  • アドパートナーズのインターンシップ(内定承諾後の半年程度)

といった内容で、プログラミングの授業でS評価は貰えるものの、
開発の経験が浅いことに加えて、集団開発の経験も無いため、
入社してからは苦労の連続でした。

入社して苦労した事


いざ入社してみると…

  • Gitむずかしい…リポジトリとかブランチとか何が何やら分からない…
  • Ruby on Railsってなんかスゴイけど勝手にやってくれ過ぎ?!
  • 「とにかく動いて自分が読めりゃいいんだよ!」なコーディングをしてきたツケが!
  • アドテクの講義、概要を追っていくので精一杯…
  • 設計内容をまとめた仕様書…他の人が読んで解るように書く…って言われても、
    一体どこまで書けばいいんだろう…?
  • プロダクトが複雑すぎて仕様や使い方が覚えきれない!
    影響範囲の検討なんてひたすらコードを読んで紐解かないと分からない!
  • サーバー関係触ったこと無いんだけれど…
    踏み台サーバーを経由してSSHでログインするって何のこと?
  • コードレビューこわい
  • etc…

とまぁ、当然の事ながら分からない/出来ない事だらけでした。
中でも特に怖かったのが、コードレビューという作業です。

コードレビューってなんぞや?


コードレビューとは、作ったコードを別の人に見てもらい、
おかしなところが無いか確認する作業の事です。
(学生の方は、論文査読のソースコード版、と考えると分かりやすいかもしれません)

個人での開発や学校の授業では意識する事は少ないかと思いますが、
仕事としてコーディングをする際は、可読性が高く安定して動くコードを書かなければなりません。
そこで、コードレビューを通じて、より良いコードがプロダクトに追加されていく仕組みにしている…とのことです。

このコードレビュー、独学でプログラミングをやってきた私にとっては鬼門で、
かなりの回数の指摘を受けてしまっています。

いまパッと思い出せるだけでも…

  • Returnの直前で条件式使ってBoolean返すなら、その条件式を返却した方がいいですよ!
  • ネストが深すぎますよ!
  • 関数の中身は直ってるけど、コメントが前のままだよね!
  • この仕様だと、~の処理の時に問題が起こるよ!
  • 関数名が処理内容を適切に表現してないよ!
  • etc…

などなど…シンプルなものだけを例として挙げましたが、
実際は他にも大量に指摘され何度も何度も再レビューをする事になってしまいました。

レビューをして頂ける事はとてもありがたい事なのですが、何度も繰り返していると、
次の失敗が怖くなったり、レビュアーへの申し訳無さでいっぱいになったり…
徐々にレビューへの苦手意識が芽生えるようになりました。

対策


とはいえ、苦手だからといって逃げる訳にも行きません。
先輩からのアドバイスや書籍/ネットで調べた情報を元に、徐々に対策をするようにしています。
同じような立場の人に少しでも役立てられたらと思い、私がやってきた対策を書いていこうと思います。

1. 指摘された点はちゃんとメモを取ろう!

エンジニアに限らず誰もがやる事だと思いますが、何より重要な事だと思います。
レビューの際どの箇所で指摘を受け、その理由が何だったかを記録する事で、
後で見返せるだけでなく、書くことで記憶にも残りやすくなります。

私の場合は、会社で扱っているWikiの自分のページの中に、
指摘された内容と、その時の修正前/修正後のコードをまとめ、
以降のレビュー前に確認する自分だけのチェックリストのようなものを作っています。

2. コーディングの参考になる本を読んで勉強しよう!

私は個人で開発を行う際、自分さえ分かれば大丈夫というコードを書いてきた為、
チームの誰にとっても理解しやすいコードを書く習慣が身に付いていませんでした。

そんな状態ではいくら自分の頭で考えたところで、良いコードを考えつく訳もありません。
そのため本を通して先人の方のやり方を参考にし、コーディングスキルやチーム開発における重要な考え方を学びました。

参考になった本をいくつか、ここで紹介させて頂きます。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

(引用元:O’Reilly Japan「リーダブルコード――より良いコードを書くためのシンプルで実践的なテクニック」https://www.oreilly.co.jp/books/9784873115658/”)

読みやすいコードを書くためのテクニックを凝縮した本になります。
既にチーム開発を体験している方は当然の事ながら、
私のような独学でやってきたプログラマーにもオススメな書籍になっています。

理解しやすいコードとはどんなものなのか?といった内容から、
名前の付け方のコツやコメントに書くべき内容などの、
実際に理解しやすいコードを書くために必要な技術や知識が山ほど書いてあります。

言語に依らず、どんなエンジニアにとっても必要な考え方が学べますので、
エンジニアになってまず何を読めば良いか分からない、
という方はとりあえずコレを読んでおけば良いのではと思います。

プログラマが知るべき97のこと

テスト

(引用元:O’Reilly Japan「プログラマが知るべき97のこと」https://www.oreilly.co.jp/books/9784873114798/”)

こちらは、技術というよりもプログラマとしての考え方を学べる書籍となっています。

(実は こちら で全て無料で公開されています。)

まだまだ経験不足で理解できない内容もありましたが、
今でも必要性が理解できて、記憶に残るエッセイも数多くありました。

ネットから無料で読むことも出来るので、通勤時などに少しづつ読み進めています。

3. 静的コード解析ツールで、目視では見逃しがちなミスを捕まえよう!

自分ではとても気をつけているつもりでも、小さなミスを0にするのは中々難しいものでした。
最終的には正しい書き方を覚え、ミス無く書けるようにする…というのがベストだとは思うのですが、
慣れるまでの間、何度も何度もミスを重ねてしまうのは悲しいので、
静的コード解析ツールを導入しました。

静的コード解析ツールというのは、コードを実行せずにコード中の悪い点を見つけてくれるツールです。

例えば、下記のような規約違反だらけのコードがあったとすると、

このように問題点を指摘してくれるツールです。

静的コード解析ツール以外にも、規約に沿った形に自動整形してくれるプラグインや、
過去のGitのCommitと現在のコードを比較するプラグインなど、
業務の効率化が図れるツールは積極的に導入するようにしています。

4. コードにコメントを書き、自分もメンバーも分かりやすいコードに!

コメントが必要な全てのコードにコメントが書かれていれば良いのですが、必ずしもそうではありません。
TAXELのコードの中にも、名前やコードだけでは意図が掴みづらいにも関わらず、
コメントが書いていないコードが多々ありました。

その為、コードを読んだ後は理解した内容をコメントで残すようにしています。
当然の事ながらコメントを書くべきではない箇所もありますので、
その点は気を付けなければなりませんが、
自分やチームの助けになるだけでなく、コメントにまとめる事で理解が進むように感じています。

5. キレイなコードを読み、参考にしよう!

成長する為には、上手い人のやり方を真似するのが近道である場合が多いと思うので、
一度キレイなコードを読もうと考えました。

TAXELのコードも、私から見ればキレイなコードではありますが、
それ以上にキレイなコードを見てコーディングの参考にする為に、
オープンソースのコードを読んでみる事にしました。

先輩にオススメを聞いたところMastodonが良いと聞きコードを読んでみたのですが、
とてもシンプルで読みやすく書かれており、キレイなコードを書く上での勉強になりました。

まとめ


今回の記事では、私が入社後体験した苦労や、その中でも最も苦しかったコードレビューへの自分なりの対策を書かせて頂きました。
私なりの対策ですのでより良い方法もあるかと思いますが、ほんの少しでも参考になったら嬉しいです。

上記の対策をしても尚、まだまだレビューを通すのに時間が掛かる毎日ですが、
一日でも早く成長してコードレビューやその他業務をミス無くこなせるように頑張ります!

2017-07-19

二ヶ月間の新卒エンジニア研修で成長できた事

はじめまして。

17新卒としてGMOアドパートナーズに入社したY.Oと申します。

本記事では、5月から6月に掛けて行われた社内研修テックイノベーション基礎研修と、6月から始まったOJT研修で学んだ内容に関して紹介させて頂きます。

この二ヶ月間の研修スケジュールですが、下記の内容で進行していきました。

  • テックイノベーション研修(5月)
    • 開発技術研修
      • Linux基礎学習(自習)
      • Ruby
      • Ruby on Rails
    • アドテクノロジー講義
      • 各プロジェクトの紹介
      • まとめレポート作成(自習)
  • OJT研修(6月)
  • GMOテクノロジーブートキャンプ(毎週金曜日)

それぞれの研修内容に関して紹介させて頂きます。


テックイノベーション – 開発言語学習 –

Linux基礎学習

Linuxのシステム構築・運用知識に関する資格であるLPIC、中でも基礎的な内容を取り扱うレベル1試験の年内合格を目標に、リナックスアカデミー著『Linux教科書 LPICレベル1』(Linux技術者認定試験学習書)という参考書を用いて、Linuxの基礎を学びました。

LPICレベル1は101試験と102試験の2つに別れており、双方の試験を合格する事で初めて資格が取れる仕組みになっています。
研修中では101試験の合格を目標に、自習時間を利用して対策を行いました、主な内容は以下の通りです。

  • システムアーキテクチャ
  • Linuxのインストールとパッケージ管理
  • GNU&UNIXコマンド
  • ファイルとプロセス管理
  • デバイスとLinuxファイルシステム

学生の頃には全く触れていなかったネットワーク系の知識が問われる内容となっており、非常に勉強になりました。
本記事執筆時点で101模擬試験の正答率は7割程度。7月中の101試験合格を目指して引き続き勉強を行っていきたいと思います。

Ruby講義

本配属後はRubyを用いて業務を行うため、Rubyサポーターズ著『パーフェクトRuby』(技術評論社)という参考書を用いたRubyの講義を受けさせて頂きました。

研修は基本的に講義形式で参考書を用いた説明をして頂いた後に、学んだ内容を利用して課題を解いていくといった形式で進んでいきました。

条件分岐/例外処理/ハッシュ/クラス/ブロック/MySQLとの接続…などなど、様々な内容を教わった後、最終課題として「MySQLから受け取ったデータを元にSlackにレポートを出力する」といった課題を行いました。

今までは、”分からない部分があった時に参考書を利用する”といったスタンスで勉強していたため知識が虫食い状態だったのですが、今回の講義を通して一から順に参考書通り勉強する事で、今まで抜けていた知識を埋めることが出来たと思います。

Ruby On Rails講義

配属後、TAXELの管理画面を編集する際にも使用するRuby on Railsの講義を受けました。

この講義はすがわら まさのり 著『パーフェクトRuby on Rails』(技術評論社)の5章までの内容を講義形式で順に学んだ後に、6章の課題であるイベント告知アプリケーションを成果物として作成する、といった内容でした。

Railsはインターンシップ中にも扱いましたが、自動的にファイルの関連付け等を行ってくれるため、詳しい仕組みを知らなくても簡単にWebアプリケーションを作る事が出来ました。その一方で、なぜこれで動くのか、といった疑問も多く存在し、理屈が分からないままでに使ってしまう場面も多々ありました。

今回の講義を通してオートローディングの仕組みやMVCの関わりといったRailsの基礎を学ぶことで、今までと比べて理解した上で使える状態になれたと思います。


テックイノベーション -アドテクノロジー講義 –

アドテクノロジーへの理解向上を目的として、HR研修(アドパートナーズグループ全体の研修)で学んだ内容も含めて「APグループのアドテク事業取組み」についてのレポートを作成するといった課題に取り組ませていただきました。

レポートを作成するにあたって、各プロダクトを理解する為にプロダクトの講義を受ける時間を設けて頂きました。
講義の中では自社プロダクトであるTAXEL/AkaNe/GMO SSP/GMO MARSといった様々なプロジェクトを先輩方から、実際の管理画面などを見せて頂きながら、プロダクトの内容や仕組みを丁寧に教えて頂きました。

講義の内容をレポートという形式にアウトプットする作業を通して、アドテクノロジーの概要や、自身が関わるプロダクトがどのように社会と関わっているのかという点を学ぶことが出来ましたが、複雑なアドテクノロジーの世界に関して、まだまだ理解出来ていない箇所も多いので、引き続き学び続けていこうと思います。


OJT研修

6月からはOJT研修として、TAXELの管理画面の開発に携わりました。
研修中の身ではありますが、ありがたい事に新機能の開発や可読性の向上といったお客様の目に触れる変更にも関わらせて頂く事が出来ました。
仕事の内容を聞いた当初はスムーズに開発が進むと思いましたが、実際に開発を行ってみると、様々な問題に直面しました。
しかし、先輩方の力を借りながら、徐々に改善を重ねる事で、自身の技術向上に繋げる事が出来たように感じます。
直面した問題と、それを解決することによって得られた技術・知識は以下の通りです。

Railsの思想に沿った設計が出来ない => Railsの思想の理解

OJT研修が始まるまでは、共同で開発する経験が殆ど無く、動きはするものの読み辛い/規約に反しているコードを書いてしまう事が多々あり、研修で書いたコードをレビューしていただく中でも、指摘されてしまう事が何度かありました。
その対策として参考書を何度か読み直しながら、レビューで指摘された点と比較し、どこが正しく、どこが正しく無いのかを一つ一つ確認していく事で、改善していく事が出来ました。
Rails研修を通して、今まで曖昧にしか理解出来ていなかったRailsの基礎を、一通り学ぶことが出来たように思います。

技術力不足 => 問題解決能力の向上

開発の中ではRails/Ruby/Javascript/jQuery/CSS/MySQL/HTMLといった様々な言語を扱わせて頂きましたが、まだまだ技術力が不足しており、知っていれば1分掛からない変更に1時間掛かってしまう事も多々ありました。
しかし問題を対処する中で、自分の力で調べ分からなかった点は質問し、得た知識を自分の基礎能力の向上に繋げる事で、全体的な問題解決能力が上昇したように感じています。

開発フローの不理解 => 開発フローの理解

集団開発の経験が少なかった為、仕様書設計やテストをどのような手順で進めれば良いのかが分からず、開発作業以外の作業で業務が滞ってしまう事が多々ありました。
しかし、順を追って先輩に教えて頂いた事で、二つ目のタスクを進める際は、殆ど質問せずに進めることが出来ました。
仕様書設計 => 開発  => 単体テスト考案  => 単体テスト実施 =>リリース手順書記述 といった、基本的な開発フローを学ぶことが出来たのは、OJT研修の中でも特に大きな成長だと感じています。

このように、OJT研修では様々な問題に直面しながらも、自分なりに対処することで成長へと繋げる事が出来ました。
まだまだ至らない点も多く、先輩方に助けられる毎日ではありますが、今後も問題を乗り越え成長して行きたいと思います。


GMOテクノロジーブートキャンプ

5月の半ばから7月の末までの毎週金曜日、GMOテクノロジーブートキャンプ(以下 GTB)に参加させて頂いています。
GTBは”No.1サービスを生み出している現役エンジニア”から”GMOインターネットグループならではの幅広い技術”をインプットした上で、”開発合宿を通してアウトプットまで行える”という、至れり尽くせりの研修プログラムです。

GTBで学ぶことが出来る技術の一部としては…

  • IoT
  • ITの歴史
  • DNS
  • ネットワーク
  • Linux
  • PHP
  • 仮想化
  • セキュリティ
  • デザイン思考
  • etc…

などなど、ここでは書ききれない程の多くの技術・知識を学ぶことが出来ます。

この記事を書いている時点で特に私の印象に残っているのは、「Pepper開発ワークショップ」です。
8人程度の班で4時間程の時間でPepperを使った成果物を作成・発表し得票数を競う、といったワークで、私達の班は、Pepperと会話をしながらジャンケンやあっち向いてホイで遊ぶプログラムを実装しました。
既知の言語で書くのであれば簡単な内容ですが、ほぼ全員がPepper開発が初めてという状況であった為、完成したのは時間ギリギリとなってしまいました。

しかし、最終的には見事得票数1位を獲得し、優勝する事が出来ました。短い時間の中で、チームメンバーとコミュニケーションを取り案を出し合いながらゼロから一つの成果物を協力して作り上げる、というチーム開発の醍醐味を濃縮したようなワークを体験することで、開発の楽しさをより深く知ることができました。


まとめ

約二ヶ月間のエンジニア研修を通し、「テックイノベーション研修」「OJT研修」「GMOテクノロジーブートキャンプ」の3つの研修プログラムを体験させて頂きました。
テックイノベーション研修からはスムーズに業務に入るための基礎技術を、OJT研修では実際の業務で直面する問題への対応能力をGMOテクノロジーブートキャンプでは多岐多様に渡る技術の知識とチーム作業の楽しさを、それぞれ学ばせて頂き、研修を受ける前に比べて大きく成長する事が出来ました。

研修は終わりましたが、7月からの本配属から本当のスタートとなりますので、エンジニア研修の経験を活かし、今後も気を引き締めて業務に取り組んで行きたいと思います。

 

【参考】
GMOの新卒技術研修2017 中間速報(GMOインターネット 次世代システム研究室)