プログラミング1年くらいやってつまづいたこと

プログラミングを本格的に始めてから1年くらい経ったので、今まで印象に残ったつまづきポイントを書いておく。

C言語

去年の今頃は 42 Tokyo の Piscine に参加していた(そのときの記事)。

このときはC言語でひたすら libc の再実装をしていた。それまでは Python や JavaScript でちょっとしたスクリプトを書いただけでC言語を書いたことが無かったのでとても辛かった(毎日100回の Segmentation fault を見る生活を4週間続けた)が、コンピュータの基礎に近づけた気がした。メモリをいちいち人間が確保したり解放したりしなきゃいけないというのがとても面倒だった覚えがある。

ところで、人間がコンピュータを使って何かしらの課題を解決しようとしたときに突き当たる壁として、ハードウェアやソフトウェアにそれぞれ多数の階層が積み重なっていて、どこで何が行われているかということを知らないと調査したり解決したりに時間がかかるという問題がある。

そういう意味ではいわゆるシステムプログラミングというか低レイヤーのプログラミングにも興味がある。ただ、今の自分は初心者プログラマーに過ぎないし、レイヤーに限らずソフトウェアエンジニアリング的に難しい仕事を任せてもらえるような立場ではない。これはプログラミングを続けていくしかない。

C言語は辛かったので最近 Rust を始めてみたが、これはこれで別の辛さがあった。ただコンピュータを使って問題を解決する仕事でお金をもらう以上、いずれ避けては通れない分野だと思っている。

CSS

CSS って難しくないですか?

そもそもどこに何を書いたらどうなるのか全然分からないし、どのプロパティが継承されるかも分からない。あと Web サイトを作るときにどこからどこまでが CSS の仕事なのかもよくわからない。

今はとりあえず flexbox でひな形を作り、 Chrome の Dev Tools で Element を見てコピペしている。

デザインのセンスが致命的に無いので自分で CSS を書くのが辛いが、これも結局書いて慣れるしかないと思っている。

JavaScript

JavaScript は文法そのものはそれほど難しくないと思うが、 Promise の概念を理解するのに1ヶ月くらいかかった。Promise は非同期処理を抽象化したオブジェクトで、結果を使って成功と失敗を分岐させるのだが、その非同期処理という概念そのものがよく分からなかった。

この変数が undefined になるのでなんでだろう〜と苦しんでいた記憶がある。結果としては、下記の Web サイトを上から下まで5回くらい読んでだいたい理解できた。

https://azu.github.io/promises-book/

プログラミングを始める前は「プログラムというものは人間が実現したい命令を予め決められた文法に従って記述した文や式である」と考えていたが、実際にはそれらの命令を抽象化する概念やそれを実装したオブジェクトや関数がたくさんあって、それらを知らないで文法だけ知っていてもやりたいことを実現するのは難しい。

例えば人間の直感からすると同期的なプログラミングの方が分かりやすい(と信じている)が、コンピュータ資源やユーザー体験の側面から見てそれが適切だとは限らない(ので、非同期プログラミングが誕生した)。文法だけでなくそれが導入された背景とか今まで積み重ねてきたものを理解しないとなかなか自分のやりたいことができないという辛みがある。書いてて思ったけどこれプログラミングに限らないな。

要はやっていくしかない。

そもそもの話

データ構造とアルゴリズム

再帰とかソートみたいな基本的なロジックから先にあるやつ(グラフ探索とか動的計画法とかなんとか優先探索とか)が全然分からない。

競技プログラミングの AtCoder を半年くらいやってみたけど Rating 324 で止まった(灰色)。これも勉強してプログラムをひたすら書いていくしかない。

どこに何を書くか

仕事のプログラムを書いていて、動くには動くんだけどこれここに書いていいんだっけ?という場面が無限にある。

やるべきことはリクエストを解析して加工し ORM の関数を通じてデータベースに書き込むことで、極端にいうと一つのファイルに全部書くこともできるのだが、これはどこまでをビジネスロジックとして x に書き、どこまでをデータを操作する関数として y にまとめるか、どこでどうやって受けとったデータを validate するかみたいな整理がどうするのがいいのか分かったり分からなかったりする。

これもひたすら書いてレビューしてもらって感覚を身に着けていくしかない。

まとめ

要はプログラムをたくさん書き続ければ解決する問題だと思った。