「良いコードを書く技術」を読みました

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

生まれて初めて献本いただきました、ありがとうございます。

内容については著者の縣さん (id:agt) の このエントリ で紹介されておりますし、具体的な内容は本書に譲るとして、「良いコード」について、私なりに感じた事を思いつくままに書き留めておきます。

「良いコード」とは、人によって、立場によって、組織によって、時代によって、いろいろな解がありえる問いだと思います。本書はまず最初にその「良いコード」を

保守性が高い
すばやく効率的に動作する
正確に動作する
無駄な部分がない

http://gihyo.jp/magazine/wdpress/plus/978-4-7741-4596-9/0002

と、定義するところからはじめています。

ふと、自分を思い返すに、コードを書き始めた頃はサンプルが沢山のった入門書や雑誌をよく読んでいました。(当時は Java PRESS もまだありました) 少し慣れてきて、ある程度決まった文脈の中であれば、入門書をひらかなくてもコードを書けるようになった頃、どう書けばあとで悩まないのか (=保守性)、同じような処理を沢山書いてるけれどうまくまとめられない (=無駄な部分が無い)、そういった事に迷って、自分がプログラムを書く際の「寄る辺になるもの」を求めて、書籍を探し求めては読んでいました。

特定の言語をベースにしたものですが、例えば「 オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法 」にチャレンジしてはさっぱり理解できず、はたまた「 Javaの格言―より良いオブジェクト設計のためのパターンと定石 」を読んでは、何だか分かった気になったり、と、右往左往しながら、コードを書いていました。デザパタを知ったら、なんでもデザパタにあてはめてみたり...

私と同様に、コードを書く事に慣れるようになった後に、漠然と自分のコードが上記のような「良いコードなのか」不安に感じた事がある方は多いんじゃないかな、と思います。この本には、そういう不安に対して指針となる内容が詰まっています。

また「良いコードの価値」というのも難しい問いかけです。

先日とあるコミュニティにて「言語による生産性の違い」みたいな話題があがりました。私はどんな言語でも「良いコード」を書くのにかかる道程はそれなりに長く、特定の言語がそれを劇的に短くはしないだろう、と考えています。それもあり「そんなに変わらないのでは?」と言ったところ「全然違うよ」とおっしゃる方がいました。曰く「新人や、アルバイトの子でも A という言語であれば 2,3 週間で 1 画面くらいは組めるようになる、かたや B だと 2-3 ヶ月はかかる。その差は歴然」と。

ソフトウェアを開発するにあたっての「生産性」で考えている前提が違っており、その方が、売値に対する原価という文脈でおっしゃっている事自体は理には適っているとは思いました。コードを書いて食べて行く事を選択した以上、ビジネスとしての観点を忘れてはいけないのは事実です。

ただ、私は「良いコード」は「ソフトウェアの (長期的な) 品質」につながり、それはソフトウェアを使う人への安心や利便性の向上と密接に結びつき、また作り手にとっても、新たなステップアップにつながるものになる、と信じています。私にとって、職人としてコードを書く事を選んだ以上「より良いコードを書く事」「より良いソフトウェアを書く事」それを求めることは、とてもとても大切な価値観です。

そんな思いの中、手に取った本書の「はじめに」には以下のように書かれていました。

私が考える良いコードの具体例は本書の中で解説していきますが,一番大切なのは「良い仕事をしたい」「良いソフトウェアを作りたい」という気持ちです。この本を手に取ってくれたあなたの中にも,きっとそういう気持ちがあると思います。

良い仕事をすると仕事にやりがいを感じられるようになる,つまり仕事が楽しくなります。そして職人として仕事に誇りが持てるようになります。

http://gihyo.jp/magazine/wdpress/plus/978-4-7741-4596-9/0001

35歳を前に、私もまだまだ「良いコード」を書く道を追い続けたいな、と気持ちを新たにさせてもらえた一冊でした。(33歳男性 : 京都府在住)

jdk6u23 で jps/jstat が動作しないあるある

お小遣いの残高と年齢以外の数値を計測する事は大好きなソメダです、おはようございます。

さて、皆様におかれましても、運用時の Java アプリケーションのヒープの利用状況の傾向監視は行われているとは思いますが、そういった用途に利用される事の多い jps/jstat といったユーティリティが、現在 (2011年01月) 最新の Java SE 6 update 23 では動作しない事があります。

これは、java.io.tmpdir を OS 標準のディレクトリ (Linux だと /tmp ) 以外に指定して JVM を起動した場合に発生し、例えば以下のような状況になります。

# ps -aef | grep java
tomcat   29030     1  0 Jan12 ?        01:04:01 /usr/java/default/bin/java <略> -Djava.io.tmpdir=/usr/java/tomcat/temp org.apache.catalina.startup.Bootstrap start
:
# jps
:
4519 Jps

jstat で直接 pid を指定しても駄目です。

# jstat -gc  29030 2s
29030 not found

こちら原因なのですが、jstat/jps (他に visualvm も) が、そのプラットフォームで起動している Java のプロセスを探すのに、/tmp/hsperfdata_<ユーザ名>/<プロセスID> というファイルを探すのですが、jdk6u23 以前は /tmp 以下に固定で生成されていたものが、jdk6u23 では java.io.tmpdir 以下に置かれるようになった事が原因です。実際上記の例でも java.io.tmpdir で指定したディレクトリに生成されています。

# ls  /usr/java/tomcat/temp/hsperfdata_tomcat/
29030

今の所の対処法としては、

  1. java.io.tmpdir を /tmp にする (Linux の場合)
  2. jps -J-Djava.io.tmpdir=/usr/java/tomcat/temp/ など、モニタリングツール側でオプションをつける

のどちらかです。後者の指定を行う場合、Tomcat のように別ユーザで jps を実行するには、読み込み権限の問題があるので、su する必要があったりもします。

# su - tomcat -c "jps -J-Djava.io.tmpdir=/usr/java/tomcat/temp/"

例にもあげた Tomcat は、デフォルトで java.io.tmpdir を $CATALINA_BASE/temp に指定して起動しますので、Java のバージョンをあげたら軒並みひっかかるハズです。Tomcat 本体の問題ではないにも関わらず、影響範囲が大きいからか、Tomcat の Bugzilla にも jps.exe and jvisualvm.exe cannot detect tomcat using jdk1.6.0_23 としてあげられてますし、Known Issuewiki からもリンクが貼られてます。既に Java 本体の方に バグ報告 されているので、今のところは上記の対処法で修正を待つ感じでしょうか。

蛇足ですが、この問題の根本となった修正が /tmp とか %TEMP% とかハードコードしているのやめようよ というものなんですが、Java も 6 にもなるまでも、こういった所が残っている事が趣深く、切ない気持ちになった年明けの一幕でした。

それでは今日も一日頑張りましょう。

backloglib 0.2.1 をリリースしました

0.1.1 のリリース から早一年以上、GAE でも多分使える、Backlog APIPython ラッパーの backloglib の 0.2.1 をリリースしました。予定より 9 日遅れ。。。詳細は以下より。

MA6 の期間が終わるまでには何とかリリースしようと思って頑張ったのですが、MA6 の応募〆切が明日まで、というのは、まぁ、アレですよ。。。。ごめんなさい。

さて、id:dragon3 さんの Perl 版は如何に (笑)

関ジャバで GC についてお話しました

久々(?!)の技術トークを本日関ジャバにてさせて頂きました。発表資料は以下の通りです。

トップ画像のクレジットは以下の通り。(CC の画像ですが、表記不足等あればご指摘もらえると嬉しいです)

(2010/10/02 追記)
id:shin さんにご指摘いただき、-Xincgc は現在の実装はコンカレントコレクタ (-XX:+UseConcMarkSweepGC ) が選択されるようになっていましたので、該当スライドから削除しました。

> -Xincgc -verbose:gc -XX:+PrintGCDetails

あたりをつけて適当なプログラム実行して頂いたら、確認出来ると思います。

尚、1.4.2 の資料ではあった、TrainGC の記述も 5.0 の資料から以下のように変わっています。

5.0 の資料では以下のように言われてます。

The incremental (sometimes called train) low pause collector: this collector is used only if -XX:+UseTrainGC is passed on the command line. This collector has not changed since the J2SE Platform version 1.4.2 and is currently not under active development. It will not be supported in future releases. Please see the 1.4.2 GC Tuning Document for information on this collector.

(追記ここまで)

今回は図が多くなる事がはじめからわかっていたので、小悪魔ちゃんバリに可愛いプレゼンを、と思って Cacoo で作成してみました。久しぶりに資料作成してみたら思いの他のボリューム増えちゃいました。

発表はといいますと、ブラウザの画面サイズがうまく出来ず、最初戸惑ってしまし申し訳なかったです。この辺りは事前準備で回避出来る所なので、次回はかならずやっておきます。。。今日の発表では

  • GC って結構面白いよ
  • プログラムの実行環境のテクノロジ知ることは大事だと思うよ

といった所を上手く伝えたいな、と思っていたのですが、はてさてどうだったのかしら、、、と。

USTは怖くてみれません。後、GC について興味もたれたら、以下の書籍はホンマに良いと思います。

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装

WISH2010 に行ってきました

Cacoo もエントリされていることもあり、WISH2010 に行ってきました。振り返りがてらメモ書きます。

第一部「日本のウェブはいかにして世界を目指すべきか」

ここのまとめが色々と飛び出ていた話題をよくまとめられてますので、ココを読めば大体良いように思います。(笑。

率直な印象で、田中さんは作り手の視点、原田さんはビジネスの視点、枝さんはインキュベータの視点、といった三者三様の考え方、コトバ使いをしていて、さて、自分はどの視点でのモノ作り、サービス作りの視点に近いかな、と思いながら聞いていたのですが、概ね田中さんのお話が善し悪しではなく、一番スッと自分としては入る感じでした。やっぱりちゃんとモノを作って、ちゃんと使ってもらって、という所に国内、国外はないと思うのです。

で、本題とは外れるのかもしれないのですが、「世界」というと、GoogleAmazonApple みたいな「超」大企業、「超」大サービスを、みたいな文脈になってしまい、自ずと「資本」がどうした、「拠点」がどうした、といった話になる。それはそれで良いのですが、「そうじゃない戦い方」、「そうじゃない世界への出方」ってあるんじゃないか、と思うのです。インターネットは「恐竜」でないものでも「世界中からみつかる」ようにした場なのですから、ソフトウェアやサービスだって、「超大」ではなくとも浸透する可能性や方法がある、と。まだそういったロールモデルが身近に見えていないだけで。

また、ひとまず「資本」という考え方には、

ソフトウエア企業の競争戦略

ソフトウエア企業の競争戦略

でも語られている、「資本の毒」という側面もあるでしょうし、最近の私のもっぱらの起点になっているのが
Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方

Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方

にある、「小さな ISV 」だったりするので、無意識的に反駁を覚えてしまう感があるのも否めないのですが。

そんな事を感じつつも、今まさに日本のネットサービスの先端におられる方々の生の声は本当に力強く、単純に、頑張ろう、と思いました。 

第二部「プレゼンテーション」

ざざっと気になった事、面白かった事など、メモ。

カーリル | 日本最大の図書館蔵書検索サイト

話題(?!) の図書館検索。紙 copi の洛西さんの作られたサービス。これ、便利です。近所の図書館のウェブインターフェースは死んでいるので。。。スクレイピングして 5000 超もの図書館のデータを集めたとのことなんですが、どうやって揺らぎを吸収したのだろう、とか、色々疑問も。懇親会で話すタイミングあったのに、聞けなかったのが残念。。。

ソーシャルレンディングAQUSH|魅力的な利回りで新しいカタチの資産運用

ソーシャルレンディングという考え方を知りました。借り手の身元をどう保証するか、が肝にも思いますが。ビジネスの仕組み的な観点でいうと、このサービスが一番興味深かったです。

デコもじ|ウェブフォントで、ホームページが、ブログが、もっと楽しくなる♪

不勉強ながら、CSS3 の Webfont という仕組みを知りました。これ、地味かもしれないですが、デザインする人にとっては、大事な仕組みですね。Flex4 も TLF で文字表現に力入れてますし、テキストの気持ちよさ、みたいな所を追求したサイトもアリな気がします。Windows から Mac に変えて、何気に一番使っていて「気持ちよくなった」ところは「フォントの綺麗さ」みたいな所だったりしますので。

Cerevo - Home

一度 TypeP でライブの UST にチャレンジして失敗した経験もあり、専用機は魅力的に見えました。。。ま、何よりデバイスは良いですよね、会社の写真がすごく楽しそうな雰囲気でした。(笑

かわいいパソコンケース&バッグの「オリヒメ」

日本のモノ作りだけでなく、「消費者の目」も一流、とした辺りの着眼点が面白かったです。去年の ドレスファイル もそうなのですが、こういうリアル側からのネットへのアプローチって、中々視点切替えないと出てこないので、そういう視点でも面白かったです。

まとめ、

現在進行形で一生懸命ウェブで作っている人の生の姿、生の声を聞く事が出来て、単純にそれだけで行って良かったな、と思えました。頑張ろうと感じましたですよ。ボランティアをはじめとする運営の皆様、ありがとうございました&お疲れさまでした。

2010年08月01日のツイート