2020-06-14

「こいつプログラミングセンス無いな」と思う奴の特徴

頼むからセンスのない奴はプログラマにならないでくれ。迷惑から

不要ものを作りたがる

これが最もプログラマになってはいけないタイプ犯罪行為などの言うまでもないことを除けば)。

たとえば

等。

組織で開発する上で、こういう人がいるメリットは無い。

不要ものを作ることで、プログラムは複雑になり、メンテナンスの手間は増え、バグは発生しやすくなる。

一定レベル以上のプログラマが最も自然だと同意するような実装(「実装しない」という選択肢もふくめて)をパッと思い付けない奴は、センスが足りていない。

将棋で言えば、駒がぶつかったら先ず取る手を考えるといった基本的な手筋が思い浮かばないようなもので、現実的に使い物にならない。

基本的コードなんて書かないに越したことはない。

これは、「Code Complete」「The Pragmatic Programmer」等の著名なプログラミングの本に共通する結論である

DRY原則を守らない

すべての知識は、システム内において単一の、曖昧さのない、そして信頼できる表現を有していなければならない。

これが「The Pragmatic Programmer」にあるDRY原則である

要するに、すべての情報単一ソースから決定されるべきということだ。情報が二重化すると、それらの間で不整合が生じバグの原因になる。また、二重化した情報は、修正の手間が二倍になる。

たとえば、ユーザープロフィール管理するレコードクラスに「生年月日」と「年齢」を同時に保持する必要はない。年齢は生年月日から計算できるからだ。

世の中には、「xxxFlag」みたいな不要変数を作ったり、共通ロジック抽出せずにコピペコード濫造するダメプログラマーが多すぎる。

もちろん、合理的理由があって、この原則適用されない場合もある。

たとえば、多くの言語組み込み配列文字列は、その要素と長さを二重に管理している。配列の長さは要素を数え上げることで求まるが、それには要素数に比例した計算時間がかかるためだ。

ただし、こういう場合でも、公開されたメソッドによる操作では、必ず内部の変数は同期されるように作ることが可能である。それをしないのは、怠慢でしかない。

変数命名が雑

文字変数とか連番とかは論外だが、「ary」とか「setData()」みたいな何の情報も伝えないような変数名・関数名を付けるやつ。

正直、コードの読みやすさなんて6〜7割くらいは変数名の付け方で決まると思っている。

名著「The Art of Readable Code」も、半分以上が変数名の付け方に関連する内容だ。

なぜ変数名が曖昧になるのかと言えば、怠慢を除けば理由は2つある。

1つは、コードを書いた奴自身が、そのコード機能を明確に言語化できないということ。

もう1つは、1つの関数で多くのことをやりすぎたりしていて、その変数役割曖昧になっているということ。

スコープを広げたがる

変数関数を参照できる範囲のことをスコープという。

たとえば、関数の内部で宣言した変数は、多くの言語では関数の外からは参照できない。

スコープは狭い方が良い。これはほとんど全ての状況に適用できるプログラミング大原則だ。

スコープが広いということは、ソースコードの多くの場所からその情報を参照・変更できることを意味する。

たとえば、クラスのメンバ変数は各々のインスタンス内でしか参照できないが、静的な変数はすべてのインスタンス共通に持つ。このため、静的な変数を変更すると、すべてのインスタンスに影響を及ぼし、影響範囲の把握やテストが困難になる。

スコープを広げるか狭めるか、2つの選択肢があったとして、広げる方に心が傾く奴は、プログラマをやめた方がいい。

結果的メンテナンス困難なコードを生むというのも勿論だが、単に書くだけでも、スコープが広い方が書きづらいのだ。つまり必要もないのにわざわざ変数スコープを広げようとする奴は頭のおかしい奴しかいないということになる。

コードが長い

複雑なメトリクスなどを持ち出すまでもなく、たとえば1メソッドの行数が何百行もあるとか、1クラスのメンバ変数が何十個もあるとか言うの。

これは論外であるプログラマとしての能力云々以前に、明らかな怠慢であり、社会人としての常識が疑われる。

定期的にメンテナンスされ続けているOSSソースコードなどを見ると、関数メソッド)の行数は平均して5〜10行。20行を超えるものは稀である

長いものであっても、外部で定義した関数を順番に呼び出しているだけであったり、リクエストハンドリングして各々の処理に振り分けているだけのようなものほとんどである

それを超えているコードは、合理的理由があってそうなっていることよりは、単に悪い設計であることの方が多い。

結論

これらは実はプログラミング云々というより、内容の理解力国語力の問題なのである

ある情報を得るために必要十分な情報は何かが分かってないから、余計な変数を作ったり、無駄変数スコープを広げたりする。

そして、自分が作るものを正確に理解していないから、適切な名前がつけられないし、適切なモジュール分割ができない。

それがすべての原因。

こういう人がまず身につけるべきは、プログラミングテクニックではなく、日本語を正しく読む力。

低学歴が「プログラミングなら自分でもできるかも」なんて思っちゃいけないってこと。もちろん、下請けSIerとかで使い捨てコード書きとして働くことはできるが、上に書いたような最低限の力がないなら、それ以上を望んではいけない。

ちなみに、上に書いていることと反対のことを思っている人も世の中にはいる。

特に、昔からプログラミングをしてきた自称ベテランに多い。その人は、能力があるというよりも、単に現代の開発に際して必要知識がないだけなので、真に受けないように。

また、大学コンピュータサイエンスの基礎を学びたての学生なども、知識をひけらかしたくて上と反対のことを言う傾向がある。その程度のことは、良識のあるプログラマはみんな分かっているのだが。

  • うんち

  • プログラミングができない人は、プログラミングの能力が低いのではなく、言語能力等の基礎学力の低さがプログラミングで露呈しただけ。

    • プログラムができない場合、     そいつは金持ちか   Java屋か   モーニング娘だ

    • というか全部そうだよね。 数学ができない以前に、問題文で説明されている状況が理解できないとか、何を求めるのかが分からないとか。

    • 上で書いてるような「センスが無いやつ」が「プログラミングができない」とは限らないと俺は思うやで 不要なコード書きまくって、コピペしまくって、雑な命名で、グローバル変数使...

      • なぜ?Javascriptでも不正改ざん対策で難読化はする。読みにくいはソースの特性であって、欠陥ではない。 それにお前にとっては読みにくいんだろうなというのがプログラマーの考え方。...

        • お前の精神を壊したプロジェクトはもう終わってるんだ

        • わかりやすく言うと。ストリートで売ってる銀細工の指輪に ここは銀じゃなくて金のほうが良くない?てt いやまぁできるだろうけど。、、なんつったらいいんだろうな。俺たちの業界...

    • ていうかプログラミング自体は何も難しいものじゃないからな

  • 延々こんな〇〇はプログラマ失格!って記事書いてるね

  • スコープが広いとそれだけGC発生してパフォーマンス落とすけどどうなの?

  • この間のJSONのやつより大分まともだ もし、同じ人が書いてるなら、俺の見る目が無いことになるが

  • あとで読む📚

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん