社会人1年目、プログラマなりたての時に上司に言われていた言葉がある。
「急がば回れ。基礎を築きなさい。」
基礎がなければ、その上の応用的な技術など身につきません。
PHPを理解できていない方がPHPの FW を用いて Webアプリケーションを作ろうとしても、FWのルールに忙殺されてまともなものはできないでしょう。 基礎力が身についていなければ、公式文書を読んでも理解度が低くなることを想像することは用意です。
「基礎が大事」という言葉があったからこそ、エンジニアになって7年目になろうとしている今でも基礎を愚直に大事にしている自分がいます。
そんな若輩者の私にも後輩ができ、部下と言えるような方々ができるようになりました。技術的な指導を任されてもいて、基礎を気づく事の大切さを伝えています。
本当に技術者になりたいのであれば、技術の基礎を作れと同僚、後輩にはしつこく言っております。
— ばぁど (@UltraBirdTech) January 28, 2020
同じ環境にずっといて技術が固定化するのが問題ではなくて、基礎を身につけられない環境にいて特定の技術しか扱えなくなるのが問題な気はする。
— ばぁど (@UltraBirdTech) February 16, 2020
なんかIT系で苦しんでいる人の中には、若いうちに技術の基礎を身につけることができなくて、常に苦しいみたいな人たまに見る。
— ばぁど (@UltraBirdTech) February 15, 2020
しかし、最近の悩みは技術者としての基礎をどのように築くかの、 How が思いっきり抜けてしまっていることです。
技術の基礎をしっかり築けと口酸っぱく言っているが、何が技術の基礎なん?って聞かれたら黙り込む自信ある←
— ばぁど (@UltraBirdTech) February 3, 2020
そこで今回は自分自身が基礎力をどう身につけたかを、次メンバーに話すタイミングがあったときのメモとして置いておこうと思います。
プログラマとしての基礎
繰り返し構文と条件分岐
プログラマとしての基礎は、まずは繰り返し構文と条件分岐だと考えています。
for
とif
ですね。
どんなに簡単なプログラミング言語の入門書を手にとっても、このfor文
とif文
は最初の方のページに掲載されているものです。
個人的な感覚ですが、大抵のプログラムはfor
とif
を書けないとまともに動くプログラムはできません。
これらを覚えるためには有名なfizzbuzz
や、数年前にバズったズンドコなどを課題として与えてあげればいいかなと思っています。
クラスを意識させること
次段階として、クラスを認識することです。 クラスを理解できていない人には業務ロジック触らせません。
オブジェクト指向難しいけど、オブジェクト指向は最適解よ。オブジェクト指向までいかなくても、Classを理解できない人には業務ロジックは触らせることはできないっすな。
— ばぁど (@UltraBirdTech) February 14, 2020
いわゆる、タイヤキクラスでも動物クラスでもいいです。 クラスを理解できればいい。 ※タイヤキも動物も例として微妙なので私はあまり使わないですが
個人的に教えていて一番反応が良かったのはポケモンですね。
from random import choice class Pokemon(): def __init__(self, name, attribute, moves, is_mega=False): self.name = name self.attribute = attribute self.moves = moves def attack(self): print(choice(self.moves)) class Pikachu(Pokemon): def __init__(self): name = 'Pikachu' attribute = 'thunder' moves = ['thunder shock', 'iron tail', 'Volt Tackle', 'Grass Knot'] super().__init__(name, attribute, moves) p1 = Pikachu() p1.attack()
ポケモンクラスという親クラスがあって、ピカチュウやリザードンはポケモンクラスを継承して定義される。
is-a
関係を表しやすいのもポイントです。
教えるときは、ポケモンクラスを例にして身の回りのものや自分の趣味のものをコードで表すように指示しています。 (ただ、あまりいい例が思い浮かばない・・・)
ちなみに、オブジェクト指向とクラスは別物という認識です。 オブジェクト指向を理解せずとも、一旦クラスは理解できるは。 クラスとオブジェクト指向を一度に理解しようとすると、難しすぎるので初学者にはクラスとオブジェクト指向は分離して教えるようにしています。 オブジェクト指向を理解している人が綺麗なコードを書けることを大前提として、後からジョインする人がクラスさえ理解できていれば、それらの綺麗なコードを参考にコードを書くことが可能です。
新人プログラマにとってはキツイかもしれないが、バリバリclassを用いて、オブジェクト指向で書かれたソースコードを投げつけるしかないんだろうなと思ってる。
— ばぁど (@UltraBirdTech) February 17, 2020
一つの言語に深く潜ること
一つの言語に深く潜って勉強することを教わりました。
それに従って、言語がどのようにメソッドを探索しているのかや、言語ごとの特徴を把握しやすいというメリットがありました。
例えば、私は Ruby が一番得意な言語だと自負しております。 というものの、Ruby でプログラム言語のノウハウを学んだと考えているからです。
Ruby は資格勉強(Silver, Gold)も行ったので愚直にメソッド名や動きを記憶しました。
Ruby は愚直にエンジニアとして成長をしていた時期だったので、1時間ずっと Ruby のメソッド一覧を眺めたりとか、Ruby Silver / Goldの勉強をしたからRubyによる表現力は他の言語に比べると自信はあります。
— ばぁど (@UltraBirdTech) March 18, 2020
また、メタプログラミングRubyも読んだので Ruby でメソッドチェーンなどを学びました。オブジェクト指向も同様です。
社会人3年目〜4年目で Ruby を愚直に勉強し、一つの言語に深く潜ったからこそ、その後PHPを勉強し直したときや、Pythonを学んだときは Ruby と同じような感覚で勉強を行うことができました。
IT関連の基礎を養うために読むべき本
本をたくさん読みました。
これも一年目の時に言われたのですが、本やクラウドに勉強として払うお金は自己投資と教え込まれたからです。
リーダブルコード
プログラム書く人なら言わずもがなの名著。 ソースコードをいかに読みやすく書くかのノウハウが詰まっている。 プログラムは書くことより読む事の方が多い。だからこそ、万人が読みやすいコードを書くことを心がけるって大事。 本の中身も冗談が入り混じっていて、とても分かりやすく、面白い。
プログラムはなぜ動くのか
プログラムがなぜ動くのかを解説してくれている。 ぶっちゃけ、大学の講義とかで教わることができるレベルのことが、一冊に詰まっている。
ネットワークはなぜつながるのか
プログラムはなぜ動くのかと同じ。 大学時代にこんな講義を受講したなーという思い出(講義内容は覚えていない←)
マスタリングTCP/IP
プログラマではなく、ネットワークの知識が必要な時の鉄板本だと思っています。 ネットワークの歴史から書いてくれているのが、とても良い。
Webを支える技術
プロになるためのWeb技術入門
まとめ
結局、自分がエンジニアとしてどう勉強してきたかの振り返りになった気がする。
これで基礎をどう築くかの問いに対しての答えを用意できたと思っています。