algonote

There's More Than One Way To Do It

20年プログラミングをする中で役にたったこと

先日32になりました。

f:id:hiromichinomata:20210124170117p:plain:w200

前口上

はじめてコードを書いたのは12の時でした。学校の授業で技術の時間だったと思います。

当時ウィンドウズはもう出ていたはずですが学校にあったのは古い筐体でフロッピーディスクに入った行番号BASICを実行したり、訳もわからず写経したのを覚えています。

今はプログラミング必修化等の流れもありますが当時はそんなものもあるはずもなく、田舎の学校でそういったものを授業でやるのは割と先進的だったのかもしれません。

先日生誕祭?を迎えちょうどプログラミング歴20年になったのでプチ成人式でこの20年プログラミングする中で役に立ったことを振り返りたいと思います。

Lisp

プログラミング言語を分類する方法の一つとし関数型かどうかというものがあります。関数型の代表言語がLispでその構文はCに影響を受けた多くの言語と比べると独特と言われることもあります。EmacsのカスタマイズもLispで書きますね。

シリコンバレーのアクセラレータY Combinatorのファウンダーでエッセイでも有名なポールグレアムは生粋のLisp推しで彼の影響で自分が最初に訳も分かって書いた言語はLispでした。xyzzyというWindows上で動くCommon Lispの動くEmacs風エディターで遊んだのを覚えています。

聞ける人がいないでプログラミング言語を学ぶ上で一番つまづくところは環境構築な気がします。エディターをインストールするだけでプログラミング言語の実行環境があり、そのエディター自体のカスタマイズというできることが見えるというのもよかったです。おまけに自然とターミナルのキーボードでの操作も覚えられるという。

後にポールグレアムが言ってるほどLispは使われていないことに気づくのですが最初はエディターのカスタマイズで遊んでみるというのは悪くない気がしますね。いまならVS CodeとJavaScriptでしょうか。ブラウザでブックマークレットでもいいと思います。

今では機械学習の開発と言えばPythonですがAI=エキスパートシステムの時代もありLispで書かれた本も何冊か読みました。

情報処理技術者試験

“未経験でエンジニアに転職、年収1000万!”という広告でも見ていれば自分も情報系に進んだのかもしれないですが、少なくとも高校生の自分にはプログラマーは新興の職業で不安定でなんなら匿名掲示板で真っ当な大人に噛みついたり、P2Pソフトでいかがわしい画像を共有したりしている危ない人たちに見え、そっちには進みませんでした。歴史の浅い学問なら独学でもある程度何とかなるのかなと。

情報処理技術者試験は国家試験で大学1,2年の時に基本情報技術者とソフトウェア開発技術者(現応用情報記述者)試験をそれぞれ受け合格しました。新卒の就活で役にたったかと言えばモノの役にもたたなかったですし、自分が面接する上でポートフォリオ がある即戦力に近い人材を新卒でも採用するのは間違い無いですが、コンピュータサイエンスの基礎を学べると言う上で世間で思われているほど情報処理技術者試験は悪い選択では無いと思いますね。

面接官側が情報系の学部や大学院に進んだ真っ当な純粋培養のエンジニアだからか過小評価されがちですが、情報系学部の倍率が上がって入れない場合もあるようですし、日本で情報系の大学教育を代替する手段として変なスクールよりは信頼できると思っています。

ポートフォリオ ある >> 情報系学生 => 応用情報技術者受かっている > 機械・電気 > 理系 > 文系

競技プログラミング

学生時代TopCoderにC++で参加していました。何かのタイミングでかっとなってアカウント消してしまったんですよね。。。無念。アカウントを消したくなった時は一呼吸おこう

研究開発よりのアルゴリズムエンジニアで無い職業エンジニアが難しいコンペの手法を日常でたくさん使うと言うとそうでは無いですが、計算量の概念だったり、1GHzのCPUならざっくり10^9命令実行できるという意識はあってもいいと思います。

AtCoderには無いですが、TopCoder SRMには撃墜フェーズがあり、自分が書けない複数の言語のコードを強制的にレビューさせられると言うのは言語アレルギーがなくなると言う意味でもよかったです。個人開発だけをしていると中々身につかない技術ですが、仕事での開発において他人のコードを読む、レビューをすると言うのは結構な割合というかそちらの方が多いこともありプログラミング教育プラットフォームを作るなら入れることを検討した方がいい要素だと思います。

機械学習ならKaggleもよいです。

Mac

パーソナルコンピュータ市場のOSにおいてWindowsというのは圧倒的シェアを持ち、デスクトップソフトの開発ならまだしもエンタプライズでないWeb開発のサーバーの多くはUnixベースでありそれなりにつらみがあります。今ならWindows Subsystem for Linuxもありですが、Webのバックエンド開発において手元がMacであることを仮定している企業が多いように感じます。iOS開発でも抜け道はありますが基本必須ですね。

live CDやVirtualBoxを使えばLinux環境はすぐ手に入るのですがライセンスの関係で仮想環境にmacOSを入れることは禁止されており、中古のMacをはやく手に入れられるかどうかでキャリアの選択肢が広まる部分はあるように感じます。とりわけフリーランスのWeb開発においてはBYOD(端末持ち込み)でリポジトリのセットアップスクリプトがMacしか動かないと言うこともままあり、早期に慣れておくことは重要に感じます。

ぼっち耐性

SEのような客先で要件を聞きながらコードも書きマネジメントもするのような職業形態もありますが、職業エンジニアは営業職などと違いどちらかといえば内勤でずっと画面に向かっていることが多いように感じます。

コロナ禍でわかったことですが、世界は常に外に出ていないといけない人間と引きこもっていることが快適な人間に分かれるようです。しかもどちらかと言うと前者の人の方が多いと言う。わいわい開発するカルチャーの会社もあるので必ずしも真では無いですが、コードを書くと言うのは一日中椅子に座って黙々と進めると言う部分があり、ぼっち耐性が要求されるように感じます。その点子供の頃病弱だったこともありひきこもり耐性が強かったのはよかったです。

一方で世の中コネで決まることもありますし、情報源が増えるのはいいことなので、同業の友人や知り合いは作った方がいいと思います。残念ながら友人は少ないのでお前が言うな案件ですが。。。

コミュニティー

特定の分野について学びたくなった時、公式ドキュメントや本を読むと言うのも大切なのですが、進化のはやい技術だと情報が古いこともあり、アクティブに開発している人の話が参考になることも多いです。

コンテクストの前提要素の少なさや治安の良さからでしょうか、無料や格安の勉強会が多いと言うのも日本語圏の特徴だと思います。コミュニティーのSlack/Discordに参加してみたりTwitterで詳しい人をフォローしてみると言うのもいいですね。勉強会の参加が転職につながったと言う話も聞きます。匿名掲示板で慣れない敬語を駆使しながら塩対応くらった自分の苦労はなんだったのか。。。

他の情報収集方法については昔Qiitaに書いたのでそちらをご確認ください。

プログラミング言語以外のこと

一時期Webデザイナーになろうと考えた時期もあり、Adobe系のツールやSketch、Figmaなどのデザイン系ツールを使うのもそれほど抵抗感がないです。プログラミング教育と言うとプログラミング言語を学ぶことになりがちですがソフトウェア開発においてプログラミング言語の世界で終わることは少ないように感じます。

ゲーム開発だったら絵や音楽も必要ですし、アプリ開発のようなGUIがあるものではデザインやロゴが必要になることもあるでしょう。画面のないものでもデータベースだったり、画像処理の知識だったり、業務でのソフトウェア開発においてプログラミング言語以外のことの比重は大きいように思います。

それこそフリーランスなら確定申告で簿記的知識が要求されることもありますし、揉めた際に法律の知識が役に立ったこともあります。

ブログ

趣味はなんですか?と聞かれたら無難にピアノとギターと答えているのですが、真なる趣味はブログな気がしています。

転職や案件獲得で有利と言うのもあるのですが常にアウトプットを意識して行動するようになるという方が大きいように思います。自然と能力ものびますし、習慣の力は大きいです。

このブログは3年以上書いています。月だいたい4回で年間48記事を目標にしています。続けるコツは週1回にしないことでしょうか。多少のムラや日数が多い月にたまに息継ぎできるのがポイント。

個人開発

仕事でコードを書いて休みもコードを書くなんて正気か!?と言われることもありますが、小さなモノでも個人開発でプロダクトを作るのは楽しいです。業務でやりとりする相手のスタックの基本を理解することでコミュニケーションが楽になることもあるし、なんなら小さな企業案件でほとんど書けない言語をレビューしたこともあります。

ソフトウェア開発以外の趣味もあるのでムラはありますが、飽きっぽい性格なので常に新しいことが出てきて学べることが無限に湧いてくると言うのは知的好奇心の塊と相性がいいです。

英語

プログラミングをする上で英語さえわかれば他はいらないと言う趣旨の記事がたまに出て炎上するのを観測していますが、100%ではないにしろ、語学というのはウェイトの高い能力だと思います。多くのソフトウェアは米国主導ですし、英語圏でない国で開発されたライブラリーでもドキュメントは英語であることが多いです。

自分はOSの言語を英語にしていますが、エラーメッセージで検索するにも変にローカライズされているより原文ままの方が検索した際のヒット率が高いよう感じます。UdemyやUdacityのようなMoocsでも英語の方が安価で良質な教材が手に入ることもあり、一次情報のソースとして英語をスラスラわかるというのは大きいです。

留学/就職経験はあってもいいと思いますが、YouTubeやHuluなどで勉強コンテンツは確保できるので銀の弾丸ではないと思いますね。自分は日本から出たことないですがCEFR C1程度の認知能力はあります。

同じ要領で今は中国語を勉強しています。

最後に

Happy Coding!