🔥

1年間で複数の言語をキャッチアップすることになった話

2022/12/02に公開

はじめに

自己紹介

山田 尚人(やまだ なおと)といいます。
SEVENRICH GROUP のグループ でCTO Boosterをメインで行っています。
SEVENRICH GROUPとは?
https://costcut.cloud/

個人のZennもあります。
https://zenn.dev/merutin

CTO Booster概要

CTO Boosterではパブリッククラウドで余計にかかっているコストを見つけて、改善を行っています。
インフラの過剰なリソース等を見つける以外にもアプリケーションまで踏み込んで改善を行っています。

アプリケーションの改善を行うに当ってはその会社の利用している言語やフレームワークを理解する必要があります。
この1年で様々なお客様の環境を触る機会があり、それに伴って複数の言語をキャッチアップしました。

元々のバックグラウンド

C言語、Java、TypeScriptをそれぞれの職場でメインで利用していました。

学習した言語・FW

思いつく限り上げてみましたが、FWレベルで言えばもっとある気がします。

  • PHP
  • Python
    • Flask
    • Django
  • Terraform
    • Terragrunt
  • Ruby
    • Ruby on Rails
  • CDK
  • Go
    • gin

まとめ

複数の言語に触れることで、言語に関わらず共通している点、言語ごとのメリットが以前より深く理解できるようになったと思います。
言語習得のハードルが下がったので、今まで手を引いてしまったような別の言語の話題や案件でも、何とかできるという自信につながったと感じています。

自分に合ったやり方は一人ひとり違うと思うので、あくまで現時点の私のベストなキャッチアップの方法です。
関わってきたプロジェクトの特性もあって、割と基礎から勉強しないと手が止まってしまうことが多かったなと感じています。
なんでかわかりませんが、Web上で学ぶより、書籍を電子でもいいので購入したほうが進みが良かった気がします。

言語

  • まずは公式のチュートリアルをやる。
  • とりあえずわからなくても、そのままコピペで動かしてみる。
    • 今は環境作成とかをちゃんとしなくても手軽に試せる環境があるので便利ですね。
  • そのあとに割と堅めな入門書を買って流し読みする。わからなかった部分は試してみる。
    • 基礎知識をある程度固めておかないと、ちょっとしたやりたいことがあってもすぐに詰まってしまうことがよく発生していました。
    • その言語の使い方を一通り学習することで、最低限の応用をできるようにする方が結果的に早くできることが多かったかなと感じています。

フレームワーク

  • 公式のチュートリアルをやる。
    • 都度、ちょっと値を変えてみる。URLを変更してみたり、返すデータを変えてみたり。
  • そのあとに、ZennやQiita等を見て、わからなかった点の解説をちらっと見て理解を深める。
    • 本当は公式のドキュメントをみて全部わかるのが一番いいんだろうけど、まだその境地には達してないですね。。

それぞれの言語のキャッチアップについて

それぞれの言語のやることになった背景と、どのようにキャッチアップしたのか改めて振り返ってみました。
上げた順で時系列になっています。

PHP

PHP

10年以上前にちょっとだけ触ったことがあるくらいで、プロダクションでちゃんと使われているコードを見るのは初めてでした。
とはいえ、C言語等と似たような記述方法なので、何とかできるでしょということで、特に事前に学習などはせずに、困ったときに調べればいいやという気分で開始しました。

良かった点

基本的な処理は読めたので、修正すべき点はすぐに見つけることが出来ました。
わからない部分は公式ドキュメント等を調べることで、明示されている仕様なのかどうか等を丁寧に調査出来ました。

成果

PHP 7.x → 8.xへのバージョンアップを影響範囲の調査から実行を含めて最小限の工数で実現しました。

反省点

php独自の基本的な文法が頭に入ってないので、ちょっとした修正に対してもこれであっているのかわからないっていう点が多くありました。
php独自の文法くらいは先にキャッチアップしておけばもっと早く解決できたかなということが多かったかなと思います。

Python

Python

どこかで基礎的な文法のみは学習した気がしますが、オライリーの機械学習の本をやろうと思って、そのままになっているくらいでした。
こちらもPHPと同時期にやっていたため、既存のコードを読みながら、不明な点があれば都度調べる対応をしていました。

良かった点

Flaskを使っていたので、Flaskの概要を学ぶためにチュートリアルを途中でやりました。
利用しているフレームワークの知識を身につけたことで、ディレクトリ構造の意図や何を修正するべきなのかの理解が早くなり、修正もできるようになりました。
当時のメモ:https://zenn.dev/merutin/scraps/d2348a2baee623

成果

Pythonのバージョンアップに伴って、Flaskの1.xから2.xのバージョンアップを行いました。
Flaskのセッション周りを調査して、Flaskがどのようにセッションを保持しているのかを理解して異なるFlaskのバージョン間でセッションを共有する仕組みを構築しました。
その結果、バージョンアップを無停止で実行できるようになりました。

反省点

Flaskをとりあえず起動したものの、しばらくはデバッグログの出し方もわからず苦戦していました。
色々調べていると、Python2系の話が一定程度出てきて、何が正しい情報なのかの精査に時間がかかった気がします。
キャッチアップするときには本や信頼できるサイト等を探しておいて、それを集中的に見るのがよさそうだと感じました。

Terraform

Terraform

同じIaCである、CloudformationやAnsibleの知識を活用できるだろうと判断して、取り組みました。

当時のメモ:
https://zenn.dev/merutin/scraps/773a8403776652
https://zenn.dev/merutin/scraps/e2df661502bb12
https://zenn.dev/merutin/scraps/1c4cdb219ffe2b

良かった点

チュートリアルが充実しているので、それをベースに考えることで割と何も知らなくても書けることがありました。

成果

TerraformでIaCを管理しているインフラに対して、全体を理解して必要な部分のみ修正を行いました。

反省点

結局AWSのAPIを実行するものなので、何がデフォルトのパラメータとして指定されるのか、何を設定する必要があるのかの細かい部分はAWSのAPIの仕様を読み込む必要があるってことに気が付くのに時間がかかってしまい、不要な時間を使ってしまいました。
言語というよりは、つくりをちゃんと理解して使わないと駄目ですねって話ですね。

Ruby

Ruby

前職の有給消化期間になんとなくRailsのチュートリアルをやっていました。
なにかミッションがあったわけではないので、取り合えず書き写してみる、のような形になっていて、あまり身に付いた感じはしなかったです。

良かった点

必要に応じて、Railsのチュートリアルを再度やり直してみました。
課題点があったときに、現状のソースコードを修正して再現させるのではなく、その状況のみを再現したコードを1から書くことで、修正点を早く見つけられました。
当時のメモ:
https://zenn.dev/merutin/scraps/3c0324635e55be

成果

ボトルネックになっている部分を見つけて、修正を行うことができました。
課題に対していくつかの仮説を立てて、再現させるコードを試してみることで、既存のコードとは独立した状態で検証が出来ました。
そのため、複数の解決方法に対して、それが正しく動作するのか素早く検証することができたので、最小の工数で修正を行えました。

反省点

他の言語と違った文法についてわからず、簡単な型の変換処理につまずいていました。
rails consoleはもっと早く知っていれば諸々試せたのかなと思います。

CDK

CDK

良かった点

TypeScriptでかけたので特になし。

成果

既存のリソースをimportして管理するコードを運用方法も含めて提案を行いました。

反省点

最終的に作成されるものはCloudformationなので、それを意識する必要があるのに気が付くのが遅くなってしまいました。

Go

Go

1からコードを書く必要がある現場への参画でした。
ちょっとしたチュートリアルでは足りないと思い、はじめてのGo言語を購入して、一通り読みました。

良かった点

本の内容を読んで終わりにするのではなく、気になった部分は自分で書いてみることを意識しました。
本では一部の抜粋のみだったので、書き出してみることで疑問点が明確になり、それ以外で色々処理を試すことが出来ました。

成果

Go言語のキャッチアップを効率的に行うことで、現場の課題に対して向き合う時間ができました。
その結果、プロジェクトの達成の目的や、仕様が正しいかなどの上流の部分まで積極的に関われるようになりました。

反省点

とはいえ、結構工数かけてキャッチアップしているので、もっと早くできるパターンを作っておきたいです。
おそらく、自分にあう書籍を見つけて、それを流し読みするのが一番早い気がしています。

最後に

達人プログラマーでも言われていることですが、定期的に新しい言語に触れることで、現在利用している言語のメリットデメリットが見えてくるようなことがあったと感じる1年でした。
言語ではないですが、特にRailsは多くのFWに影響を与えていて、同じような思想のFWが多くあったのでちゃんと利用する機会があって良かったです。

個人的には来年はRustを触ってみようかなと思っています。皆さんは何をやるつもりでしょうか。

DELTAについて

CTO Boosterではコストが削減できるから修正するのみに限らず、顧客の困っていることに対して多方面から解決を行っています。

自分の技術を試してみたい、色々な現場を横断的に見てみたい、ITエンジニアのサポートをしたいを思う人にはとても面白い環境だと思います。

Team DELTAではそれ以外にも、グループ事業のサービスの構築等、様々な仕事を責任を持って取り組める職場です。

やりがいのある環境だと思うので、興味がありましたら、 delta.tech@sevenrich.jp まで連絡を下さい。

番外編

Railsの動きがわからず、上司に相談したところ
「スクリプト言語なんだから全部読めるコードがダウンロードされているので、読めばわかるよ」
ってアドバイスされました。
確かにそうですね。(もちろん、もっとちゃんとしたアドバイスは頂いています)

Discussion