ソースコードを読む: @kazuo_reve 新人展開(1) coding(85)

新人プログラマ応援 - みんなで新人を育てよう！
https://qiita.com/official-events/3f21c92121aa125807b4

今、Qiitaでは、「データに関する記事を書こう！」という行事をやっている。
https://qiita.com/official-events/30be12dd14c0aad2c1c2

この文章は、テーマ2『データに関する記事を書こう！』参加記事でもあります。

新人の方によく展開している有益な情報
https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

で参照・引用しているURLを一つづつ確認してみよう。

確認する視点は３つ。

1. 書いた時点と今とで事情が変わっていないか。

2. 書き手と、読み手で見えかたが逆の事象はないか。

3. 真偽の論理的な書きぶりの事項は、統計的もしくは確率的に扱った方がよくないか。

まとめは、時と場合と統計に区分する。
書き手と読み手で見えかたの違いは、場合分けをしていればおきないかもしれない。
自分が属している場合と違う場合も書き込めばいいのだから。

# コードリーディングについて:「ソースコードを読むための技術」
https://i.loveruby.net/ja/misc/readingcode.html

# 1. 時間：対象言語・枠組み(frame work)
2002年から2006年の間に加筆している。
初稿がいつかは未確認。

どの言語を対象にした議論か、どういうフレームワークを使うときの議論かは、未確認。
mainという名前が出てきており、C言語系は対象に入っていると予想できる。

# 2. 立場：
## 2.1 静的解析・動的解析
>基本的に解析は動的解析から始めるのがよい。 静的解析とは、多かれ少なかれ、プログラムの動作を予想することである。 対して動的解析で見るのは事実である。 まず事実を見ておいたほうが方向付けがしやすいし、間違いも減る。 最適化する前にプロファイルを取れ、というのと似ているだろうか。 事件解決はまず現場から、というのでもよい。

事実とは何かという立場の一つを取っている。

別の立場には、ソースコードそのものが事実であるという立場がある。

ソースコードを静的解析することによって、ソースコードそのものの事実を動かす前に変えておくと作業が楽になるという視点がないかもしれない。

ソースコードを動的解析するまでの間に、コンパイルスイッチの選択、リンクまたはロケーションスイッチの選択、ロードスイッチの選択など、さまざまな動的な確認をするための条件の違いがある。これらの条件の違いを検討する前に、静的解析を行うとよいというの別の立場で存在していないだろうか。

コンパイルスイッチも、リンクまたはロケーションスイッチも、ロードスイッチも同一の条件でしか仕事をしない人にとっては、無意味な議論をふっかけられたとしか思わないだろう。

立場が違えば、真逆の方法がよいというのは日常茶飯事だと思っておくといいかも。

## 2.2 読む順番
>まずコードを読む目的を明確に決め、それにだけ 集中するようにする。全てを読まなければいけないときでも、パスを 分けて部分ごとに読む。

まず、どこを読むかを決めるのに、静的解析はとても役立つ。
静的解析の警告の多い箇所もしくは、その静的解析の原因を作っている可能性のある箇所を読み、そこを直すと、いきなり読みやすくなる経験は何度かあった。

CPUに同梱のコンパイラのヘッダファイルが、静的解析をかけずに出荷していた頃のもののままだったりしたときに、よくある事項である。動的解析をする前に、かならず静的解析はかけている。いつも同じCPU、同じコンパイラ、同じリンカ、同じOS、同じローダ、同じスタートアップを使っている人には関係ない話かもしれない。

## 2.3 状態遷移・時系列図
ソースコードから、状態遷移図か時系列図を生成するツールがあればかけるようにしている。

モデルベース開発に向けた ソースコードからの状態遷移モデル抽出技術
https://www.global.toshiba/content/dam/toshiba/migration/corp/techReviewAssets/tech/review/2014/08/69_08pdf/f02.pdf

状態遷移表リバースエンジニアリング抽出ツール RExSTM for Cのオープンソース化　山本椋太
https://www.jasa.or.jp/wp-content/uploads/2020/03/ET_2019_designwg.pdf

あるいは、ソースコードを見ながら、状態遷移図（表）または時系列図を書いて、そこから自動生成してみて、同じ論理になっているか確かめることがあったような気がする。

自動生成の仕組みに、今読んでいるコードを入れるかどうかの判断をするかもしれない。

# 3. 統計的：
## 3.1. フローチャート
>※ 追記2：『Cプログラミング診断室』でも似たようなコメントを発見した。 以下、同書の p.78 より引用する。 「フローチャートは禁止しましょう。フローチャートは、 制御の流れを「もろ」に書けてしまうのでよくありません。 プログラムは、データを処理するためにあり、データの違いによって 制御の流れが変更されます。あくまでも、データが主体です。 変数、引数などのデータをどう定義するかで、プログラムの組みやすさは 大幅に改良されます。データ構造がどうなっているかの図のほうが、 フローチャートよりはるかに役立ちます。データの意味だけは、 しっかり書きましょう。」

フローチャートは、パンチカードに穴をあけてプログラミングしていた時代の技術です。
1970年代。その頃は、パンチカードの順番を入れ替えることで論理を変更することがありました。どう順番を入れ替えるか、フローチャートを使うと、それ以外の方法より効率的であるという統計データがあったらしいです。

時は流れて、2020年代になっても、1970年代に、「プログラムを書いたら、まずフローチャートを書け。」または「プログラムを書く前に、まずフローチャートを書け」と言っていた人たちがいたらしいです。

1980年代になって、パソコンで入力したプログラムをホストコンピュータに送ってコンパイルするようになると、パソコンでフローチャートを自動生成したり、フローチャート以外の方法で論理的な順番の設計ができるようになりました。プログラミング言語も、構造的な記述ができたり、関数単位で処理をまとめたり。にもかかわらず、全体を設計したり、全体を審査する立場の方々が、フローチャートを書けといいつづけたらしいです。

そういう方々の元で仕事をされた方は、たとえば３０年くらいはフローチャートを書き続けたかもしれません。そして、2000年代にそれらの方々が、全体設計したり、全体を審査する場合に、フローチャートがないとわからないとおっしゃることがありました。

その結果、現在でも、フローチャートを書いている会社はあるらしいし、フローチャートを書いている人はいるらしいです。

大事なのは、全体設計したり、審査する方が、フローチャートを書く時間以上の効果を事業全体にもたらしているかどうかです。ソースコードを何で書くかも似ているかもしれません。全体を設計したり、全体の審査をする人が、どの言語で書いてあるとわかるかで、言語を選択するでしょう。英語とか、日本語とか、C言語とか、Pythonとか。それと同じように、設計、審査する人が、フローチャートをわざわざ書いたことに対して、それを上回る効果を出してくださるのなら、それは無駄ではないかもしれません。

統計を取り、確率計算してどうすればいいかを決めればいいことだとわかるでしょうか。

プログラムは間違えずに入力する時代から、プログラムは間違えて覚える時代にいつ変わったか。フローチャートあるなし。
https://qiita.com/kaizen_nagoya/items/a0f6b63714f2c060367b

残念ながら、私はフローチャートを書くのが嫌なので、パソコンのホストコンピュータへの通信エミュレータを自分で移植して、自分の作業はパソコンだけでフローチャートを書かずに済ますようにしていました。

通信エミュレータの移植
https://qiita.com/kaizen_nagoya/items/ce505bbea4229b83e93b

フローチャートを書いたり、読んだりする人の気持ちが全くわかっていません。
外している可能性があると思います。

## 3.2 コールグラフ
>ところで、この文書の以前の版ではコールグラフ視覚化の トピックにこだわりすぎていたように思う。 確かに、コールグラフを視覚化すると時によっては それ一発で動作が理解できるようなこともあるのだが、 必ずしも役立つとは限らない。 コールグラフが効果を発揮するのは、関数の数がそれなりにあり、 しかも関数呼び出しが深いときだ。逆に言うと、そういうときでないと役立たない。

どんな道具でもいつも役立つとは限らない。
どういう場合に、どれくらいの割合で役立ちそうか、目安を述べるといいかもしれない。

個人的な経験では、ある事業に１度はcall graphを書くことは意味がある。
どれくらいの複雑さになっているか、どのあたりがややこしくなっているかを調べた方がいいかどうか、ざっと眺められるかどうか。

C言語で言えば、includeの関係が、複雑になっていて、もっと簡単にして、ファイル数を減らすといいかなって思うことがある。あるいは、ファイルが大きくなりすぎていて、ちょっと分割した方がいいかなって、分割する前の後で、call graphを比較してみるとか。

道具は、その時点の問題を解決するための効率的な方法に役立てればよく、道具を使うことが目的ではないことがわかっていればいい。各種の図でも同じかも。

なんのために書いた状態遷移図か意味わかんないものを見かけたことがあるような気がするとか、しないとか。

## 3.3  社会調査(field work)
社会的な事象では、統計による検証はできないと仮定して考えるとよい。
統計は嘘をつくための道具かもしれないと。 

逆も真：社会人が最初に確かめるとよいこと。
https://qiita.com/kaizen_nagoya/items/39afe4a728a31b903ddc

統計の嘘。仮説（127）
https://qiita.com/kaizen_nagoya/items/63b48ecf258a3471c51b

 社会事象は検証できないかも。仮説（204）
https://qiita.com/kaizen_nagoya/items/6b989b26f7ea2ac342cf

# 4 まとめに代えて(Instead of summarizing)
新人プログラマ応援 - みんなで新人を育てよう！
https://qiita.com/official-events/3f21c92121aa125807b4

今、Qiitaでは、「データに関する記事を書こう！」という行事をやっている。
https://qiita.com/official-events/30be12dd14c0aad2c1c2

この文章は、テーマ2『データに関する記事を書こう！』参加記事でもあります。

いくつかの事項は、データを取ってから追記できればいいかもしれない。
あるいは、お手持ちのデータがありましたらコメントいただけると幸いです。

自分の頭で考えることが大事なのではない。
何か行動すれば、必然的に、自分の頭で考えなくてはならないところに追い込まれる。

自分の頭で考えるようになるには
https://qiita.com/kaizen_nagoya/items/121a5372e3d67fc3af35

「自分の頭で考える」ということ。
https://qiita.com/kaizen_nagoya/items/ebc01b7dc2cdfcc320f6

行動して、測定すればいい。

ぼくの先生「人がやらないことをやれ」プログラマになるまで。仮説（37）
https://qiita.com/kaizen_nagoya/items/53e4bded9fe5f724b3c4

小学校の絵の先生には、色を置いてみるという試行錯誤を教わった。
中学校の技術の先生には、人がやらないことをやれと教わった。
考え方など教わらなくてもいいのだ。
行動すれば、その責任は自分で考えて、よりよくするのが試行錯誤で、人がやらないことをやった人が考えることかも。

DoCAP(Check Action Plan) 芸術でも技術でも運動でも
https://qiita.com/kaizen_nagoya/items/28321da8285a5884c7ca

## 4.1 参考文献(reference)
@kojimadev 1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開
https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da

@torifukukaiou【毎日自動更新】新人プログラマ応援 - みんなで新人を育てよう！（2022年04月） LGTMランキング！
https://qiita.com/torifukukaiou/items/18dad64ba99aa5a40f95

@torifukukaiou 【毎日自動更新】データに関する記事を書こう！ LGTMランキング！
https://qiita.com/torifukukaiou/items/b10fa94764aaaa2c6db1

@kazuo_reve 「新人の方によく展開している有益な情報」の中で大学時代に得ておけばよかった情報
https://qiita.com/kazuo_reve/items/86943d2570c7b90de404

@kazuo_reve 私が集めた有益な情報・知識のまとめ
https://qiita.com/kazuo_reve/items/6554fca14034bcf26123

@kazuo_reve 私にとって有効だった学び方5選
https://qiita.com/kazuo_reve/items/eb507c5ce5ce39155b1c

@kazuo_reve 自分のQiitaの記事を分析してみた
https://qiita.com/kazuo_reve/items/368cb7960a802fdfada9

@kazuo_reve 私が効果を確認した「小川メソッド」
https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da

@e99h2121 育児していたからこそエンジニアのお仕事に役立ったこと10選
https://qiita.com/e99h2121/items/db7e54c111ffcd3c3957

@e99h2121「女性こそエンジニアになるべきだ？」デブサミウーマン登壇記録
https://qiita.com/e99h2121/items/7c69be1b2c2f305f6a4c

@e99h2121 新人さんにすすめる有益なツール達 2022春
https://qiita.com/e99h2121/items/f70db44e7f69901f0141

@e99h2121 新人さんにすすめる有益な技術書達 2022春
https://qiita.com/e99h2121/items/1b243efb1499527f0701

@ohakutsu 新卒1年目のエンジニアがQiitaの速度改善をした話
https://qiita.com/ohakutsu/items/840fae7f31c03521c1af

@ohakutsu 新卒2年目から見た達人プログラマーの振る舞い
https://qiita.com/ohakutsu/items/387ff8d8c09f592f124f

## 4.2 自己参照(self reference)
ソースコードを読むための技術: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（１）
https://qiita.com/kaizen_nagoya/items/e00b87f18842b18f2f60

スペックアウト手法: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（２）
https://qiita.com/kaizen_nagoya/items/09d6f95daa1b5d7bcaf7

変更の影響範囲を特定: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（３）
https://qiita.com/kaizen_nagoya/items/ff52d19e1ad7390c8bd8

質問は恥ではないし役に立つ: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（4）
https://qiita.com/kaizen_nagoya/items/09bad7bb120190fce6c0

質問するときのパターン・ランゲージ: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（5）
https://qiita.com/kaizen_nagoya/items/e25bf54e8a09d922ac7f

「できない人」ほど、人に聞けない: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（６）
https://qiita.com/kaizen_nagoya/items/a7417723b4b58d41614b

分からないをすぐ伝える: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（７）
https://qiita.com/kaizen_nagoya/items/f8cd201629852469c57e

15分ルール: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（８）
https://qiita.com/kaizen_nagoya/items/5fd993fcee6b3cca2fb4

検索の仕方: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（９）
https://qiita.com/kaizen_nagoya/items/479e0d0554946c692464

エラーメッセージの読み方と対処: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（10）
https://qiita.com/kaizen_nagoya/items/ac50a8a8f3cabc881879

Google検索のコツ:　新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（１1）
https://qiita.com/kaizen_nagoya/items/211d8164248de4eec718

新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（12）
https://qiita.com/kaizen_nagoya/items/20fb4e1001e511e67a26

日報、週報、月報、年報: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（１3）
https://qiita.com/kaizen_nagoya/items/51f8676fced4964f9585

新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（１4）
https://qiita.com/kaizen_nagoya/items/53817079e3d2bb881dfd

分報（分単位報告）: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（15）
https://qiita.com/kaizen_nagoya/items/065e8da7b0363a4209d1

分かる: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（16）
https://qiita.com/kaizen_nagoya/items/e7f6a214aa09f6088419

わかったつもり: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（17）
https://qiita.com/kaizen_nagoya/items/c2280762054bd523a0a6

開米瑞浩　図解: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（18）
https://qiita.com/kaizen_nagoya/items/99c46f1a8b41d6656ba0

要求仕様: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（19）
https://qiita.com/kaizen_nagoya/items/a7ee44b8c9e5083acaff

SE用語: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（20）
https://qiita.com/kaizen_nagoya/items/9cbdb6319272d307350e

文章の推敲: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（21）
https://qiita.com/kaizen_nagoya/items/00e428864a2980be0df7

結城浩　数学文章: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（22）
https://qiita.com/kaizen_nagoya/items/da102815ad8a5694540c

結城浩　推敲: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（23）
https://qiita.com/kaizen_nagoya/items/8c4d8c06df54eef6502e

あいまい表現: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（24）
https://qiita.com/kaizen_nagoya/items/ace486d2ad148c532804

やまとことば: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（25）
https://qiita.com/kaizen_nagoya/items/f50da65605e81517f8f1

鍵語による見直し: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（26）
https://qiita.com/kaizen_nagoya/items/caabd6693f0f95a4f0ab

開米瑞浩 MECEとロジックツリー: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（27）
https://qiita.com/kaizen_nagoya/items/bb664d89e068c3f1bc77

芝本秀徳　　考える: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（28)
https://qiita.com/kaizen_nagoya/items/ae2e29d350374f125e33

佐藤航陽 論理: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（29)
https://qiita.com/kaizen_nagoya/items/ce8de87860b724a7fde6

清水吉男 設計: 新人プログラマ応援　@kazuo_reve 新人の方によく展開している有益な情報（30)
https://qiita.com/kaizen_nagoya/items/ba2f86b1cb65d2050594

「@kazuo_reve 新人の方によく展開している有益な情報」はじめ記事を参照して頂いた時にしていること。
https://qiita.com/kaizen_nagoya/items/0e4e92f45c158ef81423

@kazuo_reve「「新人の方によく展開している有益な情報」の中で大学時代に得ておけばよかった情報」に付け加える3つのこと。
https://qiita.com/kaizen_nagoya/items/36bc634d5eb092c5b759

プログラマにも読んでほしい「QC検定にも役立つ！QCべからず集」
https://qiita.com/kaizen_nagoya/items/d8ada7b7fceafe2e5f0e

図を使って分析すればこんなに簡単。安全（１１）
https://qiita.com/kaizen_nagoya/items/6347eb55b2812d745549

５月病にならないで
https://qiita.com/kaizen_nagoya/items/6b9b1f00937cb8b106c9


## 一覧
物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

量子(0) 計算機, 量子力学 
https://qiita.com/kaizen_nagoya/items/1cd954cb0eed92879fd4

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

転職(0)一覧
https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe

仮説（0）一覧（目標100現在40）
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

鉄道（０）鉄道のシステム考察はてっちゃんがてつだってくれる
https://qiita.com/kaizen_nagoya/items/26bda595f341a27901a0

安全（0）安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

プログラマによる、プログラマのための、統計(0)と確率のプログラミングとその後
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

「はじめての」シリーズ　 ベクタージャパン　
https://qiita.com/kaizen_nagoya/items/2e41634f6e21a3cf74eb

AUTOSAR(0)Qiita記事一覧, OSEK(75)
https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
#### 文書履歴(document history)
ver. 0.01 初稿
ver. 0.02 表題変更　主題を前に
ver. 0.03 表題変更　短く 20220410
ver. 0.04 ありがとう追記 20230531
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.