Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

|

2013-06-23

[]幾つかの戦略フレームワークを使って自分のサービスの弱いところを分析する 01:48

 FXでの失敗ケース | Just another WordPress siteを一週間立ち上げてみました。発端の殆どは、自分の思いつきであるので、個人的な思い入れで拡張しています。しかし現実的な問題として一歩退いた目線で「このサービスはどうなんだろう?」という部分をあまり考えずにやっていると、自分が「これは絶対面白いだろう!」と思っていても、他人にとってはフックにならないことも多いのかな、という印象です。サービスを立ち上げている以上、ある程度使ってもらいたいし、広めたいという気持ちは単純に事実です。

 で、そこで「やはり戦略の部分とか考えないといけないよなー」と思って、そういう戦略分析的なフレームワークを、自分のサービスと当てはめて改善できるかどうかを考えていくのは重要かなと思って、いくつかの戦略分析フレームで、自分のサービスについて、今後どのように展開していくべきなのか、というところにスポットを当てて分析していったことを公開しようかと思います。

その前に、どんなフレームワークがあるの?

 とはいえ、戦略分析フレームワークでやろう、といったときにじゃあどんなフレームワークがあるのか、という問題があるので、その辺をざっと調べてみました。参考になりそうなリストとしては、下のようなものがありました。

リーンキャンバス

 この手の戦略フレームワークで一番有名なのはリーンキャンパスです。最近のスタートアップではリーンキャンパスという考え方が流行っていますが、それらと近い関係にあったりします。元々の考え方については、下の本を参照すると良いでしょう。

 今回のリーンキャンパスの画像については、下のブログから拝借しました。Thanks.

 で、さっそく描いてみた結果が下のようになります。

f:id:nisemono_san:20130624002120j:image

 これを見ている限りだと、「チャネル」であったり、「圧倒的な優位性」について弱いところが若干あるのかな、と思います。もちろん、そもそもの課題であったり、独自の価値提案そのものが、現段階においては「仮説」であり間違っている可能性もあるので、解析ツールで定期的に見直していく部分であるのかなとは思ったりします。

SWOT

 次はSWOTです。SWOTは、どうやらStrength/Weakness/Opportunity/Threatの頭文字を取り、強み/弱みと機会/脅威を分けて、それに対するアプローチを考えていく方法のようです。最初に参考したものが「競合」であるので、下に書いた図は競合になっています。

f:id:nisemono_san:20130624011649p:image

 書いてみた印象だと、やはりリーンキャンパスと似ている部分がある(強みなどを分析するあたり)とは思う一方で、それを組み合わせることによって、より「何をするべきなのか」というところが具体的になっている印象があります。

 つまり、一方でこういうリソースリスクを自分は抱えており、また外部状況として、このようなメリットをもたらしてくれたり、あるいは障害になりそうなものというのを組み合わせることによって、何をするべきなのか、ということを明確できるというのは、少し面白いかなとおもいました。

 ちなみに、SWOTに関しては、下の記事も参考になりました。

4C

 最後に、4Cによる分析を試したいと思います。4CはCustomer Value/Customer cost/Communication/Convenienceで分類します。それぞれ、「顧客価値」「顧客コスト」「コミニュケーション」「利便性」という四つによって分割します。例えば、自分のサービスであるならば、下のように書くことができるかもしれません。

顧客価値
漠然とした本に対する欲求を満たすことが出来る。また、普段だったら知ることのなかった本を知ることができる。また、たまに出てくる面白い商品を見つけ出すことが可能になる。
顧客コスト
ランダムで出てくるので、「欲しい」と思わせられる本に出合うかどうかはわからないので、何枚もページをめくる必要がでてくる。
コミュニケーション
ブログによって、どのようにサービスを開発しているか。特にはてなブックマーク技術者向けの話題が多いので、その話をする。その上で、サービスに興味をもってくれるように導線を貼る
利便性
ブラウザを通じていつでも閲覧できる。また、NexusやiPad程度の大きさのタブレットであるならば、それなりに快適に閲覧できるようになる。

 他の分析と4Cが違う部分は、恐らくは、今までの分析が自分たちのリソースとその関係を考えていくのに対して、4Cの場合は、顧客を中心として、その顧客に対してリソースをどのように与えればいいのか、というところの違いがあるように思われます。

 4Cについては、下のブログが参考になりました

まとめ

 というわけで、一般的によく使われるであろう3種類のフレームワークで、自分のサービスをどのように展開していくか、を分析してみました。

 ただ、この手のマーケティング分析で非常に感じることは、やはり「このような結果が出てきたとするならば、具体的なアクションはどのようになるのか」ということであったり、あるいは「果たしてこの分析の前提自体が正しいのか」という検証自体が必要になってくる部分があるのかな、という気がしています。

 とはいえ、自分が漠然とコンセプトとして考えていたことが明確になった、という意味ではやってみる価値はあるかもなーという気はしました。もし何かのときに、自分のサービスでも試してみるとどうでしょうか。

SamuelgluseSamuelgluse2017/04/02 18:16dalacin liniment pris
<a href= http://trinidadpi.bloggsite.se >zovirax cream genital herpes dosage</a>
<a href=http://project196270.tilda.ws>pergotime bivirkninger eller gravid</a>
dalacin 150 mg 24 capsulas
<a href= http://www.devote.se/grettaflam/ >flagyl 400 mg pris</a>
<a href=http://annettmarm.bloggnorge.com/exforge/>exforge novartis</a>
proscar finasteride biverkningar

WilliamStofeWilliamStofe2017/04/04 16:07nexium iv dosage
<a href= http://jorgemanwa.jimdo.com >diclofenaco potássico garganta</a>
<a href=http://www.imxprs.com/free/tarenchern/tarenchern>excedrin migraña nombre generico</a>
ciprofloxacino comprimido para que serve
<a href= http://kaleighdzi.myfreesites.net >augmentin bula</a>
<a href=http://www.breannawei-60.webself.net>pilula qlaira engorda</a>
augmentin mide bulantısı

MichaelMammaMichaelMamma2017/04/07 12:38amoxicilline posologie grippe
<a href= http://elwoodeast.soup.io >nolvadex pct</a>
<a href=http://leroypusey.startspot.nl>tolexine gé acné</a>
priligy pharmacie maroc
<a href= http://audreategn.over-blog.com/2017/04/doxyval.html >doxyval 100 posologie</a>
<a href=http://markettaro.startbewijs.nl>priligy 60 mg review</a>
amoxicilline sandoz 500 mg/5 ml

MatthewCitMatthewCit2017/04/07 16:29nolvadex pct for sale
<a href= http://jolenemale.onlc.be >nolvadex prix belgique</a>
<a href=http://salomemahe.page4.me>finasteride prix algerie</a>
efficacité finastéride cheveux
<a href= http://sydneyvoll.webblogg.se >tolexine 100 soleil</a>
<a href=http://jolenemale.onlc.be>nolvadex dosage</a>
amoxicilline sandoz 750

JamestopJamestop2017/04/10 16:19etoricoxib 60 mg 28 comprimidos
<a href= http://kirkagrest.myfreesites.net >etoricoxib cane</a>
<a href=http://www.luciocapsh-87.webself.net>teva celecoxib launch</a>
zovirax pomata effetti collaterali
<a href= http://kirkagrest.myfreesites.net >etoricoxib per cane</a>
<a href=http://www.luciocapsh-87.webself.net>celecoxib pfizer</a>
levetiracetam fiale torrinomedica

veveoguzetveveoguzet2017/05/30 04:54http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

eufonoyuwoeufonoyuwo2017/05/30 04:59http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

xiuwooleyxiuwooley2017/05/30 05:06http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

awzaajajimoawzaajajimo2017/05/30 05:07http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

axelujoveaxelujove2017/05/30 05:13http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

eserojoveserojov2017/05/31 19:50http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ircorefuqircorefuq2017/05/31 20:04http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ekjumnijuruekjumnijuru2017/07/12 03:11http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

oqepolucoqepoluc2017/07/12 03:24http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

imasamujulahuimasamujulahu2017/07/12 03:26http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

wacokidailizowacokidailizo2017/07/12 03:36http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

anowisozobonaanowisozobona2017/07/12 03:39http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

akinorotaecaakinorotaeca2017/07/12 03:50http://100mg-viagracanada.com/ - 100mg-viagracanada.com.ankor <a href="http://sertralinezoloftonline.com/">sertralinezoloftonline.com.ankor</a> http://20mg-tadalafil-lowest-price.com/

2013-06-22

[] Bookableにアイデア発想支援機能を追加しました 18:22

 自分の場合、例えば何か面白いアイデアが無いかな、と思った時に、本屋に行くことがあります。既に新書でも『なぜ本屋に行くとアイデアが生まれるのか』という書籍があります。本屋のあの雑駁な雰囲気というのは面白いなあ、と思って気分転換に行くことがたびたびあります。

 Bookableのコンセプトの一つに、本屋的みたいな本の散策インターネットで表現できないか、というのがあります。その一貫として、書籍を自然言語処理MeCab)を使って名詞を抜きだし、それらをキーワードとして本をランダムに並べるといいのではないか、と思いました。

 あともう一つとして、アイデア支援機能みたいなのを作ってみました。アイデア支援、というとおおげさですが、得られたキーワをランダムに表示して、なおかつキーワードと結びついている本を一冊表示するという簡単なものですが、結構、キーワードに対して「なるほど、こういう本が出てくるのか」という発見があったりして、面白かったので、もしかしたら生成変化的にアイデアが生まれないか、と考えました。下がそのスクリーンショットです。

f:id:nisemono_san:20130622181945p:image

 一つの提案としては、よく「アイデア支援カード」と自分が名付けているアイデア発想支援系のカードの小物が存在します。例えば、カタルタなんかは結構面白いものの一つです。また読書猿さんが紹介しているツールも、そういう系統のものですね。そういう風に出てきたキーワードを元に、何かを考えてみるという使い方がありそうです。

 これらが発想に役に立つのは、「人は何か見たものをトリガーにして、いろんなことを想像する」からだと思うわけです。そのトリガーとして、本も一つの「アイデア支援カード」として提示できそうだったので実装しました。実際のキーワードと、そのキーワードが具体化したような本を見比べてみると、「あー、そういうアプローチもあるんだな」というちょっとした発想転換が出来て、とてもよいと感じました。

 というわけで、ちょこちょこと改善を繰り返しているBookableですが、もしよろしければ、企画やアイデアに煮詰まった時に、だらだらと眺めてひらめきを発見するツールとしてもご活用して頂ければと思います。

ページが見つかりませんでした | FXでの失敗ケース

2013-06-21

[] Rにさわってみたかったので、はてなブックマークの本の傾向についてちょっと調べてみる 00:01

 月曜日から、はてなブックマークから取得してきた本をランダムで表示する「Bookable」というサービスを立ち上げました。その中で、適当に「50User以上」「50User以上25User以下」「25User以上10User以下」みたいな感じで、適当な範囲を設けていたのですが、ランダムに表示するサービスという性質上、どうしても母数が少ないと、同じ本が何度も表示されてしまう結果となってしまいます。

 で、どうせだからということで、はてなブックマークで、全体的に本に対するブックマークの分布ってどんな風になっているんだろう?と思ったので、調べてみることにしました。もちろん、Pythonで調べてもいいのですが、せっかくの機会なので、統計処理に定評のあるRを覚えるついでにでも、その辺の分析をしてみようかと思います。いまから使うデータは下に置いておきます。

 https://gist.github.com/esehara/ec4206f47b12278667e9

 ちなみに、参考にRによるやさしい統計学を使ってます。

まずはRを入れてみる

 とりあえず、自分はUbuntuを使用しているので、apt-getでサクッと入れました。

sudo apt-get install r-base

データを読み込ませてみる

 まず、何はともあれデータを読み込ませてみる必要があるでしょう。試しに上のcsvファイルを読み込ませてみます。ちなみに、Ubuntuだと"R"一文字で、対話型コンソールが開きます。

book_table <- read.csv('simple_data.csv')

 これで読み込まれました。csvのデータがbook_tableにある状態です。実際に、book_tableだけを、コンソールでたたいてみると

    Users Books
1     264     0
2     263     1
3     262     0
4     261     0
5     260     0
6     259     1
7     258     0
8     257     0
9     256     0
10    255     0
.
.
.

 という風に表示されました。Usersが、はてなブックマークのユーザー数であり、そしてそのユーザー数で記録された本の冊数がBooksになります。とはいえ、それぞれのカラムに、アクセスしたいと思うのが、普通だと思います。その方法は「$」でアクセスすることができます。

> book_table$Books
.
.
[136]    3    3    2    5    2    1    0    2    3    3    3    5    2    3    3
[151]    4    3    3    1    4    2    4    4    2    5    4    3    3    5   10
[166]    2    7    8    5    8    2    7    7    6    7    3    7   11    8    7
[181]    6    2    5   10   10    8    6   13   13    6   12    9    9   13   16
[196]   12   15   14   18   17   17   25   20   14   22   22   23   21   25   27
[211]   21   25   45   32   25   37   50   51   40   60   60   70   47   71   66
[226]   69   76   74   90   84   98  113  106  118  134  127  168  166  189  192
.
.

 といった形でアクセスすることが可能になります。そこで、このデータの相関関係を求めてみることができます。自分は統計について詳しくはないのですが、相関係数というものがあるそうです。

> cor(book_table$Books, book_table$Users)
[1] -0.3283284

 この負の数に関しては、絶対値で0.2〜0.4が弱い相関、0.4〜0.7が中程度、0.7〜1.0が強い相関関係になるそうです。どうも同じブックマーク数の本の数には相関がありそうにも見えるのだけれどもどうでしょうか。

 相関がありそうなところを調べる前に、散布図を作ってみます。plotという関数で作ることが出来ます。(ちなみに、png関数は、pngファイルを作るために、そしてdev.off()はファイルを閉じて保存するためのもののようです)

> png('test-graph01.png')
> plot(book_table)
> dev.off()

 これで散布図が下になるわけですが……

f:id:nisemono_san:20130620222959p:image

 …うーん、ちょっと左側が大きすぎて右側がよくわからないですね。ちょっと、どれだけ大きいのかを調べてみましょう。あえて、ユーザー数が1000冊以下のデータをばっさりと切ってみます。

> lot_users <- book_table$Books > 1000
> lot_books <- book_table[lot_users, ]
> lot_books
    Users Books
253    12  1192
254    11  1361
255    10  1776
256     9  2175
257     8  2868
258     7  3769
259     6  5316
260     5  7542
261     4  6300

 上手く切り捨てられましたね。さっそくこのデータでグラフを作ってみます。

f:id:nisemono_san:20130620222958p:image

 だいぶわかりやすくなりました。上記のデータにもあるように、5ユーザー辺りになると、かなり冊数が多くなってきます。

 それでは、逆に1000Userを切り捨てたデータでグラフを作ってみます。ただし、データを先回りして見ていた人ならわかるとおり、3以下のUser数に関しては生成途中なので、単なるゴミです。なので、これも切り捨てたほうがよさそうです。どうやら条件を複数指定するときは、subsetを使うと便利のようです。

> sub_users <- subset(book_table, book_table$Books < 1000 & book_table$Users > 5)
> sub_users
    Users Books
1     264     0
2     263     1
3     262     0
.
.
.
249    16   582
250    15   755
251    14   795
252    13   947
> 

 ちゃんと対象になりそうなデータが出てきましたね。さっそくグラフを作ってみます。

f:id:nisemono_san:20130620222957p:image

 もうちょっと細かく見てみたいので、13〜50の間のグラフにしてみます。

> sub_users <- subset(book_table, book_table$Books < 1000 & book_table$Users > 5 & book_table$Users < 50)
> png('test-graph04.png')
> plot(sub_users)
> dev.off()

f:id:nisemono_san:20130620222956p:image

 どうやら25を境目に横ならびになりそうです。例えば25以下だとしたのような感じ。

f:id:nisemono_san:20130621120439p:image

50Userから、かなり密集していますね。こんどは50User以上を切り抜いてみましょう。

f:id:nisemono_san:20130620222955p:image

 こうなると、かなりばらけていることが視覚的にわかりますね。

 恐らく、Bookableは、5User以下、5〜10User以下、10Userから25User、それ以上という形で敷居を持った方が、より広範な本がランダム出てくる可能性が高そうです。

 蛇足ですが、User数における冊数が1000冊以下だと、相関が中程度になるようです。実は、cor関数、テーブルをぶち込むと、各種の相関を出してくれます。

> books <- read.csv('simple_userdata.csv')
> less1000 <- subset(books, books$Books < 1000)
> cor(less1000)
           Users      Books
Users  1.0000000 -0.4712317
Books -0.4712317  1.0000000

 当然、Userが増えればUserが増える(当たり前なんですが)ので、UserとUserの相関は1となります。で、本来の目的はUserとBooksの関係ですが、-0.4712317と、かなり相関度が見られるように感じますね。

まとめ

 ということで、今回は間単にRをさわってみましたが、意外に簡単に解析が出来るという利便性と、単純にグラフがつくりやすいという意味では、なるほどたくさんの人に利用され、愛されているんだなあというのが伝わってきました。もちろん、Rをより効率よく使うためには、もっと統計についても勉強する必要があるので、その辺が課題になるでしょう。

anonanon2013/06/22 11:48おおきな値とちいさな値が混在しているときは対数グラフで見るというのもひとつの手ですので、よければお試しくださいませ

nisemono_sannisemono_san2013/06/22 18:21どうも、コメントありがとうございます!対数グラフというのがあるのですね。この辺まったくずぶの素人なので、少しずつ勉強しようと思います。対数グラフについても、あとで調べてみます。コメントThanksです :)

masahalmasahal2013/06/23 23:37こういう相互影響するものの分布はべき乗則に従うという話が『歴史は「べき乗則」で動く』などの科学解説書にのってます

nisemono_sannisemono_san2013/06/24 11:25『歴史は「べき乗則」で動く』という本、面白そうですね。機会があるときに読んでみようと思います。Thanks :)

2013-06-20

[] Pythonでシンプルにキューメッセージ管理をする方法 00:56

 自分の趣味といえば、いろんなサイトをスクレイプして、そのデータで遊ぶというのが趣味だったりします。で、単純に実装すると、だいたい1レスポンスで数秒かかったりして、非効率だったりします。例えば下のような感じですね。

# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import urllib

def main():
    html = urllib.urlopen('http://www.hatena.ne.jp').read()
    soup = BeautifulSoup(html)
    print soup.title.text

if __name__ == '__main__':
    main()

 この場合だと、対象が一つだから、urlopenでデータを習得する時間が遅くなってもまあいいかな、と思うわけですが、しかしこれが何万件のデータを取得する段階になると、とても遅くてやってられないのも事実です。

 Pythonには、並列的に処理をする一つの方法としてthreadingという標準モジュールがあります。これらによって複数のプロセスで習得できれば、ある程度効率化できます。今ではRabbitMQなどもありますが、ここは一つ、Pythonスレッドとその管理者にわけで、簡単に状況を受け渡しできるようなものを作ると便利ではないかと。

 たぶん、いろんな方法はあるとは思われますが、自分は配列を使うのが好きだったりします。以前にも記事にしていたと思うのですが、Python配列は、使用上、参照渡しになることになります。

 といわれてもピンとこないと思うので、実際にやってみましょう。

In [1]: a = [0, 1, 2]

In [2]: b = a

In [3]: b[1] = 9

In [4]: a
Out[4]: [0, 9, 2]

 どういうことかといえば、aとbは同じ配列を使っているので、bが変更されたとするならば、同時にaも変更されてしまうわけです。

 これはたしかにまどろっこしい仕様ではあると思うのですが、しかしこの仕様は、複数のスレッドで同じ状態を共有するのに便利だったりします。なので、そういうものを簡単に書いてみます。

# -*- coding:utf-8 -*-
import threading
import time
import random


def main():
    thread_number = 3
    child_ques = [[] for i in range(thread_number)]
    sampleque = list(range(100))
    threads = generate_thread(child_ques)
    run_thread(threads)

    while len(sampleque) > 0:
        for que in child_ques:
            if len(que) == 0:
                que.append(sampleque.pop(0))
        print "[Current Que Status]"
        print child_ques
        time.sleep(1)


def do_something(que_list):
    while 1:
        if len(que_list) != 0:
            number = que_list.pop()
            print "Do Something: No.%d" % number
            time.sleep(random.randint(1, 3))
            print "End, No.%d" % number


def generate_thread(common_array):
    generated_thread = []
    for number, arr in enumerate(common_array):
        th = threading.Thread(
            target=do_something,
            args=(arr, ),
            name="thread%d" % number)
        th.setDaemon(True)
        generated_thread.append(th)
    return generated_thread


def run_thread(threads):
    for thread in threads:
        thread.start()

if __name__ == '__main__':
    main()

 ちょっと長くなってしまいましたが、Threadは、何かしらの関数スレッドとして実行する、ということを宣言することができます。そのスレッドに対して、あらかじめ使おうと思っているスレッド数分の、配列配列を渡してあげます。前にもいったように、配列は参照というか、片方が変更すれば、片方も同じところで変更されているように見えるわけです。

 これを利用することによって、メインのスレッドからキューを追加することによって、他のスレッドに対して仕事を詰むことが可能になります。

まとめ

 というわけで、RabbitMQみたいな大げさなキュー管理をする必要はないけれども、ちょっとした処理のときに、キューを使って、効率よく処理していきたいなーと思ったときに、上のような実装をするとはかどるかもしれません。いや、もっといい方法があるのかもしれませんが、もしそのときは教えてください :).

2013-06-19

[]土日でサービスを作っていて考えていたこと 00:01

f:id:nisemono_san:20130618210147p:image

 ふと、Bookableのコミットのパンチカードを見ていたら、本当に土日に偏っていたので、俺は嘘をついていなかった!

 ……という冗談は置いておくとして、この記事は、前回の続きとなります。今回は、じゃあ実際にはどういう風にやっていったか、という話を書こうと思います。

何を作るのか

 何を作るのか、といったときに、いろいろな考え方があるかと思われます。自分が思い付く限りでは下のようになるかなーと思います。

  1. 自分が作りたい、欲しいものを作る
  2. 人が欲しがっているものを作る
  3. 技術として試してみたいものを作る
  4. お金が欲しいので、お金になりそうなものを作る

 ここで重要なのは、たぶん何らかの形で、作ることがモチベーションになるものだと思います。

 例えば、自分がTornadoで作ったNotVJSというものがあります。このモチベーションは、Tornadoと呼ばれる、Pythonで作られた非同期ライブラリを使いたかった、どうせならPythonWebsocketを使いたかった、というのがあったので、「もしブラウザ間で同期したら面白いものはなんだろう」と考えたときに、知人が、HTML数枚で画像をjQueryで加工してVJみたいなことをやっていたことを思い出したので、「そうだ、そういうのをつくればいいじゃん」と思って作ったものでした。

 上記の場合はそうですし、例えば今回のBookableについては、下の本に憧れて作ったものだったりします。

f:id:nisemono_san:20130618234908j:image

 上の本は工作舎と呼ばれる出版社(松岡正剛がいたところ、というとわかりやすい?)が作ったもので、他の人はともかく、自分はとても感銘を受けたので、こういうものを作ろう、と思ったのが初期のきっかけでした。

 最初のころのコンセプトとしては、下のように整理されるでしょう。

  1. 本をキーワードでぶったぎって配置する
  2. そこから有名な本とあんまり有名ではない本を配置する
    1. 「有名」の定義は、ブックマークのユーザー数として定義する
  3. 有名な本をフックにして、知らない本に辿り着ける

 このようなものとして、最初Bookableは考えられていました(ついでにアフィリエイトで金がGETできるんじゃないか、という淡い期待もありました)。

知人に話をしてみる

 で、ある程度作りたいと思うものの確証が出来たら、とにかく人に自分のアイデアを説明してみました。そうすると、案外好印象だったので、「結構面白がってくれる人がいるのであるならば、これはもしかしたら面白いものになるのではないか」と思ったので、実際に作ってみることにしました。

 知人にアイデアを惜しみなく話してみる、というのは、そのサービスに対しての反応がダイレクトに伝わってくるし、また人に説明することで、自分の中で、どういうサービスにするのかというのが明確になってくる。そういう意味では、知人に自分のアイデアを言ってみるというのは、最初の反応を見るのには、とてもいいんじゃないかと思います。

とりあえず必要になりそうなところから作り始める

 じゃあ何処から作り始めたのか、というと、実は書籍データをどのように集めてくるのかというところからスタートしました。というのは、画面を作るのは、たぶん簡単だろうと思ったからでした。

 ただ、今から考えると、当たり前といえば当たり前なんですが、あまりにも書籍データが集まってしまったので(だいたい四万冊とかその辺)、「あー、これは整理するのが難しいなあ」と思ったので、とりあえず自然言語処理で、名詞部分を取り出して連結できないかなーと考えたりして、実はその辺の実装は未だにやっていたりしています。

 で、必要になりそうなところといえば、本を表示する部分だなあ、と思ったので、テンプレートをさくっと書いて、ランダムで本を表示してみたところ、配置の妙というべきなのか、そこそこ面白い結果が出てきたので、「とりあえずこれでサービスを認知させて、その後のことを考えるか」みたいな感じでリリースしたのでした。

知人と協力してモノを作ってみる

 当然の事ながら、全部の事を一人でやるのもいいんですけれど、当然のことながら、得意な分野と苦手な分野があります。自分の場合だと、実装やコーディングについては、特に苦にはならないわけですが、圧倒的にデザインというか見栄えを作るのが弱いところがありました。で、ちょうど知人であるところの、豊井さんに頼みました。

 で、そのときに意識したのは、自分は基本的に全くデザインはわからない、ということでオペレーターに徹したということです。普段から一緒にすごすことが多いので、お互いの気質が解っていたというのもあるのですが、そのあたりの役割分担を上手くやったので、スムーズに楽しくできました。たぶん、このあたりは信頼関係だと思います。あと、単純に自分のスキルをお互いに補完し合う経験というのは、普通に楽しかったというのもありました。

普段から試してみたい技術をストックしておく

 これは技術者よりの話になるのかもしれませんが、日々最新の技術が生まれていきますし、「これはヤバい」と喧伝されていますが、いきなり自社のプロダクトにぶち込むのは、さすがに問題があります。なので、こういう場所で自分で試してみる機会になることがあります。例えば、自分の場合だったりすると、compassやsusyは始めて使ったものではあったのですが、それを試せたのは何よりも収穫だったと思います。

 たぶん、そういうものを試していく場所というのは、自分にとっては楽しい場所であるので、とてもよかったと思います。また、そういう「自分を楽にしてくれそうなオープンソース」の情報を集めておくことで、開発が便利になる側面もあるように感じます。

一度必要な画面・構成を洗い出してみる

 今回は、必要な画面が一つしかなかったので、シンプルな作りになったのですが、画面数がおおくなればなるほど、やはりある程度実装量は多くなります。自分は、もう少し若い頃に「超大作システムのRPGを作ろう!」と思って挫折した経験がなんどかあります。実装量が多いということは、それだけ保つべきモチベーションの量も必要になってきます(モチベーションも大切に運用するべきリソースだと思います)。

 どれくらい大きくなりそうなのかというのは、画面数を洗い流してみるとある程度わかったりします。もちろん、クライアント側のJavaScriptが増えれば、また問題は変わってくるのですが、今回の場合は、一画面だったので、実装が割と楽だったというのがあるとは思います。

反省するべきところ

 とはいえ、反省するべきところも無いわけではありません。

作成中に、実際に使ってみてユーザーの反応を見る作業が必要だった

 あとでリリースしてみてわかったのですが、シンプルにすることに拘りすぎてしまったために、実際に自分たち以外のユーザーからどう見えているのか、という調査を怠っていたのが少し問題だったかなと。普通なら、リリース前に、ユーザーの反応というか、使い方を見て、それをフィードバックして必要な機能を追加するという作業をするのですが、今回それをしなかったのは、イケてなかったかなと。「実はこういうのを作ってみたんですよ」という話をすることはあって、そのときに「あー綺麗だね」の一言で終わって、そのあとすぐに閉じる感じだったのに気がつけなかったのはダメだったなと。

 要するに「フック」という部分と、「このサービスがどういうものであるのか」というのを説明する必要はあったなあというのは率直な印象だったりします。実際に、「このサービス、ふと見るとどういうサービスなのかわかりずらい」ということを言われました。そこに鈍感だったのはよくない、というのは反省するべきところです。というのは、そのサービスの「はじめの使い方」をよく知っているのは開発者であって、それはユーザーにとってはわからない。その辺の視点が抜けていたのはよくなかったなと。

まとめ

 いろいろと書き連ねましたが、現在のところ、Bookableについては、自分がハードユーザーであることは間違いではないです。ソフトウェア業界には「ドックフード(=自分が作ったもの)を食べる」という表現がありますが、だいたい自分のつくったものというのは、どことなく愛着が湧いてくるものです。HTML5Canvasにキャラクターを描いて動かしているだけでもニヤニヤできてしまうところは自分にはあって、たぶんそういうものだと思います。

 今後の課題としては、恐らく「自分が一番楽しんで、愛着を持って使っている」というところから、「他の人にも、暇つぶしとして楽しんでもらえる」というところに持っていくというところだと思います。そういう意味で、もし貴方がBookableを使って楽しんでくれるなら、それは自分としても作ってよかったと思える部分だと思います。

 それでは、改めて、Bookableをよろしくお願いします。

 FXでの失敗ケース | Just another WordPress site

|