https://yakst.com/ja/tags
Yakst - quora
2018-09-28T09:19:01+09:00
Yakst
https://yakst.com/ja/posts/5296
2018-09-28T09:19:01+09:00
2018-09-28T09:19:01+09:00
「20年以上プログラミングしてきた人しか知らないこととは?」に対するJohn Byrd氏の回答
<p>ソフトウェア開発におけるあらゆることは、既に発明されてしまっています。人々は、それを再発見し、あたかも初めて見つけたかのようなフリをしているだけです。あなたがかっこよくて新しいと思ったものはすべて、Smalltalk、HAKMEM(訳注 : MIT AI研究所で書かれた、アルゴリズムや理論などが書かれたメモ。<a href="https://en.wikipedia.org/wiki/HAKMEM">Wikipedia英語版</a>)、Ivan Sutherland(訳注 : <a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%83%90%E3%83%B3%E3%83%BB%E3%82%B5%E3%82%B6%E3%83%A9%E3%83%B3%E3%83%89">Wikipedia日本語版</a>)、Douglas Engelbart(訳注 : <a href="https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%B0%E3%83%A9%E3%82%B9%E3%83%BB%E3%82%A8%E3%83%B3%E3%82%B2%E3%83%AB%E3%83%90%E3%83%BC%E3%83%88">Wikipedia日本語版</a>)、初期のIBM、あるいはBell Labsからのコピーでしかありません。</p>
<p>コンパイラーを信じてはいけません。ツールを信じてはいけません。ドキュメントを信じてはいけません。自分のことも信じてはいけません。</p>
<p>もうこれ以上コンピュータ言語はいりません。しかし、あなたはすぐに新しい言語を作ってしまうでしょう。予想するに、その新しいすごい言語は、IEEE-754の規格(訳注 : <a href="https://ja.wikipedia.org/wiki/IEEE_754">Wikipedia日本語版</a>)と、固定長の整数を使うはずです。つまり、あなたの新しい言語は壊れてます。</p>
<p>コードをメンテナンスするのは、コードを書くより大変です。たくさんコードを書くことはつまり、怠けていることを意味します。</p>
<p>あなた方は皆、メモリー、プロセッサー時間、ネットワークの帯域といったものはすべて無料で、無限にある前提でプログラミングを教わってきたでしょう。そんなことはありません。そんなことはありません。そんなことあるわけないんです。Knuthのpremature optimizationに関する段落(訳注 : Donald Knuthによる有名な格言「早すぎる最適化は諸悪の根源(premature optimization is the root of all evil)」が書かれた<a href="https://dl.acm.org/citation.cfm?id=361612">論文</a>の該当する段落のこと)の残りの部分を読みましょう。</p>
<p>数ヶ月したら、自分が書いたコードが何をするものかも忘れてしまうでしょう。バカみたいに読みやすくしておきましょう。</p>
<p>必要なのはsedのワンライナーだけということだってあります。</p>
<p>「自分のメソッドはお前のよりも常にいいんだ」といったように決めつけで話すプログラマーは警戒しましょう。プログラミングはアートであって、宗教ではありません。</p>
<p>決まった手順を10回以上やることが分かっているなら、自動化しましょう。</p>
<p>バックアップとリストアはまったく別のことです。</p>
<p>自分のマシン上で動いたからといって、バグがないことにはなりません。 --<a href="https://www.quora.com/profile/Piers-Sutton">Piers Sutton</a></p>
<p>開発ツールをはインストールする前に、最初のマイナーリリースまで様子を見ましょう。誰か他の人に実験台になってもらいましょう。</p>
<p>良いプログラマーは良いコードを書きます。素晴らしいプログラマーはコードを書きません。<a href="https://teespring.com/stores/the-zen-programmer">禅プログラマーはコードを削除します。</a></p>
<p>何人の管理職が騒ぎ立てていようと、最初にやることは確実にバグを再現することです。</p>
<p>遅かれ早かれ、長らく業界にいる年寄りに出会うでしょう。いつかその人は「プログラミングの法則」について教えてくるはずです。そういう人は完全に無視しましょう。</p>
doublemarket
https://yakst.com/ja/posts/4005
2016-06-16T09:36:33+09:00
2017-06-18T21:02:18+09:00
LinuxとBitKeeperとGitの関係
<p>「<a href="https://www.quora.com/What-are-some-well-written-accounts-of-the-Linux-Bitkeeper-Git-story">LinuxとBitKeeperとGitの関連について書かれたいい記事ってありますか?</a>」という質問への<a href="https://www.quora.com/profile/Oscar-Bonilla">Oscar Bonilla</a>氏の回答</p>
<hr>
<p>いい記事は見た事ないけど、どういうことがあったのか簡単に書いてみます。</p>
<p>90年台後半のLinuxプロジェクトは、問題を抱えていました。非常に多くの開発者が関係している一方で、彼らがハッピーになるようないいシステムは存在していませんでした。LinusはCVSについて調査しましたが、最悪という判断を下し、結局tarballと<code>diff</code>、<code>patch</code>を使っていました。これは彼の取り巻きたちの間ではうまくいきませんでした。なぜなら、多数の開発者から送られてくるパッチをLinusが適用できるような巨大パッチに統合して、コンフリクトを見つけて、そして修正すべきところを開発者に送り返す必要があったからです。巨大パッチを分解して、何が問題でどのパッチが問題なのかを見つけ、他の巨大パッチと一緒にしてもう一度送るという作業。言うまでもなくこれは非常に時間がかかりましたし、Linuxのソースベースは常に更新されていくので、繰り返しやる必要があったわけです。</p>
<p>その頃、Larry McVoyがSun Microsystemsで、(条件付きながら)分散モデルを扱うシステムであるTeamWareに携わっていました。彼は自宅にLinusを連れてきて、何を作っているのか見せました。Linusは、もし彼がそれを作ったら使うよと言ったのです。</p>
<p>さて、Larryはもうそのうちのひとつを作ってしまっていて、SCMのエキスパートが誰かも知っていました。彼はBitKeeperを開発する会社(BitMoverという社名)を始め、どうにか成果物を書きました。Linusはそれを使い始め、カーネルサブシステムのメンテナーの多くが抱えていた痛みを和らげてくれました。しかし、そこには別の問題もありました。</p>
<p>ある程度知られている話ですが、BitKeeperはLarryが色々な人にハックしてもらおうと思ったことから、少々変わった「オープンソース」プロジェクトとして始まりました。オリジナルのBitKeeperはオープンソース開発者にはフリー(無料の意味)で提供されましたが、ひとつ注意事項がありました。それは、ChangeSetsのコメントは全てopenlogging.org(訳注 : リンク切れ)というパブリックなサーバー上に公開されてしまうというものです。この仕組みによって、プライバシーに価値を置く商業的企業は、コメントの公開を避けるためにライセンスを買えたのです。オリジナルのBitKeeperは、ライセンスを買わずに商用利用するためにopenlogging関係のコードを削除しないことという制限付きでソースが添付されていました。言うまでもなく、BitKeeperへの最初のコミットはopenlogging関連コードを削除するというものだったので、Larryはソースの添付をやめてしまったのです。</p>
<p>これは、Linuxコミュニティーのフリーソフトウェアの支持者たちに問題を引き起こしました。オープンソース活動の申し子のようなとてもパブリックなソフトウェアを開発するのに、技術的に優れてはいるけれどフリーソフトウェアではない製品を使っていたわけです。Linusは、Linuxカーネルの開発にBitKeeperを使うのに文句があるなら、もっといい代わりのものを出してこいと何度も言いましたが、誰もそうはしませんでした。</p>
<p>ここで、tridgeとして知られるAndrew Tridgellが登場します。Tridgeはrsync(1)の作者として、あるいはMicrosoft SMBプロトコルをリバースエンジニアリングしてSambaを作った人として評価されていました。2005年に彼はBitKeeperのフリーソフトウェアクローンを作るために、BitKeeperをリバースエンジニアリングし始めました。これは、BitMoverとBitKeeperをLinux上で使っている商用顧客の間に問題を引き起こしました。これについては<a href="http://oscarbonilla.com/2005/04/why-a-free-bitkeeper-clone-was-a-bad-idea-which-time-had-come/">しばらく前に記事として書いた</a>ので、ここでは詳しくは書かないでおきます。</p>
<p>ここでひとつ言っておきたいのは、Tridgeが世の中には特に何もしていなそうな雰囲気を出しておきながら(オーストラリアでカンファレンスがあり、そこで彼はBitKeeperのTCPポートにtelnetしてhelpと打つのしかしてないと言っていた)、その時彼はBitKeeperをエミュレートするコード群(<a href="http://sourceforge.net/projects/sourcepuller">SourceForgeで今も見られます</a>)を既に書いていたということです。</p>
<p>とにかく、2005年には、どうすべきかたくさんの議論が交わされました。BitMoverはフリーライセンスの削除とBitKeeperのメタデータの暗号化を迫り、フリーソフトウェアの支持者たちは彼らの自由を制限するのにBitKeeperが何を考えているのか気づき始め、Linusは彼には政治的あるいは宗教的な話にしか見えないことに時間が費やされているのを見ていつもイライラしていました。メーリングリストを検索すれば、Linusの見解が見えるはずです。Tridgeに関して、彼は「我々が使えるようなもっといいもの(あるいは同等のもの)をお前たちは作っていない。お前たちは要するに正当な理由なしにBitMoverとの関係を壊している」という立場でした。</p>
<p>LinusとLarryは電話で長い時間話し、BitKeeperはLinuxプロジェクトにはもうぴったりとは言えないと結論付けました。決別の時でした。Linusは代わりを探すのに何日も費やしましたが、彼の要求を満たすものは見つかりませんでした。よさそうなプロジェクト(あるいはLinusの言葉で低脳(訳注 : 原文ではretarded)でないもの)も、Linuxカーネルのような規模のプロジェクトにはスケールしなかったのです。そして、BitKeeperは<strong>高速</strong>でした。Linuxはパフォーマンスについて妥協したくなかったのです。結局、彼は自分で作ることにしました。カーネル開発の観点から開発したのです。そしてGitが生まれました。私の知っているLinuxとBitKeeperとGitの話はこんなところです。</p>
doublemarket
https://yakst.com/ja/posts/39
2013-08-30T10:59:00+09:00
2013-08-30T12:48:25+09:00
プロセスとスレッドの違いとは?
<p>「プロセスは実行中のプログラムを抽象化したものである」これは私が著書 "Linux Kernel Development" の中で使った比喩だ。バイナリイメージ、仮想メモリ、各種カーネルリソース、関連付けられたセキュリティコンテキストといったものだ。スレッドは、「プロセスの中の実行単位」で、仮想プロセッサやスタック、プログラムの状態だ。言い換えれば、プロセスは実行されるバイナリであり、スレッドはOSのプロセススケジューラがスケジューリングできる最小の実行単位であると言える。</p>
<p>プロセスは1つ以上のスレッドを持っている。シングルスレッドのプロセスでは、1つのプロセスは1つのスレッドしか持っていない。つまり、スレッドはプロセスであると言ってしまえる。実行されるのは何か1つのことだけだ。マルチスレッドのプロセスでは、プロセスは複数のスレッドを持っている。つまり、複数の何かが実行されている。</p>
<p>現代のOSにおける、主な仮想化された抽象化層といえば、仮想メモリと仮想プロセッサだ。どちらも、実行中のプロセスが、マシンのリソースを独り占めしているように見せかける仕組みを提供している。仮想メモリは、プロセスに対して、物理メモリあるいはディスク上のストレージ(スワップ領域)に対してシームレスに、一意なメモリ空間を割り当てる。仮想プロセッサは、実際には複数のプロセスが複数のプロセッサ上でマルチタスクをこなしているにもかかわらず、プロセスがそのシステム上で1つしか動いていないかのように振る舞わせることができる。</p>
<p>仮想メモリは、プロセスに対して関連づいているもので、スレッドに対してではない。そのため、スレッドは同じメモリアドレス空間を共有することになる。逆に言うと、仮想プロセッサは各スレッドに関連づいている。それぞれのスレッドは独立してスケジュールできる要素だ。</p>
<p>それで、何がポイントだろうか? プロセスは明らかに必要なものだ。しかし、なぜスレッドという別のコンセプトが現われ、マルチスレッドのプロセスというのが使えるようになったのか? これは、マルチスレッドの基本的な4つの利点があるからだ。</p>
<ul>
<li><p><strong>プログラミングの抽象化</strong> タスクを分けて、それぞれを実行単位(つまりスレッド)に割り当てるのは、多くの問題において自然なアプローチだ。このアプローチを活用したプログラミングパターンには、reactorやthread-per-connection、thread poolパターンがある。一方でスレッドをアンチパターンだという人もいる。比類なきプログラマ、アラン・コックスは「スレッドはステートマシンを理解できない人のためのものだ」と言っている。</p></li>
<li><p><strong>並列性</strong> プロセッサを複数持つマシンでは、スレッドは <em>真の並列性</em> を実現するための効率的な方法である。各スレッドは自分の仮想プロセッサを持ち、独立してスケジューリング可能な要素であるため、複数のスレッドは同時に複数のプロセッサ上で実行することができ、システムのスループットを上げることが可能になる。スレッドが並列性の実現のために使われているという意味においては、スレッドはプロセッサ数よりも少ない数が実行されているということになる。ここでは、先の「スレッドはステートマシンを理解できない人のためのもの」というのは適用されない。</p></li>
<li><p><strong>I/Oのブロッキング</strong> スレッドなしでは、I/Oのブロッキングによってプロセス全体が止まってしまう。これは、スループットとレイテンシの両方にとって有害だ。マルチスレッドなプロセスでは、それぞれのスレッドがブロックされ、I/O待ちになっても、一方では他のスレッドが処理を先に進める。非同期・ノンブロッキングI/Oは、この問題に対するスレッドに変わる解決法の1つだ。</p></li>
<li><p><strong>メモリの節約</strong> スレッドは、メモリを共有する効率的な方法を提供する一方で、複数の実行単位を最適化する。この意味では、マルチプロセスの代わりであるといえる。</p></li>
</ul>
<p>これらの利点によるコストは、ミューテックスや状態変数のような仕組みを通して同時実行を管理する必要があるという形で複雑性が増すことだ。マルチコアプロセッサやマルチプロセッサのマシンが一般的になる傾向が進むとすると、スレッドはシステムプログラミングに置いてより重要なツールになっていくだろう。</p>
doublemarket
https://yakst.com/ja/posts/8
2013-07-14T06:16:00+09:00
2013-08-28T08:57:58+09:00
5歳の娘が銀河の女王になることに興味を示しているのですが、銀河征服のためにどんなプログラミング言語や技術を教えたらよいでしょうか?
<p><strong>Mark Harrison氏の回答</strong></p>
<p>注意深くやる気と動機づけについて考える必要があるんじゃないかと思う。</p>
<p>2児の親として、娘の成長を十分に支援してあげたい、そして楽観主義にとらわれないよう注意させ、
やりがいのあるゴールを設定することを学ばせる手助けをしたいというあなたの気持ちがよく分かる。</p>
<p>しかし、銀河統一の歴史において、両親の面倒を見るということに関してあまりよいことがない点に注意すべきだ。
父殺し・母殺しの習慣は少なくともローマ皇帝の時代にさかのぼる。
古代文書に「父母を敬え」とあるのは、大きな問題の芽を早めに摘み取るよう努力することを表しているようだ。</p>
<p>従って、あなたがするべきは、強力なコンセプトを持ち、銀河の支配のための実績を築く説得力のある議論に裏打ちされている一方で、
最終的にその試みを阻止する致命的な欠陥を持っているプログラミング言語を見つけることだと確信している。</p>
<p>そんなわけで、Ruby on Railsをおススメする。</p>
doublemarket