ソフトウェア工学の学習と対策
一、ソフトウェア工学の学習軸
ソフトウェア工学の学習および試験対策では以下の3つの要素を押さえる必要があります:
1.要件定義と設計 ユーザーの要件を正確に理解し、実装可能なソフトウェア設計に変換する方法。
主なポイント:UML図(ユースケース図、データフローディアグラム、状態遷移図、シーケンス図、クラス図など)の描画方法と適用場面の理解。
2.品質保証 ソフトウェア内のエラーや欠陥を減らすためのテスト技法の習得。
主なポイント:ブラックボックステスト、ホワイトボックステストなどの基本テスト方法の原理と実施プロセス。
3.プロジェクト管理 ソフトウェア開発の進行をスムーズに進めるための管理手法。
主なポイント:ウォーターフォールモデル、アジャイル開発などのプロセスモデルの特性と適用場面。
これら3つの要素は試験の重点であり、実際の開発でも重要です。以下ではこれらのコアスキルを深掘りします。
二、要件分析と設計
1.4次元の要件モデリング要素と図式化
図式化は情報の可視化を通じた円滑なコミュニケーションを目的とします。各図の役割と使用場面を理解することが重要です。
シナリオベース要素:
- ユースケース記述(図1)
- ユースケース図(図2)
- アクティビティ図(図3)
(ポイント1)ユースケース図: アクターとユースケースの関係を表現。システムの機能的要件を明確にします。 描画注意点:アクター(小人)、境界(四角形)、include/extendの関係(破線矢印+)の正確な表現。
(ポイント2)データフローディアグラム: データフロー、プロセス、外部エントティの関係を階層的に表現。 描画時のテクニック:問題文の主体・データストア・フローを明確にしたうえで関係性を整理。
(ポイント3)シーケンス図: オブジェクト間のメッセージの順序を示す。時系列での相互作用を可視化。
2.ユーザー要件モデリングの主要手法
構造化アプローチ: データフローディアグラムを用いたデータフロー分析。 特徴:データの流れと処理の階層的分解に注力。
オブジェクト指向アプローチ:
- 静的モデル(クラス図)
- 動的モデル(状態機械図)
- 機能モデル(ユースケース図) 特徴:オブジェクトの抽象化と相互作用のモデリング。
3.データ辞書の構成要素
- データフロー
- ファイル
- データ項目
- 処理
- 外部エントティ
三、品質保証
3.1 ホワイトボックステスト
論理カバレッジテストの種類:
- ステートメントカバレッジ
- 分岐カバレッジ
- 条件カバレッジ
- 条件組み合わせカバレッジ
- パスカバレッジ
例:基本パステストの手順
- フローチャート作成
- サイクル複雑度V(G)=E-N+2の計算
- 独立パス集合の抽出
- テストケース設計(空配列、昇順配列、異常ケースなど)
3.2 ブラックボックステスト
同等類分割の具体例:
- 有効同等類(正解を返すケース)
- 無効同等類(エラーを返すケース)
四、プロジェクト管理
1.ソフトウェアライフサイクル 要件定義 → 設計 → 実装 → テスト → 運用 → 維持
2.プロセスモデルの比較
- ウォーターフォールモデル:段階的依存、柔軟性に欠ける
- プロトタイピングモデル:要件の明確化を重視
- スパイラルモデル:リスク分析を組み込んだ反復型
- アジャイル開発:Scrumによる短いスプリントでの反復
3.設計原則
- 抽象化と段階的詳細化
- モジュール化
- 情報隠蔽
五、Pythonによるクローラー実装例
- HTML取得処理の再実装
import requests
from bs4 import BeautifulSoup
def fetch_web_content(url):
response = requests.get(url, verify=True)
if response.status_code == 200:
return BeautifulSoup(response.text, 'html.parser')
return None
- Seleniumによる認証処理の最適化
from selenium.webdriver.chrome.options import Options
def weibo_login(user, pwd):
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get("https://weibo.com/login.php")
driver.find_element_by_id("loginname").send_keys(user)
driver.find_element_by_name("password").send_keys(pwd)
driver.find_element_by_css_selector(".login-action").click()
time.sleep(5)
return driver
- 画像URL収集と保存の改良
def save_images_from_page(soup, save_dir):
img_urls = [img['src'] for img in soup.find_all('img') if img.has_attr('src')]
for i, url in enumerate(img_urls):
if url.startswith(('http', 'https')):
response = requests.get(url)
with open(f"{save_dir}/image_{i}.jpg", 'wb') as f:
f.write(response.content)
- 微博検索結果のXLS出力処理
import xlwt
def export_to_excel(data, filename):
workbook = xlwt.Workbook(encoding='utf-8')
sheet = workbook.add_sheet('Results')
headers = ['ユーザ名', '本文', '投稿日時', 'いいね数']
for col, header in enumerate(headers):
sheet.write(0, col, header)
for row_idx, item in enumerate(data, 1):
for col_idx, value in enumerate(item.values()):
sheet.write(row_idx, col_idx, value)
workbook.save(filename)
- 動的な検索結果処理の実装
def process_search_results(driver, keyword):
results = []
page_count = 1
while True:
try:
posts = driver.find_elements_by_css_selector(".weibo-card")
for post in posts:
content = post.find_element_by_css_selector(".txt").text
likes = post.find_element_by_css_selector(".like-count").text
results.append({
'ユーザ名': post.find_element_by_css_selector(".username").text,
'本文': content,
'投稿日時': post.find_element_by_css_selector(".time").text,
'いいね数': likes
})
next_button = driver.find_element_by_css_selector(".next-page")
next_button.click()
page_count += 1
time.sleep(3)
except:
break
return results