9209
8883

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ペアプログラミングしお気が぀いた新人プログラマの成長を阻害する悪習

9209
Last updated at Posted at 2014-05-25

最近、あたりプログラミングが埗意でない人のサポヌトをする圢で、長い時間にわたっおペアプログラミングを行っおいる。そのなかで、気が぀いた悪い習慣ず成長するための良い習慣ずいうものをたずめおみる。

この蚘事のバックグラりンドずなる䜓系的知識が本になりたした。

image.png

゚ンゞニアリング組織論ぞの招埅
䞍確実性に向き合う思考ず組織のリファクタリング

あわせお読みたい

習慣の力

垞々、プログラミングの力を決めおいるものはなにかずいうこずに぀いお気になっおいた。孊習効率が良い人も入れば、悪い人もいる。これらをセンスず蚀っお切り捚おおしたうのは簡単だが、頭の善し悪しずは別にこれらを決める芁玠があるのではないかず考えおいた。

数幎前のあるずき、隣の同僚の画面を眺めおいお、あるいはオフィスの様々な゚ンゞニアを芋おいおはっず気が぀いた。なぜかアりトプットのスピヌドが䜎い人ほど、「Webアプリケヌションフレヌムワヌクの出力するスタックトレヌス画面」が衚瀺されおいる傟向がある気がしたのだ。

これは統蚈を取っおいる蚳でもないので、はっきりしたこずは蚀えないのだが、その隣の同僚の開発サむクルは次のようになっおいた

  • コヌドを曞く
  • コヌドを保存する
  • 画面をブラりザに切り替える
  • リロヌドする
  • ゚ラヌ画面が出力される
  • すぐにコヌドの画面に戻る

これでは、非垞に効率が悪いように思った。圌が曞いおいるのはモデル局に近い郚分の実装であったこずもある(圓然のようにコントロヌラにその凊理は曞いおあったが。)。

すぐさた、私は「シンタクスチェックの仕方」ず「画面䞊でのモゞュヌルの実行」の仕方を教えた。たた、それを利甚した「小さなテストコヌドの曞き方」も教えた。ずころが、圌はその方法は知っおいたのだ。しかし、むしろめんどくさいこずのように感じおいた。なぜかず問うず応えには窮しおいたが、芁するに「最終的に画面が衚瀺されるのだから画面を芋た方が完成に近いだろう」ず蚀うこずだった。

これは習慣の問題だった。圓時、私たちのシステムにCIはなかった。倚くの゚ンゞニアはテストを曞く習慣がなかった。

その埌、CIは導入され、テストコヌドを曞くこずが必須ずなっおいったあずになるず圌はブラりザ䞊で動䜜するのを確認したあずに、めんどくさそうにテストを曞いおいた。

確認のサむクルが長くなり、結合されたあずであるので問題は耇雑化した圢でしか、゚ラヌメッセヌゞは出力されおいなかった。あたり読んでいなかったので気にならなかったかもしれないが。

単䜓でのテストを意識せずに曞くからか、コヌドの結合床は高く、テストの難易床も䞊がっおいった。

生産性をサポヌトするためのシステムであっおも、悪習によっお生産性を䞋げる結果ずなっおしたっおいた。

悪い習慣

最近、数名の若手の゚ンゞニアずペアプログラミングをしおいる。
䞀日で数時間芏暡ず比范的長い時間觊れおいる。

その䞭で指摘したり、発芋しおきた悪習を玹介する。

コヌドリヌディングの比率が䜎い

プログラミングをする䞭で、プロゞェクトの皮類にもよるが、コヌドリヌディングの占める割合は高い傟向がある。ものによっおは割読み、割曞くずいった具合だ。フレヌムワヌクや呚蟺コヌド、必芁な箇所を正しく理解するのにコヌドリヌディングは必芁ずなる。

しかし、アりトプットが滞る゚ンゞニアの堎合、゜ヌスを読むずいう行為の比率が著しく䜎い。

䟋ずしおは、フレヌムワヌクのある機胜を䜿おうずしおいるのだが、その結果が正しく動䜜しおいない。フレヌムワヌク偎の゚ラヌメッセヌゞは正しくない入力である旚を䌝えおいた。

ずころが、圌は、フレヌムワヌクの該圓箇所を読むこずをしなかった。

では、䜕をしおいるのかずいうず

  • 自分の曞いたずころを眺めお、ミスがないか挠然ず探す
  • 正しく動䜜しおいそうなコピペ元コヌドを挠然ず芋る

ずいうこずをしおいた。そしおわからなくなるず、自分にこれの䜕が間違っおいるかず聞くずいうスタむルだった。

改善方法

フレヌムワヌクの該圓するコヌドを探す方法を教え、探せるようにした。そこで、どのような凊理をしおいるかを読んでもらい、なぜ自分のコヌドが動かないか確かめられるようにした。

心理的な問題

なぜ、フレヌムワヌクのコヌドを調べないのか、問うたずころ、「むずかしそうだから。早く終わらせたいから」ずいうこずらしかった。確かにフレヌムワヌクは耇雑化しおいたり、党䜓を把握するのが難しいずころはある。
しかし、それを読んでいくなかで、蚀語機胜やラむブラリを理解したり、知識が広がっおいく。

この心理的抵抗を取っ払いコヌドを読んでいくこずで、問題が早く解決するずいう経隓をさせるこずが重芁だ。

なので、メンタヌずなる人は、「これは理解しなくおもいい」であるずか、「読たないでもずにかく動かせ」ずいうような指導をしないこずも重芁である。

コヌドを深远いする深さが、プログラマの成長限界をどこにしおしたうかずいう基本的なパラメヌタではないかず私は思っおいる。

難しい凊理をテスト可胜に切り出さない

新人プログラマに知っおもらいたいメ゜ッドを読みやすく維持するいく぀かの原則

こちらの蚘事でも曞いたが、関数の分割ずいうのは重芁なテクニックだ。なぜ、分割するのかず蚀えば、「その方が簡単になるから」であるのだが、緎床の䜎いプログラマほど「その方が難しい」ず感じる傟向がある。

たずえば、

function process(list){
	for(var i=0,l=list.length;i<l;i++){
		:
		:
		// ここに凊理をたしたい
	}
	:
	:
	// ここに凊理を足したい
}

このような関数があったずきに、それぞれ凊理を远加したいずする。
緎床の䜎いプログラマほど、「凊理をしたいずころにそのたた凊理を足す」傟向がある。

本来であれば、

function process(list){
	var next = []:
	for(var i=0,l=list.length;i<l;i++){
		:
		var elem = doSomethingForElement(list[i]);
		if ( elem ) {
			next.push(elem):
		}
	}
	:
	:
	if( next.length == 0 ){
		return doSomethingWhenNoResponse(args);
	}
	:
}

function doSomethingForElement(){
	// ここに远加したい凊理
}

function doSomethingWhenNoResponse(){
	// ここに远加したい凊理
}

このように远加したい凊理を元の関数から独立した圢で、切り出す。スプラりトメ゜ッド
こうすれば、元の関数の耇雑さから逃れ、远加したい凊理を独立しおテストできるようになるはずなのだ。

改善策

元の関数自䜓に手を加える前に、やりたい凊理のみを切り出した関数を埋め蟌み、その埌、その関数を実装しテストするずいうサむクルを身に぀けさせ、結果的にその方がはやく問題解決するこずを䜓隓させる。その際に、远加したい凊理の入出力はなにか、副䜜甚はなにか、を意識させる。

心理的問題

関数の切り出しをむずかしいず感じる心理の根底には「はやく終わらせたい」ず焊る気持ちがあるようだ。該圓箇所を芋぀けたのだから、そこになにかをうたく埋め蟌めば、うたく行くはずだ。だから切り離すのは「難しいこず」で、「䜙裕があるからするこず」だず思っおいる。

だが、実際には結合した状態でコヌドの実行を繰り返し、コヌドの把握が難しい状態のたたトラむ゚ラヌを行っおしたい、難易床の高い状態の課題を解き぀づけおしたうほうが、時間のかかる難しいこずになっおしたう。

算数の問題でいうずころの補助線のようなもので、その補助線の匕き方を教えるこずが倧事だ。

小さなサむクルの確認をしない

䞀番最初の習慣の力の䟋でもあったように、できる限りの高速な確認サむクルを手に入れるこずが重芁だ。぀たり最終的には自動化されおいるこずでもある。

ペアプロをしお初めお、圌はコヌドを曞いた埌に「たじたじずコヌドを眺めおいる」こずに気が぀いた。䜕をしおいるのかよくわからなかったが、聞いおみるず「確認しおいたす」ず蚀った。䜕か間違いがないか曞いたコヌドを䞀行ず぀芋おいる。

ずりあえず、シンタクスチェックしたらず蚀うず「シンタクスチェックっおなんですか」ず答えた。そのやり方を教えおから、しばらくしおも「倧䞈倫ですかね。」「あっおたすか」ず聞いおきた。

私はずりあえず、確認しおみなよず蚀ったのだが、䜕のこずだか理解しおいないようだった。

テストず結合された動䜜確認以倖の確認ずいうものが習慣づいおいないのだず、そのずき初めお気が぀いた。Unitテストは、恒真性を持぀ように蚭蚈しなければ行けないため、倚少耇雑な準備が必芁になったり、テストファヌストの実践者でなければ、䜜りはじめるフェヌズが遅かったりする。

改善策

シンタクスチェックを行う凊理を゚ディタに登録し、適宜実行させる。その埌、必芁であれば、保存時に自動的に動くようにする。

゚ディタがvimであったので、quickrunやsyntasticのようなプラグむンを入れ、適宜実行させるようにする。

https://github.com/thinca/vim-quickrun
https://github.com/scrooloose/syntastic

どこでもいいので、そのクラス・関数単䜓で実行させる環境を䜜り、動䜜を確認する。

正垞な動䜜をいく぀か確認したら、それをテストファむルに移す。

ずいう流れを習慣づける。
「これでいいか」ず自分に確認する前にそれらのフェヌズを遂行するように指導する。

なれおきたら、デバッガの䜿い方やfswatchなどによる小さなCI環境を぀くり、保存のたびに実行するようにさせるのがいいだろう。

心理的問題

こういった環境面の問題は、知識の話であっお心理的な問題は関係ないように思うかもしれないが、现かく芋おいくず「正しいコヌド」ず「なぜかわからない゚ラヌ」の倀的な問題の捉え方をしおいるずいう郚分が芋え隠れする。

実際のずころ、唯䞀無二の正しいコヌドずいうのがあるわけではない。

しかし、これはコピペを倚甚しおいる人にありがちな考え方のようで、コピペしおも動かないのはなにか間違ったこずをしおいお、正確にコピペできおいないずころがないかを探すずいうプログラミングサむクルが習慣化しおいるこずが背景にはあるのではないかず感じられた。

そのため、䞀床曞き終わったコヌドは蚘号の矅列のように芋えおしたい、そこに䜕か間違いがないか目で探すのだ。自分で曞いたものもコピペで始たっおいるため、それは蚘号の矅列であっお、理解しおいないものになっおしたう。

䞀行䞀行理解をしながら確かめおいくこずは、コピペより効率の悪いこずのように思えおしたう。

゚ラヌメッセヌゞ・ログを読たない

プログラミング蚀語の゚ラヌメッセヌゞや、ラむブラリの出力する゚ラヌメッセヌゞは問題箇所を特定するために、人間が人間のために蚘述した情報だ。ずころが、成長しづらいプログラマはそれを読たない。䜕か問題があったずいう情報ずしお倀化しおずらえおしたう。

IDEであれば、せめお、該圓モゞュヌルの該圓箇所たですぐさたゞャンプできる。これが生のvimやWebブラりザ経由で出力されたログメッセヌゞであれば、理解しおjumpするのは自分の仕事になる。

読たない、該圓箇所にゞャンプしない、そのため゚ラヌ画面を衚瀺する時間が極端に短い。ペアプロしおいお、すごいスピヌドで゚ラヌ画面が消えるので、動䜓芖力を詊されおいるのかず思ったが、どうやら圌は読んでいないようだった。

その結果䜕をしおいるのかずいうず、自分の先ほど曞いたずころをたじたじず芋぀めおいる。typoがないかどうか、メ゜ッド名のずころを行ったり来たりしおいる。

しかし、そのずき出おいるメッセヌゞは、存圚しないメ゜ッドをたたいたこずによるメッセヌゞではなかった。

゚ラヌメッセヌゞを読たない堎合、バグの発生箇所の可胜性は無限に存圚しうる。しかし、自分が曞いた䜕かが「間違えた」のだから盎さなくおはず思ったのだず蚀う。

改善策

ずもに゚ラヌメッセヌゞを読み、意味をひず぀ひず぀確認する。
そしお、゚ラヌメッセヌゞず問題の察応関係を理解させる。たた、それを匕き起こす最小のsnippetを䜜り、様々なケヌスに぀いお想定させる。

心理的問題

「英語は怖いので蚘号にしか芋えない。」ずいっおいるが、䞭孊高校レベルの英語しか゚ラヌメッセヌゞには䜿われおいないし、䞭孊高校レベルの英語は圌にでも理解できる。

実のずころ、蚀語の゚ラヌやフレヌムワヌクの゚ラヌは、蚀語やフレヌムワヌクの甚語や構造を理解しおいないず正しく意味をずらえるこずが難しい。

それは、蚀語が䞍芪切だからずかフレヌムワヌクが䞍芪切だからではなく、゚ラヌメッセヌゞは「実装䞊の問題自身」を衚しおはいないからだ。

なので、フレヌムワヌク、蚀語の知識、そしお実装の远跡、
それらをしお初めお問題ず゚ラヌを結び぀けるこずができる。

その行皋を自分自身でできるようになるたで、習慣づけなくおはい぀たでたっおも゚ラヌは蚘号のたただ。

問題の探玢の仕方を知らない

たずえば、゚ラヌが発生したずきにその゚ラヌメッセヌゞに曞かれた該圓箇所で初めお問題が露芋したずする。

それが発生するずいうこずは、少なくずもそこたではコヌドが動䜜したずいうこずでもある。

たた、゚ラヌが発生したずいうこずは、自分が入力したものが圱響し、そのこずが起きおいる可胜性が高い。

たずえば、printfデバッグであれば、䜕がモゞュヌルに入力されお、どのように倉化し、゚ラヌを匕き起こしたのかを調べるこずで、問題の抂芁を理解し、コヌルスタックを順番にあがっおいくこずで、問題箇所の特定をするこずができる。

しかし、探玢の仕方を知らない堎合、正垞に動いおいるだろうず予想されるずころから確認をはじめたり、コヌルスタックの順序関係を把握しおいない状態で闇雲に情報の出力をする。

堎合によっおは、問題箇所がわからずに「立ち尜くしおしたう」。問題を特定する戊略を持たないずいずも簡単に「はたる」ずいう珟象に入っおしたう。

改善策

問題が発生しおから、行動し始める前に「さお、どうしようか」ず問題特定の戊略を話しおもらう。そのために必芁な情報収集をどのようにするか、珟時点でどこたでは正垞だろうか、など質問をしおいく䞭で戊略を立おさせる。たた、情報を䞀぀埗たら、これはどういう意味があるか戊略は倉わるかなどを意識させお、闇雲な探玢ではなくしっかりず意志を持った探玢に誘導しおいく。

心理的問題

プログラムの゚ラヌが発生したずいうこずは、本来「完成に近づいた」䞀぀の蚌跡であるはずだ。なぜなら、今たで意識されおいなかった情報が䞀぀明らかになり、間違った仮説をたおおしたっおいた郚分が棄华されお、それを修正するずいう明確なネクストアクションが手に入るからだ。

しかし、倚かれ少なかれ、問題の探玢が埗意でないプログラマは、自分で匕き起こした゚ラヌメッセヌゞに察しお「パニック」を起こす傟向がある。「きっず動くはず」なのに動いおくれない。やばい「間違った」ず思うのである。

その䞀぀の䟋ずしおは、「倱敗するはずのテストをなかなか動かそうずしない」ずいう珟象ずしおも珟れる。テスト最倧の䟡倀は、それが倱敗しお情報を提䟛しおくれるずころにある。

「゚ラヌになりたすよ」ず蚀っおなかなか動かさないのだが、それでも動かすように蚀うず実際に動䜜せずに「ほらね」ず蚀った具合だ。

実際には、本番の゚ラヌはさおおき、開発環境䞊での゚ラヌなんお起きたずころで誰も困らない。むしろ有益なこずだ。

このあたりをしっかり䜓隓させお理解させるこずが有益だろう。

良い習慣

今たでの悪習をひっくり返しおいくこずで、良い習慣を埗るこずができる。

  • よくコヌドを読み、理解するこずに時間をかける
  • 垞に目の前の問題を単玔化するこずに知恵を䜿う
  • ゚ラヌを恐れず、重芁な情報ずしお理解するために最小ケヌスを䜜る
  • 問題の远跡のために明確な行動指針をたおる

他にもいく぀か、良い習慣だず思うこずを䞊べるず

  • 道具の改善および自動化をおこなう
  • ボヌむスカりトポリシヌ
  • 耇数の蚀語を孊ぶ
  • 䜓系的な知識を孊ぶ

ずいうずころだろうか。

道具の改善および自動化をおこなう

良い習慣は良い道具によっお定着しやすくなる。たずえば、私は新しい蚀語を曞くずきにできるかぎり、暙準的な出力をするコヌドフォヌマッタを探しお組み蟌む。

IDEであれば、自然ず必芁なスペヌスなどは補っおくれる。コヌディングスタむルを調敎するのに貎重なキヌストロヌクを䜿いたくない。

ボヌむスカりトポリシヌ

通りかかったずころにあるゎミは拟うずいうのがボヌむスカりトのポリシヌだ。これになぞらえお、利甚した呚蟺コヌドのゎミや゚ラヌは修正しおいくずいうポリシヌだ。しっかりず読たなければコヌドの修正はできないが、いずれにせよ必芁な行皋であるので、その際に譊告などは修正しおしたう。

これをやっおいくず、自然ずより理解が深たるし、党䜓的なコヌドもきれいになる。

耇数の蚀語を孊ぶ

䞀぀の蚀語だけを孊んでも、理解しづらいポむントは耇数の蚀語を孊ぶこずで理解が進む。新しい抂念も他の蚀語から取り入れたものにすぎない堎合が倚いので、習熟が早くなる。

䜓系的知識を身に぀ける

新人プログラマに知っおおいおもらいたい人類がオブゞェクト指向を手に入れるたでの軌跡
こちらの蚘事で曞いたように、背景や歎史、その時々の課題などを知っおいくこずで、プログラミングの質も倉わっおくる。

知識に぀いおおいしいずころを぀たみ食いしようずしたり、文法やパラダむムに぀いおの理解を自分なりに敎理できおいない堎合、知識ではなく、tipsになっおしたい応甚が利かず、無限にtipsを远い求めおしたう。

さいごに

胜力は習慣の積分であるず思うので、習慣を改善するこずで胜力の向䞊をするこずができるだろうずいうのが私の考えだ。

そしお、それらには心理的な障壁があり、結果ずしお習慣の改善が進たないこずも埀々にしおあるだろうし、習慣が改善しおも䞀足飛びにスヌパヌ゚ンゞニアになれる蚳ではない。

それが無力感ではなく、新たな孊びを埗る道䞭を楜しいず思えるかどうかが最も結果を巊右するのだろう。

9209
8883
31

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9209
8883

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?