プログラマーとして社会人になったけど高校数学を1から独学している

この春からプログラマーとして働くようになりました。今まで色々と開発系の勉強を中心にしていましたが、最近はもっぱら高校数学を独学しています。

勉強しようと思ったきっかけ、教材として使っている『長岡の教科書』の紹介について書いていきます。

勉強しようと思ったきっかけ

まず前提として、僕は高校を中退しています。空白期間を経て情報系の専門学校に入ったのですが、その際に取った高認も、英語だけを受験して取得したという経緯もあり、高校以降の勉強の知識がごっそり抜けてしまっています。
その後、専門学校に入ってから基本情報技術者試験を受験することになったのですが、そこで出てきた集合や対数、数列といった知識が全くないため(Σってなに状態)、数学の知識の欠如を感じたものです。

なんとなく数学コンプレックスを抱えたまま過ごしている折に、2014年10月発売のWEB+DB PRESS Vol.83のインタビューにて、宮川達彦さんが「数学、コンピュータサイエンスの基礎を学ぶことは大事。基礎がしっかりしている人のほうが伸びがいい」とおっしゃっているのを見て、Rebuildファンボーイとして、「やっぱ数学勉強せねばならんな」と思わされました。(最近のRebuild 132でも数学の話題があったりしましたね)

また、日進月歩で進化・衰退を繰り返していくライブラリやフレームワーク、言語などをキャッチアップしながら勉強するよりは、長い年月を経て確立された学問である数学を学んだほうが、遠回りに見えて案外時間を投資する価値がもっとあるのではないかと思いました。
数学なんて四則演算さえできてればプログラマーとして十分だと言う人もいますが、このまま数学コンプレックスを抱えたまま生きていくのも嫌なので、独学してしまおうと思い勉強に至っています。

教材は『長岡の教科書』

「知の巨人」とも呼ばれる元外交官の佐藤優さんは、『読書の技法』という著書の中で、基礎知識を身につける教材として教科書を勧めています。そういったこともあり、数学を学ぶ教材として教科書を選ぶことにしました。ただ、教科書というのは授業で使われることを前提としてあるため無味乾燥になっており、独学に単体で使うには不向きともいえます。

そこを補ってくれるのが僕が利用している、明治大学理工学部特任教授の長岡亮介先生による『長岡の教科書』です。

【音声DVD-ROM付】長岡の教科書 数学I+A 全解説

【音声DVD-ROM付】長岡の教科書 数学I+A 全解説

この本は、検定教科書にプラスして、音声講義と問題の解答&解説がついています。

まず、音声講義ですが、独学者にとっては最低限のことしか書かれていない教科書に彩りを添えてくれるため一番ありがたい要素でしょう。 例えば有理数無理数の単元の音声講義では、1/3 = 0.333… であるので、両辺に3をかけると、1 = 0.999… となるといった面白い話が聞けます。
また、「不等式を解く」ということには根底には論理が隠れている、つまり同値変形に過ぎないといった、数学を独立した単元ごとに考えるのでなく、数学全体として考えることの大切さが繰り返し説かれています。

解答&解説については、教科書を単体で買うとついてこないため非常にありがたいです。ただ、音声講義に比べると解説はあっさりとしたものとなっており、途中の計算過程などが省かれていて理解に苦しむものがあったりしており、そこは少し不満かもしれません。

目標

漫然と勉強しても知識の定着を確認できないので、数検を目標に据えて勉強しています。年に3回実施されているため、焦らずに勉強が追いついてきた段階で受けていこうと思っています。

最後に…勉強仲間募集しています

Studyplusというサイトにて勉強の記録をつけています。同じようにプログラマーで数学を勉強されている仲間を募集しています。よかったらフレンド登録をお願いします。

【音声DVD-ROM付】長岡の教科書 数学I+A 全解説

【音声DVD-ROM付】長岡の教科書 数学I+A 全解説

【音声DVD-ROM付】長岡の教科書 数学II+B 全解説

【音声DVD-ROM付】長岡の教科書 数学II+B 全解説

競技プログラミングに参加するためにC++の勉強を始めた

久々の投稿です。 表題の通り、競技プログラミングに参加するためにC++の勉強を始めました。

始めたきっかけは色々あるのですが、主な理由としてモバイルアプリ開発に行き詰まったことが挙げられます。

モバイルアプリ開発の難しさ

行き詰まった原因として、AndroidiOSアプリ開発を目標に勉強をしてきたのですが、それを活かすためのアプリのアイデアが自分の貧弱な想像力では湧かなかったというのがあります。
さらに、AndroidiOSとも、目まぐるしく開発環境や仕様などが変わっていくので(特にiOSSwiftの関係で顕著)、ある程度落ち着くのを待ってから取りかかった方がいいのではないかと思いました。

アルゴリズムとデータ構造は普遍的

その点、アルゴリズムとデータ構造を実践しながら学べる競技プログラミングは、課題というものが出題者から与えられる上、普遍的であり、プログラミング力を鍛えるにあたって地となり肉となってくれるものであると考え、勉強を始めようと思いました。

なぜC++

Javaが使えるならそれでいいんじゃないかという見方もあると思いますが、C++を新たに学ぼうと思った理由は、単純に新しい言語を触ってみたかったという欲求と、AtCoderの上位提出を見てみるとC++がほとんどを占めていること、今年出た『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』というAOJの問題を解きながらアルゴリズムとデータ構造を覚える本で使われているのがC/C++だったためです。
特にこの本は競技プログラミング攻略のバイブルとも言える『プログラミングコンテストチャレンジブック』への橋渡しをしてくれそうなので興味をそそられました。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

予定している勉強の進め方

最初に取りかかっている書籍は『Accelerated C++』という本で、他の言語の経験がある人にとってC++を学ぶ一番の近道との評判だったので選びました。
ただこの本はけっこう古い本なので、これを読んだあとに『A Tour of C++』というC++11対応の、C++作者自身による短いクイックガイドを読んでから、『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』に進もうと思っています。

Accelerated C++: Practical Programming by Example (C++ In-Depth Series)

Accelerated C++: Practical Programming by Example (C++ In-Depth Series)

A Tour of C++ (C++ In-Depth Series)

A Tour of C++ (C++ In-Depth Series)

初めてAndroidアプリをGoogle Playに公開しました

去年の2月ごろからAndroidアプリ開発の勉強を始めて、今日ようやくGoogle Playにアプリを公開することができました。何個か作ったアプリはあったのですが、公開するには地味すぎたり、作りかけで終わってしまったりしたので、今回は公開するまで完成させると決めて作りました。

こちらのアプリになります。
Book Quotes - 本の引用登録・閲覧アプリ 4.0.3 以上
カテゴリ: 書籍&文献
Google Playで詳細を見る

どんなアプリか

アプリの内容としては、気に入った本の引用を登録して閲覧するアプリになっています。登録した引用のなかからランダムに表示するというものをメイン画面にもってきました。こうすることで、登録してしばらく経ったあと、思いがけない引用との出会いがあるかもしれないと思ったからです。このへんのランダム表示は、がみさん(id:shgam)のWebアプリにインスパイアされてます。

機能的にはシンプルなアプリですが、Web APIJSONの使い方や、Content Providerの使い方、GridViewなど、作っていて勉強になるものでした。

改善点

ただ、デザイン面はMaterial Designなど全く考慮せず、標準Widgetのみで構成しており非常に簡素になってしまっているので、そのへんは今後どうにかしていきたいところです。Nexus 7をメインに開発したので、スマホでどう映るかあまりテストしておらず、レスポンシブにもなっていないのも反省点です。

他にはメイン画面で画面を回転すると引用が更新されてしまうという点が解決できませんでした。setRetainInstance(true)とか使ってみたのですが、ダメでした。FragmentPagerAdapterの挙動をよく理解していないからかもしれないです。

今後

今度としては、やはりもっといいアイデアのアプリを作りたいです。このアプリのアイデアを友人に話したところ、「Kindleのハイライトでいいじゃん」と言われて何も言い返せませんでした。一応引用を手入力する手間がある分、記憶に残りやすいという利点はあると思いますがちょっと苦しいです。
そういうところもあって、すごいアイデア生み出したい、ということで、『アイデアのつくり方』を読んだりしてみています。

アイデアのつくり方

アイデアのつくり方

あとは、DB周りが面倒くさすぎるので、次はO/R Mapperを使ってみたいです。Active Androidあたりが主流になるのでしょうか。

そして、せっかくAndroidオープンソースなんだし、もっとソースコードを読めるようになりたいです。ライブラリのコードなんかも読みながら勉強していきたいところです。

参考文献

最後に、このアプリを作るにあたって特に参考にしたもののリストを載せておきます。

Udacity: Developing Android Apps ファーストインプレッション

昨日から公開されている、UdacityGoogleが提携して作ったコース、How To Develop Android Appsを、Lesson 4aを終えたところまで進めました。内容的には、Sunshineという天気アプリを作りながらAndroidについて学んでいく、プログラミング経験者向けのある程度上級者向けコースとなっています。

ここまで進めてみての印象を箇条書きで書いてみます。

良い点

  • Googlerが講師なので安心。
  • 使うIDEAndroid Studio
  • Udacityのコース全般に言えることなのだけど、理論と実践のバランスが良い。

悪い点

  • コードを伴うクイズのほとんどは、指示されたことができたかどうかの確認だけ。他のコースのようにブラウザ上のIDEに直接打ち込んで正解かどうか判定するものが少ない。
  • これを書いている時点で字幕がついてないので辛い。

Web APIの使い方やJSONの扱い方の他、テストについても触れており、随所にTipsも盛り込まれていて、実践的に作りながら学べていい感じです。

他にUXにフォーカスしたUX Design for Mobile Developersも開講しているので、こちらも受講してみようと思います。

Smashing Android UIを読了

iOSアプリ開発に手を出してみて感じたのは、やはりAndroidと比べてどちらが難しいとか簡単とかいうところは無く、どちらも細部までいじろうとすると難しいということでした。特にデータベースの扱いや並行処理なんかは共通して面倒が多い部分に感じました。これは何もモバイルアプリ開発に限ったことではないと思いますが。とにかく、どちらが楽ってことは無いということが分かっただけでもiOSを触ってみてよかったと思います。

というわけで結局Androidアプリ開発に舞い戻ってきました。まずは途中まで読んでいたSmashing Android UIを最後まで読むことにしました。

この本はAndroid UI Patternsを運営しているJuhani Lehtimäki氏によるもので、第1部がユーザーゴールやペルソナといったUXを高めるための手法やコーディングを始める前のツールや考え方、第2部がAndroidプラットフォームの機能とUIコンポーネント、第3部がAndroidでのスケーラブルなデザイン、第4部がアンチパターンも含めたAndroidのUIデザインパターンという構成になっています。

ポップアップは原則として使わないといった、ユーザー視点から見ることの重要さが繰り返し強調されています。
よくiOSのデザインをAndroidにそのまま持ち込んじゃいけないと言われますが、その理由として、ユーザーが複数のスマートフォンを所有していることは滅多にないからと書かれていてなるほどと納得しました。

各章ごとにちょうどいい長さでよくまとまっていて、Google公式のDesignガイドを読む前にこれを読んでおくと全体像が見えていいんじゃないかと思います。

Smashing Android UI レスポンシブUIとデザインパターン

Smashing Android UI レスポンシブUIとデザインパターン

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition)を読了

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition)を読み終わりました。
まえがきに、「概念を学び、すぐに実践することがプログラミングを学ぶ最良の方法」と書いてある通り、他のBNR本と同じく、コードをたくさん書いていく、かなり実践的な内容の本でした。

まずはCのコマンドラインツールを作りながら、3章から12章まで、変数や関数、条件分岐やループといった、プログラミングの基礎を学んでいきます。このへんは他の言語でプログラミングの基礎は学んでいて、Objective-Cだけ学びたいという人には少し退屈かもしれません。ただ、関数の章で、フレームやスタックといった概念まで説明しているのは入門書としては丁寧だなと思いました。少しですが再帰まで登場します。

13章からいよいよObjective-Cについての内容になり、Foundationタイプのコマンドラインツールを作りながら、クラスやオブジェクト、Objective-C固有のNSStringやNSArray、プロパティ、コレクションなどについて学習していきます。このあたりでもメモリの管理などについても触れられています。

コールバックについて学習したあとで、31章ではiOS、32章ではCocoaで、簡単なto-doアプリを作る章が続きます。iOSでは一切Storyboardsを使わずコードで書く方法を取っていて、こういうやり方もできるのかと勉強になりました。反対にCocoaではxibを使ったやり方をしています。そのあとはObjective-CとCの高度なトピックの章のあと、最後にObjective-Cのランタイムについての付録で終わりとなっています。

最初に書いたように、実際に手を動かしながら学んでいくスタイルの本なので、とても楽しく、一気に読み終えることができました。Challengeという章末問題用のアプリも含めると、42個ものアプリが出来上がっていました。多くのコードを書くことで、Objective-Cの独特の記法にも慣れることができたように思います。

これでObjective-Cの初歩はつかめたので、次は同じBig Nerd RanchのiOS本に移ろうと思います。

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) (Big Nerd Ranch Guides)

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) (Big Nerd Ranch Guides)

iOSアプリ開発に手を出してみてる

Android開発を始めたばかりの僕が読みたかった本 - RejasupoemAndroid開発を始める上でおすすめの4冊を参考にして、Effective Javaを読んでいたのですが、あまりの難しさに挫折してしまいました。全然初心者の域を脱していないんだなということを痛感しました。そこで、なにか気分転換をするかと思い、せっかくMacもあるんだしということで、iOSアプリ開発に手を出してみました。

まずはRebuild.fm 39でも少し話題になっていた、アップル公式のチュートリアルであるStart Developing iOS Apps Todayをやってみました。必要になる知識の説明をしたあと、Tutorialで実際にXcodeを使ってStoryboardsやコードを弄っていくという流れで、ToDoアプリを作りながら学べるチュートリアルです。よく出来ていて、iOSアプリ開発がどんなものかつかむことができました。やはり手を動かしながら学ぶスタイルが自分には合っていると思いました。

次はAndroidでもお世話になったBig Nerd Ranchの2冊を買ってみようかと思います。

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) (Big Nerd Ranch Guides)

Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) (Big Nerd Ranch Guides)

iOS Programming: The Big Nerd Ranch Guide (4th Edition) (Big Nerd Ranch Guides)

iOS Programming: The Big Nerd Ranch Guide (4th Edition) (Big Nerd Ranch Guides)