Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

アジャイル型ソフトウェア開発におけるmoving targetという語の初出

アジャイル型ソフトウェア開発はmoving targetを撃つためのプロセスだ」と大学で習った覚えがあるんだが、初出がパッと出てこなかったので調べた。

まず検索に引っかかったのが、Koppensteiner, S. & Udo, N. (2003). Will agile development change the way we manage software projects? Agile from a PMBOK® Guide perspective. Paper presented at PMI® Global Congress 2003—North America, Baltimore, MD. Newtown Square, PA: Project Management Institute. *1

で、そこで引用されているのが、Economist (2001, Sep 20), Agility Counts, The Economist*2で、今のところ調べた範囲ではこれが初出ではないだろうか。

情報システムにおける「排他処理」のバリエーション

一言で「排他処理」と言っても、Javaで実装したWebシステムで「排他」というキーワードに関連する処理を考えただけでもこれだけある。初学者はこれらがごっちゃになることも多いんじゃないかと思うのだけれど、こういう切り口でノウハウをまとめた書籍とかってないんだろうか?

DBMSの話

  • トランザクション分離レベル
    • READ COMMITTEDやREPEATABLE READなど、分離レベルごとのDirty ReadやNon-Repeatable Readの有無の指定。DBMSインスタンスやセッション等の単位で指定する。DBMSの製品ごとに、デフォルトの分離レベル、READ UNCOMMITTEDの指定可否、クエリ単位での指定可否などが異なる。
  • 行ロック
    • SELECT FOR UPDATEなど、DMLDDL実行時のロック指定。同じようなクエリを実行しても、DBMSの製品ごとに取得されるロックの強度が異なる。また製品によってはロックエスカレーションの仕組みがある。
  • テーブルロック
    • LOCK TABLEによるテーブルロック。主にバッチ処理中に処理対象となるテーブルを保護したり、DBAの叩くSQLから保護したりするときに使う。
  • 行ロックやテーブルロック以外のロック
    • 製品ごとにロックのかかる単位が異なる。SQL Serverはロックエスカレーションがあるし、行単位以外にもページ単位でロックがかかったりする*1
    • MySQLl*2PostgreSQL*3にはアドバイザリロックの仕組みがある。

アプリケーション実装方法の話

  • DBレコードの楽観排他・悲観排他の選択
    • 楽観排他・悲観排他それぞれの実装方法の検討も含む。
  • 業務処理の設計時に考慮する業務閉塞処理やバッチウィンドウの分離
    • 夜間バッチのバッチウィンドウ設計の際に、同じリソースを使うバッチを同時に走らせない設計をする場合などがこれ。

アプリケーションフレームワークの話

  • DBレコードの楽観排他
    • 楽観排他処理の実装にJPA@javax.persistence.Versionを使う場合など。
  • リソース分離

言語処理系の話

  • 処理系組込みの同期化機構
    • Javaだとsynchronized
  • プロセス内の並行処理用のライブラリ
    • Javaだとjava.util.concurrent.ConcurrentHashMapなど。
  • 言語処理系のライブラリにおける同期化有無
    • JavaだとHashMapVectorの違いなど。
  • 言語処理系がライブラリとして提供するプロセス内同期化機構
    • Javaだとjava.util.concurrent.Semaphoreなど。
  • 共有リソースの分離
    • 複数プロセスから参照可能なリソースの分離。一時ファイル名を一意にする際にFiles.createTempFile()を使用するなど。

ミドルウェアの話

  • リクエスト窓口制御による直列化
    • TomcatMaxThreadsを1にするなど。
  • トランザクションごとのリソース分離
    • OLTPモニタにおけるSYSOUTデータセットの書き込み先ファイルの分離など。
  • アプリケーションサーバによるセッション分離
    • HttpSessionによるセッション単位の分離、ThreadLocalによるスレッド単位の分離など。

OSの話

  • プロセス多重起動禁止
    • .NETではSystem.Threading.Mutexを使う例が多いけど、Javaだと何かあるかな。
  • OSによるプロセス間の排他制御
  • OSのファイルロック
    • POSIXだとfcntl(2)、最近の*NIXであればflock(2)。ローカルのファイルシステム上や、最近のLinuxカーネルがNFSv3上のファイルをロックする場合は基本的にアドバイザリロックになる*4flock(2)が使えない状況、たとえば「これから作る予定だけどまだ存在しないファイルに対するロックを獲得する」のような場合は代替の方法を使う必要がある*5
  • 共有リソースの分離
    • 複数プロセスから参照可能なリソースの分離。出力ファイル名を一意にする際にユーザIDやUUIDを使用するなど。

ソフトウェア工学分野における知識体系

satob.hatenablog.com

私が大学の頃に授業で紹介されていたComputing Curricula 1991 (CC91)は、その後2005年にComputing Curricula 2005 (CC2005)*1、2020年にComputing Curricula 2020 (CC2020)*2として改訂が行われている。内容も年を経るごとに大幅に拡充されており、CC2020ではその下にいくつかの分野(Computer Engineering, Computer Science, Cybersecurity, Information Systems, Information Technology, Software Engineering)に分かれたカリキュラム(Volume)があり、それぞれの分野ごとにカリキュラムが検討されている*3。たとえば計算機科学分野(Computer Science)では、CS2020の下にはCS2013 (Computer Science Curricular Volume)があった。現在はComputer Science Curricula 2023*4がベータ版として検討されている。

さて我らがソフトウェア工学分野はというと、CC2020から参照されている学部生向けのSoftware Engineering 2014 (SE2014)*5からその後更新はされていないように見える。院生向けにはGSwE2009*6があるようだ。

またこれとは別に、ソフトウェア工学に関する知識体系というとSWEBOK*7が思いつく。SE2014を策定する際もSWEBOKを参照しているようだ。SWEBOKはV3が最新版で、現在V4がパブリックプレビューに入っている。なおV3は日本語訳も出版されているが、Amazonには翻訳の質を問題とするレビューが並んでいる*8

また、ソフトウェア工学を含む領域としてシステム工学(Systems Engineering)を考えることもできる。今回調査して知ったのだが、ACMIEEEがまとめているわけではないが、BKCASEという組織がシステム工学に関する知識体系であるSEBoKを作成しているようだ*9。もちろん「システム工学」が対象なので、情報システム以外のシステム工学分野、たとえば医療システム分野の内容なども含まれているようだ。

なお、CC91や2005の影響を受けて日本ではどのような検討がなされているか?という点についてだが、まず1999年に情報処理学会が「大学の理工系学部情報系学科のためのコンピュータサイエンス教育カリキュラムJ97」*10を作成した。これもCC同様に改訂がされており、カリキュラム標準J07*11、カリキュラム標準J17*12が公開されている。CCと同様に、こちらも分野ごとに分かれた検討がされている。シラバスには日本語で参照できる参考文献が記載されており、学習の際の参考にできる。上記を受けた動きとして、文部科学省も「超スマート社会における情報教育の在り方に関する調査研究」*13をまとめている。

これらのまとめについて、日本語だと以下のページが概観によいだろう。 zenn.dev

Comparison of JavaScript libraries for QR code generation

# name URL License Last commit Stars
1 QR-Code-generator https://github.com/nayuki/QR-Code-generator MIT 2024/1/31 4640
2 node-qrcode https://github.com/soldair/node-qrcode MIT 2023/4/22 7036
3 qrcodejs https://github.com/davidshimjs/qrcodejs MIT 2015/11/25 13022
4 qrious https://github.com/neocotic/qrious GPLv3 2017/1/5 1490
5 jquery-qrcode https://github.com/jeromeetienne/jquery-qrcode MIT 2018/7/3 4820
6 algorand-qrcode https://github.com/emg110/algorand-qrcode MIT 2023/2/7 19
7 qrcode-generator https://github.com/kazuhikoarase/qrcode-generator/?tab=readme-ov-file MIT 2024/1/20 2033

Access results to HTTP probe sites for captive potals

# Site note Chrome Firefox Edge IE iOS Safari
1 http://www.alwayshttp.com/ HTTP HTTP HTTP HTTP HTTP
2 http://neverssl.com HTTPS HTTP HTTPS HTTP HTTPS
3 http://example.com/ HTTP HTTP HTTP HTTP HTTP
4 http://www.msftconnecttest.com/connecttest.txt probe for Windows 10 Version 1607 or later HTTP HTTP HTTP HTTP HTTP
5 http://www.msftncsi.com/ncsi.txt probe for Windows 10 Version 1511 or earlier HTTP HTTP HTTP HTTP HTTP
6 http://captive.apple.com/hotspot-detect.html probe for Apple devices HTTP HTTP HTTP HTTP HTTP
7 http://www.apple.com/library/test/success.html probe for Apple devices HTTPS HTTPS HTTPS HTTP HTTPS
8 http://www.gstatic.com/generate_204 probe for Android (no body) HTTP HTTP HTTP HTTP HTTP
9 http://connectivitycheck.gstatic.com/generate_204 probe for Android (no body) HTTP HTTP HTTP HTTP HTTP
10 http://clients3.google.com/generate_204 probe for Android (no body) HTTP HTTP HTTP HTTP HTTP
11 http://nmcheck.gnome.org/check_network_status.txt NetworkManager HTTP HTTP HTTP HTTP HTTP