社内勉強会でライトニングトークしてきた。
フリーテーマだったので何話そうか迷っていたけれど、最近いい感じになってきたチームのコードレビューについて話してみた。
コードレビューを題材にしたものの、チーム開発が単なる個人の集合じゃなくて、コラボレーションが生まれた時に、チームの力は何倍にもなるんだってことが少しでも伝わっていたら嬉しい。
久々に人前で話したけどやっぱり緊張する。。
なお、サッカーチームのたとえの話が一番熱を帯びてたというフィードバックを頂きました笑
社内勉強会でライトニングトークしてきた。
フリーテーマだったので何話そうか迷っていたけれど、最近いい感じになってきたチームのコードレビューについて話してみた。
コードレビューを題材にしたものの、チーム開発が単なる個人の集合じゃなくて、コラボレーションが生まれた時に、チームの力は何倍にもなるんだってことが少しでも伝わっていたら嬉しい。
久々に人前で話したけどやっぱり緊張する。。
なお、サッカーチームのたとえの話が一番熱を帯びてたというフィードバックを頂きました笑
12/20にQA勉強会に参加してきたので、印象に残ったことや思ったことなどを残しておく。
品質評価に焦点を当てた勉強会に参加したのは初めてだったかも。
時間があったので質問してみました。
とても有意義で面白かった。
QAと開発のコラボレートが具体的にイメージできるようになったのが一番の収穫かもしれない。
www.slideshare.net
どのタイミングでなったのか分からないけどiTunesでCDを読み込もうとしたら「このCDの曲名がオンラインで見つかりませんでした。曲を読み込みますか?」と言われて曲名が読み込めなくなった。
備忘のための解決策メモ。
下記のファイルを削除する
$HOME/Library/Preferences/
多分 ll | grep iTunes
とかして、関係ありそうなファイルは削除しちゃうのがよさげ。。
※バックアップ忘れずに
au との契約期間はまだまだ残っていたんだけども、解約金を払ってもすぐに回収できるくらい価格差あるなぁーと思って UQ mobile に乗り換えた。
ただ au版iPhone6sについてはまだもうしばらく使う予定なので、simロック解除して使うことにした。
あんまり詰まるところなかったけど、まとめておく。
店頭に行かなくても、「auお客さまサポートサイト」から申し込みできる。
simロック解除する場合の注意事項などは下記に載っている。
なお、すぐに解除されるわけではないらしいので、UQMobile申込みより余裕をもってやっておくようにする。
店頭に行かなくても、電話での発行が可能。
ポイントくれるとか引き止めのお話をされるけど、断ると発行してくれる。
解約月の割引の扱いとか、基本料金に日割りあるのかとか、解約にあたっての料金の話も詳しくしてくれる。
MNPの予約番号には有効期限があるので注意。 番号や有効期限は電話でいわれるので控えたけれど、その後SMSで送ってきてくれた。
オンラインで完結する。 便利な世の中になったものだ。。
以降はsimが届いた後の手順。
普段から最低限のバックアップはiCloudなりに取ってるけど、念のため直前にもしておく。
my UQ mobile から手続きを行う。
初期IDとパスワードは同封された資料に記載されていた。
同資料の手順に従い回線切替を実行する。
simが届いたら、差し替える。
下記を参考にやった。
なんと差し替えには専用の器具があったとは。。
iPhone6s用のプロファイルをインストールする。
Safariじゃないとだめっぽい。
ついでにauのプロファイルはもういらないかー、と削除した。
JavaでOptionalの値取り出しにorElseを利用すると思うんだけど、その動きについて勘違いしていた。
Optional<Long> getId();
こんな感じのメソッドがある時、orElseでの値取り出しは下記の用になると思う。
Long id = getId().orElse(createId());
前述の例の場合、createIdはOptionalがnull(empty)の場合にのみ呼ばれると思っていた。
ところが、orElseの処理自体は常に呼ばれるようだ。
イメージでいうと下記のような。
Long id = getId(); if (id == null) { // nullのときだけ呼ばれると思ってたけど、orElseはそうじゃない!! id = createId(); }
例えばcreateIdの処理コストが高かったりする場合は、都度実行することは避けたい。
その場合はorElseGetを使うことで、Optionalがnull(empty)の場合にのみ呼ばれるようになる。
// orElseGetを使う // OptionalがnullのときだけcreateIdが呼ばれる Long id = getId().orElseGet(() -> createId());
メソッド呼び出し確認のUnitTestを書いているときに気づいた。
Test書くのって大事だなぁと改めて思うなどした。
12/3(土)にJJUG CCCに参加してきたので印象に残ったことや感想など。
追いかけるべきトレンドを見抜くには、その本質を見極めることが大事という話だった。
結局これが一番おもしろかったかもしれない。
体物知心理の話がとても面白かった。
体: 肉体的優位者が勝つ
↓
物: 物量で勝るものが勝つ
↓
知: 情報を駆使するものが勝つ
↓
心: 人々の心を支配したものが勝つ
↓
理: 真理を手にしたものが勝つ
これは後に出てくるものに先に出てくるものは絶対に勝てないって話らしいんだけど、抽象化すると本当に何にでも当てはまるなぁ、と。
特に物と知の間に大きな壁があるなとは強く感じる。
人がいくらいても、お金がいくらあっても、モノがいくらあっても物量では解決できないであろうってことは想像以上にあるんじゃないかと。
守破離には「本ぞ忘れるな(教わった基本を忘れるな)」という教えがあるらしい。
これ初めて聞いたんだけど、大切にしたい言葉。
何かを始める時、いきなり全部守ることができないからいくつか妥協することはよくあるけど、それでなまじっか成功体験をすると守もできてないのに破だとか離だとか語りがちな場合も多い気がする。
この言葉は刺さった。
手段と目的の手段が技術であるんだろうけど、その手段は何かのニーズから生まれているはずで、本質を見誤らなければ手段と目的が合致するということではないかなと。
非常にエンターテイメント性が高かった。
まさかコールアンドレスポンスをするなんて。。
なぜ、米国と日本で生産性が違うのかという疑問に対して同じValueに対して作業の物量が違うから、という。
前述の体物知心理の話とつながるなぁ、と思って聞いていた。
物量(体)では情報(知)で戦う人に勝てないよなぁと。
この話は確か牛尾さんのブログでも以前出てきた気がしたんだけど、当該記事がパッと見つけられなかった。
simplearchitect.hatenablog.com
Clojure言語自体は全くさわったことないんだけど、なんでClojureを採用したのかとか、Clojureの特徴なんかが聞けたらいいなと思って参加した。
ブランディングや技術マーケティングのために新しい言語を採用したという側面があるらしい。
なるほど確かに、大量採用は別にして、対エンジニア向けということであると、そういう観点もアーキテクチャ選定なんかに含めていくのは大切なことかもしれないなぁと思った。
古い技術を使い続けるリスクなんかも、実は人が集まらない・離れていくリスクが大きいんじゃないかって考えたりする。
これも物量で解決できない問題なのかなと。
フレームワークを使うんじゃなくて、ライブラリを活用していくという考え方は新鮮だった。
後から知り合いに聞いたところによると、言語の自由度が高いところなんかも影響してるかもしれないとのこと。
www.slideshare.net
Javaという言語にフォーカスされることがあるけど、JavaのエコシステムのコアがJVMだっていうのは印象に残った。
JavaがあってのJVM言語だし、逆もまた然り。
お互いが切磋琢磨して発展していけるといいなぁ、と。
RubyやJSONなど他の言語が乗りたいと思えるほど魅力的な基盤であるJVMはすごいなと思った。
当初聞く予定はなくて別の予定入れちゃってたんだけど、パネラーが魅力的だったので、途中まで聞いてきた。
フリーランスだと、ホントのホントにコアの部分は触らせてもらえない、という話があってなるほどなぁと思った。
マネージメントなのか技術なのか、って話があんまり好きじゃなくて。
(理想論とは思いつつ)みんながマネージャーで、みんながプレイヤーっていうのがいいなぁ、って思うので。
ロールとしては必要なのは理解してるんだけど、マネージャーとプレーヤーに壁を作るように聞こえることが多いし。
ヨシオリさんが言っていた自分がヘタになるための転職っていうのはすごく共感する(情熱プログラマーも読んだ)。
けど、それで収入とか待遇がどうなるのかっていうのがとてもシビアな問題だよなぁって思う。
最終的なバランスはもちろんあるんだろうけど、やっぱり自分よりすごい人が近くにいるかどうかって大切なこと。
自分としてはJavaにこだわってるといえばこだわってるし、こだわっていないといえばこだわっていない感じ。
一番得意だっていうのと、思い入れ補正もあって好きだし、自分にとって大切な言語なのは間違いない。
いろいろな刺激をもらって、何かと考えたりするキッカケをたくさんもらえて楽しかった。
最近迷っていること。
クラスのメンバーオブジェクトのアクセサを直接定義するよりは、隠蔽してあげたほうがいいんじゃないかと思うこと。
最終的にケースバイケースだろうとは思いつつ、気にする観点やポリシーなどはまだまだ引き出しが少ない。
public class Person { private Phone phone; public Phone getPhone(){ return phone; } public void setPhone(Phone phone){ this.phone = phone; } }
public class Person { private Phone phone; public String getPhoneNumber(){ return phone.getNumber(); } public void setPhoneNumber(String number){ phone.setNumber(number); } }
phone
はPersonが持ち主にもかかわらず、外部から直接アクセス可能になることによって、 phone
のコントロールを外部に渡してしまうことになるから。
(Effective Javaでオブジェクトじゃなくて Date#getTime()
を返せっていうような話もあったような)
PersonクラスのクライアントがPhoneクラスについて依存することになるから。
phone
フィールドを protected
にするのはよさそう。