Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scalaの難しさをインターネットから集めてみる

Scalaは難しいと思われたり敬遠されがちである。Scalaの難しさについてTwitterなどでアンケートをとったり、ネットでググって意見を吸い上げてみた。議論の叩き台にするみたいな用途を意図しています。

ご意見や記事募集中です。できればTwitterじゃなくて記事だと嬉しいです。流れていってしまうので・・・

また、私見は私見です。

追記(2024-03-08)ちなみに、色々書いていますが僕はScalaが大好きです(このブログでものすごい数の初心者~中級者向けの記事を書いています)し、ネットで言われているような終わった言語ではまったくないです。初心者をサポートして、難しいと感じている部分をほぐして、みんながScalaでワイワイやれるようにコミュニティを立ち上げ、継続的に活動しています。おかげさまで日本の公式Scalaコミュニティとして認めてもらっています。ブログのバナー下のリンクからDiscordに参加できます。

blog.3qe.us

誰お前

Scalaを10年弱書いています。業務だともっと短いです。

アンケート

使ってる人の中では難しいと難しくないがトントン、使ってない人の中では難しいという印象を持たれているようだ。

言語機能を全部覚えないといけないというドグマ

  • transparent inlineとかcapturing checkとかが難しい
    • それはライブラリ作るレベル相当の機能なので覚えなくていいと思う。
      • 前提として言語の全機能を覚えないといけないということはなくて、Scalaの場合は先進的な機能は先進的で難しいまま置いておけるので、使えるようになるには難しくない部分からやればいいと思う
  • 型クラス難しい
    • 型クラスは難しいですね
    • Scalaが難しいわけではないが、Scalaユーザは型クラスが好きで、型クラスのために用意されている言語機能も多く、するとScalaが難しいになってしまいがち
  • Boundまわり
    • これは個人的に難しいと思うけど、ライブラリ書かない限り不要な感じがする
      • これも、「べつに全機能覚えなくていい」の例な気がする
  • 無理して関数型wayでやろうとして難しい
    • 単純にJavaっぽく書くだけならそう難しくはないのですが、関数型でちゃんと書いて、Immutableでモナドで高階関数で末尾再帰でカリー化でとやっていくと・・・。 - https://c-note.chatwork.com/post/117441269280/scala1year

    • そこまでしないでいい
    • やっぱり「関数型の言語」としてのScalaのイメージが強くて、Scalable languageとしてのScalaが弱い
      • 普通にはてなブックマークではcatsとか使わずにやっている
      • 単純に堅牢だし便利
        • パターンマッチングとかだけでも十分楽しい
        1. Scalaは関数型プログラミングをやらないといけないの?
          1. NO
        2. Better Javaでいい

私見

言語を学習 = 全機能網羅と捉えられがちですが、Scalaの場合はadvancedな部分は放置しても書けるようにはなると思うので、基礎を覚えたらなんとかなるような環境作りが大事なのかなと思います。自分もScala 3のマクロ書けませんけどなんとかなってます。

記号がなんか多い

  • 記号モリモリでいっときハッチャケてた時期があった
    • 最近はコーディングスタイルでもx map fみたいな中置記法は非推奨になっている
  • とはいえupper boundとかはギョッとする
    • Kotlinはこのへんのギョッとする度を抑えられているように思う

私見

Rubyなどと比べると記号は多いと思います。キーワードには自然言語的な意味があるけど記号にはそれがないので、とっつきにくくなりがちなのかなと思います。

あまり関係ないかもだけど、Odersky先生もRubyとかのシンタックスに寄せたそうにしているので、口あたり(?)の良さが改善されるといいですね。

他言語との差異

  • forが難しい
    • 便利なシンタックスシュガーであるというのがまあまあ難しいかもしれない
    • 中身はmapflatMapだし・・・
  • Scalaに通底する傾向として、定義が多相的なので「これはこういう機能です」と言いづらい
    • OptionのmapとListのmap、シグネチャは同じだが・・・
    • 説明しづらい
      • いやいや説明しやすいでしょと思ったあなたは十分に上級者なだけです
  • 式指向
    • これは時代が追い付いて、普通になりつつある
  • _が難しい
    • Scala慣れてると当然のように使うけど、たしかにちょっと抽象的な思考が必要
    • 関数をポンッと渡せますよ、みたいな事前知識がないといけない気がする
  • case classcaseってなんなん、caseはパターンマッチじゃないの
    • 言われてみればそう
    • 自動的に便利な機能を生やすやつです、と暗記してもらうしかない
    • パターンマッチで効果を発揮するのでcaseなんだと思う

私見

forみたいな、一見他言語と同じに見えるが実はよく出来た別の仕組みの構文糖である、というパターンがScalaの場合よくあるのですが、これを教えるタイミングってまあまあ難しいんですよね。それを理解しきるまでは曖昧なまま使い続けてスッキリしないということになるので。caseの名前がカブってるのはたぶんワザとだと思うんですが、やっぱりそれを知らされないとスッキリしないですね。

一度理解すると普通に簡単なのだけれど理解するのが大変、みたいな要素が多いんだろうと思います。そのステップとして日本語記事が非常に重要になると思います。

implicitまわりが難しい

  • implicitが難しいのはそう
    • もともと型クラスやりたい・拡張メソッド欲しいための言語機能なので最初は忘れてていい説がある?

私見

Scala 3である程度整理されたので覚えやすくはなってる(目的に即した書きぶりになっている)とは思います。JVMで型クラスをやるには必要なメカニズムなのだけれど、初心者からすると意味不明なだけなのでどうしたもんかねと思います。

斧が飛んでくる

私見

難しい概念をやるのも良いけど、初心者を大切に育てようという姿勢を持つことが大事だと思います。参道を整備しないと10合目にしか人がいないみたいな状態になると思っています。あとこれは冗談ですが、勉強会で圏論禁止したらどうか。

あと、初心者が抱えている問題に対してコミュニティがかなり専門的な方向に吸い込もうとする傾向がある(e.g. Catsを使わせようとする、高度な機能で解決させようとする)ようにも思います。

ツールまわりが難しい

  • sbtが難しい
    • わかる
      • 真似すればパッと動くというeasyさがないという意味
    • Millとかもあるよ、と言いたいが、デファクトはsbtなので初心者をデファクトから蹴落してはいけない
    • Ctrl-Cで終了してしまうのが難しいという意見があった
      • 言われてみれば・・・
        • やっぱインタラクティブ型ビルドツールは難しいのでは?
  • 「道具の表面的な部分に粗がある」
    • https://doloopwhile.hatenablog.com/entry/2016/11/28/135050
    • これは自分も同感
    • 去年のScala Suevey 2022でも「直してほしいところ」として「Tooling support」が2位を占めていた
      • 1位はCompile speed。:innocent:
    • うまく言語化すると
      • 言語要素が多義的で曖昧に見える
        • implicit
        • case
      • 周辺ツールがへぼい
        • これはかなり改善してるので期待してよい
  • Sparkがむずい
    • わかる(自分もぜんぜん使いこなせない)
    • 初心者向け日本語情報あまりない
    • PySparkに食われてる
    • 簡単でしょと思ったあなたへ: 記事書いてください
  • 記号をググって検索できない
    • 例えばdef f(ns: Int*)はmultiple argsなのだけれど、分かってないと検索のしようがない。
    • symbolhoundみたいなのが必要?
    • チートシート的な記事があったらいいのかなぁ

私見

sbtは難しいと思います。難しいというのは語弊があって、とっつきにくいのだと思います。とっつきにくさがScalaの「難しさ」の過半を占めているのではないか。

日本語の記事不足

  • 学習ルートが未整備
    • 英語だとそこそこあるけど日本語情報はあまりない
    • 書いて!!!
  • (個人の感想)プログラミングスクールの雑な記事が山ほど出てくる
    • みんな記事書いてください!!!!!!
  • (個人の感想)難しくないよ、じゃなくて、面白いらしいぞ、じゃないと見てもらえない
    • 難しくなさをアピールしてもあまり意味ない
  • 単純に日本語情報がない
    • これは普通に「難しい」を底上げしてると思います
    • 強火のエンジニアは勝手に英語読めたり翻訳したりするけど、突き放すと当然初心者は離れていく
    • 一般的なエンジニアは英語読めないと思ったほうがいいと思う

私見

これは何度も何度も何度も言ってるんですが、参道を整備しないと誰も登ってきません。0合目のための記事がないと1合目まで来てくれないし、それはある程度登ってきてくれると勝手に登り始めるのだけれど、すくなくとも中級者になるまでは参道が必要だと思います。麓がないと山は成り立たなくて、初心者をちゃんと育成しないといけないと思っています。

風評

  • YouTuberが衰退してると言ってた
    • そんな〜
  • 言語でググると「オワコン」が出てくる
    • ブランドとかファッションでググると「ダサい」が出てくる現象の地続きだと思う
    • 逆FUDみたいな感じ
      • 不安にさせて実はそんなことないよ!でPVを稼ぐ記事が多い
  • 「Scalaは難しくない」は分かってる人しかそう言ってない
    • 初心者が大喜びでやってるイメージない

私見

良くしていく努力をするしかないと思っています。

Scala 3

  • Scala 3非対応だったり開発中なやつがまだある
  • Scala2教えて3教えるのか?という多重教育問題
    • 2と3とでは結構変更点が多い
    • すくなくとも初心者からすれば良くわからないポイントが1つ増えるだけ

私見

もう3から教えるで良いと思っているけれど、社内に2プロダクトがたくさんある、という状況では2を教えることになると思います。でも総合的な開発体験は3のほうが良いと思っているので、3に移行するサポートは続けていきたいと思っています。

手軽度がない

私見

最近はScala CLIとかが出て改善してるのか?と思うけどどうなんでしょう。最近知人と会話したんですが、ビジュアライゼーション系のツールがあまりなくてパッと見て分かりにくいね、という気付きがありました。また、Scala CLIでSparkをシングルノードでペラッと起動してちょっとした分析をする、みたいな行いを広めたいですね。

ライブラリやフレームワークが関数型寄りすぎる

  • Hello, World! と実用アプリケーションとの間に断絶がある
  • Scalaの人はライブラリを書いてフレームワークを書かない傾向がある
    • それはそれでエンジニアリングとしては立派なのだが・・・
    • 高品質な車の部品をたくさん作っているが、一向に車を作らない状況
    • 道具はあるが、どう使うかは教えてくれない
  • イディオムが多い
    • Goとかと比べるとよっぽど良いけど、JS/TSなどと比べてプリミティブを増やさない傾向がある言語なので、結局イディオムがちになる
    • 覚えゲー化する
  • Javaでいい
    • ウッ!!
    • 面白くて良い言語なんだよ、インストールやtoolingもJavaより楽だよ、みたいな感じになってほしい

私見

最近は関数型にあまり寄せていないライブラリも増えてきていて良い傾向だと思います。いったんそういうライブラリで慣れてもらって、もっとパワーが欲しかったら関数型のフルパワーを使うみたいな感じになると良いのかなと思います。

全体を通して

  • Scala自体はそんなに難しくない
    • 難しい言語機能もあるけど、普通はそんなに使わない
    • 例外的にimplicitまわりは難しい
  • とっつきにくいという表現のほうが正確なのだろうと思う
    • とっつきにくい、をザックリ言うと「難しい」になる
  • とっつきにくさを解消するには・・・
    • 日本語記事を充実させる
    • easyなツールを増やす、easyなツールの情報を増やす
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?