期待するコードを期待するように書こうという本

リーダブルコード読んだ。期待するコードを期待するように書こうという本。O’Reilly Japan – リーダブルコード

ヴィジュアル大切って言い切っててハテナマーク出てしまったけど繰り返し言われたらそんな気もしてきた。IDEリーダブルだけ考えがちだった。ファーストビュー的にぱっと見える視覚情報重要。上見たり下見たりはダルい。あと横道ではレビュアブルコードってのもあるかなーって思った。

レビュアブルコード

今の自分のお仕事のコード意味ある単位でコミットしてない。 vcsの泣き言はあるけど、問題を一対一で解決して行かないとすぐ解んなくなってしまう。svn extermal無双でgit-svnが無理ゲーになってしまい生svn触らないといけない。gitでローカルにコミットするほど細かくはないけど、local-remoteでpush できるなら今の3commitが1pushになりそうなぐらいの粒度。あれ他人が読まされても厳しいと思う。レビューツール側で何とか巻き取ればいいのかね。横道終わり。

見た目から始まって、イディオムに従って、期待に反さず、直感的で、誤解を生まないコードの具体例。汚くて本質と関係ないところは括りだしましょう。くくりだしすぎても今度は読めません。英語的に読み下せるコード、でもないですよ。

以下読みながら書いたメモ書き。本と照らし合わせないと意味不明。

indexの添字

i, j, k
member mi
user ui
これよみ辛くね
for入れ子まみれのメソッドの方を直したい

誤解を招かない命名

filter()
Clip(text, length)
min, max
first, last
begin, end

定数にコメントを付ける
なぜその値を持っているのか
これだ!

条件式の引数の並び順

ヨーダ記法見たらリーダブルコード読んでない認定していい
2変数の比較って小<大が見やすいんだけどオレだけらしい
bytes_received < bytes_expected
変化する値を左に、より安定した値を右に配置する

ネストを浅くする

“精神的スタック”

“反対から問題を解決してみる”
いい言葉だ

クラスのメンバへのアクセスを制限するもう一つの方法は、メソッドを出来るだけ
static にすることだ

えええー とはいえ前からstaticおじさんのアンチテーゼとして全部objectおじさんなことは自覚してるので正しく使いたいなあ。結局状態持ちたいんじゃね?持たざるをえないんじゃね?とは思ってる。

for で条件にtrueは混乱招くだろー
オブジェクト変わっちゃうメソッドチェーンはevilだとおもう
goosかxutpで読んだやつ

身近なライブラリに親しむ
道具箱に入れる

getは多くの人にとって軽量アクセサを意味する
へー

ランチ社内読書会やってみた 塹壕よりScrumとXP

ランチ社内読書会やってみた。
塹壕よりScrumとXP – Scrum and XP from the Trenches

4回ぐらいでさらっと終わらす予定だったのだけど、10月末から12月末まで7回もかかった。

きっかけ
kawaguti: アジャイルに興味があるソフトウェア開発現場の方は、とにかくまず「塹壕よりScrumとXP」をみんなで読んでみることをお勧めしたい。InfoQ Japanより無料で手に入る。
http://twitter.com/kawaguti/status/28705637412

pdf入手場所
http://www.infoq.com/jp/minibooks/scrum-xp-from-the-trenches

進め方
ぼくが章の中身をメモってきて、それを肴に社内の実際のプロジェクトでどうやってるのか、の話を振る感じに落ち着いた。
負担と見返りとを考えるとこれが出来る精一杯かなあと。
事前に読んできてもらうのも、それが出来るようにまとめてくるのも、どちらもハードル高い。
自分にファシリテート力もコミュニケーション力もないので、参加してくれた同僚のおかげでどうにか一通り回せた。
半年後に、もう一周やってみる。

はじめたときの立ち位置
ぼくがxp厨 xpは一人からボトムアップで出来るし
でもscrumよくわからない 組織論ばかりでうさんくさいとおもってた
社外のアジャイルな開発のひとたちでscrumな勢力強い
社内にscrumっぽいやり方が導入されはじめた
xpでもscrumでもリーンでもなんでもいいや 小異を捨てて大同につこう それがアジャイルマニフェストだよね
まず知ろう

やってみてわかったこと
読んでメモして説明するだけで、分かりにくかったことも同僚がフォローしてくれてどうにか頭に入った
開催日の締切り駆動だと泣きながらどうにか頑張れた
毎回新しい人が見にきてくれた
圧倒的に自分が得

課題
開催曜日時刻が安定しなかった
→ぼくの業務都合
質の問題
→ぼくの慣れでどうにかなる部分とならない部分だなー

以下資料
slipはsafariで見えなかったと思う
https://github.comからのリンクを開けば雰囲気はわかる

1.まえがき https://docs.google.com/present/view?id=dhhx4kfg_272hpwb6xdh
2.はじめに https://docs.google.com/present/view?id=dhhx4kfg_2737b4tx5dk
3.どうやってプロダクトバックログを運用するか https://docs.google.com/present/view?id=dhhx4kfg_274d7kk5mhh
3.1 ストーリーの追加項目
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-3.md
4.どうやってスプリント計画を準備するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-4.md
5. どうやってスプリントを計画するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-5.md
6. どうやってスプリント間でコミュニケートするか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-6.md
7. どうやってスプリントバックログを扱うか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-7.md
8. チームの部屋をどう改造するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-8.md
9. どうやって日時Scrumを実施するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-9.md
10. どうやってスプリントデモを実施するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-10.md
11. どうやってスプリントの振り返りを行うか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-11.md
12. スプリント感の休憩期間
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-12.md
13. リリースの計画と価格確定させた契約をどうするか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-13.md
14. どうやってScrumとXPを結合するか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-14.md
15. どうやってテストするか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-15.md
16. どうやって複数のScrumチームをハンドルするか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-16.md
17. 地理的に離れたチームをどう扱うか
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-17.md
18. Scrumマスタチェックリスト
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-18.md
19. お別れのことば
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-19.md
20. おすすめ書籍
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-20.md
21. 著者について
http://slip.sane.jp/https://github.com/sanemat/seeds/raw/master/zango-scrum-xp-21.md

phpmatsuriでTDDワークショップのサポートしてきた

ぼくからみたPHPmatsuri。時系列順にダラダラと。

事前
事前にそれなりに準備したけど、途中でめんどくさくなる。
https://docs.google.com/document/pub?id=1-FRoaPj048otlAVXD3nwllxg3NtTrpwlvnXkZY73GiQ

fibonacci数列のサンプルプログラム書いててはまってテンションも落ちる。

phpmatsuriの俺のファインプレー2つ
– we have IRC channel
遅刻して空いてる席に座ったら右がkrisで左がjoelだったので、 “we have IRC channel #phpmatsuri irc.freenode.net”って書いたテキスト見せたら”おk”って二人ともIRCに入ってきた

– where are you from ?
rubykaigiで見ていいなーと思ってたので空いてたホワイトボードに付箋をペタペタ貼った。まるぱくり。
途中で誰かが日本地図と世界地図を書いてくれて、見た目もかっこいい感じになった。

目標
ursmがhamlのpatchをおもむろに送り付けるという日本hamlの会の活動を聞いたことがあって、そういうのやってみたいと思ってて、よく使うライブラリにいきなりテストコードを送り付けるのをやってみようと思う。
この辺の時点でもうペアプロ祭りをやる気はなくなっていた。題材がうまく選べないし。NetUserAgentMobile や 絵文字なライブラリを眺めてた。

TDDワークショップ
このころ(17時頃)hirocasterがTDDワークショップやりたいっていいはじめて、やぶさかではないし、これはこの人たちをこのままほっといたら死んでしまうしそれはあまりに不憫なので、サポートすることにした。まずお題も決めてない状態で、IRCで、LRUHashとかbowlingとかTDDByExampleのbankとかいろいろアイデアを出して、IRCにいたtenkomaにムチャぶりしたらFizzBuzzでいいんじゃないの、と。だので FizzBuzzでいこう、とはじめる。

hirocasterが「limeでやれるようにlimeとからのFizzBuzzTest.phpとFizzBuzz.phpを用意してみた!」って言ってたので、軽くリポジトリ見てみるとうーんというかんじで、これはこちらに引き寄せないとしんでしまう。limeでfizzbuzzの素振りをして、さらに勢い余ってphpunitでfizzbuzzの素振りをしてみた。

http://github.com/sanemat/PHPMatsuri-TDD
case-lime ってtagづけしたのがlimeで、その延長上で case-phpunit ってtagづけしたのがphpunit。

jirei night終わって帰ってきたhirocasterとどうすすめるかについて、ほんとに軽くミーティング。「どうすすめる?」「どうすすめるのがいいと思う?」「hirocasterのmacでペアプロするのがいいんじゃないの 俺driverするから説明して」「じゃあそれでいこう」よくこれで会話が成り立ったなーと思う。気心知れているのっていいね。

夜中の1時から2時前ぐらいまでTDDのワークショップをやった。

ペアプロにはならずに、ほぼおれがdriver独占してて
http://www.mightyverse.com/media/69aea61b-af58-453a-8faa-dbb1a7426f43

と言われかねない状況だった。

リアルタイムな成果はこのmaster
http://github.com/hirocaster/PHPMatsuri-TDD

FizzBuzzをつかったTDDの説明としてはぼちぼちの出来だったと思う。少なくともだいたいの人にふーんなるほどというところまでは持っていけたと思う。ウソ言ってないかなーとたまにちらちらsizuhikoとtenkomaの方みたけど明らかにおかしい顔はしてなかったのでよしとする。サポートしてくださった参加者の皆さんありがとうございました。

で、この一発目で実装できそうな課題をTDDでやることが目の前のレガシーコードに対していますぐなんの役に立つの?
といわれると難しい。こんなのいいからそこやれよ、という不満の顔もかんじたけど、ワークショップの論点とはちょっとずれるので、みなかったことにした。レガシーコードな現実と闘う方法は各フレームワークのたこつぼのなかで消化していくしか現実的でないと思う。すくなくともsymfony1系の”functional test”についてはまず社内向けにどうにかしてみようかと書いてて今思った。functional といいつつ想定しているのはあきらかにend to endなテストなので用語としてはあやしいsymfonyイディオムので””でくくっておいた。そのへんはjobeetからして用語は意図的に(?)混同しているのである程度は気にしても仕方ない。

これでエネルギーを使い果たして、次の日(phpmatsuri 2日目)とその次の日(月曜日)はぐったりしていて、使いものにならなかった。おしまい。

“未経験からWEBプログラマになりました”をLTしてきた

Gunma.web (web 勉強会 in 群馬) #2 で”未経験からWEBプログラマになりました” というLTをしてきました。
http://atnd.org/events/7921

いつか出したいと思っててあたためてたけど、出す場がなかった自分の経歴ネタでした。
webってくくりでまあいいだろうと自己判断してフリーダムにやってきちゃいました。よかったのかはわからない。
はかってなかったけど7,8ぷん話してきたと思う。それはごめんなさい。

ポジションペーパー的にはこんなの準備してました。
https://docs.google.com/document/pub?id=1_2x0avZ0sD57y59-5i7FYGDWLTLJ3RfiNr5vlKK6R9U

makesthisなのがぱっとでてこなかったのでおもむろにmakes thisとうろくしてみた。あとでかく。 http://sanemat.makesthis.com/

綺麗な会場で、電源充で、なんかみんな”俺が作ったこれ”みたいのを話してて、おもしろかった。
場所を移動してシャレたイタリアンで懇親会。これをもっとアッピルするべきと伝えてきた。

2010年9月時点のわかったふりしてるリスト

2009年8月時点のわかったようなふりしてるけどほんとは理解してないことリストというのを発掘した。

面白いのでメモしておく。
====
高階関数
クロージャ
参照渡し
ポインタ
継承
委譲
big table
databaseのmasterとslave
名前空間
無名関数
lamda
リフレクション
メタプログラミング
DSL
スクラム
デリゲート
遅延評価
key-value
oauth
====

委譲とデリゲートが別に書いてある理由はよくわからない。
そして2010年9月時点でこの中でわかったっぽいのは”databaseのmasterとslave”だけかなあ。

さてはあまり成長してないな。

「つらくないコードを書こう」という題でlimonadeの話をしてきた PHP勉強会@関東#46

第46回PHP勉強会@関東でLT「つらくないコードを書こう」という題でlimonadeの話をしてきました。

LT資料
http://www.slideshare.net/sanemat/20090930-phpstudy-limonade
デモ用コード
http://github.com/sanemat/ktsukishima/tree/phpstudy46

参加者のみなさんとust越しに見てくださった方には段取り含めた不手際でごめんなさいというしかない発表でした。でも後悔せずにまたやります。ありがとうございました。

以下デモでやりたかったことをまとめておきます。


デモでやりたかったこと

想定

http://example.com/
のドキュメントルート
/home/foo/app/public/

目標

サブディレクトリ下に携帯3キャリア対応のページを作成
ただし、ライブラリなど余計なファイルはドキュメントルート下におかないこと
http://example.com/limonade/

事前確認

下記ファイルを編集してapacheとvirtualhostが設定済みか確認
/home/foo/app/public/index.html

ファイル確認

$ cd /home/foo/app
$ ls -R
.:
public

./public:
index.html

この時点では./public/index.htmlのみ。

git clone

/home/foo/app/
下にlimonade+ライブラリ+サンプルファイルのlimonadeディレクトリを作る

$ git clone git://github.com/sanemat/ktsukishima.git limonade
Initialized empty Git repository in /home/foo/app/limonade/.git/
remote: Counting objects: 148, done.
remote: Compressing objects: 100% (74/74), done.
remote: Total 148 (delta 51), reused 146 (delta 50)
Receiving objects: 100% (148/148), 156.50 KiB | 150 KiB/s, done.
Resolving deltas: 100% (51/51), done.

limonadeディレクトリが出来たのでそこに移動

$ cd limonade

phpstudy46タグが振ってあるので、チェックアウト

$ git checkout phpstudy46
Note: moving to "phpstudy46" which isn’t a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at e3d6438… delete initial files

一階層上に戻る

$ cd ..

以下のファイルがgitリポジトリから引っ張ってこられた

$ ls -R
.:
limonade  public

./limonade:
lib  public  vendor  views

./limonade/lib:
AUTHORS-limonade  LICENSE-limonade  limonade.php

./limonade/public:
index.php  sample.css

./limonade/vendor:
HTML  LICENSE-HTML_CSS_Selector2XPath  Net  PEAR.php  Text

./limonade/vendor/HTML:
CSS  CSS.php  Common.php

./limonade/vendor/HTML/CSS:
Error.php  Mobile.php  Selector2XPath.php

./limonade/vendor/Net:
UserAgent

./limonade/vendor/Net/UserAgent:
Mobile  Mobile.php

./limonade/vendor/Net/UserAgent/Mobile:
Common.php   DoCoMo      EZweb.php  NonMobile.php  Willcom.php
Display.php  DoCoMo.php  Error.php  SoftBank.php

./limonade/vendor/Net/UserAgent/Mobile/DoCoMo:
ScreenInfo.php

./limonade/vendor/Text:
Pictogram

./limonade/vendor/Text/Pictogram:
Mobile  Mobile.php

./limonade/vendor/Text/Pictogram/Mobile:
Common.php  Docomo.php  Exception.php  Ezweb.php  Nonmobile.php  Softbank.php  data

./limonade/vendor/Text/Pictogram/Mobile/data:
docomo_convert.json  ezweb_convert.json  softbank_convert.json
docomo_emoji.json    ezweb_emoji.json    softbank_emoji.json

./limonade/views:
layout.default.html.php  qa_how_to_start.html.php

./public:
index.html

ちなみにこのlimonade本体は0.4のブランチにauto_globals_jit onでも動作するパッチをあてたもの
またディレクトリ構成をフレームワーク付属のものとは変えています

limonade

まだここには何もない
http://example.com/limonade/

ドキュメントルートに移動

$ cd /home/foo/app/public/

追加アプリのpublicディレクトリにシンボリックリンクを張る

$ ln -s ../limonade/public limonade

Hello limonade!
http://example.com/limonade/

How to Start limonade?
http://example.com/limonade/?/how_to_start/

$ cd /home/foo/app/limonade
$ vi views/qa_how_to_start.html.php

before(), after() で分かりやすいフック

limonade/public/index.php
のbefore(), after() の記述によって
テンプレート内では$emoji変数でdomomoの基本絵文字が3キャリア互換で記述できる
たとえば<?=$emoji[154];?>とやれば爆弾の絵文字が出せる。

(ここがモンスターメソッドになってしまったのでもうちょっとましな設計が必要)

before()でしていること
Net_UserAgent_Mobile呼び出し
Text_Pictogram_MobileでdocomoのUTF-8絵文字としていったん全部扱う
テンプレート記述を中間記法に変換する

after()でしていること
Net_UserAgent_Mobileの判別でdocomo, au, softbankにそれぞれ振り分け
キャリアごとに
xmlのencodingとhtmlのheadを表示する文字コード表記に置き換え(docomo, auはShift_JIS, softbank, pcはUTF-8)
出力文字列の文字コードを変換
docomoの場合のみHTML_CSS_MobileでCSSをインラインに変換
絵文字をキャリアごとに出力フォーマットを変えて出力
headerのContent-Typeをキャリアごとに出力

目標確認

サブディレクトリ下に携帯3キャリア対応のページを作成
ただし、ライブラリなど余計なファイルはドキュメントルート下におかないこと
http://example.com/limonade/
達成!

メッセージ

コアとちょっとのファイルでやりたいことが実現できる
ファイル数が少ないこと、ファイルが小さいこと、それももちろんだけれど、
コアも含めたアプリ全体の見通しのよさがlimonade一番のメリット

PHP懇親会でLT「PHP: The Good Parts」してきた

第45回PHP勉強会@関東(
PHP懇親会)

の全員LTで、はじめてLTをしちゃいました。自己紹介+自分の疑問質問を言う、というフリーダムなLTにしたのでちょっとドキドキしました。

なんだかんだいって自分なりに貢献できることってあるよね、という実感ができるイベントでした。

===
2009-08-01 15:30-
@六本木 はてな

@sanemat LT資料「PHP: The Good Parts」
http://www.slideshare.net/sanemat/20090801phpstudy-sanemat

じぶんのLTが気になって食事に集中できないかと思いきや、思いっきり飲み食いしてテンションがあがる。
自分の数人前からはさすがにお酒控えたけどそのぐらいです。

@kakeibotの項目分類がまともに作ってあって面白い。

===
懇親会
Keep
 会場運営ありがとうございます
 プロジェクタが揺れないようにエアコンの風を当てないなど細かい勉強会Tipsがよくできてる
 あたたかい目で見てくれた
Problem
 開催負荷高くない?平気?
Try
 開催負荷を抑えるにはどうしよう

じぶん
Keep
 初LTおつ
Problem
 全員のLTタイトルぐらいメモっておくべきだった
 帰り日比谷線で寝ちゃって何度もいったりきたりした
 想像以上にてんぱっていたらしい
 準備不足
Try
 同じ話すことでももっと切り口と持っていき方を高めよう

なお、@kakeibotが言うことは正しいので、PHP懇親会は「勉強」とのことです。ありがとうございました。

BPstudy#23を聞いてきた

BPstudy#23に参加してきました。

===
2009-07-31 19:00-
@EBISU303
@かなり遅れて到着 前半は聞けず

@メインになる情報の塊が出来れば、

あとはそれをJSONなりでマッシュアップ出来る
@大きいマッシュアップで情報を集約・集積して、小さいマッシュアップでクライアント側に情報の切り口を見せる

sqlitepersistentobjects
– Project Hosting on Google Code
が便利

@iphoneアプリのあのページングは楽しそう

===
勉強会
Keep
 会場運営ありがとうございます
 大きな部屋に大きなプロジェクター いい
Problem
 部屋広いと(高さが出ると?)反応が減る?
Try
 反応を増やす仕掛けがいるのかな

じぶん
Keep
 よく食べてよく飲みました
 人見知り解消セットはやはりいい
Problem
 顔と名前をセットで覚えよう
Try
 ただ聞くだけではもったいないのでなんとかする

EC2業務で実運用しないのはまだわかるけど使ったことないのは怠慢だよね。ということでEC2のためにクレカ情報などなど登録した。

mitaka.rb#3に参加してきた

mitaka.rb#3に参加してきました。
職場が市ヶ谷なので中央線沿線です>< なかまなかま といったら市ヶ谷は総武線ですとのツッコミされました。

===
2009-07-23 20:00-
@リトルスターレストラン

●Haml/Sass
@hamlはキてる 使おう
@sassはうん、また今度

===
勉強会
Keep
 会場運営ありがとうございます
 「おいしい」で上がったハードルに答えるmitaka.rb素敵
 PGCafeとのカオス具合がすばらしい
Problem
 あとの発表者がどんどん巻きに
Try
 ドラ娘がいるのか

じぶん
Keep
 じぶんからはなしかけることができた
Problem
 じぶんにrubyのネタない
Try
 rubyのネタ作ろう

日本Ruby会議2009に中てられてきた

日本Ruby会議2009に参加してきました。7/17-7/19の三日間長丁場でした。

イベント
Keep
 会場運営ありがとうございました
 クオリティ高い
 IRC同時通訳ありがとう
 1個1個の発表の質が高い
Problem
 温度調節困難なのはわかるので「上着もってこい」アナウンスが必要
Try
 日本語→英語が必要?
 翻訳重視になるのはそれはそれでちがうからなあ難しそ

じぶん
Keep
 三日間とも参加した
 toeic400点だけど海外の人のセッションを積極的に聞いた
 →言語違う環境で伝えることを意図しているので、聞いていればわからないでもない
Problem
 二日目は体調を崩して途中離脱した
 海外の人と話してない
Try
 海外の人とも話をしよう
 講義形式以外のところにもいく

オルグに中てられて当日吐き出したもの→實松アウトプット:
オレとrubyと+α (Take the Red Pillの感想)
もあわせて。

感想で書きやすいのはMatzの基調講演だったり、LTだったり、RejectKaigiだったりなんだけど、それ以外のひともすばらしかったです。ぱっと分かち合える以外のところもust振り返りしながら拾い上げしたい。