i_amaiの雑記

お金稼ぎが目的の、クソつまんないブログです

しばらく転職はしない

下の日記から、早いものでもう半年近く経った。

www.vonyaridgement.com

最近色々考えすぎて頭の中がごちゃごちゃしてきたので、整理のために書く。

結論から言うと、転職するべきと感じていた動機はひとまず無くなったので、しばらく転職はしない。以下はそこに至るまでのごちゃごちゃ。

世間では転職・退職しました系エントリが耳目を集めているけど、こういう「転職するのをやめました」というエントリがあっても良いのではないかと個人的には思う。


昨年秋、転職するかもしれないと上長に告げると、すぐにその上長(と、兼務先の上長)と面談をすることになった。そういった面談は、ここ1年以上していなかった。

面談ではもう既に「辞めてもなんとかなる」という気持ちでいたので、ここぞとばかりに洗いざらいぶちまけた。「ここ1年で従業員の1割近くが転職やら定年やらで辞めたけど、ほとんど補充してないよね」だの、「もっと人を教育する機会を設けてほしい、毎年同じことの繰り返しでは人は成長しない」だの、「中間管理職にマネジメントスキルが感じられない。年功序列の消去法で成り上がってしまったから仕方なくその職をやっているように見える。てかなんで次長やら部長が現場に入って作業やってんの?そんなんだからコスト管理できないんだよ」だの、偉そうなことをずいぶんと言った。いや、もちろん実際はですます調だけれども。

だけどそもそも、私が働いていて気づくようなことは上長たちもだいたい気づいているのだ。彼らは彼らなりに状況を変えようと努力している。だからこそ面談の場は定期的に設けた方が良い。現場で毎日似たような作業を続けていると、どうしても視野が狭くなってくる。視野が狭くなった結果、業務に対する作業員どうしの認識にずれが生じて、足並みが揃わなくなってくる。認識のずれを修正し足並みを揃えるために、面談という場は必要なのだ。

そういったことも話すと、上長たちは快く頷いてくれた。ただ、頷いてくれたからといって、上長たちがその後具体的な対策を練り、実行に移してくれたかというと、微妙なところだ。少なくともこの半年間は、彼らが関わった事柄については、ほとんど変わっていない。

繁忙期だから今は仕方ない、と人は言うが、私はそれが嫌だった。この先人材不足が長引けば、繁忙期であろうがなかろうが、可処分時間が足りないことを言い訳にし続けるだろう。いつまで経っても「これは仕方ない、これも仕方ない」と宣うことになるだろう。私は色んな言い訳を考えて「仕方ない」という思考に至るまでに消費する時間や、そう言う風に互いに愚痴を言い合うだけで浪費する時間を、状況を打破するための行動に充てたかった。ある人には焦りすぎだとも言われたが、むしろ私はもっと焦りたかった。

だから、私はとりあえず行動してみることにした。


まず、コスト管理を徹底するために、作業時間を計測するWebアプリをNode.jsで作った。

今までは月に一度、ストップウォッチで作業時間を計測して、紙に記入した後提出してもらい、管理職がわざわざExcelに入力しなおしていた。これのストップウォッチでの計測に当たる部分以外を自動化することで作業者の負担を減らし、その代わり月一ではなく日常的に使ってもらうことにした。集計とグラフもDBから自動で出力されるようにした。

とりあえず自部署の人に使ってもらって、使用感をレビューしてもらった。ある程度運用してデータが集まってきた段階で、社内全体に公表した。今はレビューや他部署からの要望を踏まえて、他部署や間接部門、IoTでも広範に使えるようリビルドしている最中だ。

次に、頭の中で思うだけで言わずにいたことを、稟議書に似た社内規定の書類で上層部に数回提案した。具体的な内容はここで明かせないが、たとえば、従来管理者の経験と直感が頼りだった日々の業務量の調整を数字で計画・把握できるようになるために、組織として対応してほしいことなどを書いた。

書類で提出することで、上層部とのコミュニケーションの増加に繋がる。私はあまりコミュニケーションが得意な方ではないが、こうすると交流せざるを得ない状況に自らを追い込むことができる。また、他人が読んでも分かるような文章を考えてわざわざ書くことで、今の私がそうであるように、自分の意見を整理することもできる。

続けて、私は自分のやりたいことを、きちんと周りに伝えるようにした。何もWebエンジニアがエンジニアの全てではなく、Webだけが私のやりたい全てでもない。なぜか上の日記では「エンジニア言うたらWebエンジニアや!ワイはWebエンジニアになるんや!」みたいになってしまったが(ごめんなさい)、IoT、機械、電気など、勉強したい分野はたくさんある。

周りにそれを伝えてみると、社内でもできることはいろいろとあることが分かった。うちは中規模メーカーの子会社なのだが、設計開発を担当している親会社が製品を設計するための研修を定期で行っているらしい。私は行動してみるまで、そんなことも知らなかったのである。


こういった行動が功を奏してか、少しずつ社内で自分の立ち位置が認められてきていると感じる。

今までの私は、上の日記にあるように、「田舎の工業団地に勤める30代前半の現場作業者」だった。会社がそうあるように求めるから、私はそういう役割を嫌々ながらこなしているのだ、勝手にそう考えていた。しかし実態はそうではなく、社内でのコミュニケーション不足ゆえに、私が私自身を縛っていたのではないか。

そう思い至った時点で、自分が転職すべきだと感じていた動機は無くなってしまった。独学が嫌なら、社内で勤務時間中にそれができるように自ら動けばいいのだ。そしてその土壌は(少なくともしばらくの間は)整う予感がしている。

すべては自分次第だ。私は努力が足りなかった。

おわりに

上の日記がきっかけで、ここ半年で、いろいろな方から叱咤激励を受けました。上の日記を書いたときは、ほんともうボロクソのけちょんけちょんにけなされるんじゃないかと思っていたんですが、そんな人は一人もいませんでした。感謝しかありません。

ここまでポエティックなことを書いておきながら、すぐ考えが変わる可能性もありますんで、生暖かく見守っていただければ幸いです。

頑張ります。

Temporal Dead Zoneってなんぞや

最近個人的に「何それよく分からん」となったJavaScriptについてのメモ。

間違ってたら教えてください。

hoist と TDZ

なんか厨二センスあふれるこのフレーズは、You Don't Know JSの著者、Kyle Simpson氏のツイートから。

hoistしてなかったら2回目のconsole.log(x)では2が出力されんだろ?って言ってるんだけど、まずhoistの意味が分からんかった。

で、調べた。

console.log(x); // undefined
var x = 2;
{
  console.log(x); // ReferenceError: x is not defined
  let x = 3;
}

前者のconsole.log(x)はエラーにならない。後者のconsole.log(x)はエラーになる。

letが宣言されたブロックの中では、ブロックの最初にlet宣言された変数を走査し、それらをundefinedとしてインスタンス化する。これを巻き上げ(hoist)と呼ぶ。

letの場合は巻き上げた時点(ブロックの最初)から実際に変数が初期化されるまでの間を特にTemporal Dead Zoneと呼んでいる。Temporal Dead Zone中にその変数を参照しようとするとエラーになる。

ちなみに、

let u = undefined;
console.log(u); // undefined

この場合は同じundefinedでもエラーにならない。つまり、変数の初期化フラグをJavaScript Engineが内部的に管理しているということなのかな?

varの場合も巻き上げは行われるが、その宣言がブロックの中だろうが、すべてがプログラム実行の最初に走査されて、undefinedとしてインスタンス化される。これは適当なIDE等で変数を色んな場所で宣言したコードを用意し、1行目にブレークポイントをおいてデバッグしてみればすぐ分かる。

f:id:i_amai:20190302231236p:plain
VS Codeデバッグ

その他、TDZに関する動作のあれこれは以下のページを参照した。まだ全部読んでないけど。

jsrocks.org

初心者プログラマとして思う

どうも、こんにちは。ふだんはタンポポを乗せた刺身パックの出来栄えをチェックする仕事をしているi_amaiです。

下の記事を読みました。

note.mu

blog.3qe.us

初心者プログラマの一人として思うことがあったので、ちょっとだけ書きます。


プログラミング言語って、基本英語じゃないですか。

母語じゃないから、「やりたいこと」を言語化するときに、

  1. 日本語でまず考えて、
  2. それを英語に翻訳して、
  3. さらにそれが単語として文法として正しいか検証する

って作業がどうしても必要になってくる。だから急に問われると答えに窮するんです。

implicitlyとかsyntaxとかoperandとか、あんまり学校でなじみのなかった単語もしょっちゅう出てくるし、signedとかdirectiveとか、意味はなんとなく知ってるけどパッと見でなんのことか分からない単語も出てくる。

私たちはトライを繰り返して、上記作業の応答性を高めていきます。算数の問題を繰り返し解くように、身体に染み込ませていきます。日本語でコレと言ったら英語でアレ!といった感じです。

これって、一朝一夕で身につくようなもんではないと思うんですよね。

初心者が中級者になるには相当時間がかかります。シグモイド曲線みたいな。

初心者が中級者になること、それは「何が分からないかが分からない」という段階から脱することでもあります。「何が分からないか」が言語化できれば、あとは勝手に成長するんです。

これって、誰もが通る道ではないでしょうか。


初心者にとっても、熟練プログラマにとっても、今って辛い時期だと思うんですよね。

なにせ人手不足で、未経験歓迎!とか謳って大量に人雇ってビジネスマナー()とhtmlをちょろっと叩き込んだだけで適当に現場へぶち込むみたいな、誰も幸せにならない商法が確立されてしまっています。

初心者と熟練者の間にギャップがある。

私たちはお互いに辛抱強く、歩み寄る必要があるんだと思います。

これは受け売りで、初心者に向けた言葉なのですが、「一冊だけでもその言語の入門書を購入して手を動かしながら学ぶ」ことをお勧めします。

私もいろいろと教材を試してきましたが、結局体系的に学ぶなら本が一番手っ取り早い気がしました。

情報の網羅性と信憑性だけでおつりが出るくらいで、「やりたいこと」を言語化する、及びその応答性を高めるのに一役買ってくれます。

頑張りましょう!


あとプログラミング教育については、少し古いんですが、文科省有識者会議が発表した下記の記事が参考になると思います。 http://www.mext.go.jp/b_menu/shingi/chousa/shotou/122/attach/1372525.htmwww.mext.go.jp

私たちは現在でも、自動販売機やロボット掃除機など、身近な生活の中で意識せずとも、様々なものに内蔵されたコンピュータとプログラミングの働きの恩恵を受けている。このような人間とコンピュータとの関係は、人工知能の急速な進化等に伴い、今後ますます身近なものとなってくると考えられる。

そうした生活の在り方を考えれば、子供たちが、便利さの裏側でどのような仕組みが機能しているのかについて思いを巡らせ、便利な機械が「魔法の箱」ではなく、プログラミングを通じて人間の意図した処理を行わせることができるものであり、人間の叡智が生み出したものであることを理解できるようにすることは、時代の要請として受け止めていく必要がある。

どうでしょう?そこまで変なことは言っていないと思うんですよね。こういう思想が全小学校教諭にまで浸透するかどうかは未知数ですけど、少なくともトップはきちんと考えているんじゃないかってことをお伝えしたかった。

結論

なでしこ良いよなでしこ。日本語でコードが書けます。

ブラウザだけでも開発できるよ!みんなやろう!

チルダ記号でビット反転するとintでキャストされる

どうも、こんにちは。

C#を勉強中なのですが、Convert.ToString()の挙動についてちょっとハマりました。

問題

using System;

class Sample
{
  static void Main()
  {
    byte a = 2;
    Console.WriteLine(Convert.ToString(~a, 2));
  }
}

この時、aはbyte型(8ビット)なので、Convert.ToString(~a, 2)の結果も当然8ビットで出力されると思っていたのですが、なぜか32ビットで出力されちゃいます。

f:id:i_amai:20190102234210p:plain
ConvertToString

なんでや。

~(チルダ)とaの間に(byte)と明示的にキャストすることで正しい値を表示させることはできるのですが、なんかモヤっとする…

解決法(?)

~(チルダ)が悪さをしているようです。

~(チルダ)は元の値がbyteだろうが何だろうが自動でint型以上のビットでキャストしてしまうので、それを防ぐにはやっぱり明示的にキャストするしかないみたい。

この仕様は公式には言及されてなくて(あろうことか「All integer types support the ~ operator.」と書いてある!)、ちょっと調べた感じでは古い記事になるものの、下記くらいしか見つかりませんでした。

参考サイト

~ the result of the NOT operation has been cast to a byte . This is because the operator returns an integer value, which cannot be assigned directly into a byte.

今見返したら持っている入門書にもそれっぽいこと書いてあったので、もしかしたら周知の事実かもしれませんが。

というわけで、この辺で。

2019年1月目標

お久しぶりです。i_amai in こたつです。

まず初めに、前回の日記においてかなりの反響を頂きましたことを、この場を借りて、お礼申し上げたいと思います。本当に、ありがとうございます。

仕事について、まだ具体的にどうと言える段階ではないのですが、このブログがきっかけでいろいろと環境が変わりつつ(環境を変えつつ)あります。いずれここでまとめて報告できればと考えておりますので、しばらくお待ち頂ければ幸いです。

さて、今回は題名の通り、2019年1月の月次目標をざっくり立てたいと思います。

なぜ目標を立てるのか

衆目に晒して、自分を追い込むためです。

私は、目標を立てるのが苦手です。

より正確には、目標を立てて、その通りに実行するのが苦手で、夏休みの宿題とか受験勉強とか、とにかく毎日コツコツというのが、すごくハードルの高いことのように感じられるんです。

もうちょっとセルフコントロールしたいよなあ、という思いが常にあって。

そこで、このように公開することで、自らやらざるを得ない状況を作ることにしました。

最初は2019年、つまり年間通した目標にしてたんですけど、目標達成の成功体験を得るには月次の方が手っ取り早いし、無理のない計画が立てやすい気がしました。

2019年1月目標

上から、優先度の高い順です。

  1. C#Javaの入門書をそれぞれ1周する
  2. Web API: The Good Partsを1周する
  3. 1.および2.を参考に、社内で作ったアプリをリファクタリングする(~2月末まで)
  4. 1日30分のランニングを習慣づける

説明

C#Javaの入門書としては、下記を購入しました。

これらを1周するのが最優先課題です。

ただ読むのではなく、なるべくコードの載っている部分は手を動かして写経したりちょっと手を入れてみたりして、その言語で書くことに慣れようとしています。

Web API: The Good Partsについては、REST APIをもっと深く知っておいた方がいいと個人的に思ったため、調べた中から面白そうな本として購入しました。Kindle版が無かったのは痛いですが…

社内で私が作ったアプリとしては、

  1. VB.NETを使った業務自動化アプリ(の一部)
  2. Node.js(Express) + PostgreSQLを使った作業時間測定Webアプリ

の2つがあります。

VB.NETはともかくNode.jsは社内に使える人間が現状自分しかいないため、保守を誰かにやってもらうにはVB.NETC#で書き直すか、Node.jsを覚えてもらう必要があります。

そこまで複雑なことはやっていないので割とすぐに作り直せるだろうし、1.や2.で勉強したことを活かすちょうど良い機会になるだろうと考えて、いまのところはC#で書き直そうと思っています。

ランニングについては単純に、太ったからですね。

頑張ります

叱咤激励や、「勉強するならこの本がお勧めだよ」等、コメントお待ちしております!

私はどうすればいいんだろう

どうも、こんにちは。

下の記事と、そのリンク先を読みました。

takulog.info

これらの記事に関連しているか分かりませんが、今少し悩んでいることがあります。

誰かからのアドバイスを期待して、思いつくまま書いていきます。

30代の非エンジニアがエンジニアを目指す

まず、私はエンジニアではありません。エンジニアとしての意見を求めている方はゴーバック推奨です。

ただ漠然と、お金を稼ぎたいなあ、そのためにはエンジニアになるのが近道かなぁという気持ちがあって、この一年と少し、工場で現場作業者として勤務する傍ら、完全に独学で勉強をしてきました。

簡単に経緯を述べますと、Excelの関数でできないことをVBAで補うことから始まって、VB.NETで簡単なPC操作の制御のしかたを学習しました。それからN予備校の「プログラミング入門 Webアプリ」を修了し、Node.jsやExpressと触れ合って、Webの基礎を学びました。また、2回目の受験で応用情報技術者を合格しました。今はN予備校の「大規模Webアプリ」の受講と、データベースの勉強を同時進行でしています。

いわゆるポートフォリオとして提示できるものは多くないのですが、これだけ独学が持続できるなら、自分はプログラマに向いているのかもしれない、そう勘違いできるくらいにはなりました。

ただ、私の現状は田舎の工業団地に勤める30代前半の現場作業者です。会社はまず現場作業者としての職務を全うするよう従業員に求めます。プログラミングによる業務効率化はあくまで「ついで」であり、そこにお給料は発生しません(定時で終わらなかった仕事がプログラミングによって定時に終わるようになったとしても、「定時で帰れ」と言われるだけ)。昨今の人手不足もあってその傾向はより顕著です。

現場作業は嫌いではないのですが、どうしても、「このままでいいのだろうか?」という考えが頭をよぎります。

独学は楽ではない

あることがらを勉強することに、お給料が発生するか?しないか?どちらか選べと聞かれたら。

上のような問に迷う人は少ないのではないかと思います。

どんなに自分の興味ある分野だったとしても、独学は楽ではありません。少なくとも私にとって、独学はなんらかのリターンを期待してするものです。

今勤めている会社では、そのリターンを十分に期待できない。それにどうせなら、勉強した知識を業務の中でどんどん生かしたい。

とは言え、30代前半という年齢を考えると、転職には二の足を踏んでしまいます。田舎にプログラミングをやらせてもらえるような企業は多くなく、かといって都会への転職はリスクが大きい。そもそもスキルとしてどれくらい通用するのかも分からない。

私はどうすればいいのでしょうか。今のまま独学で、勉強を続けるべきでしょうか。それとも転職を考えるべきでしょうか。その転職先は田舎でしょうか、都会でしょうか。

このように、独学の一番つらいところはメンターの不在ですね。よって、ぐだぐだ悩むことに多くの時間を費やしがちです。経営者の方々がそれを分かってくれていれば良いのですが…

おわりに

最初は給料低くても頑張るから、誰か雇ってください。

私に経験をください。

プログラマの英語学習

どうも、こんにちは。10年前にTOEIC690取ったっきりスコア上がってないi_amaiです。

↓の記事を読みました。 www.lifehacker.jp

読んだというか、さらっと流し見たというか。

こんな雑記事に100以上ブクマついてるのは納得いかねえ

語学に関してはちょっと一家言ありますので、話したいと思います。なおDuo 3.0以外は無料です。すぐできます。

なにはともあれDuo 3.0

中学英語も自信がない場合にはこの本に頼る。1、2ヶ月で覚えられる分量だと思う。とにかく耳タコになるまで聞いて、冠詞一つに至るまで暗唱できるまで覚える。

中学英語が大丈夫なら飛ばして良い。

google翻訳Chrome拡張

すごく精度が良い感じ。公式ドキュメントやニュースなんかはこれで十分。stack overflowとかゴシップ記事みたいな口語に近い文章も割といける。

f:id:i_amai:20180819144150p:plain
google翻訳Chrome拡張

自分で読んでみる → googleに翻訳してもらう、の繰り返しだけで超勉強になる。

「単語 meaning」「単語 definition」でググる

ググって最初に出てきた意味は、その単語を聞いてネイティブが描くイメージに近いことが多い。

例: substitution

the action of replacing someone or something with another person or thing.

google画像検索を活用する

同じくsubstitutionで画像検索すると、数式がたくさん出てくる。数学で使うような堅いイメージの単語だということが目で見てすぐ分かる。ちなみに日本語で言うなら「代入」。

f:id:i_amai:20180819144203p:plain
google画像検索 : substitution

言語・ライブラリ・フレームワーク公式のyoutube動画をクローズドキャプション付きで見る

どういう仕組みか知らないけれど、youtubeクローズドキャプションはほんとによくできている。タイミングも精度もバッチリ。

技術の勉強にもなるし、一石二鳥。

f:id:i_amai:20180819144137p:plain
youtube クローズドキャプション


まとめ

素直に翻訳ツール使った方が今は楽ですね。

それではまた。