情報処理学会研究報告
IPSJ SIG Technical Report

GitHub プロジェクトに利用されているStack Overﬂow のコード片の進化パターンの調査栗原 拓己1,a)

嶋利 一真1,b)

神田 哲也1,c)

井上 克郎1,d)

概要：ソフトウェア開発プラットフォームである GitHub では，プログラミングに特化した Q&A フォーラムである Stack Overﬂow からコード片の再利用が行われている．Stack Overﬂow のコード片は頻繁に変更が行われ，利用者はその修正状況を把握することが望ましい．しかし，Stack Overﬂow のコード片と再利用先の GitHub のコード片はそれぞれ異なった変更が繰り返されており，2 つのプラットフォームで同様の変更がされているものはごくわずかであるという報告がなされている．そのため，Stack Overﬂowのコード片の進化を追従する必要性についてはより詳細な分析が必要である．本研究では，GitHub プロ
ジェクトに利用されている Stack Overﬂow のコード片の変更履歴を分析し，進化パターンの分類を行う．
対象は Java プロジェクトに限定し，データセット SOTorrnet を用いて，再利用された Stack Overﬂow の
コード片の変更履歴を手作業で調査した．GitHub のコード片が StackOverﬂow のコード片に追従しているか調査し，追従していないものに対しては進化パターンの分類を行い，進化を追従する必要性について考察した．

1. はじめに含む Stack Overﬂow の投稿のうち 79%が，少なくとも一度は変更されていることが明らかになっている [2]．しか

ソフトウェア開発において，ソースコードの再利用は頻し，Manes らの異なる調査で，参照関係にある GitHub プ

繁に行われている．特にソフトウェア開発プラットフォー

ロジェクトと Stack Overﬂow のコード片において，ともムである GitHub では，さまざまな Web サイトからコードに進化しているものは高々 10%程度で，それ以外は独立に片の再利用が行われている．その中でも，Stack Overﬂow

進化していることが明らかになっている [3]．この調査でのようなプログラミングに特化した Q&A フォーラムは盛は両者のコード片の変更内容について詳細な分析が行われんに利用されており，開発者はコーディングに関する質ておらず，バグ修正などの再利用時に影響を及ぼすような問をし，回答を求めることで効率よく開発を行っている．

Stack Overﬂow のコード片の変更を，コード片を利用したStack Overﬂow では質問と回答が公開されているため，質GitHub プロジェクトの開発者が見逃している可能性が存

問者以外の開発者も投稿に含まれるコード片を再利用す

在する．

ることが多い．Hata らの調査によると，GitHub プロジェ

そこで本調査では Java プロジェクトを対象として，

クトのソースコード中にコメントとして記述されるドメ

GitHub プロジェクトに利用されている Stack Overﬂow のインについて，Stack Overﬂow は 2 番目に多く参照され

コード片の進化に関する調査を行い，進化のパターンにつていることが明らかになっており，開発者が頻繁に Stack

いて分析を行う．また，これらのコード片の内容や GitHub

Overﬂow の投稿を参照していることが分かる [1]．しかし，プロジェクトにおける追従状況に関しても調査し，Stack

Stack Overﬂow の投稿は修正などの目的で変更が加えられ

Overﬂow のコード片を再利用した際に，その後のコード片

ることが多く，投稿の再利用先で最新バージョンでない投の進化に追従する必要性について考察する．本研究の RQ稿が利用され続けている可能性がある．Manes らの調査は以下の通りである．

では，GitHub プロジェクトで参照されているコード片をRQ1: Stack Overﬂow の最新バージョンのコード片を利用している GitHub プロジェクトはどの程度あるか？

1
a)
b)
c)
d)

大阪大学
takumi-k@ist.osaka-u.ac.jp
k-simari@ist.osaka-u.ac.jp
t-kanda@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

c 2021 Information Processing Society of Japan⃝

GitHub プロジェクトにおける Stack Overﬂow のコード
片の利用事例に関して，最新バージョンの投稿が利用されている割合に関して調査を行う．調査可能な 232 件中 186

1

情報処理学会研究報告
IPSJ SIG Technical Report

件が最新バージョンのコード片を利用しており，46 件が旧バージョンのコード片を利用していた．

RQ2: GitHub プロジェクトに旧バージョンが利用されている Stack Overﬂow のコード片はどのような進化パ
ターンがあるか？

GitHub プロジェクトが利用した Stack Overﬂow のコー
ド片と現在の Stack Overﬂow のコード片に差分がある場合に，ユーザから見た振舞いの変化をもとにコード片の進化パターンを分類した．その結果，旧バージョンを利用している 46 件中振舞いの変化があるものが 17 件，振舞いの変化がないものが 25 件，Stack Overﬂow の投稿の説明を補足したものが 4 件であった．また，それぞれの進化パター
ンに対して進化を追従する必要性があるか考察した．
以降，2 章では研究背景や関連研究について述べる．3*1
図 1 Stack Overﬂow の投稿の編集履歴（ID:3537085）

章では本研究の調査方法について述べ，4 章では，得られた結果と考察を述べる．最後に 5 章では本研究のまとめと今後の課題を述べる．

2. 背景
2.1 Stack Overﬂow
Stack Overﬂow は 2008 年に設立されたプログラミングに関する質問とそれに対する回答を投稿・検索できる Q&A
フォーラムである [4]．2021 年 6 月現在，ユーザ数は約1,500 万人，投稿は質問と回答を合わせて約 5,300 万件で，1 日に約 1,000 万人が Stack Overﬂow を閲覧しており，開発者に広く普及している [5]．開発者は，機能の実装方法やAPI の利用法などに関する疑問が生じた際に，その内容をテキストやコード片を組み合わせて説明し質問として投稿する．質問に対する回答も同様にテキストやコード片を組
み合わせて投稿でき，質問や回答に関するコメントや投稿内容の変更も可能である．また，利用者は質問や回答の変
更履歴も閲覧可能である．図 1 に回答の変更履歴の例を示す．回答例では 3 つのバージョンがあり，回答に対する二度目の編集では実線で囲まれたコードブロックにおいて，

図 2 ブ ロ ッ ク ご と に 分 け ら れ た Stack Overﬂow の 回 答 例（ID:3537085）*2

赤でハイライトされたコードが削除され，緑でハイライト
されたコードが追加されていることが分かる．これらの編集は回答者だけでなくの他のユーザが変更可能であり，寄せられたコメントに関連した内容の変更も多い [6]．

ストブロック，実線で囲まれている番号 2 はコードブロッ
クである．番号 4 はこの回答に寄せられたコメントである．SOTorrent を用いることでそれぞれのブロックごとのバージョン履歴にアクセスでき，詳細な分析が可能であ2.2 SOTorrent
SOTorrent[6] は，公式の SO データダンプと Google BigQuery GitHub データセットに基づくオーブンデータセッ
トであり，投稿のテキストブロックやコードブロックごとの変更履歴が保存されている．図 2 にテキストブロックとコードブロックに分けた Stack Overﬂow の回答例を示す．図 2 で破線で囲まれている番号 1,3 のブロックがテキる．また，SOTorrent には Stack Overﬂow の投稿を参照した GitHub プロジェクトの情報も格納されている．この情報を用いることで，GitHub プロジェクトにおける Stack

Overﬂow のコード片の利用状況を調査することができる．
2.3 Stack Overﬂow の投稿の再利用
ソフトウェア開発における機能の実装の際に，すでに存在*2*1

https://stackoverﬂow.com/posts/3537085/revisionsc 2021 Information Processing Society of Japan⃝

https://stackoverﬂow.com/questions/3536968/get-allpossible-available-currencies/3537085#3537085

2

情報処理学会研究報告
IPSJ SIG Technical Report

している [3]．
以 上 の 既 存 研 究 か ら ，Stack Overﬂow の コ ー ド 片 は

GitHub プロジェクトにおいて頻繁に再利用されているが，バグや脆弱性，さらには陳腐化した情報も多い上，これらの修正には時間を要することが分かっている．これらの問題があるコード片を GitHub プロジェクトが再利用しており，Stack Overﬂow の投稿においてこれらの問題が修正されていた場合は，同様の修正を GitHub プロジェクトにおいても反映すべき可能性があるが，現状そのような事例は少ないことが分かる．

3. 調査
図 3 Stack Overﬂow の旧バージョンのコード片を利用している例

本調査では Java プロジェクトを対象として，GitHub プ
ロジェクトに利用されている Stack Overﬂow のコード片のする他のソフトウェアや Q&A サイトなどからソースコード

進化に関する調査を行い，進化のパターンについて分析をを再利用することは一般的に行われており，Stack Overﬂow

行う．また，これらのコード片の内容や GitHub プロジェの投稿のコード片も開発者に再利用されることが多い．Wu

クトにおける追従状況に関しても調査し，Stack Overﬂow

らは GitHub プロジェクトにおける Stack Overﬂow の投稿のコード片を再利用した際に，その後のコード片の進化にの再利用に関する調査を行い．49%の投稿が編集を伴って追従する必要性について考察する．本研究では以下の 2 つ再利用されている事を明らかにしている [7]．また，再利用の RQ を設定した．

の事例において 71%のファイルが Stack Overﬂow の投稿• RQ1: Stack Overﬂow の最新バージョンのコード片への参照をソースファイル内に含んでいることも明らかにを利用している GitHub プロジェクトはどの程度あ

している．

るか？

また，Stack Overﬂow の投稿のコード片の利用における• RQ2: GitHub プロジェクトに旧バージョンが利用さ問題も指摘されている．複数の研究で，Stack Overﬂow なれている Stack Overﬂow のコード片はどのような進

どの Q&A サイトのコード片を利用することにより，バグ化パターンがあるか？

の混入 [8]，ライセンス違反 [9] やセキュリティの脆弱性 [10]RQ1 は GitHub プロジェクトに利用されている Stackの問題を引き起こす恐れがあることが示されている．まOverﬂow のコード片の変更履歴を分析し，GitHub のコー

た，Zhang らは Stack Overﬂow における情報の陳腐化にド片が Stack Overﬂow のコード片に追従しているか調査

ついて調査を行っている [11]．Stack Overﬂow において陳する．RQ2 は GitHub のコード片が追従していない Stack

腐化した回答の半数以上が最初に投稿された時点で古い情Overﬂow のコード片に対して進化パターンの分類を行い，報であり，そのような回答のうちその後変更されたものは進化に追従する必要性について考察する．

20.5%のみであった．また，陳腐化に対する指摘まで平均

調査手順は以下の STEP1〜STEP4 で構成されている．

して 118 日要しており，陳腐化した投稿の修正には時間を• STEP1: 既存スクリプトによるデータベース構築要することが分かっている．

• STEP2: 一回以上変更されているコード片と再利用先

Stack Overﬂow のコード片を再利用する際，再利用時点
から変更されるとバージョンの違いが生じることがある．
具体的には Stack Overﬂow のコード片を GitHub プロジェ
クトで利用した後，参照元の Stack Overﬂow のコード片

プロジェクトの組を抽出• STEP3: 再利用されているコード片のバージョンの調査• STEP4: 進化パターンの分類が変更される場合がある．そのような事例の概要を図 3 にSTEP1 では，Baltes ら [6] が作成した SOTorrent（2018-示す．このような事例に対する調査として，Manes らの09-23）のデータセットと Diamantopoulos ら [12] の研究で研究では Stack Overﬂow の投稿と，その投稿から GitHub

使用された既存スクリプトを使用してデータベースを構築

プロジェクトで再利用されるコード片についてそれぞれする．STEP2 では，Diamantopoulos らが研究で使用したの進化に着目して調査を行っている．結果として，Stack

スクリプトを拡張し，STEP1 で構築したデータベースからOverﬂow では 76%のスニペットが進化しているのに対し，

コードブロックが一回以上変更されている Stack Overﬂow

GitHub では 22%しか再利用されたコード片は進化していの回答とそれを利用している GitHub のファイルの URL

ないことがわかった．また 2 つのプラットフォームでともを抽出した．STEP3 では，STEP2 で抽出した GitHub プに進化しているものは高々 10%程度であることを明らかに

ロジェクトにおいて，Stack Overﬂow の最新バージョンのc 2021 Information Processing Society of Japan⃝3

情報処理学会研究報告
IPSJ SIG Technical Report

図 4 STEP1，STEP2 の概要図

図 5 STEP3，STEP4 の概要図

コード片がどの程度利用されているかを調査した．STEP4
では，STEP3 で最新バージョンのコード片を利用していない事例において，手作業で Stack Overﬂow のコード片の進化パターンを利用事例における振舞いの変化に着目して進化パターンの分類を行った．
以下それぞれの STEP について詳細を述べる．

3.3 STEP3: 再利用されているコード片のバージョンの調査

STEP3，STEP4 の概要図を図 5 に示す．STEP2 で生成された “Url.csv” から GitHub プロジェクトで Stack Over-ﬂow のコード片の最新バージョンを利用しているものはどの程度あるか調査を行う．本調査における Stack Overﬂow

3.1 STEP1: 既存スクリプトによるデータベース構築のコード片のバージョンの変更とは，Stack Overﬂow のSTEP1，STEP2 の概要図を図 4 に示す．STEP1 では

コード片が再利用された GitHub プロジェクトのコミット

SOTorrent から Java に関連した投稿のみを抽出し，データ

以降，再利用された コード片と関連するコードブロック

ベースを構築する．本調査ではデータセットとして Baltesの変更があった場合を指す．本調査では，同じプロジェらの研究で作成された SOTorrent(2018-09-23) を使用し，クトからフォークあるいは複製されたプロジェクトの影

データベース構築には Diamantopoulos らの研究で使用さ響を除外するため，Stack Overﬂow から複数の GitHub プ

れたスクリプトを使用する．このスクリプトは SOTorrent

ロジェクトに利用されている場合，Stack Overﬂow の投の Java の投稿 (Posts テーブルの Tags カラムに “java” タ

稿 1 件につき，1 つの GitHub プロジェクトに絞り調査をグが含まれるもの) のみを抽出し，新たなデータベースを行った．GitHub プロジェクトが Stack Overﬂow のコード構築する．RDBMS には MySQL5.7 を用いた．

片の最新バージョンを利用しているものを「最新バージョン」，それ以外のバージョンのコード片を利用しているも3.2 STEP2: 一回以上変更されているコード片と再利用
先プロジェクトの組を抽出

STEP2 では STEP1 で構築したデータベースから，コーのを「旧バージョン」と定義する．なお，本調査における最新バージョンとは，2021 年 5 月 18 日時点における最新のバージョンとする．以上の定義に基づき，STEP2 で抽ドブロックが一回以上変更されている回答と，そのコー出した “Url.csv” をもとに，GitHub プロジェクトが Stack

ド片を再利用している GitHub プロジェクトのファイルのOverﬂow のコード片の最新バージョンを利用しているか旧URL の組を抽出した “Url.csv” を生成する．

バージョンを利用しているかで 2 つに分類した．

ここで用いるスクリプトは Diamantopoulos らが研究で使用したスクリプトを拡張したものである．このスクリ

3.4 STEP4: 進化パターンの分類

プトはまず，STEP1 で構築したデータベースからコード

次に STEP3 で旧バージョンを利用していると分類されブロックが一回以上変更されている回答を抽出する．次たものに対して，GitHub プロジェクトが Stack Oveﬂowに，その回答の URL とその回答のコード片を利用していのコード片を再利用した後に Stack Overﬂow のコード片

る GitHub プロジェクトのファイルの URL を抽出する．

が変更された場合，どのような進化パターンがあるか調査

STEP1 では Tags カラムに “java”タグが含まれているもを行う．進化パターンは，Stack Overﬂow のコード片の変ののみを抽出しているが，その場合，再利用先の GitHub

更により GitHub プロジェクトに与える影響の有無に基づ

プロジェクトのファイルとして Java 以外の JVM 系言語

いて分類を行った．以下に分類した 3 つの進化パターンにである Scala や Kotlin のファイルが含まれてしまう．そ関して示す．

のため，抽出した GitHub プロジェクトのファイルから拡• パターン 1: GitHub プロジェクトで再利用されたコー

張子が “java” 以外のものは除外するようにスクリプトをド片が Stack Overﬂow のコード片の進化に追従する拡張した．最後に Stack Overﬂow の回答の ID（PostId），

際，振舞いが変化する変更

Stack Overﬂow の回答の URL（SOUrl），回答のコード片• パターン 2: GitHub プロジェクトで再利用されたコーを再利用している GitHub プロジェクトのファイルの URL

ド片が Stack Overﬂow のコード片の進化に追従する（GHUrl）の 3 つのカラムを含む “Url.csv” を生成する．

際，振舞いが変化しない変更

c 2021 Information Processing Society of Japan⃝4

情報処理学会研究報告
IPSJ SIG Technical Report• パターン 3: Stack Overﬂow の説明を補足するもので

表 1 再利用されているコード片のバージョンの調査結果
利用状況

件数 (263 件)

最新バージョン

186

旧バージョン46

リンクが無効31

あり，GitHub プロジェクトに直接影響しない変更
本調査における “振舞いが変化する” とは，GitHub プロ
ジェクトで再利用されたコード片が Stack Overﬂow のコー
ド片の進化に追従した場合に，開発者から見てプロジェク
トに影響が生じるか，である．

表 2 進化パターンの分類結果

パターン 1 に分類される振舞いが変わる例としてはバグ

進化パターン

件数 (46 件)

修正が挙げられる． 進化に追従することでバグが修正さパターン 1（振舞い変更あり）

17

パターン 2（振舞い変更なし）

25

パターン 3（投稿の説明補足）

4

れ，エラーが発生して正常に実行できなかったプロジェク
トやメソッドが実行可能になる場合，開発者からみてプロ
ジェクトに影響があり，振舞いが変化していることになる．

を示す．

パターン 2 に分類される振舞いが変化しない例としてはリパターン 1 は Stack Overﬂow の進化に追従した場合にファクタリングが挙げられる．リファクタリングはソース

開発者から見て GitHub プロジェクトに影響を与えるもの

コードの内部構造を変更するだけでプロジェクトやメソッ

であり，17 件であった．事例としてはバグ修正，例外処

ドの振舞いは変化しない．パターン 3 は Stack Overﬂow の理，境界値の変更などがある．それに対してパターン 2 は説明を補足するものであり，プロジェクトやメソッドに直GitHub プロジェクトに影響を与えないものであり 25 件で接影響を与えない変更である．例えば，import 文を書き加あった，ソフトウェアの品質向上や処理速度の高速化などえるような変更は，Stack Overﬂow 上のコード片で不足しの意図で変更されており，例としてはリファクタリング，ていたものを補う変更であるが，そのコード片を GitHub

機能向上，型変更などがある．例外としてメソッド名の誤などで再利用する際には通常記述済みのはずである．

字修正は変更することで GitHub プロジェクトの振舞いが4. 調査結果変化してしまうが，ソフトウェアの品質に関する変更であり，メソッド自体の振舞いが変わっているわけではないの

4.1 RQ1: Stack Overﬂow の最新バージョンのコードでパターン 2 に分類した．パターン 3 は 4 件あり，例と片を利用している GitHub プロジェクトはどの程度しては，import 文やクラス宣言を追加する説明補足など

あるか？

あった．

3 章で説明した STEP1 から STEP3 の手順に従って得らそれぞれの進化パターンについて例を示し，どのようなれた，コードブロックが一回以上変更されているコード片

進化パターンであれば進化に追従する必要性があるか考察とそのコード片を再利用している GitHub プロジェクトのした．コード片の行頭に「+」がついているものはその変ファイルの組は 263 件であった．これらの組に対して，再更により追加された行であり，「-」がついているものはそ利用されているコード片が最新バージョンであるか旧バーの変更により削除された行である．

ジョンであるかを分類した．その結果を表 1 に示す．

4.2.1 パターン 1

263 件中 31 件についてはプライベートリポジトリに変更

バグ修正 投稿 ID : 7322581

された，または，GitHub のリポジトリが削除されたため，Java を用いた大きなファイルからテキストの最終行を高Stack Overﬂow のコード片のどのバージョンを利用してい速で読み取る方法についての質問に対して，回答として以るか調査できなかった．調査可能な 232 件のうち，186 件

下のようなコードブロックが寄せられた．

が最新バージョンを利用しており 46 件が旧バージョンを利用していた．つまり全体の 20%の事例で，Stack Overﬂow

public String tail2( File file, int lines) {...

の旧バージョンのコード片が利用されていることが分かる．

4.2 RQ2: GitHub プロジェクトに旧バージョンが利用されている Stack Overﬂow のコード片はどのような進化パターンがあるか？

GitHub プロジェクトが再利用した Stack Overﬂow のコード片が再利用後に変更された場合，コード片の進化パ
ターンを開発者から見たプロジェクトの振舞いの変化を基

if( readByte == 0xA ) {-line = line + 1;-

if (line == lines) {-用していた 46 件である．表 2 に進化パターンの分類結果

c 2021 Information Processing Society of Japan⃝

continue;-}-break;+

if (filePointer < fileLength) {+line = line + 1;+}}に 3.4 節で示した 3 つのパターンに分類した．調査対象は

STEP3 で Stack Overﬂow の旧バージョンのコード片を利if (filePointer == fileLength) {-} else if( readByte == 0xD ) {-line = line + 1;-

if (line == lines) {5情報処理学会研究報告
IPSJ SIG Technical Report-if (filePointer == fileLength - 1) {-String[] children = dir.list();continue;-for (int i=0; i<children.length; i++)}- {break;-

boolean success = deleteDir(new File(dir, children[i]));

-

}

-

if (!success)+if (filePointer < fileLength-1) {

-

{

+

line = line + 1;

+

}

+

}

+

if (line >= lines) {+-return false;

-

}

- }
break;}
sb.append( ( char ) readByte );...

+ return deleteDir(new File(dir, children[i]));}// The directory is now empty or this is a file so delete it
return dir.delete();}}変更前は boolean 型のメソッドの返り値を変数に代入し変更前のコード片では改行コード \r \n のあるファイルて条件分岐に使っていたが，変更後は変数への代入を行わでは正しく機能しない．改行コード \r \n を使用すると，ずに処理を行っている．これはコード片のリファクタリン

行数をカウントする条件 line == lines をスキップして全グを行っており，変更によって振舞いが変化することはな

体を読み取ることになる．よって改行コード \r \n の場合，い．よってパターン 2 に分類される．

1 行ごとに 2 行カウントされてしまうので，変更後のコー機能向上 投稿 ID : 2222268

ド片では，最終行の N 行を取得するために，n*2 行を指定

サーブレットに対して送られてきたリクエストに関しするように変更されている．これはコード片を利用する際て，正確な URL を取得するには HttpServletRequest インに発生するバグの修正を行なっており変更によって振舞い

ターフェースのオブジェクトを使用する．その使用方法のが変化しているため，パターン 1 に分類される．

質問に対して，回答として以下のようなコードブロックが例外処理 投稿 ID : 35989142

寄せられた．

Java.nio パッケージを使用して最も簡単に再帰的にディレクトリを削除する方法についての質問に対して，回答として以下のようなコードブロックが寄せられた．

public static String getFullURL(HttpServletRequest request){-

StringBuffer requestURL = request.getRequestURL();+

StringBuilder requestURL = new StringBuilder(request+.getRequestURL().toString());

Path rootPath = Paths.get("/data/to-delete");String queryString = request.getQueryString();// before you copy and paste the snippet...

if (queryString == null) {// the snippet below

return requestURL.toString();+ try (Stream<Path> walk = Files.walk(rootPath)) {+} else {walk.sorted(Comparator.reverseOrder())

return requestURL.append('?').append(queryString)

Files.walk(rootPath).toString();.sorted(Comparator.reverseOrder()).map(Path::toFile)}}.peek(System.out::println).forEach(File::delete);+ }ここでは，StringBuﬀer を StringBuilder に変更している．StringBuﬀer はスレッドセーフであり，StringBuilder

ここではファイルシステムのリソースをタイムリーに廃はスレッドセーフではない．コード片を利用しているプロ

棄する必要があるため，例外処理として try-with-resources

ジェクトでは，この変更によりパフォーマンスが向上する

文が追加されている．このコード片の進化に追従することが，振舞いは変化しないためパターン 2 に変更される．

で GitHub プロジェクトの振舞いが変化するため，パター

パターン 2 についてリファクタリングやパフォーマンス

ン 1 に分類される．

の向上など，ソースコードの振舞いは変化しないが，ソー

4.2.2 パターン 2

スコードの可読性の観点から進化に追従する必要性はある

リファクタリング 投稿 ID : 3775723と考察する．

Java を使用してファイルを削除する方法の質問に対して，回答として以下のようなコードブロックが寄せられた．

4.2.3 パターン 3
説明補足 投稿 ID : 10174938
指定された文字列が Java で有効な JSON であるかどう

public static boolean deleteDir(File dir) {if (dir.isDirectory()){

c 2021 Information Processing Society of Japan⃝

かを確認する方法の質問に対して，回答として以下のようなコードブロックが寄せられた．

6

情報処理学会研究報告
IPSJ SIG Technical Reportがある．そのため，開発者は GitHub プロジェクトが利用+ import org.json.*;public boolean isJSONValid(String test) {try {している Stack Overﬂow のコード片の進化を追い，その変更内容を把握し，必要に応じて追従すべきである．パター

new JSONObject(test);

ン 2 は GitHub プロジェクトが Stack Overﬂow のコード片} catch (JSONException ex) {の進化に追従しても振舞いは変化しないため，パターン 1// edited, to include @Arthur's comment// e.g. in case JSONArray is valid as well...
try {に比べて即座に進化に追従する必要性は薄い．しかし，リファクタリングやパフォーマンスの向上などのソフトウェ

new JSONArray(test);

アの品質面における修正が多いため，進化に追従する価値} catch (JSONException ex1) {はあると考えられる．パターン 3 は説明補足のための変更

return false;}}
return true;}であるため開発者は変更履歴を追う必要はない．

5. まとめと今後の課題
本研究では，GitHub プロジェクトが Stack Overﬂow の変更点としては，import 文が追加されている．ここではGitHub，maven，Android で利用可能な org.json JSONAPI
実装を使用するように説明補足されている．これは開発者
がよりこのコード片を利用しやすいように変更されているが，コード片を利用しているプロジェクトには直接影響しないものであり，パターン 3 に分類される．
クラス宣言の追加 投稿 ID : 2248203

Java の ThreadPoolExecutor クラスを使用して，高負荷のタスクを固定数のスレッドで実行する際の例外処理の方法に関する質問に対して，回答として以下のようなコード
ブロックが寄せられた．

コード片の進化に追従する必要性を調べるため，実際の再利用の事例に基づいて詳細な分析を行った．具体的には
データセットとして SOTorrent を用いて GitHub プロジェ
クトに利用されている Stack Overﬂow のコード片の変更
履歴を分析し進化パターンの分類を行い，進化に追従する
必要性について考察した．その結果，調査可能な 232 件のうち 186 件が Stack Overﬂow の最新バージョンのコード片を利用しており，46 件が旧バージョンのコード片を使用していた．旧バージョンのうち GitHub プロジェクトがStack Overﬂow のコード片の進化に追従することで振舞いが変化するもの（パターン 1）が 17 件，振舞いが変化しな
いもの（パターン 2）が 25 件，振舞いに直接影響しないも+ public final class ExtendedExecutorの（パターン 3）が 4 件であった．この中でも特にパター+ extends ThreadPoolExecutor {ン 1 では，バグ修正などでコード片が進化しているものが+// ...
...
protected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);
...
}

+ }

あるため，開発者は GitHub プロジェクトが利用している

Stack Overﬂow のコード片の進化を追い，その変更内容を把握し，必要に応じて追従すべきである．
今後の課題として別のプログラミング言語への調査対象の拡張があげられる．本調査では対象を GitHub で公開されている Java プロジェクトに限定したが，プログラミング

ここでは，メソッドがどのクラスを継承することで利用言語は人気や歴史が異なるため，最新バージョンと旧バー

可能かを開発者に分かりやすく示すために，クラス宣言がジョンの件数など結果に偏りが生じる可能性がある．特に追加されている．このコード片を参照している GitHub プ

特定のタグ（node.js，ajax，Objective-c）に関連する質問

ロジェクトにおいても該当クラスの継承を利用しており，への回答は陳腐化する傾向がある [11] ため，これらのタグ

GitHub プロジェクトに直接影響する変更ではないためパに関しても調査を行う必要がある．

ターン 3 に分類される．

謝辞 本研究は JSPS 科研費 JP18H04094, JP19K20239の助成を受けたものです．

4.3 考察RQ2 では GitHub プロジェクトで Stack Overﬂow の旧バージョンが使われている 46 件の中で，パターン 1 に分

参考文献
[1]

類される 17 件は Stack Overﬂow の投稿の進化に追従することで GitHub プロジェクトの振舞いが変化することが分かった．パターン 1 は振舞いが変化するためすべての進化に追従することはできないが，バグ修正や例外処理など

Stack Overﬂow のコード片の処理を正常化するための変更

c 2021 Information Processing Society of Japan⃝[2]

Hata, H., Treude, C., Kula, R. G. and Ishio, T.: 9.6
Million Links in Source Code Comments: Purpose, Evolution, and Decay, Proceedings of the 41st International
Conference on Software Engineering (ICSE), pp. 1211–
1221 (2019).
Manes, S. S. and Baysal, O.: How Often and What
StackOverﬂow Posts Do Developers Reference in Their

7

情報処理学会研究報告
IPSJ SIG Technical Report

[3]

[4]
[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

GitHub Projects?, Proceedings of the 16th International
Conference on Mining Software Repositories (MSR),
pp. 235–239 (2019).
Manes, S. S. and Baysal, O.: Studying the Change Histories of Stack Overﬂow and GitHub Snippets, Proceedings of the 18th International Conference on Mining
Software Repositories (MSR), pp. 283–294 (2021).
StackExchangeInc:
Stack
Overﬂow,https://stackoverflow.com/.
StackExchangeInc:
All Sites - Stack Exchange,
https://stackexchange.com/sites?view=list#
users(accessed on 2021-06-07).
Baltes, S., Dumani, L., Treude, C. and Diehl, S.: SOTorrent: reconstructing and analyzing the evolution of stack
overﬂow posts, Proceedings of the 15th International
Conference on Mining Software Repositories (MSR),
pp. 319–330 (2018).
Wu, Y., Wang, S., Bezemer, C.-P. and Inoue, K.: How
Do Developers Utilize Source Code from Stack Overﬂow?, Empirical Software Engineering, Vol. 24 (online),
DOI: 10.1007/s10664-018-9634-5 (2019).
Ragkhitwetsagul, C., Krinke, J., Paixao, M., Bianco, G.
and Oliveto, R.: Toxic Code Snippets on Stack Overﬂow,
IEEE Transactions on Software Engineering, Vol. 47,
No. 3, pp. 560–581 (2021).
An, L., Mlouki, O., Khomh, F. and Antoniol, G.: Stack
Overﬂow: A code laundering platform?, Proceedings ofthe 24th International Conference on Software Analysis, Evolution and Reengineering (SANER), pp. 283–
293 (2017).
Fischer, F., Böttinger, K., Xiao, H., Stransky, C., Acar,
Y., Backes, M. and Fahl, S.: Stack Overﬂow Considered Harmful? The Impact of Copy Paste on Android
Application Security, Proceedings of the Symposium on
Security and Privacy (SP), pp. 121–136 (2017).
Zhang, H., Wang, S., Chen, T.-H., Zou, Y. and Hassan,
A. E.: An Empirical Study of Obsolete Answers on Stack
Overﬂow, IEEE Transactions on Software Engineering,Vol. 47, No. 4, pp. 850–862 (2021).
Diamantopoulos, T., Sifaki, M. I. and Symeonidis, A.:
Towards Mining Answer Edits to Extract Evolution Patterns in Stack Overﬂow, Proceedings of the 16th International Conference on Mining Software Repositories(MSR), pp. 215–219 (2019).

c 2021 Information Processing Society of Japan⃝

8