ベビーサンの記録

勉強したことと思ったことをね

【読書感想文】コンサルタント的省力説明術

読んだ本

小早川 鳳明 著『コンサルタント的省力説明術』

この本を読む目的

喋りでの説明下手の原因と改善アクションを見えやすくするために、関連本をいくつか読んでみようのシリーズ。その3
コンサル業務関連の話が多いのでそういうのは流し読み。

内容メモ

伝える情報が多すぎると本当に重要な情報がぼやける

クローズ質問
 →はい・いいえで答えられる質問
オープン質問
 →自由解答の質問

p.23

……相手から会話がかみ合わないと思われてしまう人は、「相手の思考プロセスを想像して、相手の疑問を埋めていく形で会話を進める」ことが上手に出来ていません。

プレゼン内容を考えるとき、聞き手は何を知りたいのかを把握・想像すること

■結論最初・最後のながれ
・最初
 ①結論
 ②考察
 ③解決策
 ④今後のアクション
・最後
 ①課題背景
 ②考察
 ③解決策
 ④結論

■結論最初・最後のメリデメ
・最初
メリット
 ・伝えたいポイントを明確にできる
 ・説明時間短縮
デメリット
 ・結論説明時(=冒頭)に反論を受けやすい
 ・結論に否定的意見があると先に進めない
・最後
メリット
 ・説明の途中で反論を受けにくい
  →結論に至る過程を聞き手と共有してから結論を言えるから
デメリット
 ・説明時間長くなる
 ・情報量が多く、聞き手が重要ポイントを見失う可能性あり

■結論最初・最後の使い分け
・最初
 日常的にコミュニケーションをとっている相手(=信頼関係のある人)に対して説明するとき
・最後
 経営陣や不特定多数に対して説明するとき

今後どう行動に移すか

割と『ああ、そうだよね。やってるよ』ていう内容が多かったかな。
でも結論から話すか、背景から順に話すか、の使い分け方を知れて本当によかった。すっきりした。
今後のアクションとしては、上長に報告する時は「結論から話す」で、お客さんに話すときは議題によるので使い分ける。

情報を詰め込みすぎないとか、聞き手が何を知りたいかを想像することとか、他の本でも読んだことが書いてあった。
それだけ意外とみんな出来てないけど大事なことなんだな〜て思った。

.
.
.

今回も30分×3回の速読法で読んでみた 。
ビジネス書はこの読み方が一番いいかもしれん。

【読書感想文】1分で話せ

読んだ本

伊藤 羊一 著『1分で話せ』

この本を読む目的

喋りでの説明下手の原因と改善アクションを見えやすくするために、関連本をいくつか読んでみようのシリーズ。その2

あと単純に数年前流行ってたのと会社の推薦図書にあったので。

内容メモ

ピラミッドストラクチャー
結論、根拠、事実(実例)

「結論はこれです。理由は3つで、AとBとCだからです。」 

理由はひとつだと論破される確率高いから基本3つ

結論と根拠は意味がつながっている=ロジカルであること

なんか意味が通じない時は、『ロジックが隠れている』
ので探しましょう

頑張ったことは話すな
結論へのプロセス(≠根拠)の説明は不要

p.75

たくさん話したくなるのは、調べたこと、考えたことを全部伝えたい!、「頑張った!」と思ってほしいという話し手のエゴです。

グサッ

今後どう行動に移すか

  • 打ち合わせのはじめに、まずは1分で全部話す
    そのカンペ作る。1分カンペの中に全て詰まっているから、詳細はその中の文節ごとに区切って話すだけで上手く説明できそうだな。
    でも1分カンペだけで戦うのは↓のやつに慣れてからかな。

  • 話す内容を全て書き出した原稿を作る

    • 注意
      • 読んでわかるレベルで("わかる"かはリトル自分に聞いてみて)
      • 「話の構造パターン」に当てはめる(内容メモで引用したやつ)
    • やっぱこれ最近薄々気づいてたけど最初のステップとして有用なんだな   
    • ライティングは苦ではないのでめんどくさがらずやる
  • 中学生が理解できるレベルの言葉だけ使う
    最近覚えた言葉とかつい使いたくなっちゃうけど抑える。

  • 無駄な言葉は削る
    無駄な枕詞使いがちだな〜〜
    あと必要ないのに前提から話しちゃう節あるから気をつける。
    相手は結論と根拠(とその後のアクションプラン)が聞きたいだけで、私が話したいことを聞きたいわけではない。

.
.
.

今回も30分×3回の速読法で読んでみた。いいかんじ

【読書感想文】ゼロからのプレゼンテーション ―「ものまね」から達人までの全ステップ

読んだ本

三谷 宏治 著『ゼロからのプレゼンテーション ―「ものまね」から達人までの全ステップ』

この本を読む目的

仕事でお客さんに対して喋りで説明する機会が増えてきたんだけど全然上手くできなくて悔しいやら申し訳ないやら。。
改善するために原因分析から始める必要があるんだけど、プレゼンの基本を知っていた方が原因と改善アクションが見えやすくなりそうだ、と思ったから、いくつか読んでみようのシリーズ。

内容メモ

※話し方だけでなくスライドの作り型についてや、達人級になるためのステップも結構書いてあったんだけどそれらは流し読みした。

スライドは、ワンスライド・ワンメッセージ

初歩:トーク原稿を書いて覚える
初級:ポイントだけメモ
中級:スライドの繋ぎの言葉だけメモ

p.44 話の構造パターン

①問題解決型:問題の明確化→原因の特定→解決策の提示
②目標達成型:大目標の確認→小目標への展開→施策の提案
PDCA型:Plan→Do→Check→Act
④重要思考型:ターゲット→ダイジなこと→競合との差
⑤See・Think・Wonder型:観察事実→発見・推論→感想・提起

このうちの3つを使いこなせれば上等らしい。ある程度慣れている型を使った方が楽なので。
状況に応じて「→」の向きを変えたり、順番を変えてもOK。
たとえば、①②は結論から言った方が良い場合は最後を最初に持ってくる、とか。

著者は丸おぼえ作戦を丸2年やってたらしい

読んでもわからないことは、聴いてもわからない
まず読んでわかるレベルの原稿を作る

今後どう行動に移すか

  • 話す内容を全て書き出した原稿を作る

    • 注意
      • 読んでわかるレベルで
      • 「話の構造パターン」に当てはめる(内容メモで引用したやつ)
    • やっぱこれ最近薄々気づいてたけど最初のステップとして有用なんだな   
    • ライティングは苦ではないのでめんどくさがらずやる
  • 原稿丸読みに慣れたら、ポイントを書き出したカンペを頼りにする。それも慣れたら後のステップはその時に考える

  • やっぱりLTやってみた方が良さそうだな。。。最近よく聞くゆるLTから参加してみる

  • 東大卒かつ新卒で戦コン入社できるような著者がプレゼンに悩まされてプレゼン内容丸暗記を2年続けてやっと慣れたらしいので焦らない

    • とはいえ著者は元々つまらない(≒下手な)プレゼンに悩んでいて、
      私が悩んでいる「つまらない以前に伝えたいことがぐちゃぐちゃになる」状態じゃあないんだよな。。。
    • でも成長曲線的にレベル0→1への変化は早そうなのでやるだけやってみようね

.
.
.

実験として、初めから最後までじっくり読むのではなく、30分で全部読むのを3回やる、ていう速読法で読んでみた。

とにかく楽に読めた。そもそもこの本が結構やさしい言葉で書かれていたというのもあるけど。。。
あと、読書メモとしてブログに書くつもりでいて、
最初に「この本を読む目的」を書き出したのと「内容メモ」に適宜メモしたから効率的に自分に必要な情報を吸収できたと思う。
ちょっとこれ続けてみよう。

オブジェクト指向学び直し

software design2021年3月号を読んで

手続き型プログラミングは小さなものをシンプルに記述するときに向き、 オブジェクト指向プログラミングはより大きく複雑なものを分割して記述するときに向く

よくオブジェクト指向は大規模開発で使われる、って言われるけど、 初学者は大規模開発ってなんとなくわかるけどなんでそれを使うと嬉しいのかがちゃんとわからないと思うんだよな。 実際に現場でて、大規模システムに触れると「ああこうしてるから調査しやすいな」とか「なんでこれ密結合してんのよ」とか色々考えられるようになった。 まあ実際に開発してる時にコスト考慮した上で妥協することもあるんだけど・・・ 凡人以下の自分には机上の勉強だけじゃ全然足りなくて、現場で実物に触れてやっとわかるようになったな、って思う。

カプセル化はデータとロジックを1つのクラスにまとめる考え方

「getter/setterを作ってデータを不本意に編集されないようにする」みたいなのがカプセル化です、っていう認識だったからちょっとびっくり。忘れてくださいとまで書いてあって草。でも今なら納得。

StringクラスとLocalDateクラスを例にあげて説明してくれてた。 このクラス設計を真似するといいよ、って。カプセル化の超いい見本がこんな身近にあったとは。

手続き型のクラス設計は、データクラスと処理クラスを分ける方法なんだけど、今のPJこれなんだよな。 でも扱うデータ種類ごとにパッケージ分けてコンポーネントクラス作ってるからこれもこれで理にかなっているのか? システムの数だけ設計が存在する、を心に。

凝集度って他の本でもみたけど、凝集度の高いクラスを作るのはオブジェクト思考の基本。 いろんなデータ型を扱う登録系の処理をまとめるクラス作るより、特定のデータのみを扱うCRUD処理をまとめたクラス作った方がいいよ、ってことだよな。

オブジェクト指向ではイミュータブルな設計が主流。イミュータブルは、不変の意。 オブジェクトを生成した後に、その中身の値は変えないような設計にすると、処理が安定するらしい。 中身の値が変わらないから、意図しない動きしないからバグ減るので。 今のPJ余裕でミュータブルな設計だな。 本では「最近はイミュータブルな設計が主流」って書いてあったから、そりゃそうか。 でもちょいちょいイミュータブルしてる(?)処理みたことあるんだよな。

2021年の目標と今後の展望

まずは。

2020年のふりかえり

簡単にしたい。。。

現場

1~3月は、前の現場で心がダメになってしまって、2月下旬から待機になった。
自社の人の言うことってのもあるけど、リーダーとかメンバーとか雰囲気みたいなのの相性ってあるらしい。
参画初期は良かったんだけど、3ヶ月くらい経っても自分がいろいろできなすぎてギクシャクしてた。し、自分が全てに萎縮してなんかおかしかったと思う。
個人的には、割とどんな人ともうまくうやれる体質だからこれがキツかった。
あと今まで何があってもなんとか乗り越えられてきたから、これが人生初めての挫折だな。
でもそこで学んだことは、今めちゃめちゃ役立っているので前現場の方には大変申し訳ない&怖かった&感謝の気持ちでいっぱい。
待機中は春の研修の途中だった、jsp + Servlet で作ったECサイトをSpringFWにリプレイスするのをやった。
そしてAWSベースでインフラを勉強して、さっきのアプリをAWSのElastic Beanstalk っていう便利デプロイサービスにのせるのをやった。
わからないことたくさんだったけどできた。ちょっと自信がついた。

長くなってしまった。
4月からは、今の現場で要件定義からテスト、リリース後の稼働確認までやらせてもらえている。
要件定義といってもごく一部の作業で、顧客折衝をするわけではなくて要件を実現するための調査とかまとめ資料作るとかなんだよな。
大小様々な案件がパラで走っている現場なので結構楽しいのだ。
なんかかなりいい評価をもらっていて逆にこわいくらい。
まあ他の若手見るとなんか様子おかしい人とかできることが少ないいわゆるIT事務員みたいなのがいるから、相対的にワシが良く見えるんだろうな。

現場以外

  • javaSilverの勉強をはじめた。
    10月くらいからだらだらやっているのだが、まだ正答率半分、、、
    自分なりに根拠持って回答できるんだけど、足りないんだよぁ。

  • Web技術の基本的な本をいくつか読んだ。
    去年よりグッと読みやすくて(理解できるレベルになった)ちょっと感動した。

  • 自分は技術が好きではないかもしれない。
    SEって技術好きじゃないとやっていけないんだろうけど、好きじゃないんだよな、多分。受け入れたくない自分もいるから、まだ「かも」。
    じゃあなんでこの仕事してんの、っていうと「システムで働く人を幸せにしたいから」なのだ。
    綺麗事ぽいけど、仕事始める前も、今もこれは変わらないなぁ。
    あでも仕事自体は普通に楽しくやっている。

2021年の目標

確実にできそうなのだけ。
さっき書いた通り、自分は技術が好きではないかもしれない自覚があるけど、今はまだ足場固めないとだから技術系の目標ばかり。

  • javaSilver取得
    • 3月中までにとる
  • 設計の勉強する
    • 有名な本2つくらい読む
  • GASでなんか作る
    • 全然思いつかないけど

今後の展望(24歳冬)

現場でもっと頼られるようになりたいな。業務知識はダントツで低いけど、調査しまくってるから着実についてきているはず。
今の現場では、商流的に作業しかできない(?)というか教育には関われないので、
次の現場では教育にも関わりたいな。。。
2021年いっぱいは今の現場いれるかな。だとしたら2022年かな。26歳。
あとは前も書いた気がするけど、PGとしてごりごり開発やりたい〜とか思う。(個人開発すればいいとかそういう問題ではなく。)

2020年11月の仕事のこと

すっごく久しぶりになってしまった。

最近グルグル頭の中で回ってるだけのことを言語化して、頭の中をすっきりさせる。

...

今の現場に来て半年以上経った。

前の現場でボロボロだったので何もかも自信がなくなっていた。
でも今の現場は、改善点が無いくらいにすごく良い評価をもらえて、めちゃびっくりした。記念カキコ。イエーイ。

なんでこんなに変わったのだろうって考えたけど

・現場が求めるスキルが低くなった
・自分のスキルが高くなった

んだと思う。

結果ちょうど良く落ち着いているんだなぁ、と。

でも今の現場は保守案件なんだけど、上から下までやらせてもらえているからかなりSE力がついてきていると思う。
SE力というか具体的には、「情報を資料にまとめる力」「根拠をもとに判断や提案をする力」とか。
あと前の現場では全然できなかったんだけど、期限を守れるようになった。
以前の自分がゴミすぎたってのもあるけど、これは本当に成長したと思う。
なんでできるようになったんだろ。
多分、SEとしての頭の基礎ができてきた?
なんか上司の言っていることがわかるんだよねえ。
「これやって」って言われたら、成果物がだいたい浮かぶし、それを作る過程がだいたい見当つくようになった。
これみんな当たり前なのかもしれないけど、自分にとってはかなり成長。

でもまだパッとわかんないことあるし、迷子になりかけることもある。
それでも自力で解決できること増えた。

あーでも業務知識が圧倒的に足りないな。
けど、これはリーダーも言ってたけど慣れなんだよなあ。

.

でもね、今の現場にずっといたら絶対に成長止まる気しかせんのよな。
あんまりコード書けないし、新規の設計とかできないから。
いや、今は今で「既存の仕様を元にベストな選択をして改善をする」っていう貴重な経験ができるので良いんだけど。
無い物ねだりなのかもしれないけど、次の現場は大規模とかのPGをやってみたいんだよなあ。半年で良いから。
とりあえず一つの責務を果たす系のをやってみたい。
ま、その前に勉強中のjava silverを取らないとな。

とか言いつつ最近「エンジニア向いてない…」って思うことも多いんだけど。
とりあえず明日も頑張ろうーーー

jsonデータの取得方法〜asXxxxとxxxxValueのちがい

jsonの値を取得する処理を調べながら書いてたら、asTextとtextValueが混在してて違いが気になったのでメモ。
リファレンスを読みながら、文字列・数値・ブール値を取得&出力するコードで結果を確認していく。

jacksonのバージョンは2.9。
リファレンスはこれ↓
JsonNode (jackson-databind 2.9.0 API)

以下の実験用jsonデータを読み取る

// sample.json
{
    "string": {
        "name": "apple",
        "price": "200",
        "isStock": "true"
    },
    "int": {
        "name": 100,
        "price": 300,
        "isStock": 0
    },
    "boolean": {
        "name": true,
        "price": true,
        "isStock": false
    },
    "null": {
        "name": null,
        "price": null,
        "isStock": null
    }
}

asText()

Method that will return a valid String representation of the container value, if the node is a value node (method isValueNode() returns true), otherwise empty String.

これは「値を参照する場合、コンテナ値の有効な文字列表現を返して、それ以外(=キー)を取得する時は空文字を返す」らしい。
コンテナ値ってなんだろって思ったけど、バシッとくる答え見つからなかった。
javaUtilクラスにある型っていうのかな。よくいう"普通の型"なら文字列に読み替えてくれるぽいな。
nullの時でもぬるぽにならないから、気づかずに画面にnullって表示されて初めて気づくのとか悔しいから気をつけないと。

// asText
String string_name_asText = root.get("string").get("name").asText();  //"apple"
System.out.println(string_name_asText); //apple

String int_name_asText = root.get("int").get("name").asText();    //100
System.out.println(int_name_asText);    //100

String boolean_name_asText = root.get("boolean").get("name").asText();    //true
System.out.println(boolean_name_asText);    //true

String null_name_asText = root.get("null").get("name").asText();  //null
System.out.println(null_name_asText);   //null

//キーを取得する時
String reading_key_asText = root.get("string").asText(); //"string": { "name": "apple", "price": "200", "isStock": "true" }
System.out.println(reading_key_asText); //"" (空文字)

textValue

Method to use for accessing String values. Does NOT do any conversions for non-String value nodes; for non-String values (ones for which isTextual() returns false) null will be returned. For String values, null is never returned (but empty Strings may be)

これは文字列以外が入ってたらnullが返される。
最後の文曰く、nullじゃなくて空文字が返されることもあるのか?これは謎だ。。。
これはキーを取得するとnullが返る。

//textValue
String string_name_textValue = root.get("string").get("name").textValue();    //"apple"
System.out.println(string_name_textValue);  //apple

String int_name_textValue = root.get("int").get("name").textValue();  //100
System.out.println(int_name_textValue); //null

String boolean_name_textValue = root.get("boolean").get("name").textValue();  //true
System.out.println(boolean_name_textValue); //null

String null_name_textValue = root.get("null").get("name").textValue();    //null
System.out.println(null_name_textValue);    //null

//キーを取得する時
String reading_key_textValue = root.get("string").textValue();   //"string": { "name": "apple", "price": "200", "isStock": "true" }
System.out.println(reading_key_textValue);  //null

asInt

Method that will try to convert value of this node to a Java int. Numbers are coerced using default Java rules; booleans convert to 0 (false) and 1 (true), and Strings are parsed using default Java language integer parsing rules. If representation cannot be converted to an int (including structured types like Objects and Arrays), default value of 0 will be returned; no exceptions are thrown.

文字列の値を取得する場合、数値に変換できたらその数を、変換できない時は0を返す。
どうやらブール値は0(false)と1(true)に変換されるらしい。

//asInt
int string_price_asInt = root.get("string").get("price").asInt();    //"200"
System.out.println(string_price_asInt); //200

int string_name_asInt = root.get("string").get("name").asInt();  //"apple"
System.out.println(string_name_asInt);  //0

int int_price_asInt = root.get("int").get("price").asInt();  //100
System.out.println(int_price_asInt);    //100

int boolean_price_asInt = root.get("boolean").get("price").asInt();  //true
System.out.println(boolean_price_asInt);    //1

int null_price_asInt = root.get("null").get("price").asInt();    //null
System.out.println(null_price_asInt);   //0

intValue

Returns integer value for this node, if and only if this node is numeric (isNumber() returns true). For other types returns 0. For floating-point numbers, value is truncated using default Java coercion, similar to how cast from double to int operates.

これは数値でない場合は0を返す。bool値も変換してくれない。
double型の時は、intにキャストする時と同じように切り捨てて返す。

//intValue
int string_price_intValue = root.get("string").get("price").intValue();  //"200"
System.out.println(string_price_intValue);  //0

int int_price_intValue = root.get("int").get("price").intValue();    //300
System.out.println(int_price_intValue); //300

int boolean_price_intValue = root.get("boolean").get("price").intValue();    //true
System.out.println(boolean_price_intValue); //0

int null_price_intValue = root.get("null").get("price").intValue();  //null
System.out.println(null_price_intValue);    //0

asBoolean

Method that will try to convert value of this node to a Java boolean. JSON booleans map naturally; integer numbers other than 0 map to true, and 0 maps to false and Strings 'true' and 'false' map to corresponding values. If representation cannot be converted to a boolean value (including structured types like Objects and Arrays), default value of false will be returned; no exceptions are thrown.

これもasStringやasIntと同じように、trueまたはfalseに変換できるなら型が違くても変換してくれる。
asBooleanでは、
文字列の場合、"true"or"false"なら自動変換でそれ以外の文字列はfalse、数値なら0はfalse、整数はtrueへ自動変換してくれる。

//asBoolean
boolean string_isStock_asBoolean = root.get("string").get("isStock").asBoolean();    //"true"
System.out.println(string_isStock_asBoolean);   //true

boolean int_isStock_asBoolean = root.get("int").get("isStock").asBoolean();  //0
System.out.println(int_isStock_asBoolean);  //false

boolean int_price_asBoolean = root.get("int").get("price").asBoolean();  //300
System.out.println(int_price_asBoolean);    //true

boolean boolean_isStock_asBoolean = root.get("boolean").get("isStock").asBoolean();  //false
System.out.println(boolean_isStock_asBoolean);  //false

boolean null_isStock_asBoolean = root.get("null").get("isStock").asBoolean();    //null
System.out.println(null_isStock_asBoolean); //false

booleanValue

Method to use for accessing JSON boolean values (value literals 'true' and 'false'). For other types, always returns false.

ここまできたら予想通りだが、boolean型以外の値はfalseを返す。

//booleanValue
boolean string_isStock_booleanValue = root.get("string").get("isStock").booleanValue();  //"true"
System.out.println(string_isStock_booleanValue);    //false

boolean int_isStock_booleanValue = root.get("int").get("isStock").booleanValue();    //0
System.out.println(int_isStock_booleanValue);   //false

boolean boolean_isStock_booleanValue = root.get("boolean").get("isStock").booleanValue();    //false
System.out.println(boolean_isStock_booleanValue);   //false

boolean null_isStock_booleanValue = root.get("null").get("isStock").booleanValue();  //null
System.out.println(null_isStock_booleanValue);  //false

おまけ asXxxx(defaultValue)

asXxxx()をオーバーロードするメソッドもある。 これは値がnullの時に、引数に指定したdefaultValueが返る。
これ使えばnullチェックしなくて済むから便利、、、
ちょっとだけ例

//asText(defalutValue)
String string_name_asText_defalut = root.get("string").get("name").asText("secret!");  //"apple"
System.out.println(string_name_asText_defalut); //apple

String null_name_asText_defalut = root.get("null").get("name").asText("secret!");  //null
System.out.println(null_name_asText_defalut);   //secret!

おわりに

シンプルだけどひとつずつ調べると、使い勝手が良くなるようによーく考えてAPI作ってくれてるんだな〜って思った。