ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

イノウーの選択 (14) 読めない結末

»

 「井上さん、すいません」安川さんが顔を上げた。「エラーが出ていて。見てもらえますか?」
 ぼくは席を立つと、安川さんの横に立った。
 「どこですか?」
 安川さんは黙って、Eclipse のコンソールを指した。Gradle のメッセージが次々に表示されている。一見、順調に動いているようだが、しばらく見ていると、同じ処理を何度もリトライしていることがわかる。
 「あー、これは証明書の問題ですね」以前に自分の環境でも発生したことのある現象だ。「ちょっと待ってください」
 自席に戻り、共有フォルダから現象発生時に書いておいたメモを探したが、記憶のある場所になかった。そういえば、二人の入社前にシステム開発室用の共有フォルダを整理したんだった。ぼくはマリに囁いた。
 「前に書いてたトラブル用メモのExcel ってどこだっけ」
 「いつもの......」言いかけたマリは言葉を切った。「あ、そっか。変えたんでした。ちょっと探してみます。安川さん、ちょっと待っててください」
 安川さんが頷くと同時に、隣の席で尾日向さんが得意げな声を上げた。
 「ハローワールド出ました」
 「早いですね」
 ぼくはまた席を立って、尾日向さんの席に移動した。ブラウザに、Hello, World! の文字が表示されている。
 「いいですね。ソース見せてもらえますか」
 尾日向さんはEclipse に切り替えた。@RestController アノテーションの付いたクラスがエディタに表示されている。一つだけ定義されている返値がString になっているメソッド内で、"Hello, World!"をreturn しているだけだ。
 「OK ですね。すいません、少し待っててください」
 尾日向さん一人なら次に進むのだが、安川さんと同時に進める必要がある。
 「ありました」マリが声を上げた。「安川さんに共有します」
 ぼくは安川さんのPC で共有されたExcel ファイルを開き、keytool のコマンドを入力するように指示した。安川さんはコマンドプロンプトを開くと、核爆弾の解除コードででもあるかのように、慎重にキーを叩いていった。
 Enter キーに中指を触れた安川さんは、手を止めて入力したコマンドを再確認した。表には出さなかったが、ぼくも固唾を呑んでモニタを見つめていた。このコマンドが動作しなかったら、または、動作してもGradle のエラーが解消されなかったら......。ぼくは、安川さんが黙って立ち上がって部屋を出て行き、二度と戻ってこない、という光景を想像して、背中に寒気を感じた。
 不意に安川さんはEnter キーを叩いた。keytool コマンドは正常に実行され、JDK にルート証明書が無事にインストールされた。押し寄せてきた安堵の波に立ちくらみを起こしそうになりながら、もう一度、安川さんに試してもらうと、今度はすぐにSpringBoot プロジェクトが作成された。
 「よさそうです」
 「進めてください」
 安川さんの不運はまだ底をついていないようだ。

 ◇ ◇ ◇ ◇ ◇

 午後からは練習問題に入っていた。
 最初はEclipse でJava プロジェクトを作成し、コンソールでHello,World! を表示するだけ。まずは課題だけを与えて、自由にコーディングさせてみた。
 尾日向さんは、慣れた手続きで新規プロジェクトを作成し、public static void main() メソッドを書いた。作成から実行まで、たぶん5 分もかかっていない。後ろで見ていたが、ブラインドタッチもスムーズで問題ない。
 安川さんの方は、もう少し時間がかかった。プログラミングスクールに通った、と言う夏目さん情報は間違いではなく、最初から質問するようなことはなかったが、新規Java ファイルを作成したとき、コードを書き始める前にブラウザを開いて、helloworld java で検索したのだ。
 無数のリンクが表示された後、安川さんは日付が一番新しいサイトを開いた。どこにでもあるような例文がCodePen で載っているサイトだった。書かれているのは、尾日向さんが書いたメソッドとほぼ同じだ。てっきりそれをコピーして、そのままエディタにペーストするのだろう、と思っていたら、安川さんはしばらくモニタを眺めた後、リンク一覧に戻り、別のサイトを開いた。初心者向けのプログラミングサイトで、やはり同じような例文が載っている。
 安川さんはまたもや画面を注視した後、ようやくエディタに戻ると、慎重な手つきでクラスを定義し始めた。コーディングを開始してからは、特に迷うようなこともなく、Hello, World! を表示するメソッドを作成し、実行してみせた。
 「お待たせしました」結果が表示されると、安川さんは隣で待っていた尾日向さんに頭を下げた。「遅くなってすみません」
 尾日向さんは少し驚いた様子で「いや、別に」と手を振った。
 「安川さん」ぼくは訊いた。「さっき、ネットで例文を探したとき、2 つのサイトを見てましたね。あれはなぜですか?」
 「はい」安川さんは落ち着いて答えた。「ネットの情報には間違いもあるので、一カ所だけで判断するのは危険だからです。SEO で上位に来ているだけかもしれないですし」
 正直なところ、Hello, World! ぐらいでそこまで慎重にならなくても、と思ったのだが、そういう慎重な姿勢は悪いことではない。
 次に指示したのは、SpringBoot アプリケーションで、ブラウザにHello, World! を表示することだった。一応、SpringBoot スターター・プロジェクトで新しいプロジェクトを作成するところから説明したが、特に質問が出るようなことはなかった。尾日向さんは経験があり、安川さんは予習をしてきたようだ。
 今度は順調だな、と思って、二人がプロジェクトの作成を開始したところで自席に戻った。メールチェックをやりかけたところで、安川さんから声がかかったのだった。

 ◇ ◇ ◇ ◇ ◇

 プロジェクトが作成された後は、安川さんもそれほど時間をかけることなく、Hello, World! の表示まで進んだ。手持ち無沙汰だった尾日向さんが、横からアドバイスしてくれたのも大きかっただろう。ぼくがOK を出すと、安川さんは微かに満足そうな表情を浮かべた。
 「では、次に行きます。次はもうちょっと実践的なWeb アプリケーションの課題ですよ。まず、SpringBoot スターター・プロジェクトで、新しいSpringBoot プロジェクトを作成してください。名前はwebtest01 にしましょうか。バージョンやType はさっきと同じ。依存関係は、Web、Thymeleaf、JPA、あとPostgreSQL Driver も入れてください。まあ、入れ忘れても、あとから追加できますけど」
 二人はマウスを動かしてプロジェクトの作成に取りかかった。と思ったとき、尾日向さんが不意に顔を上げて訊いた。
 「質問いいですか?」
 「ん? なんでしょう」
 「いまさらですがEclipse を使ってるのはなぜでしょう?」
 ぼくはすぐに答えることができなかった。
 「えーと、どういう意味ですか?」
 「いえ、たとえばCursor だったら、SpringBoot のwebアプリケーションのプロジェクトを作って、で済むと思うんですけど」
 「ああ、そういうことですか」
 システム開発室での開発にEclipse をメインで使っているのは、単にぼくが慣れているから、という理由だけではない。エースシステムの推奨でもあるからだ。数十社の下請け、孫請けが参加するようなプロジェクトで、各社が自由に開発ツールを選択できるようにすると、ファイルのやりとりで問題が発生することがある、と理由は説明されている。
 「なるほど」ぼくの説明を聞いた尾日向さんは頷いたが、さらに質問してきた。「じゃあ午前中に、Cursor をインストールしたのは何のためだったんですか?」
 「Python 書くときは、そっちを使うからです」
 他にも理由はあるが、今は口にしなかった。
 「Eclipse ではダメな理由はあるんですか?」
 「Eclipse のPython プラグインはちょっといまいちなんです」
 「あー、そうなんですか。わかりました」
 尾日向さんは納得したようにプロジェクト作成に戻ったが、入れ替わるように安川さんが訊いてきた。
 「たとえばプロジェクトはEclipse で作るとして、Cursor を同時に開いて、コーディングだけやらせる、というような使い方は可能ですか?」
 さっき言わなかった理由をずばり訊かれて、ぼくは少し驚いて安川さんの顔を見た。実装の業務経験がない人にしてはいい質問だ。
 「可能です。ただし、Cursor のGradle 拡張機能はオフにしておかないと、勝手にあれこれ付け足してEclipse の方でエラーになりますけどね」
 尾日向さんも興味を示して、再び顔を上げた。
 「ということはですよ、これからやる課題も、その方法でやってもいいんですか?」
 「それはダメです」ぼくはニヤリとした。「まずは、手で書いてもらいます。それにやろうとしても不可能だと思います」
 「どうしてですか?」
 「すぐにわかります。とりあえずプロジェクトを作ってしまってください」
 二人はモニタとキーボードに注意を戻した。まもなく尾日向さんがEnter キーを叩いてオフィスチェアの背にもたれた。数秒遅れて、尾日向さんも同じ動作をした。
 一分後、プロジェクト作成が終わった、と二人から申告があった。
 「デスクトップに共有フォルダへのリンクがありますね。そこを開いて、build.gradle ファイルと、application.yml をコピーしてください。application.properties ができてると思うので、それは削除してください。コピーしたら、Gradle プロジェクトのリフレッシュをお願いします。終わったらBoot ダッシュボードから、デバッグで起動してみてください」
 5 分後、二人はプロジェクトを起動して指示を待っていた。ぼくは、二人のEclipse のコンソールを見せてもらった。どちらも正しく内蔵Tomcat が8080 ポートで起動している。
 「いいですね、じゃあこれ」ぼくは二人にプリントアウトを渡した。「次に作ってもらうのは、その画面です」
 印刷されているのは、ユーザID とパスワードを入力するだけの、シンプルなログイン画面のイメージだ。その下にログイン情報テーブルのレイアウト、社内のサーバに設置したbootstrap などのCDN のURL 情報が載っている。
 「これは」尾日向さんが言った。「よくあるログイン画面ってことですか?」
 「そうです。テーブルには、ユーザID とパスワードと氏名が3件ほど入れてあります。そこに書いてある組み合わせですね。ログインに失敗したらエラーメッセージ出して、ログイン画面に戻ってください。何か質問は?」
 「成功したら画面はどうすればいいですか」安川さんがプリントアウトを熟読しながら訊いた。
 「あ、そうか、すいません、書き忘れました。成功したらユーザID と氏名が表示されたページに遷移してください。会員制サイトでログイン成功したら、トップ画面になる、みたいに」
 尾日向さんが顔を上げた。
 「遷移の方法は、POST ですか? それとも、PRG パターンですか?」
 「任せます。自分が最善と思える方法で実装してください」
 安川さんは首を傾げていた。おそらくPRG パターンという言葉が理解できなかったのだろう。質問するべきかどうか逡巡していたが、後で調べればいいと考え直したのか、結局声を上げることはなかった。
 「ログイン画面の見た目ですが」尾日向さんは質問を続けた。「何かルールはありますか?」
 「特にないです。Bootstrap も使わなくてもいいです。フロントの方はまた後日やるので」ぼくの言葉にマリがニヤッと笑った。「今日は動作優先で。もちろん、完成して余裕があれば見た目にこだわるのはかまいません」
 「わかりました」
 「安川さんも大丈夫ですか?」
 「はい」
 「じゃあ、ちょっと待っててください」
 ぼくは自席に戻ると、Teams で湊くんを呼んだ。
 「例のやつお願いします」
 『わかりました......はい、設定しました』
 ぼくは二人の後ろに戻ると指示した。
 「ブラウザでどっか開いてみてください。Yahoo でもGoogle でも」
 二人は顔を見合わせてから、ブラウザを起動した。デフォルトだと社内のグループウェアページが開く。二人はアドレスバーにURL を入力した。尾日向さんはGoogle、安川さんはうちのコーポレートサイトだった。
 「あれ!」尾日向さんが声を上げた。「つながらないです」
 「こっちもです」安川さんも言った。
 「今、二人のPC はネットに接続できないようになっています」
 社内のPC からネットに接続するには、プロキシサーバを経由する必要があり、許可されていないIP アドレスは、プロキシによって遮断される。さっき湊くんに連絡して、二人のPC を除外してもらったのだ。
 「その状態で、さっきの画面を作ってください」ぼくは時計を見た。「一応、制限時間は定時までとします。休憩は随時、自由に取ってください」
 「えーと、つまり......」尾日向さんが訊いた。「ネット検索できないってことですか?」
 「はい。自力でやってみてください。どうしてもわからない部分は質問してください。さっきの共有フォルダに、最低限のアノテーションの一覧は入れてあります。あとはこれで」
 ぼくは二人の間に「入門 SpringBoot」の本を置いた。これは主に安川さん用に用意したものだ。
 二人は、特に安川さんは途方に暮れたような顔で、プリントアウトを見つめていた。
 「プロジェクト閉じちゃうと、もう一度開くときにネット接続しに行くかもしれないので、閉じないようにしてくださいね。では始めてください」
 そう言ったのに、二人とも手を動かそうとしない。何から手を付ければいいのかわからないらしい。尾日向さんが言った。
 「あの、これ、できるんですか?」
 「できますよ」ぼくは保証した。「問題なく」
 「そりゃあ、井上さんはいつもやってることでしょうけど......」
 「いえ、試したのは彼女です」
 ぼくの言葉に、マリは小さな声で「いえーい」と言いながら、ピースサインを作って見せた。
 数日前、ぼくは同じ課題をマリにやってもらった。プロジェクトを作った後は、LAN ケーブルを抜いてだ。マリはこれまでWeb アプリケーションをゼロから構築したことはない。
 最初は「これ、本当にできる?」と尾日向さんと同じ弱音を吐いていたが、マリも伊達にJINKYU をはじめとするWeb アプリケーションのメンテナンスをやってきたわけではない。一時間ほどかけてhtml テンプレートを作成するところから始めて、コントローラを実装してログイン画面をブラウザに表示するまで到達した。そこからは2 時間ちょっとでログイン機能を完成させた。コメントは不足しているし、ロジックにもムダな部分がたくさんあるが、とにかくぼくの出した要件をクリアしてみせたのだ。
 「ちなみにあたし」マリは得意そうに言った。「ふだんはフロント部分担当でーす」
 その言葉をどう捉えたのか、とにかく二人は手を動かし始めた。尾日向さんはキーボードの上で。安川さんは入門書のページの上で。
 ぼくは自分の作業に戻ったが、周辺視野に二人の様子を入れていた。
 最初、リズミカルだった尾日向さんのタイピング音は、次第にその速度を落としていき、30 分も経つと、途切れがちになってきた。これまでの開発において、いかに自分がGoogle やStack Overflow やTeratail のコードスニペットに依存していたかを痛感しているに違いない。ぎゅっと固く閉じられた唇から、たまに小さな破裂音が漏れるのは、無意識の罵声をかみ殺しているのだろう。
 安川さんは対照的に、静寂の中で作業していた。「入門 SpringBoot」の目次や索引を何度も行き来しながら、自前のキャンパスノートに時折書き込みをしている。見た限りでは、まだ1 行のコードも入力していないようだ。
 もし自分が二人の立場だったらどうするか、とぼくは脳の余剰部分で考えた。たぶん、手を動かすことを選ぶ気がする。IDE のインテリセンス機能に頼りつつ、試行錯誤を繰り返していく、というスタイルだ。尾日向さんと同じだ。
 15 時過ぎ、休憩室の自動販売機で缶コーヒーを買っていると、マリが合流して囁いた。
 「どっちが先に完成させますかね」
 「君はどう思う?」
 「普通に考えれば、経験のある尾日向さん」マリはアイスティーのボタンを押して、スマートフォンをキャッシュレス端末に当てた。「でも、案外、安川さんが先かもですね」
 ぼくは頷いた。必要な情報の収集が終われば、後はひたすらコーディングするだけだ。ただ、情報収集にもコツというものはあるので、定時になってもまだ書籍のページを追っているだけ、ということもありうる。
 マリが先に戻り、ぼくは人事課に寄って、JINKYU 関連の仕様を確認してからシステム開発室に戻った。
 ドアを開く寸前、室内から誰かの声が聞こえてくるのに気付いたぼくは、ID カードをスキャナーに押し当てようとしていた手を止めた。システム開発室のドアは、一応、事前登録された社員しか開けられないようになっているが、ドア自体が防音になっているわけではない。少し大きな声なら音漏れしてくる。
 ドアに耳を近づけた。くぐもってはいるが、明らかに尾日向さんの声だ。質問しているとか、談笑しているといったレベルではない。怒鳴り声と表現するのが適切なボリュームだ。ぼくは急いでID カードをスキャナーに押し当てた。

 (続)

Comment(1)

コメント

匿名

セキュリティ面から外部接続禁止というのはあっても自分のスマホで調べるはOKが多いです。
一般的な調べ物をスマホでして実装だったら手で入力以外は問題ないようにも思うのですが。。。

それもNG?

コメントを投稿する