技術サポート業務の難しさ
今年1月から、入社以来所属していたチームを離れて社内全体の技術サポートをするようになった。
今の所メンバーは自分しかいない。
だからリソースはかなり少ないのだが、社内のサービス開発でのお困り事の調査だったり、上司が気になる技術の調査をしてサンプルコードを書いて上司に報告したり、ある問題に対してどういうライブラリを選択するべきかを議論したり、ひたすら社内wikiにまとめたりしている。取り扱う内容は、フレームワーク・ミドルウェアの検証から、使う可能性があるWeb APIの仕様のとりまとめまで様々である。javaでiphoneアプリを作るライブラリなんてのも検証して実際に作ってみたりした。
調べた内容については、週1回社内共有会という形で自分がLTみたいなことをして共有している。大体20分自分が話して残りは雑談しながら質疑応答という感じだ。
こんなことを2ヶ月近くやってきたが、ずっと開発ばかりしてきた人間なので色々と壁にぶつかり始めるようになった。
1つ目は「自分がきちんとアウトプットが出せているか」が分からない点。
前に所属していたチームではスクラムっぽい開発をしていて、1回のスプリントでこなすべきチケットが決まっていて、それを達成することがとりあえずのアウトプットの形で、自分で達成度合いを確認することができた。
それが今は、タスクを積み上げてそれに対してスケジュールを大体で決めて進めているけど、別にそれが遅れたからといって誰も困る訳ではないので、スケジュールを守ろうとが守るまいが、あまりインパクトがない。もちろん同じスケジュールならアウトプットは多い方がいいのだろうが、それによって何か変わるようなことは今は出来ていない。そういうものを自分でコミットしてやらないといけないのだろうなぁと思うのだが、方法がまだ確立出来ていない。
2つ目は「社内にシェアしてもそれが現場で本当に意味があるのか」が分からない点。
特に社内で共有会をやっていて思うのだが、基本的に社内のエンジニアにシェアしても大して反応は無いし、それがすぐに社内のサービスに影響を与えるということもない。
もちろん、仮に社外の勉強会に参加した所でそれがすぐに仕事に影響することなんて無いわけで、長期的に見て資産になれば良いだけのことである。それでも、業務に直接関係しなさそうなImmutable Infrastructure系の話とかCIの話だったりをしても全然反応がないのが若干辛い。基本的には社内で使ってないが、選択肢として覚えておいてもらいたい話題をチョイスしているのだが、業務時間にやっている以上は、もう少し現場に近いものをやった方がいいのか、それとも今のサービスが大きくなって負荷分散やソースの整理をしなければいけない事態になった時のことを考慮して選んだ方がいいのか。
いずれにせよ、自分は今の会社では若造の方なので、自分より年上のエンジニア達に話を聴いてもらうのは色々と工夫が必要であるということはよくわかった。基本的に30を過ぎたエンジニアに新しい技術をインプットさせるのは相当な工夫がいるようなので、今後は巻き込み方とか、会の在り方とか色々考えていかなければいけないと感じている。
世の中の企業の研究職やR&D職の人もこんなジレンマと闘いながら業務にあたっているのだろうか。
10年後もプログラマとして働き続けるために考えていること
クロノトリガーは、確か自分が中1だか中2だかの頃に、偶然ハードオフで見つけて中古で買い、何周も何周もプレイした思い入れのある作品だ。
当時、既に発売から何年も経っていたから、周りの同級生とクロノトリガーを話題にしたことはなかったが、テキストとドット絵の、今考えたら制約の多い手法で表現される、時には熱い戦いに胸が踊り、時には辛い別れに涙する素晴らしい世界観に自分はめちゃくちゃハマり、主要な台詞を殆んど覚えるほどやりこんだ。気がつけば全員のレベルを★★(カンスト値)にするまで何周もやり込んだ。
そんなクロノトリガーで、今でも時々思い返す台詞(というかスクリプト)がある。物語序盤、中世で攫われたリーネ王妃を救うために向かったマノリア修道院のドア横に突然現れる「はりがみ」にこんなことが書いてある
行こうと心に決めた者のみが行ける道がある。
物語の本筋と関係があるんだか無いんだか、良く分からない形で突然現れるこのはりがみ。
誰が、一体何のために書いたのかは劇中で触れられていないが、この言葉だけは初プレイから何年経っても時々思い返す。思い返すどころか、年を取れば取るほど重く感じるようになってきている。
突然話が変わるが、プログラマというのは特殊な職業なのだろうか、ということをよく考える。プログラマをどう定義するのかによるが、ここでは「業務としてコードを書く機会がある」人のことをプログラマとして定義したい。つまり、ITエンジニアという肩書だが、業務で全くコードを書かない人はそれに該当しないとしたい。
自分は今は仕事としてコードを書いている。最近、サービス開発の現場からは一歩退いて、プロジェクト横断で後方支援的なことをメインにやるようになったため、以前より書く量は減ったが、技術検証やテストコードの整備などで毎日何がしかコードを書いてコミットしている。また開発現場に戻るかも知れないが、少なくともプログラマとしてコードを書いて仕事をし続けたり、新しい技術を学び続けることに何の疑いもないし、10年、20年経っても続けていくつもりでいる。
しかし、10年、20年とプログラマをやっている人って、自分が知るかぎりではかなり少ない。自分の身近な存在で挙げると、17年プログラマとして働いている先輩が1人いるくらいだ。業界自体が若い、なんて話もあるが、仕事としてプログラムを書いていた人は1960年代から存在していたようなので(「闘うプログラマー」参照)、10年間仕事でコードを書き続けている人がいてもおかしくはない。
一方で、「元プログラマ」とか「元SE」みたいな人は大勢いる。別にそれが悪いということは無い。一度でもコードを書いて飯を食うことで見えてくることは沢山あるだろうし、それを元に別の分野で活躍できるのは素晴らしいことだと思う。
また、30代、40代になった時に、プログラマという立場でどういうアウトプットができればいいのかが今時点では分からない。前述の通り、ロールモデルが殆んど無いし、かといって今(プログラマ歴は丸2年と少し)と同じアウトプットで良い訳がない。もしそうなってしまったら他の人に取って代わられるだけだ。
そういう意味で、プログラマは続けるのが難しい「特殊な仕事」なのではないか、なんてこと考えるようになった。サラリーマンというよりはスポーツ選手のような印象を持っている。常に自分を磨き続けなければ脱落していく。1年後に仕事で今以上の高いアウトプットを出そうと思ったらこの1年間相当量のインプットとアウトプットを残さなければならない。そうしないと少なくともプログラミングのスキルは伸びないからだ。
例えば、今業務でやっているサービスの保守は出来ている。
しかし、新しい事業が立ち上がって、そのチームの唯一のプログラマとしてアサインされた時、1人でサービスの根幹を作ることが出来るか?使うフレームワークを自分で選べるか?AWSでVPC設定してEC2とELBとRDSを設定して最小限のインフラを構築できるか?出来ないとしたら、素早く習得できるだけの土台があるか?考えだすとキリがない。
今の仕事が出来ているから1年後も安泰、なんての昨今IT業界全般で言われる通り幻想である(これはITに限らないだろうけど)。ITエンジニアにとってどんどん必要なスキルは増えていく。必死で着いていかなければならない。辛いと思う人もいるだろうし、昨年入社したうちの会社の新卒諸氏は覚えることが多すぎて早くもしんどそうだ。
それでも自分は、プログラマとして働き続けようと思う。
なんでそう思えるのかと長いこと色々考えたけど、結局「好きだから」、に尽きるように思う。
自分は上流SEからプログラマに「転職」してからまだ2年と少ししか経ってないが、コードを書くこと、使ったことがないミドルウェアを使えるようになること、チームのタスクをマネジメントすること、誰かの問題を解決をするために頭を悩ませること、他のメンバーを育てること、全部含めてプログラマとしての仕事が心底好きだし、何よりwebで多くの人に「こいつぁすげぇや!」と驚き、喜んでもらえると凄く嬉しい。
だから「この道を行こう」と決めた。
「好きだから」でどこまで行けるか分からないが、今は新人教育やインフラ側・アプリ側双方での技術検証とかの仕事も始めて、前よりは仕事の幅が広がりつつある。その中で、自分が今どういうアウトプットが出来る人間かを考えて、そこからどうなりたいかということを模索していきたいと思う。
技術調査はググる前が肝心
概要
■「プログラミングは自分で調査しながら覚えた方が上達が早い」という意見は非常に同意
■でも出来ている人少ないよね。調査中に挫折しちゃう。
■それは「わからないこと」をブレークダウンして整理しないで調査し始めて欲しい情報をピンポイントで調べられてないから
■調査をする前に「何をしたいか」「何がわからないか」を徹底的に時間をかけて整理してから調査した方が結果的に早く答えに辿り着くからオススメ
プログラミングが上達しない or 勉強が続かない人へ:とあるIT系社長のブロマガ - ブロマガ
凄く共感できる内容だった。
特に以下の部分
実はプログラミングを"勉強する"ってこと自体ちょっとオススメできない。
どういうことかというと、僕が思うに
・何か作りたいものがある(アイデア)
・それはどうやったら作れるのか(調査)
・実際に作り出す(実行)
っていうプロセスが一番上達が早いと思うんだよね。
全くその通りだと思う。
しかしこれらをきちんと実践出来ている人は現実ではかなり少ないように思う。
何か分からない事があった時に、なんでも自分で調べてホイホイ作れてしまう人もいるが、多くの人は調査の段階で立ち止まってしまうことが多い。「調べたけど分からなかったから挫折した」みたいな。
自分は元々独学でプログラミングを覚えて、過去の仕事でもエンジニアが自分1人しかいないような状況で開発をしていたこともあってか、自分で調べて解決するのには割と慣れている。
例えば何か作業しててハマった場合、自分は下記のような感じで調査している。
後半のググって見つかるまでキーワード変えてググるってのはみんなやっているのだが、前半のオレンジで書いた部分のフローを端折って
・何がしたいのか
・自分がどこまで分かっていて何が分からないのか
・どういう情報が欲しいか
を明確にしないまま、何となくエラーメッセージでググったりする人が多い。
これをやると、気が付くと的外れなことを調べていたり、漠然とググり続けて延々と時間をかけてしまったり、途中でそもそも何がしたいのか分からなくなってしまう。んなことを現場でやってると先輩から怒られること必須である。
ググっても分からず、最終的に誰かに質問する場合も、何が分かっていて何が分かっていないかを明確にしておかないと、聞かれた相手もどう答えていいか分からず、お互いの時間を無駄にすることになってしまう。
んなことやってると段々「あいつは自分で調べずにすぐ聞いてくるめんどくさい奴だ」とチームのメンバーに思われて、段々相手してもらえなくなる。現実は厳しい。
また、開発コストという観点からもなるべく短時間で調査できるようになることを常に心がけるべきだと思う。
調査を行う時間が初めから開発スケジュールに含まれているなら良いが、そうではない突発的な調査が必要になった場合の調査は長引けばスケジュールに影響を与える。
ハマりそうなポイントがハナから見えているのであれば、調査かプロトタイプを作って検証するスケジュールを最初から入れておくことを検討しといた方がいい。
あと調査とは関係ないけど、手元で得られる情報をきちんと集めるのは調査以前の大前提になるので、javaの長ったらしいスタックトレースもめんどくさがらずちゃんと読もうね、ってのもいつも思う。
組織の中で新しいことをする勇気
長いこと多くのエンジニアに保守され続け、機能拡張を続けたシステムにありがちな話。初期の設計思想が無視され、付け焼き刃の設計と実装でどんどんコードが汚くなっていく。
適当なパッケージに適当な名前のクラスが量産され、似たような処理のメソッドや、やたらと多くのことをやり過ぎるメソッドが増えまくる。当然コメントなんて一言も書いてない。
急ぎで作ったから仕方がない、なんて場合もあるのだが、大抵は一つの理由に行き着く。「安易に似た実装をコピペするから」。
他の実装をパクるのはラクだ。すでに動いているのだから間違いがないし、何より自分の頭を使わなくていい。メソッドが新たに増える分には副作用が無いケースが多い。だからバグを埋め込む可能性も低い。良いことづくしだ。
その結果どうなるか。後から触る人が泣くことになる。
コピペした本人はコピペ元がなにをやってて何の為にコピペしたのが分かっているから迷うことはないが、後からコピペした辺りを触る人はそんな経緯は知らない。だからなんでほぼ同じで少しだけ違う処理をコピペして持ってきたのかわからない。このメソッドがなぜこのクラスにいるのか分からない。そもそもこの処理、このパッケージに書いていいんだっけ???等々。ソースを読みながらそんなことを悩んでいるうちに日が暮れる。無駄に工数を消化する。スケジュールが遅れてマネージャーに怒られる。。良いことなし。
どうするか。「根拠のあるコード」を常に書くようにする。レビューで問い詰めてコードの根拠をはっきりさせる。経験上、大体これぐらいしかない。
根拠がはっきりしていれば、他とは違うクラスの設計をしても良い。そのクラスの責務はそのシステムで初めて発生したものかも知れない。だから無理やり他の実装と合わせる必要はない。
オブジェクト指向の原点に立ち返って、「このクラスの責務は何だろうか?このメソッドはこのクラスの責務を超えてはいないか?」と自問して、「この処理はこのクラスがするのはおかしい。別の名前のクラスがやるべきだ」と感じたら、堂々と新しいクラスを作ればいい。
こういうパターンの名前は今いじっているシステムには無い?でも散々考えた挙句、あなたはその名前がふさわしいと思ったんでしょ?根拠があるんでしょ?だったら堂々とレビューに出せばいい。何でもかんでもHogeLogic , FooServiceでピッタリハマる訳じゃない。
新しいことをやるとレビュアーに突っ込まれる?根拠を堂々と述べればいい。それが出来ないならきちんと設計ができていない。自信が無ければ作業中でも他の人にクラス設計をレビューしてもらえばいい。
実装に手一杯で設計まで手が回らない、なんて言うケースもたまに見かけるけど、それでも設計には時間をかけるべきだし、設計に時間がかかるんならチケットを切る段階でそれを見越して見積もりを立ててスケジュールを切ればいい。それくらい設計フェーズは大事だ。ここを疎かにすると後の人が泣く事になり、いずれ自分も泣く羽目になる。
必要ならば新しいことをする勇気を出して欲しい、といつも思う。確かに新しいことは怖い。リスクも大きい。でも、他と同じような感じで何となくコードを書いて飯を食ってたらいつまでもスキルは上がらない。
仮にそれをやって他から突っ込まれても、きちんと根拠を説明して議論することもエンジニアにとっては重要なスキルだと思う。自分が知る限り、説明が下手なエンジニアに良いエンジニアはいない。優秀になればなるほど完結な言葉で端的に説明できる人が多い。議論好きである必要はないけど、きちんと自分の頭で考えて、「これがベストだ!」と思える設計・実装をして、それを周囲に認めてもらいながらものを作り続けられるようにしたい。
ボ カ ロ で 懐 か し い 名 曲 は
便乗して書いた。反省はしていない。
自分が一番ボカロを聞いてた2007年~2009年の頃に好きだった曲(一部)を集めてみた。
本当はplay!2.1.1 + DBFluteの構成でアプリを作ってみたエントリーを書こうと思ったが次回に持ち越しである。
2013年振り返り
今年は社会人として、エンジニアとして色々と「初めて」なことの多い1年だった。
社会人として
フラットな関係で仕事を依頼する、されるようになった
今まではSIer,web制作会社にいたので、仕事の依頼はお客様からの「受注」でやっていて、何かを依頼する時はこちらから「発注」する形で他社のエンジニアやデザイナと一緒にやってきた。なので、どことなく金銭のやりとりが発生することから「上下」関係みたいなものがあって、その中でコミュニケーションを取って仕事をしてきた。別に下請けに傲慢な態度を取るとかってことはしなかったけど(お客様から見たら自分だって下請けだ)、それでもなんか一定の距離というか遠慮というか、そっちの事情はそっちの事情、みたいな所があって、同じものを作ろうとしてるのに違和感というか残念な感じがあった。
それが今年からは事業会社に転職し、営業・マーケ・デザイナ・エンジニアが全て自社の人間になった。その中で仕事をお互いに依頼する/されるようになり、そのコミュニケーションの仕方に最初戸惑った。どのように依頼すればいいのか、されればいいのか。入社した直後は他部署に何かを頼む場合(例えばこれこれの画面の確認をしてくれ、とか)も随分と堅苦しいもの言いをしていたように思うし、何が何でも期日を守らなければならないとか、言われたことは無理でも全部やらなきゃならないとか、受託開発で食ってきた人間のクセが抜け切れていなかった。
でもやってくうちに、事業会社の場合はみんなが同じ方法で利益を追い求めるのだから、個々の都合ではなく全体最適でタスクを捉えてどう進めるかを議論すべきだ、ということに気づいた。つまり、言われたから全部やる、ではなく、それが会社の為にどういう意味があるのか?を考えて議論して、やる内容や優先順位付けをできるようになってきた。他の部署もそういうものの考え方をして話をしてくれる。たまにそうでない人もいたりするが、その上司は分かってくれるので非常にやりやすい。一方で、受託開発と違ってその施策をやって、必ずしも売上が上がる訳ではないので、本当に効果があるかどうかビビりながらやったり、逆に数値が下がって慌てて切り戻すなんてこともある。それでも、今のフラットな関係で、みんなで同じ目的を達成するために議論しながら仕事を進める今のスタイルが好きだと思う。
新卒氏のOJTをした話
今年の夏頃から諸事情で営業から異動になった今年入社の新卒のOJTを担当した。
後輩を持つのもOJTを担当するのも、社会人になってから5年目にして初めての経験で、仕事として人からプログラミングを教えてもらった経験が殆んど無かった自分としては色々不安があったのだが、その分得るのものが大きい経験だった。
最初の一ヶ月半は教育期間ということでjava初心者本の写経、webアプリ開発のための基礎知識として自分が講師をやった座学を数回、webアプリ開発課題をやってもらった。
本当はjavaの基礎に加えて、webサーバ・APサーバ・DBの連携部分などのwebアプリの基礎をじっくり教えてから課題に取り組んでもらいたかったけど、すでに他の新卒は業務に入っていた時期で時間がなかった。なので、Webアプリケーションの登場人物や、静的なホームページとWebアプリケーションの違い、データーベースの概要なんてのを座学でわずかにフォローしたに過ぎなかった。課題がギリギリ出来る程度の。
しかし、後に業務に入ってもらってから、この辺はもっと時間をかけてじっくりやっておけば良かったと感じた。業務に入ってからの共通言語になるこれらのレイヤーの知識が頭に入っていないと、タスクの内容も正しく把握できないこともあるし、「何となく」ロジックを直して動いた、で終わってしまっていたなと思うこともあった。この辺は反省材料として来年の新卒教育カリキュラムに活かしていく予定。
業務に入ってからは、スキル差というかベースとなるIT関係の知識の無さが問題になることが多かった。元々中途入社で固めてきた会社だったので、「エンジニアとしての常識」みたいなものがあることを前提に業務を回してきたけどそういうのが全くないメンバーへの対応は非常に難しいものがあった。主に自分がチケットを管理して新卒氏に振って自分がレビューする、スケジュールも管理する、みたいなことをやっていたが、Webアプリというものはサーバ側もフロント側のhtml,js,css、さらには使ってる外部のミドルウェアまで広く知らないといじれないもので、その辺をつまみ食いしながらタスクをこなしてもらっている状態で中々体型づいた知識の蓄え方をさせてやれなかった。
毎日30分その日のタスクの振り返りをして、技術的に足りない部分はQA形式や自分個人が必要だと思うことを教える形でフォローしたけど、本当はここも週単位でテーマを決めてそれに基づいて講義形式で技術を叩き込むべきだったのだと思う。あまりにも言語の知識も足りてなかったし、コードを書く上での「作法」とかコードを追う上での勘所が分かっていないようだった。自分が激務で週2,3は終電帰りとかで時間がなかったと言い訳をしてしまえばそれまでなんだけど、申し訳ないことをしたと思う。教育担当になったのだから、自分のタスクを減らすことを上司に交渉してでも教育に専念すべきだったのだと思う。けど自分の仕事の裁量が大きくなってきた時期とも重なっていて、責任ややり甲斐が大きくなってきた中で、自分の業務を減らしたくないという思いもあった。結果として、中途半端になってしまって申し訳ないことをしたと思う。
結局そんな状況だったので、見かねた会社の教育+サポート専門で入ってもらっているフリーランスのエンジニアにサポートをどっぷり頼む形となった。自分の至らなさを認めなくてはならず凄く辛かったけど、結果としては新卒氏のスキルアップという意味では良かったのだと思う。12月末頃までにはwebアプリの機能保守という点では業務が出来るようになった。まだゼロベースで作れるほどではないが、前より大分総合的なスキルが深まったように思う。
11月末頃にエンジニア内でチーム再編があって、新卒氏は自分とは違うチームになって業務的にチケットを振ることは無くなって実質お役御免になった。ただ、週1でフォローアップをする時間を作ってそこでのフォローは続けている。そこでは、今やってるチケットの相談とか、チームの愚痴を聞いたりとか、UI設計やjsやフロントの実装がまだ弱いのでその辺の技術的なフォローをしたり、その新卒氏と他のエンジニアも交えて「javascript本格入門」の読書会を初めたりした。決して良いOJTトレーナーではなかったけど、次の新卒が入ってくる頃まではフォローを続けて、自分自身の「教えるスキル」の向上に努めたい。
エンジニアとして
人のソースをレビューするようになった
前職ではほぼ1人デコードを書いて自分でテストして自分でリリースするような感じだったのだが、現職からは10数名のチームで開発している。
そこで当然のごとくお互いのソースをレビューするのだが、初めての経験だったのでどこまで突っ込んだレビューをしていいのか戸惑った。
とりあえず目的を満たしていればいいのか、クラス設計の適切さやメソッド名や変数名の適切さとかの細かい部分まで突っ込むべきのか、時間の成約があるなかでどこまでやるべきか迷った。明確な基準がある訳ではなく、個々人の裁量に任されていたので自分でそこは決めなければならない。
最初はチェックアウトしてローカルで動作させて問題なければ大方OK、ソースを見て「まぁこんなもんだろ」でLGTMとしていて、動作がおかしければ「大体ここがおかしいでーす」とかの大雑把な指摘で今年前半は良かった。メンバーのスキルも仕様理解度も高いメンバーで構成されていたからツーカーの会話で大体済ませられたし、どちらかと言えばこの頃は俺の方がマサカリを投げられまくっていた。
それが、チーム内のメンバーがどんどん他事業に行ったり中途で入ってきたりして入れ替わってきて、今年初頭と比べて殆んどのメンバーが入れ替わった今年後半においては、プログラミングのスキルが低かったり仕様の理解が不十分なメンバーが増えて、レビューでの突っ込みどころが凄く増えてきた。このクラスはこのパッケージに置いちゃダメなルールなの!Wikiに書いてあるでしょーが!とか、この処理はApache CommonsのUtil使って~みたいなレベルのツッコミをしなければならないことが増えたので、スキル底上げも兼ねて細かい実装レベルでレビューをするようになった。
先に書いた新卒氏のレビューなんかもそうである。レビューする時にRedmineのチケットのソースに延々と細かい駄目だしとなぜそれが必要なのか?を書くようになった。jsのイベントのbindの仕方がミスってて「ここでonでbindしたらajaxでリロードした時にbindされないから$(document).onでやった方がよくて、その場合もさらに。。」みたいな感じのことを書いたり。
他にも何度も使用するmatcherをクラスのフィールドで初期化しないとダメな理由を本人とっ捕まえてコンコンと説明したりしなくちゃいけないような場面も増えたが、結局チーム全体のスキルを底上げしていかないと良い仕事なんて出来ないので、レビューは今後も「細かく」「地道に」やる方針で続けていこうと思う。
オブジェクト指向をちゃんと意識するようになった
javaをガッツリ書くようになって、ポリモーフィズムの重要さとかデザインパターンの有用さとかがようやく分かった気がする。1年前まではクラスはせいぜい処理を一定の単位でまとめたものぐらいにしか思ってなくて、インターフェース?美味しいのそれ?って感じだったのだが、今は特定の機能を「いかに差し替え可能な実装にするか」を考えてクラス設計したり、必要に応じてインターフェース作ったり、ということが自然にできるようになった。たまに、今触ってるソースでも過剰に抽象化し過ぎているクラスもあったりもするが、抽象化し過ぎたものを具象化し直すのはそれ程難しくないが、その逆は凄くめんどくさい。一度、「こうやって作ったけど処理の最初の方で実装クラス分けて処理書くようにしたら内部の分岐がシンプルになるじゃん」みたいなケースがあって、ほぼ終わってたがそこからインターフェース書いて実装クラス作りなおしてやり直したみたいなことをしたことがある。テストも全部やり直しでめんどーくさいのだが、後から保守していく上では業務ドメインを細かく分けておいた方がやりやすくなった。ドメイン分析大事。けどDDDはまだ良くわからないので来年勉強して、部分的でも取り入れていきたい。
2013年に読んだ本
2013年の振り返りということで、今年読んだ本を読んだ順にまとめてみる。
amazonの購入履歴と後は個人的な記憶に基づいてまとめるので多少の過不足はご勘弁を。こうやって見ると今年はあまり本を読んでなかった。ネットの情報に非常に頼りまくっていた感がある。
紙媒体でしか得られない知識はまだ沢山あるので来年はもっと読まなないとなーと思う。
Java関係
Effective Java
2012年12月頃に購入。
javaやってる出来る人はみんなこの本読んでるイメージ。ピアソン社の日本撤退により日本語版が絶版になってしまったが、また来年2月に丸善出版から再販されるらしい。
昨年12月に今の会社に転職して初めてまともにjavaを書き始めたのできちんとjavaを勉強しようと思ったのだが、javaの入門書は大体がプログラミング初心者をターゲットとしているので、説明過多で自分が知りたい「他の言語との違い」みたいな所が掴みづらい本が多かった。なので初心者向けじゃなくて、ちょっと知ってる人向けのjavaの本が欲しかった。
なんていうリクエストを職場の先輩にぶつけてみたら紹介してもらったのがこの本。頭から読まず、ジェネリクスとアノテーションの章から読み始めた。この章だけはjava1.5からの新機能ということもあって、入門的に丁寧に書いてあった。
なぜジェネリクスとアノテーションが必要か?そもそもそれらはどういう役割なのか?どう使うのか?みたいなことが書いてあって非常に分かりやすかった。これ読まなかったら「Eclipse先生に叱られるから」程度の理由でジェネリクス使ってたし、アノテーションは「おまじない」ぐらいにしか思わなかったと思う。まぁ自分でclassからアノテーションを参照するコード書いてみればおまじないじゃないってことぐらい分かるけど、業務ロジックだけ書いてるとそういう機会も殆ど無いのでアノテーションの仕組みを一度はきちんと勉強してみることは大事だと思う。
それ以外の章については始業の1時間ぐらい前に会社に来て黙々と読み進めて1ヶ月で半分ぐらいまで読んだのだが、段々1人では理解がしんどくなってきて、そもそも自分の理解が正しいのか自信が持てなくなってきた。そこで今年の春ぐらいから週一回、業務時間外に社内読書会という形で同僚と一緒に読み進めることにした。参加していたのは自分と同じぐらいのスキルのメンバーだったので、何でもわかってる先生という感じでもないので「これはこういう意味じゃね?」「これは作者言い過ぎじゃね?」とかあーだーこーだと議論しながら進めた。あと、Effective javaの読書会議事録はネットの至るとことにアップされているのでそれらを参照することもあった。
中々これは楽しかったのだが、参加メンバーは自分含めて最初5人ぐらいいたはずが、1人来なくなり2人来なくなり、今では自分ともう一人しかいない。別に退職したとかじゃなくて、仕事が忙しいとか朝早く来るのがしんどいとか、そんな理由でモチベーションが落ちてしまったのだと思う。自分は「継承よりコンポジションを選ぶ」に衝撃を受けて、今までガンガン継承使って共通処理をまとめる実装をしてたのを、デザパタを適用する時以外は殆んど継承を使わないようになるとかの影響を受けているのだが、クラス設計レベルの話に興味が無い人には面白く無い本なんだと思う。
OOP言語使ったプログラミングにおいて、クラス設計・インターフェース設計が一番大事だと個人的には思っているので、Effective javaを来年以降も読み込んでもっと良い設計が出来るようになりたい。
Seasar 2 徹底入門 SAStruts/S2JDBC 対応
Seasar 2 徹底入門 SAStruts/S2JDBC 対応
- 作者: 竹添直樹
- 出版社/メーカー: 翔泳社
- 発売日: 2010/04/20
- メディア: 大型本
- 購入: 10人 クリック: 270回
- この商品を含むブログ (33件) を見る
2012年12月頃に購入。
入社してからずっと関わっているプロジェクトはStruts2なのだが、Struts2の日本語本が無かったのと、他のプロジェクトではSAStrutsを拡張したフレームワークを使ってたり、社内にSeaserコミッタの人がいたりもするので勉強のために買った。
大体コレ一冊でSeaser2のDIコンテナの仕組みからSAStruts使ったwebアプリの開発までいける。2010年と古めの本だが今でもSASturtsでwebアプリを作るならまだまだ使える本。
ただ、書籍内ではDolteng使ってSASturtsプロジェクトのひな形を作る方法が紹介されているが、今作るんだったらMavenのarchetype使った方がいいと思う。
そっちのがラクなのと最初からmavenプロジェクトとしてimportできるので何かと良い。自分の環境では、Doltengで作ってからMavenプロジェクトにコンバートしたらプロジェクト自体がおかしくなったことが何度かあった。Maven使わないでアプリ作るとか昨今のjavaではあり得ないので何でも最初からgenerate : archetypeで作るようにしている。
Spring2.0入門 Java・オープンソース・Web開発自由自在
Spring2.0入門 Java・オープンソース・Web開発自由自在
- 作者: 株式会社豆蔵,長谷川裕一,岩永寿来,伊藤清人,大野渉,麻野耕一
- 出版社/メーカー: 技術評論社
- 発売日: 2006/12/28
- メディア: 大型本
- 購入: 3人 クリック: 41回
- この商品を含むブログ (21件) を見る
2012年12月頃に購入。関わっているプロジェクトでSpringのDIコンテナだけ使っているのだが、Springのbean.xmlの定義複雑過ぎワラタwwwということで購入。bean定義のオプション書く時にリファレンス代わりに使っている。上記のリンクはSpring2.0だが、今は新しくSpring3.0入門が出ているので、今買うならSpring3.0で良いかも。自分は関わっているプロジェクトのバージョンに併せてSpring2.0の方を買った。
sprint mvcは使ってないのでスルーしてるがぼちぼち使ってる人がいるみたいなのでそのうちやってみようかと思う。
実装パターン
- 作者: ケント・ベック,Kent Beck,永田渉,長瀬嘉秀,株式会社テクノロジックアート
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/12/22
- メディア: 単行本(ソフトカバー)
- 購入: 30人 クリック: 502回
- この商品を含むブログ (91件) を見る
2013年5月ぐらいに購入(多分)。
java-ja DDDの講演資料のスライド↓で紹介されてたので購入。javaを書くようになってオブジェクト指向が何となく板に付いてきたが、それでもやっぱり自信なかったのでクラス設計やメソッドの分割粒度の決め方について知りたくて購入した。
書籍の内容については初心者に毛が生えた程度~中級者向がOOPを使いこなして良い設計や実装をするためのノウハウ集といった形。最初の第一章~第四章まではプログラミング全般において設計に気を付ける目的とか理由といったことが書いてあって、第五章からは各論(クラス、コレクション、例外等)について書いてある。
良い所として、全章を通じて、理論上の話だけでなく具体例を上げて説明しているので解りやすい。第三章なんかは、メソッドの名前付けについて実際のコードを例にダメな点と改良すべき方向について述べた上で、段々とサンプルのコードが改良されていく流れの構成になっており、名前付けに関して著者がどういう思考をしているのかトレースできる。
余談になるが、この「誰かの思考をトレースする」ことは技術学習においては大事だと思っていて、例えば「名前付けはより具体的な名前を付けた方が良い」という情報があっても、それを受け取った人が「具体的な名前ってなんだ?どうやって自分のコードを改善していけばいいんだ?」となるわけで、大事なのは「具体的な名前を付けるべき」ということではなく、「どういう観点で具体的な名前を探していけば良いのか」ということである。この書籍の良い所は後者の点が凄く丁寧に述べられている点である。納得しながら読み進めることができるので頭にすんなり入るし、作者の思考をトレースして背景がしっかり分かっているから応用を効かせやすい。
読み物系
Team Geek ―Googleのギークたちはいかにしてチームを作るのか
Team Geek ―Googleのギークたちはいかにしてチームを作るのか
- 作者: Brian W. Fitzpatrick,Ben Collins-Sussman,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/07/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (15件) を見る
2013年7月に購入。
「チームビルディング」や「チームマネジメント」の話。開発がしんどくて行き詰っていた頃に読んでいたが、これを読んでから何となくチーム内での自分の立ち位置とか、動かない人を動かす方法とか、周りからの見られ方とか考えるようになった。色々書いてあったけど、結局はエンジニアも人間なのよというお話。多分エンジニア以外の人が読んでも面白い。
Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ
Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ (Software Design plus)
- 作者: 和田裕介
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/20
- メディア: 単行本(ソフトカバー)
- 購入: 29人 クリック: 685回
- この商品を含むブログ (27件) を見る
2013年夏ぐらい?
ゆーすけべーさんの書籍。Webサービスを作るためのアイデアの考え方から実装のコツ、宣伝、運用まで。一冊あればWebサービス作って回せるぐらいにはなりそうな本。
何か作りたいーけど作るものがないーという人は是非「第一章 心構えと下準備」を読んで欲しい。最初の一歩を踏み出すきっかけをくれるんじゃないかなーと思う。技術的には最後の章のtwitter APIを例にしたOAuth認証の実装はなかなか細かく書かれていてOAuth認証するアプリを書いたことない人には凄くためになると思う。
そういや今年はGithub認証なんかも試して会社のエンジニアブログに書いたりした。
Yコンビネーター シリコンバレー最強のスタートアップ養成スクール
Yコンビネーター シリコンバレー最強のスタートアップ養成スクール
- 作者: ランダル・ストロス,滑川海彦,高橋信夫,TechCrunch Japan翻訳チーム
- 出版社/メーカー: 日経BP社
- 発売日: 2013/04/25
- メディア: 単行本
- クリック: 14回
- この商品を含むブログ (11件) を見る
少なくとも2013年中には買った。
読み物。「ハッカーと画家」や「On Lisp」で有名なポールグレアムがたちが上げたベンチャーファンドである「Yコンビネーター」の取材記録のような形でまとめられている。このファンド、ただ資金提供するだけでなく、有望なスタートアップ(或いはスタートアップになりそうなサービスを作ってる学生グループ)を集めて、住む場所と少額の資金提供を行って自立したスタートアップとして育てるという珍しい取り組みをしている。タイトルに「スタートアップ養成スクール」と入っているのはそのため。
本書内では、面接の様子から始まり、実際に「授業」としてポール・グレアムとの問答をしている場面や定期的に行われる「夕食会」様子を通して、Yコンビネーターや昨今のスタートアップに関する事情を述べている。
所感としては、自分自信は起業に興味がある訳ではなかったが、スタートアップのメンバーがどういうことを考えてサービスを開発しているかという点で色々勉強になることが多かった。
BtoCオンリーのサービスは非常に難しいので資金繰りを考えたらBtoBでスタートすべきだ、というグレアムの言葉が印象的だった。自分も思いつくのは大体BtoCだが、マネタイズの部分でいつも詰まってそこで「アイデア」レベルで止まってしまう事が多い。BtoBでマネタイズまで含めて考えて、そこからBtoCに拡大することも出来るわけで、そういう考え方をしないとビジネスとしてサービスを作るのは難しいと感じた。
デザイン
ノンデザイナーズ・デザインブック
- 作者: Robin Williams,吉川典秀
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/11/19
- メディア: 単行本(ソフトカバー)
- 購入: 58人 クリック: 1,019回
- この商品を含むブログ (99件) を見る
2013年9月ぐらい。
フロント側の実装案件が増えて、いい加減自分でもまともなUIが組めないといけなくなったのでデザインの原則を学びたくて購入。
デザインってセンスだと思ってたけどどちらかと言えば「パターン」や「原則」をいかに多く知っていて、それらをどういう時に使うかを知ってるかどうか、だと感じた。色の意味やフォントの効果は確かにセンスかも知れないが、全体の構成とかは完全にパターンがあるのでそれを守ってUIを作ることが大切だと感じた。
Ruby関係
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (10件) を見る
- 作者: まつもとゆきひろ,David Flanagan,卜部昌平(監訳),長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/01/26
- メディア: 大型本
- 購入: 21人 クリック: 356回
- この商品を含むブログ (124件) を見る
- 作者: 前田修吾,まつもとゆきひろ,やまだあきら,永井秀利
- 出版社/メーカー: オーム社
- 発売日: 2002/04
- メディア: 単行本
- 購入: 3人 クリック: 45回
- この商品を含むブログ (27件) を見る
何よりブロックを引数として渡せるのが凄く便利でコードを完結にしてる。java8はよ来い。