正確には2年と2か月ですが。
前回 : 未経験からwebエンジニアになって1年が経ちました
運用・保守時点でのことをめちゃくちゃ気にするようになった
とにかくここに尽きる一年でした。特に個人開発ですが、
- 開発->ちょっと時間空く->改修
みたいなことが発生したときに、改修のフェイズでめちゃくちゃ時間がかかったり、認知能力に負担が大きくかかったりということが、サクッと作ったコードでは多いということに気づきました。
テストコードの作成やデザインパターン、アーキテクチャ、そういう抽象的な要素への理解を進めたり、実際に試してみてPDCAを回したり。開発への向き合い方はそんな感じに変わってきた2年目でした。
開発時間とのトレードオフ
サクッと作ればロジック自体を短時間でPDCA回せますし、堅牢に作るのは最初の段階でロジックというかドメインへの理解度が要求されるのでどうしても時間がかかります。
時間をフルに使えるわけではないため、ここのバランスは結構大事でした。
そこで似たようなロジックはライブラリとして作成し、そこの部分は時間をかけて堅牢に作り、それを流用することでコード全体の堅牢な部分を増やすみたいなアプローチをとるようになっていました
またついでに自動売買などの利益に大きくつながるロジックとは直接つながらない部分になってくるため、そういったライブラリはOSSとして公開するようにしました。ポートフォリオにもなりますし、Githubの正確な運用理解などにもつながったような気はします。
AIはすさまじい
AIはガチですさまじいです。コーディングに関してはどんどん具体的に質問をしていけば多くの場合はメリットデメリットの理解を深めることができますし、正直教科書的な書籍を読み漁るよりひとまずの把握を優先するなら間違いなく有利に感じました。
github copilotなんかも/explainコマンドでコードの解説を簡単に知ることができたり、明らかに技術者としてのレベルを上げやすい環境がネットにさえつながっていれば手に入るような環境ができてきているように思います。
少なくともプログラマーとしてコードを書く日々を送りながら、いまだにAIを開発に活用していないというのは孫正義も言っていましたが、人生を悔い改めたほうが良いように思います。
まだChatGPTを使ってない人は「人生を悔い改めた方がいい」――孫正義節が炸裂(1/2 ページ) - ITmedia NEWS
オブジェクト指向ようやく理解が深まった
ようやく自分の中で言語化されたような気がします。
そのうえでオブジェクト指向の最大の貢献はカプセル化で、同時に継承によって数多のシステムをスパゲッティにしたんだろうなって感じがします。
基本的にオブジェクト指向は言語ベースでいうとclassで表現されますが、classで属性とメソッドを同時に継承したりすると一気にカオスになる印象です。
これはビジネスロジックなどの変更によって属性とふるまいの乖離が発生することで、継承関係に例外的な部分が発生することがあるからだと思ってます。
なので最近の言語なんかでは属性とふるまいを別々で定義して継承するような動きがあるような気がします。
カプセル化はとりあえずやっておいて悪いことは少ないと思っているのでめちゃくちゃいい取り組みだと思いますが、継承は本当に気軽に使わないでくれって感じですね。
基本ふるまいは属性とどうしても結合しちゃいがちなので、それを継承させるとふるまいと属性が一緒くたに継承されて、後々の改修で乖離。スパゲッティ化が進んでいくので
静的型付け言語のほうが魅力的に思うようになった
またコーディングの話に戻りますが、動的型付け言語として前提が作られているPHPやRuby,Pythonなどよりも、RustやGo,もしくはTypeScriptのような型をつけることのできる言語(tsはちょっと違うけど)のほうが魅力的に感じるようになりました。
これはコンパイル時点でエラーを出してくれるというのが非常に良いというのがあります。よくあるのがnull許容していないのにnullもあり得る値が入ってきてArrayのメンバメソッドを使おうとして落ちるなど、そういった考慮の抜け漏れが動作まで発覚しないということを避けられるのが大きいです。
また型をつけることでそれ自体がドキュメントの役割をしてくれる部分もあり、開発コストは膨らみますが、それを補って余りあるメリットがあるように思います。
例えばPHPなんかでAPIへリクエストを送り、その戻りをそのまま返すようなメソッドがあった場合、その戻りはどのような値を持っているのかを知るには、エンドポイント側まで確認する必要があり手間です。
仮に型を付けてもこれについては、エンドポイント側でキーを追加するなどした場合、クライアント側での変更も必要になるなどありますが、gRPCという便利なものもあったりするので、やはり静的型付け言語のほうがいいよなと思ったりはします。
今どきはphpやpythonなんかでも型をつけようと思えばつけられるような気もしますが。
テストコードを書くようになった
途中でも書いたような気がしますがテストコードを書くようになりました。これの何がいいかといえば、ある程度きちんと書いてあるのであれば、多少の変更はそのテストコードがちゃんと通ることさえ確認できれば問題ないだろうと思えることです。
テストコードがなければ実際に動かして確認することになり、かかる時間が大きく異なりますし、なにより面倒くさいです。
なりたての頃はテストコードへの意識なんか全く持てていませんでしたので、ここは成長したなぁと自分で思ったりします。
terraformなど、運用自動化にも目を向けるようになった
terraformはまだちょっと触った程度ですが、自動売買システムを適当にgoogle cloudに生やしたりするより、コードベースで作っていったほうがいいよなーと思ったりしてます。
この記事の影響も結構あります。
Redisなんかも何度か聞いたことありますが、キャッシュをインメモリデータベースで扱うようにするというのは、UXのためにそこまでしてるんだなぁと改めて、いちウェブエンジニアとしてすげぇなぁと思ったりしました。
ライブラリを使うのをためらうようになった
これはある程度のものであれば自前で作れるようになったので、今後もちゃんと開発が続くかわからないライブラリを適当に使うよりはなるべく自前で実装したほうがいいよねという話です。
またOSS開発をしていると依存ライブラリを含むことになるのでライセンスについても考えることが増えてしまいます。そういうのも含めて面倒くさいです。
AIのおかげもあり、大抵のものは面倒くさいけど作れはするんだなとなったので、開発コストと相談してできそうなら自前で作ってしまうようになりました。
今までで作って一番難しかったやつ
※これは去年のやつみたら技術レベルがあんまりわからなかったので試金石的な意味で書いとく項目
多分typescriptの型定義ファイルからパーサーを用いて.md形式のドキュメントファイルを自動生成するやつと、
RustでRaydiumの集中流動性プールのオフチェーン計算の実装を書いたとき。どちらがむずいかというと後者だけど、ロジックが数学的に難しいという話なのでちょっ違うような気はする。
パーサーのやつは割と楽しかった記憶。こういうやつのほうが楽しいのでやっぱウェブやるにしてもフロントよりもバックエンドやもっとレイヤー低いところで遊びたいなと思ったりしました。
俺の草
なんもないところは何してたんだっけ?->dexbot開発してたっぽい。こういうとき適当にブログ書いてると便利っすね。
この頃はgithubにあげる習慣がなくて確かにローカルにしかない。最近になってようやくつぶさにpushするようになったりしました
来年はもっと緑!!!って感じにしたいですね。
---
3年目に入り、来年の10月になれば経験年数3年で転職を考えるには十分な年数になるように思います。現状どうするかはまだ決めてないですが、転職のためにいろいろポートフォリオを充実させたり、SNSを頑張ったり。やっておきたいことはいろいろあるなと思ったりしました。
一応そのために自分用ライブラリをOSSとして開発したりしています。
ただ明らかにAIはOPというか強すぎる代物で、ネット社会の登場が知の高速道路と表現されたりしていましたが、AIは新幹線や船、飛行機、ロケットなどより高速な代物であることは間違いなく、より技術格差を開かせたり、競争を激化させる存在なような気もしなくもないです。
参入ハードルが低下しコモディティ化するとかも長い目で見たら十分あり得そう。
どうなるにせよ、個人に紐ついた発信力はそうそう剥がれ落ちるものでもないので、いまだAIを活用していない技術者の多いうちに得た恩恵で有利に立ち回っておきたいなとか思ったりしました。
3年目はぼちぼち仕事をしつつ、2年間で積み上げた来たものを外向けに使って行く時期になりそうかなと思ったりしてます。