電電のブログ

電電生だったひとのぼやき

これからプログラミングを始める君へ

この記事は CAMPHOR- Advent Calendar 2019
CAMPHOR- Advent Calendar10日目 の記事です.

どうも電電です.
今回はプログラミングで困った時にお世話になっているCAMPHOR-のアドカレに参加しています.まさかこれを書く日がくるとは思ってなかったので頑張って書いています.

まあ技術的な話とかでもよかったんですが,今回は要望がより高そうな話を書きます.
最近ちょくちょくといろんな人が「プログラミングを始めたいけどどうしたらいいかわからない」ということ言っていたのを聞いたので,僕がどういった手順でプログラミングを初めてここまできたのかと,いまからもしプログラミングを学ぶなら,どう学ぶかを書いていきます.
最初の方は自分語りなだけなので,俺は,私は,さっさとプログラミング学びたいんじゃあ〜という方は後半部分の「初心者がプログラミングを勉強する方法」を読んでみてください.

目次

どうやってプログラミングを学んだか

プログラミングとの出会い(C言語)

最初にプログラミングを触ったのは二回生の電電の授業でした.Cでジャンケンするプログラムを書いたり,最終課題ではHit and Blowを作って,これを最適に解くプログラムを書いたりしました.今の電電生はこの時点でフルスクラッチニューラルネットワーク作ってるらしいのでインフレが恐ろしいですね.
みんな学校のパソコンを使っていたので,一番つまづくであろう環境構築にはつまづきませんでしたが,如何せんプログラミング初めてだったのでパソコンの挙動に振り回されっぱなしでした.プログラミングって書いたこと以外まっっっっっっっっっったく動かないんですよね.
このことに絶望した記憶がちょっとあります.この頃はまだエラーを適当に読んでたりしましたね.

帰国,それから

今度これの動機とか,経緯については詳しく書こうと思ってるんですが
書きました.
人生のどん底を経験してから,世界一周に旅立った - 電電のブログ
二回生の終わりから三回生にかけて一年休学してました.まあその間何してたかって言うと勉強もせずに世界をブラブラして一周してました.


www.instagram.com
www.instagram.com

それでなんとか無事帰国した時に,作りたいものがいくつかアイデアとしてできていて,それを実現するためにプログラミングを勉強しようと思いました.

その時のアイデアの一つを紹介しときますね.
いろんな国を回ってると英語などのメジャー言語だけじゃなくて,タイ語とか中国語とか,タガログ語とかポルトガル語とかスペイン語とかペルシャ語とかいろんな言語が必要になるんですよね.で全てを学ぶことはできなくても結構ハンドジェスチャーとか単語でなんとかなるもんで(実際はなんとかするんですけどね)色々と意思疎通はできます.
ここの部分をどうにかしたいなあと思っていて,そのためには非言語な意思疎通の方法が欲しくなったんですよね.
これはどう言うことかというと「トイレ」のマークってあるじゃないですか

これって世界中である程度共通で,こう言う共通のマークを使ったり,作ったり組み合わせたアプリを出せれば,どんな辺鄙な土地でも意思疎通ができるんじゃないかと思ったんですよね.
で,これを作るに当たって,web appかappとして作りたいなあと思ったわけです.

さてよくよく考えたら,辺鄙な場所にいって会話しようって言うので基本ネットはないと思って良いはずで,本来であればケータイのアプリを作るのが筋なんですけど,僕はこの時何を思ったかweb appで作ろうと思ってしまうんですよね.
で,一人でこそこそ勉強してたんですけど電電の三回生って普通に忙しいし,休学してたせいで友達はみんな四回生になってしまって課題を教え合う友達もあまりいなくて時間が取れませんでした.

某社へのインターンとか(2017/11~)(Ruby on rails)

で京大生ある意味御用達の某connectでインターン(無給(今考えるとオイオイって感じなんですが))に参加してました.まあインターンと言っても教科書を電子化したものへのアクセス権を渡されて勉強してこいってかんじでした.
(これもオイオイって感じですけど...)
まあ,向こうからしたら勝手に勉強してくれて,そこそこでテストして受かったやつだけ取ればいいので合理的ですよね...
でそこで,いきなりRuby on railsをやって見事に爆死しました.このrailsと言うやつ使いこなせればかなり簡単にwebページとか作れるので便利なんですけど,DBも認証も知らない人がいきなりこれを触ると手順通りにやってるはずなのに,知らないファイルがどんどん増えていって,依存関係がわからなくなって爆発します.僕はしました.ということでこのインターンはあきらめましたね.

まあこの選択肢はミスだと思います.webの知識もろくになく,オブジェクトもよくわかってないのにいきなりRailsはやめるべきでした.
環境構築をする上でmacの方が楽だと言う知見は得ましたが....

機械学習Pythonとの出会い(2017/12~)(Python3)

まあということで,ちょっとRailsをやるのはやめたんですけど,実はRailsをやりつつ,機械学習やりたいなあって思って12月ごろに,

「ゼロから始める機械学習」を買ってました.これは今思えば結構自分の人生を変えた気がします.
これを一ヶ月半くらいかけてやってました.この本の中で使う言語がPython3なんですが,これがかなり入門するのに向いてる言語なせい*1もあってPythonにどっぷりつかりました.
一方で独学の大変さとか辛さを理解し始めて,プログラミングをやっている団体に所属しようとしてました.この時にCAMPHOR-の戸を叩いて,わからない部分を聞きにいったり,どう勉強するのがいいか聞いたりしていました.シバニャンにDM送ってたりしましたね.

ここで,機械学習を一通りやった後に,下のようなtwitterbotを触り始めました.

今はこのアカウント死んでますが...
bot系統は結構手軽に作れる上に使ってもらいやすいし,学べることがかなり多いので,この選択も正しかったと思います.

授業でもPython3使って迷路探索のコード書いたり,life gameを実装したりしていました.
ここら辺ですでにプログラミング楽しい!!ってなっていて,研究室の希望配属先を電気電子ではなく,情報の方にすることを決断してました.

研究室配属(2018/4~)

いろいろあって,全然情報関係ない電子系の研究室に配属されました.
そこの研究が本格的に始まるのが10月とかだったのと,院子勉強の合間にリーダブルコードとかを読んでました.
今でも読んでる名著なのでオススメです.(ただ,初心者の方がいきなり読むとわからないので,プログラムわかってきた方にオススメ)

リーダブルコード

褒めたもん作成(2018/6~)(Python3)

研究室配属全落ちした時とかのメンタルとかを考えて,自分にやれることをやろうという気持ちと,同じように沈んでいる人を助けられるようにしたいという思いもあり,褒めたもんを作りました.
まあここら辺はブログ*2に書いてます.
自分なりの色をだしたbotは使われやすく作りやすいのでオススメです.

日立の研究室にRAとして入る(2018/06~)(Python3)

そろそろ独学に限界を感じてきていて,それをCAMPHOR-のシバニャンに相談したら,バイトを探すのがいいんじゃないと言われて,探していました.
これもかなり自分の人生を変えるきっかけになりました.
たまたま大学の掲示板に貼られていた,日立の強化学習に関する研究室でのリサーチアシスタントのバイトに申し込んで,面接を受けると,スキンヘッドの方がやってきて,機械学習のこと,授業で作った迷路探索のこととかを聞かれました.バイトに受かっても勤務地が吉田キャンパスでその頃桂キャンパスにいた僕は桂から通うことになっていましたし,正直落ちたと思っていたんですが,パッション採用って言われてうかりました.
技術的にまだ足りないけどこの子はできそうだってことらしいです.ここで働けた経験は自分の中で大きかったです.
バイト内容としては論文を読んだり,その実装を行って再現実験をおこなったり,そこからさらにちょっと工夫を加えたりしていました.

実は僕コミさんと入れ替わりで入ったんですよね.んでコミさん同様パッション採用だったらしいです.まあ僕が機械学習始めた時にもコミさんのぶろぐの影響がかなりあったので,まあそういう定め的なものなのかもしれないですね.

AtCoderを始める(2018/06~)(Python3)(c++)

AtCoderをこの頃から始めました.
AtCoderを知らない方に説明するとweb上に問題があって,その問題を与えられた制約(使える計算量,制限時間)の中で解くというものですね.
ここら辺は別に詳しい説明があると思うので調べてください.
情報系の院に進みたかったのと,アルバイトでコード書くことになったので,基本的なアルゴリズムを押さえたかったからですね.
途中からそんな建前はどうでも良くなって楽しくなって研究そっちのけで練習してました.

ホームページ作成(2018/09~)(html, css)

自分の作ったものが溜まってきて,まとめて紹介したいというのと,そろそろwebの勉強をしたいと思って作りました.最初は
https://freehtml5.co/のテンプレートを使って作りました.文字の位置がバグったりしたのと,全体的に作り直したかったのでprogateを一通りやってから一から自分で作り直しました.

卒業研究(2018/11~)

ここら辺は卒業研究ばっかやってました.ただ先輩の扱ってる研究で,画像処理がちょっと必要になったりしてそこらへんのコードをちょこっと書いたり,シミュレーションを回す必要が出てきて,それがlinux機だったので,それのセッティング,シミュレーションをしたりしていました.(結構大変でした)

情報学研究科入学(2019/04~)

晴れて京都大学院の情報系の研究室に配属されました.
ここら辺で,情報系だからってみんながゴリゴリにアルゴリズム書いてるわけではないと気付き始めます.結構コンプレックスになりそうだなって思っていたことがそうでもなかったようです.まあDBとかしらんって感じでしたけど.

ターゲットの自動起き上がり機を作成(2019/07~)(c++)

ブログにも書きましたが,必要だと思ったので,学祭用に自動起き上がりターゲットを作成しました.
これは技術的にはどちらかと言うと電気系の知識の方が入りましたが,自分の思い描いたものを作るという意味ではかなり面白かったです.

夏のインターン(2019/08~)VOYAGE(Go, javascript, mysql, vue)

インターンでweb周りに関する知識(セキュリティ,Go,DBなどなど)を勉強しました.これは別のブログにまとめているので割愛しますが,VOYAGEのインターンは参加できる人は是非参加してみてください!
webの勉強やってみて思ったのが,かなり幅広い範囲を勉強しないといけないので,これを独学でやり遂げれる人はすごいと思います.順序よく勉強すればいけるかもしれませんが,何もわからない状態からいきなりwebに入るのは避けた方がいい気がします.

夏のインターン2(2019/09~)リクルートライフスタイル

こちらはエンジニアとしてではなくデータサイエンティストとしてリクルートインターンにいきました.
このインターンでは,データサイエンスが具体的にどのような仕事を請け負っており,どのようにお金を産んでいるのかみたいなことをみたくていきました.

denden-seven.hatenablog.com

自分のプログラム歴まとめ

自分の遍歴はこんな感じです.
言語的な変遷で言えば
c-> ruby -> Python3 -> html, css -> c++ -> Go, javascript の順.

作ったもの順で言えば,
シンプルなプログラム
twitter bot, 機械学習を使った文字認識, バイト先の論文実装
自分の紹介ページ
起き上がり的
サーバー, フロント
って感じであんまりまとまりがないです.

僕はあまり技術そのものに興味があるわけではなくて,どう言うものを作りたいかどう言う風に作れるかを工夫するのが好きな人なので,
こういった雑食な人になりました.サーバーサイドと機械学習の人間になりたいので(なれるとはいってない)今後はそこらへんを重点的に触りたいと思います.

初心者がプログラミングを勉強する方法*3

最初に勉強すべき言語について

これはPython3だと思います.もちろん賛否両論あると思いますが,書きやすさ,メモリをあまり意識しなくていいことや,コンパイルが必要ないことなどかなり初心者向けだと思います.Pythonの悪い点はたくさんあると思いますが,(遅い, 型推定しているなど)初心者にとって大事なのは技術的に正しいことなのではなく,モチベーションが失われないこと,そのためのわかりやすい言語を選ぶべきだと思います.

どうしてここまでわかりやすさを押しているのかというと一番僕がもったいないと思うのは
面白く感じなくてプログラミング自体をやめてしまうことだからです.
なので是非初心者の方は'最初'は技術的な正しさよりもモチベーション維持を念頭においてみてください.もちろん最終的には必要に応じて必要な言語や技術を選択できるのが正しいです.ただ,技術的な”正しさ”みたいなものを考えるのは今じゃないということです.

どう勉強すべきか

これも諸説ありますが,僕が思う最悪のパターンはプログラミングの参考書を買ってきて,最初から最後まで読んでしまうことです.(これをやってしまって途中で止める人を何人か見た)
正直なところ本に乗ってあることを全て抑える必要は最初はありません.特に最初はプログラミングの本は辞書的な使い方をした方がいいことが多いです.
本に乗ってあること,僕も全部は知らないと思います.
わからない単語があったり,どうしてもできないことを調べたりするのに使いましょう.
あとGoogleと仲良くなりましょう.ぐぐり力をつけましょう.わからないことはまずGoogleで調べましょう.

さて,では次に何を勉強すべきかですが,

まずは簡単な変数や,for, while文,listなどの基礎を理解する

これは
Python | プログラミングの入門なら基礎から学べるProgate[プロゲート]
などが丁寧に説明してくれます.チュートリアルまでは無料なはずなのでここだけでもそれっぽいことは学べます.
本編も月に1500円くらいかかりますが,この充実度でこの値段なら安いです.
この1500円は「一ヶ月でプロのエンジニアになれる!!」みたいな胡散臭いスクールにいく一万倍くらい価値があると思います.(「一ヶ月でプロになれるなら僕は30回くらいプロになってるはずなんですけどね」)

この中で出てくる基本的な部分がわかれば,それを組み合わせることでかなりのことができるようになります.
また,それらの基礎ができたかどうかはAtCoderのA,B問題を解くと自分が理解したかわかるのでいいと思います.
AtCoderは基本的なアルゴリズムの勉強になるので,これ以降でも地力をつけるのにいい勉強になるので,ハマった人は続けるといいと思います.

以下のAtCoder Problemsは過去問を勉強するのに最適です.まずは過去問を解くのがいいと思います.
https://kenkoooo.com/atcoder/#/table/

基礎が終わったら,他の意見もあると思いますが,

作りたいものを見つけましょう.

初心者はモチベーション維持がとても大切です.特に現在の自分にとって直接関係ないものを作ってもあまり嬉しくありません.
ものを作ってみると必要な技術や,欲しい技術が見えてきます.この時できれば,どのような技術が存在するかをできる人にちょっと相談しましょう.
何が作りたいかの形をある程度固めた上で相談するとエンジニアの方は結構相談に乗ってくれると思います.(ただ作りたいものが「便利なもの」とか「かっこいいもの」とかだとエンジニアの人は嫌がります)
(例えば,朝起きれないからだんだん音が大きくなるシステムを作りたいとか,文字を読むのがしんどいので自動で読んでくれる仕組みを作りたいとかのある程度までアイデアが固まったレベルで相談すべきだと思います.)
あとは単純に自分の経歴を載せた紹介ページなどを作るなども勉強になります.後々いろんなものを作ったり就職する時に使えて便利です.
(例 自己紹介HP

ただ注意点としては大きすぎる目標を最初にたてないことです.
みんないろんなアプリやwebサービスを普段使っていて目が肥えていて気づいてないですが,身の回りのものを基準にものを作ると絶対に終わりませんし,満足いくものにはなりません.
いきなりケータイのアプリであったり,webのアプリケーションは作れません.それを受け入れましょう.
その上で自分にとって役に立つものであったり,ちょっと便利なものを作るのがいいと思います.
大きな夢を持ちすぎると長続きしません.ちょっとずつステップアップするのがいいです.
ちょっとずつちょっとずつです.そっちの方が最終的に早かったりします.

ここでわからないことが会ったらgoogleさんに聞きましょう.まずは日本語,できれば英語で調べましょう.いろんなブログとか出てくると思いますが,結局公式ドキュメントが最強です.ドキュメントや,本などを調べてもわからない時はエンジニアに聞くのがいいと思います.(15分調べてわからなかったら,メモしておいて聞いた方が早かったりします.)エンジニアが身近にいない人などは,エンジニアの集まりとかに聞いてみるといいかもしれません(ただしなんでも聞いていいわけではなくどう調べたかや,何がわからないかなどを明白にしないと嫌がられるかもしれません.)

自分の作品と言えるものをいくつか作ったら,githubなどで公開しましょう!!

githubというコードを公開するサービスが存在します.
このgithubのシステムはチームで開発するのにも必須なスキルですし,できるだけ早めに触ることをオススメします.githubの使用経験は絶対に腐らないと思います.
これを使って自作したものを公開しましょう.できればドキュメントを書いて,どのように導入したらいいのか,どういう風に使用するのかを書くといいです.

ここまで自分の力でやり切れた人は自信を持ってください.かなり自走力はあります.
エンジニアは結局わからん事ばっかりの中で調べて,実装して,わからなくなって,調べて,実装しての繰り返しです.
特に必要な能力は自走力です.自分で調べて,わからなくなったら質問を明確にした上で聞きに行ったり,テストしたりする力が大事です.
それを続ければ,いろんなことができるようになります.

技術を生かせるバイト先やインターンを探そう!

ここまでできた人は,自学自習できる基礎ついているはずなので,作ったものを持って,コードを書くことができるアルバイトやインターンを探すといいと思います.
僕は日立の研究所に入ってオブジェクト思考のなんたるかや,リファクタリングの自分にあったやり方,linuxの使い方,その他諸々の技術に関して勉強できました.
面談で作ったものの利点や,作るなかで工夫したこと,自分なりに困ったことなどを紹介すると,効果的です.実際に物を作ってそれの弱点や利点を事実として述べることができ,さらにその思考の過程を述べることはとても評価されます.(特に学生!!!)
(ただし,学生エンジニアを安くこき使おうとする会社も中には存在するので,会社はいくつかみた方がいいと思います.)
できるだけコードをみてくれて,コードレビューをしてくれるところを探しましょう.
ちゃんとしたところはある程度努力して,それを公開していれば評価してくれます.

さらに自分の作りたいものを作ったり,公開しましょう.

お疲れ様でした.晴れてこれでエンジニアの端くれです.これからも努力と精進,謙虚な心を持って前に進んでください.

まとめ

まとめると
基本的な部分をprogateなどで抑える -> 自分の作りたいものの最小の機能を作成する ->  自分のコードを公開する -> アルバイトやインターンを探す
という感じです.

終わりに

これを読んだ君がエンジニアとしての人生を歩み,楽しむことを僕は心から祈っています.
プログラミングは難しいところもありますが,一方でたくさんの楽しいところを教えてくれるものです.
自分の作りたいものを作れる喜びと,自分で作ったものを使ってもらえる嬉しさをいろんな人が体験、経験し,寛容で,楽しいと思える社会がくることを僕は望みます.

僕のブログを読んでプログラミングを勉強する人が増えてくれればこれ以上作者冥利に尽きることはありません。
ここまで僕の長文,駄文を読んでいただきありがとうございました.

ほなまた
電電


追記 2020/11/10
Python3じゃなくてNode.jsの方がfrontもできるしいいのでは?と言われたのですが,Node.jsでもいいんじゃないかなあとは思っています.どこまでいってもここらへんはポジショントークになっちゃうので,これを書いた時の僕が勧めるならという話です.5年後にはもっとわかりやすく使いやすい言語がでてるかもしれません.

*1:諸説あります

*2:褒めたもんについて(コンセプト編) - 電電のブログ

*3:あくまで一つの意見として書いています