kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scalaの学習コストについての私見

※2022/01/25 17:10追記

 以下のツイートが別にScalaが主眼でない」こと自体は承知しています。一般論として、Scalaに限らず言える技術選定の話ですよね。ただ、妙な方向への読解をちょくちょく見かけたので、それに乗っかる形で現状のScalaについて率直な感想を書いておこうと思ったのでした。「この話とは別なんだけど」みたいな言葉をつけておけば良かったです。申し訳ありません。

 数日前、以下のツイートに端を発して色々な意見が交わされていました。

 ここで言われていることの一部は確かに正しいと感じます。Scalaについて言及する時はいつ頃かというのがポイントなのですが、たとえばScala言語そのものでなくても標準ビルドツールであるsbtが1.0未満の時代(はもう数年前です)だと色々扱いづらい部分も多かったです。また、Scala言語についても2.12以降はともかく2.11までは無節操に一部ライブラリを非推奨にしたり、かと思えばexperimentalとして導入されたマクロ機能がガンガン使われてたりして、難しいというよりややこしく見えた部分は多々あります。

 ただ、現状、つまり2022年時点でのScalaの学習コストはさほど高くないと考えています。もちろん、私の立ち位置上バイアスがかかっている可能性もありますが、それ以上にScala周辺の環境が「こなれてきている」のも確かです。

 というわけで、このブログでは、現在のおよび過去のScalaをめぐるあれこれについて思ったことをつらつらと書いてみます。雑にまとめているので不正確なところ多しですが、その辺りはツッコミいただければと思います。

sbt 1.x系列が安定している

 Scalaの学習コストについて盛んに言われた時代は標準ビルドツールであるsbtがまだ1.0になっていない時代でした。その頃のsbtのビルド定義ファイルは、よくわからない記号的演算子を使いまくったりしていて控えめに言っても読みやすいとは言えませんでした。しかし、この辺りの読みづらい演算子や良くない書き方については2017年リリースのsbt 1.0でかなり改善されました。まず、余計な記号演算子は非推奨になったり削除されたりしました。プロジェクトを定義するための方法も推奨の方法が用意されていて、以前ほどビルド定義がわけわからんという状況にはなっておらず、他言語のビルドツールに比べてひどいということはないです。sbtプロジェクト自体でsbtのバージョンを指定できる設計(sbtプロジェクト自体にsbtのバージョンをロックする機能がある)などは、gradleやmaven、npmなどより楽なことが多いとすら感じます。

 たとえば、単純なsbtプロジェクトを作るのなら、

name := "example"
organization := "com.github.kmizu"
version := "0.01-SNAPSHOT"
scalaVersion := "2.13.6"

 くらいの記述で済んでしまいます。もちろん複雑なプロジェクトはそう簡単にいきませんが、単純なプロジェクトはむしろsbtの方が圧倒的に楽と言ってもいいくらいです。なんといっても、キーと値の結び付けだけで最低限の設定ができるわけですから。しかも、キーの名前が間違っていたらちゃんとビルド実行前に教えてくれますから、実行時に初めてnameがnamだとわかるよりだいぶ楽です。

ここ数年以上、Scalaは仕様変更をほとんどしていない

 次のメジャーバージョン……というか、結構Odersky先生の趣味入ったScala 3についてはおいておくとして、現在安定して使われているScala 2.12やScala 2.13については(マクロとかのユーザが妙な作りこみをできるところはおいといて)Scala 2.11時代と比べても言語仕様はあんまり変わっていないというかほとんど追加もありません。コレクションライブラリに手が入ったり、処理系のチューニングが進んだりといった細かな改善は色々ありますが、昔のScalaみたいにライブラリの互換性を軽視しまくり(2.10くらいまでは実際そうだった)な姿勢は見られません。ちなみに、Scalaはメジャーバージョンアップごとに言語仕様をころころ変えているという誤解が一部にみられるようですが、これはあんまり正しくありません。現在のScala(2.13系)の言語仕様は2.8時代(2012頃)とほとんど変わっていません(追加機能はあるけど、消えた機能はprocedure syntaxとかくらい?)。正確には、昔はメジャーバージョンアップごとに互換性の無い形でライブラリの仕様変更をしていた、でしょうか。

 そのライブラリの仕様変更にしても、2.12以降は一通り落ち着いた感があり、今ではむしろ比較的安定しているのではないかと思います。Scala 3は色々変わったので話が別ですが、現場ではまだまだ普及してないと思いますのでここでは言及しません。

 一方、Javaはバージョンが上がるごとにがんがん色々な機能を追加していて、どのバージョンでどの機能がstableなのかexperimentなのかわかりづらい状態になっていますし、追加された機能が既存の部分とうまく噛み合っていない部分もあるしで、最新のJavaを追っかけるのはむしろ学習コスト高かったりします(以前から追ってる人はともかく)。これは別に悪口とかではなくて、往々にして学習コストてのは「イメージ」に左右されるんですよね。

 Scalaの場合は初期に処理系が不安定だったことや、ライブラリ作者があんまり互換性を(昔)重視しなかったことや、記号メソッド使いまくりの中二病ぽい設計のライブラリがいっぱいあったのが学習コストをあげていた要因だろうっていうのがまず一点。他には、一方的に他言語をディスる(人のことはいえませんが)人の存在とか、必要以上に物事を厳格にとらえる人たち(私もその一員でした。はい)もあって、Scala難しいって印象につながったんではないかなあと。たぶん、同じくらい厳格な立場でいうとJavaもすっごい難しい言語に入るはずですし。

 この辺りは技術というよりアカデミア出身の人が多い故に厳格な人が多く、かつマーケティングを軽視する人が多かったことが原因といえるかもしれません。実際、Scala難しいならKotlinも難しいとなりそうなくらい両者は似ている……というより、KotlinはScalaの主要な機能をほぼ継承しているのですが、その辺りはJetBrainsのマーケティングが上手なのと、ライブラリの互換性を軽視しなかったこと、厳格な立場をとる人があまりいないこと、JetBrainsの政治がうまい辺りが主要因だろうなと感じています(これは悪口ではなくて、逆にLightbendの言語マーケティングが上手くなかったというのが正直な実感です)。

定番フレームワークやライブラリが一通り出揃っている

 たとえば、jsonを扱うならcirceがメジャーですし、Webアプリケーションなら他にも選択肢があるとはいえ、Play Frameworkデファクトスタンダードです。DBアクセスならScalike JDBCが国内でよく使われています。分厚いO/RマッパーではなくSQLを単純なオブジェクトと結びつけるタイプの薄いライブラリなので使いやすいです。

 APIサーバーだけを立てたいのならAkka HTTPなどもあります。今時はSPAだよねーという方はテンプレートエンジン前提だったPlay Frameworkよりこっちの方が使いやすいと感じるかもしれません。

 いずれにせよ、Webアプリケーションを作るという目的からすれば、結構色々なライブラリが揃っていて、しかも成熟しているものも多いというのが現状です。もちろん、Scalaのライブラリだけだと足りないことも多くて、その時はJavaライブラリを呼び出すのが定番ですが、この辺はKotlinとかも同じですし、Scalaが特に面倒くさいということもないです(両方とも大体シームレスにJava API呼べるので)。

ライブラリのバイナリ非互換性の問題は「それなりに」なんとかなる

 Scalaの欠点として従来言われていたものに、メジャーバージョンアップすると、ライブラリのバイナリ互換性がなくなるというのがあります。たとえば、Scala 2.12用にビルドしたライブラリはScala 2.13用にはそのままでは使えません。これを聞くとたぶんScalaについて詳しくない方は「ウゲ」と思われるかもしれませんが、sbt自体がクロスビルドという、同じソースから複数のメジャーバージョン向けのバイナリをビルドする機能があって、メジャーなライブラリは複数のメジャーバージョン向け(たとえば、2.12用と2.13用)のバイナリを大抵同時に用意してるので部外者が思う程大きな問題ではありません。

 この問題で苦労するのは、どっちかというとライブラリ開発者の方でして、クロスビルド出来るようにするために色々面倒な作業をしてくださっていることも多いです。逆に単にライブラリを使う側は、開発者が苦労してくれている分、そこまで負担を気にしなくて良い部分があります(しかし、ライブラリやフレームワーク開発者がしんどい思いするのはどうなんだとか、各ライブラリが新しいScalaのメジャーバージョンに対応するまで「待つ」が必要とかはもどかしい問題ですが)。ともあれ、苦労はあるけど、破滅的な影響があるわけでもありません。

やっぱり書籍は少ない

 Scalaがもっとも注目されていたのは2010年前後だったように思われます。この時期はScala 2.8くらいの頃でビルドツールも標準的なものはないし、処理系の品質もイマイチだし、みたいな部分があったので、この時期の悪印象が染みついている方もいるかもしれません。この辺の事情は本当にがらっと変わったのですが、そういうふつーのScala開発の事情を伝えてくれる日本語書籍が少ないために、必要以上に難しくとらえられてしまっている部分はあるなあと感じます。ちなみに、手前味噌ですが私たちが共著で執筆した『Scala 実践入門』はScalaをお手軽に学ぶのにうってつけだと信じています。読んでいただければ、意外にScala開発って「ふつー」ってことに気づいていただけるんじゃないかなと思います。

gihyo.jp

 とまあこんな感じで、現在のScala開発はまー特別「すごい」というわけではないにせよ、良くも悪くも普通です。Scalaなりの欠点はありますが、ぶっちゃけ他の言語とその辺りは大差ないです(他の言語も色々習得している人間の視点として)。

 あと、Scalaはこれ以上ないほどに現在のオブジェクト指向言語の延長線上にある言語なんですが、その指向性がどうも正しく理解されてないのも問題です。というのは、Scala学びたいけど、関数型だし……という声を凄くよく聞くからなんですが。そういう人にはScalaオブジェクト指向言語なんですよ、といってあげたいのが本音です。

 これは方便ではなくて、実際問題Scalaは仕様的にはオブジェクト指向言語としか言いようがないのです。作者であるOdersky先生はいっつもオブジェクト指向と関数型の統合が大事と言っているくらいオブジェクト指向スキーな人でして、Scalaの言語設計にもこれは顕著に表れています。たとえば、MLなどではint -> intという関数の型は言語にとってプリミティブですが、Scalaで同等の表現であるInt => IntFunction1[Int, Int]シンタックスシュガーでしかありません。Scalaは典型的なクラス指向オブジェクト指向言語と言っていいくらいオブジェクト指向的だと言えます。それにうまいことシンタックスシュガーかぶせたり、関数型的な概念をオブジェクト指向の立場から再解釈した機能をうまく取り込んでいるので、「他の関数型プログラミング言語と似ている」ように見えるだけです。

 implicit parameterとかimplicit conversionとかはぶっちゃけ説明が悪かった、って側面が多分にあって、この辺はScala 3でも反省があって用語とか含めてもっとわかりやすいものになっています(Scala 3には別の問題がありますがそれはさておき)。

 あと、私自身Scala教育をそれなりに担当して来ているんですが、普通に他のプログラミング言語を理解している相手なら理解してもらうのはそれほど難しくなかったというのが正直な実感です。もちろん、背景には私が関わっていたケースではScala教育に関するリソースが充実していたということはあるにせよ、逆に言えばそういう環境さえあれば教えるのは難しくないことの証拠でもあるかなと。

 以上、駄文でしたがScalaに普段触れていない方の参考になればと思います。

Qiita記事「エンジニアの"有害な振る舞い"への対処法」への強烈な違和感

 最近、Qiitaで話題になってそこそこバズった(?)記事に、

qiita.com

 がありました。これ、最初は一読して凄いまともなことばかり書いているように見えましたが、一方で何か妙な違和感がありました。それは、私がいくつかの振る舞いについて思い当たりがあるせいではないか?と考えてみましたが、反省するところがあるなと思いつつも、何かが変だと感じていました。今朝、違和感の理由がわかった気がするので、書いておきたいと思います。

 一番大きな問題は、「有害な振る舞い」といいながら、客観的に観察できる行為ではなく、主観的に行為の意図を勘繰っていることです。

 そもそも、著者様は

私個人の経験に基づくため定性的かつ主観的な意見にはなりますが、メガベンチャーにて8年間様々なチームメンバと開発業務に携わりながらスクラム開発の各役割を1年ずつ、それからミドルマネージャーを2年経験し、さ> らに周辺チームや他部署の同期、社外コミュニティなどでの事例もいろいろと見聞きしてきたうえで、現在は2社目で開発部門責任者をやっており、それなりに蓄積されている情報量は多いと思っております。

 と書いておられます。そこから、これらの情報が著者様本人あるいは周囲の知人・友人から寄せられた苦情に基づいているであろうことは推察できます。それ自体は問題ないのですが、書き方が「そういう被害を受けた」と思っている側の主観的な認識に終始しているのです。たぶん著者ご自身が「そう思った」か、苦情を申し立てた誰かが「そう思った」んでしょう。

 しかし、苦情や愚痴の類において、報告した側は自分の悪い点は過少に、相手の悪い点を過大に言い募る傾向があります(これは人間心理として自然なことですが、その類のことをまんま受け取るのは、もしマネージャ―ならまずいでしょう)。あるいは、嫌いな人を排除したい人が「一見客観的な風を装う」こともあります。

 その「自分や誰かが嫌に思った」ケースの集積である(と思われるので)ので、有害な振る舞いにフォーカスしていると一見客観的な言い方をしつつも、相手の悪い意図を推し量っていることになったのだと思います。

 当てはまるかもしれない当人が自省するだけなら良いのですが、「自分は悪くない」と普段から思っている人は、下手をしなくても「この人は有害な振る舞いをしている」と、レッテル張りをするのに使うでしょうし、実際そういう反応が出てきています。そのような使われ方は本意ではない、と書いていますが、相手の意図を邪推するタイプの言説ですから、まあそういうことにも使われますよね。「言いたいこと」と著者が主張していることがらと、「実際に言っていること」がずれすぎているという感覚です。

 例を挙げましょう。「チームの創造的な議論を阻害したり他者の時間を奪う」の中にある

他者の話に割り込んで自分の意見を差し込む

 これは確かに一見もっともです。会議で誰かが話している時に割り込むのは、相手自体に問題がなければ悪いことでしょう。しかし、現実はそうでもありません。

 私自身経験があるのですが、上司(あるいは特定のメンバー)が延々と自分の話したい議題を話し続ける(会議の時間を食い潰している)こともあります。「延々と自分の話したい議題を話し続ける」から「割り込んで自分の意見を差し込む」ことがあるのですが、果たしてこれが悪いことかはその場にいる誰かでないとわからないことでしょう。もちろん、「延々と自分の話したい議題を話し続ける」も私の主観なので、正当性も怪しいものですが、ともあれ元の主張が客観的に正しいかは別問題です。

 ここで、もし本当に中立的であれば、この対になる自分の話したいことを延々と話すというアンチパターンが本来見えて来るはずなのですが、それはありません。

 別のところについても言及してみましょう。

自分が完全に納得した状態になるまで他者を操作しようとする

 このカテゴリに書かれていることは、相手に問題がなければ駄目なことが多いでしょうけど、観察していて、「話が通じない人ばかりでイラっとして発言したのではないか」とか「上司がむしろまずい振る舞いを続けているときに感情的になった」と思われるケースも見ています。もちろん、こういう時に攻撃的な言動をするのはいかに理由があっても駄目なのですが(コミュニケーションでは抑えられるなら攻撃的意見を控えた方がいいのは当然ですよね)、まずい振る舞いを続けているのがむしろ相手であったときに、どう振る舞うのがいいかは難しい問題です。

 他にも色々あるのですが、

言語化能力が低いのに他者に負担をかける形で自分の気持ちや意見の内容を察してもらおうとする

 はやはり主観ですよね。むしろ、言われた方の理解力が低い(あるいは技術力が著しく低いので、言っていることの意味がわからなかった)ことが問題だったのかもしれません。この場合、どちらが悪いかも場合による話であって、理解力が低い側から見て、「意見の内容を察してもらおうとする」と見えたのかもしれません。いずれにせよ現場を見ないとわからないことです。

急に議論の参加に消極的になり、気持ちを察してもらおうとする。察すること無く決められたチームのルールは守ろうとしない

 これも妙な話です。記事の著者はそう見えたのかもしれませんが、やはり相手の意図を邪推しています。議論の参加に消極的であるといっても、議論の雰囲気が悪い(あるいは進行がまずい)ので、消極的になった可能性もあります。「察すること無く決められたチームのルール」と書いてありますが、「明示されたチームのルール」を守らないのはまずいに決まっています。ただ、ルールが極めてまずかったが取り合ってもらえなかったので、あえてサボタージュをしたのかもしれません(私はさすがにサボタージュの類はしませんが、エンジニア界隈だと時々いそうだとは思いますし、 どうもそうだったんじゃないかなーというケースも散見します)。

 これもまあ、やっぱりその場にいないと実情はわからないことが多いですよね。

 とまあ、ほとんどの項目がそのような感じで、「行為者の意図の邪推」が入っています。こういうのはまさにチームに不和をもたらす原因になるわけで、 「被害を受けた」と思っている側に「これは私が悪いのではなかった!相手が難しい人だったんだ」という風に使われるのは明白でしょう(はてなブックマークなどを見てもそういう反応があります)。

 最後に、(現在は削除されたようですが)ASDなどの発達障害への言及も極めてまずい感じを受けましたが、全体的に「一見中立的な問題提起をしている」ように見えながら、その実「行為より意図」を問題にしているという点で、微妙な印象を受けざるを得なかったということは書いておこうかと思います。

 というか、毎回意図を邪推している辺り、振る舞い(あるいは行為)を問題にしていると言いながらがメインなのはかなり透けて見えますよね。筆者の主観がどうあれ、文章としてはそう読んでしまうといいますか。

2022/01/15 15:53追記

 結構反応があったみたいなので、補足。この記事自体は元記事の主張が根本的に間違っている、とは言っていません。ただ、外から見える行為そのものにフォーカスしたものより、相手の意図を邪推しているのが目立ち、「アンチパターン」を解説するのにそれはどうなのだろうというのが言いたい事です。コミュニケーションアンチパターンなら、外形的な行為(背景解説も含めて)に基づくべきだろうと感じます。

 有害な行為に焦点を当てたいとしたら、意図にフォーカスするのは変ではないの?と。

「マウンティング」という言葉って使わない方がいい気がする

 ブログやSNSなどの媒体で「マウンティング」という言葉がカジュアルに使われるようになって、何年くらい経ったでしょうか。皆さんご存じのように(?)霊長類が行う行動としての「マウンティング」という用語はそれ以前からずっとあったわけですが、インターネットでこの言葉が盛んに使われるようになったのはここ10年くらいのことです(あるいはここ5年くらい?)。ともあれ、ネット用語としての「マウンティング」が使われ出したのが何年前かは興味がないのですが、この言葉は無駄に揉め事を増やすだけであんまりイイことがない。本当にいい事がない。この言葉がはやり出した頃に何度かつぶやいた記憶があるのですが。

 マウンティングというのはまず第一に「事実」に関する言葉ではなく「相手に対して自分の優位性を、特に公衆の面前で示そうとする」という「意図」を表す言葉として使われていることがポイントです。たぶん、なーんか皆が感じていたモヤモヤをうまく表現しているように感じられたのでこの「マウンティング」という言葉が定着したと思われるのですが、本当にマウンティングかを見分けられる程人間って相手のことをわかっているんでしょうか?特にこの言葉ってどっちかというとよく知らない相手にぶつけるものですけど、よく知らない相手がマウンティングしてるとどうしてわかるんでしょうか?その点がまず疑問です。

 もうちょっと具体的な例として、SNSでは特に知識マウンティング、つまり「俺はお前より知っているんだぞ」が鼻につくという話が多いように見えます。しかし、私自身、ニッチ領域ですがある領域の専門家として、理解度の差が絶望的にある相手に対して、繰り返し繰り返し、こうなんだよと諭してもわかってくれない場合に「もう一から勉強しなおした方がいいんじゃないかな」と思ったことは一度や二度じゃないですし、実際言ったことがあります。その時に突き放す言い方は大人げないとか心が狭いとか器が狭いとか不機嫌だったとか反省点が多々なんですが、明らかにマウンティングとは動機が別であって、強いていうなら「なんでここまで時間割いて、頑なな相手に知識伝えるために頑張らないといけないの?もう相手するのがしんどい」が本音だったりします(あくまで専門に近い領域限定ですが)。

 これはどう考えても私の意図としてはマウンティングではありえないですし(しんどいし揉めるのはやだけど、ここは言っとかないとなあとかいうのが本音で、マウンティングとは動機がずれすぎてますから)、他にも専門家方面の人が圧倒的な理解度の差で相手を叩き潰してしまうときにマウンティングととられてしまうケースを時々みますが、言い回しの問題があるにせよ邪推ないしはコミュニケーション上のミスですよね。マウンティングする程暇じゃないってのが本音の人も多いのではないでしょうか。

 もちろん、理解度が低い割に色々な分野の知識をひけらかすタイプの方で「ああ、これはマウンティングぽいな」と感じることもあるにせよ(たぶん、複数思い当たる人物が皆さんいるのではないかと思いますがあえて伏せます)、これも実はなんらかの勘違いで、本人としては「この知識を大衆に啓蒙してあげよう」という善意なのかもしれません。その場合には別の問題(相手を見下す態度とか、傲慢さとか、自分が知識において優位であると思い込んでいるとか)があるにせよ、マウンティングとは別の話になりますよね。

 陰口で「あいつマウンティングしてるよね」くらいの密室コミュニケーションはストレス発散のために悪くないのかもしれませんが、Twitterやブログなどの「全世界に開かれた」場所でマウンティングとか言ってしまうのは無駄な揉め事を増やすだけであまりにもメリットがない。そういうこともあって、私は公の場ではほとんどマウンティングって言葉を誰かに対して使ったことがありません(twilog見ると、数回程度「使ってしまった」箇所がありますが、これについても反省した方がいいなと今は感じてます)。

 結論としては、マウンティングって言葉、特定の相手に公衆の場で投げてもいいことがないので、使うの出来るだけ止めた方がいいのではないかなあということです。そもそも、動機がマウンティングであろうとも言説の正しさとは直交した話ですし、「マウンティングだから言ってることが間違ってる」なんていうのも妙なお話です。この言葉を投げたくなるってことは相手に対して相当ムカついてるんだと思うので、発散することが悪いとは思わないのですが、せめてそういうのは限られた人しか見られない空間でやる方がまだ健全じゃないでしょうか。陰口が健全じゃないとかいう話もありますが、これは有史以来(?)言われてる話で、私自身もそれを抑制できるほど人格者でもないから、まあいいのではと思います。ただし、やっぱり「せめて相手が見てないところでやろうね」くらいのことをよく思います。インターネットに公開されているということは、公衆の場で陰口を叫んでいるということは自覚してもいいように思います。

 以上、前から思っていたことをだらだら書き連ねてみましたが、何かの参考になれば幸いです。

長時間ウォーキングのススメ(あるいは娯楽としてのウォーキング)

 今日は大晦日です。2021年ももうすぐ終わりかと思うと早いものです。大晦日という日は不思議と心が澄み渡るような気がしてとても好きな日であります。なんていう感傷めいた言葉はおいといて、特に私のブログを読んでくださっている方はエンジニアの方が多く、とりわけリモートワークが増えているのではないかと思います。そして、その中で最大の課題の一つは間違いなく運動不足です。

 の事は今更言うまでもなく多くの方が実感していらっしゃるでしょう。筋トレをしたり、身体を動かすゲームをしたり、歩く時間を増やしたり。それぞれ対策をしてらっしゃるでしょう。その中で私がお勧めしたいのはウォーキング、それも1時間以上かけてする「長時間」ウォーキングです。

 もちろん、こつこつ毎日10分程度のウォーキングでもしないよりはだいぶ良いのですが長時間ウォーキングとでは心身に与える影響が(個人的には)まるで違います。

ウォーキングの効能(個人差が大きいです)

 私が長時間ウォーキング(1h以上)をやってみた実感した効能には以下のようなものがあります:

ちゃんと身体が疲労する

 デスクワークを続けていると脳は疲労しているのに身体は疲れていないので眠りづらいという状況がよく発生します。いや、しない人もいるかもしれませんが、Twitterを見てもエンジニアの方は午前0時を回るのは当然、午前2時まで起きている方も少なくないように思います。しかし、これって本質的には不健康極まりない。もちろん、20代ならともかく30代以降にこれを積み重ねていくのはおそらくどんどん健康に悪影響を与えて行くだろうなと。

 ウォーキングをある程度の時間を続ければ、ちゃんと身体が疲労するので夜の寝つきはいくらか良くなります(もちろん、個々人の状況によって程度差はあるとはいえ)。

考え方が自然と上向きになる

 家に籠って考え事をしているとどうしてもマイナス方向の思考が浮かんでくることが多いように思います(これも個人の経験ですが)。ウォーキングを30分以上やってると途中でだんだんとそういうマイナス思考はどうでもよくなってきて、1時間くらい歩けば帰って来た時はかなりリフレッシュしている事が多いです。この辺はアクティブレストという用語で示される何かと関係してそうな気がしますがまあおいときます。あるいはセロトニンがどうとかいう話も関係しているのかもしれませんが専門外なので言及は控えます。

孤独感が減少する

 恋人や配偶者がいても案外孤独感を感じることはあるもの(やはり個人の経験)。しかし、外を歩いていると意外なことに一人で歩いていても家にいるときよりもずっと孤独感が減少します。街を歩いている人々の姿を見て、「人々が実際に生きている」ことを実感するゆえかもしれません。家に引きこもっていると、「頭ではわかっていても、住人の実在性がどうにもうまく感じられない」状態になりがちぽいです。

各種生活習慣病の予防および改善

 これはさんざん言及されていることで今更言うまでもないでしょう。しかし、実際継続してやってみると驚く程血液検査の数値が改善されたりします。

ウォーキングを始めよう

 というわけで、出来るところからウォーキングを少しずつ始めていくのは良いことだと感じます。短期的には時間を消費しているように見えるかもしれませんが(おそらく)実際の時間辺りパフォーマンスはあげてくれます。いきなり1時間ウォーキングとかきついという人は多いと思うので、まずは10分とか決めてみて、少しずつ時間を増やすのが無難でしょう。とはいえ、10分だと達成感が薄いので思い切って少しだけ無理をして30分歩いてみるのも手かもしれません。

 さて、じゃあウォーキングを始めるか、となった時に注意した方がいいことがあります。それは歩くのに快適な装備をするということです。たとえば、冬場は寒いですから出来るだけ暖かい服装をするべきですし、外に出るのが億劫なら外に出る前にお風呂に入って身体を暖めても構いません。暖かい飲み物を持参してもいいですし、カイロを使ってもいいです。ウォーキングが苦行になって長続きするわけないので、とにかく「楽にウォーキングが出来る」環境を自分なりに整備することが重要です。

 また、いきなり「これから1週間に1度はウォーキングするぞ」なんて高い志を持つのも大抵良くないです。よっぽど意志力が強い人ならともかく、途中で挫折するのが関の山ですし、晴れていてある程度の時間歩けるくらいに体調が良かったらとりあえず歩くくらいでいいと思います。

 ちなみに、ウォーキングの時に最重要な装備の一つにシューズがあります。これについては色々意見があると思いますが趣味ウォーキングをするなら衝撃吸収性能がそれなりにあるのが良いというのが個人的意見です。特に歩きなれていない方は足を痛めがちなので、衝撃吸収性能がある1万円台くらいのシューズを買った方がいいです。

 あとはストレッチをすべきであるとかなんとか細かい議論がありますが、そういうのは習慣化してから考えればいいことであって、最初からあんまり完璧にやろうとしても挫折する可能性が高まるだけです。とにかく、楽にウォーキングできる環境を整備しましょう。天気は雨だとしんどさのせいで効果が相殺されてしまう事が多いので晴れか曇りがよいでしょう。

 最後に、ウォーキングは人によっては退屈することがあるかもしれません。それに備えてイヤフォンでお気に入りの音楽を聴くのも良いです。好きな音楽を聴いていると不思議と退屈が紛らわされるものですし。

 というわけで、ウォーキングのススメでした。

 なお、私は昨日2時間40分、10kmくらいの距離をちょっと久しぶりに歩いてきましたがかなりストレス発散効果がありましたし、考え事をまとめるのに良い効果がありました。寒冷地で常に雪が積もっている箇所などそもそも実践しづらい地域はあると思いますが、日常に取り入れられそうならウォーキング習慣を取り入れてみてはいかがでしょうか?

プログラミング言語Pascarを作りました

以前、文法がVBぽいだけの言語VBLを作ったわけですが、

kmizu.hatenablog.com

思いつきで昨夜からPascalぽい文法の言語Pascarを作っていました。一通りPascal「ぽい」文法にしたので、sbtがあればビルドして試すことができます:

github.com

Pascalぽいと言いつつ、まだまだ本当にPascalぽくするにはもうちょい修正が必要そうですが、たとえば以下のようなプログラムを書くことが出来ます。

procedure main()
begin
  var i : Integer = 0
  while i < 3 do
  begin
    writeln(i)
    i := i + 1
  end
end
main()

なお、本家Pascal(?)と違って大文字小文字は区別しています。区別しない方がプログラム読み書きするのも、実装するのも若干面倒くさいので。

しかし、Pascal風味の文法にしただけなのでイマイチ面白みに欠ける感は否めません。参照渡しとかも実装しようと思ったのですが、そんなに難しくなさそうだし……。

WEB+DB Press Vol.125の特集記事「作って学ぶプログラミング言語のしくみ」を執筆しました

 色々苦労も多かったですが、無事、全工程を終え、後は発売日の10月23日(土)を待つのみで、感慨もひとしおです。

f:id:kmizushima:20211007131117j:plain
WEB+DB Press Vol.125

 「プログラミング言語を作る」系の書籍や雑誌記事は時々見かけるくらいには珍しくなくなっていますが、構文解析器を記述するのにPEGを使ってたり、構文解析を後回しにして先に抽象構文木インタプリタを書いてもらうなど、これまで「プログラミング言語を作る」というテーマについて色々考えた結果を詰め込んでいるのが、私っぽさと言えるかもしれません。

 30ページで、以下のような最低限「まともな」プログラミング言語としての機能を装備したものを作って解説するのは色々苦労も多かったですが、「プログラミング言語を作ってみたいけど、しんどそう」という人の糧になればいいなと思います。

  • 算術式あり
  • 関数定義と呼び出しあり
  • ローカル変数とグローバル変数あり
  • 条件分岐+ループ構文あり
  • 拡張構文として:for-in式、ラベル引数あり

 ラベル引数とか中途半端にリッチな機能がある割に、コード量と解説の分量を抑えるために、データ型が整数のみになっているのはややアンバランスに感じられるかもしれません(構文糖衣として書ける機能は、処理系のコード量をそれ程増やさずに済むのでデータ型の方を絞るという設計判断になったという事情はありますが)。

 ページ数制限のために全てのコードを文中に掲載することは出来ませんでしたが、プログラミング言語ToysソースコードGitHub上でOSSとして公開されています。この辺りも「今どき」と言えるかもしれません。

 完成に至るまではWEB+DB Pressの編集様には原稿が遅れたりと至らないことがありましたが、おかげさまで無事、完成までこぎつけられたと思います。この場を借りて御礼申し上げます。    そして皆様、書店で見かけたら是非ともお買い求め頂けると嬉しいです(とはいえ、プログラミング言語を作った事のある方には少々退屈な内容かもしれません)。よろしくお願いします。  

大学の時に苦手/得意だった講義

 そろそろいい歳したおっさんになった私としては、たまにはこういう思い出話を書くのもいいかなと。あと、なんか私がCSわかってる人みたいに思ってる人Twitterのフォロワーさんに意外と多そうな気がしますが、そうでもないですよ、みたいな話としても、

苦手だった科目ベスト5

1位:解析学

今ではそうでもないですが、大学の時滅茶苦茶苦手でした。どれくらい苦手かと言うと、

  • 一年の時に解析学ⅠとⅡとⅢの単位を落とし
  • 二年の時に解析学Ⅱの単位を取得し
  • 三年の時に解析学Ⅲの単位を取得し
  • 四年の時に解析学Ⅰの単位を取得し

たくらいには苦手です。今もって、なんで最後に解析学Ⅰ、つまり一番基本的なところの単位取得してるのかさっぱりわからないのですが(単に不真面目だったせいかもしれない)、ともあれ、苦手意識を植え付けた一番大きな原因は間違いなくε-δ論法です。先に論理における量化子(∀と∃)を教えてくれればここまで手こずらなかった気がするんですが、というのは逆恨みですが。しかし、私と同じようにAC入試で入った組は総じて、離散値を扱うのは得意でも連続値を扱うのは不得意だった傾向がある気がします。

プログラマでも同じように離散値扱うのは得意でも……という人は多そうな気がしますが、一体なんでなんでしょうね?加算無限は簡単に扱えても、非加算無限はどうにも苦手みたいな感覚とか。

2位:自然言語処理

特に自然言語処理の授業は実習がセットであって、しかもその点数を競い合うみたいな奴だったのですが、私が作ったモデルはどうにも過学習になりがちで、たしか全然高得点残せませんでした。苦手とはいえ、一応実習あり、つまりプログラム書く部分があって救われた感があります。

3位:論理と形式化

平たく言うと、自然演繹による証明法を習う授業です。これは不思議なのですが、今は割と自分の武器として普通に使えるものの、当時はめちゃくちゃ苦手でした。証明図とかもわかるようでわからんみたいな。確か単位は取れたと記憶しているのですが。

4位:関係代数

これも今となってはなんで苦戦してたのかさっぱりわからないのですが、正規形とかタプルとかあんましよくわかってなかった感が強いです。当時はデータベースにあんまり興味がなかったせいでしょうか。

5位:電磁気学

割と大学時代のトラウマになった授業の一つでもあります。今やりなおせばそうでもない気がするんですが、ともあれ、大学生の時は全般的に連続値を扱う学問が苦手だったのは確かです。

得意だった科目ベスト5

大体、苦手科目のところに書いた「離散値は扱えるけど、連続値を扱うのが苦手」みたいな傾向がそっくり現れた感じですが。

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

この辺は大学入る前に自習始めてたというのもありますが、あんまり苦労した覚えがありません。実習でもさっさと終わらせた余裕ぶっこいてた気がします。

2位:プログラミング言語関係の講義全般

JavaでもCでもプログラミング言語概論的なのもそうですが、ほぼ勉強した覚えがないくらいには得意でした。確か、プログラミング言語概論なんかは、期末試験に寝坊して「やばっ」と慌てて連絡したものの、「試験に寝坊したのが悪い」というど正論を担当の教員に突きつけられ、あー、単位落としたかなと思っていたのですが、それまでのレポートとか中間試験の成績だけで、一応Cは来てました(A/B/Cまでが単位取得)。

3位:システムプログラミング

システムコール使って、適当にプログラム書く系の授業ですね。なんか、当時の先輩に相談されたことがあった気がしますが、write/readとかのシステムコール適当に呼び出すだけで良かった記憶です。

4位:オートマトン形式言語

この辺はどう考えても今に繋がってるなーと思うのですが、一つには当時の担当教員がそもそもこっち方面専門だったのでわかりやすい講義を受けられたのも大きい気がします。さすがに形式言語専門の人に比べれば全然ですが、まーなんか言語階層の話をおおざっぱにつかめたのは良かったなーと感じてます。あと、この講義を受けてたおかげで大学院で一応まがりなりにも研究出来た気がします。

5位:コンパイラ系の講義

なんか、講義を無視して自分で一から処理系書き直してました。確か、tiny-cという名前のCのすっごい小さいサブセットを作る講義だったのですが、lex/yacc使うのが個人的に気に食わなくて、担当教員に「JavaCCとか使っていいですか?」と聞いて、OKもらったのでJavaで書き直した思い出。

というわけで、とりとめもなく、適当に苦手だった講義と(比較的)得意だった講義とか書いてみました。もうちょっと勤勉な学生だったら良かったのではと時々後悔することがあります(特に、解析学とか不真面目過ぎたし、自然言語処理ももうちょっと真面目にやれば良かった)。