GW 読書強化週間!
の予定だった
GW の間に積み本消化してやるぜ!といきごんでいたのです。
ところがどっこい、読み切れたのは2冊でした。
その紹介と感想をば。
エッセンシャル スクラム
エッセンシャル スクラム: アジャイル開発に関わるすべての人のための完全攻略ガイド (Object Oriented Selection)
- 作者: Kenneth Rubin,岡澤裕二,角征典,高木正弘,和智右桂
- 出版社/メーカー: 翔泳社
- 発売日: 2014/07/08
- メディア: 大型本
- この商品を含むブログ (7件) を見る
精神的ダメージを多分に負いました。GW 中でなければ読み切れなかった気がしますw
スクラムについてのこうあるべき、なぜなら~をざらっと知れたので読んでよかったかなーって所です。
で、やっぱり3役に求められるスキルセットは各々だいぶちがうな、ってのが明確になりました。
この辺の責任境界はしっかりした方がいいんでしょうね。
あとですね、政治のにほいがそこはかとなく…
というのも、結構なページを割いて、経営レベルでのスクラム的な方法論や組織論への言及があったからです。
この辺のレベル感は DDD でも近しいものがありました。戦術と戦略やったと思います。
スクラムで定義されているのは戦術レベルまでやけど、戦略レベルやってるところも多いし書いとくねーてかんじです。
政治は分からないです。
技術的負債という皆大好きなワードもありました。
かくいう僕もがっつり読んだんですが、考え方は良いなーってところです。
スケジュールを詰めれば、その詰めた分だけの負債をコード上で背負うわけで。
で、利子ついた負債の返済額と遅延コストを比較してどうのってやつです。
いずれにしても、僕自身開発一辺倒な輩なので視点を広げる意味ではよかったです。
闘うプログラマー
- 作者: G パスカルザカリー
- 出版社/メーカー: 日経BP社
- 発売日: 2013/11/20
- メディア: Kindle版
- この商品を含むブログ (7件) を見る
こいつはだいーぶ積んでましたな。
Windows NT なんてばかでかいもの作ればそらもう紆余曲折あるわけですが、そいつの開発記です。bash on Windows に思いをはせながら読みました。
で、すっごい人間くさい話でした。おそらく、登場人物の誰がしかに自分を重ねるでしょうし、周りの誰かも重なるでしょう。
闘うプログラマー読了
— rohki (@r_ohki) 2016年5月4日
なんかねー、想起させられた。
一番はあれやね、マグリア氏の話。
僕はこうでした。ネタバレになるので、詳細ははしょります。
読んでる途中
数学パズル
自分の劣化具合に愕然としているところ。ちょくちょく解いてます。Rustで。
マダマダイッパイ
積み本を整理した結果、いっぱいあるということがわかりました
— rohki (@r_ohki) 2016年5月7日
まる
エッセンシャル スクラムは内容的にも分量的にもきつかたです。
次のときにはうすめの本から手を出します。
ただ、祝日がとおいんだよなぁ…
Delphi 開発環境で欲しかったモノが出そろってきた
どゆこと?
以前、Rad Studio 勉強会にて以下のような発表したんですよ。
www.slideshare.net
で、導入したいなーってことで以下3つがありました。
- ソースコードの分析
- テストコード実行の簡略化
- Git との統合
で、このうち2つが揃った! って話です!!
続きを読むREST.JSON での直列化
JSON の色々を調査中で、その一環として見つかったので書きます。
こんな書き方すると各方面の方に怒られますが、手続き的に。
procedure TForm1.JSON; var PersonList: TList<TPerson>; JsonObj: TJSONObject; begin PersonList := nil; JsonObj := nil; try PersonList := TObjectList<TPerson>.Create(); PersonList.Add(TPerson.Create()); PersonList.Last.Name := 'Alice'; PersonList.Last.EMail := 'Alice@wonderland.org'; PersonList.Add(TPerson.Create()); PersonList.Last.Name := 'Bob'; PersonList.Last.EMail := 'Bob@wonderland.org'; JsonObj := TJSON.ObjectToJsonObject(PersonList); Memo1.Lines.Clear(); Memo1.Lines.Add(JsonObj.GetValue('items').ToString) finally FreeAndNil(JsonObj); FreeAndNil(PersonList); end; end;
で、実行したやつを整形した奴が、以下になります。
[ { "eMail": "Alice@wonderland.org", "name": "Alice" }, { "eMail": "Bob@wonderland.org", "name": "Bob" } ]
Memo1.Lines.Add(JsonObj.GetValue('items').ToString)
としているのは、データ以外の物もくっついてくるから。
Memo1.Lines.Add(JsonObj.ToString)
にすると、以下の通り。
{ "items": [ { "eMail": "Alice@wonderland.org", "name": "Alice" }, { "eMail": "Bob@wonderland.org", "name": "Bob" } ], "listHelper": [ 2 ], "ownsObjects": true }
総合すると、使えないことないけどやりやすいかと言われると微妙、という所。
Delphi のアプリケーションだけでやりとりするならともかく、他言語が絡んでくると items 以外は邪魔だし・・・
まぁ、REST.* のパッケージ多めなので、その辺含めて要確認ですな。
ガチガチに緊張しながら Scala Matsuri 2016 の LT で発表した
やるんだよね(ニッコリ) と再三再四背中を押していただいての発表と相成りました。
生放送で流れると当日確認してさらに死にかける罠。
内容はこんな感じ
1行もコード無し!!!
ええやん、軽めのやつがあっても…
でもやってよかったかな。
かなりガチ勢が多かったのですし、ドワンゴの方が半数ですし、ゆるい内容もあっていいでしょう。
うん、そう思おう。
本編まとめはまた別途。
2015年歳末棚卸し
Twitter 見ながらふりかえり。
なんか、色々積もり積もったものを頑張った1年だったかなぁ、と感じます。
特に CI 環境については、なんでできないんだろうを一つ一つ潰して、やっとできるようになったので、
結構感慨深くあります。*1
Podcast やブログ記事を見ながら、そうそうや違うんじゃね、と自分の意見も強く持てるようになりました。
この辺は新しい課に異動したことによる恩恵ですね。同じく課員となった方や同じプロジェクトを進めている方が僕と違う観点をもってられるので、とてもありがたいです。
どうしても技術よりになるところを、製品としてどうなのかと諌めてもらっている感じがします。
で、来年はもうちょっとコードを出していきます。
関数型も勉強していいところとかも見えてきたので、その辺を反映したコードを出す感じですかね。
この間の RadStudio 勉強会で LT した内容も、関数型を受けての出力なので。
最後に、来年はバグに当たらない年がいいかなぁ…
*1:そういやブログに書くって言って、書いてない…
DevLOVE現場甲子園2015『西日本大会』に参加してきた
Delphi の IFuture やら ITask やら
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, System.Threading, System.Generics.Collections, System.Classes; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { private 宣言 } function GetRandomInt(): IFuture<Integer>; public { public 宣言 } end; var Form1: TForm1; implementation {$R *.fmx} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin TTask.Run( procedure var Tasks: array[0..4] of ITask; ValueStrs: array[0..4] of string; ii: Integer; Sum: Integer; begin for ii := 0 to 4 do begin Tasks[ii] := GetRandomInt().Start; end; TTask.WaitForAll(Tasks); Sum := 0; for ii := 0 to 4 do begin Sum := Sum + IFuture<Integer>(Tasks[ii]).Value; ValueStrs[ii] := IFuture<Integer>(Tasks[ii]).Value.ToString(); end; TThread.Synchronize(nil, procedure begin ShowMessage(string.Join(' + ', ValueStrs) + ' = ' + Sum.ToString()); end ); end ); end; function TForm1.GetRandomInt: IFuture<Integer>; begin Result := TTask.Future<Integer>( function: Integer begin Result := Random(100); Sleep(Result * 100); end ); end; end.
一応出来たけどさ・・・
無名関数が多すぎ。
あと型推論でジェネリクス書かなくて良くなるともうちょいマシかな。
function TForm1.GetRandomInt: IFuture<Integer>; begin Result := TTask.Future( function: Integer begin Result := Random(100); Sleep(Result * 100); end ); end;
これとかエラーになるけど、前後見たら普通に補ってくれてもー、とちと思ってしまう。