2023年1月22日日曜日

いいコードとはなにか考える

いいコードとはなにか考える

つらつらと思っていることを書き連ねてみます

まとめ

  • シンプルイズベスト
  • コードがいいかわるいかよりもコードを深く理解しているかが重要
  • バグがなければ何でもいいんじゃないか

メンテナンス性について

  • いいコードはメンテナンスのしやすいコードなのか
  • メンテナンスしやすいコードは気軽に変更できる、変更しても影響が小さいなどがあると思う
  • でも結局はコードをしっかり理解しているかどうかな気がする
  • コードを理解していないと気軽に変更も影響範囲もわからないので
  • あとはテスト周りがしっかりしているか、ユニットテストのカバレッジやe2eテストがあるか、CDできる環境があるかも重要
  • 毎回手動でテストするのは辛いし、そうなっているとリファクタリングする気も起きなくなる
  • 今はいいコードだと思って書いても結局1, 2年後見たとときに理解できなかったダメなのでは
  • 何も気にせずファイル1つで全部そこに上から順番に処理するようなスクリプトならどうだろうか

手法について

  • 世の中にはコーディングに関するいろいろな手法や書籍がある
  • いろいろあるがいろいろありすぎて困る
  • 個人的には一番意識するべきは結局シンプルイズベストだと思う
  • いかにシンプルに無駄なことをしていないか=いいコードなのかも
  • コードをシンプルに書くとは簡単に言えば一番上から順番に実行されていくコード
  • いきなりどっかに飛んだり暗黙的なハンドラが呼び出されたりしない
  • あるゴールがあるときにいろいろな書き方があるがその中から最適を選択できるかどうか
  • 選択できるかどうかは経験則だと思う
  • いきなり良いコードは書けないから徐々に良いコードにしていけばいいと思う
  • それをできるかどうかも結局はコードをしっかりと理解しているかが重要だと思う

可読性について

  • いいコードは読みやすいコードなのか
  • メンテナンスしやすいコード=読みやすいコードと言えるのだろうか
  • 結局コードを知るためにはある程度学習しないとダメだとは思う
  • いいコードだと学習時間が短いとは限らない
  • コード把握までの時間を短くするにはドキュメントとトライアンドエラーさせることだと思う
  • いいコードはしっかり抽象化できるている、重複がないというのがよくあるケースだと思うが個人的には抽象化されてすぎていても良くないと思う
  • その心はコードがいろいろなところに分散しすぎていて追いづらいというのがある
  • 可読性を高める最強の要素は「コメント」と「ドキュメント」なのかもしれない
  • チームが日本人なら無理に英語にしないで積極的に日本語を使っていいと思う、コミットメッセージとかIssueとか

バグとの関連について

  • いいコードはバグのないコードなのか
  • 個人的にはこれはイコールではないと思う
  • わるいコードでも全然バグを踏まないコードもあると思っている
  • むしろレガシーコードのほうが安定しているケースもあると思う、いいとは思わないが
  • いいコードにしようと思ってバグを埋め込んではいけない
  • がバグをおそれてリファクタリングしないのもダメだと思う、難しい
  • 結局バグを生み出さないこと品質を担保することが大目的なのであればレガシーコードを運用し続けるのも手だと思う
  • ただ将来の技術的負債になることは間違いない
  • レガシーコードにバグがいきなり発生して誰も直せないパターンとかはあるある
  • レガシーコードを書き換えてモダンコードにするよりかは式年遷宮で全部書き換えるのがいいと思う
  • 当然インタフェースは変えないようにしなければいけないが
  • v2移行などで多少のインタフェース変更が出てしまうことはよくあるのでその場合はドキュメントやコミュニケーションでカバーするしかない

そもそも悪いコードとはなにか

  • 相対する言葉の悪いコードとはなにか
  • アンチパターン的なことなのだろうか
  • 悪いコードを書かないようにすれば自然といいこーどになるのかもしれない
  • そのコードが悪いと客観的に感じることができるかも重要
  • なかなかそれは経験がないと難しいかもしれない

チームビルディングについて

  • いいコードは人によって異なると思っている
  • なのでチームで一つのコードを開発すると個人の思想や経験がコードに反映されてしまうことがある
  • そういうときのために設計思想や開発手法やデザインパターンやフレームワークみたいなものがあるんだと思う
  • がそれでも多少のブレはある
  • 基本はチーム内でコーディング規約などを決める感じにはなる
  • いいコードを書くためにはある程度の経験が必要だと思っている
  • なので経験のある人の思想がチーム内のコーディング規約に大きな影響を与えてしまう可能性がある
  • チームがそれを合意できるのであれば問題ないが押し付けるのはよくないと思う
  • すでに安定しているコードに対してわざわざそれを適用するのかという判断も重要
  • 将来大きな技術的負債になるのであればやるくらいでいいと思う
  • 全員が全員同じレベルのコーダになるのは本当に難しい

テストについて

  • テストもいいコードとして書く必要があるか
  • テストも抽象化やリファクタリングをし続けたほうがいいのか
  • そこまでのコストが割けるか、売上には直結しない
  • プロダクトの品質には影響するかもしれない
  • テストの目的はカバレッジを100%にすることではなく開発者の精神安定
  • テストがしっかり書けている -> 積極的に安心して書き換えできるという意識が重要
  • ただ個人的に思うのはテストはおまけでしかないので面倒だということ
  • その面倒な作業を誰かがやらなければならないということ
  • 分担すればいいというのもあるがそうするとテストコードの書き方がバラバラになりテストの保守性が下がってしまったりする
  • 個人的にはテストコードを書くのは嫌いである

コンテキストによっても違う

  • ちょろっとスクリプトを書くときには
  • Webアプリケーションやスマホアプリのときには
  • 一時的にしか使わない場合
  • 将来的に継続的に使う場合
  • どんなときでもクラスベースなコーディングが必要なのか

番外編: AIにがんばってもらう

  • copilot のような自動生成にがんばってもらう
  • AI が書くほうがいいコードなはず
  • AIではないがコードジェネレータを作成するのもいいと思う

問題: どっちがいいコードなのだろうか

A

puts "hello"

B

require 'logger'

class Message

  @@logger = Logger.new(STDOUT)

  def initialize(title)
    @title = title
  end

  def say()
    @@logger.info @title
  end
end

Message.new("hello").say
  • 用途にもよる?
  • 将来どうメンテナンスしていくか?
  • 経験のあるなしに影響する?

2023年1月14日土曜日

ヴァンパイアサバイバーiOS版プレイメモ

ヴァンパイアサバイバーiOS版プレイメモ

環境

  • iOS 版バンパイアサバイバー 1.2.119
  • 無料

プレイ時間

たぶん 40 時間くらい

操作について

  • 画面を上下左右に動かすことでキャラクターを動かす
  • ストップボタンが右上にあるので押しづらい
  • ランドスケープでもポートレートでもプレイ可能
  • 画面が小さい端末だとステージの最後のラッシュとかは見えないかも

ゲームについて

クリア

  • 一応各ステージクリアはあるがそれよりもレリックや装備開放、仲間開放などがクリア要素は強そう
    • ゲームトップにあるアンロック、コレクション、シークレット一覧を全部アンロックできればクリアでもいいかも
    • シークレットキャラの出現方法は正直攻略サイトを見ないとわからない
    • スマホ版の場合 exdash と toastie と smith iv はシークレットの一覧画面から矢印で呪文入力になるのでそこで呪文を入れて開放する
  • ステージ5とユーダイモニアMにはそれっぽいボスがいる
    • ユーダイモニアMのクリア後に極大聖年が手に入るがコレクションにない場合は一回ステージでレベル上げをして武器として取得すればコレクションに入る
  • 30秒後の最後の悪魔は倒すことができる、倒すとたまご5つと最後に白黒の悪魔が出てきて倒される
    • 倒すとレッドデスというキャラが使えるようになる
  • シグマが強すぎる
    • コレクションコンプリートで使えるようになる

ボスラッシュ難しすぎ

  • 敵の強さはこちらのレベルで変わるのでゲームキラーのアルカナを使うことで敵を弱くして簡単にクリアすることもできる

武器について

序盤はニンニク

ほぼワンパンで倒せるので経験値稼ぎが楽

強いと思った武器

基本進化すれば全部強い
特に序盤から強いと思ったのは

  • 時止めナイフ (進化しなくても鬼強)
  • 鳥 (進化が面倒)
  • 二丁拳銃 (進化が面倒)
  • ナイフ (連射が楽しい)
  • 魔法杖 (学術書が強い)

好きな武器

  • 時止めナイフ

よく使う組み合わせ

序盤、ステージクリア目的

  • キャラ武器
  • 時止めナイフ
  • 魔法杖
  • 雷の指輪
  • 月桂樹
  • ナイフ or 斧 or 炎の杖

終盤、最強セット

  • 勝利の剣
  • ナイフ (子手)
  • 魔法杖 (学術書)
  • 雷の指輪 (複写)
  • 炎の杖 (ほうれんそう)
  • ミススペルの炎 (トローナ)

あと人枠は翼とか骸骨とか

あまり使わない武器

  • 五芒星
  • ドリル

キャラについて

  • 足の速いキャラは強い
    • 序盤だとクロチ
  • シークレットキャラも強い

金策

  • いろいろやり方はあるらしいけどシグマでムーンゴロウをハイパー+反転で適当にやるのが一番楽
  • アルカナで黄金色のディスコを選択する
  • 仮面とか骸骨あたりをいい感じにレベル上げしていく

唯一開放できなかったシークレット

  • 「前に所有されたいた棺桶の下を見る」がどうしてもアンロックすることができなかった
  • 2回目の棺桶がどのステージにも出現しなくてどうしようもなくなった
  • 全キャラを必ず一回プレイするとかコレクションを全部開放するとかキャラ強化を全部行うとかやったけどダメだった
  • 何か他に条件があるのだろうか

敵キャラについて

なぜか 105 番のラスボスだけはユーダイモニアMを2回クリアしないと一覧に載らなかった

最後に

一回 15分 or 30 分のプレイなので複数回プレイするだけであっという間に時間がなくなる