ソフトウェア開発」カテゴリーアーカイブ

Microsoft Edgeへの移行を検討中

これまで、ブラウザはBraveを利用してきましたが、Microsoft Edgeがここのところ気になる機能を出しているので移行を検討中です。

SplitView

1つ目の気になる機能としてはSplitViewです

今、モニタとしては4年前に購入した29インチのウルトラワイドディスプレイを使用しています

https://amzn.to/42pQgnu

ウルトラワイドなので、ここにブラウザを半々に表示させて作業をしています。
左のブラウザでXを表示させながら右のブラウザでネットを見ていたり、X上で投稿された記事を右のブラウザにアドレスをコピペして表示させるなどですね。

Edgeのスプリットビューは、一つのタブを分割することができるようになります。

ツールバーの上記アイコンを押下することで画面が分割され、

左側のページ上にあるリンクをクリックすると、右側のビューに表示されるような感じ。

どちらのビューにデフォルトとして表示させるのかや、左右の切り替えはビュー右上にある3点リーダーをクリックして表示されるメニューで指定することができる

使ってみてよかったところと注意点

ウィンドウ自体を2つ配置すること自体は、これまで不便に感じたことはそれほどなかった。

ただ、この仕組みを使い始めるとなかなか便利である。
表示するページによっては、画面全体で見たいときもあればそうでなくても問題ないこともある。

タブごとにSplitするかどうかを選択することができ、更に分割位置も調整することができるのでその比率をいい感じにすることができる。

クリックした際に自動的に別ビューに表示されるのでコンテキストメニューから「別のタブで開く」を選択する必要性はない。

注意しないといけないのは、別のリンクをクリックするとビューの内容が更新されてしまう。
そのため、次々と新しいタブを開いていくとい運用は向かずに、一つ一つ読み終えてからリンクを開く必要性が生じてしまっている

まぁ、落ち着いて読んで行けよと言われればそのとおりなので、実際に問題になるのかは使ってみて考えることにする

コレクション

気になったものを保存する先として、お気に入り以外にコレクションと言う機能が追加されている

ツールバーの上記アイコンを押下することでコレクションを表示させることができる。

コレクションは、Webページ全体だけでなく、その中の画像や文字列のみを追加することができるので、ちょっとしたスクラップブックのようなイメージ。

追加したコンテンツは画像であれば画像、文字であれば文字がコレクションに追加されていき、クリックするとその元となったページが表示される。

使ってみてよかったところと注意点

何かしらテーマを持って調べ物をしている際に、面白いなって思ったことをメモ代わりに追加しておけるので、後で読もうかな?という感じでタブを開きっぱなしにするといったことを防ぐことができるかもしれない。

カテゴリごとにコレクションを作って、面白かった記事や文言を抜き出してコレクションに追加していけば、情報収集や整理が楽になりそうな気がする。
追加したコレクションにはメモを残すこともできる

メモを残すことで、対象をなぜコレクションに追加したのかを後から見返した際にすぐに気づくことができるようになる。

一方で、コレクションに追加したものをクリックすると新しいタブで表示されてしまう。

画像をクリックした際には画像を拡大表示する、テキストをクリックした際にはテキストを選択可能にするといったほうが個人的にはいいように感じるけど、そのあたりは情報が更新されている可能性だとか、著作権的になのか、リンクと言う形を取ったほうが安全とかそういうことがあるのかもしれない。

Microsoft Rewards

これまで、Braveを使ってきた一つの理由がBraveのReward機能だ。

Braveは広告のブロックに力を入れていて、Webページ上の広告を自動的に非表示にしてしまう。
一方で、Brave自身が定期的に広告を出すような仕組みを入れている。

このBraveがだす広告による収益は、Braveのユーザに仮想通貨(BAT)として還元される。

つまり、Braveを利用しているだけで仮想通貨を取得することができるのだ

これらに関しては、bitFlyerなど仮想通貨取引所でアカウント作成して連携しておく必要はあります。

さて、これまでの履歴を見てみると。。。

月によって、ものすごいばらつきがありますが、仮に、平均0.5BATとすると、2024/2/4現在

一ヶ月15円くらい・・・・?

うーん、別にこれで儲けようとか思ってはいないですが、これを理由に続けるかどうかはあまりに意味がないですね。

と思っていたら、Edgeにも Microsoft Rewards なるものが。

現在のRewadsポイントはウォレットを表示することで確認することができます。

Rewardsは、Bing使ったりしていると貯まるようで、ちょっとした日々の指定されたアクティビティをすることでも貯めることができる。

ためたRewadsはAmazonギフト券とかと交換することもできるようだが、そのために色々と頑張るのもちょっとバカバカしいので、これはあくまでオマケ機能と思っていたほうが良さそうだ。

しばらく使ってみて判断

まだ、本腰入れて移行するかは決めていないけれど、SplitViewで次々と表示させながら、気になったものをコレクションへ追加するという運用は、良さそうに思える。

XやGMailで届いたものを開いていったり、Kaggleのノートブックを集めていったりと、お気に入りでやってしまうには永続性がないものはコレクションに追加していき、必要がなくなった時点でコレクションごと削除、とか。

BingChatでGPTへの質問とかも気軽にできるようになっているので、しばらく使っていなかったけどEdgeの進化スピードは気づいたらすごいことになっているイメージ。

まだ埋もれた機能もあるだろうから、ちょっと一度しっかりと見てみると生産性がバク上がりするかもしれないな、と思った。

SoftwareDesign2月号

定期購読しているSoftwareDesignの2月号が届きました。

https://amzn.to/3UtdNSq

今月号の特集としてはテストとWeb APIセキュリティに関して。

テストに関しては、テスト技法に目を奪われがちなんだけど、そもそものテストの考え方を正していく必要があるとしてテストマニフェストが紹介されていた

https://www.growingagile.co/the-testing-manifesto/

SoftwareDesignに掲載されていたものは2015年バージョンで、上記のものは2023年バージョンのようだ。
基本的な考え方が変わっているわけではなく、言葉を少し修正した形と紹介されていた。

checking functionality over Testing understanding

機能性をチェックするよりも、理解をテストするとでも訳すのだろうか?
SoftwareDesignでは「機能性をチェックするよりも、チームが理解している価値をテストする」とある。

これは、結構難しい問題に感じる。

本来、価値を提供するために機能を作り込んでいるはずのものが、機能を作ることが目的となってしまって気がつくとその価値が提供できていないのではないだろうか?ということだろうか。

そう考えると確かに、そしてまさに、アジャイルではないか

ソフトウェア開発ではプログラミングによって機能を作り込んでいく。ただ、出来上がったアプリケーションがその機能によってなんの価値を提供しているのかに立ち返って、常に検証し続ける必要がある。
そして、アジャイルの文脈ではその検証を繰り返してスプリントを回していく。

どうも、ウォーターフォールが染み付いてしまい、当初作った仕様に従った機能のテストしかできていないように感じてしまった。

改めて、このあたりに関しては気を引き締めていかないといけないと感じた。

先日、仕事でイベントに参加させていただいた際にOracleが提供している MySQL Heat Waveなるものを知った

Heat Wave

MySQL HeatWaveは、HeatWave In-Memory Query Acceleratorを搭載したフルマネージドのデータベース・サービスです。トランザクション、データウェアハウスやデータレイクをまたいだリアルタイム分析、機械学習を1つのMySQL Databaseに統合し、ETLの重複による複雑さ、レイテンシ、リスク、コストを排除した唯一のクラウド・サービスです。

HeatWave – 組み込みのMLによるインメモリ・クエリ・アクセラレータhttps://www.oracle.com/jp/mysql/heatwave/

ということで、DBとDataLakeが合体したような感じなのかしら。
OracleCloudだけでなく、AzureやAWSでも動作するとある。
そういう意味ではSnowFlakeの対抗になるものなんだろう

そう思ったら、あからさまに対抗意識を燃やしている記事があった

5 reasons why MySQL HeatWave on OCI is better than Snowflake
https://www.oracle.com/mysql/heatwave/heatwave-vs-snowflake/

こういった公式で出している比較がどれほど意味があるのか。
都合がいい条件での比較担っている可能性もあるので、なんとも言えないところはあるけど、AWSでも動作するというのであれば試してみても面白いのかもしれない。

ただし、こちらの記事を読むと、AWSで使う場合にもOracleCloudの契約が必要になるようだ

東京リージョンにやってきた MySQL HeatWave on AWS を試す (1) 初期設定編https://qiita.com/hmatsu47/items/8f202eef64ea57e7d948

うーん、それは結構面倒そうだ。

OracleとMicrosoft

色々とHeatWaveに関して調べていると、こんな記事も見つけた

Ellison氏は、OracleとMicrosoftの連携についても改めて語った。「Oracle Cloud」とAzureのマルチクラウドでは、データのイグレス/エグレスの料金がかからないほか、AzureのアプリケーションとOracle Cloudのデータベース間は非常に低遅延だという。また、Oracle Cloud/Azureにおける大半のサービスは双方のコンソールからアクセスできる

「ウォールドガーデンは崩壊した」–エリソン氏が語る、顧客を“庭の主”にするマルチクラウド
https://japan.zdnet.com/article/35194867/

マルチクラウドで業務を回しているユーザーも、なんでそうなったのかはベンダーがそれぞれそう構築したという後ろ向きな理由も多分にあるだろうが、それなりに増えている気がする。

その中で、クラウド間でのデータ連携は日常で発生していることを考えると、こういう動きというのは歓迎されるべきもので、現状で他はどうなんだ?というのは気になるところだけど、うまく見つけることができなかった。

OCI(Oracle Cloud Infrastructure)はこれまであまり気にしてこなかった面もあるので、ちょっと気に留めておいてもいいかもと、思ったです。

ちなみに、OCIと聞くとどうしてもOracle Call Interfaceを思い浮かべてしまうんですよね。。。あれ、今でもあるよね、きっと。

Docker で GPUを使いたい

少し前から OpenAI が提供している whisper を触っています

業務でお客さんとMTGをする機会が最近増えてきて、会話をしていると会話に集中してしまって、メモを取り忘れてしまうんですよね。
端々ではメモをとっても、やっぱり抜けてしまう事はあったり、話を聞いていて

「お、それはこういうことかな?」

って考えている間に話が進んでしまっていたり。。。
ということで、できるだけ録音をするようにしています。

どうせなら文字起こしを手軽に行いたいというのがモチベーションとなります。
将来的には要約まで自動的にやってくれるとよくて、それはもう現実的なレベルまで世の中は来ているわけですが。

Dockerfile

参考にさせてもらったのはこちら

Dockerを使ってOpenAIのWhisperをサクッと試す
https://zenn.dev/kento1109/articles/d7d8f512802935

FROM pytorch/pytorch:1.9.0-cuda10.2-cudnn7-runtime

WORKDIR /workspace

RUN apt-get update && apt-get install -y \
    build-essential \
    gcc \
    git \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --upgrade pip

RUN pip install git+https://github.com/openai/whisper.git 

試してみるとエラーになった

root@dfbc095388f8:/workspace# whisper mtg02.m4a --language ja --model large
Traceback (most recent call last):
  File "/opt/conda/bin/whisper", line 5, in <module>
    from whisper.transcribe import cli
  File "/opt/conda/lib/python3.7/site-packages/whisper/__init__.py", line 12, in <module>
    from .decoding import DecodingOptions, DecodingResult, decode, detect_language
  File "/opt/conda/lib/python3.7/site-packages/whisper/decoding.py", line 514
    if prefix := self.options.prefix:
               ^
SyntaxError: invalid syntax

cudaのバージョン問題

参考にさせていただいたページにもあるように、pytorch をPCにあった cuda バージョンにする必要があります。

cudaバージョンの確認方法は、コマンドプロンプトで

>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Jun__8_16:59:34_Pacific_Daylight_Time_2022
Cuda compilation tools, release 11.7, V11.7.99
Build cuda_11.7.r11.7/compiler.31442593_0

という形で表示されます。

ところが、イメージには11.7用のものが見当たらないんですよね

pytorch/pytorch
https://hub.docker.com/r/pytorch/pytorch/tags?page=1&name=11.

最新は11.6のようなので、こちらを使用してみる

FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime

modelのダウンロードエラー?

実行してみると。。。

root@401ac01bcb2c:/workspace# whisper mtg03.m4a --language ja --model large
  0%|▏                                    | 12.3M/2.87G [00:02<11:43, 4.37MiB/s]
Traceback (most recent call last):
  File "/opt/conda/bin/whisper", line 8, in <module>
    sys.exit(cli())
  File "/opt/conda/lib/python3.10/site-packages/whisper/transcribe.py", line 310, in cli
    model = load_model(model_name, device=device, download_root=model_dir)
  File "/opt/conda/lib/python3.10/site-packages/whisper/__init__.py", line 108, in load_model
    checkpoint_file = _download(_MODELS[name], download_root, in_memory)
  File "/opt/conda/lib/python3.10/site-packages/whisper/__init__.py", line 62, in _download
    raise RuntimeError("Model has been downloaded but the SHA256 checksum does not not match. Please retry loading the model.")
RuntimeError: Model has been downloaded but the SHA256 checksum does not not match. Please retry loading the model.

ん、Modelのダウンロードに失敗した?
リトライしろってあるのでもう一度やってみる

root@401ac01bcb2c:/workspace# whisper mtg03.m4a --language ja --model large
/opt/conda/lib/python3.10/site-packages/whisper/__init__.py:48: UserWarning: /root/.cache/whisper/large-v2.pt exists, but the SHA256 checksum does not match; re-downloading the file
  warnings.warn(f"{download_target} exists, but the SHA256 checksum does not match; re-downloading the file")
 23%|████████▌                             | 667M/2.87G [01:34<05:55, 6.71MiB/s]

先に進んだので大丈夫じゃーん!って思っていたら、ここから進まなくなった。。。

今日はここまでにしよう。。。

Goerli Testnet ETH Claim キャンペーン

buildspace もようやく、 React のフロントエンドから Goerli Testnet にDeployしたスマコンに接続するところまで終了

途中、どうしてもうまくいかないな?と時間がかかる場所があったのですが、チュートリアルとしてその時点ではうまくいかない状態というオチでした。

時々ある罠ですが、ちょっと困るものです。。。

Goerli Testnet への Deploy は、以前にも誰ジェネでやってます。

誰でもできる!ジェネラティブNFT開発
https://crypto-code.jp/materials/create-generative-nft

ただ、その時もテスト用のEthが足りなくて、そもそもDeployできないという事態になったんですよね。結果としてその時は諦めてしまった過去があります。

そんな中、こんなTweetが!
過去に Mainnet / Goerli / Sepolia で Deploy したことがある人に 10 Goerli ETHをくれるという!

両手を上げて行ってみましたが、、、、 2022/11/15 時点でDeployしている必要があるとのこと。
そして、私がGoerliで試していたのが 11/16 。。。

うがあああああああああ

という訳で、見事に対象外でもらうことができませんでした。。。
これは、ちょっとせつなすぎる。。。

いつものことといえばいつものことですが、本当に間が悪い。。。

どうにかならないものか。
どこかにお祓いに行ったほうが良いのかもしれません

SoftwareDesigne 2月号

定期購読しているSoftware Designe の2月号が届きました!
今月号はDDD!!!!

見てみると、増田さんが執筆されているじゃありませんか。

ずいぶんと前ですが、DevLove で増田さんが登壇されていた回に見に行ったんですよね。
確か恵比寿だったかな・・・?

もちろん、原点ともいうべきエヴァンス本も持ってはいるのですが、いずれのDDD本も結局最後まで読めていないという体たらくな現状が今の私を作り上げている!!

と、非常に残念な状態ではあるんですが、ちょうどこれから新しい案件で、このあたりの整理をしていかないと行けないんじゃないかな?と思うような事案が勃発。

Software Designe編集部はすべてを見越しているはず!!という訳で、今年はDDDをしっかりと学んで実践で使っていくことができるように頑張ってみたいと思います。

増田さんの本、ちゃんと読まないとですね。。。

Fletが面白そう

Pythonだけでクロスプラットフォームなアプリを作れるFletについて
https://qiita.com/NasuPanda/items/48849d7f925784d6b6a0

Qiitaからのニュースレターで紹介されていた上記記事、面白かった。

FletはFlutterをベースとしているそうなので、その点も気になるところです。

The fastest way to build Flutter apps in Python
https://flet.dev/

UIの作り方や指定の仕方が今っぽくない形をしているけど、これがサクッとプロトタイプ的に使えるのであれば面白いかな。

ということで、ちょっとどこかで触ってみたいと思っています。

Build an Ethereum dApp Section 1 clear

buildspaceを引き続きやっています。
夜の時間をちょこちょことなので、進みが遅いですね。。。

hardhatを使った、ローカルでのスマートコントラクトの作成を追えて、フロントエンド開発としてReactを触り始めています。

Section2では、Replit というWeb IDEサービスを使って、フロントエンド開発を行っていくようです

Replit
https://replit.com/

最近、こういうブラウザベースのIDE。そしてそのままDeployまでできてしまうツールが増えてきていますよね。
なんかメニューを見ていたらこんなものも。。。

Ghostwriter・・・?
AIとのペアプロ??

Meet Ghostwriter, your partner in code.
https://replit.com/site/ghostwriter

なんか面白そうですね。。。

色々なプロジェクトのチュートリアルをやっていると、その時の最新手法やツールなどを触ることができて面白いです。
実際の業務でこれらが使えるか?と言うと、なかなか悩ましいものがありますが、ちょっとしたお試しでやる分には十分そう。

問題はそのちょっとしたお試しと、それ以降の切り分けなのかな?
でも、それ以降に発展するところまで行ってから考えろって感じですね

buildspace で早速躓いていた

色々と考えた結果、もう少しちゃんとdAppsを勉強していこうとbuildspaceの「Build an Ethereum dApp」をやり始めています

buildspace
https://buildspace.so/p/build-solidity-web3-app

そしてやり始めた矢先、一番最初のhardhat test が何故かエラーになる始末。。。

c:\Dev\buildspace\ethreum-dapp\my-wave-portal>npx hardhat test
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
Compiled 1 Solidity file successfully


  Lock
    Deployment
      1) Should set the right unlockTime
      √ Should set the right owner
      2) Should receive and store the funds to lock
      3) Should fail if the unlockTime is not in the future
    Withdrawals
      Validations
        4) Should revert with the right error if called too soon
        5) Should revert with the right error if called from another account
        6) Shouldn't fail if the unlockTime has arrived and the owner calls it
      Events
        7) Should emit an event on withdrawals
      Transfers
        8) Should transfer the funds to the owner


  1 passing (2s)
  8 failing

  1) Lock
       Deployment
         Should set the right unlockTime:
     AssertionError: expected BigNumber { value: "1705326131" } to equal 1705326131
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:32:42)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)
      at runNextTicks (node:internal/process/task_queues:65:3)
      at listOnTimeout (node:internal/timers:528:9)
      at processTimers (node:internal/timers:502:7)

  2) Lock
       Deployment
         Should receive and store the funds to lock:
     AssertionError: expected BigNumber { value: "1000000000" } to equal 1000000000
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:46:65)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)
      at runNextTicks (node:internal/process/task_queues:65:3)
      at listOnTimeout (node:internal/timers:528:9)
      at processTimers (node:internal/timers:502:7)

  3) Lock
       Deployment
         Should fail if the unlockTime is not in the future:
     Error: Invalid Chai property: revertedWith
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:78:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:55:64)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

  4) Lock
       Withdrawals
         Validations
           Should revert with the right error if called too soon:
     Error: Invalid Chai property: revertedWith
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:78:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:66:44)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

  5) Lock
       Withdrawals
         Validations
           Should revert with the right error if called from another account:
     Error: Invalid Chai property: revertedWith
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:78:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:80:66)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

  6) Lock
       Withdrawals
         Validations
           Shouldn't fail if the unlockTime has arrived and the owner calls it:
     Error: Invalid Chai property: reverted
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:78:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:93:48)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

  7) Lock
       Withdrawals
         Events
           Should emit an event on withdrawals:
     Error: Invalid Chai property: emit. Did you mean "exist"?
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:75:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:106:14)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

  8) Lock
       Withdrawals
         Transfers
           Should transfer the funds to the owner:
     Error: Invalid Chai property: changeEtherBalances
      at Object.proxyGetter [as get] (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\node_modules\chai\lib\chai\utils\proxify.js:78:17)
      at Context.<anonymous> (C:\Dev\buildspace\ethreum-dapp\my-wave-portal\test\Lock.js:119:41)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

いや、まだロクに何もしていないのでこんなところでエラーが出るはずもないと思っているんだけど。。。という領域。

なんか、最近こういう、チュートリアルがそのまま動かずにやる気なくすというパターンが続くような気がする。
ただ、Discord見ているとできている人もいるので、なんだろう?
環境要因??

Powershellで試してみた

うーん、なんでだろう??と思って、ダメ元でPowershellでやってみたら。。。

PS C:\dev\buildspace\ethreum-dapp\my-wave-portal> npx hardhat test
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.


  Lock
    Deployment
      √ Should set the right unlockTime (1301ms)
      √ Should set the right owner
      √ Should receive and store the funds to lock
      √ Should fail if the unlockTime is not in the future
    Withdrawals
      Validations
        √ Should revert with the right error if called too soon (66ms)
        √ Should revert with the right error if called from another account
        √ Shouldn't fail if the unlockTime has arrived and the owner calls it
      Events
        √ Should emit an event on withdrawals
      Transfers
        √ Should transfer the funds to the owner


  9 passing (2s)

いや、おかしいだろ。

なんで コマンドプロンプトとPowershellで結果が違うんだよ。。。

かなりこれで時間つぶしてしまったぞ。。。畜生

良いコード悪いコードで学ぶ設計入門(1)

このところ、本を読むスピードがめっきり落ちてしまっていて、まだ俗に言う”ミノ駆動本”を読み終えておりませぬ。

読み終えていませんが、多くの学びを得られると共に、結構モヤモヤと思うところが多いです。

私自身、プログラマーとしては正直底まで力量は無いものの、これまで携わってきたコードの中で利用されてきた考え方というものが”悪”と言われてしまうことに、抵抗があるんでしょうね。

コーディングの考え方、パラダイムの変化はやはりあるもので、常に問題を抱えている現場からすると、過去のコードというものはやはり問題を抱えていたのであろうし、現時点でも問題を抱えていればやはり見直しをかけていくものだと思います。

特に、オブジェクト指向の説明で用いられる継承に関しては、正直「おっ?」と思わずにはいられませんでした。

それぞれの現場にはそれぞれの前提があります。
ずっと同一プロダクトに携わっている人からしてみたら、「このプロジェクトのメンバーならそんなの知って当たりまえだよね」って事をできるだけ下げる。
新規参画者をできるだけ増やす。ハードルを下げるという意味において、高凝集にする意味。。。というよりは低凝集を避ける意味が出てくるんだろう。

言語側の機能が拡張されていくに連れ、その時代にあった書き方や問題の解決方法が出てくるというのは本来面白いものであるはずなのだが、心の弱い私には”悪”とか”クソコード”という強い言葉に抵抗を感じてしまうんでしょう。

もっと強くならないといけないな、なんて思いながら読んでいます。

あとちょっとだけど、もやっとするので時間かかる。。。