冷めたコーヒー

Weniger, aber besser

新卒で入社した会社を退職しました

2020 年 4 月に修士卒で入社した会社を退職しました.在籍期間は一年間と短かったので,特に語るようなこともないのですが,自身の振り返りも込めて書き記しておきたいと思います.

あなたは誰?

みるかと申します.Twitter@mirucaaura です.「みるかさん」とか「みるか氏」などと呼ばれています.学部は工学部(非情報系)で修士は情報学(数理工学)でした.情報系と言ってもコンピュータをいじったりプログラミングをガリガリ書くようなところではなく,数理的なアプローチで諸現象/工学的問題を理解/解決しようという研究科に所属していました.

入社まで

修士のときは,特にやりたいこともなく,インターンなどにも参加せず,漠然と田舎でのんびりと暮らしたいと本気で思っていました.しかしながら,田舎でのんびりと暮らしていけるほど裕福ではないので,働く必要があったわけですが,地方では公務員くらいしかまともな職がなく,残念ながら公務員になりたいという気持ちが無かったため一般的な就活(エントリーシートを書いて面接するやつ)をしました.就活の時期になると Twitter で頻繁に見かけるように,「積極的に働きたい気持ちがないのに労働意欲を示し,面接でその嘘を見透かされてお祈りされる」という茶番を漏れなくわたしも経験しました.これが何度も続くと本当に厳しいんですよね.そんなわたしですが,幸いにも内定を出してくれた会社が数社あったので,その中から潰しが利きそうな会社を選んで内定を受諾しました.一応エンジニアの職種ということでコーディング試験などもあったのですが,実際に入社して同期に聞いてみたら全然できなくても(なんならプログラミングの経験が全く無い人もちらほら居た)通っていたようで悲しくなりました.そんなこんなで入社日までは特に何事もなく,学会へ行ったり修論を書いたりして過ごしていました.

入社後の振り返り

入社して暫くは研修がありました.ビジネスマナーとか Excel の使い方とか議事録の取り方とかやりました.なかなか苦痛ではあったものの,すべてリモートでの研修だったため何とか耐えることができました.4 月の末日に配属部署の通達があったのですが,その時点で希望していた部署とは異なる部署に配属されてしまったこと知りました.ただ,元々強く希望していた部署があったわけではないので,そのときは特段「転職をしよう」と思うことはなく,楽しめる部分を見つけて頑張ろうと前向きに捉えていました.

その後,技術的な研修が始まりました.配属される部署によって研修の内容は異なりましたが,わたしは Java の研修を受講しました.この辺の研修が手厚い点は良いことのように思われますが,実際には外部に委託した業者が教科書に書かれた通りの内容を教えるといった研修で,技術的なスキルが身に付くような構成ではなかったように感じます.テキストもその会社独自の電子媒体のもので,非常に参照しにくい作りになっており学習意欲が逓減したことを覚えています.また,研修を担当した方たちは恐らく今回が初めてのリモートでの研修だったようで,Zoom の基本的な操作方法に慣れていなかったりして円滑に研修が進行せずストレスでした.

配属されてからは,社内システムの開発業務に携わっていました.開発と言っても,社内の人間は基本的にコーディングすることはなく,設計書を作成して業務委託に投げることが常習化していました.しかしながら,そのような状態は健全ではなく,会社としてもなるべく業務委託に依存しないよう,開発もできる人材を育てようという風潮がありました.そういうわけで,わたしが最初に取り組むことになったのは,社員が定期的に行っている業務でシステム化できることを提案し,設計書の作成,開発,テスト,リリースまでのすべてをやることでした.技術的には特に難しいことはなかったのですが,社内特有の事象に悩まされることが多々あって,大きい組織特有の面倒臭さを感じました.

退職の理由

様々な思いがありますが,このままここで経験を積んでも自分の望むようなキャリアは歩めないと思ったことが大きいです.もちろん,それなりに大きな組織ではあったので,社内で自分のやりたいことができるような部署もあったと思います.しかしながら,異動するにしても運の要素が絡んできますし,何よりすぐには異動できない(3 年くらいは耐えないといけなかった)という規約がどうしようもなかったです.他にも,様々な小さな不満が日々溜まって,それに耐えきれなくなったというのもあります.例えば,チームの心理的安全性が低いことであったり,社員の技術的な素養が低いことが挙げられます.不満を挙げだすとキリがないのですが,組織に属している以上そのような不満が生じてしまうのは仕方のないことだと思います.受け入れられる不満もある一方,自分ではどうすることもできない不満も数多く,今回は退職/転職することに傾いたという感じです.

前職の良かった点

ネガティヴな面ばかり取り上げるのもなんなので,良かった点についても言及しておきたいと思います.部署にも依りますが,基本的にホワイトであったと思います.もちろん,わたしが新卒社員で他の社員と比べて責任が小さいことも影響しているとは思いますが,有給休暇は理由なく取得できるし,何時に出社して何時に帰っても文句は言われないし,残業もほとんどなかったです.給与も素晴らしく高いわけではありませんが,東京で一人で暮らしていける程度には貰えていたと思います.

プライベート

働き始めると労働で体力を削がれ,それ以外に何もできなくなるということを実感しました.研修をやっていた頃はふみさん( id:fumyuu )と数学の本を読んだりして過ごせていたのですが,次第に労働による疲労に耐えきれなくなり労働以外何もできなくなる状況が続きました.土日も勤務されている方には反感を買われるかもしれませんが,5 日働いた身体は 2 日程度の休みでは全然休まらないですね.

2020 年は COVID-19 の影響もあり,ほとんど外出できない一年間でしたので,基本的に家で過ごすことが多かったように思います.線型代数学の復習をしたり,測度論やルベーグ積分に手を出したりして過ごしていました.年末は Advent Calendar なるものに初参加して,近接勾配法のアルゴリズムに関する記事を書きました.また,応用情報技術者試験という資格試験を受けたり,オンライン英会話で英会話の訓練をしたり,ジムに通ってベンチプレスを上げたりもしました.2021 年に入ってからは Nintendo Switch を購入したので,ひたすらリングフィットをやったりしていました.この時期にマッチングアプリにも手を出してみたのですが,見知らぬ人間と表面的なやり取りを続けることが向いていないということを実感しました.

次はどうするの?

現在は絶賛ニート生活を謳歌していますが,転職先が決まっています.また慣れてきたら報告したいと思います.

謝辞

転職活動に際して,ツイートを RT して頂いたり,情報を提供して頂いたり,声を掛けて頂きまして,本当にありがとうございました.正直 Twitter をやっていなかったら厳しい戦いになっていたかと思います.一応,転職支援サイトにも登録したりもしたのですが,エージェントとやり取りをすることは一切せずに転職活動を終えてしまいました.

また,先日退職の旨をツイートした際に,欲しものリストを公開したところ,多数の方々から本をプレゼントして頂きました.勉強して還元できるように頑張ります.

応用情報技術者試験の受験記

2020年10月18日に行われた応用情報技術者試験を受験し、下記の通りギリギリですが合格したので記録を残しておきます。但し、以下で述べるようにほとんど再現性のない合格の仕方をしたため、ここに書かれている内容を鵜呑みにしないように注意されたい。

試験勉強

  • 試験一週間前から勉強開始(総勉強時間: 20h~30h)
  • 午前対策: 応用情報技術者試験ドットコムを周回(直近5回分をほぼ丸暗記)
  • 午後対策: 最新の過去問を一回分解く(通しで解かず、個別に解いた)

所感

  • 午前の対策(午後も?)は参考書で体系的な知識をつけるより過去問を周回するに限る
  • 午後は個々人のバックグラウンドで解きやすい問題が大きく異なると感じた
  • 午後試験の対策として時間を計って通しで解いておけばよかった
  • 昼食はおにぎり一個程度にすると午後試験で眠くならなくてよかった(重要
  • 部分点は割と大らかであると感じた(なので分からなくても何か書こう)

近接勾配法概説

この記事は「数理最適化 Advent Calendar 2020」の24日目の記事です.

Advent Calendar 初参戦です.今回は「数理最適化」がテーマということで,凸計画問題に対する近接勾配法について書こうと思います*1.連続最適化や機械学習に馴染みのある方にとっては新鮮味のない話題かもしれませんが,どうぞよろしくお願いします.

はじめに

数理最適化において,凸集合*2上で凸関数*3を最小化する*4問題は「凸計画問題」 あるいは「凸最適化問題」などと呼ばれる.線型計画問題,二次計画問題,半正定値計画問題,二次錐計画問題などは凸計画問題の代表的な例であり,馴染み深いと感じる方も多いと思う.凸計画問題は非線形最適化問題に分類されるが,局所的最適解が大域的最適解に一致するなどの性質上,理論・応用の両面から古くから研究されてきた最も重要な最適化問題のクラスの一つである.

凸計画問題において,制約条件が凸集合に限定されず空間全体*5であるとき,問題は次のように記述される: \begin{align} \min_{x\in\mathbb{R}^n} f(x)\tag{$\diamond$} \end{align} ここに,$f\colon\mathbb{R}^n\to\mathbb{R}$ は凸関数であり,一般に目的関数と呼ばれる.もし関数 $f$ が微分可能であるならば,後述する勾配降下法などのアルゴリズムによって最適解に収束する点列を構成することができる. 一方,目的関数が微分できない点を含む場合,関数の勾配の情報が使えないため,そのようなアルゴリズムを適用することができないことは想像に容易いだろう.例えば,機械学習などで頻出するLASSO($\ell_1$ 正則化)における正則化項や,行列の補完問題(Matrix completion problem)における核ノルム(nuclear / trace norm)は微分できない点を含むことでよく知られている.

なお,本稿は数理最適化がテーマなので,$n$ 次元ベクトルが頻出する.多くの文献ではベクトルを $\mathbf{x}$ あるいは $\boldsymbol{x}$ と表記されることが多い*6が,本稿では太字にせず $x$ と表すこととする.また,本稿を通して,$\|\cdot\|_2$ はユークリッドノルム,$\|\cdot\|_1$ は $\ell_1$ ノルムを表す*7.行列 $X\in\mathbb{R}^{m\times n}$ に対して,フロベニウスノルム $\|X\|_{F}$ および核ノルム $\|X\|_{\mathrm{tr}}$ はそれぞれ \begin{align} \|X\|_{F} := \sqrt{\sum_{i=1}^{\min \{m,n\}} \left\{ \theta_i (X) \right\}^2 },\quad \|X\|_{\mathrm{tr}} := \sum_{i=1}^{\min \{m,n\}} \theta_i (X) \end{align} で定義される.ここで,$\theta_i(X)$ は $X$ の特異値を表す*8

最後に,指示関数(indicator function)を定義しておく.閉凸集合 $\mathcal{C}$ に対して, \begin{align} 1_\mathcal{C}(x) := \left\{\begin{array}{ll} 0, &\quad \mathrm{if} \; x \in \mathcal{C}, \\ \infty, &\quad \mathrm{otherwise} \end{array}\right. \end{align} と定義される関数 $1_\mathcal{C} \colon \mathbb{R}^n \to \mathbb{R} \cup \{\infty\}$ を集合 $\mathcal{C}$ の指示関数という*9.すなわち,入力ベクトル $x$ が集合 $\mathcal{C}$ に含まれていたら $0$ を,含まれていなかったら $\infty$ を返す関数である.この指示関数を用いると,制約条件を含んだ最適化問題 $\min_{x\in\mathcal{C}} f(x)$ が次のように等価に書き換えられる*10. \begin{align} \min_{x\in\mathbb{R}^n} f(x) + 1_{\mathcal{C}}(x) \end{align}

問題設定

本稿で取り上げる最適化問題は以下のように定式化される問題である: \begin{align} \min_{x \in \mathbb{R}^n} f(x) := g(x) + h(x) \tag{$\ast$} \end{align} ここに,$g\colon\mathbb{R}^n\to\mathbb{R}$ は微分可能な凸関数,$h\colon\mathbb{R}^n\to\mathbb{R}$ は必ずしも微分可能とは限らない凸関数とする.

先に例に挙げたLASSOを例にとると,次のような対応関係になる. \begin{align} \min_{\beta\in\mathbb{R}^{n}}f(\beta) = \underbrace{\frac{1}{2} \| y - X \beta \|_2^2}_{g(\beta)} + \underbrace{\lambda \| \beta \|_1}_{h(\beta)} \end{align}

また,行列の補完問題を例にとると,次のような対応関係になる. \begin{align} \min_{B\in\mathbb{R}^{m\times n}}f(B) = \underbrace{\frac{1}{2} \sum_{(i,j)\in\Omega} \left(Y_{ij} - B_{ij}\right)^2 }_{g(B)} + \underbrace{\lambda \| B \|_{\mathrm{tr}}}_{h(B)} \end{align}

収束解析をする上では,関数 $g$ や $h$ にもう少し条件を付け加える必要があったりするのだが,今回は概説ということなので詳しく触れないこととする.

勾配降下法

問題($\diamond$)の目的関数が微分可能な凸関数である場合,次のような手続きによって,最適解に収束するような点列を生成することができる. \begin{align} x^{k+1} = x^{k} + t_k \cdot d_k, \quad k=0,1,2,\dots \end{align} ここで,$t_k$ は「ステップ幅」と呼ばれる正の実数であり,$d_k$ は降下方向を表すベクトルである.ベクトル $d_k$ として勾配ベクトル $-\nabla f(x^k)$ を採用したアルゴリズムが「最急降下法」に相当する.

少し違った見方をしてみよう.現在の点を $\overline{x}$ として,関数 $f$ の点 $\overline{x}$ の周りで Taylor 展開して得られる関数: \begin{align} f(x) \simeq f(\overline{x}) + \nabla(\overline{x})^\top (x-\overline{x}) + \frac{1}{2} (x-\overline{x})^\top \nabla^2 f(\overline{x}) (x-\overline{x}) \end{align} は点 $\overline{x}$ の周りにおける関数 $f$ の近似した関数になっている.上式においてヘッセ行列 $\nabla^2 f(\overline{x})$ を $tI_n$ とおいた式: \begin{align} \tilde{f}(x) = f(\overline{x}) + \nabla f(\overline{x})^\top (x-\overline{x}) + \frac{1}{2t} \|x-\overline{x}\|_2^2 \end{align} は $x$ に関する二次式であり,最小となる点が存在する.そこで,その最小となる点を求めて次の点として採用することを考えてみる. 具体的には,以下のように式変形をすればよい. \begin{align} x^{\star} &= \mathop{\mathrm{arg~min}}_{x} \left\{ \tilde{f}(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ f(\overline{x}) + \nabla f(\overline{x})^\top (x-\overline{x}) + \frac{1}{2t} \|x-\overline{x}\|_2^2 \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ 2t \cdot \nabla f(\overline{x})^\top x + \|x \|^2_2 - 2\overline{x}^\top x \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \|x \|^2_2 - 2 (\overline{x} - t \cdot \nabla f(\overline{x}))^\top x \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \|x - (\overline{x} - t \cdot \nabla f(\overline{x})) \|^2_2 \right\} \end{align} 以上より,関数 $\tilde{f}$ を最小とする $x$ は以下のようになる: \begin{align} x^{\star} = \overline{x} - t \cdot \nabla f (\overline{x}) \end{align} これは勾配法において勾配ベクトル $d$ を $-\nabla f(x)$ とした最急降下法に相当する.

近接勾配法

問題($\ast$)に対する近接勾配法は以下の更新式によって点列を更新するアルゴリズムである. \begin{align} x_{k+1} &= \textrm{prox}_{t_k,h} ( x_k - t_k \nabla g(x_k) ),\\ \textrm{prox}_{t,h}(y) &= \mathop{\mathrm{arg~min}}_{x} \left\{ h(x) + \frac{1}{2t} \|x-y\|_2^2 \right\}. \end{align} 上式における $\textrm{prox}$ は近接作用素(proximal operator / mapping)と呼ばれる作用素*11である.意味合いとしては,現在地 $y$ の近くで関数を最小化する問題である.

本稿では上記の更新式がどのような経緯を辿って導出されたものなのか見ていきたい. 解くべき問題について,関数 $h$ は微分不可能な点を含むが,関数 $g$ については微分可能なので $g$ に関する勾配の情報のみを用いることを考える.先のアナロジーにより,現在の点 $x^k$ における関数 $f$ の二次式による近似を考えると,次のような手続きを考えたらよさそうである: \begin{align} x^{k+1} &= \mathop{\mathrm{arg~min}}_{x} \left\{ g(x^{k}) + \nabla g(x){^\top} (x^{k}-x) + \frac{1}{2t} \|x^{k}-x\|_2^2 + h(x) \right\} \end{align} この式を変形していくと次のようになる: \begin{align} x^{k+1} &= \mathop{\mathrm{arg~min}}_{x} \left\{ g(x^{k}) + \nabla g(x){^\top} (x-x^{k}) + \frac{1}{2t_k} \|x-x^{k}\|_2^2 + h(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \frac{1}{2t_k} \left( \| x - x^k \|_2^2 + 2t_k \nabla g (x^k)^\top x \right)+ h(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \frac{1}{2t_k} \left\| x - (x^k - t_k \nabla g (x^k)) \right\|_2^2 + h(x) \right\} \end{align} ここで,近接作用素の定義を用いると, \begin{align} x^{k+1} = \mathrm{prox}_{t_k,h} (x^k - t_k \nabla g (x^k)) \end{align} となり,所望の更新式が得られた.

近接作用素

近接勾配法の更新式において,近接作用素 $\mathrm{prox}$ を逐次計算する必要がある. この計算が重たいと効率的に解の更新を行うことができない. 本稿では応用上重要な以下の 3 つの関数に対する近接作用素が具体的にどのように構成されるのかについて見ていく.

  • $\ell_1$ ノルム
  • 核ノルム
  • 指示関数

まず,$\ell_1$ ノルムについて見ていく.関数 $h$ が $h(x) = \lambda\|x\|_1$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (x) = \mathop{\mathrm{arg~min}}_{y\in\mathbb{R}^n} \left\{ \frac{1}{2t} \left\| x - y \right\|_2^2 + \lambda \|y\|_1 \right\} \end{align} 簡単な変形により,上記の右辺を最小にするようなベクトル $y^\star$ は解析的に求めることができ,一般にソフト閾値作用素(soft-thresholding operator)と呼ばれる以下の関数と等価となる. \begin{align} \left[ \mathrm{prox}_{t,h} (x) \right]_i = \mathrm{sgn} (x_i) \max \{ |x_i| - \lambda , 0 \} \end{align} ここに,$\mathrm{sgn}(\cdot)$ は符号関数である.

次に,核ノルムについてである.関数 $h$ が $h(X) = \|X\|_{\mathrm{tr}}$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (X) = \mathop{\mathrm{arg~min}}_{Y\in\mathbb{R}^{m\times n}} \left\{ \frac{1}{2t} \left\| X - Y \right\|_{F}^2 + \lambda \|Y\|_{\mathrm{tr}} \right\} \end{align} 上式は行列 $X$ の特異値に対するソフト閾値作用素に帰着される.すなわち,行列 $X$ を $X = U\Theta V^\top$ と特異値分解したとき,近接作用素は \begin{align} \mathrm{prox}_{t,h} (X) = U \tilde{\Theta}_{\lambda} V^\top \end{align} で与えられる.ここで,$\tilde{\Theta}_{\lambda}$ は対角成分が $\left(\tilde{\Theta}_{\lambda} \right)_{ii} = \max \{ \theta_i (X) - \lambda , 0 \} , \; (i=1,2,\dots, \min \{m,n\} )$ で与えられる対角行列を表す.

最後に,指示関数について見ていこう.関数 $h$ が $h(x) = 1_{\mathcal{C}} (x)$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (X) &= \mathop{\mathrm{arg~min}}_{y\in\mathcal{C}} \left\{ \frac{1}{2t} \left\| x - y \right\|_{2}^2 + 1_{\mathcal{C}}(y) \right\} \\ &= \mathop{\mathrm{arg~min}}_{y\in\mathcal{C}} \left\| x - y \right\|_{2}^2 =: P_{\mathcal{C}}(x) \end{align} 要するに,入力ベクトル $x$ とのユークリッド距離が最小となるような $\mathcal{C}$ 内の点を見つける問題に相当し,一般に凸射影と呼ばれる写像 $P_{\mathcal{C}}$ に他ならない*12

おわりに

本稿では,凸計画問題に対する近接勾配法に関する初歩的な内容について解説した.途中で断ったように,今回はアルゴリズムの収束解析について触れていない.そのため,目的関数の条件について凸性と微分可能性についてしか言及していない.様々な文献をみていくと,収束解析をするために,関数 $g$ にリプシッツ連続性や平滑性を仮定として置いている場合がある.その上で,リプシッツ定数などの情報を用いてステップ幅などを決定するアルゴリズムを構成し,収束解析がなされているようである.

Refference

本稿を記述する上で参考にした資料を以下に挙げる.より詳しい内容を知りたい場合は以下の文献を参照されたい.

更新ログ

  • (12/24 8:18)指示関数の記述を整理しました。集合論などで出てくる指示関数と最適化の文脈で出てくる指示関数を混同してしまっていました。今回の場合は、入力ベクトルが集合に含まれていたら $0$ を返し、含まれていなかったら $\infty$ を返す関数の方が正しいです。指摘していただいた @weary_samurai さん、 @paruma184 さん、@jirohhana2 さん、ありがとうございました。

*1:12月に入ってから勉強した内容になります.間違い等ございましたら Twitter:@mirucaaura まで知らせて頂けると幸いです.

*2:集合 $\mathcal{C}$ が任意の $x,y\in\mathcal{C}$ と $\lambda \in [0,1]$ に対して $\lambda x + (1-\lambda)y \in \mathcal{C}$ が成り立つとき,集合 $\mathcal{C}$ は凸集合と呼ばれる.

*3:関数 $f\colon\mathbb{R}^n\to\mathbb{R}\cup\{\infty\}$ が任意の $x,y\in\mathbb{R}^n$ と $\lambda \in [0,1]$ に対して $f(\lambda x + (1-\lambda)y) \leqq \lambda f(x) + (1-\lambda)f(y)$ を満たすとき,関数 $f$ は凸関数と呼ばれる.

*4:もちろん最大化する問題を考えても差し支えない.

*5:本稿の議論はそのままヒルベルト空間に拡張できる点が多いが,応用上分かりやすいようにユークリッド空間で考えることとする.

*6:ちなみに,$\boldsymbol{x}$ ははてなブログにおいて「\boldsymbol{x}」と記述すると出力される.

*7:過剰な配慮かもしれないが,$n$ 次元ベクトル $x = (x_1,\dots, x_n)^\top$ に対して,ユークリッドノルムは $\|x\|_2 = \sqrt{x_1^2 + \dots + x_n^2}$ で定義され,$\ell_1$ ノルムは $\|x\|_1 = |x_1| + \dots + |x_n|$ で定義される.

*8:はてなブログにおいて sigma が表示されないので代わりに $\theta$ を用いている.

*9:閉凸集合に限定するような書き方をしたが,一般の集合に対して定義される概念である.また,空でない閉凸集合に対する支持関数は閉真凸関数になることが示せる.

*10:一見すると制約条件がないような問題に見えるかも知れないが,$x$ が集合 $\mathcal{C}$ に制限されているので,制約を含んだ最適化問題である.

*11:作用素写像と思っていただいて構わない.

*12:凸射影が効率的に計算できるかは凸集合の形状に依存する.

Twitter でアンケートした不等式の問題の解説

みなさま、ご無沙汰しております。みるか(@mirucaaura)です。90 日以上更新が途絶えてしまい申し訳ありません。近況などについてはまた後日にでも...。


Twitterのアンケート機能を利用して、次のような問題を投げてみました。

今回はこの問題の解説を行いたいと思うのですが、最近流行りのMathlogに書きましたので、そちらを参照していただければと存じます。

7月に読んだ本・読んでいる本

こんにちは、みるか(@mirucaaura)です。前回前々回に引き続き、今月に読んだ本について簡単にまとめておきたいと思います。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

プログラマが知るべき97のこと

  • 発売日: 2010/12/18
  • メディア: 単行本(ソフトカバー)

先月、本書の監修者である t_wada さんこと和田卓人さんのご講演を拝聴する機会があり、本書を知りました。ご講演のログについては以下の記事にまとめましたので、ぜひ目を通していただければ幸いです。

mirucacule.hatenablog.com

本書は、題目の通り、プログラマが知っておくべき事柄について、著名なプログラマによる 97 本のエッセイによって構成されています。また、日本語訳版では、Ruby開発者であるまつもとひろゆきさんや t_wada さんによる 10 本のエッセイも加わっています。

内容については本書に譲りますが、ぜひ読んでみたくなるようなエッセイタイトルを以下に列挙しておきます:

  • 関数型プログラミングを学ぶことの重要性(Edward Garson; pp4-5)
  • ハードワークは報われない(Olve Maudal; pp.72-73)
  • 車輪の再発明の効用(Jason P. Sage; pp.138-139)
  • シングルトンパターンの誘惑に負けない(Sam Saariste; pp.140-141)
  • エラーがエラーを相殺してしまう(Allan Kelly; pp.162-163)
  • 正しいアルゴリズムとデータ構造を選ぶ(Jan Christiaan "JC" van Winkel; pp.168-169)
  • WETなシステムはボトルネックが見つかりにくい(Kirk Pepperdine; pp.172-173)

一つひとつのエッセイは見開き 2 ページ程度であり、それぞれが互いに独立した内容なので、隙間時間などに少しずつ読むのに適しています。

エッセンシャル思考

再読しました。前回読んだのが2月だったので、およそ5ヶ月振りとなります。本書のキーメッセージは「より少なく、しかしより良く」という一点に集約されます。色んなことに手を出して全てを中途半端に終わらせるのではなく、自分がすべきことを徹底的に明確にして、そこで最高の結果が出すことが人生のあらゆる場面で重要となります。本書は、本当に重要なことを見極め、それを確実に実行するための方法論について、エッセンシャル思考の人と非エッセンシャル思考の人との比較を通して伝えています。以下の表は両者の《考え方行動結果》に関する比較を表したものです。

非エッセンシャル思考 エッセンシャル思考
やらなくては これをやろう
どれも大事だ 大事なことは少ない
全部こなすには? 何を捨てるべき?
差し迫ったものからやる 本当に重要なことを見定める
反射的に「やります」と言う 大事なこと以外断る
期限が迫ると根性で頑張る1 予め障害を取り除いておく
何もかも中途半端 質の高い仕事ができる
振り回されている コントロールしている
疲れきっている 毎日を楽しんでいる

本書の内容は書かれていることを理解するだけであれば極めて簡単だと思います。しかしながら、それらを日々の生活の中で実践することは一朝一夕には難しいと思います。自身の生活に取り入れたい Tips を一つ選んで実践し、無意識でも実践できるようになったら本書を見返して再び生活に取り入れて...というサイクルを繰り返していくとよいと思います。

シンプルな勉強法

シンプルな勉強法というタイトルの通り、奇を衒ったような内容については一切記載されておらず、正統的な勉強の仕方に関する本です。大学受験に関連した事例や具体例が多く、多少のくどさを感じましたが、これから大学受験を控えている高校生のみならず、大学受験を終えた大学生や社会人が読んでも得るものはあると思いました。幾つか役に立ちそうな内容をメモしておきます:

  • 勉強を通して、何らかの目標を達成したい場合、「どれくらい頑張ったか」と「どの方向に向かって頑張ったのか」の二軸が重要となる。次の逆算的な思考を行うことで、誤った方向に努力してしまうことを避ける:
    • 目標を定め、具体的なゴールを設定する
    • ゴールまでにやりたいことを決める
    • やるべきことをスケジュールに落とし込む
    • 実践する
    • 進み具合を定期的に確認する
  • 動画で何かを学ぶ際は、全体像のメリハリをつけるために、ある程度視聴したら一時停止してそれまでの内容についてメモをする。逐次、情報を頭の中で整理してアウトプットをしていくことが重要。
  • 家の中で勉強に集中ができないときは、スマホを家に置いて、自宅から少し離れたカフェや図書館で勉強をする。スマホを放置することで、勉強以外にできることをなくすことが大事。

デジタルネイチャー

2年ほど放置していましたが重い腰を上げて読んでみました。本書で唱えられている「デジタルネイチャー」というのは、人間を数理的に捉えるウィーナーの「サイバネティクス」と、あらゆるモノにコンピュータ性を付与するワイザーの「ユビキタス」という二つの概念を継承した計算機分野の思想のことだそうです(pp.87)。

AI分野の研究に携わったことがないので知らなかったのですが、今AIの分野で求められている才能は、データとデータの間の関係性に目を向けるセンスであり、必ずしも解析的な発想が求められないということです(pp.84-85)。頭で考えるよりも、データセットと(既存の)解析手法と計算機資源があれば新規性が出せる(可能性がある)という点は理論的な分野に携わっていた自分としては新鮮でした。

本書の内容は機知に富んでいる一方で、敢えて分かりにくい専門用語や衒学的表現を多用している印象を受けました。この文体こそ著者特有の文体であり、そこに楽しみを感じる読者が一定数いることも事実だと思う。しかしながら、個人的には、もっと平易な文体で読みたかったです。

解析入門Ⅰ

軽装版 解析入門〈1〉

軽装版 解析入門〈1〉

第一章:実数を中心に読みました。これまで実数は既知として扱ってきましたが、本書にもあるように、現代数学の立場から見ると高校までに学んだ実数の認識では厳密性に欠ける点があります。そこで、有理数については既知として、それに基づいて論理的に厳密な実数論を構築することが本章の目的でした。補助資料として、YouTube にアップロードされている動画を参考にしながら進めました。議論を進めるに当たって、ε-N論法を用いる場面が多々ありますが、この概念に慣れるためにはε-N論法について考え込むよりも、例題や諸定理の証明を通して慣れていけば良いというのが個人の見解です。

おまけ

余談として、今月やっていたことについて少しだけ触れておきたいと思います。

数学に関しては、前述した通り、解析学の実数論について学びました。補助資料として用いた動画は、古賀さんの動画AKITOさんの動画です。今回に限っては、より厳密な議論について学びたかったのでヨビノリさんの動画は視聴しませんでした1。勉強の進め方としては、学んだ内容を自分で再構成できるレベルを目指しています。

数学以外で時間を割いたこととして、筋トレを継続的に行いました。我流でやっても大した成果は生まれないと思ったので、コチラの動画を参考に、完走できることを目指しました。現在、何とか 3 分を超えることができるようになりましたが、完走には至っていないので、来月も継続して取り組みたいと思います。下図はログです。横軸が回数、縦軸が秒数を表しています。

f:id:mirucacule:20200729112948p:plain
筋トレ精進グラフ

他には、競プロにも時間を割きましたが、ABCのE問題以降を解けるビジョンが見えずに行き詰まっています。より具体的に言うと、AtCoder Problemsにおける緑色上位レベル〜水色下位レベル以上の問題に対する解法を自力で思い付くことができない状態です。圧倒的に演習量が足りていないことが要因の一つであることは間違いないので、典型とされる問題をストックしていく必要がありそうです。

また、4連休(7/23~7/26)で心に余裕があったので、株式や確定拠出年金、税金などといったお金まわりのことについて学びました。それに伴って、会計の知識を身に付けたくなりました。以前、簿記の勉強をしたことがあるのですが、機械的な仕訳の作業に終始してしまい、面白みを見出せませんでした。Twitter2にて、より厳密な立場で会計について学べる書籍について質問したところ、以下の書籍を紹介していただきました。書店で気に入ったものを購入したいと思います。


  1. このやり方はやってしまいがちですが、再現性のない確率的な仕事になってしまうので、気を付けたいです。

  2. ヨビノリさんの動画が厳密性に欠けるという意味ではありません。悪しからず。

  3. 当該ツイートへのリンクです。ご回答して頂いた方々、誠にありがとうございました。