一般社団法人Pythonエンジニア育成推進協会(以下、当協会)の顧問理事の寺田学です。 私は試験の問題策定とコミュニティ連携を行う立場です。 前回はPythonでの開発環境についてお話しました。 今回は開発のコツについてお話ししたいと思います。
■経験を積むために段階的な目標を立てよう
さて、プログラミングを学ぶ人のほとんどが、ただ技術を学びたいというのではなく、何かを作りたいという人たちだと思います。しかし、学んだからといってすぐ大がかりなものが作れるというわけではありません。
多くの人がプレイするような大規模なゲームなどは、大勢を集めて長期的なプロジェクトで作っていることがほとんどです。大がかりなものを作りたいなら、相当の学習と経験を積んだ上で協力してくれるメンバーを集めていく必要がありますので、そう簡単には進められません。
では何からスタートすればいいのかといえば、まず小さなものから始め、段階を追うように目標を立て、達成していくことから始めてみることでしょう。目標を立てるというのは意外と難しいもので、その段階の踏み方も様々です。
たとえば、高層ビルを建てたいと思ったとしても、家を建てたこともないような人では経験が圧倒的に不足していますし、当然ひとりではできないので上手くいきません。 そのため、まずは犬小屋を建てることから始める、その次に普通の家を建ててみる、というような目標を立てていきます。こうすることで、建築の知識を得て、経験を積むことができます。
この段階の踏み方は人それぞれですが、目標の達成に向けて段階を追うことの重要性は誰にとっても同じです。
■作りたいものができたら機能を分割してみよう
これは共に働くメンバーにも伝えていることですが、私が開発するときに大切にしているのは機能を分割することです。 Web系のシステム開発やデータ分析、自分用の便利ツールなど、何か作りたいものができたときには、まず機能を分割することから始めます。
たとえば、家を作るなら、まずは設計図を書き、材料を加工し、壁や屋根、お風呂などのパーツを作っていく、というような工程を踏みますよね。 ただ犬小屋を作りたいというだけであれば、特に機能を分割しなくとも、最初からコツコツ組み立てていくことで完成しますが、大がかりなものであればあるほど、接合部分の断熱処理をどうするのかなど、先にやっておかなければならないことが山ほど出てきます。 そうした必要な工程を分割して取り出し、ひとつずつ作り、最後に作ったものを組み合わせることでその建物は完成しますが、それは開発も同じことです。
そして、それぞれの段階の中で、あれを先にやるべき、これは後にやるべきといったことは、ある程度の経験を積まないとわからないことが多々あります。 機能を分割することで積まなくてはならない知識や経験が明らかになります。
作りたいものには様々な規模がありますので一口にいうのは難しい部分はありますが、それが何かの集合体であることは間違いなく、適切に分割できれば意外と簡単に解決することがあります。 ただ注意したいのは機能を分割しすぎると無限になってしまうので、ちょうどいいところを見極めましょう。その勘所は経験を積んだり、誰かに教わったり、勉強する仲間たちから学んでいけばいいと思います。
経験がないうちはどうしても複数のことを一遍に悩んでしまいがちですし、見極めが上手い人、そうでない人ももちろんいます。しかし、大体の人が1カ月程度で身に着けられるようになっています。
■機能を分割するには使える便利なツールも知っておこう
機能を分割することができても、便利なツールを知らないままでは作ったものを組み合わせられるかが分かりません。 家を作ることでいえば、釘やネジ、金具、トンカチなどの道具という存在を知っているからこそ、どの道具をどのように使えば、屋根などのパーツを組み立てられるのかということが分かります。 自分が知っている範囲を広げ、その物を知り、そして周囲のツールを使いこなすことが必要なのです。
大きいものになればなるほど、それ相応の時間と経験がないと何をやっているかが自分でわからなくなることがあると思います。見様見真似である物を改造して作るのでもいいと思いますが、結局のところ自分でひとつずつ経験を積んでいくのが近道のように感じています。
経験を積むことで、既存のツールや自分が作った部品でつなげられるといったことが分かります。それらを上手く使えば作りたいものを作れるようになります。
■Pythonには便利なツールがたくさんある
Pythonにはやりたいことを助けてくれる便利なツールがたくさんあります。 また、作った機能は組み合わせる必要がありますが、それは大抵の場合、フレームワークを使えばある程度可能ですし、フレームワークでできないことは独自の物を組み合わせることもできます。 様々なツールを知り、それぞれを組み合わせるインタフェースを作れるようになれば、できることの範囲をより広げることができます。
・pandas:データ加工や平均値/標準偏差の取得やグラフ化、データ分析などを行う
・Webフレームワーク:リクエストオブジェクトの処理からURL解決などのWebシステム構築をサポートする
・openpyxl:Excelファイルを操作する
・python-docx:Wordファイルを操作する
やりたいことによってどのツールを使うかは異なりますが、どんなツールであってもそれを使いこなすには、そのツールは何ができるのか、処理できるデータの形式は何かといったことをよく知っていなければなりません。 これがやりたいと思ったときにドキュメントを探してみたり、誰かに聞いてみたりすることで使い方がわかるようになりますし、新しいツールを学ぶときの参考にもなります。いろんなツールを知ることができれば、大きな塊を作るイメージも湧いてくると思います。
■機能分割とツールの関係
ここまでで機能分割とツールについてお話ししましたが、今度はそれぞれの関係について紹介したいと思います。 たとえば、Excelで管理されている住所録などのデータを、Wordの宛名シール用テンプレートに落としたい場合はどのようにすればいいでしょうか。 その流れを機能に分割し、対応できるツールを挙げてみると次のようなイメージになります。
②中間構造:openpyxlから受け取ったデータをPythonの文字列処理機能で加工する
③中間構造:加工したデータをpython-docsに渡す
④python-docs:受け取ったデータをテンプレートにはめる処理をする
このように、機能に対してそれを実現できるツールを知っていると開発がスムーズです。 また、中間構造はツールとツールを繋ぐためのインタフェースとなる部分で、繋ぐ際には、データをどのような形にすれば次のツールに渡すことができるかということをあらかじめ考えておく必要があります。このインタフェースを作れるようになるか、適切なインタフェースを探し出せるようになりましょう。
道具を知っていれば、組み合わせ方を考えることができますし、足りないものを作ったり、代替案を出したりすることが可能になります。知っているもの、使えるものをどんどん増やしていけば簡単に機能を作れるようになります。
自分のやりたいことをそのままGoogleの検索窓に入れても、直接的な欲しい情報は返ってきません。道具や文字列のメソッドを知っていれば調べることも容易になりますし、様々なことができるようになります。
■さいごに
作りたいものが持つ機能をどう分解し、組み立てていくのかはとても重要です。 最初は機能を分割するという思考をもつことは難しいかもしれませんが、経験を積み重ねればできるようになります。 機能分割を意識していないと、適切なところを見極められるようにはなりませんし、モノを知らなくては次の段階にいくこともできません。
たとえば、別の場所で作られているファイルを一度保存して持っていく方法について考えてみると、ネットワークで転送する、USBで渡すなど複数の方法がありますが、その方法がどういうものなのかを理解していないと、その道具をどう使えばいいかということは分かりません。 そうしたことを考えていくことで、機能をひとつずつ独立させることができるようになるはずです。
私自身、よく使用するツールはありますが、それぞれのすべての機能を網羅しているわけではありません。 このツールでできるかできないかといったことは今でもよく試しますし、自分のやろうとしていることが間違っているのではないか、考えていることが壮大すぎて方向性を見失っているのではないかと、数時間ほど悩むこともあります。 ココとココを上手い感じでやってくれたらいいのになぁと思うこともありますし、複数の道具を上手く使う方法を想像することもあります。
機能分割の訓練として、まずは設計図を書いてみることもひとつの方法だと思います。 設計図を書けるということは、道具立てもできるということになります。そう簡単ではありませんが、ひとつずつ分解して、機能分割に慣れていってもらえれば世界が広がっていくと思います。
[PR]提供:Pythonエンジニア育成推進協会