mhattaによる
2007年12月19日 11時00分の掲載
人生相談部門より。
人生相談部門より。
pinbou 曰く、
本家/.の記事より。ある悩めるプログラマからの問いのようだ。
私は自分のコードの品質のせいで、ひどく恥ずかしい思いをしています。私の書くコードはバギーで、遅くて、脆弱で、保守するのも一苦労です。同じような思いをしている方はいませんか? もしあなたもそうなら、何があなたの潜在能力の開花を阻んでいるのでしょうか? もっと大事なこととして、こうした状況を打破するために何かやろうとしていますか?
私は若いころからプログラミングを楽しんでいて(Apple IIe上のBASICで覚えました)、いろいろな言語やプラットフォームを使い、大小様々な企業で働いてきました。悲しいことに私のキャリアで一定していたのは、私が割り当てられるプロジェクトは、プロジェクトの開始からお客さんの資金が無くなるまで、あてどなく漂流してしまうということです。ここ/.に集う開発者で、自分の企業を説得して「カウボーイ風コーディング」を止めさせるか縮小させるかし、ベストプラクティスを導入させるのに成功した人はいませんか? 誰か自分の上司に、お客がいつも正しいわけではないこと、たまにはノーと言うのが一番のこともあるんだよと説得できた人はいませんか?
この議論は賞味期限が過ぎたので、保存されている。
新たにコメントを書くことはできない。
主張に矛盾がある (スコア:5, 参考になる)
なのに
というのは何か間違っている。
この人の場合、2つの異なる障害があって、それが複合的にプロジェクトの息の根を止めていると思われる。会社を直すのはより時間が掛かるので、まずは自分を治すことからはじめるべきだろう。
プログラムが『バギーで、遅くて、脆弱で、保守するのも一苦労』な状態になるのは、
・熟慮されたアルゴリズムを用いず(バギー、遅い)
・計算量を事前に予測せず(遅い)
・例外が多く(バギー、脆弱、保守が大変)
・目の前の問題を直せばよい、と修正を最小化使用としすぎるから(保守が大変、脆弱)
である事が多い。これを直すのは一筋縄ではいかないが、
1) まずはアルゴリズムの勉強をする
2) 特に「計算量」の勉強をする
3) アルゴリズムの勉強には「マクロ」レベルからビット操作などの「ミクロ」レベルまであるが、その全てを勉強する事で「例外」を減らす
4) 常に「問題の本質」について考え続ける(症状消しをしない)
5) socket プログラミング、multi thread など、マニュアルを見ただけでは判らない事が続発する領域に関しては、本を読みまくる。他人のコードは「本を読んだ後」の方が良い。腐ったコードの方が世の中には多いので、間違ったコードを覚えてしまう確率が異様に高いからだ。
6) コンパイラ…特にオプティマイザについて勉強する。すると、最近のコンパイラは「わかりやすい記述」をしたほうが最適化が進むことがわかる。すると、「半端に凝った記述」をしなくなる(保守性向上)
というプログラミングの勉強と、
7) コードを書く前に、そのコードが何をするものなのか、文章で書いてみる。で、その通りに本番コードとは異なるプログラミング言語で書いてみる。すると曖昧な部分が判るので、文章を直す。それから本番コードを書く。するとなぜかバグが減る(曖昧な部分が減るため)
8) 明文を書く練習をする
という、実はプログラミング以外でも鍛えられる属性を鍛える訓練を続ける。
結局、知識が圧倒的に不足し、その知識を全てロードしようとすると脳がパンクする所に問題があるのだ。脳の容量を拡張し、マニュアルを見れば判るような知識は捨て、もっと本質的なことを覚えると良い。
二言で言い換えると、「努力不足」「プログラミングを舐めるな」になるんだと思う。
fjの教祖様
Re:大半の問題はこの一点だろ (スコア:2, 興味深い)
うーん、これはどうなんだろう。私はあまり気にしない。
これが可能になるためには、プログラムを「フレームワーク(骨組み)」と「肉付け」に分離する、といったことを意識してコーディングする必要がある。
しかし、ちょろっと書く程度のプログラムで、これらを意識するのは、それ自体重たい作業。エクストリームなどでこれを最初から意識するのは辛かろうし、そもそも「ちょちょいと書いてみる」という方針には合わない。
なので、そんなことは意識せずに書き、『ゴッソリと捨てる』事を勧める。
大事なのは『ゴッソリと捨てる』前に、「なぜ捨てる必要があったのか」「何が悪いのか」をきちんと記録すること(文章の形で)。他の人に見せる必要は無く、「意識するべきポイント」をはっきりさせるために、これをやっておくと良い。
# 大抵の場合、全部捨てて書き直すことになるけれど。
あと、「書き直す」時には「使えるフレームワークが世の中にはすでに無いか」調べること。書き直すのだから、フレームワークにどういう機能があると良いか、イメージはできているはず。それを探してみる。見つかる可能性はあまり高くないけれど、見つかった場合は「世のほかの人達とバグを共有できる」のでbug fix が楽になる。
大丈夫。全部捨てることになるに決まってるから (^o^)。
# 商用ソフトの場合書いた行数より削った行数の方が多い気がする…。
# 三項演算子を if/else に直す等、書く場合は行数が増えているはずなのに…
fjの教祖様
親コメント
Re:大半の問題はこの一点だろ (スコア:2, すばらしい洞察)
この前、レビューを頼まれたソースコードはひどかったですね。読んでいて「このコードを書いた人は、この関数がどのように動作すると正しい動作と言えるのか、厳密なイメージが描けていないな」ということが、ありありとわかるのです。おそらく、仮組みしたコードを動かしてみながら、例外的なパターンを後から発見し、アドホックに完成に近付けていったものに違いないのです。
僕自身は探索的プログラミングの信奉者で、コーディング前に綿密な設計が必要だとはあまり思わないのだけれど、こういう事例を見てしまうと「コーディングにはその前提となる設計が必要だ」ということをもっと強調した方が良いのかも知れないと思ってしまいます(もちろん探索的プログラミングは、コーディングを通じて「より良い設計」を追求するのであり、設計が不要だという主張はまったく持っていないのですが)。
やはり、ソフトウェア開発における「生産」はコンパイルであり、コーディングは「設計」なのだということをもっと多くの人が知るべきなのでしょうね。プログラマーは誰でも設計者になる意識を持たないとダメですよ。
親コメント
自戒してくれるならまだマシ (スコア:5, すばらしい洞察)
こう思ってくれる人なら、今は悪くてもそのうち良くなるよね。
自戒しない人は、何度指摘しても、次から次へとゴミを増産してくれる。
よくあること (スコア:5, おもしろおかしい)
しかもコメントとかつけてないんです。全裸です。
昨日飲んだ所までは覚えているんですけど・・・
Re:よくあること (スコア:5, おもしろおかしい)
二度と使わないつもりだったんですけど
結局、関係はずるずると続いてしまって…
まったく個人的な付き合いのつもりが
いつの間にか同僚や上司にバレてしまい、
「責任取れよ」と清書まで求められる始末です
親コメント
目を覆いたい (スコア:3, 興味深い)
お客さんとのやり取りであったのは、自分が仕切るときは徹底的にやります。間に1社入ったときは「いわれたことだけ」に切り替えます。
とても安く買い叩かれていたサーバ構築の案件だったんですが、単純・費用を安く・止まらない(=ありえないでしょう)構成を求めてきたので、散々うだつのあがらない会話をして、
「これ管理するとしたら、月いくらで管理しますか?」ときたので、
「管理しません!」
とはっきり断りました。地雷は埋まっているかもしれないから怖い。地雷が埋まっているとわかっている道は、歩かない。
ちょっとプログラミングからは話がそれましたが、内容的にも金額的にも納得しない仕事は、作業量・品質もスルーして「やりっぱなし」にしたほうがいいとおもいますよ。PHPを安く受けている連中の話聞くと、担当者がもういなくなった、当時のやっつけ仕事(=品質管理なんかあるわけが無い)が、近々大更新(PHP4->5もあるし)するようです。人材確保できてんのかなぁ。
-- gonta --
"May Macintosh be with you"
プログラマじゃなくても (スコア:3, 興味深い)
私も自分で設計した物や作った物を、後から見て恥ずかしくなることは良くあります。
自分で設計して図面も引いた案件で、実際竣工して現場を見てみたら、自分の浅はかさに気がついた・・・とか
運用してみたら現場の保全要員からだめだし食らった・・・とか
法律や卓上、技術的には問題なくても、設備全体(運営や保全も含めて)として優秀かどうかというとそうではないですからね。
まぁ、自分で恥ずかしいと思えるってことは、改善の必要があることに気がついてるんだから気が付かないよりはましですね。
技術屋は日々勉強して、自分のスキルを磨くのも仕事(それとも趣味か?)のうちでしょう。
いつかはどこに出しても恥ずかしくないものを作ってみたい物ですけどね。
好きなだけ予算使わせてくれれば・・・って野暮な突っ込みは無しにしてください(笑)
限られた予算で最良の物に仕上げるのも技量のうちでしょうから
何層離れているか (スコア:2, すばらしい洞察)
クライアントの真のニーズを引き出し、期間・コスト上の現実的な解を示しつつ、
クライアントと共により良い解を模索し、認識を一致させる事は可能です。
中間に営業担当等が一人入る辺りまでは、
自身のコミュニケーション能力・マネジメント能力のみで何とか...。
間に一社、複数の担当者が入ると、もう運の要素が多くなりますよね。
二社以上入った日にゃ
「言われた通りにやればいい」的な意味で
責任意識が薄れるので、逆の意味で平気(をい)
品質に問題あるコードの共通点って何だろう? (スコア:2, 興味深い)
全ての兆候は、小さなTYPOや意味不明なコメント。
首をかしげるのは、統一されていないネーミングや実装方針。
確信を得るのは、他人が読めなくなるような妙なテクニックの乱用や、名称と内容の不一致。
結論は、構造からして全てが論理的に正しくない。
しかも、そういう人に限って「こんなに色々な言語使えます」=構文しってても構造化すらできない
「ループの数減らして速度あげました」=無関係な処理をひとつにまとめるなボケ
「デザインパターン適用しました、シングルトンです」=どう見てもグローバル変数
と小手先の技や見ためばかり学ぼうとしてコケている気が。努力の方向性が間違っているのでは?
# 誇り?昨日書いた自分のコードには不満があります。成長してますから:-P
Re:品質に問題あるコードの共通点って何だろう? (スコア:2, おもしろおかしい)
## コードは非の打ちどころがないけど仕様を満たしていない、なんてケースもありますし。
昨日書いた自分のコードが読めないのですが、これは進化なのでしょうか、退化なのでしょうか。
親コメント
そんなあなたに応援歌 Oliverたんが歌います (スコア:3, おもしろおかしい)
「君はコーディングができる」
若い日はみな デスマで疲れ
書いたソース 自分もわからないよ
夢でデバッグしよう
とても 追いきれないよ
納期よりもっと 大事なことは
バグを出して 自分を試すことだ
君はコードが書ける
誰もコードが書ける
RFP 燃やせばそれで
心も体もさわやかだ 僕らは
若い日はみな 徹夜で逝けよ
( ゚д゚ )
こっちみるなw 白目を向いて逝くなw
それがデバッグなんだ
それがデバッグなんだ
泣ける日もある そんな時には
バグだろうが 仕様と突き放せよ
君が仕様をだした
僕も仕様をだした
この胸が今 すがすがしいよ
きのうよりも
ソースが大きくなった
これでエンバグ増えた
これでエンバグ増えた
体脂肪 増えるにつれて
心も体もやさぐれた
二次元に 萌えればそれで
心も体もさわやかだ
僕たちは
親コメント
このあらいを作ったのは誰だぁっ!! (スコア:2, おもしろおかしい)
親コメント
通信販売?(オフトピ-1 (スコア:2, おもしろおかしい)
そんなあなたに、怪しげな商品を紹介する記事かと思ったのは内緒です。
------------
惑星ケイロンまであと何マイル?
銀の弾丸はないらしいので (スコア:2, すばらしい洞察)
- 正確な伝達ができない者をあいだに挟まない。
- 裏づける判断力もないのに空約束する者をあいだにはさまない。
- 受注だけでは成果にせず、納入までを責任範囲とする。
# 次どうぞ。
Re:銀の弾丸はないらしいので (スコア:2)
それだと成長しないので、能力をやや上回るくらいのことをさせるのが良いと思います。もちろんバッファは用意しておいた方がいい。
その場限りの(プロジェクト|人)ならそれでもいいけど。
親コメント
重箱の隅には穴があいている (スコア:2, 興味深い)
その特殊だったはずの例が将来「不具合だ!」って騒がれることに。
ある意味、死亡フラグ?
Re:重箱の隅には穴があいている (スコア:2, すばらしい洞察)
正常系だけ書けばいいなら楽なものです……。
-- Where your reading book is, there will your heart be also 天戸 司郎 (Silo Amato)
親コメント
問題の履き違い? (スコア:2, 興味深い)
というのは、システム設計上の問題に関係する部分だと思うんだけどなぁ。
コードにいちいち文句をいうお客に対して困っているのであれば、私の巨大な勘違いですが、とりあえずシステム設計に対しての問題点であると仮定してみる。
本人が一番気にしている筈の部分は、文頭の
>私は自分のコードの品質のせいで、ひどく恥ずかしい思いをしています。
って部分。
そんな悪い品質のコードを書いちゃう原因ってのは、そもそも物事の考え方に問題があるからじゃあないかと思う。
原文を読んでいるわけではないので、誤訳やニュアンスの違いがある可能性もあるのだけれど、
その辺一切は棚に上げておきます。
良い品質のコードを書くには、
・求められている役割(仕様)を正しく理解する
・仕様に足りないもの(穴となるであろう部分)を見つけ出す
・必要以上に複雑にせず、見やすいコードを書くように努める
そして、
・コードが仕様通りに機能し、不具合が発生しないことを検証する
なんてことは/.でわざわざ言う話じゃないか。
(むしろ元ネタを離れてツっこまれそうで・・・)
トピ趣旨からは外れますが、ありがちだけどなかなかできない事に、
「金に見合う仕事をする」
ってのがあると思うんですよ。
夢を見すぎた仕様だけど、お金はこんだけー な感じで、
それをスタート時に夢から覚めぬまま始めちゃうと、
途中でお金無くなって、全てが中途半端なままになっちゃうと。
自分のコードの方針は (スコア:2, 参考になる)
単純にするために、アルゴリズムを目で追えるように要点だけをまとめたものを上位におくようにしています。
無駄を無くするために、不必要な変数をなくしたり、意味の無い処理を削ったりします。
重複を無くするために、同じ処理を複数箇所に書かないこと、同じ条件は一箇所にまとめることを心がけてます。
自分の過去のコードの反省と、メンテ要員の質が悪すぎでとんでもないことになってたソースを眺めた経験からこうするようにしました。
心がけなんで、実際のコードはまだまだ直すべきところが多いんですが。
行動しないというのもひとつの行動 (スコア:1, 参考になる)
PCの前に座らず、
ソースを書かないでいる時間を増やすこと、ですかね。
助さんが刀を抜くのは、番組後半。
コードの品質とは何か (スコア:1)
メモリ容量がなかった時代は簡潔で短いコードが良しとされました。
今はメンテナンスが容易なコードでしょうか。
時代と共に品質の示すものも変わるでしょう。
自分のコードももちろんだけど (オフトピ) (スコア:1)
-supercalifragilisticexpialidocious-
コード品質についてだけ言えば (スコア:1, 興味深い)
持っていません!! (_) (スコア:1)
誇りを持たないことが誇りです。
誇ってしまうと成長が止まってしまいがちになるからです。
...って、啓発系のお話ではないようですねw
このシナリオに出くわしたことがないですね。
上司はお客さんについてある程度正しく認知しているパターンが多く、とりあえず自分と同じ理由で悩んでいることが多いです。
お客さんを説得する前に 'システム開発がわかっていない' 上司を説得しなくてはいけないということですね。
普段からコミュニケーションをとって聞く耳を持ってもらった上で、根気良くわかってくれるまで説明するしかないでしょうね。(専門用語抜きで)
難しいことは理解しようと思えない人が多いですから、聞く耳を持たせるのは重要です。
聞く耳を持たせるために仲良くなるのも結構重要です。でも正直なところ臨機応変でしょうね。
C# と VB.NET の入門サイト [wankuma.com]
顧客からの変更や途中の注文が多いみたいだけど (スコア:1)
技術的には「昨日のコードはクソ」だなぁ...。自分のコードを誇っていられるのはそれを吐いてる時だけだよ。
「誇り」だけでは足りない (スコア:1)
自分が手がけた仕事の成果に誇りと「責任」を持つ必要がある。
この二つは不可分。
「誇り」だけでは独善的になり、まともな仕事は来なくなる。
「責任」だけでは便利屋と見なされ、こき使われて潰される。
態度は偉そうだけど成果はヤリ逃げ&責任転嫁、な連中に
さんざん煮え湯を飲まされた挙句の、
さしあたっての結論。
----------宙辺 或人
格言 (スコア:1)
「他人の仕事は自分でしない」
コメントから作る (スコア:1)
自分の作るプログラムは、アルゴリズム・デバッグだけ自分でやり、それを実用化のために修正するのは他人ですから、分かり易く、直し易くないと始まらない。
コメント (文章) から書くと、機能分割も言葉で表現し易くなり、「コメントで分かる」以上の効果があります。(当然、説明とプログラムが食い違うなどありえない)
かなり、特殊なプログラミング状況だけどね。(プログラムじゃなく、アルゴリズムを作ってる)
Re:ほえ? (スコア:3, 興味深い)
どうせ届かない「ノー」なら、言うだけ労力の無駄と悟った結果であった。
とか?
親コメント
Re:プログラマの適性 (スコア:1, 興味深い)
オレが若い頃いっしょに仕事してた同僚は、いつまでたっても(3〜4年くらいしか
付き合いなかったけど)スパゲッティ状のコードばっかり生産してたなー。
でもね、彼のデスクの上とか引出しの中などは、ビシーっとキレイに整理整頓
されてるの。オレはどっちかというと乱雑に放りっぱなしだったが。
書くコードの内容(読みやすさ)は正反対、みたいな。
親コメント