ガツンと。

文章書くのって難しい

PHPからプログラミングを始めた僕はなぜ糞コードを書いてしまうのか

PHPからプログラミングを始めた僕はなぜ糞コードを書いてしまうのか。

それは、オブジェクト指向を認識しづらい環境で育ったから。

 

hello worldで「入力」「出力」の感覚を掴み損ねた。

最初にプログラミング体験したのが「hello world」だが、webアプリケーションなので「入力」「出力」の感覚を正しく得られなかった。

「こう入力があると、こう出力されるのか」ではなく、
「こう書いたらブラウザにこう表示されるのか」という感覚。

今思えば、リクエストが「入力」レスポンスが「出力」だが、厳密にいうとこれもwebサーバーのものであって、自分が書いたコードの入力と出力を直に体験出来ていたわけではなかった。

フレームワークに手を出し、モジュールの感覚を掴み損ねた。

フレームワークの存在を知り、それを使ってwebアプリケーションを作れた。

「プログラミング力 = フレームワークのルールを理解して適切に使える能力」
というような感覚があった。

小さなプログラムのパーツを作り、組み合わせて大きなプログラムにする機会がなかった。

 

上記の理由により、僕はオブジェクトや入出力の感覚が欠如している。
だから新しい機能を追加しようとするとき、
使うべきでない値を使おうとしたり(入力感覚の欠如)、
エラー時が考慮されていなかったり(出力感覚の欠如)、
特定の状況でしか使えない物になってしまっていたりする(モジュール感覚の欠如)。

机周りの整頓について考えて実行した

ものを「本」「書類」「一時的な物」「それ以外の物」に分類して、「一時的な物」以外はそれぞれ特定の収納場所に収める。
収納場所に収まらない場合は、収まる量になるように不要なものを選び出して処分する。


「一時的な物」とは、作業中だったり、払込用紙だったりと、作業が完了すると処理出来るもののこと。これは机の上においておいても良い。

書類の中でも、保証書や支払い証明などの「絶対いるわけではないけど、もしかしたら必要になるかもしれないもの」の置き場所には悩んだ。
分類が多いので分けていられないし、形や形式もバラバラなのでカオスになってしまう。収納に手間がかかる割に、いらないかもしれないという。。


とりあえずの対応で一つのフォルダに全てぶち込んで整頓終了ということにした。

phpがシングルスレッドである理由

【疑問】

PHPがシングルスレッドであると聞いて、以下の疑問が湧いた。

apacheではリクエスト毎にプロセスが作られ、その中でphpが実行されるので他のリクエストとメモリ空間を共有しないことがイメージできた。
これならスレッドセーフについて留意しなくても良い。

じゃあ、一つのプロセスを使い回すnginxが実行するphp複数のリクエストがメモリ空間を共有するんじゃないのか?スレッドセーフを考えねばならないのではないのか?

疑問に思ったので調べた。

 

【結果】

wikipediaにて「Zend Engineは1つのプロセスが1つのインタプリタのコンテキストを持つように設計されていて、単独ではマルチスレッドを用いた処理をサポートしていない。」とあった。
そもそも、webサーバーがどのように動作しているかということと、phpがマルチスレッドなのかシングルスレッドなのかは関係がなかった。
言語がマルチスレッドなのか、シングルスレッドなのかは、実行される環境によるのではなく、その言語の仕様ということなのだと理解した。

 

C10K問題を解決したとされるnginxがphp_fpmでphpを実行するとき、php_fpmは1つのプロセスを使い回すのだろう。(もしくはnginxのプロセス内で実行される?)

ということは複数phpの実行は同じプロセス内で行われるが、phpはシングルスレッドで動作するというのは変わらない。

このことからも、phpがシングルスレッドなのは言語の仕様であることが理解できた。

スレッドセーフについて

スレッドセーフとは

スレッド間で共有される資源が同時に参照・操作される場合があるマルチスレッド環境にて、資源が不整合を起こさないように考慮されていること。

考慮の方法として「アトミックな処理にする」「共有資源を参照・操作する場合はロックを掛けておこなうようにする」が挙げられる。

プロセス・スレッドを要約

プロセスとは

プログラムの実行単位である。
プログラムが実行されると、
メモリリソースを確保し、プログラムイメージをメモリにロードして実行準備を整える。
 
スレッドとは

CPUでのプログラム実行単位である。
プロセスごとに単数または複数存在し、スレッド単位でCPUがプログラムを実行する。
メモリリソースは各スレッドで共有されている。

デザインするときに覚えておこうと思ったこと。

デザインを行うとき、機能デザインを行ってから、あしらいをデザインする。

機能とあしらい、どちらも優れた物がすでに世の中にあるので自分で生み出すのではなく、優れたものを探してカスタマイズする。

 

まず機能デザインを行う。
必要な機能を洗い出す。
類似サービス等を調べると自分では思いつきもしなかった便利な機能が見つかる。
その中から必要な機能をチョイスしてレイアウトを行う。

 

あしらいデザインを行う。
目的の雰囲気を決めたら、その雰囲気でデザインされたものを探す。
その雰囲気を出している要素があるので(角丸や、アイコンなど)それをふんだんにもりこんでデザインを行う。

大衆は意見なんて持っていない

大衆は意見なんて持っていない。
一番多い意見に引っ張られて、それが自分の意見だと勘違いしているのがほとんどである。

 

これは「みんなちゃんと考えた意見をもたなくてはならない」とかではなく、そういうものだからそういう前提で物事を考えなければいけないという事である。

 

例えば「デザイン・ファッションセンスの良い悪い」の判断は自分のセンスで行っているのではなく、「過去に見たデザイン・ファッションセンスが良いと言われているもの」と照らしあわせて、それに近いかどうかで判断している。
過去に良いと思っていたものが、時間が経つとガラッと反転してダサく思えたりするのは、判断基準にしている「一番多い意見」が変わった事によって起こっている。

 

だから、センスを良くするには「自分のうちから溢れ出るもの」を表現しようとせず、周りのセンスが良いと言われているものを模倣するのがいい。
本当に新しい物・センスを生み出せるのは、すぐに「一番多い意見」にしてしまえるほどの影響力をすでに持っている人のみである。