A Day In The Boy's Life -6ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

規模がそこまで大きくない開発案件をする場合って、コードを書く作業自体をすべて一人でしてしまうケースってあったりするんですけど、こういうのに慣れてしまうとコードが自己満足になって保守性の悪いものになってしまうことがあったりします。

当然、一人であればそれさえも気が付かないのですが、別のメンバーが保守することになったり、拡張していく際にプログラマを増やすといった場合にそのコード自体の出来が悪くて恥ずかしい思いをしたりもします。

つまりは、見られるコードを書くという意識付けって結構大事なんだなと思ったり。

 

 

一人でコードを書く弊害

 

一人でコードを書くことに慣れてしまうと自分の癖が出やすくなったり、他人が保守することを意識しないことから例えば下記のような弊害が出てきたりします。

 

・ コーディング規約が無視される(そもそも守る気もない)

・ 暫定的なコードが多い(やたらコメントアウトした処理が残っている)

・ 何でもかんでも作る(車輪の再開発的なものが多い)

・ ベストプラクティスを意識しないので処理が冗長(長大なライブラリが出来上がる)

・ フレームワークなどを取り入れない(開発の効率性が無視される)

・ 連携できない(固定化した環境でしか動かない)

・ 仕組みが古い(スキルアップが図れていない)

・ バージョン管理されていない(ファイルのコピーでバックアップ)

・ コメントがない(謎の関数群)

・ テストがあまい(自分の環境で動いたからOK)

 

出来上がるコードが他人から見ると非常に保守性の悪いものだったりするわけですが、現状そのコードを保守するのは自分だけだという思い込みもあったりして、当人にとってはあまりそういう風には思っていなかったりするわけす。

また、エンジニア本人にとっても、「あの人と組んで作業するぐらいなら自分一人でやった方が効率的だ」という偏見を持ってたりする人もいて、確かに一時的な作業で言えば効率的なのかもしれませんけど、出来上がったものが先々のシステムライフサイクルを考えてベストなのかどうかはプロジェクトマネージャとしてはよく吟味しないといけないことではあります。

 

 

他人が読むコードという意識付け

 

こういう状況が長く続くと、「ソースを書くエンジニアと読み書きするエンジニア」で書いたように他人のソースコードをそもそも読まないエンジニアを生む原因となったりもするんだろうなと思ったりします。

実際、自分の癖や趣味を満載に盛り込んだコードを書いたとしても、コードとしてあるべき姿を反映できていない以上は、コードそのものに対してもあまり興味を持っていないんだと思ったりするわけです。

ですから、他人のコードにも興味が持てないし、他人が自分のコードを読むことも意識しなかったり。

 

プロジェクトでは多くは仕様が実装通りかどうか、テストがパスしているかどうかにばかり意識がいき、コードがどうであるかなんてあまり意識されないのでエンジニアとしてもその意識が希薄になりがちというのもあるんだと思います。

コードを書くスキルを上げるには他人のコードを読むのが手っ取り早いと思うわけですけど、その際に自分のコードとの差異は何があるのかや、そもそも自分の書いたコードに対して羞恥心を持ったり他人のスキルに対して純粋にすげーと思う憧れ的なものや原理を追求する好奇心を持たないとなかなかレベルアップしないと感じたりします。

 

もちろん、体制的なところでその案件の開発に割り当てるプログラマに限界があることはよくあることです。

そんな場合でも、きちんとその人のコードをレビューする人をあてがうだけでも当人の意識も変わってきますし、結果的にできるコードも第三者によるレビューが反映されたものとなるため随分違ってくることなんではないかと感じたりします。

コードが共有されるべき意味というのはそういったところの効果も大きいのだと感じます。

 

 

 

 

何かを始めてそれが習慣化されてしまうと日常の一部に普通に溶け込んでしまうため、それをいざ止めようと思うとなかなかしんどいことになります。

逆の事で、継続するために一番簡単な方法はそれを習慣化して当たり前にすることではあるんですけど、やめようとするときにその習慣が邪魔になってしまうことは皮肉なことではあります。

 

 

止めることを考える

 

歳を重ねていくと経過した時間の分だけ、色んな興味や状況において特定のことに熱心に時間やお金をかけたりすることがあります。

しかし、当然一日のキャパシティは限られますし、歳を重ねることで生まれる制約(使える時間や体力、優先度など)もあったりして、すべてを積み重ねて吸収していくことは不可能になります。

ですので、何かを取るのであれば何かを切り捨てていかなければならなくなります。

 

ただ、始めるにあたって止めることを考えることなんてないわけですよ。

これをやってみようと思ったときに、同時に1か月後にはきっぱりやめようとはなかなか思いません。

もし考えているとしたらどこか冷めていて、そこまで熱心に時間やお金を投資しようとは思わないでしょうし、のめりこむ心配がないのであれば深く考える必要はありません。

(ギャンブルなど中毒性があるものはその考えを狂わせるでしょうけど)

 

こうして始まって習慣化されたものは、そこに投資した時間やお金の分だけ止めることを考えることを止めるようになったりします。

例えば、ゲームに課金したとして、それをきっぱりやめてしまおうと思うのは、それまでの投資が無駄になることにはなるので、例え飽きていて内容に辟易しててもなかなかやめづらかったりします。

何か夢見て勉強に打ち込んだとしても、それを手にすることは無理だといつか気が付いてしまうかもしれませんし、アスリートの挫折というのは最たるものかもしれません。

 

子供のころに習慣化していたものは比較的簡単に止められたりもしますけど、これは親からやらされているものであったり、新たな興味によって頭を上書きしやすいですし、お金はあまりかけられないものの時間については若さゆえに比較的持て余しているからではないでしょうか。

しかし、止められないものというのは時間の経過とともに増えていきます。

それは趣味や思考が広がっていっているからかもしれませんが、それを止める算段を考えないといけなくなるのはいつしか来ることで、何に注力するかを見直すきっかけにもなります。

もちろん、やめない選択肢を取ることもできるでしょうけど、それは何かを始めない覚悟がいることでもあったりします。

 

 

撤退戦略を考える

 

こういうのはビジネスの世界でも当然あって、何かサービスを始めるにあたっていつかそれが終わる可能性が0ではないにしろ、誰しも最初から撤退戦略を考えようとはしません

サービスが成長路線に乗り、ユーザー数が増加、売り上げもそれに比例して伸びていくというToBeが描かれます。

ただ、市場がそこまで成長しなかったり、競争に敗れることもあるでしょうし、何か別の事情で資金繰りが悪化する、というケースはあるでしょうけどそういったことはリスク分析されものの、始める前からサービス自体を止める想定というのはまずしません。

 

アントニオ猪木氏は戦う前のインタビューアの質問に対して「出る前に負ける事考えるバカいるかよ」と答えた逸話がありますけど、まさにその通りでしょう。

ただ、結果としては誰かが勝者になれば誰かが敗者にはなります。

最初から考えるほど弱気になるなら始めないほうが良いのかもしれませんが、どう止めるのか、どう逃げるのか、どう取り外すのか、といった下調べをすることは重要なことのように思えます。

 

そうしないと万が一止めないといけない場合にがんじがらめの環境からでは抜け出すための労力がとんでもないことになったりします。

離婚は結婚の倍の労力がかかるって言われているそうですけど、同じようなことに思えます。

サービスを始めるよりは終わらせる労力のほうが大きいでしょう。

個人の習慣化したものを止めるのと同様、ビジネスの世界でもその環境が当たり前になってしまうと、そこで働く人がいたりお客さんやユーザー、下請けや協力会社など関連する人が出てきてそういった人の日常を壊すことにもなるわけです。

だからこそ終わり方というのをちゃんと考えておいた方がよいのかもしれません。

 

始めるということはいつしか終わりというものも必然的に訪れます。

始めてから終わらないための戦略というものはむやみに考えるものの、何をもって終わりにするのか、どう終わらせるのか、いつ終わらせるのか、といった撤退戦略をちゃんと考えておくことものめりこんで首が回らなくなる状況に陥る前に必要なことではないかと思います。

 

 

 

 

エンジニアを単純に二極化してしまうと、ソースを書くだけのエンジニアと読み書きするエンジニアという風に分けられたりもします。
前者は自分のソースコードを書くだけに注力するタイプで他人のソースコードをあまり深く読もうとせず、後者は職人気質なのか挙動をちゃんと確認するためにソースコードを読むタイプ。
 
エンジニアとしての評価は当然、ソースを読む技術が備わっていた方が高いわけですけど、この辺はその人の性格やタイプにもよったりするところがあって、不具合が見つかった時に原因よりもそれを早く治すことに注力するのか、原因を探るために深く掘り下げて特定していくのか、というような違いもあったりするので一概に良し悪しを評価しづらいところもあったりします。
 
 

ソースを読む技術

 
当然、プログラムを書くことができるので読むこともできるわけですが、あえてそれをしないのはそれで動いていてそれで問題がないからで興味や探求心がそこでストップしてしまうからではないかと思います。
ソースを読む派のエンジニアは、元ネタをきちんと確認しておきたいということでライブラリやフレームワークの中身のソースコードまで読んで自分の技術力を高めたり実装における不安を払拭したりしようとします。
 
書いた通り普段は問題ないのでその中身まで確認をする必要性はないといえばないのですけど、隠れていたバグが顕在化した際にどこで何が問題なのかという点はソースコードを追っていかないとわからなかったりするんですけど、「ここで変数を初期化しておけばこの不具合はとりあえず解消される」というように一時的な対処でしのいだりして、また後日別の問題にはまることになったりします。
ソースコードを読む理由は、そういった挙動をきちんと理解してそれに対してどのように自分がコードを書くべきかを予め設計できる点にあるのできちんと読むべきだと個人的には思います。
 
ソースを読まないというのは、ソースを読まずに済む環境にあるというのも一つの原因だったりすると思うんですけど、現状開発するにあたっては全てを一から作るというより既にある資産を流用したり、豊富なライブラリやドキュメント、便利なフレームワークが利用できたりもするので、そういったものを使うことに慣れてしまうと自らソースを読むことをやめてブラックボックス化させる結果を招いたりもします。
ビジネスロックだけを作らせていると、仕様書とのにらめっこになるので他のコードを読む時間がなかったり、指示通りの使い方やロジックの組み立て方しかしなくなるというのも一因にあるかもしれません。
 
 

ソースコードを読むことに慣れる方法

 
コードを読むのに慣れる単純な方法はコードレビューをすることではないかと思います。
他人のコードを読んで問題点を指摘することで、コードを読むことに慣れてきますし、それだけでなくシステム全体を俯瞰してみることができるのでコードを読むことでわかる不具合も見えてきます。
 
コードレビューをしていると自分のコードは棚に上げて問題点を指摘したりもするんですけど、そうやって自分のコードの書き方の良し悪しもわかってきますし、その人の書き方の癖なども読み解けたり、自分の知らない書き方や作法を学べる機会にもなります。
また、コードレビューということで業務的な時間も確保しやすいですし、持ち回りでやることでメンバーの教育も兼ねつつスキルアップを図るメリットもあります。
 
コードレビューをしていると、そのプログラムの挙動から、こういったデータを与えるとシステムに不具合が出るのではないかという想像も働くのでテストがしやすくなったりもします。
実際、コードの中身を知っているのと知らないのとではテストで見つけられる不具合の数というのは大きく違ってきます。
OSS系のライブラリなどで、リリースからかなりの年月が経過しているものでも大きなセキュリティ上の問題が発見されるケースがあったりしますが、長い運用時間の中で露出していないような問題でもコードを確認していると初めてわかってくることがあったりします。
 
コードをきちんと読む技術があれば、業務の引継ぎや教育に無駄な時間を割かれずに済んだりします。
設計書を見ればシステム仕様はわかるでしょうけど、それがその通りに実装されているとは限りませんし(多くは乖離が出てたり設計書の内容が古かったりします)何にせよシステムはソースコードの通りにしか動かないわけで、コードを読んだほうが真実がわかるわけです。
もちろんソースコードの量が膨大だったりすると読み込むのにかなり時間がかかりますし、他人が書いたソースを読むのは慣れていたとしてもそれなりの労力がかかることなので、そんなに単純な話ではないんですけど。
 
何れにせよ、コードを読む技術というのはエンジニアにとっては必須となっていますし、もしそのスキルを持っていないメンバーが多いのであれば、コードを読む機会というのを増やしてスキルアップを図っていくことは重要なことではないかと思います。