四十三庵

蔀の雑記帳

プログラミングを学ぶにあたって詰まったこと

エンジニア界隈で「プログラミングを学ぶにあたって詰まったこと」を書くのがプチ流行っている。

satoru-takeuchi.hatenablog.com
mizchi.hatenablog.com
kirimin.hatenablog.com

僕の場合、やや特殊な経歴なので、書いただけでわかる人には個人特定できてしまいそうだが、まあ特定されても問題があるわけでもないし、
自分の経験書いて誰かの役に立つ可能性を優先したいので、つらつら思い出して書いてみることにする。

普段の当ブログの読者層からすると、ちょっと訳わかんない話になるかもしれないけど、そうなったらごめんなさい。

目次

プログラミング歴

  • 学生時代
    • 2009〜2011 大学の授業で多少VBAをいじる→何もわからん
    • 2013/4 IT企業から内定もらったので、独学でJavaやりはじめる→何もわからん……プログラマのバイトも落ちる
    • 2013/8 ワークスでDelphi→プログラミングチョットデキル(詳しくはnoteに書きました)
    • 2013/11 基本情報とる
  • SI
    • 2014/4 研修でJava→余裕
    • 2014/7 現場でIBM系アセンブラ/JCL
    • 2014/11 応用とる
    • 2015/4 業務改善でVBA/VBS。HTML/CSS/JSも勉強してた
    • 2016 SC、DBとる。年末年始でiOSアプリつくろうとして挫折
    • 2017 真面目にアセンブラ書く案件があって成長
    • 2018 仕事忙しくて技術伸ばす暇なかった(?)
  • Web
    • 2019 iOSエンジニアとしてSwift

こう見るとマジで変な言語ばっかやってんな……

前提

  • Javaのセミコロンがウザかったとか、main関数ってなに?とか、細かい話は省略。
  • 自分にとって高かった壁を書く
  • 詰まったこと/解消法にわけて書く

詰まったこと

環境構築ができない

特に学生時代。
周りに教えてくれる人もいなかったので、独学だとまず環境構築で詰んだ。
学生時代はずっとWindows XPとWindows 7のPC使っていて、内定もらう前後でMacbook手に入れた気がする。
たしかEclipseでAndroid開発しようとして苦しんでいた記憶。

ループや条件分岐の閾値をミスる

以上、以下、未満とか。
配列の添字が0始まりとか。
わざわざ配列の初期値を潰して、i=1から使う、みたいなコード書いたこともありました。

オブジェクト指向の壁

クラスつくるメリットがわからなかった。
VBA書きながら、クラスつくったほうがいいのか? とか考えてた気がする。
少なくとも入社して一年目の時はわからなかった。

まあ配属後オブジェクト指向など一切ない世界線に行くので業務上問題はなかったが‥…

ミドルウェアわからん

研修でインフラ研修というのがあって、グループでサーバー側の設定構築したことがあったが、正直全然わからなかった。
Apache? Tomcat? 何だこれは、という感じだった。
(今思うと習ったミドルウェアもちょっと古めだったが)

Githubわからん

社会人二年目、だから、2015年くらい、業務でやっている環境が古かったので、
外に出て技術的なキャッチアップをしようと思ったことがあって、ハッカソンに参加した。
緩めのハッカソンで、エンジニアオンリーじゃなく、デザイナーとかディレクターとかもいる雰囲気だったが、
僕はバリバリのエンジニアチームに入った。
フリーランスでやってる人とドワンゴの人と僕という三人チームだったが、正直全然役に立てなかった。

「じゃあGithubでレポジトリ作って、三人で役割分担してpushしてく感じでいいですよね?」
「あ、ざっくりしたクラス構成だけ決めときません?」
みたいな感じで進んでいく。
そういうスピード感を求めていたけれど、実際に体感してみると全然ついていけなかった。
Githubがやっぱ高い壁だった。

iOS開発わからん

社会人三年目くらいになると、仕事はそこそこできるようになった感じがあったが、
社内の特殊環境でバリバリ動けるというだけで、本来やりたかったWebシステムの新規開発みたいなことは全くできそうにないという感覚があった。
そこで年末年始の休みのまとまった時間を使って、iOSアプリを作ってみるか〜と思うに至った。
多分2016年の年末。

ドットインストール見ながら、ポチポチやってみたんだけど、これがまあわからない。
「StoryboardにUI部品を配置して行って、制約をつけましょう。
 そしてContorolキーを押しながらドラッグすると、コードの中に部品を紐づけることができます」
みたいな説明。
言う通りにすれば最低限のサンプルはできるが、到底納得できるものではなかった。

アセンブラわからん

2017年頃、業務で満を辞して新規プログラムがっつり書く案件が入って、
タイミングよく開発者として入れて、アセンブラとはいえガリガリ手を動かせる貴重な機会を得られたんだけども、
それまでやっていた案件の小幅改修と比べると圧倒的に難易度が高く、一時期は結構しんどかった。

解消法

環境構築ができない

これは会社入ったら解消した。
会社の中には環境構築をやったことがある人なんてたくさんいるし、手順書もあって、
独学のゼロスタートと比べると断然楽。

ある程度成長すれば、個人ブログなりQiitaなり見て、扱ったことがないOSSでもスッと入れられるようになると思う。

ループや条件分岐の閾値をミスる

慣れ。
あと、モダンな言語だと閾値はわかりやすく書けるので、間違えなくなっている。

例えばSwiftであれば、

// 配列の要素全部処理する 
let array = [1, 2, 3, 4, 5]
print(array.reduce(0) { $0 + $1 }) //15

こんな書き方で、配列の総和を返すことができる。
(最近のバージョンなら、Javaでも多分できる?)
Javaの研修受けていた頃だったら、多分下記のような書き方をしただろう。

// 配列の要素全部処理する 
let array = [1, 2, 3, 4, 5]

var i = 0
var returnNum = 0
while i < 5 {
    returnNum = returnNum + array[i]
    i = i + 1
}
print(returnNum)

そら難しいわ、という話である。
ましてやプログラミング初心者であれば尚更だ。

オブジェクト指向の壁

これは下記の本を読んだら、だいぶすっきりした。

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

  • 作者:平澤 章
  • 出版社/メーカー: 日経BP
  • 発売日: 2011/04/07
  • メディア: 単行本

この本の知識を持って、読み書きしていくと、だんだんわかってくる‥…と思う。

ミドルウェアわからん

これは一社目でやった仕事がミドルウェアだったので、その経験からわかってきた。
要はアプリケーションがあって、OSがあって、その間にいるのがミドルウェア。
なぜわかりづらいのかというと、ユーザーからすると存在を意識しないからだ。

Githubわからん

今となっては当たり前みたいに仕事で使っているが、長い間苦手意識がとれなかった。
これはマジで使って慣れるしかないと思う。
逆にGithub使うような環境に行かないと、本読んで、ちょっと自分でいじってみるだけだとなかなかわかるようにならないと思う。

iOS開発わからん

転職のために死ぬ気で勉強したら、何とかわかってきました。

モバイルアプリ開発、昔は簡単に作れるよ!みたいな雰囲気あったけど、
iPhoneの登場から10年たって、普通にめちゃくちゃ複雑化していて、一週間くらいちょちょっと勉強したらある程度把握できる、
みたいな世界ではなくなってしまったように思う。

アセンブラわからん

とにかく死ぬほどデバッグしました。
コード数行書いてはコンパイルしてデバッグして、吐いたエラー内容からコードの挙動を察する、みたいなときもありました。
なにせ情報がなかったので‥…

まとめ

書いてて途中で気づいたんだけど、あんまりプログラミングの具体的な話してないね‥…
ちょっとタイトル詐欺になってしまった。

あと、冒頭で一番に紹介したブログの末尾の言葉、好きです。

最後になりますが、プログラミング初心者は何かにつまづくと「それくらい知っていて当然」とか
「これが理解できない奴はセンス無い」とかいう暴言が飛んできがちですが、狂犬が吠えていると思って無視しましょう。

僕は仕事をはじめてから、常にこんな気持ち↓で働いています。

f:id:st43:20200117163429p:plain

まあしかしわからないなりに、プログラミング歴も気づいたら七年に突入しようとしている。
プログラミング適性については、理系・文系・才能・男性女性、その辺りはあまり関係ないと思っていて、
自分がやってみてイケる感じがするんならイケるんじゃないだろうか。
年収1000万超えるようなスーパーエンジニアとなると、ちょっと大変だけれど、
日本のIT企業で年収500〜700万のレンジでやっていくくらいなら、ほとんどの人が行けるように見える。

僕自身はいまだに大したレベルじゃなく、偉そうなことを言える立場ではない。
自分のアイデンティティもエンジニアであることに置いていない。
(僕の場合、職業がアイデンティティにならない気がする‥…)
けれど仕事でコーディングしていると、一日の時間があっという間に過ぎて行って、充実感がある。
よりきれいなコードを書きたいと思うし、より適切なデータ構造で、より早いアルゴリズムを使いたい。

プログラミングのパラダイムももっと変わってくんだろうな〜とも思う。
AIにプログラマが代替される、とかは与太話だと思っているが、
2000年代に手続き型言語からオブジェクト指向へのパラダイムシフトが起こったように、
今の常識が激変するみたいなことは起こるだろう。
てかまあ関数型言語とパブリッククラウドがこれだけ流行っている時点で、もうパラダイムシフトの中にいるのかもしれない。

なんだか「詰まったこと」というより、ただの思い出話と呟きで終わった気がするが、これで終わり。
何かの参考になれば幸いです。
(了)