私が、開発に無駄に時間をかけすぎている問題

こんにちは。masugiです。

先日、先輩方の案件を手伝う、という形でとあるソフトウェアの機能の一部の実装に携わりました。その際、たった十数行のコードから成る処理を書くのに7時間もかかってしまいました。そして、私に案件の手伝いを依頼した先輩から、処理を書くのに時間がかかりすぎている、と言う指摘を受けました。

その処理を実装するためのサンプルコードを別の先輩が作ってくださっていたのですが、それを参考にせず、処理を実装する方法を一から自力で調べていました。
実装にかかった時間(7時間)のうち、大部分を処理を実装する方法の調査に充てていたので、予め先輩が用意して下さったサンプルコードを参考にしながら実装を進めていたら、実装に7時間もかけることにはなりませんでした。

今回の実装では、必要なメソッドや類似コードがすでにソフトウェア内の別のコードの中に書かれており、先輩方はそのメソッドやコードが書かれている場所・メソッドの使い方を知っているので、実装に使えそうなメソッドや参考となりそうなコードを自分で探すよりも、知っている人に聞いた方が早かったです。(使えそうなメソッドやコードを知っている人が周りにいない、という状況では自分で調べる必要がありますが)

私は人に聞く前にまずは自分で調べてみる、という習慣があるのですが、開発の現場では開発効率が重要なので、メソッドの使い方やコードの使い方について不明点があったら、そのメソッドやコードを書いた人に聞くことを積極的に行おうと思いました。

QRコードの読み込み

今行っている案件で、QRコードの読み込みを実装しています。

QRコードの読み込みにはZXing.Netを使用しましたが、画像の明るさやQRのサイズによって結構読めない場合がありました。
普通にZXing.Netを使用すると以下の結果になり、6個中3個しか読めていないです。見た目にはかなり綺麗にQRコードが撮影できているのですが。

単純に、前処理に大津の2値化を行うだけでもだいぶ精度が良くなりますが、今回はもっと高精度な前処理+ロジックを行うようにしました。詳細は秘密。
結果、全てのQRコードが読めるようになりました。

ワクチン3回目の副反応

こんにちはmtjです。

ワクチン3回目を打ちましたが 自分の想定以上の副反応でした。
約3日は熱が出ていたのですが 熱は38度超えており体はかなりしんどいという合せ技でした。

スポーツ飲料、鎮痛剤は買ったほうがいいという助言が身にしみました。

これから打ちに行くという方は是非簡単に食べれる物 スポーツ飲料 鎮痛剤は用意したほうがいいかと思います
想像以上に動けませんでした。

Linqによるソート:OrderByとThenBy

先日、あるクラスのソートのためにICompareble<T>を実装したラッパークラスを作成したのですが、
コードレビューの際にLinqのOrderByを使用すれば良いとの指摘を受けました。

以下のようなクラスとそのリスト、値の演算メソッドがあった際に、

class Hoge {
	public int No { get; set; }
	public int Value { get; set; }
}
var hogeList = new List<Hoge>(){ /* 要素たくさん */ };
int CalcHeavyForSort(int value) {
	var ret = 0;
	// 重い演算
	return ret;
}

次のように書くことで、

hogeList = hogeList.OrderBy(x => CalcHeavy(x.Value)).ThenBy(x => x.No).ToList();

1. Valueの演算結果により昇順でソート
2. 1によるソートの順序内でNoにより昇順でソート
を実行してソートされたリストを取得できます。

降順ならOrderByDescending, ThenByByDescendingです。
特殊な比較を行いたい場合は、IComparerを引数に与えることもできるようです。

引数で与えたラムダ式の実行も1要素1回だけのようですので安心ですね。
(内部でラムダ式の戻り値のリストを作成し、
インデックス同士を比較するメソッド内でその戻り値リストへアクセスしているようです。)

雑ですが、もしも次のようにソート時に同じ重い演算を複数回実行する必要がある場合は、

hogeList = hogeList.GroupBy(x => CalcHeavy(x.Value))
		.ThenBy(x => CalcHeavy(x.Value) * x.No).ToList();

次のように匿名クラスでラッパーを作り、それをソートすると良さそうに思います。

hogeList = hogeList.Select(x => new {
		Source = x,
		CalcedValue = CalcHeavy(x.Value),
	})
	.OrderBy(x => x.CalcedValue)
	.ThenBy(x => x.CalcedValue % x.Source.No)
	.ToList(x => x.Source);

Linqは便利で可読性が高く保守もしやすいので、
シビアなパフォーマンスが求められるケースでなければ積極的に使っていきたいです。

眼精疲労

こんにちは。masugiです。
私の最近の休日の過ごし方を振り返ってみると、四六時中Youtubeの視聴、ネットサーフィン、twitterの徘徊のいずれかをしている気がします。
このような目を酷使するような休日の過ごし方によって、眼精疲労による頭痛がおこり、それが休日明けの業務まで続くことがありました。
私は休日はパソコンを長時間操作する習慣があり、長い時には1日中パソコンに向かっているのですが、
休日明けに頭痛に悩まされながら業務を行うはめにならないために、
(可能ならば)長時間にわたるパソコンの使用を控える、パソコンを長時間使用するときは定期的に休憩をとる、適切な姿勢でパソコンを使用するなど、
眼精疲労を予防することを心がけようと思います。

string型プロパティの複数行入力

TextBoxコントロールのTextプロパティなどはプロパティウィンドウで複数行入力が可能です。
以下の画面のように右端の下矢印ボタンクリックで複数行用の入力ウィンドウがポップアップします。

今回、これと同じ挙動を自作のプロパティで行いたく、調べた結果、以下のように属性指定すると複数行入力が行えることがわかりました。


        [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))]
        public string Text {
            get => _Text;
            set {
                ...
            }
        }

PGに数学が必要か否か

こんにちは mtjです。

自分の親にプログラムは誰でもできると話したら数学ができないと難しいと返されたので表題に書いてある通りの事を考えました
個人的には数学は必要なとこは必要だけど、基本必要無いと思います。

計算を作ってコードを作る部分はありますが、基本はそこまで高度な計算は考えません。
大体出来合いのライブラリ側が計算はやってくれます
もちろん動作を理解する上ではできることに越したことはありませんが、数学が苦手だからプログラムを諦めているような人は一度プログラムを触ってみることをおすすめします。

自分は商業科、専門学校出なので数学Ⅱ、数学Ⅲなんて触ったことすらありません
それでもプログラムは普通に書けるので正直学校の成績とプログラムは結びつけるべきではないと思っています。

勉強するやる気とパソコン関係が好きならプログラムは誰でも書ける物と思っています。

初めまして。

今年の4月からインフォテック株式会社に入社しましたmasugiでございます。
これからよろしくお願い致します。

現在私は研修として、C#を用いたソフトウェアの開発の練習を行っています。
その際、要求仕様に関する不明点を質問しなかったり、要求仕様を(実際には正しく理解していないのに)正しく理解していると思いこんで実装を進めた結果、実装したソフトウェアの機能が要求仕様と違う、ということがありました。
練習だから良かったものの、これが実務だとお客様からお叱りを受ける、ということになりかねません。
このことから、要求仕様を正しく理解するために、どんなに些細なことでも不明点の質問や確認事項の確認を怠らないようにすることが大事だと感じました。

また、開発に関して悩んでいることがあったら、最適解が思いつくまで自分で悩み続けるよりも上司や先輩に相談した方が早いことがあることも学びました。

最後になりますが、研修で開発ツールの使い方やコーディングの仕方をしっかりと習得して実務に臨みたいと思います。

開発のトレーニング

こんにちは mtj です。

ゲームをよくする手前 購入した人にダメージをあたえる いわゆるクソゲーとなるものを購入する頻度は高い

購入したお金はもうどうしようもないが そこから友達と何故これが産まれたかを話し合うのはとても面白い
またプロジェクトで自分がこういう物を作らないようにするためのトレーニングにもなります。

ゲームは様々な要素が組み合わさってできています
・コントローラーでの操作性
・UI等のデザイン(配置等も含む)
・ゲームとして面白さ
・シナリオとして面白さ
・3D等グラフィック
それ以外にもジャンルによっては様々ありますが ゲームの内容によって何が足りないか
何故足りなくなったがだいたい想像できます

そういった要素ごとに色々考えながらマネージメントの本を読むとマネージメント力が上がると思います
また、ここからどうやったら面白くなる、改善案等も考えることでそのような製品開発のトレーニングにもなります。

是非マネージメントをやったことが無い人はクソゲーをクリアしてトレーニングしてみてください。
いい勉強代になると思います。