Python奮闘記

主にPythonのことを書くつもりだったけど、プログラミング周り全般の備忘録ということにした。大体競プロ。

からくり株式会社3daysインターン参加記

インターンに参加したので記憶にあるうちにまとめておく。

背景ときっかけ

4月からアルバイトがリモートになってしまい、社員の人と話す機会が極端に減ってしまった。 不安症なので就活イベントにときどき参加して、自分の立ち位置を測っていた。 色々企業の人と話すと、自分はポテンシャルがあって即戦力レベルの実力も持ってるみたいに気持ち悪いくらい持ち上げられた。 その一方で、目指すものをもう少し定めた方がいいねとも言われることが多かった。 というのも自分はとにかく色々なものに手を出していて、これ作れるのかオモシレー、この言語身に付けてみたい、といった具合に特に明確な目的なくプログラミング学習してきた。ポートフォリオも一貫性がなく、何をしたいのかよくわからない人間に見えているのだと思う。 本心としては競プロが一番やりたいことなのだが、もちろん純粋な競プロが仕事になるはずがなく(ただのネトゲである)、競プロとは別に仕事としてやりたいことを見つける必要があると感じていた。

そういうわけで、夏季インターンでは自分の視野が広がることを期待していた。が、いざ申し込むとなるとESとか面接とか色々と面倒で(オイ)、結局申し込んだのは4つになった。そのうち1つは選考中に中止が決定、1つは断られ、残り2つは選考が通ったが1つは日程が合わなさそうなので断った。最初はインターン1つでもいいかと思っていたが、夏は長いのに1つだけはもったいないと少し欲が出てきた。

もう適当なものでもいいからなんかないかな、と思ってたらサポーターズから招待がきた。これがからくりインターンだった。どこだそこ、と思ったが3日間のハッカソン形式ということで気軽に参加できそうと思った。開催1週間前に招待するってなかなかやなと思ったが、とりあえず申し込んでみた。結果、参加することになってしまった。

本番まで

内容はSwift+XCodeiOSアプリの開発をすることであった。自分はSwiftは1ヶ月くらいで簡単なアプリを作っただけで、てんでトーシロなのだが、開発内容的にはまあなんとかなりそうレベルであった。事前課題があり、本番までの数日間でデモアプリを一通り動かせるようになるレベルを要求された。サンプルが用意されていたので、基本はこれを参考にして進めた。XCodeをいじるのは久々だったのでかなりググりながら(StoryBoard周りは本当に忘れてしまう)だったが、基本を確認できたと思う。というかSwiftLintの(XCodeの方なのか?わからん)自動補完が優秀すぎて、コード書くのはほぼ何も考えなくてもできた。"やることで実力がつく"と謳われた任意課題もあったが、研究の方のタスクが重くなっていたので適当なところでやめてしまった。

本番

一日目

オフィスは浜松町にあった。この数日間はとても暑く、外に出るだけで地獄だった。 出社して自己紹介フェーズに入る。参加者は5人だった。無給なのにわざわざ地方からきた人もいて、結構驚いた。レベル感は様々で、Swift職人みたいな人もいればまだ初めて間もないという人もいた。 会社の説明や課題の説明、グループ分けが行われたのち、昼食を挟んで開発が始まった。 個人的にはここでもう少し事前課題のフィードバックが欲しいと思った。グループはGitHubの利用経験と事前課題の提出内容で2つに分けられた。自分は3人チームに振り分けられた。

自分以外の2人がGitHubほぼ初心者で、必然的に自分がコード管理リーダーみたいな立ち位置になってしまった。いや別に自分も全然詳しくないのだけれど、他の2人がbranchを切るって何?くらいの感じだったので。

まずチームで作るものの設計を相談した。サンプルを参考に好きな機能を付けてみて、という雑な振り方をされたので何をつけようか話し合った。といってもアプリの大枠はAPIを利用したもので、APIの制限上大した機能は付けられなさそうに思えた。あと三日間という短期間でできそうなことは思ったより少なそうであった。作るのものの優先順位をつける必要性を意識せざるをえなかった。また、3人で開発するに当たってどう役割分担するかも大事であった。経験やレベル感を考慮し、基本的には1画面ごとに1人が担当する形になった。

初日は役割分担までやって、GitHubの基本的な使い方を確認したところで時間になった。帰ったら少しは開発を進めようかと思ったが、色々な人と話して疲れたので寝てしまった。

二日目

二日目に入る。書き忘れていたが、開発には自前のパソコンを使うように言われていた。自分のMacBook Airは2014年モデルで、メモリ4GBのストレージ128GBと、もうひと昔前のスペックだったため、XCodeでのビルドとかめっちゃ時間がかかるのである。競プロにはPCスペックはほぼいらないためこれでもいいかwと思っていたが、この数日間の開発でとても気になるようになった。他の2人のMacBook Proが一瞬でビルドが終わる様子を見るととてもうらやましかった。この時点で自分のPCスペックがグループ内でネタとして?確立した。

三日間という短い時間で完成させるにはやはり作業効率を少しでもあげる必要がある。自分はときどき他の2人の様子をみて、なるべく疑問点や詰まったところをグループで共有するように促した。ここで感じたのが、なるべく相談の敷居を下げるようにした方が話題を発しやすいということである。1人で開発するのが長いと、どうしても人に質問するより前に自分で解決できないか考えたくなる。わかる。この姿勢自体は褒められるものであるが、期間が差し迫っている場合はなるべく早期の解決を求められるため、疑問点などはどんどんグループ内で共有すべきなのである。この心理的障壁を少しでも下げるために必要なのは人間関係的な問題が大きいと思い、コミュニケーションが苦手な自分だがなるべくチームメイトと話題を作って信頼関係を築くのに努めた。これも立派なリーダーの仕事になりうるな、と感じた。

メンバーの完成したコードをマージするのは自分の役割だった。ここで苦労したのが、XCodeの表示に使われるprojectファイルが、ファイルを追加するたびに書き換わってしまう点である。projectファイルの中身はたとえば

     082CF76924D5B245001F7680 /* Client */ = {
            isa = PBXGroup;
            children = (
                082CF76A24D5D526001F7680 /* APIClient.swift */,
                0841933824D950FF00BFCBD3 /* ErrorType.swift */,
                0841933624D9505800BFCBD3 /* Logger.swift */,
            );
            path = Client;
            sourceTree = "<group>";
        };

といったような感じで、正直人間が読むものに思えなかった。だがプロジェクトにファイルを追加すればコンフリクトが起こってしまい、しかもファイル内容をうまく定めなければXCodeスクリプトなどが表示されなくなってしまう(何回か失敗してローカルプロジェクトを作り直した&作り直してもらうことになった)。プロジェクトファイルの内容は膨大で、マージにとても時間がかかった。後で社員さんに聞いたら「そこは慣れですね」と言われてしまった...

肝心のコードの方は、この人のこの実装ができないと進まない!といった状態になって思うように進まなかった。まあマージ作業で忙しかったのでどっちにしろ進まなかったと思うが。 この「〇〇ができないと▲▲ができない!」という状態になることは多く、たとえば画面間遷移をすり合わせるのは大変だった。結局遷移の関係ないところだけメンバーに実装してもらって、遷移に関しては自分が実装する形になった。終わった後で気づいたがこれはむしろ逆の方がよかった。先に画面遷移部を実装してしまい、画面の詳細を分担した方が効率よく作業できたと思う。反省。

二日目の終わりになってもメインの機能はまだ完成しておらず、さすがにヤバイと思った。家でもちょっと作業することにした。 全然関係ないが、ここで研究室の方から(タスクに関するきつめの内容の)メールがあり、帰った後かなりメンタル的に落ち込んでいた。この日は寝たのは3時半くらいだった。

最終日

最終日に簡単な発表とフィードバックがある。メインの機能は開発終了時間の1時間前くらいにようやく形になった。ここまでにさらに色々トラブルがあったのだが、ちょっと焦りすぎていてよく覚えていない。本当にこれ完成するのかと思っていたが、形になったときは結構安堵した。 残り1時間で細かいデザインなどを修正し、開発は終わった。ただ時間になっても修正案件は山のようにあり、発表までの空き時間(社員さんがコードを読んだりしてたと思うが、長かった)にも修正を続けた。最終日になるとメンバーもGit操作に慣れてきたようで、色々使いこなせるようになったようである。よかった。

その後自分らの作成品を簡単に発表し、社員さんから機能面/コード面の両方でフィードバックを受けた。自分らのチームへの指摘としては、

  • 時間がないときはライブラリに頼るというのも賢明な選択(ライブラリが使える状況にあるならなるべく使った方がいいというのはそうだろとも思ったが)。
  • 処理は関数/クラスにこまめに分ける。たとえばUIViewControllerにいくつも処理をベタ書きすると読み取りにくくなる。
  • チーム開発ではなるべく無駄な実装をしない。混乱の元になるのでコードは必要最低限に。
  • UIは使う人にわかりやすく。ボタンを押すだけの一ステップが心理的障壁になってしまう場合がある。

という感じだったろうか。まあどれも言われれば基本的なことなのだが、開発に夢中になってると疎かになりがちな点である。どうしても「動けばOK!」という気持ちになりがちだが、この辺に気を配りながら実装できるのがプロなんだろうなあ。 ちなみにもう片方のチームは自分らの機能に加えて色々やっていたようで、発表で完成度の差をまざまざと感じさせられた。まあ向こうはSwift職人がいたみたいだし、二日目の夜は2人とも帰ってから熱心に開発してたみたいだし(言い訳)。。

発表が終わって、懇親会が始まった。色々話をした。社員さんたちの仲は良く、働くのが心底楽しいという感じだった。新卒3年以内の人が多く、年齢層はかなり若めだった。フレッシュだなあという印象を受けた。 少し時間が経つと、なんと社長さんまでやってきた。ベンチャーを経営しているだけあって、身にまとうオーラが常人とは異なっていた。今回のインターンの開催経緯などを話してくれた。そして逆に、学生側に色々(「なんで申し込んだの?」とか)質問もしてきた。半分面接みたいだな、と苦笑いしながらも楽しくお話しできたと思う。

結構長いことお話をして、3daysインターンは終了した。

感想

企業の印象

社員さんは全体的に若く、「まだまだこれから」という雰囲気をビンビンに感じた。プライベートでの付き合いも多そうで、まるで大学のサークルみたいな雰囲気(想像)だった。ただ逆に、会社外の人との繋がりがあるようにはあまり感じなかった。良くも悪くも閉じている、という印象を受けた。人間関係でトラブルがあったりしたらつらくなりそう。

働き熱心なのは思った通りで、残業とかも苦なくやっているようである。それだけ楽しいということなのかもしれないが、体力のある若者が多いからというのも大きそうである。

チーム開発

バイトではプロダクトのほんの一部しか関われていないため、ここまで本格的にチーム開発をしたのは初めてだった。特にリーダー的な立場にいたので、気づくことは多かった。仕事の振り方や分担方法には結構悩んだ。めんどそうなところは自分がやってしまったが、本当はここもチームで知識を共有すべきだったのだと思う。かつてバイトで仕様書を読んで、処理内容どころか細かく変数名などまで定めてあったのを見たとき、「は?ここまで細かく決まってんならこれ書いた人が実装すれば良くない??」と感じたことがあった。が、このように「全体に齟齬ないように仕様を定める」というのはプログラミングとはまた違った判断力が要求される、立派な仕事になりうることを理解した。そういう意味で視野を広げることはできたと思う。

あとはすでに書いたが、チーム内でのコミュニケーションをとるのも大事だと感じた。情報を共有しやすくするため、仲間との信頼関係をしっかり築くのも生産性を上げる上で重要な要素だと感じた。こういうのは経営者の仕事かと思っていたが、現場の雰囲気を作り出すのはやはり現場の人間なので、自分の世界に入りすぎないでいることが大事だ。ただテレワークになるとまた事情は変わってきそうな気もするが。。

技術的な話

うーん。実は今回あまりコードを書いていない気がする。でもXCodeが優秀なので、Swiftを書くこと自体にはあまり苦労しなかった気がする。Web系ほどゴリゴリに実装する能力が求められる感じではなかった。実力を伸ばすなら色々作って経験を積むしかないとも言われた。もう少し何かやろうかな。。

就活生と話してみて

向上心があるというか、キャリア意識が強い人が多いと感じた。普段いる研究室(そもそもあまり行ってないが)やTwitterでの競プロ界隈には、将来のことは二の次で今楽しいと思うことをやるという人が多い。自分もその考えに染まっていることをまざまざと感じさせられた。そういう意味ではかなり刺激になった。

全体として

いい経験になったと思う。