はてなキーワード: YAGNIとは
[前回](https://anond.hatelabo.jp/20211221045059)
全員が経営陣と友達ということもあって、大学の仲が良い研究室とかサークルみたいなノリ
会社のwebページにはベタだけど、肩を組んで笑っている写真が載っていた
資金調達も上手くいっているようで、当時としては結構良い額の給料を貰えた
CEOはプロダクトも無いのに講演会とか取材に応じていて、界隈では少しだけ話題になっていたような気がする
自分には凄いキラキラして見えて「この会社はきっと有名になる!」って何の根拠もなく思ってたw
資金調達は順調に行えたが、プロダクト開発は順調とは言えない状態だった
まず仕様が決まらない(そもそもコンセプトからして無いのだから当たり前だがw)
そのくせ、CTOはやたら可用性や表示速度を気にしているようだった
自分はRailsとPHPのスキルしかないため、herokuとか、EC2に立てて様子を見ようと提案したが、
議題は目標が無いまま細かいシステム構成だったりフレームワークの選定に終始した
続き
こんなことは、コンピュータサイエンスのあらゆる観点から明確に答えが出ている。つまり、車輪の再発明だし、YAGNIの原則にも反する。
オレオレフレームワークのメリットとして挙げられる「フレームワーク自体のトラブルに遭遇したときに、独自フレームワークなら対処しやすい」というのは完全な嘘。
まず、そのトラブルの発生頻度が圧倒的に異なる。特定の会社の数人にしかチェックを受けていないオレオレフレームワークと、世界中の開発者によってテストやフィードバックがされている有名フレームワークとでは、バグの発生率も情報の量も雲泥の差。
そもそも、「オレオレフレームワークだからトラブルに対処しやすい」のは、作った奴だけであって、その他のチームメンバーにとってはただのバグだらけの使いにくいフレームワークでしかない。
センスの無い奴の問題は、知識がないことではなく、頭がおかしいことなんだ。
これは後天的に直せない。そして、センスのないプログラマは他人に迷惑をかける。だから、センスのない奴はプログラマになってはいけない。
こんなのは誰でも書ける。身長(m)と体重(kg)を受け取って、(体重)÷(身長*身長)を計算して出力するだけだ。
GUI等をつけたとしても、総コード行数10数行で実装できるだろう。
ところが、センスのないやつは全く違うことを考える。
彼らの一部は、BMIを計算するプログラムを作るのに、なぜかユーザー登録画面を作ろうとする。
そして、身長と体重のほかに、年齢や性別などの様々なパラメータを管理できるようにし、それらのパラメータを日ごと、あるいは週ごと、あるいは月ごとに入力できるようにし、指定期間での推移をグラフで表示するシステムを作り出す。
ユーザーごとに管理するパラメータの種類は増減するため、BMIを計算する場合、「身長と体重はどのフィールドに格納されているか」というような間接的な情報が必要になり、それを記載した設定ファイル等を読み取る別のプログラムを作り出す。
BMI以外の様々な指標を計算させるために、設定ファイルに書ける独自のDSLのようなものを作り、パラメータ同士の加減乗除や、指定した期間の移動平均などを計算できるようにする。
データ定義にもとことん拘る。単位を何にするかとか、グラフで表示したときに何色にするかとか、軸に単位を表示するかとか、スケールからはみ出したときにどう表示するか等のありとあらゆる情報を各パラメータに対して定義できるよう設計する。
こうして出来上がった巨大なシステムは、身長Hと体重Wを入力すると、W/H*Hの結果を表示するためだけに使われる。
既に述べたように、ここで問題なのは、彼がYAGNI(You Ain't Gonna Need It.)という原則を知らないことではない。
「普通の開発者ならあえてそんなことはしない」ということを自然に行ってしまうこと。これが本質的な問題なのだ。
ちなみに、センスのない奴の頭のおかしさというのは、本当に常軌を逸している。だから、読者がすっと腑に落ちるような例を挙げることは極めて難しい。
たとえば、「数学ができない生徒がいる」という現象を説明するためには、「計算問題は解けるが、文章問題は解けない」というような類型を示すことができる。しかし、「センスのないプログラマ」は、常人の世界観を超越しているので、そういうシンプルな例示や説明ができない。上に書いたたとえ話ですら、実在する彼らに比べれば、まだマシなのである。
新卒入社した会社の研修で、新卒だけで議論をしてプレゼンをするという課題が出た。
なぜか今年は高学歴が集まっていて、東大京大をはじめ筑波など、マーチという動物園卒の自分では中々お目にかかれない学歴を眺めることができた。
3. 非常に楽観的な目標を立てる
1. リソース突っ込みたがるに関しては、新卒に求められている成果に対して、膨大な時間をかける。
他にもタスクを受け持っていて、数あるタスクの一つであり、うまくやったところで給料も上がらないし、会社の利益にもならない課題に対して、10時間以上時間外労働をしている。(そして、それを僕にも強要させようとしてくる)
最小限のリソースで求められる最低限の成果を出すことを良しとする僕には、全く理解できない話だ。
なぜそこまで時間をかけるのか聞いたところ、課題に対して上司に批判されるのが嫌だったり、最高の成果を出したいそうだ。
僕なんかは、批判されたら、その後に考えて修正した方が効率がいいと思うのだ。YAGNI
3.そんで、時間をかけて出てきた答えは、実現不可能なほど、希望的観測に満ちたものだった。
彼らの高い能力を持ってすればうまくやれるのか、それとも単に成功体験を積めば高い目標も達成できるのか。凡人には謎である。
2. 成功体験しか積んでこなかったので、失敗することはありえない。(能力的にも)
3. 一流企業じゃないウチに入るのは、そもそもハズレ
過去に出会った東大や京大の人はもっと有能(コストに対してリターンが大きい)だったので、3である可能性が高そうなんだけど、一流大卒の多いはてなーの皆さんはどう思う?
非っ常によく分かる。自分も何年も何年も同じような思考ルートでハマっていたし、今も油断するとハマし、ある部分ではまだハマってるところがあるかもしれない。
この現象については、技術書の積み本している初心者への指針について書いた内容が結構参考になると思う。http://note.chiebukuro.yahoo.co.jp/detail/n156280
「今自分とり得ることが可能な手段を使って、ボロボロでもいいので、最低限の目的(ソフトの振る舞い)を達成するにはどうすればいいか?」を考えることだ。
一番有名で情報が豊富そうな開発環境をデフォルト設定のままで使い目的を達成するために近いコードの前例をネットで散々探して、近いコードが記載されてれば有り難くコピペコードする。
もし目的がとあるライブラリを使って関数1つでできるって情報を得たならば、そこで初めてライブラリの取り入れ方を調べる。分厚い入門書1冊をあらかじめ写経しておく必要はない。あとで目次から「ライブラリの使い方」が辿れれば十分だ。
他のものが必要になったら、その都度必要な道具を追加するし、ついに開発環境の設定を弄る必要が出てくる時があるかもしれない。でもそれはその時だ。今ではない。
どうしても分からないことがあれば、散々馬鹿にしていたyahoo知恵袋に恥を忍んで質問を投げる場面があるかもしれない。女子小学生を装って有名プログラマーに@を投げてみろ。最速で返事が来るはずだ。
トップレベルのソフトウェア開発者ならレイピア+10が最強だと常識のように知ってるけど、こっちはそもそも手持ちのクラブしか存在を知らないし、持ってないが、まぁ小さな冒険はできるはずだ。
こういう必要になったらその時やろうって態度はソフト開発だどYAGNI原則って奴らしい。世界のみんなも悩んでるんだよ。心強いわ。 https://ja.wikipedia.org/wiki/YAGNI
「目的の達成」それだけが最も大事な約束で、他はすべて余計なフレーバーだ。
エレガントなコード書き方や最新のテクニック、ベストな開発環境、新しい言語の利用などは全て目的達成するためのただの道具だ。初手から天才の振る舞いに惑わされてはいけない。
コピペコードのオンパレード、冗長でミスの発生しやすい古い表現方法、今では話題にもされない開発方式・言語。自分が知っている小さな手段。
今の装備で目的が達成できる見通しがあるならまずはそれでいこう。見通しでわからない部分・足りない部分に気づけば、そこを明るくする方法を探すことをまずは一歩目にしよう。
ボロボロの状態で目的が達成できたそのあと、じっくりとエレガントにすればいい。そして納得の行く仕上がりになったら、さも最初からエレガントだったように振る舞う(重要)
古い増田だが、事務方の人がエロサイト作ったケースが初心者の振る舞いの参考になるかもしれん。http://anond.hatelabo.jp/20101203150748
そして最短距離の測り方・とり得ることが可能な手段が技術力が上がるに連れて変わってくると思う。ソウルレベルが上がってくると、天才の振る舞いが最短距離に対しての合理だと気づく部分がある。
最先端のツールを使えば、人的ミスを減らし、使用するリソースを最小限に抑え、変更しやすく、また問題の特定も早い。それら全てに伴い、なによりやる気が削がれにくくなる!なんと素晴らしい。
Gitのおかげで破壊的な変更も気楽に試せるし、新規プロジェクトフォルダ(7)が何だったか思い出す作業から開放された!(※)
とにかく初手から最新の道具が必要かどうかと言われると恐らく必須ではないし、むしろ単に学習コストの支払いが上積みされて、目的達成への道を遠ざけるだけだろう。
そして支払いの負債が積み上がって行くにつれ、諦める率が上昇していくことを恐れないといけない。そしてついには諦めて亡者化する。
諦めに取り憑かれないためには自分が走り抜けられる最短距離を常に気にしないといけないし、実は回り道して当初気にかけていた天才が紹介してたツールを使いこなすことが結果的に距離を短くする方法だったかもしれない。
回り道するか否か、このバランスの取り方は常に難しいし、自分も未だに失敗することが多い。これどうしたらいいんですかねえ。
まぁ締まらない終わり方ですが、元増田の良き冒険が始まることを期待しています。
so the world might be mended...
※個人でやる分にはGitはソース管理が煩雑で開発効率が落ちてきたなと思ったら入れてもいいし、もちろん入れなくても良いと思う。(でも個人的には入れたほうが良いと言いたい。が、これにも惑わされるな。自分で絶対に必要かを判断しないと亡者化が近づく