渡るネットは嘘ばかり

元文系、米国大学院CS修士号持ちITエンジニア。自称エンジニアが撒き散らすゴミを少しでもキレイにしたい

一歩踏み込んで考える

インフルエンサーの人が拡散してくれたのか、一時twitterからの流入が増えていたようで。僕の拙い文章を読んでくれる人が増えて嬉しい限りですが、相変わらず筆不精です。

Google Code Jam始まってますね。Qualification Roundは48点で突破でした。固定値にケアレスミスがあって、新しいシステムでもPractice mode解禁になって2個固定値修正したら普通にあってて20点無駄にした…Round1は1回目3000位台、2回目2000位台でどちらも突破の1500位以内に届いてないので、今週末に賭けます。

また、外資系プラットフォーム企業への転職準備をしつつもプロジェクトでクライアントのメインのプログラマの筆頭辺りになってしまい、フェードアウトしたいのに中々時間の取れない日々が続いています。仕事自体は楽しいんですけどね。cocos2d-xを使っていて、最近だとTableViewを横に動くようにしたり、Shaderで光彩付けたり、Android/iOSそれぞれで権限許可出したり、Perfect Pixel Detectionとかやってます。大体のことができるようになって、ホントそろそろ移らないと技術力が止まってしまう。同じ技術ばかり使って自分は大抵のことができる、と慢心すると広がる技術の世界から取り残されます。最近のも会社としては新しいことをやっていても、基本的には知ってることのcocos2d-xへの応用だし。
外資の世界トップ数社受けてダメなら、LinkedInでAI機械学習系の会社の誘いというか紹介があって、年収のレンジがどこも下限800で上限が1300〜1500位なので次のキャリアパスとしてデータサイエンティスト的なのも次の10年を楽しく開発する選択肢としては良いかも知れない。もうゲーム業界はいいや…社内でも歩きスマホが多くてストレスが開発以外のところで多いです。

自分は育ちが良いので、マナーと言うか振る舞いが下品な人が好きじゃないです。今度書くかと思うけど、前までタワマンに住んでて、住人の民度が酷くて、部屋で落ち着かないので引っ越しました。成功する人の大半は成功すべくして成功しています。そこには品格というかオーラのようなものがあって、所作振る舞いとか、マナーや気遣いが当たり前にできる人が多い。何故なら評価する人間がそういった品格のある人間が多いので、地位のある人間から人間性の下らない減点をされることが少ないわけです。同じ能力の人間が2人いたら通常、一緒に働きたいか、一緒にプロジェクト成功を祝って飲みたいか、そんな基準で人を選ぶのが人間です。反面、育ちの良い人間は気遣いに使われる脳機能が発達してる(子どもの頃のしつけで未発達の人は他人の不快を想像できないらしい)ので、無作法な振る舞いに意識しないでも気付いてしまって、無駄にストレスを感じたりもます。まぁ、一個上の次元だと下々の粗相は気にも留めない次元になりますが…。

www.forbes.com

前にも書いたかもですが、アメリカで語学学校にいた時にcontagiousという単語の例文で"A bad attitude is contagious"っていうのがあったのを今も覚えてます。contagious diseaseが伝染病なので、移りやすいとか伝染性って意味の単語なんですが、近くで悪い振る舞いをする人がいるとそれは伝染しやすいということです。マナーの悪い行動とか、迷惑な行いというのはたいていが自分にとって楽、他人に取って迷惑なものです。割り込みとかね。特に判断力のない人間(子どもとか)は人の行動を深く考えずに真似から学びます。だから、躾の時期に親は正しい振る舞いをしなきゃいけないわけで。子どもといる時は絶対信号無視するな、とか、昔は地域でも子どもの前では信号無視する大人はいなかった気がします。子どもは集中力がなく好奇心旺盛なので、よそ見しながら歩くことがよくあるので、信号無視を習慣化すると事故に合う危険はかなり上がりますよね。歩きスマホとかも、この伝染してる悪いマナーの1つで、しかも問題なのが、前のエントリーで書いたように、歩きスマホが当たり前の人は脳の超前頭野が働かない状態が続き、脳は使わない部分は縮んでいくので判断に使う部位が劣化して、善悪の判断がつきにくい、要は認知症とかのような状態になって、すべきでない悪いマナーだとそこらじゅうに貼られても止められなくなってしまうという。

今回はそんな、深く考えない行動にストップをかけて、一歩踏み込んで考えてみようという話です。一応、非技術者もしくは初心者技術者向け技術ブログのつもりなので最後は技術話、コピペ癖への警鐘に繋げます。

なぜを考える

日本人はどうもWhyよりHow toを気にする気がします。それ故、深く考える習慣がない人が多いように感じます。特に今の子どもは幼稚園、小学校低学年から親に押し付けられて塾に通い、何故を考える時間なく(外で遊んで色んなものに触れて、見て、話しての方がその能力は伸びると思ってる)、教えられたことを憶える習慣が強くなってるように思う。感受性の衰えすごいな、と感じるのは電車で2人一緒にいてもお互いスマホいじって、会話の話題もスマホからだったり。ちなみに、僕は子供の頃から何故ばかり考えて生きてきたせいか、学習能力とか理解力は高めな気がします。周り見ると発見や気づきがいっぱいあるんですけどね。ただし、一歩踏み込んで、気付きが得られると、それを気付いてない人の行動が気になってちょっと生き辛いかも知れません…。傘束ねずに傘の水滴で自分の服濡らして電車に乗ってくる人とか、店の前の邪魔な違法駐輪とか非常に気になります。How toはどうすればいいかの手順なので、深く考えたり理解は要りません。行動の理由は理解した方がいいけど。

何故というのは、一歩奥を覗き込むことのような気がします。例えば、重力の仕組みであっても、どういうことが起きてるか、の理解が先に来て、どうしてはその先、一歩先の次元にある気がします。未だに重力の計算式はわかっていても、重力が発生する理由はわかっていません。仕組みがあって現象がある。現象の理解は見える部分からの分析の結果で仕組みはその元の見えない部分です。分かる例で言うと、時計がどう動いてるか、仕組みは分解しないとわかりません。分解しても分かる人にしかわかりません。何故を考えることは物事の本質を考えることです。

邪魔の例

一つの例えとして、邪魔という感覚を取り上げます。
道とか電車を出る時に邪魔だな、と感じることはよくあると思います。でも、邪魔、で終わってしまうのでなく、一歩踏み込んでみる。なんで邪魔と感じるんだろう。それを考えると、自分が感じた邪魔、という不快な感情を他人に与えないようになります。では、邪魔と感じる状況を分析してみる。基本的に邪魔だと感じる状況というのは最善の動線を遮られた時だと思います。自分勝手な人間によって回り道、余計なコストをかけなくてはいけない状態、自分のペース・速度で歩けない状態、それが邪魔です。そう考えると、他人の動線をイメージして、そこを塞ぐ位置には立たない、流動性を遮る状態になったら一旦移動する、などという感覚ができます。そのためには周りの状況を把握しなくてはいけない。つまり、電車でドアが開いてる間は基本的には周りを見るべきです。流動性、他人の動線を把握して動くために必要な情報はスマホ上のまとめサイトではなく、周りに立ってる人との距離感や、移動する人の動線です。降車客が階段に向かう動線が想像できれば、イライラしてる人が出てきた時にぶつかられることもないでしょう。触らぬ神に祟りなしです。

邪魔の応用

邪魔がどういうことか自分なりの答えが見つかると、他のことにも理解ができます。例えば、”うるさい”。これは思考の動線、つながりを妨げられる状態です。邪魔と同じで音で気が散って流れを止められることで思考の流れが悪くなります。スポーツでも対人スポーツは自分のペースだと全く疲れないのに、相手のペースに合わせさせられると異常に疲れます。人は自分のペースを乱された時に不快に感じ疲れるものです。

コピペの弊害

プログラミング教室や現場でもコードを書く時にコピペをする人がいます。コピペは基本的にバレると思った方がいいでしょう。コードを書く時、スタイルは人それぞれです。if文も

if (flg1)
{
    // do something
}
else
{
    // do other
}

if (flg2) {
} else {
}

if (flg3) {
}
else if {
}

この辺よく見る書き方なんですが、複数のスタイルが混ざってると大抵コピペしてますね。

if(flg){
if (flg) {

半角スペースの使い方も癖が出ます。コピペでなく混ざる人は…美しくないコードを書く人なのであまり一緒に仕事したくないです。
わかりやすく(ロジックが複雑だとコメント多くしたり)美しいコードはバグが起きにくかったりします。コードレビューでも拾いやすいしね。

そして、コピペは他の箇所で正しく動いても、自分のコードではバグる場合もあります。また、他で動いてるからと言って最適とは限りません。コードアシストとか色々やってくれるので、せめて、元のを参考に、自分で動きを考えながら、最適化しつつ書く癖を付けたほうが良いです。コピー元が何をやってるかわからなくてコピーしてる人間とか正直、正気の沙汰に思えませんが、意外といます。

情報の真偽

1人1台スマホ時代で情報発信が普通になり、さらにプログラミング教室のステマが広がった今、ネットで見つかる情報は著名な専門家の書いている記事以外、何かしら間違いが混ざっていると考えていいと思います。「なんでこうなるかわかりませんが、」などと書いてるページがあったら即閉じたほうが良いです。そこをコピペしたら間違えたのがそのブロガーでもあなたの責任におけるあなたの間違いになります。結局、peer reviewをしてる紙の情報が確実なんですが、急ぎの場合でもコードの意味をしっかり考えたほうが良いです。一歩踏み込んで考えること、情報を疑うこと。悲しいことですが、発信者が増えたことで、発信者のレベルが劣化しています。URLを確認してプログラミング教室のページが書いている技術情報とかはメンター的な学生に毛が生えたか、下手すると素人に毛が生えた程度のエンジニアの卵が書いてる可能性が高いのでそっと閉じましょう。そして、そんな人間に情報発信をさせている教室は絶対に信じないほうが良いです。

ちなみに、最近見つけた仕事で使うとバグる例だと
masahirosaito.hatenablog.com
http://developer.wonderpla.net/entry/blog/engineer/Cocos2d-x_texture_hit_test/developer.wonderpla.net
前者は後者を批判していますが、どちらも現場じゃ正しく動かないでしょう。
他画面対応してる場合

this->location = CC_POINT_POINTS_TO_PIXEL(location);

initWithLocationとか作って、これでピクセル情報にしてあげないとダメ。CC_CONTENT_SCALE_FACTOR()をかけて変換してる感じ。取得する色情報はポイントじゃなくてバッファ上のピクセルの位置です。個人レベルの実験だとscaleFactorが1対1ですが、大抵変形端末は縮尺が違います。
ちなみに、color picking的な手法はopenGLでは普通の技術で特に3Dのオブジェクト選択ではオブジェクトごとに別の色を付けて、同時に描画して、取れた色のオブジェクトを選択状態にする、というのがよくやる手段ですね。さらに、3Dオブジェクトはtriangleの集合体なので、そこまで選択したい場合、ポリゴン(基本3画形と思っていい)ごとにIDを振って、それをIDごとに色情報(RGBA)に変換してglReadPixelで選択したポリゴンを選んで選択した対象を判断する、とかも学校の課題でやったりします。この場合、1回のバッファへの流し込みで住むので、cocos2sでの手法より効率がいいと思います。この辺の記事は元の技術とか仕組みわからずにStackOverFlowとかのコピペで動いたのベースでperfect pixel detectionができると思って書いた記事なんでしょうね。おそらく、openGLわかってないように思えます。

階段を登ろう

結局コピペ由来のバグの問題は深く考えず、元の技術を理解せずにショートカットしようとして、バグを起こす。しかも、仕組みがわかってないので本人がすぐ直すのは不可能です。コピペするにしても、使っている技術は全て把握しましょう。やり方がわかったとしても、正しいかは使っている技術を理解しないとわかりません。まぁ、簡単に言ってしまうと「ちゃんとやろう」ということです。

それでは、よいGWを!