はじめに
僕はGUIアプリが作れない。
理由がわからないので、今回その理由を掘り下げるために記事を書いた。
筆者スペック
- 多分ソフトウェア開発の現場で5年働いてる
- Gitの操作はCLI派
- Webページは10年前みたいなものしか作れない
- できる言語
- C#
- VB.net
- Python
- JavaScript
- RustとかNimとかGoとかをちょっとやってた時期もあった。
問題点
はじめに 書いたとおり、僕はいまいちGUIアプリを作れない。
もう少し厳密に言うと、データストリームが絡んできたアプリを作れないような気がする。なのでGUIに限らない事がわかる。
以上の点から、以下の問題に細分化できるものと思われる。
マルチスレッドの理解
OSやフレームワーク・ライブラリでの動作に依存するものと思われるが、どれにしたって私はこの辺りの理解が浅い気がする。
別スレッドで動作するプログラムの作用の理解
そのため、別のスレッドで動作したものが、自分の書いているプログラムにどの様に影響するか、もしくはどの様に影響を与えれているのかを理解できていないフシもある。
UIパーツの作用・副作用の理解
続いてはここだろうか。UIパーツが与える作用・副作用を理解・把握しきれない。
自分の書いているコードでさえ、ボタンがクリックされたときのイベントの情報から、どの様なことが取得できるか、深く調べたことがなく、忘れていることも多々ある。
コードを責任分散したくても(自分の思ったように)できない
MVC/MVVMなどの設計について漠然とした理解しかしておらず、
「僕はこの処理はModelで行うものと考えていたのに、実際に処理を書こうとすると、Controllerに配置しなければ処理を行えない」
ということがままあり、そこで素直にControllerに処理を書けばいいものを、自分の考えとの重ね合わせに苦悶してコードが一片も書けないということに毎回陥る。
「グローバル変数的考え」からの脱却のできなさ
極論を行ってしまえば、「グローバル変数」ないし「シングルトンパターン」でデータの使い回しをしてしまえば解決する問題も多々あるだろう。
だが、僕はあまりこれを良しとしない頑固者である。
「グローバル変数」や「シングルトンパターン」を安直に使用して、それらが肥大化することを過剰に恐れている。実装もせずにだ。
まとめ
GUIアプリを作るには、どうしてもマルチスレッドの事を意識しなければいけない。
そうでもないと思われるのであれば、あなたの使っているフレームワークが優秀か、あなたがフレームワークへの理解やマルチスレッドに対して無意識に熟知しているのだと筆者は思う。
僕は、作ったGUIアプリやWebフロントエンドの数が、人より少ないのだろう。
そのくせ、実装もせず足りない頭で考えて、何も実装せず、自分の知識や学習の不足感に思考を持っていかれて、結局何も実装できなくなる。
だから、Reactiveプログラミングとかasync/awaitに、
「他のスレッドのことを考えずにプログラミングできるのかなー」
という漠然とした希望をいだき続けている限り、僕は使い物にならない。
5年この業界でぶらぶらしてたつもりだが、未だにPowerShellかBashスクリプト、もしくはPythonで、あるXMLをあるフォーマットのJSONに変換する程度のプログラムを組む、時給1,000円くらいの仕事が身の丈的に限界なのかもしれない。
それで、こういう「爪楊枝」になるかならないかわからないプログラムしか書けないやつは、この先どう生き残れば良いのか……。
その後 2019-06-10T17:30 加筆
紆余曲折あって、また少々古めのCSharp案件に入った。
そこで幸い、良い設計とチームメンバーに出会えた。
そしてテストコードを書いて、
「見た目の問題は少し脇に置いて、まずデータの入出力だけに集中してプログラムを書く」
ということをした。
実行ファイル化されたプログラムとWebサーバープログラム、更に現物を知らないハードウェアが絡み合った開発だが、自分なりにはうまくやっていけてる気がする。
挫折したLINQも、IObservable
とかReactiveを少し脇に置いて書いてみたら、すんなりかけてしまっている。 Func<>
や Action<>
を、今までのソースコードの雰囲気を読まずに多用しているのはいささか問題ありそうだが、delegateについて業務を通しながら学んだら、意外と分かったつもりになってる(こういう発想が一番危険なのだが)。
この半年の学び
端的に言ってしまえば、
「いきなり踏み込みすぎた」
のだろう。
そこから少し、物理的にも時間的にも心理的にも間を置いたことにより、自分の踏みだせる歩幅で踏み出したら、分かった。
それだけのことだと言ってしまえばそれだけのことだし、この記事に関しては.netFrameworkに限定された話でもあるため、Webブラウザになった瞬間、また1から出直さなければならなくなるだろう。
とはいえ、この体験は残しておくとともに、もし、
「うんあー、今学んでいることがわっかんねー」
と言ってもがいている人たちに、一歩引いて学びなおすきっかけになれば幸いである。