【IT】Linuxを生み出したリーナス・トーバルズが考える「優れたコード」とは何か?

【IT】Linuxを生み出したリーナス・トーバルズが考える「優れたコード」とは何か?
1 :田杉山脈 ★:2020/12/09(水) 22:10:29.77 ID:CAP_USER.net
プログラミングをする上で、コメントをきちんと残したり、わかりやすい変数名をつけたりして「読みやすいコード」を目指す作業は重要です。しかし、「読みやすいコード」と「優れたコード」の間には、時として構造上の大きな違いがあるのも事実。そんな「優れたコード」に対するLinuxの開発者リーナス・トーバルズ氏の考え方について、エンジニアのmkirchner氏が説明しています。

トーバルズ氏は2016年のTEDインタビュー内で「連結リストの実装方法」を例とし、自身の「優れたコード」に対する考えを説明しています。連結リストはデータを線形につなげたリストのことで、データを扱う構造のひとつ。具体的には「4」や「12」といった値そのものと「次の値」を示すポインタで構成される「ボックス」を順番につなげたものが連結リストです。

連結リストをC言語で実装したコードは以下。値そのものである「value」と次の値を示すポインタ「next」で「IntListItem」構造体が作られており、IntListItem構造体からボックスが生成されます。「IntList」構造体はリストの先頭を表す変数「head」を持っています。
https://i.gzn.jp/img/2020/12/08/linked-list-good-taste/020_m.png

この連結リストからあるボックスを消去する処理について、スタンフォード大学の計算機科学講義「Computer Science 101(CS101)」で紹介されていたコードが以下とのこと。
https://i.gzn.jp/img/2020/12/08/linked-list-good-taste/030_m.png

上のコードが行っている処理はこんな感じ。まずはコードの以下の部分で「消去したいボックス」をリストの先頭から探索します。連結リストはリストの先頭からしか値をたどることができないので、まずリスト先頭のボックスのアドレスを「cur」ポインタに格納し、「prev」ポインタはNULLで初期化。curポインタが消去したいボックスのアドレスと一致するまで、curポインタを次のボックスのアドレスへと移しながら照合していきます。
https://i.gzn.jp/img/2020/12/08/linked-list-good-taste/040.png

先ほどの処理のイメージを図で表したものが以下。ちょうどprevポインタとcurポインタがリスト後部のボックスへスライドしていくようなイメージです。
https://i.gzn.jp/img/2020/12/08/linked-list-good-taste/050_m.png
以下ソース
https://gigazine.net/news/20201208-linked-list-good-taste/

3 :名刺は切らしておりまして:2020/12/09(水) 22:24:08.28 ID:eXttlEXM.net
かと言ってメンテ性より効率性に拘りすぎたソースは逆に使いにくい
集団でコーディングする場合は
10 :名刺は切らしておりまして:2020/12/09(水) 23:16:38.33 ID:3IvtsZB0.net
Gコード(´・ω・`)
11 :名刺は切らしておりまして:2020/12/09(水) 23:35:57.63 ID:IA5LH6VM.net
ポインタのポインタ
13 :名刺は切らしておりまして:2020/12/10(木) 00:14:07.38 ID:MLah/xT2.net
リーナスのコードにある変数pは初期値とループ中で異なるコンテキストの変数
をポイントしてて可読性という意味ではベストとは言えない
単純連結リストではなく各ボックスがリスト内での直前のボックスをポイントする
変数 prev を持つようにするとそもそもループ自体が不要になることでより可読性が高く
コードもシンプルになり処理も早い(メモリー負荷が高まるデメリットはある)
古くは4.1BSDに実装されたTCP/IPスタック内で送受信データを保持するプロトコルヘッダー
とペイロードデータの抽象化構造体の連結リストをモデルにした議論があったよ
14 :名刺は切らしておりまして:2020/12/10(木) 00:20:04.45 ID:SCHSpxjk.net
carとcdr
20 :名刺は切らしておりまして:2020/12/10(木) 01:09:03.94 ID:+nAR4sQk.net
>>14
そうで コンス
26 :名刺は切らしておりまして:2020/12/10(木) 01:34:46.27 ID:5E63aR78.net
>>20
Lispだっけ?
16 :名刺は切らしておりまして:2020/12/10(木) 00:45:47.58 ID:/1StOwEX.net
童貞・学歴・免許スレは伸びるのにこういうスレは全然伸びないな
テレビと大差ない
17 :名刺は切らしておりまして:2020/12/10(木) 00:52:43.63 ID:O7Ah3Gqc.net
一見よくわからなかったけど、構造体のアイテムの「次(next)」ということで、
「前(previous)、現在(current)と次」と見てしまうけど、

”見方を変えれば”、

nextのポインタを見ているだけなので、直接ポインタのポインタとして、
ネクストが指す値をテストすればいいってことかなあ。

まーしらんkど

18 :名刺は切らしておりまして:2020/12/10(木) 00:54:23.74 ID:O7Ah3Gqc.net
優れたコードは、複雑な処理と考えガチなものを見方を変えてシンプルにする。

つまり、refactor(因数分解)って感じだねー

まーしらんkど

19 :名刺は切らしておりまして:2020/12/10(木) 01:02:22.22 ID:tGsCzTXv.net
変数名がpじゃなかったら完璧
24 :名刺は切らしておりまして:2020/12/10(木) 01:28:54.63 ID:fwJx6gro.net
NULLぽしてるから優れたコードではない
61 :名刺は切らしておりまして:2020/12/10(木) 14:12:00.40 ID:D7B2xVep.net
>>24

蛾ッ

25 :名刺は切らしておりまして:2020/12/10(木) 01:29:00.92 ID:9kfzNoak.net
「優れた」の基準が明らかじゃないとな
Cとアセンブリ言語でカツカツにチューンしたコードが速いのは間違いないし
高級言語で読みやすいコードが引き継ぎやすいのには変わりないからな
27 :名刺は切らしておりまして:2020/12/10(木) 01:51:37.22 ID:O/kczejv.net
そんなことより、スペースでのインデントとか、コードブロック開始時の
{ をいちいち改行して1行費やす書き方に辟易している。
コードの文字数や行数で金貰っているのが多いのか?
29 :名刺は切らしておりまして:2020/12/10(木) 02:09:02.59 ID:kFAZ8Rs4.net
>27
自分はそれで脱落したけど
頭いい人は逆に分かりやすいのかな…
35 :名刺は切らしておりまして:2020/12/10(木) 07:55:36.64 ID:VdAdyg+r.net
>>27
昔SVGAの15インチモニタに無理矢理50行近く表示して開発してたときは{で一行あいてた方が読みやすかったな
36 :名刺は切らしておりまして:2020/12/10(木) 07:56:01.44 ID:Kwt9bVcq.net
>>27
スペースでのインデントはエディタによって表示が左右されにくいからじゃないかな
読み込む時スペースをタブを変換する機能のエディタ多いし

{毎に改行するのはコピペでコード持ってくる時に段だけ見て片方の括弧忘れてきて
さらに貼り付け先で閉じるの忘れてるのが重なるなりして偶然動いちゃうのを防ぐためにやってる

31 :名刺は切らしておりまして:2020/12/10(木) 06:31:47.63 ID:IVydVJrD.net
2つのポインタを連動させて矛盾なく参照先をずらす処理と、
ポインタのポインタを使った二重の間接参照と、
どっちが「優れている」とも言い難い気がするがのう。

“イディオム”として見慣れているかどうかの問題な気が。
もちろん「どっかから動くコード断片をコピーしてくればいい」とは違う話。

32 :名刺は切らしておりまして:2020/12/10(木) 07:01:51.04 ID:ygZtP0QD.net
天才が使用したコードが優れたコード
ゴミクズコーダーはなに使ってもゴミしか生み出さない
33 :名刺は切らしておりまして:2020/12/10(木) 07:29:14.65 ID:YNcF7Kw8.net
このリーナスのコード間違ってない?
正しくは以下でしょ
while ((*p)->next != target) {
34 :名刺は切らしておりまして:2020/12/10(木) 07:38:39.14 ID:AhpOjTnP.net
結構凡庸な気がするな
38 :名刺は切らしておりまして:2020/12/10(木) 08:13:29.78 ID:QBurfjQl.net
コイツが作ったのはそんな大したもんじゃなかったけどな
「オープン&フリー」という点では画期的だったけど
57 :名刺は切らしておりまして:2020/12/10(木) 12:33:08.73 ID:UT+zooZV.net
>>38
ただのUNIXクローンだからな
プログラマなら一度くらいは作ったことあるだろ
79 :名刺は切らしておりまして:2020/12/11(金) 02:19:41.46 ID:DUCu1g8t.net
>>38
でもgit作って評価を上げたよね
39 :名刺は切らしておりまして:2020/12/10(木) 08:16:28.35 ID:OMROhbHX.net
キュー構造のことか?
41 :名刺は切らしておりまして:2020/12/10(木) 09:07:22.23 ID:1WbcZKRC.net
何が優れてるかは条件や環境でかわるじゃん
ま、メモリや速度とかの制約がないなら、まずは人が見て分かること、これが一番
他に制約があるならその制約に振る、その時に人が見て分かりにくくなるのは仕方ない
あと、コメントはほどほどに
46 :名刺は切らしておりまして:2020/12/10(木) 09:50:37.60 ID:PggGVhVa.net
すんません。素人ですが、書いてある内容gigazineの大半のユーザーがわかるんだろうか?
そういう意味でこの記事は優れた記事ではない。
そして、ここに書いてある内容は何が優れたコードなのかの基準がよくわからないのでなんとも言えない。
個人的にはリーナスの例示のコードは美しい音楽を聞くようで素敵。
基準がないから主観でしか判断できないよね。
47 :大島栄城 :2020/12/10(木) 09:52:57.16 ID:ttQPI329.net
あと、蛇足
マッキントッシュは、むかし俺のせいでもあるけど
白黒にグレイスケールに、色もくそも無いことがあった
48 :名刺は切らしておりまして:2020/12/10(木) 09:55:55.46 ID:PggGVhVa.net
ここ見てるだけでもいろんな優秀度について書かれてるから、まあ勉強になるね。
49 :大島栄城 :2020/12/10(木) 09:59:34.02 ID:ttQPI329.net
ひろゆきもやってたテレビ受信カードは、FreeBSDだけ対応とか嫌味もあった
50 :名刺は切らしておりまして:2020/12/10(木) 10:36:03.01 ID:zguu7azS.net
なるほどふむふむわかったわかった
51 :名刺は切らしておりまして:2020/12/10(木) 10:38:29.61 ID:JejNo8QF.net
AIでプログラムは組めるの?
56 :名刺は切らしておりまして:2020/12/10(木) 12:27:51.84 ID:C9U28Mos.net
小ボケに対して意味不明なresされても困る(´・ω・`)
58 :名刺は切らしておりまして:2020/12/10(木) 12:45:56.34 ID:60bG552F.net
ポインタのポインタとか使わなきゃいけない時点で糞
このようなコードを書いていい気になってるのは古いプログラマ
C言語は時代遅れだ
60 :名刺は切らしておりまして:2020/12/10(木) 14:01:23.34 ID:ll6WXikA.net
>>58
**とかは使いたけりゃ使えばいいじゃん
閉じ込めずにあちこちに書かなきゃいいだけ
59 :名刺は切らしておりまして:2020/12/10(木) 13:55:14.82 ID:q2+zL1Gi.net
リーナスさん、LinuxにAIを組み込まないのですか?
63 :名刺は切らしておりまして:2020/12/10(木) 14:33:26.70 ID:4BTWYfMR.net
いい加減
良いコードにリファクタリングしてくれるAIエンジンをーー!
66 :名刺は切らしておりまして:2020/12/10(木) 18:41:56.97 ID:iWCKGdvR.net
Cの教科書に普通に載ってる話だと思ったけど
67 :名刺は切らしておりまして:2020/12/10(木) 19:48:53.33 ID:M6pDwKgc.net
List,Tree,Graph
このあたりはデータ構造の基本中の基本
68 :名刺は切らしておりまして:2020/12/10(木) 22:14:30.28 ID:f/5L6xvS.net
このスレの伸びなさ加減がまるで優れていない。
69 :名刺は切らしておりまして:2020/12/10(木) 22:55:56.89 ID:rVJ/ONiJ.net
さすがにリーナス相手にマウント取ったら恥かくのに気付く
程度の知能はあるらしい
73 :名刺は切らしておりまして:2020/12/11(金) 00:28:21.26 ID:9kLsbMU5.net
リーナスには直接は関係ないけどCentOS8勘弁してくれよ
74 :名刺は切らしておりまして:2020/12/11(金) 00:42:23.61 ID:8Q5Tw9FU.net
いくら効率のいいコードを書いたつもりでも、
アセンブルソースを出すと、なんじゃこのムダな処理は、という世界じゃないのか?

引用元:http://anago.2ch.sc/test/read.cgi/bizplus/1607519429