hitomedia Tech Blog

業務委託でもひとの成長にかかわりたい

Oct 28, 2017
7 Minutes
1382 Words

この記事について

はじめまして、業務委託としてヒトメディアでお世話になっている id:nunulk と申します。 今回は、とある若手エンジニア氏の Slack の分報チャンネルでの一言がきっかけで Python を触ってみることになった、ある日の日常風景をお届けしようと思います。

タイトルは、ヒトメディアの理念である「ひとの成長に、かかわる」から拝借しました。


普段はこちらに掲載されている apply japan チームで働いています。

学ぶ仕組みを提供する事業 - Portfolio | hitomedia, inc.

業務委託であるにもかかわらず、月イチの勉強会に参加させてもらったり、こうして技術ブログに書かせてもらったり、大変感謝しています。

新たな技術 - Python - の習得

普段 PHP を書いていることが多い私ですが、とあるきっかけで、Python を書く機会を得た、話です。

上記の若手エンジニア氏が、Bottle という Python のマイクロフレームワークを使ったアプリケーションをつくる、という話は聞いていたのですが(彼も Python はほぼ初心者)、あるとき、

default

というつぶやきを Slack 上で見つけて、

default

と問いかけてみたのがきっかけで、自分でも書きたくなったので業務の合間にリファクタリングをしてみました。

default

元のコードはこんなかんじでした

@route('/create', method='POST')    
def create():
    // ラジオボタンが4つある
    choice_a = request.forms.choice_a
    choice_b = request.forms.choice_b
    choice_c = request.forms.choice_c
    choice_d = request.forms.choice_d
    choices = [choice_a, choice_b, choice_c, choice_d]
    save_choice(choices)

上のやりとりにもあるとおり、Bottle では POST されたフォームの値を配列で受け取れないので、ある程度は仕方ないんですが、繰り返しを避ける、というのはプログラミングの基本なので、下記のようなクラスをつくってみたらどうか、という提案をコード付きでしました。

class CreateRequest:
    def __init__(self, request, alphas):
        self.request = request
        self.alphas = alphas

    def answers(self):
        choices = []
        for alpha in self.alphas:
            choices.append(self.request.forms.get('choice_' + alpha))
        return choices

呼び出し側は、

class ChoiceController:

    alphas = ['a', 'b', 'c', 'd']

    @route('/create', method='POST')    
    def create():
        req = CreateRequest(request, ChoiceController.alphas)
        save_choices(req.choices())

のように、だいぶスッキリしました。

ただ、なんとなく「Python らしい書き方ではないんだろうなぁ」という感覚はあり、調べている過程で Python にはデコレータなる仕組みがあり、bottle のルートで指定できるのを知ったので、以下のように書き直してみました。

    @route('/create', method='POST', apply=(bind_request(request, alphas)))
    def create(db, req):
        save_choices(req.choices())

CreateRequest.py にデコレータを追加しました。

# -*- coding: utf8 -*-

def bind_request(request, alphas):
    def _bind_request(func):
        def _wrapper(*args, **kwargs):
            req = CreateRequest(request, alphas)
            kwargs['req'] = req
            return func(*args, **kwargs)
        return _wrapper
    return _bind_request

class CreateRequest(object):
    """ snip """

バリデーションなんかもここでやれるといいですね(って思って書いてないですが)。

その後、本人から、参考にします!というメッセージをもらい、Python 書くの楽しかったなーという思いと、役に立ててよかったなーという思いがありました。


この出来事を通じて思ったこと

というわけで、今回期せずして Python を書くことになったわけですが、自分の所属しているプロジェクトの開発が一段落していたとはいえ、業務委託のプログラマーが、他のプロジェクトのメンバーを助ける、ということは、ありそうでなかなかないことなのかな、と思っています。

これまでたくさんの現場に参画してきましたが、時代の流れなのか、最近は「外注」ではなく「パートナー」と呼ばれたり、社内の備品を気兼ねなく使わせてもらえたり、という現場が当たり前になってきた感があります。

そういう意味で、ヒトメディアでは、業務委託だからできない、ということはほとんどなくて、冒頭にも書いたように、勉強会に参加させてもらったり、技術ブログに記事を書かせてもらったり、若手にアドバイスしたり、色々しています。

フリーランスといっても色んな考え方のひとがいて、もちろん、自分の職分をしっかりやる、というポリシーの方もいるでしょうし、言われたことはなんでもやります、という方もいるでしょうが、私としては、どんなことであれひとの役に立つのはうれしいですし、自分のやりたいこととできることのバランスを取りながら、今後もお役に立てていければ幸甚です。

Copyright 2026