第67話 俺と幼馴染がペアプログラミングをした件について

※今回は、プログラマじゃないと理解不能な部分多数なので、

※雰囲気だけ感じ取ってもらえればと思います。

 

 バイトのために、Cしー言語でプログラミングをする事になった俺たちだが、先日思い知ったように、ミユとの技術差が激しすぎるので、まずはそれを埋めることが必要だと痛感した。


「それで、ペアプログラミングしてみないか?お前と俺で」


 ペアプログラミングというのは、2人のプログラマが1台のマシンを操作してプログラミングを行う方法だ。2人で一つのプログラムを作るというのは効率が悪いとも思えるが、技術の底上げやチームワークを培う、作業効率などの利点があるらしい。


「それは賛成だけど、何を作るの?バイトのプログラムは家だと無理だよ?」

「それなんだよなあ……」


 今回、バイトで頼まれたHyperEtherはいぱーいーさのライブラリを作るためには、HyperEtherの機能を持ったハードウェアが必要なのだが、それはさすがに持ち出し禁止らしい。


「そもそも、俺がC言語のプログラミング慣れてないんだよな」

「リュウ君は十分できるって」

「あくまで、ちょっと書けるだけだろ。仕事だとまだまだ足りないって」


 C言語は1970年代に生まれただけあって、色々なところが古いと評されているが、なかでも、プログラマが、メモリ破壊バグを作り込みやすいのが悪評の元になっている。メモリ破壊バグというのは、性質が悪くて、一つ間違えば、アプリのセキュリティにも大穴を開けかねないものだ。


 それはともかく、それだけ嫌がられながらもCが必要なのは、今回のような件だとC以外に適した言語がないという実情がある。


「とりあえず、システムコールを直接使うプログラムを書く練習をしたいな」

「それでも、何を書くかが決まっていないと、意味ないよ」

「まずは、ファイルをコピーするのを書こう。難しいの書いても挫折しそうだし」


 昨日、しゅんさんから教わった事を応用すれば、ファイルをコピーするくらいならなんとかなるはずだ。


「うん。わかった。じゃ、Linuxりなっくすマシン起動するね」

「ああ、頼む」


 我が家には、現在4つのPCがある。1つは俺が持っているノートPCでもう1つはミユが持っているもの。後の2つは、デスクトップPCで、それぞれWindowsとLinuxが入っている。バイトで頼まれたのもLinux上のプログラムなので、Linuxが入ったマシンが必要なのだ。


「はい、立ち上がったよ」

「よし、じゃあ、エディタ立ち上げるか」


 最近、プログラマの間で人気のVisual Studio Codeヴィジュアル スタジオ コード(略してVSCode)というエディタ(プログラムなどを書くためのアプリ)を立ち上げる。


「しかし、コンピュータ扱ったフィクションって何であんなおかしいんだろうな」

「どうしたの、急に?」

「いやさ、なんかずっと真っ黒い画面に文字が流れてるとか、それどう見てもプログラミングしてないだろ、って感じのプログラム風景とか」

「リュウ君、そういうのは野暮だよ」

「いや、そうなんだけど」


 どうにも納得が行かないんだよなあ。と、話が脱線してしまった。とりあえず、立ち上げたエディタに、まず、関数のひな型を書いてみる。


/**

* ファイルをコピーする。

* @from_file コピー元のファイル名

* @to_file コピー先のファイル名

*/

void copy_file( char *from_file, char *to_file);


「こんな感じでどうだ?」

「いいと思うんだけど、なんでJavadocジャヴァドク形式のコメント?」


 プログラムの中には、人間にとってだけ意味がある(コンピュータが無視する)文字を書き込むことができて、そういう文字をコメントという。コメントの中に、プログラムがどんな動作をするかを書くことが一般的だ。


 ミユが指摘しているのは、俺が書いたコメントはJavaジャヴァ言語で採用されているJavadoc形式で、C言語ではあまり使わないからだ。とはいえ-


「別に今、そこにこだわらなくてもいいと思うんだが」

「ん。そうかもね。じゃあ、私がcopy_fileの中身を書くね」


 プログラムに取り組む時のミユは恐ろしい程真剣で、普段の甘ったるい雰囲気は微塵もない。


void copy_file(char *from_file, char *file) {

int from_fd, to_fd ;

char content[BUFFER_SIZE] ;


}


 そこまでミユが書いている横で、ふと気づいた事をコメントする。


「BUFFER_SIZEって定義されてないよな」

「あ、忘れてた」


 慌てて、ミユが定義を書き足す。


#define BUFFER_SIZE 256

void copy_file(char *from_file, char *file) {

int from_fd, to_fd ;

char buffer[BUFFER_SIZE] ;


}


 ミユでもこういうところでミスをするのかというのは少し新鮮な気分だった。


「ところで、バッファを256バイトにしたのはなんでだ?」

「深い意味はないんだけど、1文字ずつだと遅くなるから」

「どういうことだ?」

「昨日、俊先輩が言ったことを思い出してみて」

「システムコールはOSの機能を呼び出すって奴か?」

「そうそう。read()もwrite()も、多く呼び出すとそれだけ遅くなるよね」

「なるほど。納得だ」


 とりあえず書けるという俺のレベルはまだまだだと痛感する。


「じゃ、続けるね」


 淡々とプログラムを書いていくミユ。


#define BUFFER_SIZE 256

void copy_file(char *from_file, char *file) {

int from_fd, to_fd ;

char buffer[BUFFER_SIZE] ;

int read_size, write_size;

from_fd = open(from_file, O_RDONLY);

if(from_fd == -1) {

perror("ファイルを読み込めませんでした");

exit(1);

}

}


「ファイルが開けなかったら、メッセージを出して終了するんだな」

「うん。とりあえず、動かすだけなら、いいかなって」

「まあ、そうか」


 さらに、ミユは下記進めようとするが、そこで俺がストップをかける。


「今度は、俺に書かせてくれ」

「うん。お願い」


 ここまでで、コピー元ファイルを開けたわけだから、次はコピー先ファイルだな。ミユと違って、システムコールのマニュアルとにらめっこしながらだけど、こんな感じか?


#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>


#define BUFFER_SIZE 256

void copy_file(char *from_file, char *to_file) {

int from_fd, to_fd ;

char buffer[BUFFER_SIZE] ;

int read_size, write_size;

from_fd = open(from_file, O_RDONLY);

if(from_fd == -1) {

perror("コピー元ファイルを読み込めませんでした");

exit(1);

}

to_fd = open(to_file, O_WRONLY | O_CREAT | O_TRUNC,0666);

if(to_fd == -1) {

perror("コピー先ファイルを読み込めませんでした");

exit(1);

}

do {

read_size = read(from_fd, buffer, BUFFER_SIZE);

if(read_size <= 0) break;

write_size = write(to_fd, buffer, read_size);

if(read_size != write_size) {

perror("コピー中にエラーが起きました");

exit(1);

}

} while(1);

}


「とりあえず、こんなもんだと思うけど、どうだ?呼び出すのはまだだけど」

「うーん、良さそうだけど……待って、開いたファイル閉じてないよ」

「あ!しまった」


 開いたファイルは閉じるのが鉄則だ。慌てて、次の二行を書き加える。


close(from_fd);

close(to_fd);


「うんうん。いい感じ。失敗したときに、いきなり終了するのは不親切かも」

「そこは、ちょっと目をつぶってくれ」

「じゃあ、後は、呼び出す部分を書くね」


 素早く、copy_fileを呼び出す部分をミユが書き連ねていく。動作確認のために、とりあえず、


$ ./copy_file test.txt test2.txt

$ echo test.txt

Testです

$ echo test2.txt

Testです


 となる事まで確認して、やっと一段落。


「とりあえず、出来たか。でも、これだけ簡単なのでも、結構めんどくさいな」

「だから、私達が頼まれてるんじゃないかな」

「それもそうか。しっかし……」

「ん?」

「いや、プログラマで食ってくのって、思ったより大変なのかもな」


 食いっぱぐれしなさそうと思っていたけど、案外そうでもないのかもしれない。


「私は、こういうの考えるのも楽しいけど」

「まあ、俺もちょっとはわかるがな」


 たったこれだけで、かなり頭を使った、と思ってしまっているようではまだまだだと痛感した。


 気がつくと、2時間も経過していた。自分の実力の無さを思い知らされるが、同時に、腹の音がぐーと鳴っているのに気がつく。


「ふふ。ご飯、用意するね」

「助かる」


 その後は、ミユお手製のお昼ごはんを堪能したのだった。ちなみに、最近は暑いので冷たいお蕎麦に薬味をたっぷり添えて、頂いている。


「最近暑いから、こういうのがいいな」

「でしょ?お素麺も買ってあるから、言ってね」


 すっかり、料理をするのが当たり前という感じのミユ。


「ほんと、いつもありがとうな」

「どうしたの、急に?」

「いや、ちょっと、飯作ってもらえるありがたみを痛感した」

「別に好きでやってるから、気にしないで」


 ご飯を食べた後は、再びペアプログラミングを再開。そんな風にして、暑い夏の一日が過ぎて行ったのだった。

 

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る